From b48c2098ab919d3375cb49cf39dfa8461fdd9d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 25 Feb 2017 17:10:27 +0100 Subject: [PATCH] Fixed a couple more compile errors; hackjob of an implementation of new IFluidHandler stuff. Kickd MCMP for now, too much other stuff to fix first. --- .../java/li/cil/oc/api/internal/Robot.java | 3 +- .../li/cil/oc/client/CommandHandler.scala | 2 +- .../li/cil/oc/client/PacketHandler.scala | 2 +- .../scala/li/cil/oc/common/EventHandler.scala | 21 +- .../li/cil/oc/common/block/Adapter.scala | 2 +- .../li/cil/oc/common/block/Assembler.scala | 3 - .../li/cil/oc/common/block/Capacitor.scala | 5 +- .../li/cil/oc/common/block/Charger.scala | 4 +- .../li/cil/oc/common/block/DiskDrive.scala | 9 - .../li/cil/oc/common/block/Geolyzer.scala | 5 - .../li/cil/oc/common/block/Hologram.scala | 6 - .../li/cil/oc/common/block/Keyboard.scala | 2 +- .../li/cil/oc/common/block/NetSplitter.scala | 4 +- .../cil/oc/common/block/PowerConverter.scala | 17 +- .../oc/common/block/PowerDistributor.scala | 5 - .../scala/li/cil/oc/common/block/Print.scala | 8 +- .../li/cil/oc/common/block/Redstone.scala | 13 +- .../cil/oc/common/block/RedstoneAware.scala | 56 +--- .../scala/li/cil/oc/common/block/Screen.scala | 3 - .../li/cil/oc/common/block/SimpleBlock.scala | 7 +- .../cil/oc/common/command/SimpleCommand.scala | 4 +- .../oc/common/container/ComponentSlot.scala | 4 +- .../scala/li/cil/oc/common/entity/Drone.scala | 2 +- .../oc/common/event/BlockChangeHandler.scala | 2 + .../scala/li/cil/oc/common/init/Items.scala | 10 - .../cil/oc/common/item/AbstractBusCard.scala | 7 - .../li/cil/oc/common/item/RedstoneCard.scala | 21 +- .../cil/oc/common/item/WorldSensorCard.scala | 7 - .../scala/li/cil/oc/common/item/Wrench.scala | 93 ------ .../oc/common/item/traits/Chargeable.scala | 79 +----- .../cil/oc/common/recipe/ExtendedRecipe.scala | 3 - .../common/recipe/LootDiskCyclingRecipe.scala | 7 +- .../li/cil/oc/common/tileentity/Adapter.scala | 14 +- .../cil/oc/common/tileentity/Assembler.scala | 2 +- .../li/cil/oc/common/tileentity/Cable.scala | 4 +- .../cil/oc/common/tileentity/Capacitor.scala | 6 +- .../li/cil/oc/common/tileentity/Case.scala | 4 +- .../li/cil/oc/common/tileentity/Charger.scala | 20 +- .../oc/common/tileentity/Disassembler.scala | 10 +- .../cil/oc/common/tileentity/Hologram.scala | 19 +- .../common/tileentity/Microcontroller.scala | 2 +- .../oc/common/tileentity/MotionSensor.scala | 6 +- .../oc/common/tileentity/NetSplitter.scala | 10 +- .../li/cil/oc/common/tileentity/Printer.scala | 2 +- .../li/cil/oc/common/tileentity/Rack.scala | 4 +- .../li/cil/oc/common/tileentity/Relay.scala | 10 - .../li/cil/oc/common/tileentity/Robot.scala | 68 +++-- .../cil/oc/common/tileentity/RobotProxy.scala | 12 +- .../li/cil/oc/common/tileentity/Screen.scala | 12 +- .../li/cil/oc/common/tileentity/Switch.scala | 10 - .../cil/oc/common/tileentity/Waypoint.scala | 14 +- .../traits/BundledRedstoneAware.scala | 55 +--- .../oc/common/tileentity/traits/Colored.scala | 2 +- .../common/tileentity/traits/Computer.scala | 16 +- .../tileentity/traits/Environment.scala | 62 +--- .../cil/oc/common/tileentity/traits/Hub.scala | 2 +- .../common/tileentity/traits/Inventory.scala | 6 +- .../tileentity/traits/PowerAcceptor.scala | 10 +- .../tileentity/traits/PowerBalancer.scala | 2 +- .../tileentity/traits/RedstoneAware.scala | 34 +-- .../common/tileentity/traits/Rotatable.scala | 24 +- .../common/tileentity/traits/StateAware.scala | 6 - .../common/tileentity/traits/TileEntity.scala | 10 +- .../power/IndustrialCraft2Experimental.scala | 96 ------- .../traits/power/RedstoneFlux.scala | 30 -- .../scala/li/cil/oc/integration/Mods.scala | 1 - .../jei/LootDiskCyclingRecipeHandler.scala | 6 +- .../cil/oc/integration/mcmp/MCMultiPart.scala | 30 -- .../integration/mcmp/MCMultiPartClient.scala | 29 -- .../oc/integration/mcmp/ModMCMultiPart.scala | 12 - .../cil/oc/integration/mcmp/PartCable.scala | 265 ------------------ .../oc/integration/mcmp/PartCableModel.scala | 18 -- .../oc/integration/mcmp/PartConverter.scala | 88 ------ .../cil/oc/integration/mcmp/PartFactory.scala | 61 ---- .../cil/oc/integration/mcmp/PartPrint.scala | 200 ------------- .../opencomputers/DriverRedstoneCard.scala | 16 +- .../opencomputers/ModOpenComputers.scala | 8 +- .../oc/integration/util/BundledRedstone.scala | 2 +- .../cil/oc/integration/util/PortalGun.scala | 21 -- .../li/cil/oc/integration/util/Waila.scala | 10 - .../integration/util/WirelessRedstone.scala | 50 ---- .../scala/li/cil/oc/server/agent/Player.scala | 21 +- .../cil/oc/server/component/DebugCard.scala | 8 +- .../li/cil/oc/server/component/Redstone.scala | 27 -- .../server/component/RedstoneWireless.scala | 165 ----------- .../traits/TankInventoryControl.scala | 73 +---- .../component/traits/TankWorldControl.scala | 8 +- .../component/traits/WorldTankAnalytics.scala | 6 +- .../scala/li/cil/oc/util/FluidUtils.scala | 33 ++- src/main/scala/li/cil/oc/util/ItemCosts.scala | 2 +- 90 files changed, 267 insertions(+), 1893 deletions(-) delete mode 100644 src/main/scala/li/cil/oc/common/item/AbstractBusCard.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/WorldSensorCard.scala delete mode 100644 src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2Experimental.scala delete mode 100644 src/main/scala/li/cil/oc/common/tileentity/traits/power/RedstoneFlux.scala delete mode 100644 src/main/scala/li/cil/oc/integration/mcmp/MCMultiPart.scala delete mode 100644 src/main/scala/li/cil/oc/integration/mcmp/MCMultiPartClient.scala delete mode 100644 src/main/scala/li/cil/oc/integration/mcmp/ModMCMultiPart.scala delete mode 100644 src/main/scala/li/cil/oc/integration/mcmp/PartCable.scala delete mode 100644 src/main/scala/li/cil/oc/integration/mcmp/PartCableModel.scala delete mode 100644 src/main/scala/li/cil/oc/integration/mcmp/PartConverter.scala delete mode 100644 src/main/scala/li/cil/oc/integration/mcmp/PartFactory.scala delete mode 100644 src/main/scala/li/cil/oc/integration/mcmp/PartPrint.scala delete mode 100644 src/main/scala/li/cil/oc/integration/util/PortalGun.scala delete mode 100644 src/main/scala/li/cil/oc/integration/util/Waila.scala delete mode 100644 src/main/scala/li/cil/oc/integration/util/WirelessRedstone.scala delete mode 100644 src/main/scala/li/cil/oc/server/component/RedstoneWireless.scala diff --git a/src/main/java/li/cil/oc/api/internal/Robot.java b/src/main/java/li/cil/oc/api/internal/Robot.java index b618deadb..ca5efa25f 100644 --- a/src/main/java/li/cil/oc/api/internal/Robot.java +++ b/src/main/java/li/cil/oc/api/internal/Robot.java @@ -3,7 +3,6 @@ package li.cil.oc.api.internal; import li.cil.oc.api.network.EnvironmentHost; import li.cil.oc.api.network.Environment; import net.minecraft.inventory.ISidedInventory; -import net.minecraftforge.fluids.IFluidHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -29,7 +28,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; *

