From b2df4a4910b8082d6f581c25197afd0d29c62532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Wed, 24 Sep 2014 09:33:09 +0200 Subject: [PATCH 1/5] Fixed load order in tablet. Added recipe for tablet case. Tablets are now precharged when assembled (like robots) and cost energy to build. --- src/main/resources/application.conf | 7 +++++++ .../assets/opencomputers/recipes/default.recipes | 5 +++++ src/main/scala/li/cil/oc/Items.scala | 4 +--- src/main/scala/li/cil/oc/Settings.scala | 2 ++ src/main/scala/li/cil/oc/common/item/Tablet.scala | 15 +++++---------- .../li/cil/oc/common/template/RobotTemplate.scala | 4 ++-- .../cil/oc/common/template/TabletTemplate.scala | 12 +++++++----- 7 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index 25bbca386..f029a3f5f 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -631,6 +631,13 @@ opencomputers { # each point of complexity. robotAssemblyComplexity: 10000 + # The base energy cost for assembling a tablet. + tabletAssemblyBase: 20000 + + # The additional amount of energy required to assemble a tablet for + # each point of complexity. + tabletAssemblyComplexity: 5000 + # The amount of energy it takes to extract one ingredient from an # item that is being disassembled. For example, if an item that was # crafted from three other items gets disassembled, a total of 15000 diff --git a/src/main/resources/assets/opencomputers/recipes/default.recipes b/src/main/resources/assets/opencomputers/recipes/default.recipes index 7e3c708e3..a70bb5cdb 100644 --- a/src/main/resources/assets/opencomputers/recipes/default.recipes +++ b/src/main/resources/assets/opencomputers/recipes/default.recipes @@ -11,6 +11,11 @@ terminal { ["oc:circuitChip3", "oc:screen2", "oc:wlanCard"] [nuggetIron, "oc:keyboard", nuggetIron]] } +tabletCase { + input: [[ingotGold, button, ingotGold] + ["oc:componentBus1", "oc:screen2", "oc:circuitChip3"] + [ingotGold, "oc:materialCircuitBoardPrinted", ingotGold]] +} server1 { input: [[obsidian, "oc:ram4", obsidian] diff --git a/src/main/scala/li/cil/oc/Items.scala b/src/main/scala/li/cil/oc/Items.scala index 5d1df6f9c..f6505223a 100644 --- a/src/main/scala/li/cil/oc/Items.scala +++ b/src/main/scala/li/cil/oc/Items.scala @@ -258,10 +258,8 @@ object Items extends ItemAPI { Recipes.addItem(new item.ComponentBus(multi, Tier.Three), "componentBus3", "oc:componentBus3") registerItem(new item.DebugCard(multi), "debugCard") - // 1.3.? - registerItem(new item.TabletCase(multi), "tabletCase") - // 1.3.5 + Recipes.addItem(new item.TabletCase(multi), "tabletCase", "oc:tabletCase") Recipes.addItem(new item.UpgradePiston(multi), "pistonUpgrade", "oc:pistonUpgrade") } } \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/Settings.scala b/src/main/scala/li/cil/oc/Settings.scala index 516fa391c..379c4921e 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -171,6 +171,8 @@ class Settings(config: Config) { val geolyzerScanCost = config.getDouble("power.cost.geolyzerScan") max 0 val robotBaseCost = config.getDouble("power.cost.robotAssemblyBase") max 0 val robotComplexityCost = config.getDouble("power.cost.robotAssemblyComplexity") max 0 + val tabletBaseCost = config.getDouble("power.cost.tabletAssemblyBase") max 0 + val tabletComplexityCost = config.getDouble("power.cost.tabletAssemblyComplexity") max 0 val disassemblerItemCost = config.getDouble("power.cost.disassemblerPerItem") max 0 val chunkloaderCost = config.getDouble("power.cost.chunkloaderCost") max 0 val pistonCost = config.getDouble("power.cost.pistonPush") max 0 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 bb06774ec..bef504e9a 100644 --- a/src/main/scala/li/cil/oc/common/item/Tablet.scala +++ b/src/main/scala/li/cil/oc/common/item/Tablet.scala @@ -14,6 +14,7 @@ import li.cil.oc.api.{Machine, Rotatable} import li.cil.oc.common.GuiType import li.cil.oc.common.inventory.ComponentInventory import li.cil.oc.server.component +import li.cil.oc.util.ExtendedNBT._ import li.cil.oc.util.ItemUtils.TabletData import li.cil.oc.util.{ItemUtils, RotationHelper} import li.cil.oc.{OpenComputers, Settings, api} @@ -124,8 +125,8 @@ class TabletWrapper(var stack: ItemStack, var holder: EntityPlayer) extends Comp val data = stack.getTagCompound load(data) if (!world.isRemote) { - computer.load(data.getCompoundTag(Settings.namespace + "data")) tablet.load(data.getCompoundTag(Settings.namespace + "component")) + computer.load(data.getCompoundTag(Settings.namespace + "data")) } } } @@ -139,8 +140,8 @@ class TabletWrapper(var stack: ItemStack, var holder: EntityPlayer) extends Comp if (!data.hasKey(Settings.namespace + "data")) { data.setTag(Settings.namespace + "data", new NBTTagCompound()) } - computer.save(data.getCompoundTag(Settings.namespace + "data")) - tablet.save(data.getCompoundTag(Settings.namespace + "component")) + data.setNewCompoundTag(Settings.namespace + "component", tablet.save) + data.setNewCompoundTag(Settings.namespace + "data", computer.save) // Force tablets into stopped state to avoid errors when trying to // load deleted machine states. @@ -233,13 +234,7 @@ class TabletWrapper(var stack: ItemStack, var holder: EntityPlayer) extends Comp case _ => 0 })) - override def maxComponents = items.foldLeft(0)((acc, itemOption) => acc + (itemOption match { - case Some(item) => Option(api.Driver.driverFor(item)) match { - case Some(driver: api.driver.Processor) => driver.supportedComponents(item) - case _ => 0 - } - case _ => 0 - })) + override def maxComponents = 32 override def markAsChanged() {} diff --git a/src/main/scala/li/cil/oc/common/template/RobotTemplate.scala b/src/main/scala/li/cil/oc/common/template/RobotTemplate.scala index a1adaae89..c8b3463e7 100644 --- a/src/main/scala/li/cil/oc/common/template/RobotTemplate.scala +++ b/src/main/scala/li/cil/oc/common/template/RobotTemplate.scala @@ -25,7 +25,7 @@ object RobotTemplate extends Template { val data = new ItemUtils.RobotData() data.tier = ItemUtils.caseTier(inventory.getStackInSlot(0)) data.name = ItemUtils.RobotData.randomName - data.robotEnergy = 50000 + data.robotEnergy = Settings.get.bufferRobot.toInt data.totalEnergy = data.robotEnergy data.containers = items.slice(1, 4).filter(_ != null).toArray data.components = items.drop(4).filter(_ != null).toArray @@ -33,7 +33,7 @@ object RobotTemplate extends Template { data.save(stack) val energy = Settings.get.robotBaseCost + complexity(inventory) * Settings.get.robotComplexityCost - Array(stack, energy: java.lang.Double) + Array(stack, double2Double(energy)) } def register() { diff --git a/src/main/scala/li/cil/oc/common/template/TabletTemplate.scala b/src/main/scala/li/cil/oc/common/template/TabletTemplate.scala index d99230bf0..3c8f1dd92 100644 --- a/src/main/scala/li/cil/oc/common/template/TabletTemplate.scala +++ b/src/main/scala/li/cil/oc/common/template/TabletTemplate.scala @@ -1,7 +1,7 @@ package li.cil.oc.common.template import cpw.mods.fml.common.event.FMLInterModComms -import li.cil.oc.api +import li.cil.oc.{Settings, api} import li.cil.oc.common.{Slot, Tier} import li.cil.oc.util.ExtendedNBT._ import li.cil.oc.util.ItemUtils @@ -23,22 +23,24 @@ object TabletTemplate extends Template { def validateUpgrade(inventory: IInventory, slot: Int, tier: Int, stack: ItemStack): Boolean = Option(api.Driver.driverFor(stack)) match { case Some(driver) if Slot(driver, stack) == Slot.Upgrade => - driver != item.Keyboard && driver != item.Screen && + driver != item.Screen && Slot(driver, stack) == Slot.Upgrade && driver.tier(stack) <= tier case _ => false } def assemble(inventory: IInventory): Array[AnyRef] = { val items = mutable.ArrayBuffer( - Option(api.Items.get("screen1").createItemStack(1)), - Option(api.Items.get("keyboard").createItemStack(1)) + Option(api.Items.get("screen1").createItemStack(1)) ) ++ (1 until inventory.getSizeInventory).map(slot => Option(inventory.getStackInSlot(slot))) val data = new ItemUtils.TabletData() data.items = items.filter(_.isDefined).toArray + data.energy = Settings.get.bufferTablet + data.maxEnergy = data.energy val stack = api.Items.get("tablet").createItemStack(1) data.save(stack) + val energy = Settings.get.tabletBaseCost + complexity(inventory) * Settings.get.tabletComplexityCost - Array(stack) + Array(stack, double2Double(energy)) } def register() { From 9f7f22cfa11153c36cb16b685dc7043cfb96aed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Wed, 24 Sep 2014 09:46:03 +0200 Subject: [PATCH 2/5] Tablets can now be disassembled. --- .../li/cil/oc/common/tileentity/Disassembler.scala | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala index 8ca6d9c38..f8c65f4ca 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala @@ -84,6 +84,7 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra else if (api.Items.get(stack) == api.Items.get("server1")) enqueueServer(stack, 0) else if (api.Items.get(stack) == api.Items.get("server2")) enqueueServer(stack, 1) else if (api.Items.get(stack) == api.Items.get("server3")) enqueueServer(stack, 2) + else if (api.Items.get(stack) == api.Items.get("tablet")) enqueueTablet(stack) else if (api.Items.get(stack) == api.Items.get("navigationUpgrade")) { enqueueNavigationUpgrade(stack) } @@ -116,6 +117,15 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra queue ++= getIngredients(server) } + private def enqueueTablet(tablet: ItemStack) { + val info = new ItemUtils.TabletData(tablet) + queue += api.Items.get("tabletCase").createItemStack(1) + queue ++= info.items.collect { + case Some(stack) => stack + }.drop(1) // Screen. + node.changeBuffer(info.energy) + } + private def enqueueNavigationUpgrade(stack: ItemStack) { val info = new ItemUtils.NavigationUpgradeData(stack) val parts = getIngredients(stack) @@ -223,5 +233,6 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra override def isItemValidForSlot(i: Int, stack: ItemStack) = api.Items.get(stack) == api.Items.get("robot") || - ((Settings.get.disassembleAllTheThings || api.Items.get(stack) != null) && !getIngredients(stack).isEmpty) + api.Items.get(stack) == api.Items.get("tablet") || + ((Settings.get.disassembleAllTheThings || api.Items.get(stack) != null) && getIngredients(stack).nonEmpty) } From 224cef4f0ba5b1985f665c8563bbd59fef2a099e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Wed, 24 Sep 2014 16:37:47 +0200 Subject: [PATCH 3/5] Re-implemented UE support using the new API. May or may not work! --- src/main/resources/application.conf | 2 +- .../scala/li/cil/oc/common/EventHandler.scala | 11 ++ .../cil/oc/common/asm/ClassTransformer.scala | 4 +- .../li/cil/oc/common/block/Delegator.scala | 16 ++- .../tileentity/traits/PowerAcceptor.scala | 2 +- .../traits/power/UniversalElectricity.scala | 129 +++++++++++------- src/main/scala/li/cil/oc/util/mods/Mods.scala | 2 +- .../oc/util/mods/UniversalElectricity.scala | 11 +- 8 files changed, 113 insertions(+), 64 deletions(-) diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index e851bce49..95dea18f3 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -648,7 +648,7 @@ opencomputers { IndustrialCraft2: 200.0 Mekanism: 555.55555 RedstoneFlux: 35.0 - UniversalElectricity: 1.0 + UniversalElectricity: 1750.0 } } diff --git a/src/main/scala/li/cil/oc/common/EventHandler.scala b/src/main/scala/li/cil/oc/common/EventHandler.scala index 71f195d2a..fcd3dc514 100644 --- a/src/main/scala/li/cil/oc/common/EventHandler.scala +++ b/src/main/scala/li/cil/oc/common/EventHandler.scala @@ -20,7 +20,9 @@ import net.minecraft.item.ItemStack import net.minecraft.server.MinecraftServer import net.minecraft.tileentity.TileEntity import net.minecraftforge.common.MinecraftForge +import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.event.world.WorldEvent +import universalelectricity.api.core.grid.electric.IEnergyNode import scala.collection.mutable import scala.concurrent.ExecutionContext.Implicits.global @@ -62,6 +64,15 @@ object EventHandler { } } + @Optional.Method(modid = Mods.IDs.UniversalElectricity) + def scheduleUEAdd(tileEntity: power.UniversalElectricity) { + if (SideTracker.isServer) pending.synchronized { + pending += (() => if (!tileEntity.isInvalid) { + tileEntity.getNode(classOf[IEnergyNode], ForgeDirection.UNKNOWN).reconstruct() + }) + } + } + def scheduleWirelessRedstone(rs: server.component.RedstoneWireless) { if (SideTracker.isServer) pending.synchronized { pending += (() => if (!rs.owner.isInvalid) { diff --git a/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala b/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala index 6a17ab2c2..8eb3c480b 100644 --- a/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala +++ b/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala @@ -24,8 +24,8 @@ class ClassTransformer extends IClassTransformer { Mods.IndustrialCraft2 -> Array("ic2/api/energy/tile/IEnergySink"), Mods.IndustrialCraft2Classic -> Array("ic2classic/api/energy/tile/IEnergySink"), Mods.Mekanism -> Array("mekanism/api/energy/IStrictEnergyAcceptor"), - Mods.RedstoneFlux -> Array("cofh/api/energy/IEnergyHandler") -// Mods.UniversalElectricity -> Array("universalelectricity/api/core/grid/INodeProvider", "universalelectricity/api/core/grid/electric/IEnergyContainer") + Mods.RedstoneFlux -> Array("cofh/api/energy/IEnergyHandler"), + Mods.UniversalElectricity -> Array("universalelectricity/api/core/grid/INodeProvider") ) override def transform(name: String, transformedName: String, basicClass: Array[Byte]): Array[Byte] = { 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 3d68615a9..9a498def6 100644 --- a/src/main/scala/li/cil/oc/common/block/Delegator.scala +++ b/src/main/scala/li/cil/oc/common/block/Delegator.scala @@ -6,6 +6,7 @@ import java.util.Random import cpw.mods.fml.common.Optional import cpw.mods.fml.relauncher.{Side, SideOnly} import li.cil.oc.client.KeyBindings +import li.cil.oc.common.tileentity.traits.power.UniversalElectricity 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} @@ -24,6 +25,7 @@ import net.minecraftforge.common.util.ForgeDirection import org.lwjgl.input import powercrystals.minefactoryreloaded.api.rednet.connectivity.RedNetConnectionType import powercrystals.minefactoryreloaded.api.rednet.{IRedNetNetworkContainer, IRedNetOmniNode} +import universalelectricity.api.core.grid.electric.IEnergyNode import scala.collection.mutable @@ -314,11 +316,23 @@ class Delegator[Child <: Delegate] extends Block(Material.iron) { case _ => true }) && super.removedByPlayer(world, player, x, y, z) - override def onNeighborBlockChange(world: World, x: Int, y: Int, z: Int, block: Block) = + override def onNeighborBlockChange(world: World, x: Int, y: Int, z: Int, block: Block) = { + if (Mods.UniversalElectricity.isAvailable) { + updateUENode(world.getTileEntity(x, y, z)) + } subBlock(world, x, y, z) match { case Some(subBlock) => subBlock.neighborBlockChanged(world, x, y, z, block) case _ => // Invalid but avoid match error. } + } + + @Optional.Method(modid = Mods.IDs.UniversalElectricity) + private def updateUENode(tileEntity: TileEntity) { + tileEntity match { + case ue: UniversalElectricity => ue.getNode(classOf[IEnergyNode], ForgeDirection.UNKNOWN).reconstruct() + case _ => + } + } override def onNeighborChange(world: IBlockAccess, x: Int, y: Int, z: Int, tileX: Int, tileY: Int, tileZ: Int) = subBlock(world, x, y, z) match { diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/PowerAcceptor.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/PowerAcceptor.scala index 497533a12..b0c3a37b1 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/PowerAcceptor.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/PowerAcceptor.scala @@ -9,4 +9,4 @@ trait PowerAcceptor with power.IndustrialCraft2Classic with power.Mekanism with power.RedstoneFlux -// with power.UniversalElectricity + with power.UniversalElectricity diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/UniversalElectricity.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/UniversalElectricity.scala index a435471ce..795c7412d 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/UniversalElectricity.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/power/UniversalElectricity.scala @@ -1,52 +1,77 @@ -//package li.cil.oc.common.tileentity.traits.power -// -//import cpw.mods.fml.common.Optional -//import li.cil.oc.Settings -//import li.cil.oc.util.mods.Mods -//import net.minecraftforge.common.util.ForgeDirection -//import universalelectricity.api.core.grid.electric.{IElectricNode, IEnergyContainer} -//import universalelectricity.api.core.grid.{INode, INodeProvider} -// -//@Optional.InterfaceList(Array( -// new Optional.Interface(iface = "universalelectricity.api.core.grid.INodeProvider", modid = Mods.IDs.UniversalElectricity), -// new Optional.Interface(iface = "universalelectricity.api.core.grid.electric.IEnergyContainer", modid = Mods.IDs.UniversalElectricity) -//)) -//trait UniversalElectricity extends Common with INodeProvider with IEnergyContainer { -// private lazy val ueNode: AnyRef = universalelectricity.api.core.grid.NodeRegistry.get(this, classOf[IElectricNode]) -// -// private lazy val useUniversalElectricityPower = isServer && !Settings.get.ignorePower && Mods.BuildCraftPower.isAvailable -// -// // ----------------------------------------------------------------------- // -// -// override def updateEntity() { -// super.updateEntity() -// if (useUniversalElectricityPower && world.getWorldTime % Settings.get.tickFrequency == 0) { -// val electric = ueNode.asInstanceOf[IElectricNode] -// for (side <- ForgeDirection.VALID_DIRECTIONS) { -// val demand = (globalBufferSize(side) - globalBuffer(side)) / Settings.ratioUniversalElectricity -// val power = math.min(demand, electric.getEnergy) -// if (power > 1) { -// electric.removeEnergy(power, true) -// tryChangeBuffer(side, power * Settings.ratioUniversalElectricity) -// } -// } -// } -// } -// -// // ----------------------------------------------------------------------- // -// -// @Optional.Method(modid = Mods.IDs.UniversalElectricity) -// override def getNode[N <: INode](nodeType: Class[N], from: ForgeDirection) = { -// if (canConnectPower(from) && nodeType == classOf[IElectricNode]) ueNode.asInstanceOf[N] -// else null.asInstanceOf[N] -// } -// -// @Optional.Method(modid = Mods.IDs.UniversalElectricity) -// override def setEnergy(from: ForgeDirection, energy: Double) {} -// -// @Optional.Method(modid = Mods.IDs.UniversalElectricity) -// override def getEnergy(from: ForgeDirection) = globalBuffer(from) / Settings.ratioUniversalElectricity -// -// @Optional.Method(modid = Mods.IDs.UniversalElectricity) -// override def getEnergyCapacity(from: ForgeDirection) = globalBufferSize(from) / Settings.ratioUniversalElectricity -//} +package li.cil.oc.common.tileentity.traits.power + +import cpw.mods.fml.common.Optional +import li.cil.oc.{OpenComputers, Settings} +import li.cil.oc.common.EventHandler +import li.cil.oc.util.mods.Mods +import net.minecraftforge.common.util.ForgeDirection +import universalelectricity.api.core.grid.electric.IEnergyNode +import universalelectricity.api.core.grid.{INode, INodeProvider} +import universalelectricity.core.grid.node.NodeEnergy + +trait UniversalElectricity extends Common { + private var node: Option[AnyRef] = None + + private lazy val useUniversalElectricityPower = isServer && Mods.UniversalElectricity.isAvailable + + // ----------------------------------------------------------------------- // + + override def updateEntity() { + super.updateEntity() + if (useUniversalElectricityPower && world.getTotalWorldTime % Settings.get.tickFrequency == 0) { + updateEnergy() + } + } + + @Optional.Method(modid = Mods.IDs.UniversalElectricity) + private def updateEnergy() { + node match { + case Some(energyNode: NodeEnergy) => + for (side <- ForgeDirection.VALID_DIRECTIONS) { + val demand = (globalBufferSize(side) - globalBuffer(side)) / Settings.get.ratioUniversalElectricity + if (demand > 1) { + val power = energyNode.buffer.extractEnergy(demand, doExtract = true) + tryChangeBuffer(side, power * Settings.get.ratioUniversalElectricity) + } + } + case _ => + } + } + + // ----------------------------------------------------------------------- // + + @Optional.Method(modid = Mods.IDs.UniversalElectricity) + def getNode(nodeType: Class[_ <: INode], side: ForgeDirection): INode = { + if (nodeType != null && classOf[IEnergyNode].isAssignableFrom(nodeType)) node match { + case Some(energyNode: NodeEnergy) => energyNode + case _ => + this match { + case nodeProvider: INodeProvider => + val energyNode = new NodeEnergy(nodeProvider, 500, 500, 500) { + override def canConnect(from: ForgeDirection) = canConnectPower(from) && super.canConnect(from) + } + node = Option(energyNode) + energyNode + case _ => + OpenComputers.log.warn("Failed setting up UniversalElectricity power, which most likely means the class transformer did not run. You're probably running in an incorrectly configured development environment. Try adding `-Dfml.coreMods.load=li.cil.oc.common.launch.TransformerLoader` to the VM options of your run configuration.") + null + } + } + else null + } + + override def validate() { + super.validate() + if (useUniversalElectricityPower) EventHandler.scheduleUEAdd(this) + } + + override def invalidate() { + super.invalidate() + if (useUniversalElectricityPower) deconstructNode() + } + + @Optional.Method(modid = Mods.IDs.UniversalElectricity) + private def deconstructNode() { + getNode(classOf[IEnergyNode], ForgeDirection.UNKNOWN).deconstruct() + } +} diff --git a/src/main/scala/li/cil/oc/util/mods/Mods.scala b/src/main/scala/li/cil/oc/util/mods/Mods.scala index a2b045552..b6f6d762f 100644 --- a/src/main/scala/li/cil/oc/util/mods/Mods.scala +++ b/src/main/scala/li/cil/oc/util/mods/Mods.scala @@ -72,7 +72,7 @@ object Mods { } val ThermalExpansion = new SimpleMod(IDs.ThermalExpansion, providesPower = true) val TinkersConstruct = new SimpleMod(IDs.TinkersConstruct) - val UniversalElectricity = new SimpleMod(IDs.UniversalElectricity + "@[3.1,)", providesPower = true) + val UniversalElectricity = new SimpleMod(IDs.UniversalElectricity, providesPower = true) val VersionChecker = new SimpleMod(IDs.VersionChecker) val Waila = new SimpleMod(IDs.Waila) val WirelessRedstoneCBE = new SimpleMod(IDs.WirelessRedstoneCBE) diff --git a/src/main/scala/li/cil/oc/util/mods/UniversalElectricity.scala b/src/main/scala/li/cil/oc/util/mods/UniversalElectricity.scala index 3f97a93a9..6d9497468 100644 --- a/src/main/scala/li/cil/oc/util/mods/UniversalElectricity.scala +++ b/src/main/scala/li/cil/oc/util/mods/UniversalElectricity.scala @@ -1,14 +1,13 @@ package li.cil.oc.util.mods import net.minecraft.item.ItemStack - -// TODO Upgrade to UE 1.7 once it's available. -//import universalelectricity.api.CompatibilityModule +import net.minecraftforge.common.util.ForgeDirection +import universalelectricity.compatibility.Compatibility object UniversalElectricity { - def isEnergyItem(stack: ItemStack) = false // CompatibilityModule.isHandler(stack.getItem) + def isEnergyItem(stack: ItemStack) = Compatibility.isHandler(stack.getItem, ForgeDirection.UNKNOWN) - def getEnergyInItem(stack: ItemStack) = 0 // CompatibilityModule.getEnergyItem(stack) + def getEnergyInItem(stack: ItemStack) = Compatibility.getEnergyItem(stack) - def chargeItem(stack: ItemStack, value: Long): Unit = {} // CompatibilityModule.chargeItem(stack, value, true) + def chargeItem(stack: ItemStack, value: Double) = Compatibility.chargeItem(stack, value, true) } From 4a447996e8f3d61650a37dd7fcaf40bb0d22a223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Wed, 24 Sep 2014 22:18:51 +0200 Subject: [PATCH 4/5] Added support for AE2 power, closes #508. --- build.gradle | 1 + build.properties | 9 +- src/main/resources/application.conf | 1 + src/main/scala/li/cil/oc/Settings.scala | 2 + .../scala/li/cil/oc/common/EventHandler.scala | 9 ++ .../cil/oc/common/asm/ClassTransformer.scala | 1 + .../tileentity/traits/PowerAcceptor.scala | 1 + .../traits/power/AppliedEnergistics2.scala | 128 ++++++++++++++++++ .../tileentity/traits/power/BuildCraft.scala | 41 +++++- src/main/scala/li/cil/oc/util/mods/Mods.scala | 2 + 10 files changed, 185 insertions(+), 10 deletions(-) create mode 100644 src/main/scala/li/cil/oc/common/tileentity/traits/power/AppliedEnergistics2.scala diff --git a/build.gradle b/build.gradle index 8f04f8bbd..9e2787a57 100644 --- a/build.gradle +++ b/build.gradle @@ -75,6 +75,7 @@ configurations { } dependencies { + provided "appeng:appliedenergistics2:${config.ae2.version}:dev" provided "codechicken:CodeChickenLib:${config.minecraft.version}-${config.ccl.version}:dev" provided "codechicken:ForgeMultipart:${config.minecraft.version}-${config.fmp.version}:dev" provided "codechicken:NotEnoughItems:${config.minecraft.version}-${config.nei.version}:dev" diff --git a/build.properties b/build.properties index dd3d31931..7a8be9bd2 100644 --- a/build.properties +++ b/build.properties @@ -1,11 +1,12 @@ minecraft.version=1.7.10 -forge.version=10.13.0.1180 +forge.version=10.13.0.1208 oc.version=1.3.5 oc.subversion=dev -ccl.version=1.1.1.95 -fmp.version=1.1.0.299 -nei.version=1.0.3.51 +ccl.version=1.1.1.104 +fmp.version=1.1.0.307 +nei.version=1.0.3.56 wrcbe.version=1.4.0.7 +ae2.version=+ bc.version=6.0.18 ic2.version=2.2.+ maven.url=file:///var/www/users/fnuecke/maven.cil.li \ No newline at end of file diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index 95dea18f3..96ad84362 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -642,6 +642,7 @@ opencomputers { # Power values for different power systems. value { + AppliedEnergistics2: 100.0 BuildCraft: 500.0 Factorization: 6.5 Galacticraft: 24.0 diff --git a/src/main/scala/li/cil/oc/Settings.scala b/src/main/scala/li/cil/oc/Settings.scala index 65cee41d0..267a48813 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -168,6 +168,7 @@ class Settings(config: Config) { val pistonCost = config.getDouble("power.cost.pistonPush") max 0 // power.value + private val valueAppliedEnergistics2 = config.getDouble("power.value.AppliedEnergistics2") private val valueBuildCraft = config.getDouble("power.value.BuildCraft") private val valueFactorization = config.getDouble("power.value.Factorization") private val valueGalacticraft = config.getDouble("power.value.Galacticraft") @@ -178,6 +179,7 @@ class Settings(config: Config) { private val valueInternal = valueBuildCraft + val ratioAppliedEnergistics2 = valueAppliedEnergistics2 / valueInternal val ratioBuildCraft = valueBuildCraft / valueInternal val ratioFactorization = valueFactorization / valueInternal val ratioGalacticraft = valueGalacticraft / valueInternal diff --git a/src/main/scala/li/cil/oc/common/EventHandler.scala b/src/main/scala/li/cil/oc/common/EventHandler.scala index fcd3dc514..7af3b1641 100644 --- a/src/main/scala/li/cil/oc/common/EventHandler.scala +++ b/src/main/scala/li/cil/oc/common/EventHandler.scala @@ -44,6 +44,15 @@ object EventHandler { } } + @Optional.Method(modid = Mods.IDs.UniversalElectricity) + def scheduleAE2Add(tileEntity: power.AppliedEnergistics2) { + if (SideTracker.isServer) pending.synchronized { + pending += (() => if (!tileEntity.isInvalid) { + tileEntity.getGridNode(ForgeDirection.UNKNOWN).updateState() + }) + } + } + @Optional.Method(modid = Mods.IDs.IndustrialCraft2) def scheduleIC2Add(tileEntity: power.IndustrialCraft2Experimental) { if (SideTracker.isServer) pending.synchronized { diff --git a/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala b/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala index 8eb3c480b..0417bc561 100644 --- a/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala +++ b/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala @@ -18,6 +18,7 @@ class ClassTransformer extends IClassTransformer { private val log = LogManager.getLogger("OpenComputers") private lazy val powerTypes = Map[Mod, Array[String]]( + Mods.AppliedEnergistics2 -> Array("appeng/api/networking/IGridHost"), Mods.BuildCraftPower -> Array("buildcraft/api/power/IPowerReceptor"), Mods.Factorization -> Array("factorization/api/IChargeConductor"), Mods.Galacticraft -> Array("micdoodle8/mods/galacticraft/api/power/IEnergyHandlerGC"), diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/PowerAcceptor.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/PowerAcceptor.scala index b0c3a37b1..184124528 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/PowerAcceptor.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/PowerAcceptor.scala @@ -2,6 +2,7 @@ package li.cil.oc.common.tileentity.traits trait PowerAcceptor extends power.Common + with power.AppliedEnergistics2 with power.BuildCraft with power.Factorization with power.Galacticraft diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/AppliedEnergistics2.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/AppliedEnergistics2.scala new file mode 100644 index 000000000..d7ebb68d3 --- /dev/null +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/power/AppliedEnergistics2.scala @@ -0,0 +1,128 @@ +package li.cil.oc.common.tileentity.traits.power + +import java.util + +import appeng.api.AEApi +import appeng.api.config.{Actionable, PowerMultiplier} +import appeng.api.networking._ +import appeng.api.networking.energy.IEnergyGrid +import appeng.api.util.{AECableType, AEColor, DimensionalCoord} +import cpw.mods.fml.common.Optional +import li.cil.oc.Settings +import li.cil.oc.common.EventHandler +import li.cil.oc.util.mods.Mods +import net.minecraft.nbt.NBTTagCompound +import net.minecraftforge.common.util.ForgeDirection + +import scala.collection.convert.WrapAsJava._ + +trait AppliedEnergistics2 extends Common { + private lazy val useAppliedEnergistics2Power = isServer && Mods.AppliedEnergistics2.isAvailable + + // 'Manual' lazy val, because lazy vals mess up the class loader, leading to class not found exceptions. + private var node: Option[AnyRef] = None + + override def updateEntity() { + super.updateEntity() + if (useAppliedEnergistics2Power && world.getTotalWorldTime % Settings.get.tickFrequency == 0) { + updateEnergy() + } + } + + @Optional.Method(modid = Mods.IDs.AppliedEnergistics2) + private def updateEnergy() { + val grid = getGridNode(ForgeDirection.UNKNOWN).getGrid + if (grid != null) { + val cache = grid.getCache(classOf[IEnergyGrid]).asInstanceOf[IEnergyGrid] + if (cache != null) { + for (side <- ForgeDirection.VALID_DIRECTIONS) { + val demand = (globalBufferSize(side) - globalBuffer(side)) / Settings.get.ratioAppliedEnergistics2 + if (demand > 1) { + val power = cache.extractAEPower(demand, Actionable.MODULATE, PowerMultiplier.CONFIG) + tryChangeBuffer(side, power * Settings.get.ratioAppliedEnergistics2) + } + } + } + } + } + + override def validate() { + super.validate() + if (useAppliedEnergistics2Power) EventHandler.scheduleAE2Add(this) + } + + override def invalidate() { + super.invalidate() + if (useAppliedEnergistics2Power) securityBreak() + } + + override def onChunkUnload() { + super.onChunkUnload() + if (useAppliedEnergistics2Power) securityBreak() + } + + // ----------------------------------------------------------------------- // + + override def readFromNBT(nbt: NBTTagCompound) { + super.readFromNBT(nbt) + if (useAppliedEnergistics2Power) loadNode(nbt) + } + + @Optional.Method(modid = Mods.IDs.AppliedEnergistics2) + private def loadNode(nbt: NBTTagCompound): Unit = { + getGridNode(ForgeDirection.UNKNOWN).loadFromNBT(Settings.namespace + "ae2power", nbt) + } + + override def writeToNBT(nbt: NBTTagCompound) { + super.writeToNBT(nbt) + if (useAppliedEnergistics2Power) saveNode(nbt) + } + + @Optional.Method(modid = Mods.IDs.AppliedEnergistics2) + private def saveNode(nbt: NBTTagCompound): Unit = { + getGridNode(ForgeDirection.UNKNOWN).saveToNBT(Settings.namespace + "ae2power", nbt) + } + + // ----------------------------------------------------------------------- // + + @Optional.Method(modid = Mods.IDs.AppliedEnergistics2) + def getGridNode(side: ForgeDirection) = node match { + case Some(gridNode: IGridNode) => gridNode + case _ => + val gridNode = AEApi.instance.createGridNode(new AppliedEnergistics2GridBlock(this)) + node = Option(gridNode) + gridNode + } + + @Optional.Method(modid = Mods.IDs.AppliedEnergistics2) + def getCableConnectionType(side: ForgeDirection) = AECableType.SMART + + @Optional.Method(modid = Mods.IDs.AppliedEnergistics2) + def securityBreak() { + getGridNode(ForgeDirection.UNKNOWN).destroy() + } +} + +class AppliedEnergistics2GridBlock(val tileEntity: AppliedEnergistics2) extends IGridBlock { + override def getIdlePowerUsage = 0.0 + + override def getFlags = util.EnumSet.noneOf(classOf[GridFlags]) + + override def isWorldAccessable = true + + override def getLocation = new DimensionalCoord(tileEntity) + + override def getGridColor = AEColor.Transparent + + override def onGridNotification(p1: GridNotification) {} + + override def setNetworkStatus(p1: IGrid, p2: Int) {} + + override def getConnectableSides = util.EnumSet.copyOf(ForgeDirection.VALID_DIRECTIONS.filter(tileEntity.canConnectPower).toList) + + override def getMachine = tileEntity.asInstanceOf[IGridHost] + + override def gridChanged() {} + + override def getMachineRepresentation = null +} \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/BuildCraft.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/BuildCraft.scala index 88265e97d..f62663a6b 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/BuildCraft.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/power/BuildCraft.scala @@ -2,8 +2,10 @@ package li.cil.oc.common.tileentity.traits.power import buildcraft.api.power.{IPowerReceptor, PowerHandler} import cpw.mods.fml.common.Optional +import li.cil.oc.util.ExtendedNBT._ import li.cil.oc.util.mods.Mods import li.cil.oc.{OpenComputers, Settings} +import net.minecraft.nbt.NBTTagCompound import net.minecraftforge.common.util.ForgeDirection trait BuildCraft extends Common { @@ -16,18 +18,45 @@ trait BuildCraft extends Common { override def updateEntity() { super.updateEntity() if (useBuildCraftPower && world.getTotalWorldTime % Settings.get.tickFrequency == 0) { - for (side <- ForgeDirection.VALID_DIRECTIONS) { - val demand = (globalBufferSize(side) - globalBuffer(side)) / Settings.get.ratioBuildCraft - if (demand > 1) { - val power = getPowerProvider.useEnergy(1, demand.toFloat, true) - tryChangeBuffer(side, power * Settings.get.ratioBuildCraft) - } + updateEnergy() + } + } + + @Optional.Method(modid = Mods.IDs.BuildCraftPower) + private def updateEnergy() { + for (side <- ForgeDirection.VALID_DIRECTIONS) { + val demand = (globalBufferSize(side) - globalBuffer(side)) / Settings.get.ratioBuildCraft + if (demand > 1) { + val power = getPowerProvider.useEnergy(1, demand.toFloat, true) + tryChangeBuffer(side, power * Settings.get.ratioBuildCraft) } } } // ----------------------------------------------------------------------- // + override def readFromNBT(nbt: NBTTagCompound) { + super.readFromNBT(nbt) + if (useBuildCraftPower) loadHandler(nbt) + } + + @Optional.Method(modid = Mods.IDs.BuildCraftPower) + private def loadHandler(nbt: NBTTagCompound): Unit = { + Option(getPowerProvider).foreach(_.readFromNBT(nbt.getCompoundTag(Settings.namespace + "bcpower"))) + } + + override def writeToNBT(nbt: NBTTagCompound) { + super.writeToNBT(nbt) + if (useBuildCraftPower) saveHandler(nbt) + } + + @Optional.Method(modid = Mods.IDs.BuildCraftPower) + private def saveHandler(nbt: NBTTagCompound): Unit = { + Option(getPowerProvider).foreach(h => nbt.setNewCompoundTag(Settings.namespace + "bcpower", h.writeToNBT)) + } + + // ----------------------------------------------------------------------- // + @Optional.Method(modid = Mods.IDs.BuildCraftPower) def getPowerProvider = { if (Mods.BuildCraftPower.isAvailable && powerHandler.isEmpty) { diff --git a/src/main/scala/li/cil/oc/util/mods/Mods.scala b/src/main/scala/li/cil/oc/util/mods/Mods.scala index b6f6d762f..d7ac30d80 100644 --- a/src/main/scala/li/cil/oc/util/mods/Mods.scala +++ b/src/main/scala/li/cil/oc/util/mods/Mods.scala @@ -9,6 +9,7 @@ import scala.collection.mutable object Mods { object IDs { + final val AppliedEnergistics2 = "appliedenergistics2" final val BattleGear2 = "battlegear2" final val BuildCraftPower = "BuildCraftAPI|power" final val ComputerCraft = "ComputerCraft" @@ -41,6 +42,7 @@ object Mods { lazy val isPowerProvidingModPresent = knownMods.exists(mod => mod.providesPower && mod.isAvailable) + val AppliedEnergistics2 = new SimpleMod(IDs.AppliedEnergistics2) val BattleGear2 = new SimpleMod(IDs.BattleGear2) val BuildCraftPower = new SimpleMod(IDs.BuildCraftPower, providesPower = true) val ComputerCraft = new SimpleMod(IDs.ComputerCraft) From 190d57bf452b54b1401347f42d621958b57d9193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Thu, 25 Sep 2014 12:22:49 +0200 Subject: [PATCH 5/5] Fixed a bunch of *potentially* derpy coordinate computations. Made sign upgrade in tablet also work when standing "inside" the sign. --- .../scala/li/cil/oc/common/SaveHandler.scala | 2 +- .../cil/oc/common/component/TextBuffer.scala | 2 +- .../event/ChunkloaderUpgradeHandler.scala | 2 +- .../li/cil/oc/server/component/Geolyzer.scala | 2 +- .../UpgradeInventoryController.scala | 8 +++---- .../cil/oc/server/component/UpgradeSign.scala | 24 ++++++++++++------- .../component/UpgradeSolarGenerator.scala | 2 +- .../component/WirelessNetworkCard.scala | 6 ++--- 8 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/SaveHandler.scala b/src/main/scala/li/cil/oc/common/SaveHandler.scala index 6d7aa69f4..38984a9b8 100644 --- a/src/main/scala/li/cil/oc/common/SaveHandler.scala +++ b/src/main/scala/li/cil/oc/common/SaveHandler.scala @@ -41,7 +41,7 @@ object SaveHandler { } def scheduleSave(container: Container, nbt: NBTTagCompound, name: String, save: NBTTagCompound => Unit) { - scheduleSave(container.world, math.round(container.xPosition - 0.5).toInt, math.round(container.zPosition - 0.5).toInt, nbt, name, writeNBT(save)) + scheduleSave(container.world, math.floor(container.xPosition).toInt, math.floor(container.zPosition).toInt, nbt, name, writeNBT(save)) } def scheduleSave(world: World, x: Int, z: Int, nbt: NBTTagCompound, name: String, data: Array[Byte]) { diff --git a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala index fdc4fff0f..67129b34c 100644 --- a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala @@ -422,7 +422,7 @@ object TextBuffer { def onChunkUnload(e: ChunkEvent.Unload) { val chunk = e.getChunk clientBuffers = clientBuffers.filter(t => { - val keep = t.owner.world != e.world || !chunk.isAtLocation(math.round(t.owner.xPosition - 0.5).toInt << 4, math.round(t.owner.zPosition - 0.5).toInt << 4) + val keep = t.owner.world != e.world || !chunk.isAtLocation(math.floor(t.owner.xPosition).toInt << 4, math.floor(t.owner.zPosition).toInt << 4) if (!keep) { ClientComponentTracker.remove(t.proxy.nodeAddress) } diff --git a/src/main/scala/li/cil/oc/common/event/ChunkloaderUpgradeHandler.scala b/src/main/scala/li/cil/oc/common/event/ChunkloaderUpgradeHandler.scala index 1c38f65d3..9ed821022 100644 --- a/src/main/scala/li/cil/oc/common/event/ChunkloaderUpgradeHandler.scala +++ b/src/main/scala/li/cil/oc/common/event/ChunkloaderUpgradeHandler.scala @@ -59,7 +59,7 @@ object ChunkloaderUpgradeHandler extends LoadingCallback { } def updateLoadedChunk(loader: UpgradeChunkloader) { - val robotChunk = new ChunkCoordIntPair(math.round(loader.owner.xPosition - 0.5).toInt >> 4, math.round(loader.owner.zPosition - 0.5).toInt >> 4) + val robotChunk = new ChunkCoordIntPair(math.floor(loader.owner.xPosition).toInt >> 4, math.floor(loader.owner.zPosition).toInt >> 4) loader.ticket.foreach(ticket => { ticket.getChunkList.collect { case chunk: ChunkCoordIntPair if chunk != robotChunk => ForgeChunkManager.unforceChunk(ticket, chunk) diff --git a/src/main/scala/li/cil/oc/server/component/Geolyzer.scala b/src/main/scala/li/cil/oc/server/component/Geolyzer.scala index d9e7d15ab..b1bf94b0a 100644 --- a/src/main/scala/li/cil/oc/server/component/Geolyzer.scala +++ b/src/main/scala/li/cil/oc/server/component/Geolyzer.scala @@ -21,7 +21,7 @@ class Geolyzer(val owner: Container) extends component.ManagedComponent { if (math.abs(rx) > Settings.get.geolyzerRange || math.abs(rz) > Settings.get.geolyzerRange) { throw new IllegalArgumentException("location out of bounds") } - val (x, y, z) = ((owner.xPosition - 0.5).toInt, (owner.yPosition - 0.5).toInt, (owner.zPosition - 0.5).toInt) + val (x, y, z) = (math.floor(owner.xPosition).toInt, math.floor(owner.yPosition).toInt, math.floor(owner.zPosition).toInt) val bx = x + rx val bz = z + rz diff --git a/src/main/scala/li/cil/oc/server/component/UpgradeInventoryController.scala b/src/main/scala/li/cil/oc/server/component/UpgradeInventoryController.scala index 2ed33c19f..dbfd81f16 100644 --- a/src/main/scala/li/cil/oc/server/component/UpgradeInventoryController.scala +++ b/src/main/scala/li/cil/oc/server/component/UpgradeInventoryController.scala @@ -22,7 +22,7 @@ class UpgradeInventoryController(val owner: Container with Robot) extends compon def getInventorySize(context: Context, args: Arguments): Array[AnyRef] = { val facing = checkSideForInventory(args, 0) if (facing == owner.facing.getOpposite) result(owner.inventorySize) - else InventoryUtils.inventoryAt(owner.world, math.round(owner.xPosition - 0.5).toInt + facing.offsetX, math.round(owner.yPosition - 0.5).toInt + facing.offsetY, math.round(owner.zPosition - 0.5).toInt + facing.offsetZ) match { + else InventoryUtils.inventoryAt(owner.world, math.floor(owner.xPosition).toInt + facing.offsetX, math.floor(owner.yPosition).toInt + facing.offsetY, math.floor(owner.zPosition).toInt + facing.offsetZ) match { case Some(inventory) => result(inventory.getSizeInventory) case _ => result(Unit, "no inventory") } @@ -36,7 +36,7 @@ class UpgradeInventoryController(val owner: Container with Robot) extends compon if (slot < 0 || slot >= owner.inventorySize) result(Unit) else result(owner.getStackInSlot(slot + 1 + owner.containerCount)) } - else InventoryUtils.inventoryAt(owner.world, math.round(owner.xPosition - 0.5).toInt + facing.offsetX, math.round(owner.yPosition - 0.5).toInt + facing.offsetY, math.round(owner.zPosition - 0.5).toInt + facing.offsetZ) match { + else InventoryUtils.inventoryAt(owner.world, math.floor(owner.xPosition).toInt + facing.offsetX, math.floor(owner.yPosition).toInt + facing.offsetY, math.floor(owner.zPosition).toInt + facing.offsetZ) match { case Some(inventory) => if (slot < 0 || slot > inventory.getSizeInventory) result(Unit) else result(inventory.getStackInSlot(slot)) @@ -51,7 +51,7 @@ class UpgradeInventoryController(val owner: Container with Robot) extends compon val selectedSlot = owner.selectedSlot val stack = owner.getStackInSlot(selectedSlot) if (stack != null && stack.stackSize > 0) { - InventoryUtils.inventoryAt(owner.world, math.round(owner.xPosition - 0.5).toInt + facing.offsetX, math.round(owner.yPosition - 0.5).toInt + facing.offsetY, math.round(owner.zPosition - 0.5).toInt + facing.offsetZ) match { + InventoryUtils.inventoryAt(owner.world, math.floor(owner.xPosition).toInt + facing.offsetX, math.floor(owner.yPosition).toInt + facing.offsetY, math.floor(owner.zPosition).toInt + facing.offsetZ) match { case Some(inventory) if inventory.isUseableByPlayer(owner.player) => val slot = args.checkSlot(inventory, 1) if (!InventoryUtils.insertIntoInventorySlot(stack, inventory, facing.getOpposite, slot, count)) { @@ -81,7 +81,7 @@ class UpgradeInventoryController(val owner: Container with Robot) extends compon val facing = checkSideForAction(args, 0) val count = args.optionalItemCount(2) - InventoryUtils.inventoryAt(owner.world, math.round(owner.xPosition - 0.5).toInt + facing.offsetX, math.round(owner.yPosition - 0.5).toInt + facing.offsetY, math.round(owner.zPosition - 0.5).toInt + facing.offsetZ) match { + InventoryUtils.inventoryAt(owner.world, math.floor(owner.xPosition).toInt + facing.offsetX, math.floor(owner.yPosition).toInt + facing.offsetY, math.floor(owner.zPosition).toInt + facing.offsetZ) match { case Some(inventory) if inventory.isUseableByPlayer(owner.player) => val slot = args.checkSlot(inventory, 1) if (InventoryUtils.extractFromInventorySlot(owner.player.inventory.addItemStackToInventory, inventory, facing.getOpposite, slot, count)) { diff --git a/src/main/scala/li/cil/oc/server/component/UpgradeSign.scala b/src/main/scala/li/cil/oc/server/component/UpgradeSign.scala index 45fd6b94c..fe7befbb8 100644 --- a/src/main/scala/li/cil/oc/server/component/UpgradeSign.scala +++ b/src/main/scala/li/cil/oc/server/component/UpgradeSign.scala @@ -16,9 +16,8 @@ class UpgradeSign(val owner: Container with Rotatable) extends component.Managed @Callback(doc = """function():string -- Get the text on the sign in front of the robot.""") def getValue(context: Context, args: Arguments): Array[AnyRef] = { - val facing = owner.facing - owner.world.getBlockTileEntity(math.round(owner.xPosition - 0.5).toInt + facing.offsetX, math.round(owner.yPosition - 0.5).toInt + facing.offsetY, math.round(owner.zPosition - 0.5).toInt + facing.offsetZ) match { - case sign: TileEntitySign => result(sign.signText.mkString("\n")) + findSign match { + case Some(sign) => result(sign.signText.mkString("\n")) case _ => result(Unit, "no sign") } } @@ -26,14 +25,23 @@ class UpgradeSign(val owner: Container with Rotatable) extends component.Managed @Callback(doc = """function(value:string):string -- Set the text on the sign in front of the robot.""") def setValue(context: Context, args: Arguments): Array[AnyRef] = { val text = args.checkString(0).lines.padTo(4, "").map(line => if (line.length > 15) line.substring(0, 15) else line) - val facing = owner.facing - val (sx, sy, sz) = (math.round(owner.xPosition - 0.5).toInt + facing.offsetX, math.round(owner.yPosition - 0.5).toInt + facing.offsetY, math.round(owner.zPosition - 0.5).toInt + facing.offsetZ) - owner.world.getBlockTileEntity(sx, sy, sz) match { - case sign: TileEntitySign => + findSign match { + case Some(sign) => text.copyToArray(sign.signText) - owner.world.markBlockForUpdate(sx, sy, sz) + owner.world.markBlockForUpdate(sign.xCoord, sign.yCoord, sign.zCoord) result(sign.signText.mkString("\n")) case _ => result(Unit, "no sign") } } + + private def findSign = { + val (x, y, z) = (math.floor(owner.xPosition).toInt, math.floor(owner.yPosition).toInt, math.floor(owner.zPosition).toInt) + owner.world.getBlockTileEntity(x, y, z) match { + case sign: TileEntitySign => Option(sign) + case _ => owner.world.getBlockTileEntity(x + owner.facing.offsetX, y + owner.facing.offsetY, z + owner.facing.offsetZ) match { + case sign: TileEntitySign => Option(sign) + case _ => None + } + } + } } diff --git a/src/main/scala/li/cil/oc/server/component/UpgradeSolarGenerator.scala b/src/main/scala/li/cil/oc/server/component/UpgradeSolarGenerator.scala index 39c974893..bc055407f 100644 --- a/src/main/scala/li/cil/oc/server/component/UpgradeSolarGenerator.scala +++ b/src/main/scala/li/cil/oc/server/component/UpgradeSolarGenerator.scala @@ -27,7 +27,7 @@ class UpgradeSolarGenerator(val owner: Container) extends component.ManagedCompo ticksUntilCheck -= 1 if (ticksUntilCheck <= 0) { ticksUntilCheck = 100 - isSunShining = isSunVisible(owner.world, math.round(owner.xPosition - 0.5).toInt, math.round(owner.yPosition - 0.5).toInt + 1, math.round(owner.zPosition - 0.5).toInt) + isSunShining = isSunVisible(owner.world, math.floor(owner.xPosition).toInt, math.floor(owner.yPosition).toInt + 1, math.floor(owner.zPosition).toInt) } if (isSunShining) { node.changeBuffer(Settings.get.solarGeneratorEfficiency) diff --git a/src/main/scala/li/cil/oc/server/component/WirelessNetworkCard.scala b/src/main/scala/li/cil/oc/server/component/WirelessNetworkCard.scala index 0ff508d2f..154434d2d 100644 --- a/src/main/scala/li/cil/oc/server/component/WirelessNetworkCard.scala +++ b/src/main/scala/li/cil/oc/server/component/WirelessNetworkCard.scala @@ -20,11 +20,11 @@ class WirelessNetworkCard(val owner: Container) extends NetworkCard with Wireles // ----------------------------------------------------------------------- // - override def x = math.round(owner.xPosition - 0.5).toInt + override def x = math.floor(owner.xPosition).toInt - override def y = math.round(owner.yPosition - 0.5).toInt + override def y = math.floor(owner.yPosition).toInt - override def z = math.round(owner.zPosition - 0.5).toInt + override def z = math.floor(owner.zPosition).toInt override def world = owner.world