From adf4de68388d94be89cb15621b9904ab0d6a858d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 14 Nov 2015 20:13:43 +0100 Subject: [PATCH] Terminal server item texture, fixed saving/loading of terminal data, fixed coordinate flippery, visually indenting rack mountables one (like it's already in MC 1.8). --- assets/items.psd | Bin 607468 -> 617468 bytes .../assets/opencomputers/lang/en_US.lang | 2 ++ .../opencomputers/recipes/default.recipes | 5 +++++ .../textures/items/TerminalServer.png | Bin 0 -> 685 bytes .../textures/items/TerminalServer.png.mcmeta | 5 +++++ .../cil/oc/client/renderer/block/Rack.scala | 8 ++++---- .../renderer/tileentity/RackRenderer.scala | 2 +- .../scala/li/cil/oc/common/EventHandler.scala | 5 ++++- .../oc/common/component/TerminalServer.scala | 14 ++++++++++---- .../cil/oc/common/component/TextBuffer.scala | 5 ++++- .../li/cil/oc/common/tileentity/Rack.scala | 5 +++++ 11 files changed, 40 insertions(+), 11 deletions(-) create mode 100644 src/main/resources/assets/opencomputers/textures/items/TerminalServer.png create mode 100644 src/main/resources/assets/opencomputers/textures/items/TerminalServer.png.mcmeta diff --git a/assets/items.psd b/assets/items.psd index 2df42515fa5b5e501be578dc6391bb4d39d2767b..3605a73bf11ba6d4f2b529815994925b4bddca74 100644 GIT binary patch delta 22489 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 DSG~tG delta 12868 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 MxR@f@STsfYzv-?%T>t<8 diff --git a/src/main/resources/assets/opencomputers/lang/en_US.lang b/src/main/resources/assets/opencomputers/lang/en_US.lang index 105a17061..4c65409d2 100644 --- a/src/main/resources/assets/opencomputers/lang/en_US.lang +++ b/src/main/resources/assets/opencomputers/lang/en_US.lang @@ -117,6 +117,7 @@ item.oc.TabletCase0.name=Tablet Case (Tier 1) item.oc.TabletCase1.name=Tablet Case (Tier 2) item.oc.TabletCase3.name=Tablet Case (Creative) item.oc.Terminal.name=Remote Terminal +item.oc.TerminalServer.name=Terminal Server item.oc.TexturePicker.name=Texture Picker item.oc.Transistor.name=Transistor item.oc.UpgradeAngel.name=Angel Upgrade @@ -345,6 +346,7 @@ oc:tooltip.Switch=Allows connecting different networks to each other. Only netwo oc:tooltip.Tablet=A tablet computer, for fresh Lua on the go. Can be forced to shut down by sneak-activating it. oc:tooltip.TabletCase=Basic case for tablets. Place it into the assembler to add in components and create a tablet computer. oc:tooltip.Terminal=Allows controlling a server remotely, as long as you are in range of it. Acts like a portable screen and keyboard. Shift-right-click a server in a server rack to bind the terminal to it. +oc:tooltip.TerminalServer=Backend to which Remote Terminals can be connected to provide remote control. Houses a virtual screen and keyboard. oc:tooltip.TexturePicker=This tool allows showing a string describing a block's surface, for use in 3D printer shape definitions. Totally not texture names, nope. No sir. oc:tooltip.Tier=ยง8Tier %s oc:tooltip.NetSplitter=Acts as a dynamic connector. Connectivity of each side can be toggled by hitting it with a wrench. Connectivity of all sides can be inverted by applying a redstone signal. diff --git a/src/main/resources/assets/opencomputers/recipes/default.recipes b/src/main/resources/assets/opencomputers/recipes/default.recipes index d84332a82..2c2bd6dd6 100644 --- a/src/main/resources/assets/opencomputers/recipes/default.recipes +++ b/src/main/resources/assets/opencomputers/recipes/default.recipes @@ -98,6 +98,11 @@ server3 { ["oc:circuitChip3", "oc:circuitChip3", "oc:circuitChip3"] [obsidian, "oc:materialCircuitBoardPrinted", obsidian]] } +terminalServer { + input: [[obsidian, "oc:wlanCard", obsidian] + ["oc:wlanCard", "oc:circuitChip2", "oc:wlanCard"] + [obsidian, "oc:materialCircuitBoardPrinted", obsidian]] +} ram1 { input: [["oc:circuitChip1", nuggetIron, "oc:circuitChip1"] diff --git a/src/main/resources/assets/opencomputers/textures/items/TerminalServer.png b/src/main/resources/assets/opencomputers/textures/items/TerminalServer.png new file mode 100644 index 0000000000000000000000000000000000000000..820e060f72c67a84c01d66c9518817847cc283cd GIT binary patch literal 685 zcmeAS@N?(olHy`uVBq!ia0vp^0zjO=!3-po`I#mGDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MJ)k7A+Aj9>>MmYQOU`2#KSEeo*xJ!i-o#GM(8|m+xW1>SZSv&i2^0SR z|G)UELmkjPIwe7V!9XstfZ_Nx&K?E^#&%B^$B>F!OQzf`YcddVRkqY}QDZI4SX-v| z_5c6%&)e9X*<~Imp1jqqY5hE|l&9&z%8KLLZXAn|yJ~pj*vd{p=_M1lDf9`rXMT|i zjbxto-BZFfQf)Kq$)tr`OG1riuGrb2dC>0kmn-b87u6>S%LMJMQkWrV6BV$yC_zqZ zsae$P^mAfUW`9{5v;O*1_no_yXS__E^jxvMV7;zE&0iPa`S zDRH|L=Zlz6$=BR3eq{XE_~psr0MGUObsG#;q~vWo-}?0-^XtQnbGTnO7e97p@OgS5 z*N#D>kpKDN#_ZYy=h-g{&d#p+Aiy=*spwM9`~$x}G=6>P;8(y(B!}59$8LPjCpC&u}XL!6l;L*Od;_T}_H}0=_@Cj(Ag58gYdH+8&0tIjV sb1ZlzzqOIs)~>+Ot{~WMABzOT{AH05N3-@E14bo-r>mdKI;Vst0B<@vA^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/opencomputers/textures/items/TerminalServer.png.mcmeta b/src/main/resources/assets/opencomputers/textures/items/TerminalServer.png.mcmeta new file mode 100644 index 000000000..f6730e30a --- /dev/null +++ b/src/main/resources/assets/opencomputers/textures/items/TerminalServer.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 4 + } +} \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/client/renderer/block/Rack.scala b/src/main/scala/li/cil/oc/client/renderer/block/Rack.scala index 058de57c3..2de68cbd2 100644 --- a/src/main/scala/li/cil/oc/client/renderer/block/Rack.scala +++ b/src/main/scala/li/cil/oc/client/renderer/block/Rack.scala @@ -30,13 +30,13 @@ object Rack { for (i <- 0 until 4 if rack.getStackInSlot(i) != null) { side match { case ForgeDirection.WEST => - renderer.setRenderBounds(lx, v2 - (i + 1) * fs, lz + u1, u2, v2 - i * fs, hz - u1) + renderer.setRenderBounds(lx + 1 / 16f, v2 - (i + 1) * fs, lz + u1, u2, v2 - i * fs, hz - u1) case ForgeDirection.EAST => - renderer.setRenderBounds(u1, v2 - (i + 1) * fs, lz + u1, hx, v2 - i * fs, hz - u1) + renderer.setRenderBounds(u1, v2 - (i + 1) * fs, lz + u1, hx - 1 / 16f, v2 - i * fs, hz - u1) case ForgeDirection.NORTH => - renderer.setRenderBounds(lx + u1, v2 - (i + 1) * fs, lz, hx - u1, v2 - i * fs, u2) + renderer.setRenderBounds(lx + u1, v2 - (i + 1) * fs, lz + 1 / 16f, hx - u1, v2 - i * fs, u2) case ForgeDirection.SOUTH => - renderer.setRenderBounds(lx + u1, v2 - (i + 1) * fs, u1, hx - u1, v2 - i * fs, hz) + renderer.setRenderBounds(lx + u1, v2 - (i + 1) * fs, u1, hx - u1, v2 - i * fs, hz - 1 / 16f) case _ => } diff --git a/src/main/scala/li/cil/oc/client/renderer/tileentity/RackRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/tileentity/RackRenderer.scala index 218534fe0..372f680a8 100644 --- a/src/main/scala/li/cil/oc/client/renderer/tileentity/RackRenderer.scala +++ b/src/main/scala/li/cil/oc/client/renderer/tileentity/RackRenderer.scala @@ -30,7 +30,7 @@ object RackRenderer extends TileEntitySpecialRenderer { case _ => // No yaw. } - GL11.glTranslated(-0.5, 0.5, 0.505) + GL11.glTranslated(-0.5, 0.5, 0.505 - 1 / 16f) GL11.glScalef(1, -1, 1) // Note: we manually sync the rack inventory for this to work. diff --git a/src/main/scala/li/cil/oc/common/EventHandler.scala b/src/main/scala/li/cil/oc/common/EventHandler.scala index b0a427a80..2cffbe8a7 100644 --- a/src/main/scala/li/cil/oc/common/EventHandler.scala +++ b/src/main/scala/li/cil/oc/common/EventHandler.scala @@ -17,6 +17,7 @@ import li.cil.oc.api.internal.Server import li.cil.oc.api.machine.MachineHost import li.cil.oc.client.renderer.PetRenderer import li.cil.oc.common.asm.ClassTransformer +import li.cil.oc.common.component.TerminalServer import li.cil.oc.common.item.data.MicrocontrollerData import li.cil.oc.common.item.data.RobotData import li.cil.oc.common.item.data.TabletData @@ -373,6 +374,9 @@ object EventHandler { Callbacks.clear() } + else { + TerminalServer.loaded.clear() + } } @SubscribeEvent @@ -384,7 +388,6 @@ object EventHandler { case _ => // Dafuq? } case rack: Rack => - // TODO (0 until rack.getSizeInventory). map(rack.getMountable). collect { case server: Server if server.machine != null => server.machine.stop() } diff --git a/src/main/scala/li/cil/oc/common/component/TerminalServer.scala b/src/main/scala/li/cil/oc/common/component/TerminalServer.scala index 6da953284..3466644f7 100644 --- a/src/main/scala/li/cil/oc/common/component/TerminalServer.scala +++ b/src/main/scala/li/cil/oc/common/component/TerminalServer.scala @@ -94,9 +94,9 @@ class TerminalServer(val rack: tileentity.Rack, val slot: Int) extends Environme override def world = rack.world - override def yPosition = rack.xPosition + override def xPosition = rack.xPosition - override def xPosition = rack.yPosition + override def yPosition = rack.yPosition override def zPosition = rack.zPosition @@ -148,6 +148,9 @@ class TerminalServer(val rack: tileentity.Rack, val slot: Int) extends Environme // Persistable override def load(nbt: NBTTagCompound): Unit = { + if (rack.isServer) { + node.load(nbt) + } buffer.load(nbt.getCompoundTag(Settings.namespace + "buffer")) keyboard.load(nbt.getCompoundTag(Settings.namespace + "keyboard")) keys.clear() @@ -155,6 +158,7 @@ class TerminalServer(val rack: tileentity.Rack, val slot: Int) extends Environme } override def save(nbt: NBTTagCompound): Unit = { + node.save(nbt) nbt.setNewCompoundTag(Settings.namespace + "buffer", buffer.save) nbt.setNewCompoundTag(Settings.namespace + "keyboard", keyboard.save) nbt.setNewTagList(Settings.namespace + "keys", keys) @@ -187,8 +191,10 @@ class TerminalServer(val rack: tileentity.Rack, val slot: Int) extends Environme // LifeCycle override def onLifecycleStateChange(state: Lifecycle.LifecycleState): Unit = if (rack.isClient) state match { - case Lifecycle.LifecycleState.Initialized => TerminalServer.loaded += this - case Lifecycle.LifecycleState.Disposed => TerminalServer.loaded -= this + case Lifecycle.LifecycleState.Initialized => + TerminalServer.loaded += this + case Lifecycle.LifecycleState.Disposed => + TerminalServer.loaded -= this case _ => // Ignore. } } diff --git a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala index 2753998e0..fbccd5813 100644 --- a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala @@ -92,7 +92,10 @@ class TextBuffer(val host: EnvironmentHost) extends prefab.ManagedEnvironment wi val data = new util.TextBuffer(maxResolution, PackedColor.Depth.format(maxDepth)) - def markInitialized(): Unit = syncCooldown = -1 // Stop polling for init state. + def markInitialized(): Unit = { + syncCooldown = -1 // Stop polling for init state. + relativeLitArea = -1 // Recompute lit area, avoid screens blanking out until something changes. + } // ----------------------------------------------------------------------- // 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 4d1c2e1d5..926c32306 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Rack.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Rack.scala @@ -165,6 +165,11 @@ class Rack extends traits.PowerAcceptor with traits.Hub with traits.PowerBalance // ----------------------------------------------------------------------- // // Environment + override def dispose(): Unit = { + super.dispose() + disconnectComponents() + } + override def onMessage(message: Message): Unit = { super.onMessage(message) if (message.name == "network.message") message.data match {