diff --git a/build.properties b/build.properties index f5a96fb54..a20ab8d17 100644 --- a/build.properties +++ b/build.properties @@ -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 diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index 2ffb29f3a..25bbca386 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -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. diff --git a/src/main/resources/assets/opencomputers/lang/de_DE.lang b/src/main/resources/assets/opencomputers/lang/de_DE.lang index d6f9e32d3..e7484d5b6 100644 --- a/src/main/resources/assets/opencomputers/lang/de_DE.lang +++ b/src/main/resources/assets/opencomputers/lang/de_DE.lang @@ -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 diff --git a/src/main/resources/assets/opencomputers/lang/en_US.lang b/src/main/resources/assets/opencomputers/lang/en_US.lang index c48930c2e..cfe300620 100644 --- a/src/main/resources/assets/opencomputers/lang/en_US.lang +++ b/src/main/resources/assets/opencomputers/lang/en_US.lang @@ -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 diff --git a/src/main/resources/assets/opencomputers/lang/fr_FR.lang b/src/main/resources/assets/opencomputers/lang/fr_FR.lang index a18bc3fee..485b5e376 100644 --- a/src/main/resources/assets/opencomputers/lang/fr_FR.lang +++ b/src/main/resources/assets/opencomputers/lang/fr_FR.lang @@ -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 diff --git a/src/main/resources/assets/opencomputers/lang/pt_PT.lang b/src/main/resources/assets/opencomputers/lang/pt_PT.lang index f92423db1..6ef3d68e7 100644 --- a/src/main/resources/assets/opencomputers/lang/pt_PT.lang +++ b/src/main/resources/assets/opencomputers/lang/pt_PT.lang @@ -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 diff --git a/src/main/resources/assets/opencomputers/lang/ru_RU.lang b/src/main/resources/assets/opencomputers/lang/ru_RU.lang index 5fc0326c9..eb4530587 100644 --- a/src/main/resources/assets/opencomputers/lang/ru_RU.lang +++ b/src/main/resources/assets/opencomputers/lang/ru_RU.lang @@ -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=Сервер diff --git a/src/main/resources/assets/opencomputers/lang/zh_CN.lang b/src/main/resources/assets/opencomputers/lang/zh_CN.lang index f1610a025..0303f29ce 100644 --- a/src/main/resources/assets/opencomputers/lang/zh_CN.lang +++ b/src/main/resources/assets/opencomputers/lang/zh_CN.lang @@ -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=服务器 diff --git a/src/main/resources/assets/opencomputers/lang/zh_TW.lang b/src/main/resources/assets/opencomputers/lang/zh_TW.lang index d51d94a9d..90524a31e 100644 --- a/src/main/resources/assets/opencomputers/lang/zh_TW.lang +++ b/src/main/resources/assets/opencomputers/lang/zh_TW.lang @@ -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=伺服器 diff --git a/src/main/scala/li/cil/oc/Settings.scala b/src/main/scala/li/cil/oc/Settings.scala index 06ff76eca..516fa391c 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -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 diff --git a/src/main/scala/li/cil/oc/client/GuiHandler.scala b/src/main/scala/li/cil/oc/client/GuiHandler.scala index e634ad234..c4e2452ce 100644 --- a/src/main/scala/li/cil/oc/client/GuiHandler.scala +++ b/src/main/scala/li/cil/oc/client/GuiHandler.scala @@ -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 => diff --git a/src/main/scala/li/cil/oc/client/gui/Case.scala b/src/main/scala/li/cil/oc/client/gui/Case.scala index 7edd77754..c767d4d0a 100644 --- a/src/main/scala/li/cil/oc/client/gui/Case.scala +++ b/src/main/scala/li/cil/oc/client/gui/Case.scala @@ -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] diff --git a/src/main/scala/li/cil/oc/client/gui/Charger.scala b/src/main/scala/li/cil/oc/client/gui/Charger.scala new file mode 100644 index 000000000..4e6b421ad --- /dev/null +++ b/src/main/scala/li/cil/oc/client/gui/Charger.scala @@ -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) + } +} diff --git a/src/main/scala/li/cil/oc/client/gui/Disassembler.scala b/src/main/scala/li/cil/oc/client/gui/Disassembler.scala index 7c5917aaf..e13bb6d99 100644 --- a/src/main/scala/li/cil/oc/client/gui/Disassembler.scala +++ b/src/main/scala/li/cil/oc/client/gui/Disassembler.scala @@ -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) } diff --git a/src/main/scala/li/cil/oc/client/gui/DiskDrive.scala b/src/main/scala/li/cil/oc/client/gui/DiskDrive.scala index d09319381..9b755f3d3 100644 --- a/src/main/scala/li/cil/oc/client/gui/DiskDrive.scala +++ b/src/main/scala/li/cil/oc/client/gui/DiskDrive.scala @@ -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) } } diff --git a/src/main/scala/li/cil/oc/client/gui/DynamicGuiContainer.scala b/src/main/scala/li/cil/oc/client/gui/DynamicGuiContainer.scala index fa00686e3..864ce4de9 100644 --- a/src/main/scala/li/cil/oc/client/gui/DynamicGuiContainer.scala +++ b/src/main/scala/li/cil/oc/client/gui/DynamicGuiContainer.scala @@ -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) } diff --git a/src/main/scala/li/cil/oc/client/gui/Server.scala b/src/main/scala/li/cil/oc/client/gui/Server.scala index 8e217ac41..b1d199e4a 100644 --- a/src/main/scala/li/cil/oc/client/gui/Server.scala +++ b/src/main/scala/li/cil/oc/client/gui/Server.scala @@ -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) } diff --git a/src/main/scala/li/cil/oc/client/gui/ServerRack.scala b/src/main/scala/li/cil/oc/client/gui/ServerRack.scala index 627f3d77e..c5d33a765 100644 --- a/src/main/scala/li/cil/oc/client/gui/ServerRack.scala +++ b/src/main/scala/li/cil/oc/client/gui/ServerRack.scala @@ -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 diff --git a/src/main/scala/li/cil/oc/client/gui/Switch.scala b/src/main/scala/li/cil/oc/client/gui/Switch.scala index 99bcf58a2..2e0e7f806 100644 --- a/src/main/scala/li/cil/oc/client/gui/Switch.scala +++ b/src/main/scala/li/cil/oc/client/gui/Switch.scala @@ -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( diff --git a/src/main/scala/li/cil/oc/common/GuiHandler.scala b/src/main/scala/li/cil/oc/common/GuiHandler.scala index d175ffa6c..053a3889b 100644 --- a/src/main/scala/li/cil/oc/common/GuiHandler.scala +++ b/src/main/scala/li/cil/oc/common/GuiHandler.scala @@ -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 => diff --git a/src/main/scala/li/cil/oc/common/GuiType.scala b/src/main/scala/li/cil/oc/common/GuiType.scala index 4d47359bb..ed4d47a20 100644 --- a/src/main/scala/li/cil/oc/common/GuiType.scala +++ b/src/main/scala/li/cil/oc/common/GuiType.scala @@ -4,6 +4,7 @@ object GuiType extends Enumeration { val Case, + Charger, Disassembler, DiskDrive, Rack, diff --git a/src/main/scala/li/cil/oc/common/block/Charger.scala b/src/main/scala/li/cil/oc/common/block/Charger.scala index 9cc28ae2c..e03932111 100644 --- a/src/main/scala/li/cil/oc/common/block/Charger.scala +++ b/src/main/scala/li/cil/oc/common/block/Charger.scala @@ -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) } diff --git a/src/main/scala/li/cil/oc/common/block/Delegator.scala b/src/main/scala/li/cil/oc/common/block/Delegator.scala index 1d0b19384..79df84044 100644 --- a/src/main/scala/li/cil/oc/common/block/Delegator.scala +++ b/src/main/scala/li/cil/oc/common/block/Delegator.scala @@ -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))) } diff --git a/src/main/scala/li/cil/oc/common/container/Charger.scala b/src/main/scala/li/cil/oc/common/container/Charger.scala new file mode 100644 index 000000000..0448e3ee4 --- /dev/null +++ b/src/main/scala/li/cil/oc/common/container/Charger.scala @@ -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) +} diff --git a/src/main/scala/li/cil/oc/common/item/Delegate.scala b/src/main/scala/li/cil/oc/common/item/Delegate.scala index 9cbb2a578..4010accfd 100644 --- a/src/main/scala/li/cil/oc/common/item/Delegate.scala +++ b/src/main/scala/li/cil/oc/common/item/Delegate.scala @@ -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))) } diff --git a/src/main/scala/li/cil/oc/common/item/Tablet.scala b/src/main/scala/li/cil/oc/common/item/Tablet.scala index b0f35ca7f..bb06774ec 100644 --- a/src/main/scala/li/cil/oc/common/item/Tablet.scala +++ b/src/main/scala/li/cil/oc/common/item/Tablet.scala @@ -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() } diff --git a/src/main/scala/li/cil/oc/common/tileentity/Charger.scala b/src/main/scala/li/cil/oc/common/tileentity/Charger.scala index e3599342e..db93de689 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Charger.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Charger.scala @@ -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)) diff --git a/src/main/scala/li/cil/oc/server/component/Tablet.scala b/src/main/scala/li/cil/oc/server/component/Tablet.scala index d184097b3..515a9dc6c 100644 --- a/src/main/scala/li/cil/oc/server/component/Tablet.scala +++ b/src/main/scala/li/cil/oc/server/component/Tablet.scala @@ -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() // ----------------------------------------------------------------------- // diff --git a/src/main/scala/li/cil/oc/server/network/Connector.scala b/src/main/scala/li/cil/oc/server/network/Connector.scala index 26a4df64d..69e84313b 100644 --- a/src/main/scala/li/cil/oc/server/network/Connector.scala +++ b/src/main/scala/li/cil/oc/server/network/Connector.scala @@ -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 {