* This interface is not meant to be implemented, just used. */ -public interface Robot extends Agent, Environment, EnvironmentHost, Tiered, ISidedInventory, IFluidHandler { +public interface Robot extends Agent, Environment, EnvironmentHost, Tiered, ISidedInventory { /** * The number of built-in components in this robot. */ diff --git a/src/main/scala/li/cil/oc/client/CommandHandler.scala b/src/main/scala/li/cil/oc/client/CommandHandler.scala index 680186cb7..6ea1bfb83 100644 --- a/src/main/scala/li/cil/oc/client/CommandHandler.scala +++ b/src/main/scala/li/cil/oc/client/CommandHandler.scala @@ -12,7 +12,7 @@ object CommandHandler { } object SetClipboardCommand extends SimpleCommand("oc_setclipboard") { - override def getCommandUsage(source: ICommandSender): String = name + " " + override def getUsage(source: ICommandSender): String = name + " " override def execute(server: MinecraftServer, source: ICommandSender, command: Array[String]): Unit = { if (source.getEntityWorld.isRemote && command != null && command.length > 0) { diff --git a/src/main/scala/li/cil/oc/client/PacketHandler.scala b/src/main/scala/li/cil/oc/client/PacketHandler.scala index c5d1aaad0..5ffdfe38c 100644 --- a/src/main/scala/li/cil/oc/client/PacketHandler.scala +++ b/src/main/scala/li/cil/oc/client/PacketHandler.scala @@ -146,7 +146,7 @@ object PacketHandler extends CommonPacketHandler { p.readTileEntity[Colored]() match { case Some(t) => t.setColor(p.readInt()) - t.world.notifyBlockUpdate(t.position) + t.getWorld.notifyBlockUpdate(t.position) case _ => // Invalid packet. } diff --git a/src/main/scala/li/cil/oc/common/EventHandler.scala b/src/main/scala/li/cil/oc/common/EventHandler.scala index f34f0b538..9836418e3 100644 --- a/src/main/scala/li/cil/oc/common/EventHandler.scala +++ b/src/main/scala/li/cil/oc/common/EventHandler.scala @@ -109,25 +109,6 @@ object EventHandler { } } - @Optional.Method(modid = Mods.IDs.IndustrialCraft2) - def scheduleIC2Add(tileEntity: power.IndustrialCraft2Experimental) { - if (SideTracker.isServer) pendingServer.synchronized { - pendingServer += (() => if (!tileEntity.addedToIC2PowerGrid && !tileEntity.isInvalid) { - MinecraftForge.EVENT_BUS.post(new ic2.api.energy.event.EnergyTileLoadEvent(tileEntity.asInstanceOf[ic2.api.energy.tile.IEnergySink])) - tileEntity.addedToIC2PowerGrid = true - }) - } - } - - def scheduleWirelessRedstone(rs: server.component.RedstoneWireless) { - if (SideTracker.isServer) pendingServer.synchronized { - pendingServer += (() => if (rs.node.network != null) { - util.WirelessRedstone.addReceiver(rs) - util.WirelessRedstone.updateOutput(rs) - }) - } - } - @SubscribeEvent def onAttachCapabilities(event: AttachCapabilitiesEvent.TileEntity): Unit = { event.getTileEntity match { @@ -232,7 +213,7 @@ object EventHandler { }) // Do update check in local games and for OPs. val server = FMLCommonHandler.instance.getMinecraftServerInstance - if (!Mods.VersionChecker.isAvailable && (!server.isDedicatedServer || server.getPlayerList.canSendCommands(player.getGameProfile))) { + if (!server.isDedicatedServer || server.getPlayerList.canSendCommands(player.getGameProfile)) { Future { UpdateCheck.info onSuccess { case Some(release) => player.sendMessage(Localization.Chat.InfoNewVersion(release.tag_name)) diff --git a/src/main/scala/li/cil/oc/common/block/Adapter.scala b/src/main/scala/li/cil/oc/common/block/Adapter.scala index 335da92b7..8f4e66152 100644 --- a/src/main/scala/li/cil/oc/common/block/Adapter.scala +++ b/src/main/scala/li/cil/oc/common/block/Adapter.scala @@ -20,7 +20,7 @@ class Adapter extends SimpleBlock with traits.GUI { // ----------------------------------------------------------------------- // - override def neighborChanged(state: IBlockState, world: World, pos: BlockPos, neighborBlock: Block): Unit = + override def neighborChanged(state: IBlockState, world: World, pos: BlockPos, block: Block, fromPos: BlockPos): Unit = world.getTileEntity(pos) match { case adapter: tileentity.Adapter => adapter.neighborChanged() case _ => // Ignore. 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 1d11d3c2b..f79f960e2 100644 --- a/src/main/scala/li/cil/oc/common/block/Assembler.scala +++ b/src/main/scala/li/cil/oc/common/block/Assembler.scala @@ -3,7 +3,6 @@ package li.cil.oc.common.block import li.cil.oc.Settings import li.cil.oc.common.GuiType import li.cil.oc.common.tileentity -import li.cil.oc.integration.coloredlights.ModColoredLights import net.minecraft.block.state.IBlockState import net.minecraft.util.EnumFacing import net.minecraft.util.math.BlockPos @@ -11,8 +10,6 @@ import net.minecraft.world.IBlockAccess import net.minecraft.world.World class Assembler extends SimpleBlock with traits.PowerAcceptor with traits.StateAware with traits.GUI { - ModColoredLights.setLightLevel(this, 0, 3, 5) - override def isOpaqueCube(state: IBlockState): Boolean = false override def isFullCube(state: IBlockState): Boolean = false diff --git a/src/main/scala/li/cil/oc/common/block/Capacitor.scala b/src/main/scala/li/cil/oc/common/block/Capacitor.scala index 9b8560f07..54fb043f3 100644 --- a/src/main/scala/li/cil/oc/common/block/Capacitor.scala +++ b/src/main/scala/li/cil/oc/common/block/Capacitor.scala @@ -3,15 +3,12 @@ package li.cil.oc.common.block import java.util.Random import li.cil.oc.common.tileentity -import li.cil.oc.integration.coloredlights.ModColoredLights import net.minecraft.block.Block import net.minecraft.block.state.IBlockState import net.minecraft.util.math.BlockPos import net.minecraft.world.World class Capacitor extends SimpleBlock { - ModColoredLights.setLightLevel(this, 5, 5, 5) - setTickRandomly(true) // ----------------------------------------------------------------------- // @@ -35,7 +32,7 @@ class Capacitor extends SimpleBlock { override def tickRate(world: World) = 1 - override def neighborChanged(state: IBlockState, world: World, pos: BlockPos, neighborBlock: Block): Unit = + override def neighborChanged(state: IBlockState, world: World, pos: BlockPos, block: Block, fromPos: BlockPos): Unit = world.getTileEntity(pos) match { case capacitor: tileentity.Capacitor => capacitor.recomputeCapacity() case _ => diff --git a/src/main/scala/li/cil/oc/common/block/Charger.scala b/src/main/scala/li/cil/oc/common/block/Charger.scala index 8ed9dd590..70e953d01 100644 --- a/src/main/scala/li/cil/oc/common/block/Charger.scala +++ b/src/main/scala/li/cil/oc/common/block/Charger.scala @@ -52,11 +52,11 @@ class Charger extends RedstoneAware with traits.PowerAcceptor with traits.StateA } else super.localOnBlockActivated(world, pos, player, hand, heldItem, side, hitX, hitY, hitZ) - override def neighborChanged(state: IBlockState, world: World, pos: BlockPos, neighborBlock: Block): Unit = { + override def neighborChanged(state: IBlockState, world: World, pos: BlockPos, block: Block, fromPos: BlockPos): Unit = { world.getTileEntity(pos) match { case charger: tileentity.Charger => charger.onNeighborChanged() case _ => } - super.neighborChanged(state, world, pos, neighborBlock) + super.neighborChanged(state, world, pos, block, fromPos) } } diff --git a/src/main/scala/li/cil/oc/common/block/DiskDrive.scala b/src/main/scala/li/cil/oc/common/block/DiskDrive.scala index 455e1b70c..be0f18a1c 100644 --- a/src/main/scala/li/cil/oc/common/block/DiskDrive.scala +++ b/src/main/scala/li/cil/oc/common/block/DiskDrive.scala @@ -23,15 +23,6 @@ class DiskDrive extends SimpleBlock with traits.GUI { // ----------------------------------------------------------------------- // - override protected def tooltipTail(metadata: Int, stack: ItemStack, player: EntityPlayer, tooltip: java.util.List[String], advanced: Boolean) { - super.tooltipTail(metadata, stack, player, tooltip, advanced) - if (Mods.ComputerCraft.isAvailable) { - tooltip.addAll(Tooltip.get(getClass.getSimpleName + ".CC")) - } - } - - // ----------------------------------------------------------------------- // - override def guiType = GuiType.DiskDrive override def createNewTileEntity(world: World, metadata: Int) = new tileentity.DiskDrive() diff --git a/src/main/scala/li/cil/oc/common/block/Geolyzer.scala b/src/main/scala/li/cil/oc/common/block/Geolyzer.scala index 40c76d82c..0f87c555d 100644 --- a/src/main/scala/li/cil/oc/common/block/Geolyzer.scala +++ b/src/main/scala/li/cil/oc/common/block/Geolyzer.scala @@ -1,13 +1,8 @@ package li.cil.oc.common.block import li.cil.oc.common.tileentity -import li.cil.oc.integration.coloredlights.ModColoredLights import net.minecraft.world.World class Geolyzer extends SimpleBlock { - ModColoredLights.setLightLevel(this, 3, 1, 1) - - // ----------------------------------------------------------------------- // - override def createNewTileEntity(world: World, metadata: Int) = new tileentity.Geolyzer() } 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 d3a0f0d34..95c9bd9e7 100644 --- a/src/main/scala/li/cil/oc/common/block/Hologram.scala +++ b/src/main/scala/li/cil/oc/common/block/Hologram.scala @@ -2,9 +2,7 @@ package li.cil.oc.common.block import java.util -import li.cil.oc.Settings import li.cil.oc.common.tileentity -import li.cil.oc.integration.coloredlights.ModColoredLights import li.cil.oc.util.Rarity import li.cil.oc.util.Tooltip import net.minecraft.block.state.IBlockState @@ -19,10 +17,6 @@ import net.minecraftforge.fml.relauncher.Side import net.minecraftforge.fml.relauncher.SideOnly class Hologram(val tier: Int) extends SimpleBlock { - if (Settings.get.hologramLight) { - ModColoredLights.setLightLevel(this, 15, 15, 15) - } - val bounds = new AxisAlignedBB(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 edb283a12..0054c5ba3 100644 --- a/src/main/scala/li/cil/oc/common/block/Keyboard.scala +++ b/src/main/scala/li/cil/oc/common/block/Keyboard.scala @@ -92,7 +92,7 @@ class Keyboard extends SimpleBlock(Material.ROCK) { }) } - override def neighborChanged(state: IBlockState, world: World, pos: BlockPos, neighborBlock: Block): Unit = + override def neighborChanged(state: IBlockState, world: World, pos: BlockPos, block: Block, fromPos: BlockPos): Unit = world.getTileEntity(pos) match { case keyboard: tileentity.Keyboard => if (!canPlaceBlockOnSide(world, pos, keyboard.facing)) { diff --git a/src/main/scala/li/cil/oc/common/block/NetSplitter.scala b/src/main/scala/li/cil/oc/common/block/NetSplitter.scala index 7a7269be6..76ca51eb6 100644 --- a/src/main/scala/li/cil/oc/common/block/NetSplitter.scala +++ b/src/main/scala/li/cil/oc/common/block/NetSplitter.scala @@ -35,7 +35,7 @@ class NetSplitter extends RedstoneAware { // ----------------------------------------------------------------------- // // NOTE: must not be final for immibis microblocks to work. - override def onBlockActivated(world: World, pos: BlockPos, state: IBlockState, player: EntityPlayer, hand: EnumHand, heldItem: ItemStack, side: EnumFacing, hitX: Float, hitY: Float, hitZ: Float): Boolean = { + override def onBlockActivated(world: World, pos: BlockPos, state: IBlockState, player: EntityPlayer, hand: EnumHand, side: EnumFacing, hitX: Float, hitY: Float, hitZ: Float): Boolean = { if (Wrench.holdsApplicableWrench(player, pos)) { val sideToToggle = if (player.isSneaking) side.getOpposite else side world.getTileEntity(pos) match { @@ -48,6 +48,6 @@ class NetSplitter extends RedstoneAware { case _ => false } } - else super.onBlockActivated(world, pos, state, player, hand, heldItem, side, hitX, hitY, hitZ) + else super.onBlockActivated(world, pos, state, player, hand, side, hitX, hitY, hitZ) } } 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 c6f4f6bc0..b7f6d6e81 100644 --- a/src/main/scala/li/cil/oc/common/block/PowerConverter.scala +++ b/src/main/scala/li/cil/oc/common/block/PowerConverter.scala @@ -24,19 +24,10 @@ class PowerConverter extends SimpleBlock with traits.PowerAcceptor { override protected def tooltipTail(metadata: Int, stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) { super.tooltipTail(metadata, stack, player, tooltip, advanced) - - if (Mods.Factorization.isAvailable) { - addRatio(tooltip, "Factorization", Settings.get.ratioFactorization) - } - if (Mods.IndustrialCraft2.isAvailable || Mods.IndustrialCraft2Classic.isAvailable) { - addRatio(tooltip, "IndustrialCraft2", Settings.get.ratioIndustrialCraft2) - } - if (Mods.Mekanism.isAvailable) { - addRatio(tooltip, "Mekanism", Settings.get.ratioMekanism) - } - if (Mods.CoFHEnergy.isAvailable) { - addRatio(tooltip, "ThermalExpansion", Settings.get.ratioRedstoneFlux) - } +// TODO more generic way of integration modules of power providing mods to provide tooltip lines +// if (Mods.Factorization.isAvailable) { +// addRatio(tooltip, "Factorization", Settings.get.ratioFactorization) +// } } private def addExtension(x: Double) = diff --git a/src/main/scala/li/cil/oc/common/block/PowerDistributor.scala b/src/main/scala/li/cil/oc/common/block/PowerDistributor.scala index 68359cea2..ab71ceb3a 100644 --- a/src/main/scala/li/cil/oc/common/block/PowerDistributor.scala +++ b/src/main/scala/li/cil/oc/common/block/PowerDistributor.scala @@ -1,14 +1,9 @@ package li.cil.oc.common.block import li.cil.oc.common.tileentity -import li.cil.oc.integration.coloredlights.ModColoredLights import net.minecraft.world.World class PowerDistributor extends SimpleBlock { - ModColoredLights.setLightLevel(this, 5, 5, 3) - - // ----------------------------------------------------------------------- // - override def createNewTileEntity(world: World, metadata: Int) = new tileentity.PowerDistributor() } diff --git a/src/main/scala/li/cil/oc/common/block/Print.scala b/src/main/scala/li/cil/oc/common/block/Print.scala index 855d7d351..529bc3b26 100644 --- a/src/main/scala/li/cil/oc/common/block/Print.scala +++ b/src/main/scala/li/cil/oc/common/block/Print.scala @@ -90,8 +90,6 @@ class Print(protected implicit val tileTag: ClassTag[tileentity.Print]) extends case _ => super.getLightOpacity(state, world, pos) } - override def isVisuallyOpaque = false - override def isFullCube(state: IBlockState): Boolean = false override def shouldSideBeRendered(state: IBlockState, world: IBlockAccess, pos: BlockPos, side: EnumFacing) = true @@ -159,10 +157,10 @@ class Print(protected implicit val tileTag: ClassTag[tileentity.Print]) extends // ----------------------------------------------------------------------- // - override def onBlockActivated(world: World, pos: BlockPos, state: IBlockState, player: EntityPlayer, hand: EnumHand, heldItem: ItemStack, side: EnumFacing, hitX: Float, hitY: Float, hitZ: Float): Boolean = { + override def onBlockActivated(world: World, pos: BlockPos, state: IBlockState, player: EntityPlayer, hand: EnumHand, side: EnumFacing, hitX: Float, hitY: Float, hitZ: Float): Boolean = { world.getTileEntity(pos) match { case print: tileentity.Print => print.activate() - case _ => super.onBlockActivated(world, pos, state, player, hand, heldItem, side, hitX, hitY, hitZ) + case _ => super.onBlockActivated(world, pos, state, player, hand, side, hitX, hitY, hitZ) } } @@ -171,7 +169,7 @@ class Print(protected implicit val tileTag: ClassTag[tileentity.Print]) extends tileEntity.data.load(stack) tileEntity.updateBounds() tileEntity.updateRedstone() - tileEntity.world.checkLight(tileEntity.getPos) + tileEntity.getWorld.checkLight(tileEntity.getPos) } override protected def doCustomDrops(tileEntity: tileentity.Print, player: EntityPlayer, willHarvest: Boolean): Unit = { diff --git a/src/main/scala/li/cil/oc/common/block/Redstone.scala b/src/main/scala/li/cil/oc/common/block/Redstone.scala index 196184410..307c95cc4 100644 --- a/src/main/scala/li/cil/oc/common/block/Redstone.scala +++ b/src/main/scala/li/cil/oc/common/block/Redstone.scala @@ -12,15 +12,10 @@ import net.minecraft.world.World class Redstone extends RedstoneAware { override protected def tooltipTail(metadata: Int, stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) { super.tooltipTail(metadata, stack, player, tooltip, advanced) - if (Mods.ProjectRedTransmission.isAvailable) { - tooltip.addAll(Tooltip.get("RedstoneCard.ProjectRed")) - } - if (Mods.RedLogic.isAvailable) { - tooltip.addAll(Tooltip.get("RedstoneCard.RedLogic")) - } - if (Mods.MineFactoryReloaded.isAvailable) { - tooltip.addAll(Tooltip.get("RedstoneCard.RedNet")) - } + // todo more generic way for redstone mods to provide lines +// if (Mods.ProjectRedTransmission.isAvailable) { +// tooltip.addAll(Tooltip.get("RedstoneCard.ProjectRed")) +// } } // ----------------------------------------------------------------------- // 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 a82cc3d49..cf778a7a3 100644 --- a/src/main/scala/li/cil/oc/common/block/RedstoneAware.scala +++ b/src/main/scala/li/cil/oc/common/block/RedstoneAware.scala @@ -1,22 +1,14 @@ package li.cil.oc.common.block import li.cil.oc.common.tileentity -import li.cil.oc.integration.Mods import net.minecraft.block.Block import net.minecraft.block.state.IBlockState import net.minecraft.util.EnumFacing import net.minecraft.util.math.BlockPos import net.minecraft.world.IBlockAccess import net.minecraft.world.World -import net.minecraftforge.fml.common.Optional -/* TODO MFR -import powercrystals.minefactoryreloaded.api.rednet.IRedNetNetworkContainer -import powercrystals.minefactoryreloaded.api.rednet.IRedNetOmniNode -import powercrystals.minefactoryreloaded.api.rednet.connectivity.RedNetConnectionType -*/ -@Optional.Interface(iface = "powercrystals.minefactoryreloaded.api.rednet.IRedNetOmniNode", modid = Mods.IDs.MineFactoryReloaded) -abstract class RedstoneAware extends SimpleBlock /* with IRedNetOmniNode TODO MFR */ { +abstract class RedstoneAware extends SimpleBlock { override def canProvidePower(state: IBlockState): Boolean = true override def canConnectRedstone(state: IBlockState, world: IBlockAccess, pos: BlockPos, side: EnumFacing): Boolean = @@ -36,54 +28,10 @@ abstract class RedstoneAware extends SimpleBlock /* with IRedNetOmniNode TODO MF // ----------------------------------------------------------------------- // - override def neighborChanged(state: IBlockState, world: World, pos: BlockPos, neighborBlock: Block): Unit = { - /* TODO MFR - if (Mods.MineFactoryReloaded.isAvailable) { - val position = BlockPosition(x, y, z) - world.getTileEntity(position) match { - case t: tileentity.traits.BundledRedstoneAware => for (side <- EnumFacing.values) { - world.getBlock(position.offset(side)) match { - case block: IRedNetNetworkContainer => - case _ => for (color <- 0 until 16) { - t.rednetInput(side, color, 0) - } - } - } - case _ => - } - } - */ + override def neighborChanged(state: IBlockState, world: World, pos: BlockPos, block: Block, fromPos: BlockPos): Unit = { world.getTileEntity(pos) match { case redstone: tileentity.traits.RedstoneAware => redstone.checkRedstoneInputChanged() case _ => // Ignore. } } - - // ----------------------------------------------------------------------- // - - /* TODO MFR - override def getConnectionType(world: World, x: Int, y: Int, z: Int, side: EnumFacing) = RedNetConnectionType.CableAll - - override def getOutputValue(world: World, x: Int, y: Int, z: Int, side: EnumFacing, color: Int) = - world.getTileEntity(x, y, z) match { - case t: tileentity.traits.BundledRedstoneAware => t.bundledOutput(side, color) - case _ => 0 - } - - override def getOutputValues(world: World, x: Int, y: Int, z: Int, side: EnumFacing) = - world.getTileEntity(x, y, z) match { - case t: tileentity.traits.BundledRedstoneAware => t.bundledOutput(side) - case _ => Array.fill(16)(0) - } - - override def onInputChanged(world: World, x: Int, y: Int, z: Int, side: EnumFacing, inputValue: Int) {} - - override def onInputsChanged(world: World, x: Int, y: Int, z: Int, side: EnumFacing, inputValues: Array[Int]) = - world.getTileEntity(x, y, z) match { - 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/Screen.scala b/src/main/scala/li/cil/oc/common/block/Screen.scala index be4f6e27c..06e39dc94 100644 --- a/src/main/scala/li/cil/oc/common/block/Screen.scala +++ b/src/main/scala/li/cil/oc/common/block/Screen.scala @@ -24,15 +24,12 @@ import li.cil.oc.common.GuiType import li.cil.oc.common.block.property.PropertyRotatable import li.cil.oc.common.block.property.PropertyTile import li.cil.oc.common.tileentity -import li.cil.oc.integration.coloredlights.ModColoredLights import li.cil.oc.integration.util.Wrench import li.cil.oc.util.PackedColor import li.cil.oc.util.Rarity import li.cil.oc.util.Tooltip class Screen(val tier: Int) extends RedstoneAware { - ModColoredLights.setLightLevel(this, 5, 5, 5) - override def createBlockState() = new ExtendedBlockState(this, Array(PropertyRotatable.Pitch, PropertyRotatable.Yaw), Array(PropertyTile.Tile)) override def getMetaFromState(state: IBlockState): Int = (state.getValue(PropertyRotatable.Pitch).ordinal() << 2) | state.getValue(PropertyRotatable.Yaw).getHorizontalIndex diff --git a/src/main/scala/li/cil/oc/common/block/SimpleBlock.scala b/src/main/scala/li/cil/oc/common/block/SimpleBlock.scala index 1177b6a39..e583adca0 100644 --- a/src/main/scala/li/cil/oc/common/block/SimpleBlock.scala +++ b/src/main/scala/li/cil/oc/common/block/SimpleBlock.scala @@ -154,8 +154,8 @@ abstract class SimpleBlock(material: Material = Material.IRON) extends BlockCont // ----------------------------------------------------------------------- // - // NOTE: must not be final for immibis microblocks to work. - override def onBlockActivated(world: World, pos: BlockPos, state: IBlockState, player: EntityPlayer, hand: EnumHand, heldItem: ItemStack, side: EnumFacing, hitX: Float, hitY: Float, hitZ: Float): Boolean = + override def onBlockActivated(world: World, pos: BlockPos, state: IBlockState, player: EntityPlayer, hand: EnumHand, facing: EnumFacing, hitX: Float, hitY: Float, hitZ: Float): Boolean = { + val heldItem = player.getHeldItem(hand) world.getTileEntity(pos) match { case colored: Colored if Color.isDye(heldItem) => colored.setColor(Color.rgbValues(Color.dyeColor(heldItem))) @@ -164,8 +164,9 @@ abstract class SimpleBlock(material: Material = Material.IRON) extends BlockCont heldItem.splitStack(1) } true - case _ => localOnBlockActivated(world, pos, player, hand, heldItem, side, hitX, hitY, hitZ) + case _ => localOnBlockActivated(world, pos, player, hand, heldItem, facing, hitX, hitY, hitZ) } + } def localOnBlockActivated(world: World, pos: BlockPos, player: EntityPlayer, hand: EnumHand, heldItem: ItemStack, side: EnumFacing, hitX: Float, hitY: Float, hitZ: Float) = false } diff --git a/src/main/scala/li/cil/oc/common/command/SimpleCommand.scala b/src/main/scala/li/cil/oc/common/command/SimpleCommand.scala index 95643678d..f36204e0d 100644 --- a/src/main/scala/li/cil/oc/common/command/SimpleCommand.scala +++ b/src/main/scala/li/cil/oc/common/command/SimpleCommand.scala @@ -13,9 +13,9 @@ import scala.collection.mutable abstract class SimpleCommand(val name: String) extends CommandBase { protected var aliases = mutable.ListBuffer.empty[String] - override def getCommandName = name + override def getName = name - override def getCommandAliases: util.List[String] = aliases + override def getAliases: util.List[String] = aliases override def checkPermission(server: MinecraftServer, sender: ICommandSender): Boolean = super.checkPermission(server, sender)|| (FMLCommonHandler.instance().getMinecraftServerInstance != null && FMLCommonHandler.instance().getMinecraftServerInstance.isSinglePlayer) diff --git a/src/main/scala/li/cil/oc/common/container/ComponentSlot.scala b/src/main/scala/li/cil/oc/common/container/ComponentSlot.scala index 604bc574e..2b4ce39cf 100644 --- a/src/main/scala/li/cil/oc/common/container/ComponentSlot.scala +++ b/src/main/scala/li/cil/oc/common/container/ComponentSlot.scala @@ -31,12 +31,12 @@ abstract class ComponentSlot(inventory: IInventory, index: Int, x: Int, y: Int) override def isItemValid(stack: ItemStack) = inventory.isItemValidForSlot(getSlotIndex, stack) - override def onTake(player: EntityPlayer, stack: ItemStack) { - super.onTake(player, stack) + override def onTake(player: EntityPlayer, stack: ItemStack) = { for (slot <- container.inventorySlots) slot match { case dynamic: ComponentSlot => dynamic.clearIfInvalid(player) case _ => } + super.onTake(player, stack) } override def putStack(stack: ItemStack): Unit = { diff --git a/src/main/scala/li/cil/oc/common/entity/Drone.scala b/src/main/scala/li/cil/oc/common/entity/Drone.scala index 9c5a38c25..e90459367 100644 --- a/src/main/scala/li/cil/oc/common/entity/Drone.scala +++ b/src/main/scala/li/cil/oc/common/entity/Drone.scala @@ -64,7 +64,7 @@ object Drone { // internal.Rotatable is also in internal.Drone, but it wasn't since the start // so this is to ensure it is implemented here, in the very unlikely case that // someone decides to ship that specific version of the API. -class Drone(val world: World) extends Entity(world) with MachineHost with internal.Drone with internal.Rotatable with Analyzable with Context { +class Drone(world: World) extends Entity(world) with MachineHost with internal.Drone with internal.Rotatable with Analyzable with Context { // Some basic constants. val gravity = 0.05f // low for slow fall (float down) diff --git a/src/main/scala/li/cil/oc/common/event/BlockChangeHandler.scala b/src/main/scala/li/cil/oc/common/event/BlockChangeHandler.scala index 3d466abf1..1e52fe253 100644 --- a/src/main/scala/li/cil/oc/common/event/BlockChangeHandler.scala +++ b/src/main/scala/li/cil/oc/common/event/BlockChangeHandler.scala @@ -47,6 +47,8 @@ object BlockChangeHandler { } } + override def spawnParticle(id: Int, ignoreRange: Boolean, p_190570_3_ : Boolean, x: Double, y: Double, z: Double, xSpeed: Double, ySpeed: Double, zSpeed: Double, parameters: Int*): Unit = {} + override def playRecord(soundIn: SoundEvent, pos: BlockPos): Unit = {} override def playEvent(player: EntityPlayer, `type`: Int, blockPosIn: BlockPos, data: Int): Unit = {} diff --git a/src/main/scala/li/cil/oc/common/init/Items.scala b/src/main/scala/li/cil/oc/common/init/Items.scala index a3b186efe..d2bfee734 100644 --- a/src/main/scala/li/cil/oc/common/init/Items.scala +++ b/src/main/scala/li/cil/oc/common/init/Items.scala @@ -332,7 +332,6 @@ object Items extends ItemAPI { initUpgrades() initStorage() initSpecial() - initIntegration() // Register aliases. for ((k, v) <- aliases) { @@ -539,15 +538,6 @@ object Items extends ItemAPI { registerItem(new item.Present(misc), Constants.ItemName.Present) } - // Items used for integration with other mods. - private def initIntegration(): Unit = { - val integration = newItem(new item.Delegator(), "integration") - - // Only register recipes if the related mods are present. - Recipes.addSubItem(new item.AbstractBusCard(integration), Constants.ItemName.AbstractBusCard, Mods.StargateTech2.isAvailable, "oc:abstractBusCard") - Recipes.addSubItem(new item.WorldSensorCard(integration), Constants.ItemName.WorldSensorCard, Mods.Galacticraft.isAvailable, "oc:worldSensorCard") - } - private def newItem[T <: Item](item: T, name: String): T = { item.setUnlocalizedName("oc." + name) GameRegistry.register(item, new ResourceLocation(Settings.resourceDomain, name)) diff --git a/src/main/scala/li/cil/oc/common/item/AbstractBusCard.scala b/src/main/scala/li/cil/oc/common/item/AbstractBusCard.scala deleted file mode 100644 index 820ba2267..000000000 --- a/src/main/scala/li/cil/oc/common/item/AbstractBusCard.scala +++ /dev/null @@ -1,7 +0,0 @@ -package li.cil.oc.common.item - -import li.cil.oc.integration.Mods - -class AbstractBusCard(val parent: Delegator) extends traits.Delegate with traits.ItemTier { - showInItemList = Mods.StargateTech2.isAvailable -} diff --git a/src/main/scala/li/cil/oc/common/item/RedstoneCard.scala b/src/main/scala/li/cil/oc/common/item/RedstoneCard.scala index 5810a4b4a..db8c0c34e 100644 --- a/src/main/scala/li/cil/oc/common/item/RedstoneCard.scala +++ b/src/main/scala/li/cil/oc/common/item/RedstoneCard.scala @@ -3,8 +3,6 @@ package li.cil.oc.common.item import java.util import li.cil.oc.common.Tier -import li.cil.oc.integration.Mods -import li.cil.oc.util.Tooltip import net.minecraft.item.ItemStack class RedstoneCard(val parent: Delegator, val tier: Int) extends traits.Delegate with traits.ItemTier { @@ -18,21 +16,10 @@ class RedstoneCard(val parent: Delegator, val tier: Int) extends traits.Delegate override protected def tooltipExtended(stack: ItemStack, tooltip: util.List[String]) { super.tooltipExtended(stack, tooltip) if (tier == Tier.Two) { - if (Mods.ProjectRedTransmission.isAvailable) { - tooltip.addAll(Tooltip.get(super.unlocalizedName + ".ProjectRed")) - } - if (Mods.RedLogic.isAvailable) { - tooltip.addAll(Tooltip.get(super.unlocalizedName + ".RedLogic")) - } - if (Mods.MineFactoryReloaded.isAvailable) { - tooltip.addAll(Tooltip.get(super.unlocalizedName + ".RedNet")) - } - if (Mods.WirelessRedstoneCBE.isAvailable) { - tooltip.addAll(Tooltip.get(super.unlocalizedName + ".WirelessCBE")) - } - if (Mods.WirelessRedstoneSVE.isAvailable) { - tooltip.addAll(Tooltip.get(super.unlocalizedName + ".WirelessSV")) - } + // TODO Generic system for redstone integration modules to register in a list of tooltip lines. + // if (Mods.MOD_NAME.isAvailable) { + // tooltip.addAll(Tooltip.get(super.unlocalizedName + ".MOD_NAME")) + // } } } } diff --git a/src/main/scala/li/cil/oc/common/item/WorldSensorCard.scala b/src/main/scala/li/cil/oc/common/item/WorldSensorCard.scala deleted file mode 100644 index ac42f58cb..000000000 --- a/src/main/scala/li/cil/oc/common/item/WorldSensorCard.scala +++ /dev/null @@ -1,7 +0,0 @@ -package li.cil.oc.common.item - -import li.cil.oc.integration.Mods - -class WorldSensorCard(val parent: Delegator) extends traits.Delegate with traits.ItemTier { - showInItemList = Mods.Galacticraft.isAvailable -} diff --git a/src/main/scala/li/cil/oc/common/item/Wrench.scala b/src/main/scala/li/cil/oc/common/item/Wrench.scala index 8f7dc80e1..3878b5328 100644 --- a/src/main/scala/li/cil/oc/common/item/Wrench.scala +++ b/src/main/scala/li/cil/oc/common/item/Wrench.scala @@ -1,12 +1,7 @@ package li.cil.oc.common.item import li.cil.oc.api -import li.cil.oc.common.asm.Injectable -import li.cil.oc.integration.Mods import net.minecraft.block.Block -import net.minecraft.entity.Entity -import net.minecraft.entity.EntityLivingBase -import net.minecraft.entity.item.EntityMinecart import net.minecraft.entity.player.EntityPlayer import net.minecraft.init.Blocks import net.minecraft.item.ItemStack @@ -17,18 +12,6 @@ import net.minecraft.util.math.BlockPos import net.minecraft.world.IBlockAccess import net.minecraft.world.World -@Injectable.InterfaceList(Array( - new Injectable.Interface(value = "appeng.api.implementations.items.IAEWrench", modid = Mods.IDs.AppliedEnergistics2), - new Injectable.Interface(value = "buildcraft.api.tools.IToolWrench", modid = Mods.IDs.BuildCraftTools), - new Injectable.Interface(value = "com.bluepowermod.api.misc.IScrewdriver", modid = Mods.IDs.BluePower), - new Injectable.Interface(value = "cofh.api.item.IToolHammer", modid = Mods.IDs.CoFHItem), - new Injectable.Interface(value = "crazypants.enderio.api.tool.ITool", modid = Mods.IDs.EnderIO), - new Injectable.Interface(value = "mekanism.api.IMekWrench", modid = Mods.IDs.Mekanism), - new Injectable.Interface(value = "powercrystals.minefactoryreloaded.api.IMFRHammer", modid = Mods.IDs.MineFactoryReloaded), - new Injectable.Interface(value = "mrtjp.projectred.api.IScrewdriver", modid = Mods.IDs.ProjectRedCore), - new Injectable.Interface(value = "mods.railcraft.api.core.items.IToolCrowbar", modid = Mods.IDs.Railcraft), - new Injectable.Interface(value = "ic2.api.item.IBoxable", modid = Mods.IDs.IndustrialCraft2) -)) class Wrench extends traits.SimpleItem with api.internal.Wrench { setHarvestLevel("wrench", 1) setMaxStackSize(1) @@ -51,80 +34,4 @@ class Wrench extends traits.SimpleItem with api.internal.Wrench { if (!simulate) player.swingArm(EnumHand.MAIN_HAND) true } - - // Applied Energistics 2 - - def canWrench(stack: ItemStack, player: EntityPlayer, pos: BlockPos): Boolean = true - - // BluePower - - def damage(stack: ItemStack, damage: Int, player: EntityPlayer, simulated: Boolean): Boolean = damage == 0 - - // BuildCraft - - def canWrench(player: EntityPlayer, pos: BlockPos): Boolean = true - - def wrenchUsed(player: EntityPlayer, pos: BlockPos): Unit = player.swingArm(EnumHand.MAIN_HAND) - - def canWrench(player: EntityPlayer, entity: Entity): Boolean = true - - def wrenchUsed(player: EntityPlayer, entity: Entity): Unit = player.swingArm(EnumHand.MAIN_HAND) - - // CoFH - - def isUsable(stack: ItemStack, player: EntityLivingBase, pos: BlockPos): Boolean = true - - def isUsable(stack: ItemStack, player: EntityLivingBase, entity: Entity): Boolean = true - - def toolUsed(stack: ItemStack, player: EntityLivingBase, pos: BlockPos): Unit = player.swingArm(EnumHand.MAIN_HAND) - - def toolUsed(stack: ItemStack, player: EntityLivingBase, entity: Entity): Unit = player.swingArm(EnumHand.MAIN_HAND) - - // Compat for people shipping unofficial CoFH APIs... -.- - - def isUsable(stack: ItemStack, player: EntityLivingBase, x: Int, y: Int, z: Int): Boolean = true - - def toolUsed(stack: ItemStack, player: EntityLivingBase, x: Int, y: Int, z: Int): Unit = player.swingArm(EnumHand.MAIN_HAND) - - // EnderIO - - def canUse(stack: ItemStack, player: EntityPlayer, pos: BlockPos): Boolean = true - - def used(stack: ItemStack, player: EntityPlayer, pos: BlockPos): Unit = {} - - def shouldHideFacades(stack: ItemStack, player: EntityPlayer): Boolean = false - - // Mekanism - - def canUseWrench(player: EntityPlayer, pos: BlockPos): Boolean = true - - def canUseWrench(stack: ItemStack, player: EntityPlayer, pos: BlockPos): Boolean = true - - // Project Red - - def canUse(entityPlayer: EntityPlayer, itemStack: ItemStack): Boolean = true - - // pre v4.7 - def damageScrewdriver(world: World, player: EntityPlayer): Unit = {} - - // v4.7+ - def damageScrewdriver(player: EntityPlayer, stack: ItemStack): Unit = {} - - // Railcraft - - def canWhack(player: EntityPlayer, stack: ItemStack, pos: BlockPos): Boolean = true - - def onWhack(player: EntityPlayer, stack: ItemStack, pos: BlockPos): Unit = {} - - def canLink(player: EntityPlayer, stack: ItemStack, cart: EntityMinecart): Boolean = false - - def onLink(player: EntityPlayer, stack: ItemStack, cart: EntityMinecart): Unit = {} - - def canBoost(player: EntityPlayer, stack: ItemStack, cart: EntityMinecart): Boolean = false - - def onBoost(player: EntityPlayer, stack: ItemStack, cart: EntityMinecart): Unit = {} - - // IndustrialCraft 2 - - def canBeStoredInToolbox(stack: ItemStack): Boolean = true } diff --git a/src/main/scala/li/cil/oc/common/item/traits/Chargeable.scala b/src/main/scala/li/cil/oc/common/item/traits/Chargeable.scala index bcc5d1a23..1f58aba45 100644 --- a/src/main/scala/li/cil/oc/common/item/traits/Chargeable.scala +++ b/src/main/scala/li/cil/oc/common/item/traits/Chargeable.scala @@ -1,90 +1,13 @@ package li.cil.oc.common.item.traits -import ic2.api.item.IElectricItemManager -import li.cil.oc.Settings import li.cil.oc.api -import li.cil.oc.common.asm.Injectable -import li.cil.oc.integration.Mods -import li.cil.oc.integration.ic2.ElectricItemManager -import li.cil.oc.integration.util.Power import net.minecraft.item.ItemStack -import net.minecraftforge.fml.common.Optional -@Injectable.InterfaceList(Array( - // new Injectable.Interface(value = "appeng.api.implementations.items.IAEItemPowerStorage", modid = Mods.IDs.AppliedEnergistics2), - new Injectable.Interface(value = "cofh.api.energy.IEnergyContainerItem", modid = Mods.IDs.CoFHEnergy), - new Injectable.Interface(value = "ic2.api.item.ISpecialElectricItem", modid = Mods.IDs.IndustrialCraft2), - new Injectable.Interface(value = "mekanism.api.energy.IEnergizedItem", modid = Mods.IDs.Mekanism) -)) +// TODO Forge power capabilities. trait Chargeable extends api.driver.item.Chargeable { def maxCharge(stack: ItemStack): Double def getCharge(stack: ItemStack): Double def setCharge(stack: ItemStack, amount: Double): Unit - - // Applied Energistics 2 - /* TODO AE2 - def getAECurrentPower(stack: ItemStack): Double = - Power.toAE(getCharge(stack)) - - def getAEMaxPower(stack: ItemStack): Double = - Power.toAE(maxCharge(stack)) - - def injectAEPower(stack: ItemStack, value: Double): Double = - Power.toAE(charge(stack, Power.fromAE(value), false)) - - def extractAEPower(stack: ItemStack, value: Double): Double = - value - Power.toAE(charge(stack, Power.fromAE(-value), false)) - - @Optional.Method(modid = Mods.IDs.AppliedEnergistics2) - def getPowerFlow(stack: ItemStack): AccessRestriction = AccessRestriction.WRITE - */ - - // IndustrialCraft 2 - - @Optional.Method(modid = Mods.IDs.IndustrialCraft2) - def getManager(stack: ItemStack): IElectricItemManager = ElectricItemManager - - def getMaxCharge(stack: ItemStack): Double = Power.toEU(maxCharge(stack)) - - def getTransferLimit(stack: ItemStack): Double = Power.toEU(Settings.get.chargeRateTablet) - - def getTier(stack: ItemStack): Int = 1 - - def canProvideEnergy(stack: ItemStack): Boolean = false - - // Mekanism - - def getEnergy(stack: ItemStack): Double = - Power.toJoules(getCharge(stack)) - - def setEnergy(stack: ItemStack, amount: Double): Unit = - setCharge(stack, Power.fromJoules(amount)) - - def getMaxEnergy(stack: ItemStack): Double = - Power.toJoules(maxCharge(stack)) - - def canSend(stack: ItemStack): Boolean = false - - def canReceive(stack: ItemStack): Boolean = true - - def isMetadataSpecific(stack: ItemStack): Boolean = false - - def getMaxTransfer(stack: ItemStack): Double = - Power.toJoules(Settings.get.chargeRateTablet) - - // Redstone Flux - - def getEnergyStored(stack: ItemStack): Int = - Power.toRF(getCharge(stack)) - - def getMaxEnergyStored(stack: ItemStack): Int = - Power.toRF(maxCharge(stack)) - - def receiveEnergy(stack: ItemStack, maxReceive: Int, simulate: Boolean): Int = - maxReceive - Power.toRF(charge(stack, Power.fromRF(maxReceive), simulate)) - - def extractEnergy(stack: ItemStack, maxExtract: Int, simulate: Boolean): Int = - maxExtract - Power.toRF(charge(stack, Power.fromRF(-maxExtract), simulate)) } diff --git a/src/main/scala/li/cil/oc/common/recipe/ExtendedRecipe.scala b/src/main/scala/li/cil/oc/common/recipe/ExtendedRecipe.scala index a6f1d30c6..7957a791c 100644 --- a/src/main/scala/li/cil/oc/common/recipe/ExtendedRecipe.scala +++ b/src/main/scala/li/cil/oc/common/recipe/ExtendedRecipe.scala @@ -61,7 +61,6 @@ object ExtendedRecipe { } if (api.Items.get(craftedStack) == linkedCard) { - if (weAreBeingCalledFromAppliedEnergistics2) return disabled.copy() if (SideTracker.isServer) { Option(api.Driver.driverFor(craftedStack)).foreach(driver => { val nbt = driver.dataTag(craftedStack) @@ -206,8 +205,6 @@ object ExtendedRecipe { } } - private def weAreBeingCalledFromAppliedEnergistics2 = Mods.AppliedEnergistics2.isAvailable && new Exception().getStackTrace.exists(_.getClassName == "appeng.container.implementations.ContainerPatternTerm") - private trait ItemDataWrapper { def components: Array[ItemStack] diff --git a/src/main/scala/li/cil/oc/common/recipe/LootDiskCyclingRecipe.scala b/src/main/scala/li/cil/oc/common/recipe/LootDiskCyclingRecipe.scala index 1da6d019b..513ecf8e3 100644 --- a/src/main/scala/li/cil/oc/common/recipe/LootDiskCyclingRecipe.scala +++ b/src/main/scala/li/cil/oc/common/recipe/LootDiskCyclingRecipe.scala @@ -6,6 +6,7 @@ import li.cil.oc.integration.util.Wrench import net.minecraft.inventory.InventoryCrafting import net.minecraft.item.ItemStack import net.minecraft.item.crafting.IRecipe +import net.minecraft.util.NonNullList import net.minecraft.world.World class LootDiskCyclingRecipe extends IRecipe { @@ -34,12 +35,12 @@ class LootDiskCyclingRecipe extends IRecipe { override def getRecipeOutput: ItemStack = null - override def getRemainingItems(crafting: InventoryCrafting): Array[ItemStack] = { - val result = new Array[ItemStack](crafting.getSizeInventory) + override def getRemainingItems(crafting: InventoryCrafting): NonNullList[ItemStack] = { + val result = NonNullList.withSize[ItemStack](crafting.getSizeInventory, ItemStack.EMPTY) for (slot <- 0 until crafting.getSizeInventory) { val stack = crafting.getStackInSlot(slot) if (Wrench.isWrench(stack)) { - result(slot) = stack.copy() + result.set(slot, stack.copy()) stack.setCount(0) } } diff --git a/src/main/scala/li/cil/oc/common/tileentity/Adapter.scala b/src/main/scala/li/cil/oc/common/tileentity/Adapter.scala index 5164599ee..69834c25a 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Adapter.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Adapter.scala @@ -52,11 +52,11 @@ class Adapter extends traits.Environment with traits.ComponentInventory with tra super.setSideOpen(side, value) if (isServer) { ServerPacketSender.sendAdapterState(this) - world.playSound(null, x + 0.5, y + 0.5, z + 0.5, SoundEvents.BLOCK_PISTON_EXTEND, SoundCategory.BLOCKS, 0.5f, world.rand.nextFloat() * 0.25f + 0.7f) - world.notifyNeighborsOfStateChange(getPos, getBlockType, false) + getWorld.playSound(null, x + 0.5, y + 0.5, z + 0.5, SoundEvents.BLOCK_PISTON_EXTEND, SoundCategory.BLOCKS, 0.5f, getWorld.rand.nextFloat() * 0.25f + 0.7f) + getWorld.notifyNeighborsOfStateChange(getPos, getBlockType, false) neighborChanged(side) } else { - world.notifyBlockUpdate(getPos, world.getBlockState(getPos), world.getBlockState(getPos), 3) + getWorld.notifyBlockUpdate(getPos, getWorld.getBlockState(getPos), getWorld.getBlockState(getPos), 3) } } @@ -80,7 +80,7 @@ class Adapter extends traits.Environment with traits.ComponentInventory with tra def neighborChanged(d: EnumFacing) { if (node != null && node.network != null) { val blockPos = getPos.offset(d) - world.getTileEntity(blockPos) match { + getWorld.getTileEntity(blockPos) match { case env: traits.Environment => // Don't provide adaption for our stuffs. This is mostly to avoid // cables and other non-functional stuff popping up in the adapter @@ -88,7 +88,7 @@ class Adapter extends traits.Environment with traits.ComponentInventory with tra // but the only 'downside' is that it can't be used to manipulate // inventories, which I actually consider a plus :P case _ => - Option(api.Driver.driverFor(world, blockPos, d)) match { + Option(api.Driver.driverFor(getWorld, blockPos, d)) match { case Some(newDriver) if isSideOpen(d) => blocks(d.ordinal()) match { case Some((oldEnvironment, driver)) => if (newDriver != driver) { @@ -99,7 +99,7 @@ class Adapter extends traits.Environment with traits.ComponentInventory with tra node.disconnect(oldEnvironment.node) // Then rebuild - if we have something. - val environment = newDriver.createEnvironment(world, blockPos, d) + val environment = newDriver.createEnvironment(getWorld, blockPos, d) if (environment != null) { blocks(d.ordinal()) = Some((environment, newDriver)) if (environment.canUpdate) { @@ -114,7 +114,7 @@ class Adapter extends traits.Environment with traits.ComponentInventory with tra return } // A challenger appears. Maybe. - val environment = newDriver.createEnvironment(world, blockPos, d) + val environment = newDriver.createEnvironment(getWorld, blockPos, d) if (environment != null) { blocks(d.ordinal()) = Some((environment, newDriver)) if (environment.canUpdate) { diff --git a/src/main/scala/li/cil/oc/common/tileentity/Assembler.scala b/src/main/scala/li/cil/oc/common/tileentity/Assembler.scala index 1c9d21e39..27a7053d3 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Assembler.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Assembler.scala @@ -123,7 +123,7 @@ class Assembler extends traits.Environment with traits.PowerAcceptor with traits override def updateEntity() { super.updateEntity() - if (output.isDefined && world.getTotalWorldTime % Settings.get.tickFrequency == 0) { + if (output.isDefined && getWorld.getTotalWorldTime % Settings.get.tickFrequency == 0) { val want = math.max(1, math.min(requiredEnergy, Settings.get.assemblerTickAmount * Settings.get.tickFrequency)) val have = want + (if (Settings.get.ignorePower) 0 else node.changeBuffer(-want)) requiredEnergy -= have diff --git a/src/main/scala/li/cil/oc/common/tileentity/Cable.scala b/src/main/scala/li/cil/oc/common/tileentity/Cable.scala index 7c2596260..3bbde8215 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Cable.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Cable.scala @@ -35,10 +35,10 @@ class Cable extends traits.Environment with traits.NotAnalyzable with traits.Imm override protected def onColorChanged() { super.onColorChanged() - if (world != null && isServer) { + if (getWorld != null && isServer) { api.Network.joinOrCreateNetwork(this) } } - override def getRenderBoundingBox = common.block.Cable.bounds(world, getPos).offset(x, y, z) + override def getRenderBoundingBox = common.block.Cable.bounds(getWorld, getPos).offset(x, y, z) } diff --git a/src/main/scala/li/cil/oc/common/tileentity/Capacitor.scala b/src/main/scala/li/cil/oc/common/tileentity/Capacitor.scala index 06a2f8dde..b7efddbae 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Capacitor.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Capacitor.scala @@ -37,7 +37,7 @@ class Capacitor extends traits.Environment with DeviceInfo { super.dispose() if (isServer) { indirectNeighbors.map(coordinate => { - if (world.isBlockLoaded(coordinate)) Option(world.getTileEntity(coordinate)) + if (getWorld.isBlockLoaded(coordinate)) Option(getWorld.getTileEntity(coordinate)) else None }).collect { case Some(capacitor: Capacitor) => capacitor.recomputeCapacity() @@ -59,12 +59,12 @@ class Capacitor extends traits.Environment with DeviceInfo { Settings.get.bufferCapacitor + Settings.get.bufferCapacitorAdjacencyBonus * EnumFacing.values.count(side => { val blockPos = getPos.offset(side) - world.isBlockLoaded(blockPos) && (world.getTileEntity(blockPos) match { + getWorld.isBlockLoaded(blockPos) && (getWorld.getTileEntity(blockPos) match { case capacitor: Capacitor => true case _ => false }) }) + - Settings.get.bufferCapacitorAdjacencyBonus / 2 * indirectNeighbors.count(blockPos => world.isBlockLoaded(blockPos) && (world.getTileEntity(blockPos) match { + Settings.get.bufferCapacitorAdjacencyBonus / 2 * indirectNeighbors.count(blockPos => getWorld.isBlockLoaded(blockPos) && (getWorld.getTileEntity(blockPos) match { case capacitor: Capacitor => if (updateSecondGradeNeighbors) { capacitor.recomputeCapacity() diff --git a/src/main/scala/li/cil/oc/common/tileentity/Case.scala b/src/main/scala/li/cil/oc/common/tileentity/Case.scala index 090e48297..83ccbfab7 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Case.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Case.scala @@ -62,7 +62,7 @@ class Case(var tier: Int) extends traits.PowerAcceptor with traits.Computer with // ----------------------------------------------------------------------- // override def updateEntity() { - if (isServer && isCreative && world.getTotalWorldTime % Settings.get.tickFrequency == 0) { + if (isServer && isCreative && getWorld.getTotalWorldTime % Settings.get.tickFrequency == 0) { // Creative case, make it generate power. node.asInstanceOf[Connector].changeBuffer(Double.PositiveInfinity) } @@ -74,7 +74,7 @@ class Case(var tier: Int) extends traits.PowerAcceptor with traits.Computer with override protected def onRunningChanged(): Unit = { super.onRunningChanged() getBlockType match { - case block: common.block.Case => world.setBlockState(getPos, world.getBlockState(getPos).withProperty(PropertyRunning.Running, Boolean.box(isRunning))) + case block: common.block.Case => getWorld.setBlockState(getPos, getWorld.getBlockState(getPos).withProperty(PropertyRunning.Running, Boolean.box(isRunning))) case _ => } } diff --git a/src/main/scala/li/cil/oc/common/tileentity/Charger.scala b/src/main/scala/li/cil/oc/common/tileentity/Charger.scala index 3fd6d4da6..8f6918354 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Charger.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Charger.scala @@ -82,11 +82,11 @@ class Charger extends traits.Environment with traits.PowerAcceptor with traits.R super.updateEntity() // Offset by hashcode to avoid all chargers ticking at the same time. - if ((world.getWorldInfo.getWorldTotalTime + math.abs(hashCode())) % 20 == 0) { + if ((getWorld.getWorldInfo.getWorldTotalTime + math.abs(hashCode())) % 20 == 0) { updateConnectors() } - if (isServer && world.getWorldInfo.getWorldTotalTime % Settings.get.tickFrequency == 0) { + if (isServer && getWorld.getWorldInfo.getWorldTotalTime % Settings.get.tickFrequency == 0) { var canCharge = Settings.get.ignorePower // Charging of external devices. @@ -121,15 +121,15 @@ class Charger extends traits.Environment with traits.PowerAcceptor with traits.R } } - if (isClient && chargeSpeed > 0 && hasPower && world.getWorldInfo.getWorldTotalTime % 10 == 0) { + if (isClient && chargeSpeed > 0 && hasPower && getWorld.getWorldInfo.getWorldTotalTime % 10 == 0) { connectors.foreach(connector => { val position = connector.pos - val theta = world.rand.nextDouble * Math.PI - val phi = world.rand.nextDouble * Math.PI * 2 + val theta = getWorld.rand.nextDouble * Math.PI + val phi = getWorld.rand.nextDouble * Math.PI * 2 val dx = 0.45 * Math.sin(theta) * Math.cos(phi) val dy = 0.45 * Math.sin(theta) * Math.sin(phi) val dz = 0.45 * Math.cos(theta) - world.spawnParticle(EnumParticleTypes.VILLAGER_HAPPY, position.xCoord + dx, position.yCoord + dz, position.zCoord + dy, 0, 0, 0) + getWorld.spawnParticle(EnumParticleTypes.VILLAGER_HAPPY, position.xCoord + dx, position.yCoord + dz, position.zCoord + dy, 0, 0, 0) }) } } @@ -222,17 +222,17 @@ class Charger extends traits.Environment with traits.PowerAcceptor with traits.R def updateConnectors() { val robots = EnumFacing.values.map(side => { val blockPos = BlockPosition(this).offset(side) - if (world.blockExists(blockPos)) Option(world.getTileEntity(blockPos)) + if (getWorld.blockExists(blockPos)) Option(getWorld.getTileEntity(blockPos)) else None }).collect { case Some(t: RobotProxy) => new RobotChargeable(t.robot) } val bounds = BlockPosition(this).bounds.expand(1, 1, 1) - val drones = world.getEntitiesWithinAABB(classOf[Drone], bounds).collect { + val drones = getWorld.getEntitiesWithinAABB(classOf[Drone], bounds).collect { case drone: Drone => new DroneChargeable(drone) } - val players = world.getEntitiesWithinAABB(classOf[EntityPlayer], bounds).collect { + val players = getWorld.getEntitiesWithinAABB(classOf[EntityPlayer], bounds).collect { case player: EntityPlayer if api.Nanomachines.hasController(player) => new PlayerChargeable(player) } @@ -242,7 +242,7 @@ class Charger extends traits.Environment with traits.PowerAcceptor with traits.R if (connectors.size != newConnectors.length || (connectors.nonEmpty && (connectors -- newConnectors).nonEmpty)) { connectors.clear() connectors ++= newConnectors - world.notifyNeighborsOfStateChange(getPos, getBlockType, false) + getWorld.notifyNeighborsOfStateChange(getPos, getBlockType, false) } } 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 beedcf4bd..31addcd0c 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala @@ -46,7 +46,7 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra private def setActive(value: Boolean) = if (value != isActive) { isActive = value ServerPacketSender.sendDisassemblerActive(this, isActive) - world.notifyNeighborsOfStateChange(getPos, getBlockType, true) + getWorld.notifyNeighborsOfStateChange(getPos, getBlockType, true) } private final lazy val deviceInfo = Map( @@ -77,7 +77,7 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra override def updateEntity() { super.updateEntity() - if (isServer && world.getTotalWorldTime % Settings.get.tickFrequency == 0) { + if (isServer && getWorld.getTotalWorldTime % Settings.get.tickFrequency == 0) { if (queue.isEmpty) { val instant = disassembleNextInstantly // Is reset via decrStackSize disassemble(decrStackSize(0, 1), instant) @@ -95,7 +95,7 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra while (buffer >= Settings.get.disassemblerItemCost && queue.nonEmpty) { buffer -= Settings.get.disassemblerItemCost val stack = queue.remove(0) - if (disassembleNextInstantly || world.rand.nextDouble >= Settings.get.disassemblerBreakChance) { + if (disassembleNextInstantly || getWorld.rand.nextDouble >= Settings.get.disassemblerBreakChance) { drop(stack) } } @@ -184,13 +184,13 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra override def setInventorySlotContents(slot: Int, stack: ItemStack): Unit = { super.setInventorySlotContents(slot, stack) - if (!world.isRemote) { + if (!getWorld.isRemote) { disassembleNextInstantly = false } } override def onSetInventorySlotContents(player: EntityPlayer, slot: Int, stack: ItemStack): Unit = { - if (!world.isRemote) { + if (!getWorld.isRemote) { disassembleNextInstantly = stack != null && slot == 0 && player.capabilities.isCreativeMode } } diff --git a/src/main/scala/li/cil/oc/common/tileentity/Hologram.scala b/src/main/scala/li/cil/oc/common/tileentity/Hologram.scala index e70388f97..bc0b7dbb4 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Hologram.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Hologram.scala @@ -3,16 +3,15 @@ package li.cil.oc.common.tileentity import java.util import li.cil.oc._ +import li.cil.oc.api.driver.DeviceInfo import li.cil.oc.api.driver.DeviceInfo.DeviceAttribute import li.cil.oc.api.driver.DeviceInfo.DeviceClass -import li.cil.oc.api.driver.DeviceInfo import li.cil.oc.api.machine.Arguments import li.cil.oc.api.machine.Callback import li.cil.oc.api.machine.Context import li.cil.oc.api.network.Analyzable import li.cil.oc.api.network._ import li.cil.oc.common.SaveHandler -import li.cil.oc.integration.util.Waila import li.cil.oc.server.{PacketSender => ServerPacketSender} import net.minecraft.entity.player.EntityPlayer import net.minecraft.nbt.NBTTagCompound @@ -407,7 +406,7 @@ class Hologram(var tier: Int) extends traits.Environment with SidedEnvironment w ServerPacketSender.sendHologramValues(this) resetDirtyFlag() } - if (world.getTotalWorldTime % Settings.get.tickFrequency == 0) { + if (getWorld.getTotalWorldTime % Settings.get.tickFrequency == 0) { if (litRatio < 0) this.synchronized { litRatio = 0 for (i <- volume.indices) { @@ -440,7 +439,8 @@ class Hologram(var tier: Int) extends traits.Environment with SidedEnvironment w val cx = x + 0.5 val cy = y + 0.5 val cz = z + 0.5 - val sh = width / 16 * scale * Sqrt2 // overscale to take into account 45 degree rotation + val sh = width / 16 * scale * Sqrt2 + // overscale to take into account 45 degree rotation val sv = height / 16 * scale * Sqrt2 new AxisAlignedBB( cx + (-0.5 + translation.xCoord) * sh, @@ -454,6 +454,7 @@ class Hologram(var tier: Int) extends traits.Environment with SidedEnvironment w // ----------------------------------------------------------------------- // private def dataPath = node.address + "_data" + private final val TierTag = Settings.namespace + "tier" private final val VolumeTag = "volume" private final val ColorsTag = "colors" @@ -495,12 +496,10 @@ class Hologram(var tier: Int) extends traits.Environment with SidedEnvironment w override def writeToNBTForServer(nbt: NBTTagCompound) = this.synchronized { nbt.setByte(TierTag, tier.toByte) super.writeToNBTForServer(nbt) - if (!Waila.isSavingForTooltip) { - SaveHandler.scheduleSave(world, x, z, nbt, dataPath, tag => { - tag.setIntArray(VolumeTag, volume) - tag.setIntArray(ColorsTag, colors.map(convertColor)) - }) - } + SaveHandler.scheduleSave(getWorld, x, z, nbt, dataPath, tag => { + tag.setIntArray(VolumeTag, volume) + tag.setIntArray(ColorsTag, colors.map(convertColor)) + }) nbt.setDouble(ScaleTag, scale) nbt.setDouble(OffsetXTag, translation.xCoord) nbt.setDouble(OffsetYTag, translation.yCoord) diff --git a/src/main/scala/li/cil/oc/common/tileentity/Microcontroller.scala b/src/main/scala/li/cil/oc/common/tileentity/Microcontroller.scala index ff2633b18..02c95bb19 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Microcontroller.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Microcontroller.scala @@ -130,7 +130,7 @@ class Microcontroller extends traits.PowerAcceptor with traits.Hub with traits.C super.updateEntity() // Pump energy into the internal network. - if (isServer && world.getTotalWorldTime % Settings.get.tickFrequency == 0) { + if (isServer && getWorld.getTotalWorldTime % Settings.get.tickFrequency == 0) { for (side <- EnumFacing.values if side != facing) { sidedNode(side) match { case connector: Connector => diff --git a/src/main/scala/li/cil/oc/common/tileentity/MotionSensor.scala b/src/main/scala/li/cil/oc/common/tileentity/MotionSensor.scala index 01d9c8a8f..873233629 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/MotionSensor.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/MotionSensor.scala @@ -48,11 +48,11 @@ class MotionSensor extends traits.Environment with traits.Tickable with DeviceIn override def updateEntity() { super.updateEntity() - if (isServer && world.getTotalWorldTime % 10 == 0) { + if (isServer && getWorld.getTotalWorldTime % 10 == 0) { // Get a list of all living entities we could possibly detect, using a rough // bounding box check, then refining it using the actual distance and an // actual visibility check. - val entities = world.getEntitiesWithinAABB(classOf[EntityLivingBase], sensorBounds) + val entities = getWorld.getEntitiesWithinAABB(classOf[EntityLivingBase], sensorBounds) .filter(entity => entity.isEntityAlive && isInRange(entity) && isVisible(entity)) .toSet // Get rid of all tracked entities that are no longer visible. @@ -98,7 +98,7 @@ class MotionSensor extends traits.Environment with traits.Tickable with DeviceIn if (entity.posY > y + 1) oy += 0.75 if (entity.posZ < z) oz -= 0.75 if (entity.posZ > z + 1) oz += 0.75 - world.rayTraceBlocks(new Vec3d(ox, oy, oz), target) == null + getWorld.rayTraceBlocks(new Vec3d(ox, oy, oz), target) == null } private def sendSignal(entity: EntityLivingBase) { diff --git a/src/main/scala/li/cil/oc/common/tileentity/NetSplitter.scala b/src/main/scala/li/cil/oc/common/tileentity/NetSplitter.scala index 35b00f7bd..90a720913 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/NetSplitter.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/NetSplitter.scala @@ -28,11 +28,11 @@ class NetSplitter extends traits.Environment with traits.OpenSides with traits.R node.remove() api.Network.joinOrCreateNetwork(this) ServerPacketSender.sendNetSplitterState(this) - world.playSound(null, x + 0.5, y + 0.5, z + 0.5, SoundEvents.BLOCK_PISTON_EXTEND, SoundCategory.BLOCKS, 0.5f, world.rand.nextFloat() * 0.25f + 0.7f) - world.notifyNeighborsOfStateChange(getPos, getBlockType, false) + getWorld.playSound(null, x + 0.5, y + 0.5, z + 0.5, SoundEvents.BLOCK_PISTON_EXTEND, SoundCategory.BLOCKS, 0.5f, getWorld.rand.nextFloat() * 0.25f + 0.7f) + getWorld.notifyNeighborsOfStateChange(getPos, getBlockType, false) } else { - world.notifyBlockUpdate(getPos, world.getBlockState(getPos), world.getBlockState(getPos), 3) + getWorld.notifyBlockUpdate(getPos, getWorld.getBlockState(getPos), getWorld.getBlockState(getPos), 3) } } @@ -61,10 +61,10 @@ class NetSplitter extends traits.Environment with traits.OpenSides with traits.R node.remove() api.Network.joinOrCreateNetwork(this) ServerPacketSender.sendNetSplitterState(this) - world.playSound(null, x + 0.5, y + 0.5, z + 0.5, SoundEvents.BLOCK_PISTON_CONTRACT, SoundCategory.BLOCKS, 0.5f, world.rand.nextFloat() * 0.25f + 0.7f) + getWorld.playSound(null, x + 0.5, y + 0.5, z + 0.5, SoundEvents.BLOCK_PISTON_CONTRACT, SoundCategory.BLOCKS, 0.5f, getWorld.rand.nextFloat() * 0.25f + 0.7f) } else { - world.notifyBlockUpdate(getPos, getWorld.getBlockState(getPos), getWorld.getBlockState(getPos), 3) + getWorld.notifyBlockUpdate(getPos, getWorld.getBlockState(getPos), getWorld.getBlockState(getPos), 3) } } } diff --git a/src/main/scala/li/cil/oc/common/tileentity/Printer.scala b/src/main/scala/li/cil/oc/common/tileentity/Printer.scala index eb533e96d..324b61e61 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Printer.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Printer.scala @@ -194,7 +194,7 @@ class Printer extends traits.Environment with traits.Inventory with traits.Rotat texture, tint) isActive = false // Needs committing. - world.notifyBlockUpdate(getPos, getWorld.getBlockState(getPos), getWorld.getBlockState(getPos), 3) + getWorld.notifyBlockUpdate(getPos, getWorld.getBlockState(getPos), getWorld.getBlockState(getPos), 3) result(true) } diff --git a/src/main/scala/li/cil/oc/common/tileentity/Rack.scala b/src/main/scala/li/cil/oc/common/tileentity/Rack.scala index 4379318d5..7bed2f888 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Rack.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Rack.scala @@ -316,7 +316,7 @@ class Rack extends traits.PowerAcceptor with traits.Hub with traits.PowerBalance ServerPacketSender.sendRackInventory(this) } else { - world.notifyBlockUpdate(getPos, getWorld.getBlockState(getPos), getWorld.getBlockState(getPos), 3) + getWorld.notifyBlockUpdate(getPos, getWorld.getBlockState(getPos), getWorld.getBlockState(getPos), 3) } } @@ -365,7 +365,7 @@ class Rack extends traits.PowerAcceptor with traits.Hub with traits.PowerBalance hasChanged(slot) = false lastData(slot) = mountable.getData ServerPacketSender.sendRackMountableData(this, slot) - world.notifyNeighborsOfStateChange(getPos, getBlockType, false) + getWorld.notifyNeighborsOfStateChange(getPos, getBlockType, false) // These are working state dependent, so recompute them. isOutputEnabled = hasRedstoneCard } diff --git a/src/main/scala/li/cil/oc/common/tileentity/Relay.scala b/src/main/scala/li/cil/oc/common/tileentity/Relay.scala index 93f0f1e8b..a48fa9fee 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Relay.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Relay.scala @@ -120,16 +120,6 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits } } - override def tryEnqueuePacket(sourceSide: Option[EnumFacing], packet: Packet): Boolean = { - if (Mods.ComputerCraft.isAvailable) { - packet.data.headOption match { - case Some(answerPort: java.lang.Double) => queueMessage(packet.source, packet.destination, packet.port, answerPort.toInt, packet.data.drop(1)) - case _ => queueMessage(packet.source, packet.destination, packet.port, -1, packet.data) - } - } - super.tryEnqueuePacket(sourceSide, packet) - } - override protected def relayPacket(sourceSide: Option[EnumFacing], packet: Packet): Unit = { super.relayPacket(sourceSide, packet) diff --git a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala index b45dd3eb2..1f338e1e7 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala @@ -42,7 +42,10 @@ import net.minecraft.util.SoundCategory import net.minecraft.util.math.AxisAlignedBB import net.minecraft.util.math.BlockPos import net.minecraftforge.common.MinecraftForge +import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.fluids._ +import net.minecraftforge.fluids.capability.CapabilityFluidHandler +import net.minecraftforge.fluids.capability.IFluidHandler import net.minecraftforge.fml.relauncher.Side import net.minecraftforge.fml.relauncher.SideOnly @@ -65,8 +68,17 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot machine.setCostPerTick(Settings.get.robotCost) } + + // ----------------------------------------------------------------------- // + override def getCapability[T](capability: Capability[T], facing: EnumFacing): T = { + if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) + capability.cast(this.asInstanceOf[T]) + else + super.getCapability(capability, facing) + } + override def tier = info.tier def isCreative = tier == Tier.Four @@ -96,7 +108,7 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot override def setSelectedSlot(index: Int): Unit = { selectedSlot = index max 0 min mainInventory.getSizeInventory - 1 - if (world != null) { + if (getWorld != null) { ServerPacketSender.sendRobotSelectedSlotChange(this) } } @@ -189,7 +201,7 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot def move(direction: EnumFacing): Boolean = { val oldPosition = getPos val newPosition = oldPosition.offset(direction) - if (!world.isBlockLoaded(newPosition)) { + if (!getWorld.isBlockLoaded(newPosition)) { return false // Don't fall off the earth. } @@ -201,8 +213,8 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot val blockRobotProxy = api.Items.get(Constants.BlockName.Robot).block.asInstanceOf[common.block.RobotProxy] val blockRobotAfterImage = api.Items.get(Constants.BlockName.RobotAfterimage).block.asInstanceOf[common.block.RobotAfterimage] - val wasAir = world.isAirBlock(newPosition) - val state = world.getBlockState(newPosition) + val wasAir = getWorld.isAirBlock(newPosition) + val state = getWorld.getBlockState(newPosition) val block = state.getBlock val metadata = block.getMetaFromState(state) try { @@ -214,16 +226,16 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot // worked before the client is notified so that we can use the same trick on // the client by sending a corresponding packet. This also saves us from // having to send the complete state again (e.g. screen buffer) each move. - world.setBlockToAir(newPosition) + getWorld.setBlockToAir(newPosition) // In some cases (though I couldn't quite figure out which one) setBlock // will return true, even though the block was not created / adjusted. - val created = world.setBlockState(newPosition, world.getBlockState(oldPosition), 1) && - world.getTileEntity(newPosition) == proxy + val created = getWorld.setBlockState(newPosition, getWorld.getBlockState(oldPosition), 1) && + getWorld.getTileEntity(newPosition) == proxy if (created) { assert(getPos == newPosition) - world.setBlockState(oldPosition, net.minecraft.init.Blocks.AIR.getDefaultState, 1) - world.setBlockState(oldPosition, blockRobotAfterImage.getDefaultState, 1) - assert(world.getBlockState(oldPosition).getBlock == blockRobotAfterImage) + getWorld.setBlockState(oldPosition, net.minecraft.init.Blocks.AIR.getDefaultState, 1) + getWorld.setBlockState(oldPosition, blockRobotAfterImage.getDefaultState, 1) + assert(getWorld.getBlockState(oldPosition).getBlock == blockRobotAfterImage) // Here instead of Lua callback so that it gets called on client, too. val moveTicks = math.max((Settings.get.moveDelay * 20).toInt, 1) setAnimateMove(oldPosition, moveTicks) @@ -239,24 +251,24 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot if (FluidRegistry.lookupFluidForBlock(block) == null && !block.isInstanceOf[BlockFluidBase] && !block.isInstanceOf[BlockLiquid]) { - world.playEvent(2001, newPosition, Block.getIdFromBlock(block) + (metadata << 12)) + getWorld.playEvent(2001, newPosition, Block.getIdFromBlock(block) + (metadata << 12)) } else { val sx = newPosition.getX + 0.5 val sy = newPosition.getY + 0.5 val sz = newPosition.getZ + 0.5 - world.playSound(sx, sy, sz, SoundEvents.BLOCK_WATER_AMBIENT, SoundCategory.BLOCKS, - world.rand.nextFloat * 0.25f + 0.75f, world.rand.nextFloat * 1.0f + 0.5f, false) + getWorld.playSound(sx, sy, sz, SoundEvents.BLOCK_WATER_AMBIENT, SoundCategory.BLOCKS, + getWorld.rand.nextFloat * 0.25f + 0.75f, getWorld.rand.nextFloat * 1.0f + 0.5f, false) } } } - world.notifyBlockUpdate(oldPosition) - world.notifyBlockUpdate(newPosition) + getWorld.notifyBlockUpdate(oldPosition) + getWorld.notifyBlockUpdate(newPosition) } assert(!isInvalid) } else { - world.setBlockToAir(newPosition) + getWorld.setBlockToAir(newPosition) } created } @@ -313,8 +325,8 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot override def shouldRenderInPass(pass: Int) = true override def getRenderBoundingBox = - if (getBlockType != null && world != null) - getBlockType.getCollisionBoundingBox(world.getBlockState(getPos), world, getPos).expand(0.5, 0.5, 0.5).offset(getPos) + if (getBlockType != null && getWorld != null) + getBlockType.getCollisionBoundingBox(getWorld.getBlockState(getPos), getWorld, getPos).expand(0.5, 0.5, 0.5).offset(getPos) else new AxisAlignedBB(0, 0, 0, 1, 1, 1).offset(getPos) @@ -331,7 +343,7 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot } super.updateEntity() if (isServer) { - if (world.getTotalWorldTime % Settings.get.tickFrequency == 0) { + if (getWorld.getTotalWorldTime % Settings.get.tickFrequency == 0) { if (info.tier == 3) { bot.node.changeBuffer(Double.PositiveInfinity) } @@ -355,7 +367,7 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot for (slot <- 0 until equipmentInventory.getSizeInventory + mainInventory.getSizeInventory) { getStackInSlot(slot) match { - case stack: ItemStack => try stack.updateAnimation(world, if (!world.isRemote) player_ else null, slot, slot == 0) catch { + case stack: ItemStack => try stack.updateAnimation(getWorld, if (!getWorld.isRemote) player_ else null, slot, slot == 0) catch { case ignored: NullPointerException => // Client side item updates that need a player instance... } case _ => @@ -550,7 +562,7 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot } if (isComponentSlot(slot, stack)) { super.onItemAdded(slot, stack) - world.notifyBlocksOfNeighborChange(position, getBlockType, updateObservers = false) + getWorld.notifyBlocksOfNeighborChange(position, getBlockType, updateObservers = false) } if (isInventorySlot(slot)) { machine.signal("inventory_changed", Int.box(slot - equipmentInventory.getSizeInventory + 1)) @@ -576,7 +588,7 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot machine.signal("inventory_changed", Int.box(slot - equipmentInventory.getSizeInventory + 1)) } if (isComponentSlot(slot, stack)) { - world.notifyBlocksOfNeighborChange(position, getBlockType, updateObservers = false) + getWorld.notifyBlocksOfNeighborChange(position, getBlockType, updateObservers = false) } } } @@ -692,7 +704,7 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot components(slot) = None } getSizeInventory = realSize + componentCount - if (world != null && isServer) { + if (getWorld != null && isServer) { for (stack <- removed) { player().inventory.addItemStackToInventory(stack) spawnStackInWorld(stack, Option(facing)) @@ -730,7 +742,7 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot } else super.setInventorySlotContents(slot, stack) } - else if (stack != null && stack.getCount > 0 && !world.isRemote) spawnStackInWorld(stack, Option(EnumFacing.UP)) + else if (stack != null && stack.getCount > 0 && !getWorld.isRemote) spawnStackInWorld(stack, Option(EnumFacing.UP)) } override def isUsableByPlayer(player: EntityPlayer) = @@ -757,14 +769,14 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot // ----------------------------------------------------------------------- // override def dropSlot(slot: Int, count: Int, direction: Option[EnumFacing]) = - InventoryUtils.dropSlot(BlockPosition(x, y, z, world), mainInventory, slot, count, direction) + InventoryUtils.dropSlot(BlockPosition(x, y, z, getWorld), mainInventory, slot, count, direction) override def dropAllSlots() = { - InventoryUtils.dropSlot(BlockPosition(x, y, z, world), this, 0, Int.MaxValue) + InventoryUtils.dropSlot(BlockPosition(x, y, z, getWorld), this, 0, Int.MaxValue) for (slot <- containerSlots) { - InventoryUtils.dropSlot(BlockPosition(x, y, z, world), this, slot, Int.MaxValue) + InventoryUtils.dropSlot(BlockPosition(x, y, z, getWorld), this, slot, Int.MaxValue) } - InventoryUtils.dropAllSlots(BlockPosition(x, y, z, world), mainInventory) + InventoryUtils.dropAllSlots(BlockPosition(x, y, z, getWorld), mainInventory) } // ----------------------------------------------------------------------- // diff --git a/src/main/scala/li/cil/oc/common/tileentity/RobotProxy.scala b/src/main/scala/li/cil/oc/common/tileentity/RobotProxy.scala index 9a517a42d..37d5b0ae7 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/RobotProxy.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/RobotProxy.scala @@ -6,6 +6,9 @@ import li.cil.oc.api.machine.Arguments import li.cil.oc.api.machine.Callback import li.cil.oc.api.machine.Context import li.cil.oc.api.network._ +import net.minecraftforge.common.capabilities.Capability +import net.minecraftforge.fluids.capability.CapabilityFluidHandler +import net.minecraftforge.fluids.capability.IFluidHandler import net.minecraftforge.fml.relauncher.Side import net.minecraftforge.fml.relauncher.SideOnly @@ -21,13 +24,18 @@ import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.EnumFacing import net.minecraftforge.fluids.Fluid import net.minecraftforge.fluids.FluidStack -import net.minecraftforge.fluids.IFluidHandler class RobotProxy(val robot: Robot) extends traits.Computer with traits.PowerInformation with traits.RotatableTile with ISidedInventory with IFluidHandler with internal.Robot { def this() = this(new Robot()) // ----------------------------------------------------------------------- // + override def getCapability[T](capability: Capability[T], facing: EnumFacing): T = { + if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) + capability.cast(this.asInstanceOf[T]) + else super.getCapability(capability, facing) + } + override val node = api.Network.newNode(this, Visibility.Network). withComponent("robot", Visibility.Neighbors). create() @@ -112,7 +120,7 @@ class RobotProxy(val robot: Robot) extends traits.Computer with traits.PowerInfo super.validate() val firstProxy = robot.proxy == null robot.proxy = this - robot.setWorld(world) + robot.setWorld(getWorld) robot.setPos(getPos) if (firstProxy) { robot.validate() diff --git a/src/main/scala/li/cil/oc/common/tileentity/Screen.scala b/src/main/scala/li/cil/oc/common/tileentity/Screen.scala index 1f7c682ee..3d8983055 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Screen.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Screen.scala @@ -66,7 +66,7 @@ class Screen(var tier: Int) extends traits.TextBuffer with SidedEnvironment with override def canConnect(side: EnumFacing) = side != facing // Allow connections from front for keyboards, and keyboards only... - override def sidedNode(side: EnumFacing) = if (side != facing || (world.isBlockLoaded(getPos.offset(side)) && world.getTileEntity(getPos.offset(side)).isInstanceOf[Keyboard])) node else null + override def sidedNode(side: EnumFacing) = if (side != facing || (getWorld.isBlockLoaded(getPos.offset(side)) && getWorld.getTileEntity(getPos.offset(side)).isInstanceOf[Keyboard])) node else null // ----------------------------------------------------------------------- // @@ -81,7 +81,7 @@ class Screen(var tier: Int) extends traits.TextBuffer with SidedEnvironment with def hasKeyboard = screens.exists(screen => EnumFacing.values.map(side => (side, { val blockPos = BlockPosition(screen).offset(side) - if (world.blockExists(blockPos)) world.getTileEntity(blockPos) + if (getWorld.blockExists(blockPos)) getWorld.getTileEntity(blockPos) else null })).exists { case (side, keyboard: Keyboard) => keyboard.hasNodeOnSide(side.getOpposite) @@ -113,7 +113,7 @@ class Screen(var tier: Int) extends traits.TextBuffer with SidedEnvironment with if (ax <= border || ay <= border || ax >= width - border || ay >= height - border) { return (false, None) } - if (!world.isRemote) return (true, None) + if (!getWorld.isRemote) return (true, None) val (iw, ih) = (width - border * 2, height - border * 2) val (rx, ry) = ((ax - border) / iw, (ay - border) / ih) @@ -197,7 +197,7 @@ class Screen(var tier: Int) extends traits.TextBuffer with SidedEnvironment with val lpos = project(current) def tryQueue(dx: Int, dy: Int) { val npos = unproject(lpos.x + dx, lpos.y + dy, lpos.z) - if (world.blockExists(npos)) world.getTileEntity(npos) match { + if (getWorld.blockExists(npos)) getWorld.getTileEntity(npos) match { case s: Screen if s.pitch == pitch && s.yaw == yaw && pending.add(s) => queue += s case _ => // Ignore. } @@ -219,7 +219,7 @@ class Screen(var tier: Int) extends traits.TextBuffer with SidedEnvironment with } if (isClient) { val bounds = current.origin.getRenderBoundingBox - world.markBlockRangeForRenderUpdate(bounds.minX.toInt, bounds.minY.toInt, bounds.minZ.toInt, + getWorld.markBlockRangeForRenderUpdate(bounds.minX.toInt, bounds.minY.toInt, bounds.minZ.toInt, bounds.maxX.toInt, bounds.maxY.toInt, bounds.maxZ.toInt) } } @@ -373,7 +373,7 @@ class Screen(var tier: Int) extends traits.TextBuffer with SidedEnvironment with val opos = project(origin) def tryMergeTowards(dx: Int, dy: Int) = { val npos = unproject(opos.x + dx, opos.y + dy, opos.z) - world.blockExists(npos) && (world.getTileEntity(npos) match { + getWorld.blockExists(npos) && (getWorld.getTileEntity(npos) match { case s: Screen if s.tier == tier && s.pitch == pitch && s.getColor == getColor && s.yaw == yaw && !screens.contains(s) => val spos = project(s.origin) val canMergeAlongX = spos.y == opos.y && s.height == height && s.width + width <= Settings.get.maxScreenWidth diff --git a/src/main/scala/li/cil/oc/common/tileentity/Switch.scala b/src/main/scala/li/cil/oc/common/tileentity/Switch.scala index 59f7ac4ca..090715988 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Switch.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Switch.scala @@ -34,16 +34,6 @@ class Switch extends traits.SwitchLike with traits.NotAnalyzable with traits.Com // ----------------------------------------------------------------------- // - override def tryEnqueuePacket(sourceSide: Option[EnumFacing], packet: Packet): Boolean = { - if (Mods.ComputerCraft.isAvailable) { - packet.data.headOption match { - case Some(answerPort: java.lang.Double) => queueMessage(packet.source, packet.destination, packet.port, answerPort.toInt, packet.data.drop(1)) - case _ => queueMessage(packet.source, packet.destination, packet.port, -1, packet.data) - } - } - super.tryEnqueuePacket(sourceSide, packet) - } - override protected def relayPacket(sourceSide: Option[EnumFacing], packet: Packet) { super.relayPacket(sourceSide, packet) onSwitchActivity() diff --git a/src/main/scala/li/cil/oc/common/tileentity/Waypoint.scala b/src/main/scala/li/cil/oc/common/tileentity/Waypoint.scala index 3e9e6a7db..be60238d1 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Waypoint.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Waypoint.scala @@ -38,13 +38,13 @@ class Waypoint extends traits.Environment with traits.Rotatable with traits.Reds super.updateEntity() if (isClient) { val origin = position.toVec3.addVector(facing.getFrontOffsetX * 0.5, facing.getFrontOffsetY * 0.5, facing.getFrontOffsetZ * 0.5) - val dx = (world.rand.nextFloat() - 0.5f) * 0.8f - val dy = (world.rand.nextFloat() - 0.5f) * 0.8f - val dz = (world.rand.nextFloat() - 0.5f) * 0.8f - val vx = (world.rand.nextFloat() - 0.5f) * 0.2f + facing.getFrontOffsetX * 0.3f - val vy = (world.rand.nextFloat() - 0.5f) * 0.2f + facing.getFrontOffsetY * 0.3f - 0.5f - val vz = (world.rand.nextFloat() - 0.5f) * 0.2f + facing.getFrontOffsetZ * 0.3f - world.spawnParticle(EnumParticleTypes.PORTAL, origin.xCoord + dx, origin.yCoord + dy, origin.zCoord + dz, vx, vy, vz) + val dx = (getWorld.rand.nextFloat() - 0.5f) * 0.8f + val dy = (getWorld.rand.nextFloat() - 0.5f) * 0.8f + val dz = (getWorld.rand.nextFloat() - 0.5f) * 0.8f + val vx = (getWorld.rand.nextFloat() - 0.5f) * 0.2f + facing.getFrontOffsetX * 0.3f + val vy = (getWorld.rand.nextFloat() - 0.5f) * 0.2f + facing.getFrontOffsetY * 0.3f - 0.5f + val vz = (getWorld.rand.nextFloat() - 0.5f) * 0.2f + facing.getFrontOffsetZ * 0.3f + getWorld.spawnParticle(EnumParticleTypes.PORTAL, origin.xCoord + dx, origin.yCoord + dy, origin.zCoord + dz, vx, vy, vz) } } diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/BundledRedstoneAware.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/BundledRedstoneAware.scala index 593b808f1..e7407d6ec 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/BundledRedstoneAware.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/BundledRedstoneAware.scala @@ -19,16 +19,7 @@ import net.minecraft.nbt.NBTTagIntArray import net.minecraft.util.EnumFacing import net.minecraftforge.common.util.Constants.NBT -/* TODO MFR -import powercrystals.minefactoryreloaded.api.rednet.IRedNetNetworkContainer -*/ - -@Optional.InterfaceList(Array( - new Optional.Interface(iface = "mods.immibis.redlogic.api.wiring.IBundledEmitter", modid = Mods.IDs.RedLogic), - new Optional.Interface(iface = "mods.immibis.redlogic.api.wiring.IBundledUpdatable", modid = Mods.IDs.RedLogic), - new Optional.Interface(iface = "mrtjp.projectred.api.IBundledTile", modid = Mods.IDs.ProjectRedTransmission) -)) -trait BundledRedstoneAware extends RedstoneAware /* with IBundledEmitter with IBundledUpdatable with IBundledTile TODO RedLogic, Project Red, MFR */ { +trait BundledRedstoneAware extends RedstoneAware { protected[tileentity] val _bundledInput = Array.fill(6)(Array.fill(16)(-1)) @@ -91,16 +82,6 @@ trait BundledRedstoneAware extends RedstoneAware /* with IBundledEmitter with IB def bundledOutput(side: EnumFacing, color: Int, value: Int): Unit = if (value != bundledOutput(side, color)) { _bundledOutput(toLocal(side).ordinal())(color) = value - /* TODO MFR - if (Mods.MineFactoryReloaded.isAvailable) { - val blockPos = BlockPosition(x, y, z).offset(side) - world.getBlock(blockPos) match { - case block: IRedNetNetworkContainer => block.updateNetwork(world, blockPos.x, blockPos.y, blockPos.z, side.getOpposite) - case _ => - } - } - */ - onRedstoneOutputChanged(side) } @@ -152,38 +133,4 @@ trait BundledRedstoneAware extends RedstoneAware /* with IBundledEmitter with IB nbt.setNewTagList(RednetInputTag, _rednetInput.view) } - - // ----------------------------------------------------------------------- // - - override protected def onRedstoneOutputEnabledChanged() { - /* TODO MFR - if (Mods.MineFactoryReloaded.isAvailable) { - for (side <- EnumFacing.VALID_DIRECTIONS) { - val blockPos = BlockPosition(x, y, z).offset(side) - world.getBlock(blockPos) match { - case block: IRedNetNetworkContainer => block.updateNetwork(world, x, y, z, side.getOpposite) - case _ => - } - } - } - */ - super.onRedstoneOutputEnabledChanged() - } - - // ----------------------------------------------------------------------- // - /* TODO RedLogic - @Optional.Method(modid = Mods.IDs.RedLogic) - def getBundledCableStrength(blockFace: Int, toDirection: Int): Array[Byte] = bundledOutput(EnumFacing.getOrientation(toDirection)).map(value => math.min(math.max(value, 0), 255).toByte) - - @Optional.Method(modid = Mods.IDs.RedLogic) - def onBundledInputChanged() = checkRedstoneInputChanged() - */ - // ----------------------------------------------------------------------- // - /* TODO Project Red - @Optional.Method(modid = Mods.IDs.ProjectRedTransmission) - def canConnectBundled(side: Int) = isOutputEnabled - - @Optional.Method(modid = Mods.IDs.ProjectRedTransmission) - def getBundledSignal(side: Int) = bundledOutput(EnumFacing.getOrientation(side)).map(value => math.min(math.max(value, 0), 255).toByte) - */ } diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/Colored.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/Colored.scala index 86c3b8052..66129b6e5 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/Colored.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/Colored.scala @@ -24,7 +24,7 @@ trait Colored extends TileEntity with internal.Colored { override def controlsConnectivity = false protected def onColorChanged() { - if (world != null && isServer) { + if (getWorld != null && isServer) { PacketSender.sendColorChange(this) } } diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala index de725e741..c92ebaf2e 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala @@ -8,7 +8,6 @@ import li.cil.oc.api import li.cil.oc.client.Sound import li.cil.oc.common.tileentity.RobotProxy import li.cil.oc.integration.opencomputers.DriverRedstoneCard -import li.cil.oc.integration.util.Waila import li.cil.oc.server.agent import li.cil.oc.server.{PacketSender => ServerPacketSender} import li.cil.oc.util.ExtendedNBT._ @@ -53,11 +52,11 @@ trait Computer extends Environment with ComponentInventory with Rotatable with B if (value) { hasErrored = false } - if (world != null) { - world.notifyBlockUpdate(getPos, getWorld.getBlockState(getPos), getWorld.getBlockState(getPos), 3) - if (world.isRemote) { + if (getWorld != null) { + getWorld.notifyBlockUpdate(getPos, getWorld.getBlockState(getPos), getWorld.getBlockState(getPos), 3) + if (getWorld.isRemote) { runSound.foreach(sound => - if (_isRunning) Sound.startLoop(this, sound, 0.5f, 50 + world.rand.nextInt(50)) + if (_isRunning) Sound.startLoop(this, sound, 0.5f, 50 + getWorld.rand.nextInt(50)) else Sound.stopLoop(this) ) } @@ -127,7 +126,7 @@ trait Computer extends Environment with ComponentInventory with Rotatable with B override def dispose(): Unit = { super.dispose() - if (machine != null && !this.isInstanceOf[RobotProxy] && !moving) { + if (machine != null && !this.isInstanceOf[RobotProxy]) { machine.stop() } } @@ -160,8 +159,7 @@ trait Computer extends Environment with ComponentInventory with Rotatable with B override def writeToNBTForServer(nbt: NBTTagCompound) { super.writeToNBTForServer(nbt) if (machine != null) { - if (!Waila.isSavingForTooltip) - nbt.setNewCompoundTag(ComputerTag, machine.save) + nbt.setNewCompoundTag(ComputerTag, machine.save) } } @@ -172,7 +170,7 @@ trait Computer extends Environment with ComponentInventory with Rotatable with B setRunning(nbt.getBoolean(IsRunningTag)) _users.clear() _users ++= nbt.getTagList(UsersTag, NBT.TAG_STRING).map((tag: NBTTagString) => tag.getString) - if (_isRunning) runSound.foreach(sound => Sound.startLoop(this, sound, 0.5f, 1000 + world.rand.nextInt(2000))) + if (_isRunning) runSound.foreach(sound => Sound.startLoop(this, sound, 0.5f, 1000 + getWorld.rand.nextInt(2000))) } override def writeToNBTForClient(nbt: NBTTagCompound) { diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/Environment.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/Environment.scala index 96916a61d..ce5c928a7 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/Environment.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/Environment.scala @@ -3,29 +3,24 @@ package li.cil.oc.common.tileentity.traits import li.cil.oc.Settings import li.cil.oc.api.network import li.cil.oc.api.network.Connector -import li.cil.oc.api.network.Node import li.cil.oc.api.network.SidedEnvironment import li.cil.oc.common.EventHandler -import li.cil.oc.common.asm.Injectable -import li.cil.oc.integration.Mods -import li.cil.oc.server.network.Network import li.cil.oc.util.ExtendedNBT._ -import li.cil.oc.util.ExtendedWorld._ import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.EnumFacing -import net.minecraftforge.fml.common.Optional -@Injectable.Interface(value = "appeng.api.movable.IMovableTile", modid = Mods.IDs.AppliedEnergistics2) trait Environment extends TileEntity with network.Environment with network.EnvironmentHost { protected var isChangeScheduled = false + override def world = getWorld + override def xPosition = x + 0.5 override def yPosition = y + 0.5 override def zPosition = z + 0.5 - override def markChanged() = if (this.isInstanceOf[Tickable]) isChangeScheduled = true else world.markChunkDirty(getPos, this) + override def markChanged() = if (this.isInstanceOf[Tickable]) isChangeScheduled = true else getWorld.markChunkDirty(getPos, this) protected def isConnected = node != null && node.address != null && node.network != null @@ -41,7 +36,7 @@ trait Environment extends TileEntity with network.Environment with network.Envir override def updateEntity() { super.updateEntity() if (isChangeScheduled) { - world.markChunkDirty(getPos, this) + getWorld.markChunkDirty(getPos, this) isChangeScheduled = false } } @@ -49,34 +44,12 @@ trait Environment extends TileEntity with network.Environment with network.Envir override def dispose() { super.dispose() if (isServer) { - if (moving && this.isInstanceOf[Computer]) { - this match { - case env: SidedEnvironment => - for (side <- EnumFacing.values) { - val npos = position.offset(side) - Network.getNetworkNode(world.getTileEntity(npos), side.getOpposite) match { - case neighbor: Node if env.sidedNode(side) != null => env.sidedNode(side).disconnect(neighbor) - case _ => // No neighbor node. - } - } - case env => - for (side <- EnumFacing.values) { - val npos = position.offset(side) - Network.getNetworkNode(world.getTileEntity(npos), side.getOpposite) match { - case neighbor: Node if env.node != null => env.node.disconnect(neighbor) - case _ => // No neighbor node. - } - } - } - } - else { - Option(node).foreach(_.remove) - this match { - case sidedEnvironment: SidedEnvironment => for (side <- EnumFacing.values) { - Option(sidedEnvironment.sidedNode(side)).foreach(_.remove()) - } - case _ => + Option(node).foreach(_.remove) + this match { + case sidedEnvironment: SidedEnvironment => for (side <- EnumFacing.values) { + Option(sidedEnvironment.sidedNode(side)).foreach(_.remove()) } + case _ => } } } @@ -121,22 +94,5 @@ trait Environment extends TileEntity with network.Environment with network.Envir // ----------------------------------------------------------------------- // - protected var moving = false - - @Optional.Method(modid = Mods.IDs.AppliedEnergistics2) - def prepareToMove(): Boolean = { - moving = true - true - } - - @Optional.Method(modid = Mods.IDs.AppliedEnergistics2) - def doneMoving(): Unit = { - moving = false - Network.joinOrCreateNetwork(this) - world.notifyBlockUpdate(getPos) - } - - // ----------------------------------------------------------------------- // - protected def result(args: Any*) = li.cil.oc.util.ResultWrapper.result(args: _*) } diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/Hub.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/Hub.scala index 9bc9d3ad7..3dc84b8a1 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/Hub.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/Hub.scala @@ -74,7 +74,7 @@ trait Hub extends traits.Environment with SidedEnvironment with Tickable { relayCooldown = relayDelay - 1 } } - else if (world.getTotalWorldTime % relayDelay == 0) { + else if (getWorld.getTotalWorldTime % relayDelay == 0) { packetsPerCycleAvg += 0 } } diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/Inventory.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/Inventory.scala index 1949626f5..e60f1ce5c 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/Inventory.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/Inventory.scala @@ -36,11 +36,11 @@ trait Inventory extends TileEntity with inventory.Inventory { // ----------------------------------------------------------------------- // def dropSlot(slot: Int, count: Int = getInventoryStackLimit, direction: Option[EnumFacing] = None) = - InventoryUtils.dropSlot(BlockPosition(x, y, z, world), this, slot, count, direction) + InventoryUtils.dropSlot(BlockPosition(x, y, z, getWorld), this, slot, count, direction) def dropAllSlots() = - InventoryUtils.dropAllSlots(BlockPosition(x, y, z, world), this) + InventoryUtils.dropAllSlots(BlockPosition(x, y, z, getWorld), this) def spawnStackInWorld(stack: ItemStack, direction: Option[EnumFacing] = None) = - InventoryUtils.spawnStackInWorld(BlockPosition(x, y, z, world), stack, direction) + InventoryUtils.spawnStackInWorld(BlockPosition(x, y, z, getWorld), stack, direction) } 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 e7fed0bd1..7a3d77581 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 @@ -1,12 +1,4 @@ package li.cil.oc.common.tileentity.traits trait PowerAcceptor - extends power.Common -// with power.AppliedEnergistics2 -// with power.Factorization -// with power.Galacticraft - with power.IndustrialCraft2Experimental -// with power.IndustrialCraft2Classic -// with power.Mekanism - with power.RedstoneFlux -// with power.RotaryCraft + extends power.Common \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/PowerBalancer.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/PowerBalancer.scala index debe38bae..3878d61b3 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/PowerBalancer.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/PowerBalancer.scala @@ -12,7 +12,7 @@ trait PowerBalancer extends PowerInformation with SidedEnvironment with Tickable override def updateEntity() { super.updateEntity() - if (isServer && isConnected && world.getTotalWorldTime % Settings.get.tickFrequency == 0) { + if (isServer && isConnected && getWorld.getTotalWorldTime % Settings.get.tickFrequency == 0) { val nodes = connectors def network(connector: Connector) = if (connector != null && connector.network != null) connector.network else this // Yeeeeah, so that just happened... it's not a beauty, but it works. This diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala index 8155a02da..ac2c1497b 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala @@ -19,12 +19,7 @@ import mods.immibis.redlogic.api.wiring.IWire import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.EnumFacing -@Optional.InterfaceList(Array( - new Optional.Interface(iface = "mods.immibis.redlogic.api.wiring.IConnectable", modid = Mods.IDs.RedLogic), - new Optional.Interface(iface = "mods.immibis.redlogic.api.wiring.IRedstoneEmitter", modid = Mods.IDs.RedLogic), - new Optional.Interface(iface = "mods.immibis.redlogic.api.wiring.IRedstoneUpdatable", modid = Mods.IDs.RedLogic) -)) -trait RedstoneAware extends RotationAware /* with IConnectable with IRedstoneEmitter with IRedstoneUpdatable TODO RedLogic */ { +trait RedstoneAware extends RotationAware { protected[tileentity] val _input = Array.fill(6)(-1) protected[tileentity] val _output = Array.fill(6)(0) @@ -135,34 +130,19 @@ trait RedstoneAware extends RotationAware /* with IConnectable with IRedstoneEmi protected def onRedstoneInputChanged(side: EnumFacing, oldMaxValue: Int, newMaxValue: Int) {} protected def onRedstoneOutputEnabledChanged() { - if (world != null) { - world.notifyNeighborsOfStateChange(getPos, getBlockType, true) + if (getWorld != null) { + getWorld.notifyNeighborsOfStateChange(getPos, getBlockType, true) if (isServer) ServerPacketSender.sendRedstoneState(this) - else world.notifyBlockUpdate(getPos, getWorld.getBlockState(getPos), getWorld.getBlockState(getPos), 3) + else getWorld.notifyBlockUpdate(getPos, getWorld.getBlockState(getPos), getWorld.getBlockState(getPos), 3) } } protected def onRedstoneOutputChanged(side: EnumFacing) { val blockPos = getPos.offset(side) - world.neighborChanged(blockPos, getBlockType, blockPos) - world.notifyNeighborsOfStateExcept(blockPos, world.getBlockState(blockPos).getBlock, side.getOpposite) + getWorld.neighborChanged(blockPos, getBlockType, blockPos) + getWorld.notifyNeighborsOfStateExcept(blockPos, getWorld.getBlockState(blockPos).getBlock, side.getOpposite) if (isServer) ServerPacketSender.sendRedstoneState(this) - else world.notifyBlockUpdate(getPos, getWorld.getBlockState(getPos), getWorld.getBlockState(getPos), 3) + else getWorld.notifyBlockUpdate(getPos, getWorld.getBlockState(getPos), getWorld.getBlockState(getPos), 3) } - - // ----------------------------------------------------------------------- // - /* TODO RedLogic - @Optional.Method(modid = Mods.IDs.RedLogic) - override def connects(wire: IWire, blockFace: Int, fromDirection: Int) = isOutputEnabled - - @Optional.Method(modid = Mods.IDs.RedLogic) - override def connectsAroundCorner(wire: IWire, blockFace: Int, fromDirection: Int) = false - - @Optional.Method(modid = Mods.IDs.RedLogic) - override def getEmittedSignalStrength(blockFace: Int, toDirection: Int): Short = _output(toLocal(ForgeDirection.getOrientation(toDirection)).ordinal()).toShort - - @Optional.Method(modid = Mods.IDs.RedLogic) - override def onRedstoneInputChanged() = checkRedstoneInputChanged() - */ } diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/Rotatable.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/Rotatable.scala index baf4bcc0d..9a223605d 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/Rotatable.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/Rotatable.scala @@ -24,8 +24,8 @@ trait Rotatable extends RotationAware with internal.Rotatable { // Accessors // ----------------------------------------------------------------------- // - def pitch = if (world != null && world.isBlockLoaded(getPos)) getBlockType match { - case rotatable if world.getBlockState(getPos).getProperties.containsKey(PropertyRotatable.Pitch) => world.getBlockState(getPos).getValue(PropertyRotatable.Pitch) + def pitch = if (getWorld != null && getWorld.isBlockLoaded(getPos)) getBlockType match { + case rotatable if getWorld.getBlockState(getPos).getProperties.containsKey(PropertyRotatable.Pitch) => getWorld.getBlockState(getPos).getValue(PropertyRotatable.Pitch) case _ => EnumFacing.NORTH } else null @@ -35,9 +35,9 @@ trait Rotatable extends RotationAware with internal.Rotatable { case _ => EnumFacing.NORTH }, yaw) - def yaw = if (world != null && world.isBlockLoaded(getPos)) getBlockType match { - case rotatable if world.getBlockState(getPos).getProperties.containsKey(PropertyRotatable.Yaw) => world.getBlockState(getPos).getValue(PropertyRotatable.Yaw) - case rotatable if world.getBlockState(getPos).getProperties.containsKey(PropertyRotatable.Facing) => world.getBlockState(getPos).getValue(PropertyRotatable.Facing) + def yaw = if (getWorld != null && getWorld.isBlockLoaded(getPos)) getBlockType match { + case rotatable if getWorld.getBlockState(getPos).getProperties.containsKey(PropertyRotatable.Yaw) => getWorld.getBlockState(getPos).getValue(PropertyRotatable.Yaw) + case rotatable if getWorld.getBlockState(getPos).getProperties.containsKey(PropertyRotatable.Facing) => getWorld.getBlockState(getPos).getValue(PropertyRotatable.Facing) case _ => EnumFacing.SOUTH } else null @@ -72,9 +72,9 @@ trait Rotatable extends RotationAware with internal.Rotatable { } def rotate(axis: EnumFacing) = { - val block = world.getBlock(position) + val block = getWorld.getBlock(position) if (block != null) { - val valid = block.getValidRotations(world, getPos) + val valid = block.getValidRotations(getWorld, getPos) if (valid != null && valid.contains(axis)) { val (newPitch, newYaw) = facing.getRotation(axis) match { case value@(EnumFacing.UP | EnumFacing.DOWN) => @@ -110,26 +110,26 @@ trait Rotatable extends RotationAware with internal.Rotatable { ServerPacketSender.sendRotatableState(this) } else { - world.notifyBlockUpdate(getPos) + getWorld.notifyBlockUpdate(getPos) } - world.notifyNeighborsOfStateChange(getPos, getBlockType, false) + getWorld.notifyNeighborsOfStateChange(getPos, getBlockType, false) } // ----------------------------------------------------------------------- // /** Updates cached translation array and sends notification to clients. */ protected def updateTranslation(): Unit = { - if (world != null) { + if (getWorld != null) { onRotationChanged() } } /** Validates new values against the allowed rotations as set in our block. */ protected def trySetPitchYaw(pitch: EnumFacing, yaw: EnumFacing) = { - val oldState = world.getBlockState(getPos) + val oldState = getWorld.getBlockState(getPos) def setState(newState: IBlockState): Boolean = { if (oldState.hashCode() != newState.hashCode()) { - world.setBlockState(getPos, newState) + getWorld.setBlockState(getPos, newState) updateTranslation() true } diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/StateAware.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/StateAware.scala index b79d44798..eb0f9a092 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/StateAware.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/StateAware.scala @@ -1,12 +1,6 @@ package li.cil.oc.common.tileentity.traits import li.cil.oc.api -import li.cil.oc.common.asm.Injectable -import li.cil.oc.integration.Mods -import net.minecraftforge.fml.common.Optional -@Injectable.Interface(value = "buildcraft.api.tiles.IHasWork", modid = Mods.IDs.BuildCraft) trait StateAware extends api.util.StateAware { - @Optional.Method(modid = Mods.IDs.BuildCraft) - def hasWork: Boolean = getCurrentState.contains(api.util.StateAware.State.CanWork) || getCurrentState.contains(api.util.StateAware.State.IsWorking) } diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/TileEntity.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/TileEntity.scala index 06753f294..d1734df0c 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/TileEntity.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/TileEntity.scala @@ -18,25 +18,23 @@ import net.minecraftforge.fml.relauncher.SideOnly trait TileEntity extends net.minecraft.tileentity.TileEntity { private final val IsServerDataTag = Settings.namespace + "isServerData" - def world = getWorld - def x = getPos.getX def y = getPos.getY def z = getPos.getZ - def position = BlockPosition(x, y, z, world) + def position = BlockPosition(x, y, z, getWorld) def isClient = !isServer - def isServer = if (world != null) !world.isRemote else SideTracker.isServer + def isServer = if (getWorld != null) !getWorld.isRemote else SideTracker.isServer // ----------------------------------------------------------------------- // def updateEntity() { - if (Settings.get.periodicallyForceLightUpdate && world.getTotalWorldTime % 40 == 0 && getBlockType.getLightValue(world.getBlockState(getPos), world, getPos) > 0) { - world.notifyBlockUpdate(getPos, world.getBlockState(getPos), world.getBlockState(getPos), 3) + if (Settings.get.periodicallyForceLightUpdate && getWorld.getTotalWorldTime % 40 == 0 && getBlockType.getLightValue(getWorld.getBlockState(getPos), getWorld, getPos) > 0) { + getWorld.notifyBlockUpdate(getPos, getWorld.getBlockState(getPos), getWorld.getBlockState(getPos), 3) } } diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2Experimental.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2Experimental.scala deleted file mode 100644 index 4cf3b591d..000000000 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2Experimental.scala +++ /dev/null @@ -1,96 +0,0 @@ -package li.cil.oc.common.tileentity.traits.power - -import ic2.api.energy.tile.IEnergyEmitter -import li.cil.oc.OpenComputers -import li.cil.oc.Settings -import li.cil.oc.common.EventHandler -import li.cil.oc.common.asm.Injectable -import li.cil.oc.common.tileentity.traits -import li.cil.oc.integration.Mods -import li.cil.oc.integration.util.Power -import net.minecraft.nbt.NBTTagCompound -import net.minecraft.util.EnumFacing -import net.minecraftforge.common.MinecraftForge -import net.minecraftforge.fml.common.Optional -import net.minecraftforge.fml.common.eventhandler.Event - -@Injectable.Interface(value = "ic2.api.energy.tile.IEnergySink", modid = Mods.IDs.IndustrialCraft2) -trait IndustrialCraft2Experimental extends Common with IndustrialCraft2Common with traits.Tickable { - private var conversionBuffer = 0.0 - - private lazy val useIndustrialCraft2Power = isServer && Mods.IndustrialCraft2.isAvailable - - // ----------------------------------------------------------------------- // - - override def updateEntity() { - super.updateEntity() - if (useIndustrialCraft2Power && world.getTotalWorldTime % Settings.get.tickFrequency == 0) { - updateEnergy() - } - } - - @Optional.Method(modid = Mods.IDs.IndustrialCraft2) - private def updateEnergy() { - tryAllSides((demand, _) => { - val result = math.min(demand, conversionBuffer) - conversionBuffer -= result - result - }, Power.fromEU, Power.toEU) - } - - override def validate() { - super.validate() - if (useIndustrialCraft2Power && !addedToIC2PowerGrid) EventHandler.scheduleIC2Add(this) - } - - override def invalidate() { - super.invalidate() - if (useIndustrialCraft2Power && addedToIC2PowerGrid) removeFromIC2Grid() - } - - override def onChunkUnload() { - super.onChunkUnload() - if (useIndustrialCraft2Power && addedToIC2PowerGrid) removeFromIC2Grid() - } - - private def removeFromIC2Grid() { - try MinecraftForge.EVENT_BUS.post(Class.forName("ic2.api.energy.event.EnergyTileUnloadEvent").getConstructor(Class.forName("ic2.api.energy.tile.IEnergyTile")).newInstance(this).asInstanceOf[Event]) catch { - case t: Throwable => OpenComputers.log.warn("Error removing node from IC2 grid.", t) - } - addedToIC2PowerGrid = false - } - - // ----------------------------------------------------------------------- // - - override def readFromNBTForServer(nbt: NBTTagCompound) { - super.readFromNBTForServer(nbt) - conversionBuffer = nbt.getDouble(Settings.namespace + "ic2power") - } - - override def writeToNBTForServer(nbt: NBTTagCompound) { - super.writeToNBTForServer(nbt) - nbt.setDouble(Settings.namespace + "ic2power", conversionBuffer) - } - - // ----------------------------------------------------------------------- // - - @Optional.Method(modid = Mods.IDs.IndustrialCraft2) - def getSinkTier: Int = Int.MaxValue - - @Optional.Method(modid = Mods.IDs.IndustrialCraft2) - def acceptsEnergyFrom(emitter: IEnergyEmitter, direction: EnumFacing): Boolean = useIndustrialCraft2Power && canConnectPower(direction) - - @Optional.Method(modid = Mods.IDs.IndustrialCraft2) - def injectEnergy(directionFrom: EnumFacing, amount: Double, voltage: Double): Double = { - conversionBuffer += amount - 0.0 - } - - @Optional.Method(modid = Mods.IDs.IndustrialCraft2) - def getDemandedEnergy: Double = { - if (!useIndustrialCraft2Power) 0.0 - else if (conversionBuffer < energyThroughput * Settings.get.tickFrequency) - math.min(EnumFacing.VALUES.map(globalDemand).max, Power.toEU(energyThroughput)) - else 0 - } -} diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/RedstoneFlux.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/RedstoneFlux.scala deleted file mode 100644 index 08efe9af1..000000000 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/RedstoneFlux.scala +++ /dev/null @@ -1,30 +0,0 @@ -package li.cil.oc.common.tileentity.traits.power - -import li.cil.oc.common.asm.Injectable -import li.cil.oc.integration.Mods -import li.cil.oc.integration.util.Power -import net.minecraft.util.EnumFacing -import net.minecraftforge.fml.common.Optional - -@Injectable.Interface(value = "cofh.api.energy.IEnergyReceiver", modid = Mods.IDs.CoFHEnergy) -trait RedstoneFlux extends Common { - // IEnergyReceiver - - @Optional.Method(modid = Mods.IDs.CoFHEnergy) - def receiveEnergy(from: EnumFacing, maxReceive: Int, simulate: Boolean): Int = - if (!Mods.CoFHEnergy.isAvailable) 0 - else Power.toRF(tryChangeBuffer(from, Power.fromRF(maxReceive), !simulate)) - - // IEnergyHandler - - @Optional.Method(modid = Mods.IDs.CoFHEnergy) - def getEnergyStored(from: EnumFacing): Int = Power.toRF(globalBuffer(from)) - - @Optional.Method(modid = Mods.IDs.CoFHEnergy) - def getMaxEnergyStored(from: EnumFacing): Int = Power.toRF(globalBufferSize(from)) - - // IEnergyConnection - - @Optional.Method(modid = Mods.IDs.CoFHEnergy) - def canConnectEnergy(from: EnumFacing): Boolean = Mods.CoFHEnergy.isAvailable && canConnectPower(from) -} diff --git a/src/main/scala/li/cil/oc/integration/Mods.scala b/src/main/scala/li/cil/oc/integration/Mods.scala index 6db6a3fbc..a13686b0e 100644 --- a/src/main/scala/li/cil/oc/integration/Mods.scala +++ b/src/main/scala/li/cil/oc/integration/Mods.scala @@ -30,7 +30,6 @@ object Mods { val Proxies = Array( integration.forestry.ModForestry, - integration.mcmp.ModMCMultiPart, integration.tis3d.ModTIS3D, integration.minecraft.ModMinecraft, diff --git a/src/main/scala/li/cil/oc/integration/jei/LootDiskCyclingRecipeHandler.scala b/src/main/scala/li/cil/oc/integration/jei/LootDiskCyclingRecipeHandler.scala index f0b74f9c4..90ae7f817 100644 --- a/src/main/scala/li/cil/oc/integration/jei/LootDiskCyclingRecipeHandler.scala +++ b/src/main/scala/li/cil/oc/integration/jei/LootDiskCyclingRecipeHandler.scala @@ -19,7 +19,7 @@ import scala.collection.convert.WrapAsJava._ object LootDiskCyclingRecipeHandler extends IRecipeHandler[LootDiskCyclingRecipe] { override def getRecipeClass: Class[LootDiskCyclingRecipe] = classOf[LootDiskCyclingRecipe] - override def getRecipeCategoryUid: String = VanillaRecipeCategoryUid.CRAFTING + def getRecipeCategoryUid: String = VanillaRecipeCategoryUid.CRAFTING override def getRecipeCategoryUid(recipe: LootDiskCyclingRecipe): String = getRecipeCategoryUid @@ -29,9 +29,9 @@ object LootDiskCyclingRecipeHandler extends IRecipeHandler[LootDiskCyclingRecipe class LootDiskCyclingRecipeWrapper(val recipe: LootDiskCyclingRecipe) extends BlankRecipeWrapper with ICraftingRecipeWrapper { - override def getInputs: util.List[util.List[ItemStack]] = List(seqAsJavaList(Loot.disksForCycling), seqAsJavaList(List(api.Items.get(Constants.ItemName.Wrench).createItemStack(1)))) + def getInputs: util.List[util.List[ItemStack]] = List(seqAsJavaList(Loot.disksForCycling), seqAsJavaList(List(api.Items.get(Constants.ItemName.Wrench).createItemStack(1)))) - override def getOutputs: util.List[ItemStack] = Loot.disksForCycling.toList + def getOutputs: util.List[ItemStack] = Loot.disksForCycling.toList override def getIngredients(ingredients: IIngredients): Unit = { ingredients.setInputLists(classOf[ItemStack], getInputs) diff --git a/src/main/scala/li/cil/oc/integration/mcmp/MCMultiPart.scala b/src/main/scala/li/cil/oc/integration/mcmp/MCMultiPart.scala deleted file mode 100644 index ca43865b7..000000000 --- a/src/main/scala/li/cil/oc/integration/mcmp/MCMultiPart.scala +++ /dev/null @@ -1,30 +0,0 @@ -package li.cil.oc.integration.mcmp - -import li.cil.oc.Constants -import li.cil.oc.Settings -import li.cil.oc.api -import mcmultipart.item.PartPlacementWrapper -import mcmultipart.multipart.MultipartRegistry -import net.minecraft.client.renderer.block.model.ModelResourceLocation -import net.minecraftforge.fml.common.FMLCommonHandler -import net.minecraftforge.fml.relauncher.Side - -object MCMultiPart { - final val CableMultipartRawLocation = Settings.resourceDomain + ":" + Constants.BlockName.Cable - final val PrintMultipartRawLocation = Settings.resourceDomain + ":" + Constants.BlockName.Print - - def init(): Unit = { - MultipartRegistry.registerPart(classOf[PartCable], PartFactory.PartTypeCable.toString) - MultipartRegistry.registerPart(classOf[PartPrint], PartFactory.PartTypePrint.toString) - MultipartRegistry.registerPartFactory(PartFactory, PartFactory.PartTypeCable.toString, PartFactory.PartTypePrint.toString) - MultipartRegistry.registerPartConverter(PartConverter) - MultipartRegistry.registerReversePartConverter(PartConverter) - - new PartPlacementWrapper(api.Items.get(Constants.BlockName.Cable).createItemStack(1), PartFactory).register(PartFactory.PartTypeCable.toString) - new PartPlacementWrapper(api.Items.get(Constants.BlockName.Print).createItemStack(1), PartFactory).register(PartFactory.PartTypePrint.toString) - - if (FMLCommonHandler.instance.getSide == Side.CLIENT) { - MCMultiPartClient.init() - } - } -} diff --git a/src/main/scala/li/cil/oc/integration/mcmp/MCMultiPartClient.scala b/src/main/scala/li/cil/oc/integration/mcmp/MCMultiPartClient.scala deleted file mode 100644 index 43e844dc3..000000000 --- a/src/main/scala/li/cil/oc/integration/mcmp/MCMultiPartClient.scala +++ /dev/null @@ -1,29 +0,0 @@ -package li.cil.oc.integration.mcmp - -import li.cil.oc.client.renderer.block.ModelInitialization -import li.cil.oc.client.renderer.block.PrintModel -import net.minecraft.client.renderer.block.model.ModelResourceLocation -import net.minecraftforge.client.event.ModelBakeEvent -import net.minecraftforge.common.MinecraftForge -import net.minecraftforge.fml.common.eventhandler.EventPriority -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent - -object MCMultiPartClient { - final val CableMultipartLocation = new ModelResourceLocation(MCMultiPart.CableMultipartRawLocation, "multipart") - final val PrintMultipartLocation = new ModelResourceLocation(MCMultiPart.PrintMultipartRawLocation, "multipart") - - def init(): Unit = { - MinecraftForge.EVENT_BUS.register(this) - } - - @SubscribeEvent(priority = EventPriority.LOW) - def onModelBake(e: ModelBakeEvent): Unit = { - val registry = e.getModelRegistry - - // Replace default cable model with part model to properly handle connection - // rendering to multipart cables. - registry.putObject(ModelInitialization.CableBlockLocation, PartCableModel) - registry.putObject(CableMultipartLocation, PartCableModel) - registry.putObject(PrintMultipartLocation, PrintModel) - } -} diff --git a/src/main/scala/li/cil/oc/integration/mcmp/ModMCMultiPart.scala b/src/main/scala/li/cil/oc/integration/mcmp/ModMCMultiPart.scala deleted file mode 100644 index 5d2aa6a16..000000000 --- a/src/main/scala/li/cil/oc/integration/mcmp/ModMCMultiPart.scala +++ /dev/null @@ -1,12 +0,0 @@ -package li.cil.oc.integration.mcmp - -import li.cil.oc.integration.ModProxy -import li.cil.oc.integration.Mods - -object ModMCMultiPart extends ModProxy { - override def getMod = Mods.MCMultiPart - - override def initialize(): Unit = { - MCMultiPart.init() - } -} diff --git a/src/main/scala/li/cil/oc/integration/mcmp/PartCable.scala b/src/main/scala/li/cil/oc/integration/mcmp/PartCable.scala deleted file mode 100644 index 3bac4f7b3..000000000 --- a/src/main/scala/li/cil/oc/integration/mcmp/PartCable.scala +++ /dev/null @@ -1,265 +0,0 @@ -package li.cil.oc.integration.mcmp - -import java.util - -import com.google.common.base.Predicate -import li.cil.oc.Constants -import li.cil.oc.api -import li.cil.oc.api.internal.Colored -import li.cil.oc.api.network.Environment -import li.cil.oc.api.network.Message -import li.cil.oc.api.network.Node -import li.cil.oc.common.block.Cable -import li.cil.oc.common.block.property -import li.cil.oc.common.capabilities.Capabilities -import li.cil.oc.common.tileentity -import li.cil.oc.util.Color -import mcmultipart.capabilities.ISlottedCapabilityProvider -import mcmultipart.multipart._ -import mcmultipart.raytrace.PartMOP -import net.minecraft.block.material.Material -import net.minecraft.block.state.BlockStateContainer -import net.minecraft.block.state.IBlockState -import net.minecraft.entity.Entity -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.item.ItemStack -import net.minecraft.nbt.NBTTagCompound -import net.minecraft.network.PacketBuffer -import net.minecraft.tileentity.TileEntity -import net.minecraft.util.EnumFacing -import net.minecraft.util.EnumHand -import net.minecraft.util.ResourceLocation -import net.minecraft.util.math.AxisAlignedBB -import net.minecraftforge.common.capabilities.Capability -import net.minecraftforge.common.property.ExtendedBlockState -import net.minecraftforge.common.property.IExtendedBlockState - -import scala.collection.convert.WrapAsScala._ - -class PartCable extends Multipart with ISlottedPart with INormallyOccludingPart with ISlottedCapabilityProvider with Environment with Colored { - final val CableDefinition = api.Items.get(Constants.BlockName.Cable) - final val CableBlock = CableDefinition.block() - - val wrapped = new tileentity.Cable() - - // ----------------------------------------------------------------------- // - // Environment - - override def node = wrapped.node - - override def onMessage(message: Message) = wrapped.onMessage(message) - - override def onConnect(node: Node) = wrapped.onConnect(node) - - override def onDisconnect(node: Node) = wrapped.onDisconnect(node) - - // ----------------------------------------------------------------------- // - // Colored - - override def getColor = wrapped.getColor - - override def setColor(value: Int): Unit = { - if (value != getColor) { - wrapped.setColor(value) - if (getWorld != null && !getWorld.isRemote) { - sendUpdatePacket(true) - } - } - } - - override def controlsConnectivity = wrapped.controlsConnectivity - - // ----------------------------------------------------------------------- // - // ISlottedPart - - override def getSlotMask: util.EnumSet[PartSlot] = util.EnumSet.of(PartSlot.CENTER) - - // ----------------------------------------------------------------------- // - // IOccludingPart - - override def addOcclusionBoxes(list: util.List[AxisAlignedBB]): Unit = list.add(Cable.DefaultBounds) - - // ----------------------------------------------------------------------- // - // ISlottedCapabilityProvider - - override def hasCapability(capability: Capability[_], slot: PartSlot, facing: EnumFacing): Boolean = { - capability == Capabilities.EnvironmentCapability && canConnect(facing) - } - - override def getCapability[T](capability: Capability[T], slot: PartSlot, facing: EnumFacing): T = { - if (capability == Capabilities.EnvironmentCapability && canConnect(facing)) this.asInstanceOf[T] - else null.asInstanceOf[T] - } - - override def hasCapability(capability: Capability[_], facing: EnumFacing): Boolean = { - (capability == Capabilities.ColoredCapability) || super.hasCapability(capability, facing) - } - - override def getCapability[T](capability: Capability[T], facing: EnumFacing): T = { - if (capability == Capabilities.ColoredCapability) this.asInstanceOf[T] - else super.getCapability(capability, facing) - } - - private def canConnect(facing: EnumFacing) = { - val self = this - val isThis = new Predicate[IMultipart] { - override def apply(input: IMultipart): Boolean = input == self - } - OcclusionHelper.slotOcclusionTest(PartSlot.getFaceSlot(facing), isThis, getContainer.getParts) && - OcclusionHelper.occlusionTest(OcclusionHelper.boxes(Cable.CachedBounds(Cable.mask(facing))), isThis, getContainer.getParts) - } - - // ----------------------------------------------------------------------- // - // IMultipart - - override def addSelectionBoxes(list: util.List[AxisAlignedBB]): Unit = { - if (getWorld != null) { - list.add(Cable.bounds(getWorld, getPos)) - } - } - - override def addCollisionBoxes(mask: AxisAlignedBB, list: util.List[AxisAlignedBB], collidingEntity: Entity): Unit = { - if (getWorld != null) { - val bounds = Cable.bounds(getWorld, getPos) - if (bounds.intersectsWith(mask)) list.add(bounds) - } - } - - override def getPickBlock(player: EntityPlayer, hit: PartMOP): ItemStack = wrapped.createItemStack() - - override def getDrops: util.List[ItemStack] = util.Arrays.asList(wrapped.createItemStack()) - - override def getHardness(hit: PartMOP): Float = CableBlock.getBlockHardness(MultipartRegistry.getDefaultState(this).getBaseState, getWorld, getPos) - - override def getMaterial: Material = CableBlock.getMaterial(MultipartRegistry.getDefaultState(this).getBaseState) - - override def isToolEffective(toolType: String, level: Int): Boolean = CableBlock.isToolEffective(toolType, getWorld.getBlockState(getPos)) - - // ----------------------------------------------------------------------- // - - override def getModelPath = new ResourceLocation(MCMultiPart.CableMultipartRawLocation) - - override def createBlockState(): BlockStateContainer = new ExtendedBlockState(CableBlock, Array.empty, Array(property.PropertyTile.Tile)) - - override def getExtendedState(state: IBlockState): IBlockState = - state match { - case extendedState: IExtendedBlockState => - wrapped.setWorldObj(getWorld) - wrapped.setPos(getPos) - extendedState.withProperty(property.PropertyTile.Tile, wrapped) - case _ => state - } - - override def onPartChanged(part: IMultipart): Unit = { - super.onPartChanged(part) - if (getWorld.isRemote) { - markRenderUpdate() - } else { - // This is a bit meh... when a previously valid connection to a neighbor of - // a multipart tile becomes invalid due to a new, occluding part, we can't - // access the now occluded node anymore, so we can't just disconnect it from - // it's neighbor. So instead we get the old list of neighbor nodes and kill - // every connection for which we can't find a currently valid neighbor. - val mask = Cable.neighbors(getWorld, getPos) - val neighbors = EnumFacing.VALUES.filter(side => (mask & (1 << side.getIndex)) != 0).map(side => { - val neighborPos = getPos.offset(side) - val neighborTile = getWorld.getTileEntity(neighborPos) - if (neighborTile == null || !canConnect(side)) null - else if (neighborTile.hasCapability(Capabilities.SidedEnvironmentCapability, side.getOpposite)) { - val host = neighborTile.getCapability(Capabilities.SidedEnvironmentCapability, side.getOpposite) - if (host != null) host.sidedNode(side.getOpposite) - else null - } - else if (neighborTile.hasCapability(Capabilities.EnvironmentCapability, side.getOpposite)) { - val host = neighborTile.getCapability(Capabilities.EnvironmentCapability, side.getOpposite) - if (host != null) host.node - else null - } - else null - }).filter(_ != null).toSet - for (neighborNode <- node.neighbors.toSeq) { - if (!neighbors.contains(neighborNode)) { - node.disconnect(neighborNode) - } - } - api.Network.joinOrCreateNetwork(getWorld, getPos) - } - } - - override def onAdded(): Unit = { - super.onAdded() - wrapped.setWorldObj(getWorld) - wrapped.setPos(getPos) - wrapped.validate() - } - - override def onRemoved(): Unit = { - super.onRemoved() - wrapped.invalidate() - wrapped.setWorldObj(null) - wrapped.setPos(null) - } - - override def onLoaded(): Unit = { - super.onLoaded() - wrapped.setWorldObj(getWorld) - wrapped.setPos(getPos) - wrapped.validate() - } - - override def onUnloaded(): Unit = { - super.onUnloaded() - wrapped.onChunkUnload() - wrapped.setWorldObj(null) - wrapped.setPos(null) - } - - override def onConverted(tile: TileEntity): Unit = { - super.onConverted(tile) - tile match { - case cable: tileentity.Cable => - wrapped.setColor(cable.getColor) - case _ => - } - wrapped.setWorldObj(getWorld) - wrapped.setPos(getPos) - wrapped.validate() - } - - // ----------------------------------------------------------------------- // - - override def onActivated(player: EntityPlayer, hand: EnumHand, heldItem: ItemStack, hit: PartMOP): Boolean = { - if (Color.isDye(heldItem)) { - setColor(Color.rgbValues(Color.dyeColor(heldItem))) - markDirty() - if (!player.capabilities.isCreativeMode && wrapped.consumesDye) { - heldItem.splitStack(1) - } - true - } - else super.onActivated(player, hand, heldItem, hit) - } - - // ----------------------------------------------------------------------- // - - override def writeToNBT(tag: NBTTagCompound): NBTTagCompound = { - super.writeToNBT(tag) - wrapped.writeToNBT(tag) - tag - } - - override def readFromNBT(tag: NBTTagCompound): Unit = { - super.readFromNBT(tag) - wrapped.readFromNBT(tag) - } - - override def writeUpdatePacket(buf: PacketBuffer): Unit = { - super.writeUpdatePacket(buf) - buf.writeInt(getColor) - } - - override def readUpdatePacket(buf: PacketBuffer): Unit = { - super.readUpdatePacket(buf) - setColor(buf.readInt()) - } -} diff --git a/src/main/scala/li/cil/oc/integration/mcmp/PartCableModel.scala b/src/main/scala/li/cil/oc/integration/mcmp/PartCableModel.scala deleted file mode 100644 index 8f29cab3a..000000000 --- a/src/main/scala/li/cil/oc/integration/mcmp/PartCableModel.scala +++ /dev/null @@ -1,18 +0,0 @@ -package li.cil.oc.integration.mcmp - -import li.cil.oc.client.renderer.block.CableModel -import li.cil.oc.util.BlockPosition -import mcmultipart.multipart.MultipartHelper -import mcmultipart.multipart.PartSlot - -object PartCableModel extends CableModel { - override protected def isCable(pos: BlockPosition): Boolean = super.isCable(pos) || (pos.world match { - case Some(world) => - val container = MultipartHelper.getPartContainer(world, pos.toBlockPos) - (container != null) && (container.getPartInSlot(PartSlot.CENTER) match { - case cable: PartCable => true - case _ => false - }) - case _ => false - }) -} diff --git a/src/main/scala/li/cil/oc/integration/mcmp/PartConverter.scala b/src/main/scala/li/cil/oc/integration/mcmp/PartConverter.scala deleted file mode 100644 index 2e6a9ba3d..000000000 --- a/src/main/scala/li/cil/oc/integration/mcmp/PartConverter.scala +++ /dev/null @@ -1,88 +0,0 @@ -package li.cil.oc.integration.mcmp - -import java.util -import java.util.Collections - -import li.cil.oc.Constants -import li.cil.oc.api -import li.cil.oc.common.EventHandler -import li.cil.oc.common.tileentity.Cable -import li.cil.oc.common.tileentity.Print -import li.cil.oc.server.PacketSender -import mcmultipart.multipart.IMultipart -import mcmultipart.multipart.IMultipartContainer -import mcmultipart.multipart.IPartConverter -import mcmultipart.multipart.IReversePartConverter -import net.minecraft.block.Block -import net.minecraft.nbt.NBTTagCompound -import net.minecraft.util.math.BlockPos -import net.minecraft.world.IBlockAccess - -import scala.collection.convert.WrapAsScala._ - -object PartConverter extends IPartConverter with IReversePartConverter { - final lazy val CableBlock = api.Items.get(Constants.BlockName.Cable).block() - final lazy val PrintBlock = api.Items.get(Constants.BlockName.Print).block() - - override def getConvertableBlocks: util.Collection[Block] = util.Arrays.asList(CableBlock, PrintBlock) - - override def convertBlock(world: IBlockAccess, pos: BlockPos, simulated: Boolean): util.Collection[_ <: IMultipart] = { - world.getTileEntity(pos) match { - case tileEntity: Cable => - val part = new PartCable() - part.setColor(tileEntity.getColor) - if (!simulated && tileEntity.node != null && part.node != null) { - // Immediately connect node to avoid short disconnect. - for (node <- tileEntity.node.neighbors) { - node.connect(part.node) - } - } - Collections.singletonList(part) - case tileEntity: Print => - val part = new PartPrint() - val nbt = new NBTTagCompound() - tileEntity.writeToNBTForServer(nbt) - part.wrapped.readFromNBTForServer(nbt) - Collections.singletonList(part) - case _ => Collections.emptyList() - } - } - - override def convertToBlock(container: IMultipartContainer): Boolean = { - val world = container.getWorldIn - val pos = container.getPosIn - val parts = container.getParts - (parts.size() == 1) && (parts.iterator().next() match { - case part: PartCable => - val color = part.getColor - world.setBlockToAir(pos) - world.setBlockState(pos, CableBlock.getDefaultState) - world.getTileEntity(pos) match { - case tileEntity: Cable => - tileEntity.setColor(color) - EventHandler.scheduleServer(() => PacketSender.sendColorChange(tileEntity)) // HACKS! - case _ => - } - // Immediately connect node to avoid short disconnect. - api.Network.joinOrCreateNetwork(world, pos) - // Required to dispose the old node because invalidate isn't forwarded to parts. - // Can't use removePart because if the list is empty when this returns, MCMP - // will tell MC that the block was removed so MC will set it to air. - part.wrapped.invalidate() - true - case part: PartPrint => - val nbt = new NBTTagCompound() - part.wrapped.writeToNBTForServer(nbt) - world.setBlockToAir(pos) - world.setBlockState(pos, PrintBlock.getDefaultState) - world.getTileEntity(pos) match { - case tileEntity: Print => - tileEntity.readFromNBTForServer(nbt) - case _ => - } - true - case _ => - false - }) - } -} diff --git a/src/main/scala/li/cil/oc/integration/mcmp/PartFactory.scala b/src/main/scala/li/cil/oc/integration/mcmp/PartFactory.scala deleted file mode 100644 index a200f6150..000000000 --- a/src/main/scala/li/cil/oc/integration/mcmp/PartFactory.scala +++ /dev/null @@ -1,61 +0,0 @@ -package li.cil.oc.integration.mcmp - -import li.cil.oc.Constants -import li.cil.oc.Settings -import li.cil.oc.api -import li.cil.oc.common.item.data.PrintData -import li.cil.oc.integration.Mods -import mcmultipart.item.IItemMultipartFactory -import mcmultipart.multipart.IMultipart -import mcmultipart.multipart.IPartFactory -import mcmultipart.multipart.MultipartHelper -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.item.ItemStack -import net.minecraft.util.EnumFacing -import net.minecraft.util.ResourceLocation -import net.minecraft.util.math.BlockPos -import net.minecraft.util.math.Vec3d -import net.minecraft.world.World - -import scala.collection.convert.WrapAsScala._ - -object PartFactory extends IPartFactory with IItemMultipartFactory { - final val PartTypeCable = new ResourceLocation(Mods.IDs.OpenComputers + ":" + Constants.BlockName.Cable) - final val PartTypePrint = new ResourceLocation(Mods.IDs.OpenComputers + ":" + Constants.BlockName.Print) - - final lazy val CableDescriptor = api.Items.get(Constants.BlockName.Cable) - final lazy val PrintDescriptor = api.Items.get(Constants.BlockName.Print) - - override def createPart(partType: ResourceLocation, client: Boolean): IMultipart = { - if (partType == PartTypeCable) new PartCable() - else if (partType == PartTypePrint) new PartPrint() - else null - } - - override def createPart(world: World, pos: BlockPos, side: EnumFacing, hit: Vec3d, stack: ItemStack, player: EntityPlayer): IMultipart = { - val descriptor = api.Items.get(stack) - if (descriptor == CableDescriptor) new PartCable() - else if (descriptor == PrintDescriptor && canAddPrint(world, pos, stack)) { - val part = new PartPrint() - part.wrapped.data.load(stack) - part.wrapped.setFromEntityPitchAndYaw(player) - if (!part.wrapped.validFacings.contains(part.wrapped.pitch)) { - part.wrapped.pitch = part.wrapped.validFacings.headOption.getOrElse(EnumFacing.NORTH) - } - part.wrapped.invertRotation() - part - } - else null - } - - private def canAddPrint(world: World, pos: BlockPos, stack: ItemStack): Boolean = { - val container = MultipartHelper.getPartContainer(world, pos) - container == null || { - val complexity = container.getParts.collect { - case print: PartPrint => print.wrapped.data.complexity - }.sum - val data = new PrintData(stack) - data.complexity + complexity <= Settings.get.maxPrintComplexity - } - } -} diff --git a/src/main/scala/li/cil/oc/integration/mcmp/PartPrint.scala b/src/main/scala/li/cil/oc/integration/mcmp/PartPrint.scala deleted file mode 100644 index 17ef1c709..000000000 --- a/src/main/scala/li/cil/oc/integration/mcmp/PartPrint.scala +++ /dev/null @@ -1,200 +0,0 @@ -package li.cil.oc.integration.mcmp - -import java.util - -import li.cil.oc.Constants -import li.cil.oc.api -import li.cil.oc.common.EventHandler -import li.cil.oc.common.block.property -import li.cil.oc.common.tileentity -import mcmultipart.multipart.INormallyOccludingPart -import mcmultipart.multipart.IRedstonePart -import mcmultipart.multipart.Multipart -import mcmultipart.multipart.MultipartRegistry -import mcmultipart.raytrace.PartMOP -import net.minecraft.block.Block -import net.minecraft.block.material.Material -import net.minecraft.block.state.BlockStateContainer -import net.minecraft.block.state.IBlockState -import net.minecraft.entity.Entity -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.item.ItemStack -import net.minecraft.nbt.NBTTagCompound -import net.minecraft.network.PacketBuffer -import net.minecraft.tileentity.TileEntity -import net.minecraft.util.BlockRenderLayer -import net.minecraft.util.EnumFacing -import net.minecraft.util.EnumHand -import net.minecraft.util.ResourceLocation -import net.minecraft.util.math.AxisAlignedBB -import net.minecraftforge.common.property.ExtendedBlockState -import net.minecraftforge.common.property.IExtendedBlockState - -class PartPrint extends Multipart with INormallyOccludingPart with IRedstonePart { - final val PrintDefinition = api.Items.get(Constants.BlockName.Print) - final val PrintBlock = PrintDefinition.block() - - val wrapped = new tileentity.Print(canToggle _, scheduleUpdate _, onStateChange _) - - def canToggle: Boolean = getWorld != null && !getWorld.isRemote && { - val toggled = new PartPrint() - val nbt = new NBTTagCompound() - wrapped.writeToNBTForServer(nbt) - toggled.wrapped.readFromNBTForServer(nbt) - toggled.wrapped.state = !wrapped.state - getContainer.canReplacePart(this, toggled) - } - - def scheduleUpdate(delay: Int): Unit = { - EventHandler.scheduleServer(() => { - if (wrapped.state) wrapped.toggleState() - if (wrapped.state) scheduleUpdate(delay) - }, delay) - } - - def onStateChange(): Unit = { - notifyPartUpdate() - sendUpdatePacket(true) - } - - // ----------------------------------------------------------------------- // - // IRedstonePart - - override def canConnectRedstone(side: EnumFacing): Boolean = true - - override def getStrongSignal(side: EnumFacing): Int = getWeakSignal(side) - - override def getWeakSignal(side: EnumFacing): Int = wrapped.output(side) - - // ----------------------------------------------------------------------- // - // IOccludingPart - - override def addOcclusionBoxes(list: util.List[AxisAlignedBB]): Unit = wrapped.addCollisionBoxesToList(null, list) - - // ----------------------------------------------------------------------- // - // IMultipart - - override def addSelectionBoxes(list: util.List[AxisAlignedBB]): Unit = wrapped.addCollisionBoxesToList(null, list) - - override def addCollisionBoxes(mask: AxisAlignedBB, list: util.List[AxisAlignedBB], collidingEntity: Entity): Unit = { - if (getWorld != null) { - wrapped.addCollisionBoxesToList(mask, list) - } - } - - override def getLightValue: Int = wrapped.data.lightLevel - - override def getPickBlock(player: EntityPlayer, hit: PartMOP): ItemStack = wrapped.data.createItemStack() - - override def getDrops: util.List[ItemStack] = util.Arrays.asList(wrapped.data.createItemStack()) - - override def getHardness(hit: PartMOP): Float = PrintBlock.getBlockHardness(MultipartRegistry.getDefaultState(this).getBaseState, getWorld, getPos) - - override def getMaterial: Material = PrintBlock.getMaterial(MultipartRegistry.getDefaultState(this).getBaseState) - - override def isToolEffective(toolType: String, level: Int): Boolean = PrintBlock.isToolEffective(toolType, getWorld.getBlockState(getPos)) - - // ----------------------------------------------------------------------- // - - override def getModelPath = new ResourceLocation(MCMultiPart.PrintMultipartRawLocation) - - override def canRenderInLayer(layer: BlockRenderLayer): Boolean = layer == BlockRenderLayer.CUTOUT_MIPPED - - override def createBlockState(): BlockStateContainer = new ExtendedBlockState(PrintBlock, Array.empty, Array(property.PropertyTile.Tile)) - - override def getExtendedState(state: IBlockState): IBlockState = - state match { - case extendedState: IExtendedBlockState => - wrapped.setWorldObj(getWorld) - wrapped.setPos(getPos) - extendedState.withProperty(property.PropertyTile.Tile, wrapped) - case _ => state - } - - // ----------------------------------------------------------------------- // - - override def onNeighborBlockChange(block: Block): Unit = { - EnumFacing.values().foreach(wrapped.updateRedstoneInput) - } - - override def onAdded(): Unit = { - super.onAdded() - initialize() - } - - override def onRemoved(): Unit = { - super.onRemoved() - wrapped.invalidate() - wrapped.setWorldObj(null) - wrapped.setPos(null) - } - - override def onLoaded(): Unit = { - super.onLoaded() - initialize() - } - - override def onUnloaded(): Unit = { - super.onUnloaded() - wrapped.onChunkUnload() - wrapped.setWorldObj(null) - wrapped.setPos(null) - } - - override def onConverted(tile: TileEntity): Unit = { - super.onConverted(tile) - tile match { - case print: tileentity.Print => - val nbt = new NBTTagCompound() - print.writeToNBTForServer(nbt) - wrapped.readFromNBTForServer(nbt) - case _ => - } - initialize() - } - - private def initialize(): Unit = { - wrapped.setWorldObj(getWorld) - wrapped.setPos(getPos) - wrapped.validate() - wrapped.updateRedstone() - - if (wrapped.state && wrapped.data.isButtonMode) { - scheduleUpdate(PrintBlock.tickRate(getWorld)) - } - } - - // ----------------------------------------------------------------------- // - - override def onActivated(player: EntityPlayer, hand: EnumHand, heldItem: ItemStack, hit: PartMOP): Boolean = { - wrapped.activate() - } - - // ----------------------------------------------------------------------- // - - override def writeToNBT(tag: NBTTagCompound): NBTTagCompound = { - super.writeToNBT(tag) - wrapped.writeToNBT(tag) - tag - } - - override def readFromNBT(tag: NBTTagCompound): Unit = { - super.readFromNBT(tag) - wrapped.readFromNBT(tag) - } - - override def writeUpdatePacket(buf: PacketBuffer): Unit = { - super.writeUpdatePacket(buf) - val nbt = new NBTTagCompound() - wrapped.writeToNBTForClient(nbt) - buf.writeNBTTagCompoundToBuffer(nbt) - } - - override def readUpdatePacket(buf: PacketBuffer): Unit = { - super.readUpdatePacket(buf) - wrapped.setWorldObj(getWorld) - wrapped.setPos(getPos) - val nbt = buf.readNBTTagCompoundFromBuffer() - wrapped.readFromNBTForClient(nbt) - } -} diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/DriverRedstoneCard.scala b/src/main/scala/li/cil/oc/integration/opencomputers/DriverRedstoneCard.scala index c856b60e3..8ca2a01bd 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/DriverRedstoneCard.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/DriverRedstoneCard.scala @@ -12,7 +12,6 @@ import li.cil.oc.common.item.Delegator import li.cil.oc.common.tileentity.traits.BundledRedstoneAware import li.cil.oc.common.tileentity.traits.RedstoneAware import li.cil.oc.integration.util.BundledRedstone -import li.cil.oc.integration.util.WirelessRedstone import li.cil.oc.server.component import net.minecraft.item.ItemStack @@ -26,17 +25,12 @@ object DriverRedstoneCard extends Item with HostAware { else { val isAdvanced = tier(stack) == Tier.Two val hasBundled = BundledRedstone.isAvailable && isAdvanced - val hasWireless = WirelessRedstone.isAvailable && isAdvanced host match { case redstone: BundledRedstoneAware if hasBundled => - if (hasWireless) new component.Redstone.BundledWireless(redstone) - else new component.Redstone.Bundled(redstone) + new component.Redstone.Bundled(redstone) case redstone: RedstoneAware => - if (hasWireless) new component.Redstone.VanillaWireless(redstone) - else new component.Redstone.Vanilla(redstone) - case _ => - if (hasWireless) new component.Redstone.Wireless(host) - else null + new component.Redstone.Vanilla(redstone) + case _ => null } } @@ -53,10 +47,8 @@ object DriverRedstoneCard extends Item with HostAware { if (worksWith(stack)) { val isAdvanced = tier(stack) == Tier.Two val hasBundled = BundledRedstone.isAvailable && isAdvanced - val hasWireless = WirelessRedstone.isAvailable && isAdvanced if (hasBundled) { - if (hasWireless) classOf[component.Redstone.BundledWireless] - else classOf[component.Redstone.Bundled] + classOf[component.Redstone.Bundled] } else { classOf[component.Redstone.Vanilla] diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala b/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala index 10037d073..6db558820 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala @@ -37,7 +37,6 @@ import li.cil.oc.integration.ModProxy import li.cil.oc.integration.Mods import li.cil.oc.integration.util.BundledRedstone import li.cil.oc.integration.util.ItemBlacklist -import li.cil.oc.integration.util.WirelessRedstone import li.cil.oc.server.machine.luac.LuaStateFactory import li.cil.oc.server.machine.luac.NativeLua53Architecture import li.cil.oc.server.network.Waypoints @@ -294,15 +293,10 @@ object ModOpenComputers extends ModProxy { Constants.ItemName.LeashUpgrade, Constants.ItemName.TradingUpgrade) - if (!WirelessRedstone.isAvailable) { - blacklistHost(classOf[internal.Drone], Constants.ItemName.RedstoneCardTier2) - blacklistHost(classOf[internal.Tablet], Constants.ItemName.RedstoneCardTier2) - } - // Note: kinda nasty, but we have to check for availability for extended // redstone mods after integration init, so we have to set tier two // redstone card availability here, after all other mods were inited. - if (BundledRedstone.isAvailable || WirelessRedstone.isAvailable) { + if (BundledRedstone.isAvailable) { OpenComputers.log.info("Found extended redstone mods, enabling tier two redstone card.") Delegator.subItem(api.Items.get(Constants.ItemName.RedstoneCardTier2).createItemStack(1)) match { case Some(redstone: RedstoneCard) => redstone.showInItemList = true diff --git a/src/main/scala/li/cil/oc/integration/util/BundledRedstone.scala b/src/main/scala/li/cil/oc/integration/util/BundledRedstone.scala index 998650f3a..d133bd8f5 100644 --- a/src/main/scala/li/cil/oc/integration/util/BundledRedstone.scala +++ b/src/main/scala/li/cil/oc/integration/util/BundledRedstone.scala @@ -12,7 +12,7 @@ object BundledRedstone { def addProvider(provider: RedstoneProvider): Unit = providers += provider - def isAvailable = Mods.MineFactoryReloaded.isAvailable || providers.nonEmpty + def isAvailable = providers.nonEmpty def computeInput(pos: BlockPosition, side: EnumFacing): Int = { if (pos.world.get.blockExists(pos.offset(side))) diff --git a/src/main/scala/li/cil/oc/integration/util/PortalGun.scala b/src/main/scala/li/cil/oc/integration/util/PortalGun.scala deleted file mode 100644 index 9848aef4f..000000000 --- a/src/main/scala/li/cil/oc/integration/util/PortalGun.scala +++ /dev/null @@ -1,21 +0,0 @@ -package li.cil.oc.integration.util - -import li.cil.oc.integration.Mods -import net.minecraft.item.ItemStack - -object PortalGun { - private lazy val portalGunClass = try { - Class.forName("portalgun.common.item.ItemPortalGun") - } - catch { - case _: Throwable => null - } - - def isPortalGun(stack: ItemStack) = - stack != null && stack.getCount > 0 && - Mods.PortalGun.isAvailable && - portalGunClass != null && - portalGunClass.isAssignableFrom(stack.getItem.getClass) - - def isStandardPortalGun(stack: ItemStack) = isPortalGun(stack) && stack.getItemDamage == 0 -} diff --git a/src/main/scala/li/cil/oc/integration/util/Waila.scala b/src/main/scala/li/cil/oc/integration/util/Waila.scala deleted file mode 100644 index 179b28ea0..000000000 --- a/src/main/scala/li/cil/oc/integration/util/Waila.scala +++ /dev/null @@ -1,10 +0,0 @@ -package li.cil.oc.integration.util - -import li.cil.oc.integration.Mods - -object Waila { - // This is used to check if certain data actually has to be saved in - // writeToNBT calls. For some stuff we write lots of data (e.g. computer - // state), and we want to avoid that when Waila is calling us. - def isSavingForTooltip = Mods.Waila.isAvailable && new Exception().getStackTrace.exists(_.getClassName.startsWith("mcp.mobius.waila")) -} diff --git a/src/main/scala/li/cil/oc/integration/util/WirelessRedstone.scala b/src/main/scala/li/cil/oc/integration/util/WirelessRedstone.scala deleted file mode 100644 index 806942ab2..000000000 --- a/src/main/scala/li/cil/oc/integration/util/WirelessRedstone.scala +++ /dev/null @@ -1,50 +0,0 @@ -package li.cil.oc.integration.util - -import li.cil.oc.server.component.RedstoneWireless - -import scala.collection.mutable - -object WirelessRedstone { - val systems = mutable.Set.empty[WirelessRedstoneSystem] - - def isAvailable = systems.nonEmpty - - def addReceiver(rs: RedstoneWireless) { - systems.foreach(system => try system.addReceiver(rs) catch { - case _: Throwable => // Ignore - }) - } - - def removeReceiver(rs: RedstoneWireless) { - systems.foreach(system => try system.removeReceiver(rs) catch { - case _: Throwable => // Ignore - }) - } - - def updateOutput(rs: RedstoneWireless) { - systems.foreach(system => try system.updateOutput(rs) catch { - case _: Throwable => // Ignore - }) - } - - def removeTransmitter(rs: RedstoneWireless) { - systems.foreach(system => try system.removeTransmitter(rs) catch { - case _: Throwable => // Ignore - }) - } - - def getInput(rs: RedstoneWireless) = systems.exists(_.getInput(rs)) - - trait WirelessRedstoneSystem { - def addReceiver(rs: RedstoneWireless) - - def removeReceiver(rs: RedstoneWireless) - - def updateOutput(rs: RedstoneWireless) - - def removeTransmitter(rs: RedstoneWireless) - - def getInput(rs: RedstoneWireless): Boolean - } - -} diff --git a/src/main/scala/li/cil/oc/server/agent/Player.scala b/src/main/scala/li/cil/oc/server/agent/Player.scala index 5d89c182e..82a543d3d 100644 --- a/src/main/scala/li/cil/oc/server/agent/Player.scala +++ b/src/main/scala/li/cil/oc/server/agent/Player.scala @@ -10,7 +10,6 @@ import li.cil.oc.api.internal import li.cil.oc.api.network.Connector import li.cil.oc.common.EventHandler import li.cil.oc.integration.Mods -import li.cil.oc.integration.util.PortalGun import li.cil.oc.util.BlockPosition import li.cil.oc.util.InventoryUtils import net.minecraft.block.Block @@ -102,13 +101,7 @@ class Player(val agent: internal.Agent) extends FakePlayer(agent.world.asInstanc setSize(1, 1) - { - val inventory = new Inventory(agent) - if (Mods.BattleGear2.isAvailable) { - ObfuscationReflectionHelper.setPrivateValue(classOf[EntityPlayer], this, inventory, "inventory", "field_71071_by", "bm") - } - else this.inventory = inventory - } + this.inventory = new Inventory(agent) var facing, side = EnumFacing.SOUTH @@ -194,10 +187,8 @@ class Player(val agent: internal.Agent) extends FakePlayer(agent.world.asInstanc } val item = if (stack != null) stack.getItem else null - if (!PortalGun.isPortalGun(stack)) { - if (item != null && item.onItemUseFirst(this, world, pos, side, hitX, hitY, hitZ, EnumHand.MAIN_HAND) == EnumActionResult.SUCCESS) { - return ActivationType.ItemUsed - } + if (item != null && item.onItemUseFirst(this, world, pos, side, hitX, hitY, hitZ, EnumHand.MAIN_HAND) == EnumActionResult.SUCCESS) { + return ActivationType.ItemUsed } val state = world.getBlockState(pos) @@ -275,7 +266,7 @@ class Player(val agent: internal.Agent) extends FakePlayer(agent.world.asInstanc def sizeOrDamageChanged = newStack.getCount != oldSize || newStack.getItemDamage != oldDamage def tagChanged = (oldData == null && newStack.hasTagCompound) || (oldData != null && !newStack.hasTagCompound) || (oldData != null && newStack.hasTagCompound && !oldData.equals(newStack.getTagCompound)) - val stackChanged = newStack != stack || (newStack != null && (sizeOrDamageChanged || tagChanged || PortalGun.isStandardPortalGun(stack))) + val stackChanged = newStack != stack || (newStack != null && (sizeOrDamageChanged || tagChanged)) if (stackChanged) { agent.equipmentInventory.setInventorySlotContents(0, newStack) } @@ -403,9 +394,7 @@ class Player(val agent: internal.Agent) extends FakePlayer(agent.world.asInstanc } private def isItemUseAllowed(stack: ItemStack) = stack == null || { - (Settings.get.allowUseItemsWithDuration || stack.getMaxItemUseDuration <= 0) && - (!PortalGun.isPortalGun(stack) || PortalGun.isStandardPortalGun(stack)) && - !stack.isItemEqual(new ItemStack(Items.LEAD)) + (Settings.get.allowUseItemsWithDuration || stack.getMaxItemUseDuration <= 0) && !stack.isItemEqual(new ItemStack(Items.LEAD)) } override def dropItem(stack: ItemStack, dropAround: Boolean, traceItem: Boolean): EntityItem = diff --git a/src/main/scala/li/cil/oc/server/component/DebugCard.scala b/src/main/scala/li/cil/oc/server/component/DebugCard.scala index 2b7098dd2..8f846c9e0 100644 --- a/src/main/scala/li/cil/oc/server/component/DebugCard.scala +++ b/src/main/scala/li/cil/oc/server/component/DebugCard.scala @@ -46,7 +46,7 @@ import net.minecraftforge.common.util.FakePlayer import net.minecraftforge.common.util.FakePlayerFactory import net.minecraftforge.fluids.FluidRegistry import net.minecraftforge.fluids.FluidStack -import net.minecraftforge.fluids.IFluidHandler +import net.minecraftforge.fluids.capability.IFluidHandler import net.minecraftforge.fml.common.FMLCommonHandler import net.minecraftforge.fml.common.Loader import net.minecraftforge.fml.common.ModAPIManager @@ -129,7 +129,7 @@ class DebugCard(host: EnvironmentHost) extends prefab.ManagedEnvironment with De @Callback(doc = """function():table -- Get a list of currently logged-in players.""") def getPlayers(context: Context, args: Arguments): Array[AnyRef] = { checkAccess() - result(FMLCommonHandler.instance.getMinecraftServerInstance.getAllUsernames) + result(FMLCommonHandler.instance.getMinecraftServerInstance.getOnlinePlayerNames) } @Callback(doc = """function():userdata -- Get the scoreboard object for the world""") @@ -799,7 +799,7 @@ object DebugCard { val position = BlockPosition(args.checkDouble(2), args.checkDouble(3), args.checkDouble(4), world) val side = args.checkSideAny(5) world.getTileEntity(position) match { - case handler: IFluidHandler => result(handler.fill(side, new FluidStack(fluid, amount), true)) + case handler: IFluidHandler => result(handler.fill(new FluidStack(fluid, amount), true)) case _ => result(Unit, "no tank") } } @@ -811,7 +811,7 @@ object DebugCard { val position = BlockPosition(args.checkDouble(1), args.checkDouble(2), args.checkDouble(3), world) val side = args.checkSideAny(4) world.getTileEntity(position) match { - case handler: IFluidHandler => result(handler.drain(side, amount, true)) + case handler: IFluidHandler => result(handler.drain(amount, true)) case _ => result(Unit, "no tank") } } diff --git a/src/main/scala/li/cil/oc/server/component/Redstone.scala b/src/main/scala/li/cil/oc/server/component/Redstone.scala index 93cdd36fd..c1d8d384e 100644 --- a/src/main/scala/li/cil/oc/server/component/Redstone.scala +++ b/src/main/scala/li/cil/oc/server/component/Redstone.scala @@ -1,17 +1,10 @@ package li.cil.oc.server.component -import java.util - -import li.cil.oc.Constants -import li.cil.oc.api.driver.DeviceInfo.DeviceAttribute -import li.cil.oc.api.driver.DeviceInfo.DeviceClass import li.cil.oc.api.network.EnvironmentHost import li.cil.oc.common.tileentity.traits.BundledRedstoneAware import li.cil.oc.common.tileentity.traits.RedstoneAware import li.cil.oc.server.component -import scala.collection.convert.WrapAsJava._ - object Redstone { class Vanilla(val redstone: EnvironmentHost with RedstoneAware) @@ -20,24 +13,4 @@ object Redstone { class Bundled(val redstone: EnvironmentHost with BundledRedstoneAware) extends component.RedstoneVanilla with component.RedstoneBundled - class Wireless(val redstone: EnvironmentHost) - extends component.RedstoneWireless - - class VanillaWireless(val redstone: EnvironmentHost with RedstoneAware) - extends component.RedstoneVanilla with component.RedstoneWireless - - class BundledWireless(val redstone: EnvironmentHost with BundledRedstoneAware) - extends component.RedstoneVanilla with component.RedstoneBundled with component.RedstoneWireless { - private final lazy val deviceInfo = Map( - DeviceAttribute.Class -> DeviceClass.Communication, - DeviceAttribute.Description -> "Combined redstone controller", - DeviceAttribute.Vendor -> Constants.DeviceInfo.DefaultVendor, - DeviceAttribute.Product -> "Rx900-M", - DeviceAttribute.Capacity -> "65536", - DeviceAttribute.Width -> "16" - ) - - override def getDeviceInfo: util.Map[String, String] = deviceInfo - } - } diff --git a/src/main/scala/li/cil/oc/server/component/RedstoneWireless.scala b/src/main/scala/li/cil/oc/server/component/RedstoneWireless.scala deleted file mode 100644 index 7ce68d0d6..000000000 --- a/src/main/scala/li/cil/oc/server/component/RedstoneWireless.scala +++ /dev/null @@ -1,165 +0,0 @@ -package li.cil.oc.server.component - -/* TODO WRCBE -import codechicken.lib.vec.Vector3 -import codechicken.wirelessredstone.core.WirelessReceivingDevice -import codechicken.wirelessredstone.core.WirelessTransmittingDevice -*/ - -import li.cil.oc.Constants -import li.cil.oc.api.driver.DeviceInfo.DeviceAttribute -import li.cil.oc.api.driver.DeviceInfo.DeviceClass -import li.cil.oc.Settings -import li.cil.oc.api.driver.DeviceInfo -import li.cil.oc.api.network.EnvironmentHost -import li.cil.oc.api.machine.Arguments -import li.cil.oc.api.machine.Callback -import li.cil.oc.api.machine.Context -import li.cil.oc.api.network._ -import li.cil.oc.common.EventHandler -import li.cil.oc.integration.Mods -import li.cil.oc.integration.util -import net.minecraft.nbt.NBTTagCompound -import net.minecraftforge.fml.common.Optional - -import scala.collection.convert.WrapAsJava._ - -@Optional.InterfaceList(Array( - new Optional.Interface(iface = "codechicken.wirelessredstone.core.WirelessReceivingDevice", modid = Mods.IDs.WirelessRedstoneCBE), - new Optional.Interface(iface = "codechicken.wirelessredstone.core.WirelessTransmittingDevice", modid = Mods.IDs.WirelessRedstoneCBE) -)) -trait RedstoneWireless extends RedstoneSignaller /* with WirelessReceivingDevice with WirelessTransmittingDevice TODO WRCBE */ with DeviceInfo { - def redstone: EnvironmentHost - - var wirelessFrequency = 0 - - var wirelessInput = false - - var wirelessOutput = false - - // ----------------------------------------------------------------------- // - - private final lazy val deviceInfo = Map( - DeviceAttribute.Class -> DeviceClass.Communication, - DeviceAttribute.Description -> "Wireless redstone controller", - DeviceAttribute.Vendor -> Constants.DeviceInfo.DefaultVendor, - DeviceAttribute.Product -> "Rw400-M", - DeviceAttribute.Capacity -> "1", - DeviceAttribute.Width -> "1" - ) - - override def getDeviceInfo: java.util.Map[String, String] = deviceInfo - - // ----------------------------------------------------------------------- // - - @Callback(doc = """function():number -- Get the wireless redstone input.""") - def getWirelessInput(context: Context, args: Arguments): Array[AnyRef] = { - wirelessInput = util.WirelessRedstone.getInput(this) - result(wirelessInput) - } - - @Callback(direct = true, doc = """function():boolean -- Get the wireless redstone output.""") - def getWirelessOutput(context: Context, args: Arguments): Array[AnyRef] = result(wirelessOutput) - - @Callback(doc = """function(value:boolean):boolean -- Set the wireless redstone output.""") - def setWirelessOutput(context: Context, args: Arguments): Array[AnyRef] = { - val oldValue = wirelessOutput - val newValue = args.checkBoolean(0) - - if (oldValue != newValue) { - wirelessOutput = newValue - - util.WirelessRedstone.updateOutput(this) - - if (Settings.get.redstoneDelay > 0) - context.pause(Settings.get.redstoneDelay) - } - - result(oldValue) - } - - @Callback(direct = true, doc = """function():number -- Get the currently set wireless redstone frequency.""") - def getWirelessFrequency(context: Context, args: Arguments): Array[AnyRef] = result(wirelessFrequency) - - @Callback(doc = """function(frequency:number):number -- Set the wireless redstone frequency to use.""") - def setWirelessFrequency(context: Context, args: Arguments): Array[AnyRef] = { - val oldValue = wirelessFrequency - val newValue = args.checkInteger(0) - - if (oldValue != newValue) { - util.WirelessRedstone.removeReceiver(this) - util.WirelessRedstone.removeTransmitter(this) - - wirelessFrequency = newValue - wirelessInput = false - wirelessOutput = false - - util.WirelessRedstone.addReceiver(this) - - context.pause(0.5) - } - - result(oldValue) - } - - // ----------------------------------------------------------------------- // - /* TODO WRCBE - @Optional.Method(modid = Mods.IDs.WirelessRedstoneCBE) - override def updateDevice(frequency: Int, on: Boolean) { - if (frequency == wirelessFrequency && on != wirelessInput) { - wirelessInput = on - onRedstoneChanged("wireless", if (on) 0 else 1, if (on) 1 else 0) - } - } - - @Optional.Method(modid = Mods.IDs.WirelessRedstoneCBE) - override def getPosition = new Vector3(redstone.xPosition, redstone.yPosition, redstone.zPosition) - - @Optional.Method(modid = Mods.IDs.WirelessRedstoneCBE) - override def getDimension = redstone.world.provider.getDimensionId - - @Optional.Method(modid = Mods.IDs.WirelessRedstoneCBE) - override def getFreq = wirelessFrequency - - @Optional.Method(modid = Mods.IDs.WirelessRedstoneCBE) - override def getAttachedEntity = null - */ - // ----------------------------------------------------------------------- // - - override def onConnect(node: Node) { - super.onConnect(node) - if (node == this.node) { - EventHandler.scheduleWirelessRedstone(this) - } - } - - override def onDisconnect(node: Node) { - super.onDisconnect(node) - if (node == this.node) { - util.WirelessRedstone.removeReceiver(this) - util.WirelessRedstone.removeTransmitter(this) - wirelessOutput = false - wirelessFrequency = 0 - } - } - - // ----------------------------------------------------------------------- // - - private final val WirelessFrequencyTag = "wirelessFrequency" - private final val WirelessInputTag = "wirelessInput" - private final val WirelessOutputTag = "wirelessOutput" - - override def load(nbt: NBTTagCompound) { - super.load(nbt) - wirelessFrequency = nbt.getInteger(WirelessFrequencyTag) - wirelessInput = nbt.getBoolean(WirelessInputTag) - wirelessOutput = nbt.getBoolean(WirelessOutputTag) - } - - override def save(nbt: NBTTagCompound) { - super.save(nbt) - nbt.setInteger(WirelessFrequencyTag, wirelessFrequency) - nbt.setBoolean(WirelessInputTag, wirelessInput) - nbt.setBoolean(WirelessOutputTag, wirelessOutput) - } -} diff --git a/src/main/scala/li/cil/oc/server/component/traits/TankInventoryControl.scala b/src/main/scala/li/cil/oc/server/component/traits/TankInventoryControl.scala index 1f62a7249..b155cd24a 100644 --- a/src/main/scala/li/cil/oc/server/component/traits/TankInventoryControl.scala +++ b/src/main/scala/li/cil/oc/server/component/traits/TankInventoryControl.scala @@ -6,11 +6,10 @@ import li.cil.oc.api.machine.Callback import li.cil.oc.api.machine.Context import li.cil.oc.server.component.result import li.cil.oc.util.ExtendedArguments._ +import li.cil.oc.util.FluidUtils import li.cil.oc.util.InventoryUtils import net.minecraft.item.ItemStack -import net.minecraftforge.fluids.FluidContainerRegistry import net.minecraftforge.fluids.FluidStack -import net.minecraftforge.fluids.IFluidContainerItem trait TankInventoryControl extends WorldAware with InventoryAware with TankAware { @Callback(doc = """function([slot:number]):number -- Get the amount of fluid in the tank item in the specified slot or the selected slot.""") @@ -39,35 +38,16 @@ trait TankInventoryControl extends WorldAware with InventoryAware with TankAware Option(tank.getFluidTank(selectedTank)) match { case Some(into) => inventory.getStackInSlot(selectedSlot) match { case stack: ItemStack => - if (FluidContainerRegistry.isFilledContainer(stack)) { - val contents = FluidContainerRegistry.getFluidForFilledItem(stack) - val container = stack.getItem.getContainerItem(stack) - if (into.getCapacity - into.getFluidAmount < contents.amount) { - result(Unit, "tank is full") - } - else if (into.fill(contents, false) < contents.amount) { - result(Unit, "incompatible fluid") - } - else { - into.fill(contents, true) - inventory.decrStackSize(selectedSlot, 1) - InventoryUtils.insertIntoInventory(container, InventoryUtils.asItemHandler(inventory), slots = Option(insertionSlots)) - if (container.getCount > 0) { - InventoryUtils.spawnStackInWorld(position, container) - } - result(true, contents.amount) - } - } - else stack.getItem match { - case from: IFluidContainerItem => - val drained = from.drain(stack, amount, false) + Option(FluidUtils.fluidHandlerOf(stack)) match { + case Some(handler) => + val drained = handler.drain(amount, false) val transferred = into.fill(drained, true) if (transferred > 0) { - from.drain(stack, transferred, true) + handler.drain(transferred, true) result(true, transferred) } else result(Unit, "incompatible or no fluid") - case _ => result(Unit, "item is empty or not a fluid container") + case _ => result(Unit, "item is not a fluid container") } case _ => result(Unit, "nothing selected") } @@ -81,33 +61,16 @@ trait TankInventoryControl extends WorldAware with InventoryAware with TankAware Option(tank.getFluidTank(selectedTank)) match { case Some(from) => inventory.getStackInSlot(selectedSlot) match { case stack: ItemStack => - if (FluidContainerRegistry.isEmptyContainer(stack)) { - val drained = from.drain(amount, false) - val filled = FluidContainerRegistry.fillFluidContainer(drained, stack) - if (filled == null) { - result(Unit, "tank is empty") - } - else { - val amount = FluidContainerRegistry.getFluidForFilledItem(filled).amount - from.drain(amount, true) - inventory.decrStackSize(selectedSlot, 1) - InventoryUtils.insertIntoInventory(filled, InventoryUtils.asItemHandler(inventory), slots = Option(insertionSlots)) - if (filled.getCount > 0) { - InventoryUtils.spawnStackInWorld(position, filled) - } - result(true, amount) - } - } - else stack.getItem match { - case into: IFluidContainerItem => + Option(FluidUtils.fluidHandlerOf(stack)) match { + case Some(handler) => val drained = from.drain(amount, false) - val transferred = into.fill(stack, drained, true) + val transferred = handler.fill(drained, true) if (transferred > 0) { from.drain(transferred, true) result(true, transferred) } else result(Unit, "incompatible or no fluid") - case _ => result(Unit, "item is full or not a fluid container") + case _ => result(Unit, "item is not a fluid container") } case _ => result(Unit, "nothing selected") } @@ -116,17 +79,11 @@ trait TankInventoryControl extends WorldAware with InventoryAware with TankAware } private def withFluidInfo(slot: Int, f: (Option[FluidStack], Int) => Array[AnyRef]) = { - def fluidInfo(stack: ItemStack) = { - if (FluidContainerRegistry.isFilledContainer(stack)) { - Option((Option(FluidContainerRegistry.getFluidForFilledItem(stack)), FluidContainerRegistry.getContainerCapacity(stack))) - } - else if (FluidContainerRegistry.isEmptyContainer(stack)) { - Option((None, FluidContainerRegistry.getContainerCapacity(stack))) - } - else stack.getItem match { - case from: IFluidContainerItem => Option((Option(from.getFluid(stack)), from.getCapacity(stack))) - case _ => None - } + def fluidInfo(stack: ItemStack) = Option(FluidUtils.fluidHandlerOf(stack)) match { + case Some(handler) if handler.getTankProperties.length > 0 => + val props = handler.getTankProperties()(0) + Option((Option(props.getContents), props.getCapacity)) + case _ => None } inventory.getStackInSlot(slot) match { diff --git a/src/main/scala/li/cil/oc/server/component/traits/TankWorldControl.scala b/src/main/scala/li/cil/oc/server/component/traits/TankWorldControl.scala index 42024bf20..f2677ff82 100644 --- a/src/main/scala/li/cil/oc/server/component/traits/TankWorldControl.scala +++ b/src/main/scala/li/cil/oc/server/component/traits/TankWorldControl.scala @@ -15,7 +15,7 @@ trait TankWorldControl extends TankAware with WorldAware with SideRestricted { fluidInTank(selectedTank) match { case Some(stack) => FluidUtils.fluidHandlerAt(position.offset(side), side.getOpposite) match { - case Some(handler) => result(Option(handler.getTankInfo(side.getOpposite)).exists(_.exists(other => stack.isFluidEqual(other.fluid)))) + case Some(handler) => result(Option(handler.getTankProperties).exists(_.exists(other => stack.isFluidEqual(other.getContents)))) case _ => result(false) } case _ => result(false) @@ -35,14 +35,14 @@ trait TankWorldControl extends TankAware with WorldAware with SideRestricted { case Some(handler) => tank.getFluid match { case stack: FluidStack => - val drained = handler.drain(facing.getOpposite, new FluidStack(stack, amount), true) + val drained = handler.drain(new FluidStack(stack, amount), true) if ((drained != null && drained.amount > 0) || amount == 0) { val filled = tank.fill(drained, true) result(true, filled) } else result(Unit, "incompatible or no fluid") case _ => - val transferred = tank.fill(handler.drain(facing.getOpposite, amount, true), true) + val transferred = tank.fill(handler.drain(amount, true), true) result(transferred > 0, transferred) } case _ => result(Unit, "incompatible or no fluid") @@ -65,7 +65,7 @@ trait TankWorldControl extends TankAware with WorldAware with SideRestricted { case Some(handler) => tank.getFluid match { case stack: FluidStack => - val filled = handler.fill(facing.getOpposite, new FluidStack(stack, amount), true) + val filled = handler.fill(new FluidStack(stack, amount), true) if (filled > 0 || amount == 0) { tank.drain(filled, true) result(true, filled) diff --git a/src/main/scala/li/cil/oc/server/component/traits/WorldTankAnalytics.scala b/src/main/scala/li/cil/oc/server/component/traits/WorldTankAnalytics.scala index 711f958b9..b155057c0 100644 --- a/src/main/scala/li/cil/oc/server/component/traits/WorldTankAnalytics.scala +++ b/src/main/scala/li/cil/oc/server/component/traits/WorldTankAnalytics.scala @@ -14,7 +14,7 @@ trait WorldTankAnalytics extends WorldAware with SideRestricted { FluidUtils.fluidHandlerAt(position.offset(facing), facing.getOpposite) match { case Some(handler) => - result(handler.getTankInfo(facing.getOpposite).map(info => Option(info.fluid).fold(0)(_.amount)).sum) + result(handler.getTankProperties.map(info => Option(info.getContents).fold(0)(_.amount)).sum) case _ => result(Unit, "no tank") } } @@ -24,7 +24,7 @@ trait WorldTankAnalytics extends WorldAware with SideRestricted { val facing = checkSideForAction(args, 0) FluidUtils.fluidHandlerAt(position.offset(facing), facing.getOpposite) match { case Some(handler) => - result(handler.getTankInfo(facing.getOpposite).map(_.capacity).foldLeft(0)((max, capacity) => math.max(max, capacity))) + result(handler.getTankProperties.map(_.getCapacity).foldLeft(0)((max, capacity) => math.max(max, capacity))) case _ => result(Unit, "no tank") } } @@ -34,7 +34,7 @@ trait WorldTankAnalytics extends WorldAware with SideRestricted { val facing = checkSideForAction(args, 0) FluidUtils.fluidHandlerAt(position.offset(facing), facing.getOpposite) match { case Some(handler) => - result(handler.getTankInfo(facing.getOpposite)) + result(handler.getTankProperties) case _ => result(Unit, "no tank") } } diff --git a/src/main/scala/li/cil/oc/util/FluidUtils.scala b/src/main/scala/li/cil/oc/util/FluidUtils.scala index 0c86f318a..124661e6f 100644 --- a/src/main/scala/li/cil/oc/util/FluidUtils.scala +++ b/src/main/scala/li/cil/oc/util/FluidUtils.scala @@ -7,6 +7,7 @@ import net.minecraft.block.BlockDynamicLiquid import net.minecraft.block.BlockLiquid import net.minecraft.block.BlockStaticLiquid import net.minecraft.init.Blocks +import net.minecraft.item.ItemStack import net.minecraft.tileentity.TileEntity import net.minecraft.util.EnumFacing import net.minecraftforge.fluids.Fluid @@ -15,9 +16,11 @@ import net.minecraftforge.fluids.FluidStack import net.minecraftforge.fluids.FluidTank import net.minecraftforge.fluids.FluidTankInfo import net.minecraftforge.fluids.IFluidBlock -import net.minecraftforge.fluids.IFluidHandler import net.minecraftforge.fluids.capability import net.minecraftforge.fluids.capability.CapabilityFluidHandler +import net.minecraftforge.fluids.capability.IFluidHandler +import net.minecraftforge.fluids.capability.IFluidHandlerItem +import net.minecraftforge.fluids.capability.IFluidTankProperties object FluidUtils { /** @@ -38,6 +41,12 @@ object FluidUtils { case _ => None } + def fluidHandlerOf(stack: ItemStack): IFluidHandlerItem = Option(stack) match { + case Some(itemStack) if itemStack.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null) => + itemStack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null) + case _ => null + } + /** * Transfers some fluid between two fluid handlers. *

@@ -47,10 +56,10 @@ object FluidUtils { *

* This returns true if some fluid was transferred. */ - def transferBetweenFluidHandlers(source: IFluidHandler, sourceSide: EnumFacing, sink: IFluidHandler, sinkSide: EnumFacing, limit: Int = Fluid.BUCKET_VOLUME) = { - val drained = source.drain(sourceSide, limit, false) - val filled = sink.fill(sinkSide, drained, false) - sink.fill(sinkSide, source.drain(sourceSide, filled, true), true) + def transferBetweenFluidHandlers(source: IFluidHandler, sink: IFluidHandler, limit: Int = Fluid.BUCKET_VOLUME) = { + val drained = source.drain(limit, false) + val filled = sink.fill(drained, false) + sink.fill(source.drain(filled, true), true) } /** @@ -63,7 +72,7 @@ object FluidUtils { def transferBetweenFluidHandlersAt(sourcePos: BlockPosition, sourceSide: EnumFacing, sinkPos: BlockPosition, sinkSide: EnumFacing, limit: Int = Fluid.BUCKET_VOLUME) = fluidHandlerAt(sourcePos, sourceSide).fold(0)(source => fluidHandlerAt(sinkPos, sinkSide).fold(0)(sink => - transferBetweenFluidHandlers(source, sourceSide, sink, sinkSide, limit))) + transferBetweenFluidHandlers(source, sink, limit))) /** * Lookup fluid taking into account flowing liquid blocks... @@ -77,17 +86,17 @@ object FluidUtils { // ----------------------------------------------------------------------- // private class GenericBlockWrapper(position: BlockPosition) extends IFluidHandler { - override def canDrain(from: EnumFacing, fluid: Fluid): Boolean = currentWrapper.fold(false)(_.canDrain(from, fluid)) + override def canDrain(from: EnumFacing, fluid: Fluid): Boolean = currentWrapper.fold(false)(_.drain(new FluidStack(fluid, 1), false).amount > 0) - override def drain(from: EnumFacing, resource: FluidStack, doDrain: Boolean): FluidStack = currentWrapper.fold(null: FluidStack)(_.drain(from, resource, doDrain)) + override def drain(from: EnumFacing, resource: FluidStack, doDrain: Boolean): FluidStack = currentWrapper.fold(null: FluidStack)(_.drain(resource, doDrain)) - override def drain(from: EnumFacing, maxDrain: Int, doDrain: Boolean): FluidStack = currentWrapper.fold(null: FluidStack)(_.drain(from, maxDrain, doDrain)) + override def drain(from: EnumFacing, maxDrain: Int, doDrain: Boolean): FluidStack = currentWrapper.fold(null: FluidStack)(_.drain(maxDrain, doDrain)) - override def canFill(from: EnumFacing, fluid: Fluid): Boolean = currentWrapper.fold(false)(_.canFill(from, fluid)) + override def canFill(from: EnumFacing, fluid: Fluid): Boolean = currentWrapper.fold(false)(_.fill(new FluidStack(fluid, 1), false) > 0) - override def fill(from: EnumFacing, resource: FluidStack, doFill: Boolean): Int = currentWrapper.fold(0)(_.fill(from, resource, doFill)) + override def fill(from: EnumFacing, resource: FluidStack, doFill: Boolean): Int = currentWrapper.fold(0)(_.fill(resource, doFill)) - override def getTankInfo(from: EnumFacing): Array[FluidTankInfo] = currentWrapper.fold(Array.empty[FluidTankInfo])(_.getTankInfo(from)) + override def getTankInfo(from: EnumFacing): Array[IFluidTankProperties] = currentWrapper.fold(Array.empty[IFluidTankProperties])(_.getTankProperties) def currentWrapper = if (position.world.get.blockExists(position)) position.world.get.getBlock(position) match { case block: IFluidBlock => Option(new FluidBlockWrapper(position, block)) diff --git a/src/main/scala/li/cil/oc/util/ItemCosts.scala b/src/main/scala/li/cil/oc/util/ItemCosts.scala index fc75393cc..94f3acb91 100644 --- a/src/main/scala/li/cil/oc/util/ItemCosts.scala +++ b/src/main/scala/li/cil/oc/util/ItemCosts.scala @@ -59,7 +59,7 @@ object ItemCosts { terminate(Items.SLIME_BALL) terminate(Items.STICK) - def hasCosts(stack: ItemStack) = !Mods.CraftingCosts.isAvailable && { + def hasCosts(stack: ItemStack) = { val ingredients = computeIngredients(stack) ingredients.nonEmpty && (ingredients.size > 1 || !ingredients.head._1.isItemEqual(stack)) }