From f8026c9310c6f881b1307b6ac49620384faac754 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 22 Jun 2014 23:07:44 +0200 Subject: [PATCH] Some fixes and a texture for the tablet prototype. --- assets/items.psd | Bin 370940 -> 376928 bytes .../opencomputers/textures/items/tablet.png | Bin 0 -> 424 bytes src/main/scala/li/cil/oc/Items.scala | 1 + .../scala/li/cil/oc/client/GuiHandler.scala | 2 +- src/main/scala/li/cil/oc/common/Proxy.scala | 4 + .../scala/li/cil/oc/common/item/Tablet.scala | 94 ++++++++++++++++-- 6 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 src/main/resources/assets/opencomputers/textures/items/tablet.png diff --git a/assets/items.psd b/assets/items.psd index 7b2ca3a5094d8b6b7cd085f66c2d410379778f9f..70c88bab6db38291e9377da35668c352840f7407 100644 GIT binary patch delta 7477 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 diff --git a/src/main/resources/assets/opencomputers/textures/items/tablet.png b/src/main/resources/assets/opencomputers/textures/items/tablet.png new file mode 100644 index 0000000000000000000000000000000000000000..69878fb606801ed502e4051348e39eccd58916f9 GIT binary patch literal 424 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8mH?j+R}K~-ZFOT=X+;qMSr#VFU^gXEAx;HZO@Ai^X>o1| z5iVy7X%ih$VF3;=M-5wJ$z`e)|DByxl_V7&mdhMUH*lIQE5Wm9O}M$9n47hXxG-m` zkDY^=RBEc-?&GO;_NmLf@7%GnGSU(`sMGD^Ab%kIzlG0cXKOWIXH7F*F$W8k|NsB* zFIm9|bdOF+kY6y6ODteGevPvSsISS>#WAGfR?c}(p(Xc+tJr9kK9g^H!$Jw#<|1+_9 bOgs$cqQVK$QY$|KUBlq%>gTe~DWM4fYnP~x literal 0 HcmV?d00001 diff --git a/src/main/scala/li/cil/oc/Items.scala b/src/main/scala/li/cil/oc/Items.scala index 4d38c950c..c108e286f 100644 --- a/src/main/scala/li/cil/oc/Items.scala +++ b/src/main/scala/li/cil/oc/Items.scala @@ -228,6 +228,7 @@ object Items extends ItemAPI { Recipes.addItem(new item.UpgradeBattery(multi, Tier.One), "batteryUpgrade1", "oc:batteryUpgrade1") Recipes.addItem(new item.UpgradeBattery(multi, Tier.Two), "batteryUpgrade2", "oc:batteryUpgrade2") Recipes.addItem(new item.UpgradeBattery(multi, Tier.Three), "batteryUpgrade3", "oc:batteryUpgrade3") + // Experimental registerItem(new item.Tablet(multi), "tablet") } diff --git a/src/main/scala/li/cil/oc/client/GuiHandler.scala b/src/main/scala/li/cil/oc/client/GuiHandler.scala index 00775c956..bba1c2ec2 100644 --- a/src/main/scala/li/cil/oc/client/GuiHandler.scala +++ b/src/main/scala/li/cil/oc/client/GuiHandler.scala @@ -41,7 +41,7 @@ object GuiHandler extends CommonGuiHandler { Tablet.get(stack, player).components.collect { case Some(buffer: TextBuffer) => buffer }.headOption match { - case Some(buffer: TextBuffer) => return new gui.Screen(buffer, true, () => true) + case Some(buffer: TextBuffer) => return new gui.Screen(buffer, true, () => true, () => true) case _ => } } diff --git a/src/main/scala/li/cil/oc/common/Proxy.scala b/src/main/scala/li/cil/oc/common/Proxy.scala index 3ceea9e72..315f11a96 100644 --- a/src/main/scala/li/cil/oc/common/Proxy.scala +++ b/src/main/scala/li/cil/oc/common/Proxy.scala @@ -7,6 +7,7 @@ import cpw.mods.fml.relauncher.Side import li.cil.oc._ import li.cil.oc.common.asm.SimpleComponentTickHandler import li.cil.oc.common.event._ +import li.cil.oc.common.item.Tablet import li.cil.oc.common.multipart.MultiPart import li.cil.oc.common.recipe.Recipes import li.cil.oc.server._ @@ -148,10 +149,13 @@ class Proxy { TickRegistry.registerTickHandler(EventHandler, Side.SERVER) TickRegistry.registerTickHandler(SimpleComponentTickHandler.Instance, Side.SERVER) + TickRegistry.registerTickHandler(Tablet, Side.CLIENT) + TickRegistry.registerTickHandler(Tablet, Side.SERVER) GameRegistry.registerPlayerTracker(Keyboard) NetworkRegistry.instance.registerConnectionHandler(EventHandler) MinecraftForge.EVENT_BUS.register(WirelessNetwork) MinecraftForge.EVENT_BUS.register(SaveHandler) + MinecraftForge.EVENT_BUS.register(Tablet) } private def registerExclusive(name: String, items: ItemStack*) { diff --git a/src/main/scala/li/cil/oc/common/item/Tablet.scala b/src/main/scala/li/cil/oc/common/item/Tablet.scala index 1719cf220..01f0447a7 100644 --- a/src/main/scala/li/cil/oc/common/item/Tablet.scala +++ b/src/main/scala/li/cil/oc/common/item/Tablet.scala @@ -1,26 +1,38 @@ package li.cil.oc.common.item -import java.util.concurrent.{Callable, TimeUnit} +import java.util import java.util.UUID -import com.google.common.cache.{RemovalNotification, RemovalListener, CacheBuilder} -import li.cil.oc.{OpenComputers, Settings, api} +import java.util.concurrent.{Callable, TimeUnit} + +import com.google.common.cache.{CacheBuilder, RemovalListener, RemovalNotification} +import cpw.mods.fml.common.{ITickHandler, TickType} import li.cil.oc.api.Machine import li.cil.oc.api.driver.Container import li.cil.oc.api.machine.Owner import li.cil.oc.api.network.{Connector, Message, Node} import li.cil.oc.common.GuiType import li.cil.oc.common.inventory.ComponentInventory +import li.cil.oc.{OpenComputers, Settings, api} +import net.minecraft.client.renderer.texture.IconRegister import net.minecraft.entity.Entity import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack -import net.minecraft.world.World import net.minecraft.nbt.NBTTagCompound +import net.minecraft.world.World +import net.minecraftforge.event.ForgeSubscribe +import net.minecraftforge.event.world.WorldEvent class Tablet(val parent: Delegator) extends Delegate { val unlocalizedName = "Tablet" override def maxStackSize = 1 + override def registerIcons(iconRegister: IconRegister) = { + super.registerIcons(iconRegister) + + icon_=(iconRegister.registerIcon(Settings.resourceDomain + ":tablet")) + } + override def update(stack: ItemStack, world: World, player: Entity, slot: Int, selected: Boolean) = Tablet.get(stack, player).update(world, player, slot, selected) @@ -42,16 +54,24 @@ class TabletWrapper(val stack: ItemStack, var holder: Entity) extends ComponentI lazy val computer = if (holder.worldObj.isRemote) null else Machine.create(this) val items = Array( + Option(api.Items.get("cpu1").createItemStack(1)), + Option(api.Items.get("ram4").createItemStack(1)), Option(api.Items.get("screen1").createItemStack(1)), Option(api.Items.get("keyboard").createItemStack(1)), - Option(api.Items.get("graphicsCard1").createItemStack(1)), + Option(api.Items.get("graphicsCard2").createItemStack(1)), + Option(api.Items.get("batteryUpgrade2").createItemStack(1)), + Option(api.Items.get("navigationUpgrade").createItemStack(1)), Option(api.Items.get("openOS").createItemStack(1)), Option(api.Items.get("wlanCard").createItemStack(1)) ) def readFromNBT() { if (stack.hasTagCompound) { - load(stack.getTagCompound.getCompoundTag(Settings.namespace + "data")) + val data = stack.getTagCompound.getCompoundTag(Settings.namespace + "data") + if (!world.isRemote) { + computer.node.load(data) + } + load(data) } } @@ -63,12 +83,21 @@ class TabletWrapper(val stack: ItemStack, var holder: Entity) extends ComponentI if (!nbt.hasKey(Settings.namespace + "data")) { nbt.setTag(Settings.namespace + "data", new NBTTagCompound()) } - save(stack.getTagCompound.getCompoundTag(Settings.namespace + "data")) + val data = stack.getTagCompound.getCompoundTag(Settings.namespace + "data") + if (!world.isRemote) { + computer.node.save(data) + } + save(data) } readFromNBT() if (world.isRemote) { connectComponents() + components collect { + case Some(buffer: api.component.TextBuffer) => + buffer.setMaximumColorDepth(api.component.TextBuffer.ColorDepth.FourBit) + buffer.setMaximumResolution(80, 25) + } } else { api.Network.joinNewNetwork(computer.node) @@ -81,6 +110,12 @@ class TabletWrapper(val stack: ItemStack, var holder: Entity) extends ComponentI if (node == this.node) { connectComponents() } + else node.host match { + case buffer: api.component.TextBuffer => + buffer.setMaximumColorDepth(api.component.TextBuffer.ColorDepth.FourBit) + buffer.setMaximumResolution(80, 25) + case _ => + } } override def onDisconnect(node: Node) { @@ -123,9 +158,21 @@ class TabletWrapper(val stack: ItemStack, var holder: Entity) extends ComponentI override def world = holder.worldObj - override def installedMemory = 256 * 1024 + override def installedMemory = items.foldLeft(0)((acc, itemOption) => acc + (itemOption match { + case Some(item) => Option(api.Driver.driverFor(item)) match { + case Some(driver: api.driver.Memory) => driver.amount(item) + case _ => 0 + } + case _ => 0 + })) - override def maxComponents() = 8 + override def maxComponents = items.foldLeft(0)((acc, itemOption) => acc + (itemOption match { + case Some(item) => Option(api.Driver.driverFor(item)) match { + case Some(driver: api.driver.Processor) => driver.supportedComponents(item) + case _ => 0 + } + case _ => 0 + })) override def markAsChanged() {} @@ -163,7 +210,7 @@ class TabletWrapper(val stack: ItemStack, var holder: Entity) extends ComponentI } } -object Tablet extends Callable[TabletWrapper] with RemovalListener[String, TabletWrapper] { +object Tablet extends Callable[TabletWrapper] with RemovalListener[String, TabletWrapper] with ITickHandler { val clientCache = com.google.common.cache.CacheBuilder.newBuilder(). expireAfterAccess(10, TimeUnit.SECONDS). removalListener(this). @@ -197,6 +244,14 @@ object Tablet extends Callable[TabletWrapper] with RemovalListener[String, Table serverCache.get(id, this) } + def get(stack: ItemStack) = clientCache.synchronized { + if (stack.hasTagCompound && stack.getTagCompound.hasKey(Settings.namespace + "tablet")) { + val id = stack.getTagCompound.getString(Settings.namespace + "tablet") + Option(clientCache.getIfPresent(id)) + } + else None + } + def call = { new TabletWrapper(currentStack, currentHolder) } @@ -209,4 +264,23 @@ object Tablet extends Callable[TabletWrapper] with RemovalListener[String, Table } tablet.writeToNBT() } + + @ForgeSubscribe + def onWorldUnload(e: WorldEvent.Unload) { + clientCache.invalidateAll() + clientCache.cleanUp() + serverCache.invalidateAll() + serverCache.cleanUp() + } + + override def getLabel = "OpenComputers Tablet Cleanup Ticker" + + override def ticks = util.EnumSet.of(TickType.CLIENT, TickType.SERVER) + + override def tickStart(tickType: util.EnumSet[TickType], tickData: AnyRef*) { + clientCache.cleanUp() + serverCache.cleanUp() + } + + override def tickEnd(tickType: util.EnumSet[TickType], tickData: AnyRef*) {} } \ No newline at end of file