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 minecraft.version=1.6.4
forge.version=9.11.1.964 forge.version=9.11.1.964
oc.version=1.3.4 oc.version=1.3.5
oc.subversion=dev oc.subversion=dev
ccl.version=1.0.0.62 ccl.version=1.0.0.62
fmp.version=1.0.1.268 fmp.version=1.0.1.268

View File

@ -442,6 +442,10 @@ opencomputers {
# charge robots at roughly half speed. # charge robots at roughly half speed.
chargerChargeRate: 100.0 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 # 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 # 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 # Stirling Engine (1MJ per fuel value / burn ticks). To discourage fully
@ -496,7 +500,7 @@ opencomputers {
computer: 500.0 computer: 500.0
# The amount of energy robots can store in their internal buffer. # 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 # The amount of energy a converter can store. This allows directly
# connecting a converter to a distributor, without having to have a # 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 # to exchange energy. This basically controls the bandwidth. You can
# add capacitors between two distributors to increase this bandwidth. # add capacitors between two distributors to increase this bandwidth.
distributor: 500 distributor: 500
# The amount a tablet can store in its internal buffer.
tablet: 10000
} }
# Default "costs", i.e. how much energy certain operations consume. # Default "costs", i.e. how much energy certain operations consume.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -127,7 +127,8 @@ class Settings(config: Config) {
val pureIgnorePower = config.getBoolean("power.ignorePower") val pureIgnorePower = config.getBoolean("power.ignorePower")
lazy val ignorePower = pureIgnorePower || !Mods.isPowerProvidingModPresent lazy val ignorePower = pureIgnorePower || !Mods.isPowerProvidingModPresent
val tickFrequency = config.getDouble("power.tickFrequency") max 1 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 generatorEfficiency = config.getDouble("power.generatorEfficiency")
val solarGeneratorEfficiency = config.getDouble("power.solarGeneratorEfficiency") val solarGeneratorEfficiency = config.getDouble("power.solarGeneratorEfficiency")
val assemblerTickAmount = config.getDouble("power.assemblerTickAmount") max 1 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.") OpenComputers.log.warning("Bad number of battery upgrade buffer sizes, ignoring.")
Array(10000.0, 15000.0, 20000.0) Array(10000.0, 15000.0, 20000.0)
} }
val bufferTablet = config.getDouble("power.buffer.tablet") max 0
// power.cost // power.cost
val computerCost = config.getDouble("power.cost.computer") max 0 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 { world.getBlockTileEntity(x, y, z) match {
case computer: tileentity.Case if id == GuiType.Case.id => case computer: tileentity.Case if id == GuiType.Case.id =>
new gui.Case(player.inventory, computer) 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 => case disassembler: tileentity.Disassembler if id == GuiType.Disassembler.id =>
new gui.Disassembler(player.inventory, disassembler) new gui.Disassembler(player.inventory, disassembler)
case drive: tileentity.DiskDrive if id == GuiType.DiskDrive.id => 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 li.cil.oc.common.{container, tileentity}
import net.minecraft.client.gui.GuiButton import net.minecraft.client.gui.GuiButton
import net.minecraft.entity.player.InventoryPlayer import net.minecraft.entity.player.InventoryPlayer
import net.minecraft.util.StatCollector
import org.lwjgl.opengl.GL11 import org.lwjgl.opengl.GL11
class Case(playerInventory: InventoryPlayer, val computer: tileentity.Case) extends DynamicGuiContainer(new container.Case(playerInventory, computer)) { 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) super.drawGuiContainerForegroundLayer(mouseX, mouseY)
GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS) // Me lazy... prevents NEI render glitch. GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS) // Me lazy... prevents NEI render glitch.
fontRenderer.drawString( fontRenderer.drawString(
StatCollector.translateToLocal(computer.getInvName), Localization.localizeImmediately(computer.getInvName),
8, 6, 0x404040) 8, 6, 0x404040)
if (powerButton.func_82252_a) { if (powerButton.func_82252_a) {
val tooltip = new java.util.ArrayList[String] 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 package li.cil.oc.client.gui
import li.cil.oc.Localization
import li.cil.oc.client.Textures import li.cil.oc.client.Textures
import li.cil.oc.client.gui.widget.ProgressBar import li.cil.oc.client.gui.widget.ProgressBar
import li.cil.oc.common.{container, tileentity} import li.cil.oc.common.{container, tileentity}
import net.minecraft.entity.player.InventoryPlayer import net.minecraft.entity.player.InventoryPlayer
import net.minecraft.util.StatCollector
import org.lwjgl.opengl.GL11 import org.lwjgl.opengl.GL11
class Disassembler(playerInventory: InventoryPlayer, val disassembler: tileentity.Disassembler) extends DynamicGuiContainer(new container.Disassembler(playerInventory, disassembler)) { 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) = { override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) = {
fontRenderer.drawString( fontRenderer.drawString(
StatCollector.translateToLocal(disassembler.getInvName), Localization.localizeImmediately(disassembler.getInvName),
8, 6, 0x404040) 8, 6, 0x404040)
} }

View File

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

View File

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

View File

@ -1,11 +1,11 @@
package li.cil.oc.client.gui package li.cil.oc.client.gui
import li.cil.oc.Localization
import li.cil.oc.client.Textures import li.cil.oc.client.Textures
import li.cil.oc.common.container import li.cil.oc.common.container
import li.cil.oc.common.inventory.ServerInventory import li.cil.oc.common.inventory.ServerInventory
import net.minecraft.entity.player.InventoryPlayer import net.minecraft.entity.player.InventoryPlayer
import net.minecraft.inventory.Slot import net.minecraft.inventory.Slot
import net.minecraft.util.StatCollector
import org.lwjgl.opengl.GL11 import org.lwjgl.opengl.GL11
class Server(playerInventory: InventoryPlayer, serverInventory: ServerInventory) extends DynamicGuiContainer(new container.Server(playerInventory, serverInventory)) { 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) = { override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) = {
super.drawGuiContainerForegroundLayer(mouseX, mouseY) super.drawGuiContainerForegroundLayer(mouseX, mouseY)
fontRenderer.drawString( fontRenderer.drawString(
StatCollector.translateToLocal(serverInventory.getInvName), Localization.localizeImmediately(serverInventory.getInvName),
8, 6, 0x404040) 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.gui.{GuiButton, GuiScreen}
import net.minecraft.client.renderer.Tessellator import net.minecraft.client.renderer.Tessellator
import net.minecraft.entity.player.InventoryPlayer import net.minecraft.entity.player.InventoryPlayer
import net.minecraft.util.StatCollector
import net.minecraftforge.common.ForgeDirection import net.minecraftforge.common.ForgeDirection
import org.lwjgl.opengl.GL11 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. GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS) // Prevents NEI render glitch.
fontRenderer.drawString( fontRenderer.drawString(
StatCollector.translateToLocal(rack.getInvName), Localization.localizeImmediately(rack.getInvName),
8, 6, 0x404040) 8, 6, 0x404040)
val rangeY = 39 val rangeY = 39

View File

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

View File

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

View File

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

View File

@ -4,10 +4,10 @@ import java.util
import cpw.mods.fml.common.Optional import cpw.mods.fml.common.Optional
import li.cil.oc.client.Textures 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.server.PacketSender
import li.cil.oc.util.mods.{BuildCraft, Mods} 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 mcp.mobius.waila.api.{IWailaConfigHandler, IWailaDataAccessor}
import net.minecraft.entity.player.EntityPlayer import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack 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) = 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 { world.getBlockTileEntity(x, y, z) match {
case charger: tileentity.Charger if BuildCraft.holdsApplicableWrench(player, x, y, z) => case charger: tileentity.Charger =>
if (!world.isRemote) { if (BuildCraft.holdsApplicableWrench(player, x, y, z)) {
charger.invertSignal = !charger.invertSignal if (!world.isRemote) {
charger.chargeSpeed = 1.0 - charger.chargeSpeed charger.invertSignal = !charger.invertSignal
PacketSender.sendChargerState(charger) charger.chargeSpeed = 1.0 - charger.chargeSpeed
BuildCraft.wrenchUsed(player, x, y, z) 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) 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.common.tileentity.traits.{BundledRedstoneAware, Colored, Rotatable}
import li.cil.oc.util.mods.Mods import li.cil.oc.util.mods.Mods
import li.cil.oc.util.{Color, ItemCosts, SideTracker} 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.Block
import net.minecraft.block.material.Material import net.minecraft.block.material.Material
import net.minecraft.client.renderer.texture.IconRegister 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.entity.{Entity, EntityLivingBase, EnumCreatureType}
import net.minecraft.item.{ItemBlock, ItemStack} import net.minecraft.item.{ItemBlock, ItemStack}
import net.minecraft.tileentity.TileEntity 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.minecraft.world.{IBlockAccess, World}
import net.minecraftforge.common.ForgeDirection import net.minecraftforge.common.ForgeDirection
import org.lwjgl.input 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]]) ItemCosts.addTooltip(stack, tooltip.asInstanceOf[util.List[String]])
} }
else { else {
tooltip.add(StatCollector.translateToLocalFormatted( tooltip.add(Localization.localizeImmediately(
Settings.namespace + "tooltip.MaterialCosts", Settings.namespace + "tooltip.MaterialCosts",
input.Keyboard.getKeyName(KeyBindings.materialCosts.keyCode))) 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 cpw.mods.fml.relauncher.{Side, SideOnly}
import li.cil.oc.client.KeyBindings import li.cil.oc.client.KeyBindings
import li.cil.oc.util.{ItemCosts, Rarity, Tooltip} 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.Entity
import net.minecraft.entity.player.EntityPlayer import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack import net.minecraft.item.ItemStack
import net.minecraft.util.StatCollector
import net.minecraft.world.World import net.minecraft.world.World
import org.lwjgl.input import org.lwjgl.input
@ -87,7 +86,7 @@ trait Delegate {
ItemCosts.addTooltip(stack, tooltip.asInstanceOf[util.List[String]]) ItemCosts.addTooltip(stack, tooltip.asInstanceOf[util.List[String]])
} }
else { else {
tooltip.add(StatCollector.translateToLocalFormatted( tooltip.add(Localization.localizeImmediately(
Settings.namespace + "tooltip.MaterialCosts", Settings.namespace + "tooltip.MaterialCosts",
input.Keyboard.getKeyName(KeyBindings.materialCosts.keyCode))) input.Keyboard.getKeyName(KeyBindings.materialCosts.keyCode)))
} }

View File

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

View File

@ -2,13 +2,16 @@ package li.cil.oc.common.tileentity
import cpw.mods.fml.relauncher.{Side, SideOnly} import cpw.mods.fml.relauncher.{Side, SideOnly}
import li.cil.oc.api.network.{Analyzable, Node, Visibility} 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.server.{PacketSender => ServerPacketSender}
import li.cil.oc.util.ItemUtils
import li.cil.oc.{Localization, Settings, api} import li.cil.oc.{Localization, Settings, api}
import net.minecraft.entity.player.EntityPlayer import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound import net.minecraft.nbt.NBTTagCompound
import net.minecraftforge.common.ForgeDirection 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). val node = api.Network.newNode(this, Visibility.None).
withConnector(Settings.get.bufferConverter). withConnector(Settings.get.bufferConverter).
create() create()
@ -39,8 +42,8 @@ class Charger extends traits.Environment with traits.PowerAcceptor with traits.R
override def updateEntity() { override def updateEntity() {
super.updateEntity() super.updateEntity()
if (isServer) { if (isServer && world.getWorldInfo.getWorldTotalTime % Settings.get.tickFrequency == 0) {
val charge = Settings.get.chargeRate * chargeSpeed val charge = Settings.get.chargeRateRobot * chargeSpeed * Settings.get.tickFrequency
val canCharge = charge > 0 && node.globalBuffer >= charge val canCharge = charge > 0 && node.globalBuffer >= charge
if (hasPower && !canCharge) { if (hasPower && !canCharge) {
hasPower = false hasPower = false
@ -53,8 +56,35 @@ class Charger extends traits.Environment with traits.PowerAcceptor with traits.R
if (canCharge) robots.collect { if (canCharge) robots.collect {
case Some(proxy) => node.changeBuffer(proxy.robot.bot.node.changeBuffer(charge + node.changeBuffer(-charge))) 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 { 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 => case proxy: RobotProxy if proxy.globalBuffer / proxy.globalBufferSize < 0.95 =>
val theta = world.rand.nextDouble * Math.PI 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) { override protected def updateRedstoneInput(side: ForgeDirection) {
super.updateRedstoneInput(side) super.updateRedstoneInput(side)
val signal = math.max(0, math.min(15, ForgeDirection.VALID_DIRECTIONS.map(input).max)) 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 { class Tablet(val tablet: TabletWrapper) extends component.ManagedComponent {
val node = Network.newNode(this, Visibility.Network). val node = Network.newNode(this, Visibility.Network).
withComponent("tablet"). withComponent("tablet").
withConnector(Settings.get.bufferRobot). withConnector(Settings.get.bufferTablet).
create() create()
// ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- //

View File

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