diff --git a/build.gradle b/build.gradle index 8f0900bc4..bd955edfd 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 d0bbb9d50..bfc339fc2 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=+ waila.version=1.5.4a bc.version=6.0.18 ic2.version=2.2.+ diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index 817aa108f..96ad84362 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -616,6 +616,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 @@ -635,13 +642,14 @@ opencomputers { # Power values for different power systems. value { + AppliedEnergistics2: 100.0 BuildCraft: 500.0 Factorization: 6.5 Galacticraft: 24.0 IndustrialCraft2: 200.0 Mekanism: 555.55555 RedstoneFlux: 35.0 - UniversalElectricity: 1.0 + UniversalElectricity: 1750.0 } } diff --git a/src/main/resources/assets/opencomputers/recipes/default.recipes b/src/main/resources/assets/opencomputers/recipes/default.recipes index 264eafb81..11f4194dd 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 c8ed1f3e4..b1a9f2cf0 100644 --- a/src/main/scala/li/cil/oc/Items.scala +++ b/src/main/scala/li/cil/oc/Items.scala @@ -238,10 +238,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 aa0c5923c..267a48813 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -161,11 +161,14 @@ 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 // 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") @@ -176,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 71f195d2a..7af3b1641 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 @@ -42,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 { @@ -62,6 +73,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/SaveHandler.scala b/src/main/scala/li/cil/oc/common/SaveHandler.scala index 70cb7d4f0..0e5cd9608 100644 --- a/src/main/scala/li/cil/oc/common/SaveHandler.scala +++ b/src/main/scala/li/cil/oc/common/SaveHandler.scala @@ -40,7 +40,7 @@ object SaveHandler { } def scheduleSave(host: EnvironmentHost, nbt: NBTTagCompound, name: String, save: NBTTagCompound => Unit) { - scheduleSave(host.world, host.xPosition.toInt, host.zPosition, nbt, name, writeNBT(save)) + scheduleSave(host.world, math.floor(host.xPosition).toInt, math.floor(host.zPosition).toInt, nbt, name, writeNBT(save)) } def scheduleSave(world: World, x: Double, z: Double, nbt: NBTTagCompound, name: String, data: Array[Byte]) { 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..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,14 +18,15 @@ 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"), 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/Assembler.scala b/src/main/scala/li/cil/oc/common/block/Assembler.scala index ae947e4d3..03c4eed62 100644 --- a/src/main/scala/li/cil/oc/common/block/Assembler.scala +++ b/src/main/scala/li/cil/oc/common/block/Assembler.scala @@ -8,7 +8,7 @@ import net.minecraft.entity.player.EntityPlayer import net.minecraft.world.{IBlockAccess, World} import net.minecraftforge.common.util.ForgeDirection -class Assembler extends SimpleBlock with SpecialBlock { +class Assembler extends SimpleBlock with traits.SpecialBlock with traits.PowerAcceptor { setLightLevel(0.34f) override protected def customTextures = Array( diff --git a/src/main/scala/li/cil/oc/common/block/Cable.scala b/src/main/scala/li/cil/oc/common/block/Cable.scala index 9bf628cfc..6dfd6bfaa 100644 --- a/src/main/scala/li/cil/oc/common/block/Cable.scala +++ b/src/main/scala/li/cil/oc/common/block/Cable.scala @@ -18,7 +18,7 @@ import net.minecraft.util.AxisAlignedBB import net.minecraft.world.{IBlockAccess, World} import net.minecraftforge.common.util.ForgeDirection -class Cable extends SimpleBlock with SpecialBlock { +class Cable extends SimpleBlock with traits.SpecialBlock { setLightOpacity(0) // For Immibis Microblock support. diff --git a/src/main/scala/li/cil/oc/common/block/Case.scala b/src/main/scala/li/cil/oc/common/block/Case.scala index 178fb0ef3..7a20227ac 100644 --- a/src/main/scala/li/cil/oc/common/block/Case.scala +++ b/src/main/scala/li/cil/oc/common/block/Case.scala @@ -14,7 +14,7 @@ import net.minecraft.util.IIcon import net.minecraft.world.{IBlockAccess, World} import net.minecraftforge.common.util.ForgeDirection -class Case(val tier: Int) extends RedstoneAware { +class Case(val tier: Int) extends RedstoneAware with traits.PowerAcceptor { private val iconsOn = new Array[IIcon](6) // ----------------------------------------------------------------------- // diff --git a/src/main/scala/li/cil/oc/common/block/Disassembler.scala b/src/main/scala/li/cil/oc/common/block/Disassembler.scala index 0236e169c..f653c3a26 100644 --- a/src/main/scala/li/cil/oc/common/block/Disassembler.scala +++ b/src/main/scala/li/cil/oc/common/block/Disassembler.scala @@ -10,7 +10,7 @@ import net.minecraft.item.ItemStack import net.minecraft.world.World import net.minecraftforge.common.util.ForgeDirection -class Disassembler extends SimpleBlock { +class Disassembler extends SimpleBlock with traits.PowerAcceptor { override protected def customTextures = Array( None, Some("DisassemblerTop"), diff --git a/src/main/scala/li/cil/oc/common/block/Hologram.scala b/src/main/scala/li/cil/oc/common/block/Hologram.scala index 66b01c079..ca5816de4 100644 --- a/src/main/scala/li/cil/oc/common/block/Hologram.scala +++ b/src/main/scala/li/cil/oc/common/block/Hologram.scala @@ -10,7 +10,7 @@ import net.minecraft.item.{EnumRarity, ItemStack} import net.minecraft.world.{IBlockAccess, World} import net.minecraftforge.common.util.ForgeDirection -class Hologram(val tier: Int) extends SimpleBlock with SpecialBlock { +class Hologram(val tier: Int) extends SimpleBlock with traits.SpecialBlock { setLightLevel(1) setBlockBounds(0, 0, 0, 1, 0.5f, 1) diff --git a/src/main/scala/li/cil/oc/common/block/Keyboard.scala b/src/main/scala/li/cil/oc/common/block/Keyboard.scala index d27ad725f..6a0df766d 100644 --- a/src/main/scala/li/cil/oc/common/block/Keyboard.scala +++ b/src/main/scala/li/cil/oc/common/block/Keyboard.scala @@ -10,7 +10,7 @@ import net.minecraft.world.{IBlockAccess, World} import net.minecraftforge.common.util.ForgeDirection import org.lwjgl.opengl.GL11 -class Keyboard extends SimpleBlock with SpecialBlock { +class Keyboard extends SimpleBlock with traits.SpecialBlock { setLightOpacity(0) // For Immibis Microblock support. diff --git a/src/main/scala/li/cil/oc/common/block/PowerConverter.scala b/src/main/scala/li/cil/oc/common/block/PowerConverter.scala index 0442211d7..679f90828 100644 --- a/src/main/scala/li/cil/oc/common/block/PowerConverter.scala +++ b/src/main/scala/li/cil/oc/common/block/PowerConverter.scala @@ -11,7 +11,7 @@ import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack import net.minecraft.world.World -class PowerConverter extends SimpleBlock { +class PowerConverter extends SimpleBlock with traits.PowerAcceptor { showInItemList = !Settings.get.ignorePower private val formatter = new DecimalFormat("#.#") diff --git a/src/main/scala/li/cil/oc/common/block/RedstoneAware.scala b/src/main/scala/li/cil/oc/common/block/RedstoneAware.scala index 0ad299da8..dfed4c6e8 100644 --- a/src/main/scala/li/cil/oc/common/block/RedstoneAware.scala +++ b/src/main/scala/li/cil/oc/common/block/RedstoneAware.scala @@ -1,14 +1,13 @@ package li.cil.oc.common.block import cpw.mods.fml.common.Optional -import li.cil.oc.common.tileentity.traits -import li.cil.oc.common.tileentity.traits.BundledRedstoneAware +import li.cil.oc.common.tileentity import li.cil.oc.util.mods.Mods import net.minecraft.block.Block import net.minecraft.world.{IBlockAccess, World} import net.minecraftforge.common.util.ForgeDirection -import powercrystals.minefactoryreloaded.api.rednet.{IRedNetNetworkContainer, IRedNetOmniNode} import powercrystals.minefactoryreloaded.api.rednet.connectivity.RedNetConnectionType +import powercrystals.minefactoryreloaded.api.rednet.{IRedNetNetworkContainer, IRedNetOmniNode} @Optional.Interface(iface = "powercrystals.minefactoryreloaded.api.rednet.IConnectableRedNet", modid = Mods.IDs.MineFactoryReloaded) abstract class RedstoneAware extends SimpleBlock with IRedNetOmniNode { @@ -20,7 +19,7 @@ abstract class RedstoneAware extends SimpleBlock with IRedNetOmniNode { override def canConnectRedstone(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection) = world.getTileEntity(x, y, z) match { - case redstone: traits.RedstoneAware => redstone.isOutputEnabled + case redstone: tileentity.traits.RedstoneAware => redstone.isOutputEnabled case _ => false } @@ -29,7 +28,7 @@ abstract class RedstoneAware extends SimpleBlock with IRedNetOmniNode { override def isProvidingWeakPower(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection) = world.getTileEntity(x, y, z) match { - case redstone: traits.RedstoneAware => math.min(math.max(redstone.output(side), 0), 15) + case redstone: tileentity.traits.RedstoneAware => math.min(math.max(redstone.output(side), 0), 15) case _ => super.isProvidingWeakPower(world, x, y, z, side) } @@ -38,7 +37,7 @@ abstract class RedstoneAware extends SimpleBlock with IRedNetOmniNode { override def onNeighborBlockChange(world: World, x: Int, y: Int, z: Int, block: Block) { if (Mods.MineFactoryReloaded.isAvailable) { world.getTileEntity(x, y, z) match { - case t: BundledRedstoneAware => for (side <- ForgeDirection.VALID_DIRECTIONS) { + case t: tileentity.traits.BundledRedstoneAware => for (side <- ForgeDirection.VALID_DIRECTIONS) { world.getBlock(x + side.offsetX, y + side.offsetY, z + side.offsetZ) match { case block: IRedNetNetworkContainer => case _ => for (color <- 0 until 16) { @@ -50,7 +49,7 @@ abstract class RedstoneAware extends SimpleBlock with IRedNetOmniNode { } } world.getTileEntity(x, y, z) match { - case redstone: traits.RedstoneAware => redstone.checkRedstoneInputChanged() + case redstone: tileentity.traits.RedstoneAware => redstone.checkRedstoneInputChanged() case _ => // Ignore. } } @@ -61,13 +60,13 @@ abstract class RedstoneAware extends SimpleBlock with IRedNetOmniNode { override def getOutputValue(world: World, x: Int, y: Int, z: Int, side: ForgeDirection, color: Int) = world.getTileEntity(x, y, z) match { - case t: BundledRedstoneAware => t.bundledOutput(side, color) + case t: tileentity.traits.BundledRedstoneAware => t.bundledOutput(side, color) case _ => 0 } override def getOutputValues(world: World, x: Int, y: Int, z: Int, side: ForgeDirection) = world.getTileEntity(x, y, z) match { - case t: BundledRedstoneAware => t.bundledOutput(side) + case t: tileentity.traits.BundledRedstoneAware => t.bundledOutput(side) case _ => Array.fill(16)(0) } @@ -75,7 +74,7 @@ abstract class RedstoneAware extends SimpleBlock with IRedNetOmniNode { override def onInputsChanged(world: World, x: Int, y: Int, z: Int, side: ForgeDirection, inputValues: Array[Int]) = world.getTileEntity(x, y, z) match { - case t: BundledRedstoneAware => for (color <- 0 until 16) { + case t: tileentity.traits.BundledRedstoneAware => for (color <- 0 until 16) { t.rednetInput(side, color, inputValues(color)) } case _ => diff --git a/src/main/scala/li/cil/oc/common/block/RobotAfterimage.scala b/src/main/scala/li/cil/oc/common/block/RobotAfterimage.scala index 370038245..a99637766 100644 --- a/src/main/scala/li/cil/oc/common/block/RobotAfterimage.scala +++ b/src/main/scala/li/cil/oc/common/block/RobotAfterimage.scala @@ -12,7 +12,7 @@ import net.minecraft.util.{IIcon, MovingObjectPosition} import net.minecraft.world.{IBlockAccess, World} import net.minecraftforge.common.util.ForgeDirection -class RobotAfterimage extends SimpleBlock with SpecialBlock { +class RobotAfterimage extends SimpleBlock with traits.SpecialBlock { setLightOpacity(0) showInItemList = false diff --git a/src/main/scala/li/cil/oc/common/block/RobotProxy.scala b/src/main/scala/li/cil/oc/common/block/RobotProxy.scala index 9c2b778fb..ae2831340 100644 --- a/src/main/scala/li/cil/oc/common/block/RobotProxy.scala +++ b/src/main/scala/li/cil/oc/common/block/RobotProxy.scala @@ -17,7 +17,7 @@ import net.minecraft.util.{AxisAlignedBB, IIcon, MovingObjectPosition, Vec3} import net.minecraft.world.{IBlockAccess, World} import net.minecraftforge.common.util.ForgeDirection -class RobotProxy extends RedstoneAware with SpecialBlock { +class RobotProxy extends RedstoneAware with traits.SpecialBlock { setLightOpacity(0) showInItemList = false diff --git a/src/main/scala/li/cil/oc/common/block/ServerRack.scala b/src/main/scala/li/cil/oc/common/block/ServerRack.scala index a1b80bc03..cf86255e5 100644 --- a/src/main/scala/li/cil/oc/common/block/ServerRack.scala +++ b/src/main/scala/li/cil/oc/common/block/ServerRack.scala @@ -9,7 +9,7 @@ import net.minecraft.entity.player.EntityPlayer import net.minecraft.world.{IBlockAccess, World} import net.minecraftforge.common.util.ForgeDirection -class ServerRack extends RedstoneAware with SpecialBlock { +class ServerRack extends RedstoneAware with traits.SpecialBlock with traits.PowerAcceptor { override protected def customTextures = Array( None, None, diff --git a/src/main/scala/li/cil/oc/common/block/traits/PowerAcceptor.scala b/src/main/scala/li/cil/oc/common/block/traits/PowerAcceptor.scala new file mode 100644 index 000000000..024847873 --- /dev/null +++ b/src/main/scala/li/cil/oc/common/block/traits/PowerAcceptor.scala @@ -0,0 +1,27 @@ +package li.cil.oc.common.block.traits + +import cpw.mods.fml.common.Optional +import li.cil.oc.common.tileentity.traits.power.UniversalElectricity +import li.cil.oc.util.mods.Mods +import net.minecraft.block.Block +import net.minecraft.tileentity.TileEntity +import net.minecraft.world.World +import net.minecraftforge.common.util.ForgeDirection +import universalelectricity.api.core.grid.electric.IEnergyNode + +trait PowerAcceptor extends Block { + override def onNeighborBlockChange(world: World, x: Int, y: Int, z: Int, block: Block) { + super.onNeighborBlockChange(world, x, y, z, block) + if (Mods.UniversalElectricity.isAvailable) { + updateUENode(world.getTileEntity(x, y, z)) + } + } + + @Optional.Method(modid = Mods.IDs.UniversalElectricity) + private def updateUENode(tileEntity: TileEntity) { + tileEntity match { + case ue: UniversalElectricity => ue.getNode(classOf[IEnergyNode], ForgeDirection.UNKNOWN).reconstruct() + case _ => + } + } +} diff --git a/src/main/scala/li/cil/oc/common/block/SpecialBlock.scala b/src/main/scala/li/cil/oc/common/block/traits/SpecialBlock.scala similarity index 88% rename from src/main/scala/li/cil/oc/common/block/SpecialBlock.scala rename to src/main/scala/li/cil/oc/common/block/traits/SpecialBlock.scala index d24bb8d50..242b5a037 100644 --- a/src/main/scala/li/cil/oc/common/block/SpecialBlock.scala +++ b/src/main/scala/li/cil/oc/common/block/traits/SpecialBlock.scala @@ -1,5 +1,6 @@ -package li.cil.oc.common.block +package li.cil.oc.common.block.traits +import li.cil.oc.common.block.SimpleBlock import net.minecraft.world.IBlockAccess import net.minecraftforge.common.util.ForgeDirection 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 437fe0a23..16c1776f7 100644 --- a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala @@ -423,7 +423,7 @@ object TextBuffer { def onChunkUnload(e: ChunkEvent.Unload) { val chunk = e.getChunk clientBuffers = clientBuffers.filter(t => { - val keep = t.host.world != e.world || !chunk.isAtLocation(math.round(t.host.xPosition - 0.5).toInt << 4, math.round(t.host.zPosition - 0.5).toInt << 4) + val keep = t.host.world != e.world || !chunk.isAtLocation(math.floor(t.host.xPosition).toInt << 4, math.floor(t.host.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 a4bfa08cd..36bd777f7 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.host.xPosition - 0.5).toInt >> 4, math.round(loader.host.zPosition - 0.5).toInt >> 4) + val robotChunk = new ChunkCoordIntPair(math.floor(loader.host.xPosition).toInt >> 4, math.floor(loader.host.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/common/item/Tablet.scala b/src/main/scala/li/cil/oc/common/item/Tablet.scala index 6d9cf7631..37e8346a3 100644 --- a/src/main/scala/li/cil/oc/common/item/Tablet.scala +++ b/src/main/scala/li/cil/oc/common/item/Tablet.scala @@ -15,6 +15,7 @@ import li.cil.oc.api.{Driver, Machine} import li.cil.oc.common.inventory.ComponentInventory import li.cil.oc.common.{GuiType, Slot} 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} @@ -121,8 +122,8 @@ class TabletWrapper(var stack: ItemStack, var holder: EntityPlayer) extends Comp val data = stack.getTagCompound load(data) if (!world.isRemote) { - machine.load(data.getCompoundTag(Settings.namespace + "data")) tablet.load(data.getCompoundTag(Settings.namespace + "component")) + machine.load(data.getCompoundTag(Settings.namespace + "data")) } } } @@ -136,8 +137,8 @@ class TabletWrapper(var stack: ItemStack, var holder: EntityPlayer) extends Comp if (!data.hasKey(Settings.namespace + "data")) { data.setTag(Settings.namespace + "data", new NBTTagCompound()) } - machine.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", machine.save) // Force tablets into stopped state to avoid errors when trying to // load deleted machine states. @@ -237,13 +238,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 componentSlot(address: String) = components.indexWhere(_.exists(env => env.node != null && env.node.address == address)) 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 e8592e6c0..c68de54e8 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.server.driver.item import li.cil.oc.util.ExtendedNBT._ @@ -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 driver.slot(stack) == Slot.Upgrade => - driver != item.Keyboard && driver != item.Screen && + driver != item.Screen && driver.slot(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() { 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 992e289d5..5e28f0678 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala @@ -83,6 +83,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) } @@ -115,6 +116,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) @@ -224,5 +234,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) } 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..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 @@ -9,4 +10,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/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/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/server/component/Geolyzer.scala b/src/main/scala/li/cil/oc/server/component/Geolyzer.scala index 53b2e63c5..a719642ee 100644 --- a/src/main/scala/li/cil/oc/server/component/Geolyzer.scala +++ b/src/main/scala/li/cil/oc/server/component/Geolyzer.scala @@ -22,7 +22,7 @@ class Geolyzer(val host: EnvironmentHost) 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) = ((host.xPosition - 0.5).toInt, (host.yPosition - 0.5).toInt, (host.zPosition - 0.5).toInt) + val (x, y, z) = (math.floor(host.xPosition).toInt, math.floor(host.yPosition).toInt, math.floor(host.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 eb88f4763..1331ca6ef 100644 --- a/src/main/scala/li/cil/oc/server/component/UpgradeInventoryController.scala +++ b/src/main/scala/li/cil/oc/server/component/UpgradeInventoryController.scala @@ -23,7 +23,7 @@ class UpgradeInventoryController(val host: EnvironmentHost with Robot) extends c def getInventorySize(context: Context, args: Arguments): Array[AnyRef] = { val facing = checkSideForInventory(args, 0) if (facing == host.facing.getOpposite) result(host.inventorySize) - else InventoryUtils.inventoryAt(host.world, math.round(host.xPosition - 0.5).toInt + facing.offsetX, math.round(host.yPosition - 0.5).toInt + facing.offsetY, math.round(host.zPosition - 0.5).toInt + facing.offsetZ) match { + else InventoryUtils.inventoryAt(host.world, math.floor(host.xPosition).toInt + facing.offsetX, math.floor(host.yPosition).toInt + facing.offsetY, math.floor(host.zPosition).toInt + facing.offsetZ) match { case Some(inventory) => result(inventory.getSizeInventory) case _ => result(Unit, "no inventory") } @@ -37,7 +37,7 @@ class UpgradeInventoryController(val host: EnvironmentHost with Robot) extends c if (slot < 0 || slot >= host.inventorySize) result(Unit) else result(host.getStackInSlot(slot + 1 + host.containerCount)) } - else InventoryUtils.inventoryAt(host.world, math.round(host.xPosition - 0.5).toInt + facing.offsetX, math.round(host.yPosition - 0.5).toInt + facing.offsetY, math.round(host.zPosition - 0.5).toInt + facing.offsetZ) match { + else InventoryUtils.inventoryAt(host.world, math.floor(host.xPosition).toInt + facing.offsetX, math.floor(host.yPosition).toInt + facing.offsetY, math.floor(host.zPosition).toInt + facing.offsetZ) match { case Some(inventory) => if (slot < 0 || slot > inventory.getSizeInventory) result(Unit) else result(inventory.getStackInSlot(slot)) @@ -52,7 +52,7 @@ class UpgradeInventoryController(val host: EnvironmentHost with Robot) extends c val selectedSlot = host.selectedSlot val stack = host.getStackInSlot(selectedSlot) if (stack != null && stack.stackSize > 0) { - InventoryUtils.inventoryAt(host.world, math.round(host.xPosition - 0.5).toInt + facing.offsetX, math.round(host.yPosition - 0.5).toInt + facing.offsetY, math.round(host.zPosition - 0.5).toInt + facing.offsetZ) match { + InventoryUtils.inventoryAt(host.world, math.floor(host.xPosition).toInt + facing.offsetX, math.floor(host.yPosition).toInt + facing.offsetY, math.floor(host.zPosition).toInt + facing.offsetZ) match { case Some(inventory) if inventory.isUseableByPlayer(host.player) => val slot = args.checkSlot(inventory, 1) if (!InventoryUtils.insertIntoInventorySlot(stack, inventory, facing.getOpposite, slot, count)) { @@ -82,7 +82,7 @@ class UpgradeInventoryController(val host: EnvironmentHost with Robot) extends c val facing = checkSideForAction(args, 0) val count = args.optionalItemCount(2) - InventoryUtils.inventoryAt(host.world, math.round(host.xPosition - 0.5).toInt + facing.offsetX, math.round(host.yPosition - 0.5).toInt + facing.offsetY, math.round(host.zPosition - 0.5).toInt + facing.offsetZ) match { + InventoryUtils.inventoryAt(host.world, math.floor(host.xPosition).toInt + facing.offsetX, math.floor(host.yPosition).toInt + facing.offsetY, math.floor(host.zPosition).toInt + facing.offsetZ) match { case Some(inventory) if inventory.isUseableByPlayer(host.player) => val slot = args.checkSlot(inventory, 1) if (InventoryUtils.extractFromInventorySlot(host.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 854b52d54..eda19f78c 100644 --- a/src/main/scala/li/cil/oc/server/component/UpgradeSign.scala +++ b/src/main/scala/li/cil/oc/server/component/UpgradeSign.scala @@ -18,9 +18,8 @@ class UpgradeSign(val host: EnvironmentHost with Rotatable) extends component.Ma @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 = host.facing - host.world.getTileEntity(math.round(host.xPosition - 0.5).toInt + facing.offsetX, math.round(host.yPosition - 0.5).toInt + facing.offsetY, math.round(host.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") } } @@ -28,14 +27,23 @@ class UpgradeSign(val host: EnvironmentHost with Rotatable) extends component.Ma @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 = host.facing - val (sx, sy, sz) = (math.round(host.xPosition - 0.5).toInt + facing.offsetX, math.round(host.yPosition - 0.5).toInt + facing.offsetY, math.round(host.zPosition - 0.5).toInt + facing.offsetZ) - host.world.getTileEntity(sx, sy, sz) match { - case sign: TileEntitySign => + findSign match { + case Some(sign) => text.copyToArray(sign.signText) - host.world.markBlockForUpdate(sx, sy, sz) + host.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(host.xPosition).toInt, math.floor(host.yPosition).toInt, math.floor(host.zPosition).toInt) + host.world.getTileEntity(x, y, z) match { + case sign: TileEntitySign => Option(sign) + case _ => host.world.getTileEntity(x + host.facing.offsetX, y + host.facing.offsetY, z + host.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 b64d7eaef..8c51e092a 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 host: EnvironmentHost) extends component.Managed ticksUntilCheck -= 1 if (ticksUntilCheck <= 0) { ticksUntilCheck = 100 - isSunShining = isSunVisible(host.world, math.round(host.xPosition - 0.5).toInt, math.round(host.yPosition - 0.5).toInt + 1, math.round(host.zPosition - 0.5).toInt) + isSunShining = isSunVisible(host.world, math.floor(host.xPosition).toInt, math.floor(host.yPosition).toInt + 1, math.floor(host.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 f044e6981..b9a4361cf 100644 --- a/src/main/scala/li/cil/oc/server/component/WirelessNetworkCard.scala +++ b/src/main/scala/li/cil/oc/server/component/WirelessNetworkCard.scala @@ -21,11 +21,11 @@ class WirelessNetworkCard(val host: EnvironmentHost) extends NetworkCard with Wi // ----------------------------------------------------------------------- // - override def x = math.round(host.xPosition - 0.5).toInt + override def x = math.floor(host.xPosition).toInt - override def y = math.round(host.yPosition - 0.5).toInt + override def y = math.floor(host.yPosition).toInt - override def z = math.round(host.zPosition - 0.5).toInt + override def z = math.floor(host.zPosition).toInt override def world = host.world 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..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) @@ -72,7 +74,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) }