From 02043ed83bb54950407a597a27a7aac2a628905a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 29 Dec 2015 13:58:51 +0100 Subject: [PATCH 1/8] Re-enable TIS-3D integration. # Conflicts: # build.properties # src/main/scala/li/cil/oc/integration/Mods.scala # src/main/scala/li/cil/oc/integration/tis3d/SerialInterfaceProviderAdapter.scala --- build.gradle | 1 + build.properties | 1 + .../scala/li/cil/oc/integration/Mods.scala | 1 + .../SerialInterfaceProviderAdapter.scala | 116 ++++++++++++++++++ 4 files changed, 119 insertions(+) create mode 100644 src/main/scala/li/cil/oc/integration/tis3d/SerialInterfaceProviderAdapter.scala diff --git a/build.gradle b/build.gradle index e5606b6da..297c2a555 100644 --- a/build.gradle +++ b/build.gradle @@ -183,6 +183,7 @@ configurations { dependencies { deobfCompile "mezz.jei:jei_1.8.8:${config.jei.version}" + deobfCompile "li.cil.tis3d:TIS-3D:${config.tis3d.version}" /* provided "codechicken:CodeChickenCore:${config.minecraft.version}-${config.ccc.version}:dev" provided "codechicken:CodeChickenLib:${config.minecraft.version}-${config.ccl.version}:dev" diff --git a/build.properties b/build.properties index f9ee7ffd7..946d1b89c 100644 --- a/build.properties +++ b/build.properties @@ -42,6 +42,7 @@ rc.cf=2219/321 rc.version=1.7.10-9.4.0.0 redlogic.version=59.0.3 rotc.version=V5c +tis3d.version=MC1.8.8-0.7.0.68 tmech.version=75.0afb56c re.version=3.0.0.342 waila.version=1.6.0_B1_1.8.1 diff --git a/src/main/scala/li/cil/oc/integration/Mods.scala b/src/main/scala/li/cil/oc/integration/Mods.scala index 3cc889db2..af882855f 100644 --- a/src/main/scala/li/cil/oc/integration/Mods.scala +++ b/src/main/scala/li/cil/oc/integration/Mods.scala @@ -124,6 +124,7 @@ object Mods { // integration.stargatetech2.ModStargateTech2, // integration.thaumcraft.ModThaumcraft, // integration.thermalexpansion.ModThermalExpansion, + integration.tis3d.ModTIS3D, // integration.tcon.ModTinkersConstruct, // integration.tmechworks.ModTMechworks, integration.vanilla.ModVanilla, diff --git a/src/main/scala/li/cil/oc/integration/tis3d/SerialInterfaceProviderAdapter.scala b/src/main/scala/li/cil/oc/integration/tis3d/SerialInterfaceProviderAdapter.scala new file mode 100644 index 000000000..7f710b72f --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/tis3d/SerialInterfaceProviderAdapter.scala @@ -0,0 +1,116 @@ +package li.cil.oc.integration.tis3d + +import li.cil.oc.Settings +import li.cil.oc.api +import li.cil.oc.api.internal.Adapter +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.Environment +import li.cil.oc.api.network.Message +import li.cil.oc.api.network.Node +import li.cil.oc.api.network.Visibility +import li.cil.oc.util.ResultWrapper.result +import li.cil.tis3d.api.ManualAPI +import li.cil.tis3d.api.SerialAPI +import li.cil.tis3d.api.prefab.manual.ResourceContentProvider +import li.cil.tis3d.api.serial.SerialInterface +import li.cil.tis3d.api.serial.SerialInterfaceProvider +import li.cil.tis3d.api.serial.SerialProtocolDocumentationReference +import net.minecraft.util.BlockPos +import net.minecraft.util.EnumFacing +import net.minecraft.world.World + +import scala.collection.mutable + +object SerialInterfaceProviderAdapter extends SerialInterfaceProvider { + def init(): Unit = { + ManualAPI.addProvider(new ResourceContentProvider(Settings.resourceDomain, "doc/")) + SerialAPI.addProvider(this) + } + + override def getDocumentationReference = new SerialProtocolDocumentationReference("OpenComputers Adapter", "protocols/opencomputersAdapter.md") + + override def worksWith(world: World, position: BlockPos, side: EnumFacing): Boolean = world.getTileEntity(position).isInstanceOf[Adapter] + + override def interfaceFor(world: World, position: BlockPos, side: EnumFacing): SerialInterface = new SerialInterfaceAdapter(world.getTileEntity(position).asInstanceOf[Adapter]) + + override def isValid(world: World, position: BlockPos, side: EnumFacing, serialInterface: SerialInterface): Boolean = serialInterface match { + case adapter: SerialInterfaceAdapter => adapter.tileEntity == world.getTileEntity(position) + case _ => false + } + + class SerialInterfaceAdapter(val tileEntity: Adapter) extends Environment with SerialInterface { + final val BufferCapacity = 128 + final val readBuffer = mutable.Queue.empty[Short] + final val writeBuffer = mutable.Queue.empty[Short] + var isReading = false + + // ----------------------------------------------------------------------- // + + val node = api.Network.newNode(this, Visibility.Network).withComponent("serial_port").create() + + override def onMessage(message: Message): Unit = {} + + override def onConnect(node: Node): Unit = {} + + override def onDisconnect(node: Node): Unit = {} + + // ----------------------------------------------------------------------- // + + @Callback + def setReading(context: Context, args: Arguments): Array[AnyRef] = { + isReading = args.checkBoolean(0) + null + } + + @Callback + def read(context: Context, args: Arguments): Array[AnyRef] = { + readBuffer.synchronized(if (readBuffer.nonEmpty) { + result(readBuffer.dequeue()) + } else { + null + }) + } + + @Callback + def write(context: Context, args: Arguments): Array[AnyRef] = { + writeBuffer.synchronized(if (writeBuffer.length < BufferCapacity) { + writeBuffer += args.checkInteger(0).toShort + result(true) + } else { + result(false, "buffer full") + }) + } + + // ----------------------------------------------------------------------- // + + override def canWrite: Boolean = readBuffer.synchronized(isReading && readBuffer.length < BufferCapacity) + + override def write(value: Short): Unit = readBuffer.synchronized(readBuffer += value) + + override def canRead: Boolean = { + ensureConnected() + writeBuffer.synchronized(writeBuffer.nonEmpty) + } + + override def peek(): Short = writeBuffer.synchronized(writeBuffer.front) + + override def skip(): Unit = writeBuffer.synchronized(writeBuffer.dequeue()) + + override def reset(): Unit = { + readBuffer.synchronized(writeBuffer.synchronized { + readBuffer.clear() + writeBuffer.clear() + node.remove() + }) + } + + private def ensureConnected(): Unit = { + if (tileEntity.node.network != node.network) { + tileEntity.node.connect(node) + } + } + } + +} From 4faf61976cad68ac32dcce38ef1bce6caf731a43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 29 Dec 2015 09:22:12 +0100 Subject: [PATCH 2/8] Added TIS-3D integration. # Conflicts: # build.gradle # build.properties # src/main/scala/li/cil/oc/integration/Mods.scala # src/main/scala/li/cil/oc/integration/tis3d/SerialInterfaceProviderAdapter.scala --- build.gradle | 14 ++------------ .../doc/en_US/protocols/opencomputersAdapter.md | 7 +++++++ src/main/scala/li/cil/oc/integration/Mods.scala | 2 ++ .../li/cil/oc/integration/tis3d/ModTIS3D.scala | 12 ++++++++++++ 4 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 src/main/resources/assets/opencomputers/doc/en_US/protocols/opencomputersAdapter.md create mode 100644 src/main/scala/li/cil/oc/integration/tis3d/ModTIS3D.scala diff --git a/build.gradle b/build.gradle index 297c2a555..3349aa2a7 100644 --- a/build.gradle +++ b/build.gradle @@ -69,20 +69,9 @@ if (JavaVersion.current().isJava8Compatible()) { repositories { maven { - name = "chickenbones" - url = "http://chickenbones.net/maven/" - } - maven { - name = "mobius" - url = "http://mobiusstrip.eu/maven" - } - maven { - name = "fallback" + name = "TIS-3D" url = "http://maven.cil.li/" } - maven { - url "http://dvs1.progwml6.com/files/maven" - } /* maven { name = "BluePower" @@ -199,6 +188,7 @@ dependencies { provided "com.bluepowermod:BluePower:${config.bluepower.version}:deobf" provided "com.gregoriust.gregtech:gregtech_${config.minecraft.version}:${config.gt.version}:dev" provided "igwmod:IGW-Mod-1.7.10:${config.igwmod.version}:userdev" + provided "li.cil.tis3d:TIS-3D:${config.tis3d.version}:dev" provided "mcp.mobius.waila:Waila:${config.waila.version}_${config.minecraft.version}:dev" provided "net.industrial-craft:industrialcraft-2:${config.ic2.version}:dev" provided "net.sengir.forestry:forestry_${config.minecraft.version}:${config.forestry.version}:dev" diff --git a/src/main/resources/assets/opencomputers/doc/en_US/protocols/opencomputersAdapter.md b/src/main/resources/assets/opencomputers/doc/en_US/protocols/opencomputersAdapter.md new file mode 100644 index 000000000..b4ea5eff1 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/en_US/protocols/opencomputersAdapter.md @@ -0,0 +1,7 @@ +# Adapter + +![Freeeedooooooom!](block:OpenComputers:adapter) + +The adapter's serial interface does not implement a hard-coded protocol. Instead, the protocol is defined by the software running on the computer controlling the adapter. Please refer to the component's API using an OpenComputers computer for specifics. + +The adapter's serial interface has a small internal buffer for values passed along in either direction. Note that by default the adapter's serial interface does not read from the serial port. Reading has to be enabled from the component's API. diff --git a/src/main/scala/li/cil/oc/integration/Mods.scala b/src/main/scala/li/cil/oc/integration/Mods.scala index af882855f..85af5ae55 100644 --- a/src/main/scala/li/cil/oc/integration/Mods.scala +++ b/src/main/scala/li/cil/oc/integration/Mods.scala @@ -79,6 +79,7 @@ object Mods { val Thaumcraft = new SimpleMod(IDs.Thaumcraft) val ThermalExpansion = new SimpleMod(IDs.ThermalExpansion, providesPower = true) val TinkersConstruct = new SimpleMod(IDs.TinkersConstruct) + val TIS3D = new SimpleMod(IDs.TIS3D, version = "@[0.7,)") val TMechWorks = new SimpleMod(IDs.TMechWorks) val VersionChecker = new SimpleMod(IDs.VersionChecker) val Waila = new SimpleMod(IDs.Waila) @@ -218,6 +219,7 @@ object Mods { final val Thaumcraft = "Thaumcraft" final val ThermalExpansion = "ThermalExpansion" final val TinkersConstruct = "TConstruct" + final val TIS3D = "tis3d" final val TMechWorks = "TMechworks" final val VersionChecker = "VersionChecker" final val Waila = "Waila" diff --git a/src/main/scala/li/cil/oc/integration/tis3d/ModTIS3D.scala b/src/main/scala/li/cil/oc/integration/tis3d/ModTIS3D.scala new file mode 100644 index 000000000..ee83aef8c --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/tis3d/ModTIS3D.scala @@ -0,0 +1,12 @@ +package li.cil.oc.integration.tis3d + +import li.cil.oc.integration.ModProxy +import li.cil.oc.integration.Mods + +object ModTIS3D extends ModProxy { + override def getMod = Mods.TIS3D + + override def initialize(): Unit = { + SerialInterfaceProviderAdapter.init() + } +} From 6458e1b1498345782647c79dbaec6e8a6e5d2490 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 29 Dec 2015 20:47:13 +0100 Subject: [PATCH 3/8] Cherry picking is hard, apparently. --- build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index 3349aa2a7..6b8f09d3b 100644 --- a/build.gradle +++ b/build.gradle @@ -72,6 +72,9 @@ repositories { name = "TIS-3D" url = "http://maven.cil.li/" } + maven { + url "http://dvs1.progwml6.com/files/maven" + } /* maven { name = "BluePower" From c873f15db225aefb270ee47c33380d45be48c441 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 29 Dec 2015 22:59:06 +0100 Subject: [PATCH 4/8] Fix OpenGL derpiness in drone and robot item renderer. JEI integration (hiding some items, e.g. robot proxy block used while robots are moving). --- build.properties | 2 +- .../{model/drone_item.png => items/drone.png} | Bin .../opencomputers/textures/items/robot.png | Bin 0 -> 934 bytes src/main/resources/mcmod.info | 1 + .../scala/li/cil/oc/client/Textures.scala | 24 +++---------- .../oc/client/renderer/block/DroneModel.scala | 6 +--- .../oc/client/renderer/block/RobotModel.scala | 10 +++--- .../renderer/block/SmartBlockModelBase.scala | 6 ++-- .../cil/oc/common/block/Microcontroller.scala | 4 +-- .../cil/oc/common/block/PowerConverter.scala | 4 +-- .../scala/li/cil/oc/common/block/Print.scala | 4 +-- .../cil/oc/common/block/RobotAfterimage.scala | 4 +-- .../li/cil/oc/common/block/RobotProxy.scala | 4 +-- .../scala/li/cil/oc/common/item/Drone.scala | 4 +-- .../li/cil/oc/common/recipe/Recipes.scala | 32 +++++++++--------- .../scala/li/cil/oc/integration/Mods.scala | 2 ++ .../jei/ModPluginOpenComputers.scala | 27 +++++++++++++++ .../opencomputers/ModOpenComputers.scala | 3 ++ .../oc/integration/util/ItemBlacklist.scala | 27 +++++++++++++++ .../li/cil/oc/integration/util/NEI.scala | 11 ------ 20 files changed, 100 insertions(+), 75 deletions(-) rename src/main/resources/assets/opencomputers/textures/{model/drone_item.png => items/drone.png} (100%) create mode 100644 src/main/resources/assets/opencomputers/textures/items/robot.png create mode 100644 src/main/scala/li/cil/oc/integration/jei/ModPluginOpenComputers.scala create mode 100644 src/main/scala/li/cil/oc/integration/util/ItemBlacklist.scala diff --git a/build.properties b/build.properties index 946d1b89c..53eac5e95 100644 --- a/build.properties +++ b/build.properties @@ -28,7 +28,7 @@ gc.version=3.0.7 gt.version=5.04.06 ic2.version=2.2.654-experimental igwmod.version=1.1.3-18 -jei.version=2.1.3.14 +jei.version=2.12.0.51 mekanism.build=5 mekanism.version=7.1.2 mfr.cf=2229/626 diff --git a/src/main/resources/assets/opencomputers/textures/model/drone_item.png b/src/main/resources/assets/opencomputers/textures/items/drone.png similarity index 100% rename from src/main/resources/assets/opencomputers/textures/model/drone_item.png rename to src/main/resources/assets/opencomputers/textures/items/drone.png diff --git a/src/main/resources/assets/opencomputers/textures/items/robot.png b/src/main/resources/assets/opencomputers/textures/items/robot.png new file mode 100644 index 0000000000000000000000000000000000000000..d417bf93c861e14b571e204774fa2f16f1294d23 GIT binary patch literal 934 zcmV;X16lluP)uIyyT$J3Kr*Jv}`?KR-Y~ zKte)7LqkJFMMXzPM@UFWN=iyhOiWEpO;1lxQBhG+Qc_e@R9;?QUteEiV`F4wWM*b& zXlQ6@X=!U~Yi(_9ZfLl?uCA`Lv$MLo zy1>A|!NI}A#KhRx*xA|H@9*#b|NjB0ke2`e00Cl4M??UK1szBL000SaNLh0L01FcU z01FcV0GgZ_00007bV*G`2j2k!4F)jMJ5Kfh00KfuL_t(I%UzRUU)nGb#!pif=&3*_ zG);3G1%bFJLZ(9*YR#NF<@`IizrJXC|6ZTx?h0tEtLxgiTlf3d!er#5&{Av4 ziAsV&X6!doB|kQoqmvOK28Qx8Dh`_jv-6JmF|0;rFt+B{%m|@@B(#qc0?_NBtaAjU`i#pCwDz%rFNW6ubf-S zKA`}SBnc!btAxj=`<0z$rs^2GymyW=!bETl*iVpj4iD>k{qu6r=??A9jeBr?Vjsyq zFw#Ia3v2gy>ulA{Cf2Q8y=3!8CuI2#C&2$NRV?%qpa6D>@FO@gJZI+fUL{(&%EW9zcy{$Mk0 z9Wv7>HC%jc8^LJ~CMruUNKsMI3#A$wOnYKs7vD{Ls1dc|25Fw3#1=uD`~Uv(^8Whz z_s?oR%yjuh`GJ$Bo>Y>6?{Yq5g-E*(*Cah91*a6n|Mcw$B?T>V0e&zH^od)l{ffmz(8vSP zrQ|=7G{l6T1NVZX$9Z0{n9zmXs-Tk5QbA1Qw38V^Q8ew%f75|>>C^T&LI3~&07*qo IM6N<$g0fqgxBvhE literal 0 HcmV?d00001 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 945abe94e..3b3b611d4 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -15,6 +15,7 @@ "EnderStorage", "ForgeMultipart", "IC2", + "JEI", "MineFactoryReloaded", "ProjRed|Transmission", "RedLogic", diff --git a/src/main/scala/li/cil/oc/client/Textures.scala b/src/main/scala/li/cil/oc/client/Textures.scala index bdf7aff22..1c6bb9863 100644 --- a/src/main/scala/li/cil/oc/client/Textures.scala +++ b/src/main/scala/li/cil/oc/client/Textures.scala @@ -88,7 +88,6 @@ object Textures { val UpgradeInventory = L("inventory_upgrade") val HologramEffect = L("hologram_effect") val Drone = L("drone") - val DroneItem = L("drone_item") val Robot = L("robot") override protected def basePath = "textures/model/%s.png" @@ -97,26 +96,10 @@ object Textures { } object Item extends TextureBundle { - val Floppy = Array( - L("floppy_dyeBlack"), - L("floppy_dyeRed"), - L("floppy_dyeGreen"), - L("floppy_dyeBrown"), - L("floppy_dyeBlue"), - L("floppy_dyePurple"), - L("floppy_dyeCyan"), - L("floppy_dyeLightGray"), - L("floppy_dyeGray"), - L("floppy_dyePink"), - L("floppy_dyeLime"), - L("floppy_dyeYellow"), - L("floppy_dyeLightBlue"), - L("floppy_dyeMagenta"), - L("floppy_dyeOrange"), - L("floppy_dyeWhite") - ) + val DroneItem = L("drone") + val Robot = L("robot") - override protected def basePath = "items/%s.png" + override protected def basePath = "items/%s" override protected def loader(map: TextureMap, loc: ResourceLocation) = map.registerSprite(loc) } @@ -564,6 +547,7 @@ object Textures { GUI.init(e.map) Icons.init(e.map) Model.init(e.map) + Item.init(e.map) Block.init(e.map) } diff --git a/src/main/scala/li/cil/oc/client/renderer/block/DroneModel.scala b/src/main/scala/li/cil/oc/client/renderer/block/DroneModel.scala index d967495d3..ab1878437 100644 --- a/src/main/scala/li/cil/oc/client/renderer/block/DroneModel.scala +++ b/src/main/scala/li/cil/oc/client/renderer/block/DroneModel.scala @@ -15,7 +15,7 @@ object DroneModel extends SmartBlockModelBase with ISmartItemModel { override def handleItemState(stack: ItemStack) = new ItemModel(stack) - protected def droneTexture = Textures.getSprite(Textures.Model.DroneItem) + protected def droneTexture = Textures.getSprite(Textures.Item.DroneItem) protected def Boxes = Array( makeBox(new Vec3(1f / 16f, 7f / 16f, 1f / 16f), new Vec3(7f / 16f, 8f / 16f, 7f / 16f)), @@ -26,15 +26,11 @@ object DroneModel extends SmartBlockModelBase with ISmartItemModel { ) class ItemModel(val stack: ItemStack) extends SmartBlockModelBase { - override protected def textureScale = 32f - override def getGeneralQuads = { val faces = mutable.ArrayBuffer.empty[BakedQuad] faces ++= Boxes.flatMap(box => bakeQuads(box, Array.fill(6)(droneTexture), None)) - Textures.bind(Textures.Model.DroneItem) - bufferAsJavaList(faces) } } diff --git a/src/main/scala/li/cil/oc/client/renderer/block/RobotModel.scala b/src/main/scala/li/cil/oc/client/renderer/block/RobotModel.scala index a7af00c09..e050e144b 100644 --- a/src/main/scala/li/cil/oc/client/renderer/block/RobotModel.scala +++ b/src/main/scala/li/cil/oc/client/renderer/block/RobotModel.scala @@ -35,7 +35,7 @@ object RobotModel extends SmartBlockModelBase with ISmartItemModel { // I don't know why this is super-bright when using 0xFF888888 :/ private val tint = 0xFF555555 - protected def robotTexture = Textures.getSprite(Textures.Model.Robot) + protected def robotTexture = Textures.getSprite(Textures.Item.Robot) private def interpolate(v0: (Float, Float, Float, Float, Float), v1: (Float, Float, Float, Float, Float)) = (v0._1 * 0.5f + v1._1 * 0.5f, @@ -46,13 +46,13 @@ object RobotModel extends SmartBlockModelBase with ISmartItemModel { private def quad(verts: (Float, Float, Float, Float, Float)*) = { val added = interpolate(verts.last, verts.head) - (verts :+ added).map { + (verts :+ added).flatMap { case ((x, y, z, u, v)) => rawData( (x - 0.5f) * 1.4f + 0.5f, (y - 0.5f) * 1.4f + 0.5f, (z - 0.5f) * 1.4f + 0.5f, - EnumFacing.UP, robotTexture, u, v) - }.flatten.toArray + EnumFacing.UP, robotTexture, robotTexture.getInterpolatedU(u * 16), robotTexture.getInterpolatedV(v * 16)) + }.toArray } override def getGeneralQuads = { @@ -68,8 +68,6 @@ object RobotModel extends SmartBlockModelBase with ISmartItemModel { faces += new BakedQuad(quad(bottom, bottom3, bottom4), tint, EnumFacing.SOUTH) faces += new BakedQuad(quad(bottom, bottom4, bottom1), tint, EnumFacing.WEST) - Textures.bind(Textures.Model.Robot) - bufferAsJavaList(faces) } } diff --git a/src/main/scala/li/cil/oc/client/renderer/block/SmartBlockModelBase.scala b/src/main/scala/li/cil/oc/client/renderer/block/SmartBlockModelBase.scala index e543ce0ba..6fea124ca 100644 --- a/src/main/scala/li/cil/oc/client/renderer/block/SmartBlockModelBase.scala +++ b/src/main/scala/li/cil/oc/client/renderer/block/SmartBlockModelBase.scala @@ -80,8 +80,6 @@ trait SmartBlockModelBase extends ISmartBlockModel with ISmartItemModel { protected final val NoTint = -1 - protected def textureScale = 1f - /** * Generates a list of arrays, each containing the four vertices making up a * face of the box with the specified size. @@ -182,8 +180,8 @@ trait SmartBlockModelBase extends ISmartBlockModel with ISmartItemModel { java.lang.Float.floatToRawIntBits(y.toFloat), java.lang.Float.floatToRawIntBits(z.toFloat), getFaceShadeColor(face), - java.lang.Float.floatToRawIntBits(u * textureScale), - java.lang.Float.floatToRawIntBits(v * textureScale), + java.lang.Float.floatToRawIntBits(u), + java.lang.Float.floatToRawIntBits(v), vx | (vy << 0x08) | (vz << 0x10) ) } diff --git a/src/main/scala/li/cil/oc/common/block/Microcontroller.scala b/src/main/scala/li/cil/oc/common/block/Microcontroller.scala index 1b0b46e16..ad62c776e 100644 --- a/src/main/scala/li/cil/oc/common/block/Microcontroller.scala +++ b/src/main/scala/li/cil/oc/common/block/Microcontroller.scala @@ -10,7 +10,7 @@ import li.cil.oc.common.Tier import li.cil.oc.common.block.property.PropertyRotatable import li.cil.oc.common.item.data.MicrocontrollerData import li.cil.oc.common.tileentity -import li.cil.oc.integration.util.NEI +import li.cil.oc.integration.util.ItemBlacklist import li.cil.oc.integration.util.Wrench import li.cil.oc.util.InventoryUtils import li.cil.oc.util.Rarity @@ -29,7 +29,7 @@ import scala.reflect.ClassTag class Microcontroller(protected implicit val tileTag: ClassTag[tileentity.Microcontroller]) extends RedstoneAware with traits.PowerAcceptor with traits.StateAware with traits.CustomDrops[tileentity.Microcontroller] { setCreativeTab(null) - NEI.hide(this) + ItemBlacklist.hide(this) override def createBlockState(): BlockState = new BlockState(this, PropertyRotatable.Facing) 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 751b13132..cc56370b6 100644 --- a/src/main/scala/li/cil/oc/common/block/PowerConverter.scala +++ b/src/main/scala/li/cil/oc/common/block/PowerConverter.scala @@ -6,7 +6,7 @@ import java.util import li.cil.oc.Settings import li.cil.oc.common.tileentity import li.cil.oc.integration.Mods -import li.cil.oc.integration.util.NEI +import li.cil.oc.integration.util.ItemBlacklist import li.cil.oc.util.Tooltip import net.minecraft.block.state.IBlockState import net.minecraft.entity.player.EntityPlayer @@ -16,7 +16,7 @@ import net.minecraft.world.World class PowerConverter extends SimpleBlock with traits.PowerAcceptor { if (Settings.get.ignorePower) { setCreativeTab(null) - NEI.hide(this) + ItemBlacklist.hide(this) } private val formatter = new DecimalFormat("#.#") 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 fc58b88ca..e4c8f08fe 100644 --- a/src/main/scala/li/cil/oc/common/block/Print.scala +++ b/src/main/scala/li/cil/oc/common/block/Print.scala @@ -9,7 +9,7 @@ import li.cil.oc.Settings import li.cil.oc.common.block.property.PropertyTile import li.cil.oc.common.item.data.PrintData import li.cil.oc.common.tileentity -import li.cil.oc.integration.util.NEI +import li.cil.oc.integration.util.ItemBlacklist import li.cil.oc.util.ExtendedAABB import li.cil.oc.util.ExtendedAABB._ import li.cil.oc.util.InventoryUtils @@ -40,7 +40,7 @@ class Print(protected implicit val tileTag: ClassTag[tileentity.Print]) extends setLightOpacity(1) setHardness(1) setCreativeTab(null) - NEI.hide(this) + ItemBlacklist.hide(this) // ----------------------------------------------------------------------- // diff --git a/src/main/scala/li/cil/oc/common/block/RobotAfterimage.scala b/src/main/scala/li/cil/oc/common/block/RobotAfterimage.scala index 4fa1fa06d..035af0d42 100644 --- a/src/main/scala/li/cil/oc/common/block/RobotAfterimage.scala +++ b/src/main/scala/li/cil/oc/common/block/RobotAfterimage.scala @@ -7,7 +7,7 @@ import li.cil.oc.Settings import li.cil.oc.api import li.cil.oc.common.item.data.RobotData import li.cil.oc.common.tileentity -import li.cil.oc.integration.util.NEI +import li.cil.oc.integration.util.ItemBlacklist import li.cil.oc.util.Rarity import net.minecraft.block.state.IBlockState import net.minecraft.entity.player.EntityPlayer @@ -19,7 +19,7 @@ import net.minecraft.world.World class RobotAfterimage extends SimpleBlock { setLightOpacity(0) setCreativeTab(null) - NEI.hide(this) + ItemBlacklist.hide(this) // ----------------------------------------------------------------------- // diff --git a/src/main/scala/li/cil/oc/common/block/RobotProxy.scala b/src/main/scala/li/cil/oc/common/block/RobotProxy.scala index edf3eb761..fef7a9363 100644 --- a/src/main/scala/li/cil/oc/common/block/RobotProxy.scala +++ b/src/main/scala/li/cil/oc/common/block/RobotProxy.scala @@ -10,7 +10,7 @@ import li.cil.oc.client.KeyBindings import li.cil.oc.common.GuiType import li.cil.oc.common.item.data.RobotData import li.cil.oc.common.tileentity -import li.cil.oc.integration.util.NEI +import li.cil.oc.integration.util.ItemBlacklist import li.cil.oc.server.PacketSender import li.cil.oc.server.agent import li.cil.oc.util.BlockPosition @@ -29,7 +29,7 @@ import net.minecraft.world.World class RobotProxy extends RedstoneAware with traits.StateAware { setLightOpacity(0) setCreativeTab(null) - NEI.hide(this) + ItemBlacklist.hide(this) override val getUnlocalizedName = "Robot" diff --git a/src/main/scala/li/cil/oc/common/item/Drone.scala b/src/main/scala/li/cil/oc/common/item/Drone.scala index 931996f58..cd3fd9c3b 100644 --- a/src/main/scala/li/cil/oc/common/item/Drone.scala +++ b/src/main/scala/li/cil/oc/common/item/Drone.scala @@ -8,7 +8,7 @@ import li.cil.oc.client.KeyBindings import li.cil.oc.client.renderer.block.DroneModel import li.cil.oc.common.entity import li.cil.oc.common.item.data.DroneData -import li.cil.oc.integration.util.NEI +import li.cil.oc.integration.util.ItemBlacklist import li.cil.oc.server.agent import li.cil.oc.util.BlockPosition import li.cil.oc.util.Rarity @@ -21,7 +21,7 @@ import net.minecraftforge.fml.relauncher.Side import net.minecraftforge.fml.relauncher.SideOnly class Drone(val parent: Delegator) extends traits.Delegate with CustomModel { - NEI.hide(this) + ItemBlacklist.hide(this) showInItemList = false diff --git a/src/main/scala/li/cil/oc/common/recipe/Recipes.scala b/src/main/scala/li/cil/oc/common/recipe/Recipes.scala index 31e224627..3f56c067c 100644 --- a/src/main/scala/li/cil/oc/common/recipe/Recipes.scala +++ b/src/main/scala/li/cil/oc/common/recipe/Recipes.scala @@ -12,7 +12,7 @@ import li.cil.oc.common.item.Delegator import li.cil.oc.common.item.data.PrintData import li.cil.oc.common.item.traits.Delegate import li.cil.oc.common.item.traits.SimpleItem -import li.cil.oc.integration.util.NEI +import li.cil.oc.integration.util.ItemBlacklist import li.cil.oc.util.Color import net.minecraft.block.Block import net.minecraft.item.Item @@ -77,7 +77,7 @@ object Recipes { register(delegate.createItemStack(), oreDict: _*) } else { - NEI.hide(delegate) + ItemBlacklist.hide(delegate) } delegate } @@ -124,22 +124,22 @@ object Recipes { lazy val config: ConfigParseOptions = ConfigParseOptions.defaults. setSyntax(ConfigSyntax.CONF). setIncluder(new ConfigIncluder with ConfigIncluderFile { - var fallback: ConfigIncluder = _ + var fallback: ConfigIncluder = _ - override def withFallback(fallback: ConfigIncluder) = { - this.fallback = fallback - this - } + override def withFallback(fallback: ConfigIncluder) = { + this.fallback = fallback + this + } - override def include(context: ConfigIncludeContext, what: String) = fallback.include(context, what) + override def include(context: ConfigIncludeContext, what: String) = fallback.include(context, what) - override def includeFile(context: ConfigIncludeContext, what: File) = { - val in = if (what.isAbsolute) new FileReader(what) else new FileReader(new File(userRecipes.getParentFile, what.getPath)) - val result = ConfigFactory.parseReader(in, config) - in.close() - result.root() - } - }) + override def includeFile(context: ConfigIncludeContext, what: File) = { + val in = if (what.isAbsolute) new FileReader(what) else new FileReader(new File(userRecipes.getParentFile, what.getPath)) + val result = ConfigFactory.parseReader(in, config) + in.close() + result.root() + } + }) val recipes = ConfigFactory.parseFile(userRecipes, config) // Register all known recipes. @@ -467,7 +467,7 @@ object Recipes { case itemBlock: ItemBlock => itemBlock.getBlock match { case simple: SimpleBlock => simple.setCreativeTab(null) - NEI.hide(simple) + ItemBlacklist.hide(simple) case _ => } case _ => diff --git a/src/main/scala/li/cil/oc/integration/Mods.scala b/src/main/scala/li/cil/oc/integration/Mods.scala index 85af5ae55..d97a6b035 100644 --- a/src/main/scala/li/cil/oc/integration/Mods.scala +++ b/src/main/scala/li/cil/oc/integration/Mods.scala @@ -51,6 +51,7 @@ object Mods { val IndustrialCraft2 = new SimpleMod(IDs.IndustrialCraft2, providesPower = true) val IndustrialCraft2Classic = new SimpleMod(IDs.IndustrialCraft2Classic, providesPower = true) val IngameWiki = new SimpleMod(IDs.IngameWiki, version = "@[1.1.3,)") + val JustEnoughItems = new SimpleMod(IDs.JustEnoughItems) val Mekanism = new SimpleMod(IDs.Mekanism, providesPower = true) val MekanismGas = new SimpleMod(IDs.MekanismGas) val Minecraft = new SimpleMod(IDs.Minecraft) @@ -200,6 +201,7 @@ object Mods { final val IndustrialCraft2 = "IC2" final val IndustrialCraft2Classic = "IC2-Classic" final val IngameWiki = "IGWMod" + final val JustEnoughItems = "JEI" final val Mekanism = "Mekanism" final val MekanismGas = "MekanismAPI|gas" final val Minecraft = "Minecraft" diff --git a/src/main/scala/li/cil/oc/integration/jei/ModPluginOpenComputers.scala b/src/main/scala/li/cil/oc/integration/jei/ModPluginOpenComputers.scala new file mode 100644 index 000000000..b6d455050 --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/jei/ModPluginOpenComputers.scala @@ -0,0 +1,27 @@ +package li.cil.oc.integration.jei + +import li.cil.oc.integration.util.ItemBlacklist +import mezz.jei.api.IItemRegistry +import mezz.jei.api.IJeiHelpers +import mezz.jei.api.IModPlugin +import mezz.jei.api.IModRegistry +import mezz.jei.api.IRecipeRegistry +import mezz.jei.api.JEIPlugin + +@JEIPlugin +class ModPluginOpenComputers extends IModPlugin { + override def isModLoaded: Boolean = true + + override def onJeiHelpersAvailable(jeiHelpers: IJeiHelpers): Unit = { + ItemBlacklist.consumers += jeiHelpers.getItemBlacklist.addItemToBlacklist + } + + override def onItemRegistryAvailable(itemRegistry: IItemRegistry): Unit = { + } + + override def register(registry: IModRegistry): Unit = { + } + + override def onRecipeRegistryAvailable(recipeRegistry: IRecipeRegistry): Unit = { + } +} 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 050e973b5..c43a9da0f 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala @@ -36,6 +36,7 @@ import li.cil.oc.common.template._ 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 @@ -53,6 +54,8 @@ object ModOpenComputers extends ModProxy { override def getMod = Mods.OpenComputers override def initialize() { + ItemBlacklist.apply() + DroneTemplate.register() MicrocontrollerTemplate.register() NavigationUpgradeTemplate.register() diff --git a/src/main/scala/li/cil/oc/integration/util/ItemBlacklist.scala b/src/main/scala/li/cil/oc/integration/util/ItemBlacklist.scala new file mode 100644 index 000000000..6c42f04a4 --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/util/ItemBlacklist.scala @@ -0,0 +1,27 @@ +package li.cil.oc.integration.util + +import li.cil.oc.common.item.traits.Delegate +import net.minecraft.block.Block +import net.minecraft.item.ItemStack + +import scala.collection.mutable + +object ItemBlacklist { + // Lazily evaluated stacks to avoid creating stacks with unregistered items/blocks. + val hiddenItems = mutable.Set.empty[() => ItemStack] + + // List of consumers for item stacks (blacklisting for NEI and JEI). + val consumers = mutable.Set.empty[ItemStack => Unit] + + def hide(block: Block): Unit = hiddenItems += (() => new ItemStack(block)) + + def hide(item: Delegate): Unit = hiddenItems += (() => item.createItemStack()) + + def apply(): Unit = { + for (consumer <- consumers) { + for (stack <- hiddenItems) { + consumer(stack()) + } + } + } +} diff --git a/src/main/scala/li/cil/oc/integration/util/NEI.scala b/src/main/scala/li/cil/oc/integration/util/NEI.scala index cf02d1336..367a8cefd 100644 --- a/src/main/scala/li/cil/oc/integration/util/NEI.scala +++ b/src/main/scala/li/cil/oc/integration/util/NEI.scala @@ -3,18 +3,11 @@ package li.cil.oc.integration.util /* TODO NEI import codechicken.nei.LayoutManager */ -import li.cil.oc.common.item.traits.Delegate import li.cil.oc.integration.Mods -import net.minecraft.block.Block import net.minecraft.client.gui.inventory.GuiContainer import net.minecraft.item.ItemStack -import scala.collection.mutable - object NEI { - // Lazily evaluated stacks to avoid creating stacks with unregistered items/blocks. - val hiddenItems = mutable.Set.empty[() => ItemStack] - def isInputFocused = Mods.NotEnoughItems.isAvailable && (try isInputFocused0 catch { case _: Throwable => false @@ -29,8 +22,4 @@ object NEI { else None private def hoveredStack0(container: GuiContainer, mouseX: Int, mouseY: Int) = null: ItemStack // TODO NEI LayoutManager.instance.getStackUnderMouse(container, mouseX, mouseY) - - def hide(block: Block): Unit = if (Mods.NotEnoughItems.isAvailable) hiddenItems += (() => new ItemStack(block)) - - def hide(item: Delegate): Unit = if (Mods.NotEnoughItems.isAvailable) hiddenItems += (() => item.createItemStack()) } From 90947436fe2cce4e92e8846fb53e64c398a700e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 29 Dec 2015 23:04:02 +0100 Subject: [PATCH 5/8] Also version bump for consistency... ugh. Time to port 1.6 to 1.8 >_> --- build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.properties b/build.properties index 53eac5e95..28807365d 100644 --- a/build.properties +++ b/build.properties @@ -1,7 +1,7 @@ minecraft.version=1.8.8 forge.version=11.15.0.1653-1.8.8 -oc.version=1.5.20 +oc.version=1.5.21 oc.subversion=dev ae2.version=rv2-beta-26 From b8b6d5329e6aab5c30c356d9bd8226f596aa8398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 29 Dec 2015 23:07:59 +0100 Subject: [PATCH 6/8] Updated TIS-3D dep. --- build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.properties b/build.properties index 28807365d..e6308cbe8 100644 --- a/build.properties +++ b/build.properties @@ -42,7 +42,7 @@ rc.cf=2219/321 rc.version=1.7.10-9.4.0.0 redlogic.version=59.0.3 rotc.version=V5c -tis3d.version=MC1.8.8-0.7.0.68 +tis3d.version=MC1.8.8-0.7.1.69 tmech.version=75.0afb56c re.version=3.0.0.342 waila.version=1.6.0_B1_1.8.1 From d60f6743fdf83cc10d093d038b70da9ba49b3bba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 29 Dec 2015 23:30:54 +0100 Subject: [PATCH 7/8] Fix messing with TIS-3D manual, closes #1588. --- .../doc/{ => tis3d}/en_US/protocols/opencomputersAdapter.md | 0 .../oc/integration/tis3d/SerialInterfaceProviderAdapter.scala | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/main/resources/assets/opencomputers/doc/{ => tis3d}/en_US/protocols/opencomputersAdapter.md (100%) diff --git a/src/main/resources/assets/opencomputers/doc/en_US/protocols/opencomputersAdapter.md b/src/main/resources/assets/opencomputers/doc/tis3d/en_US/protocols/opencomputersAdapter.md similarity index 100% rename from src/main/resources/assets/opencomputers/doc/en_US/protocols/opencomputersAdapter.md rename to src/main/resources/assets/opencomputers/doc/tis3d/en_US/protocols/opencomputersAdapter.md diff --git a/src/main/scala/li/cil/oc/integration/tis3d/SerialInterfaceProviderAdapter.scala b/src/main/scala/li/cil/oc/integration/tis3d/SerialInterfaceProviderAdapter.scala index 7f710b72f..8934fd157 100644 --- a/src/main/scala/li/cil/oc/integration/tis3d/SerialInterfaceProviderAdapter.scala +++ b/src/main/scala/li/cil/oc/integration/tis3d/SerialInterfaceProviderAdapter.scala @@ -25,7 +25,7 @@ import scala.collection.mutable object SerialInterfaceProviderAdapter extends SerialInterfaceProvider { def init(): Unit = { - ManualAPI.addProvider(new ResourceContentProvider(Settings.resourceDomain, "doc/")) + ManualAPI.addProvider(new ResourceContentProvider(Settings.resourceDomain, "doc/tis3d/")) SerialAPI.addProvider(this) } From a020657bf0443518485dfec0bf60237942c95dca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 29 Dec 2015 23:42:42 +0100 Subject: [PATCH 8/8] Update to TIS-3D 0.7.1. # Conflicts: # build.properties # src/main/scala/li/cil/oc/integration/tis3d/SerialInterfaceProviderAdapter.scala --- build.properties | 2 +- .../tis3d/SerialInterfaceProviderAdapter.scala | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/build.properties b/build.properties index e6308cbe8..2ac793e2d 100644 --- a/build.properties +++ b/build.properties @@ -42,7 +42,7 @@ rc.cf=2219/321 rc.version=1.7.10-9.4.0.0 redlogic.version=59.0.3 rotc.version=V5c -tis3d.version=MC1.8.8-0.7.1.69 +tis3d.version=MC1.8.8-0.7.1.70 tmech.version=75.0afb56c re.version=3.0.0.342 waila.version=1.6.0_B1_1.8.1 diff --git a/src/main/scala/li/cil/oc/integration/tis3d/SerialInterfaceProviderAdapter.scala b/src/main/scala/li/cil/oc/integration/tis3d/SerialInterfaceProviderAdapter.scala index 8934fd157..f73818885 100644 --- a/src/main/scala/li/cil/oc/integration/tis3d/SerialInterfaceProviderAdapter.scala +++ b/src/main/scala/li/cil/oc/integration/tis3d/SerialInterfaceProviderAdapter.scala @@ -17,6 +17,7 @@ import li.cil.tis3d.api.prefab.manual.ResourceContentProvider import li.cil.tis3d.api.serial.SerialInterface import li.cil.tis3d.api.serial.SerialInterfaceProvider import li.cil.tis3d.api.serial.SerialProtocolDocumentationReference +import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.BlockPos import net.minecraft.util.EnumFacing import net.minecraft.world.World @@ -106,6 +107,20 @@ object SerialInterfaceProviderAdapter extends SerialInterfaceProvider { }) } + override def readFromNBT(nbt: NBTTagCompound): Unit = { + writeBuffer.clear() + writeBuffer ++= nbt.getIntArray("writeBuffer").map(_.toShort) + readBuffer.clear() + readBuffer ++= nbt.getIntArray("readBuffer").map(_.toShort) + isReading = nbt.getBoolean("isReading") + } + + override def writeToNBT(nbt: NBTTagCompound): Unit = { + nbt.setIntArray("writeBuffer", writeBuffer.toArray.map(_.toInt)) + nbt.setIntArray("readBuffer", readBuffer.toArray.map(_.toInt)) + nbt.setBoolean("isReading", isReading) + } + private def ensureConnected(): Unit = { if (tileEntity.node.network != node.network) { tileEntity.node.connect(node)