From 0f0953f981d67dbe47026accb273c28e951e4c9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Wed, 20 May 2015 22:58:36 +0200 Subject: [PATCH] Added CPUs with integrated graphics capabilities, closes #1154. --- assets/items.psd | Bin 599446 -> 612747 bytes .../opencomputers/doc/en_US/item/apu1.md | 7 ++ .../opencomputers/doc/en_US/item/apu2.md | 1 + .../assets/opencomputers/lang/en_US.lang | 3 + .../opencomputers/recipes/default.recipes | 10 +++ .../opencomputers/textures/items/APU0.png | Bin 0 -> 874 bytes .../textures/items/APU0.png.mcmeta | 18 +++++ .../opencomputers/textures/items/APU1.png | Bin 0 -> 885 bytes .../textures/items/APU1.png.mcmeta | 18 +++++ src/main/scala/li/cil/oc/Constants.scala | 2 + .../scala/li/cil/oc/common/init/Items.scala | 4 + .../scala/li/cil/oc/common/item/APU.scala | 17 +++++ .../scala/li/cil/oc/common/item/CPU.scala | 64 +--------------- .../li/cil/oc/common/item/GraphicsCard.scala | 18 +---- .../cil/oc/common/item/traits/CPULike.scala | 70 ++++++++++++++++++ .../cil/oc/common/item/traits/GPULike.scala | 20 +++++ .../integration/opencomputers/DriverAPU.scala | 39 ++++++++++ .../integration/opencomputers/DriverCPU.scala | 19 ++--- .../opencomputers/ModOpenComputers.scala | 5 ++ 19 files changed, 230 insertions(+), 85 deletions(-) create mode 100644 src/main/resources/assets/opencomputers/doc/en_US/item/apu1.md create mode 100644 src/main/resources/assets/opencomputers/doc/en_US/item/apu2.md create mode 100644 src/main/resources/assets/opencomputers/textures/items/APU0.png create mode 100644 src/main/resources/assets/opencomputers/textures/items/APU0.png.mcmeta create mode 100644 src/main/resources/assets/opencomputers/textures/items/APU1.png create mode 100644 src/main/resources/assets/opencomputers/textures/items/APU1.png.mcmeta create mode 100644 src/main/scala/li/cil/oc/common/item/APU.scala create mode 100644 src/main/scala/li/cil/oc/common/item/traits/CPULike.scala create mode 100644 src/main/scala/li/cil/oc/common/item/traits/GPULike.scala create mode 100644 src/main/scala/li/cil/oc/integration/opencomputers/DriverAPU.scala diff --git a/assets/items.psd b/assets/items.psd index 7a3eae4e937eacaf0606cf87dfb5ca60546351b7..e83e67a587f5fbb8b0887aa97cce39cac3d19b0c 100644 GIT binary patch delta 25406 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 HDWM4fq}J(8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/opencomputers/textures/items/APU0.png.mcmeta b/src/main/resources/assets/opencomputers/textures/items/APU0.png.mcmeta new file mode 100644 index 000000000..622c31336 --- /dev/null +++ b/src/main/resources/assets/opencomputers/textures/items/APU0.png.mcmeta @@ -0,0 +1,18 @@ +{ + "animation": { + "frametime": 1, + "frames": [ + { "index": 0, "time": 3 }, + { "index": 1, "time": 3 }, + { "index": 2, "time": 3 }, + { "index": 3, "time": 3 }, + { "index": 4, "time": 3 }, + { "index": 5, "time": 3 }, + { "index": 4, "time": 3 }, + { "index": 3, "time": 3 }, + { "index": 2, "time": 3 }, + { "index": 1, "time": 3 }, + { "index": 0, "time": 3 } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/textures/items/APU1.png b/src/main/resources/assets/opencomputers/textures/items/APU1.png new file mode 100644 index 0000000000000000000000000000000000000000..bc7a83844e15425bd5d4395e60a7b6ef2a9bc454 GIT binary patch literal 885 zcmeAS@N?(olHy`uVBq!ia0vp^0zjO=!3-po`I#mGDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MYjWdLR`5-M1jm>$Bu~`8Y_AFJb(WD+|`HIuU_q&x4WUf ze)GPI3)danuzvmG1q=H7`gR<;Qr)+H^XZE-b{;%^@6qzZrw(1ab?Wy0y_at6IDh5n z&3ny#i;CJ-tvP=7!h^>LPu=v4uDtr>MPv88@YMRKtk%96tK7nh(u%t>%O{kz%Z(#lepsu0DIR{q5_M6Ib0zY&(_Fb7tDQJNXmOE!g&;X~C7YMc2xv zU6{S;UeB@{HM1|By8Ezx?v?IkH(D26yZz$zg$GZjuDeq?Eaktacjzj=S8yv1lk@hW^GYXzWqf=a8*WF z@%ql-H!k1nT^p~;oLMu|;MV;2HOB06+tiPL6Bj?{beZMYjXD!4Q%4ckh5L3H@NiG8 zjS)7P*n2#_SwUj{*;@)%)lU~3I_%T*Y>Kmhi-Y44B%ZztEMGcyx+@+2TKx8+9-EEKmyX9Xsx7V@ zHt0#Vy_S7CJo`qtuD zo{AYSCZEe(!y}aj~4(*9{jJYjC|w4Cdc`eDQ<_AHT9q;c8Yj zVYJnH7kJ`BMR4_&Zbp7?+f}O`fz;;yj_AMoYW@4V*A;74wENq}eEDG0U%lhX;kO?@ zs8sy?%;ME@P<&Q{oZ$BlDHWBgY;PTHXz!N`6e;ANU$tXh^_t^ppN+44?K|F9)pEtz zz2C%lXS<*67rFkBrr-C=7fg|G0=hb|s6V9b_inJOTV4cCQ~l1dvVGm_|6hNoA7JRI Xp78%r@+)m%+F|f?^>bP0l+XkK2c_zZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/opencomputers/textures/items/APU1.png.mcmeta b/src/main/resources/assets/opencomputers/textures/items/APU1.png.mcmeta new file mode 100644 index 000000000..622c31336 --- /dev/null +++ b/src/main/resources/assets/opencomputers/textures/items/APU1.png.mcmeta @@ -0,0 +1,18 @@ +{ + "animation": { + "frametime": 1, + "frames": [ + { "index": 0, "time": 3 }, + { "index": 1, "time": 3 }, + { "index": 2, "time": 3 }, + { "index": 3, "time": 3 }, + { "index": 4, "time": 3 }, + { "index": 5, "time": 3 }, + { "index": 4, "time": 3 }, + { "index": 3, "time": 3 }, + { "index": 2, "time": 3 }, + { "index": 1, "time": 3 }, + { "index": 0, "time": 3 } + ] + } +} \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/Constants.scala b/src/main/scala/li/cil/oc/Constants.scala index 0eaa9d9ff..388173e53 100644 --- a/src/main/scala/li/cil/oc/Constants.scala +++ b/src/main/scala/li/cil/oc/Constants.scala @@ -49,6 +49,8 @@ object Constants { final val Alu = "alu" final val Analyzer = "analyzer" final val AngelUpgrade = "angelUpgrade" + final val APUTier1 = "apu1" + final val APUTier2 = "apu2" final val ArrowKeys = "arrowKeys" final val BatteryUpgradeTier1 = "batteryUpgrade1" final val BatteryUpgradeTier2 = "batteryUpgrade2" 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 d559632a1..21c65db9f 100644 --- a/src/main/scala/li/cil/oc/common/init/Items.scala +++ b/src/main/scala/li/cil/oc/common/init/Items.scala @@ -513,5 +513,9 @@ object Items extends ItemAPI { // 1.5.8 Recipes.addSubItem(new item.UpgradeHover(multi, Tier.One), Constants.ItemName.HoverUpgradeTier1, "oc:hoverUpgrade1") Recipes.addSubItem(new item.UpgradeHover(multi, Tier.Two), Constants.ItemName.HoverUpgradeTier2, "oc:hoverUpgrade2") + + // 1.5.10 + Recipes.addSubItem(new item.APU(multi, Tier.One), Constants.ItemName.APUTier1, "oc:apu1") + Recipes.addSubItem(new item.APU(multi, Tier.Two), Constants.ItemName.APUTier2, "oc:apu2") } } diff --git a/src/main/scala/li/cil/oc/common/item/APU.scala b/src/main/scala/li/cil/oc/common/item/APU.scala new file mode 100644 index 000000000..c6d3ec709 --- /dev/null +++ b/src/main/scala/li/cil/oc/common/item/APU.scala @@ -0,0 +1,17 @@ +package li.cil.oc.common.item + +import scala.language.existentials + +class APU(val parent: Delegator, val tier: Int) extends Delegate with ItemTier with traits.CPULike with traits.GPULike { + override val unlocalizedName = super[Delegate].unlocalizedName + tier + + override def cpuTier = tier + 1 + + override def gpuTier = tier + + override protected def tooltipName = Option(super[Delegate].unlocalizedName) + + override protected def tooltipData: Seq[Any] = { + super[CPULike].tooltipData ++ super[GPULike].tooltipData + } +} diff --git a/src/main/scala/li/cil/oc/common/item/CPU.scala b/src/main/scala/li/cil/oc/common/item/CPU.scala index 525866d37..77fa228d6 100644 --- a/src/main/scala/li/cil/oc/common/item/CPU.scala +++ b/src/main/scala/li/cil/oc/common/item/CPU.scala @@ -1,69 +1,11 @@ package li.cil.oc.common.item -import java.util - -import li.cil.oc.Settings -import li.cil.oc.api -import li.cil.oc.api.machine.Architecture -import li.cil.oc.util.Tooltip -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.item.ItemStack -import net.minecraft.nbt.NBTTagCompound -import net.minecraft.util.ChatComponentTranslation -import net.minecraft.world.World - -import scala.collection.convert.WrapAsScala._ import scala.language.existentials -class CPU(val parent: Delegator, val tier: Int) extends Delegate with ItemTier { +class CPU(val parent: Delegator, val tier: Int) extends Delegate with ItemTier with traits.CPULike { override val unlocalizedName = super.unlocalizedName + tier + override def cpuTier = tier + override protected def tooltipName = Option(super.unlocalizedName) - - override protected def tooltipData = Seq(Settings.get.cpuComponentSupport(tier)) - - override protected def tooltipExtended(stack: ItemStack, tooltip: util.List[String]) { - (if (stack.hasTagCompound) { - Option(stack.getTagCompound.getString(Settings.namespace + "archName")) - } - else { - val architectures = allArchitectures - architectures.headOption.map(_._2) - }) match { - case Some(archName) => tooltip.addAll(Tooltip.get("CPU.Architecture", archName)) - case _ => // No architecture. - } - } - - override def onItemRightClick(stack: ItemStack, world: World, player: EntityPlayer) = { - if (player.isSneaking) { - if (!world.isRemote) { - val architectures = allArchitectures - if (architectures.length > 0) { - val currentIndex = if (stack.hasTagCompound) { - val currentArch = stack.getTagCompound.getString(Settings.namespace + "archClass") - architectures.indexWhere(_._1.getName == currentArch) - } - else { - stack.setTagCompound(new NBTTagCompound()) - -1 - } - val index = (currentIndex + 1) % architectures.length - val (archClass, archName) = architectures(index) - stack.getTagCompound.setString(Settings.namespace + "archClass", archClass.getName) - stack.getTagCompound.setString(Settings.namespace + "archName", archName) - player.addChatMessage(new ChatComponentTranslation(Settings.namespace + "tooltip.CPU.Architecture", archName)) - } - player.swingItem() - } - } - stack - } - - private def allArchitectures = api.Machine.architectures.map { arch => - arch.getAnnotation(classOf[Architecture.Name]) match { - case annotation: Architecture.Name => (arch, annotation.value) - case _ => (arch, arch.getSimpleName) - } - }.toArray } diff --git a/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala b/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala index fafe2d2cb..6b359e41a 100644 --- a/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala +++ b/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala @@ -1,21 +1,9 @@ package li.cil.oc.common.item -import li.cil.oc.Settings -import li.cil.oc.util.PackedColor - -class GraphicsCard(val parent: Delegator, val tier: Int) extends Delegate with ItemTier { +class GraphicsCard(val parent: Delegator, val tier: Int) extends Delegate with ItemTier with traits.GPULike { override val unlocalizedName = super.unlocalizedName + tier - override protected def tooltipName = Option(super.unlocalizedName) + override def gpuTier = tier - override protected def tooltipData = { - val (w, h) = Settings.screenResolutionsByTier(tier) - val depth = PackedColor.Depth.bits(Settings.screenDepthsByTier(tier)) - Seq(w, h, depth, - tier match { - case 0 => "1/1/4/2/2" - case 1 => "2/4/8/4/4" - case 2 => "4/8/16/8/8" - }) - } + override protected def tooltipName = Option(super.unlocalizedName) } \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/item/traits/CPULike.scala b/src/main/scala/li/cil/oc/common/item/traits/CPULike.scala new file mode 100644 index 000000000..0bb60d0eb --- /dev/null +++ b/src/main/scala/li/cil/oc/common/item/traits/CPULike.scala @@ -0,0 +1,70 @@ +package li.cil.oc.common.item.traits + +import java.util + +import li.cil.oc.Settings +import li.cil.oc.api +import li.cil.oc.api.machine.Architecture +import li.cil.oc.common.item.Delegate +import li.cil.oc.util.Tooltip +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NBTTagCompound +import net.minecraft.util.ChatComponentTranslation +import net.minecraft.world.World + +import scala.collection.convert.WrapAsScala._ +import scala.language.existentials + +trait CPULike extends Delegate { + def cpuTier: Int + + override protected def tooltipData: Seq[Any] = Seq(Settings.get.cpuComponentSupport(cpuTier)) + + override protected def tooltipExtended(stack: ItemStack, tooltip: util.List[String]) { + (if (stack.hasTagCompound) { + Option(stack.getTagCompound.getString(Settings.namespace + "archName")) + } + else { + val architectures = allArchitectures + architectures.headOption.map(_._2) + }) match { + case Some(archName) if !archName.isEmpty => tooltip.addAll(Tooltip.get("CPU.Architecture", archName)) + case _ => allArchitectures.headOption.collect { + case ((_, name)) => tooltip.addAll(Tooltip.get("CPU.Architecture", name)) + } + } + } + + override def onItemRightClick(stack: ItemStack, world: World, player: EntityPlayer) = { + if (player.isSneaking) { + if (!world.isRemote) { + val architectures = allArchitectures + if (architectures.length > 0) { + val currentIndex = if (stack.hasTagCompound) { + val currentArch = stack.getTagCompound.getString(Settings.namespace + "archClass") + architectures.indexWhere(_._1.getName == currentArch) + } + else { + stack.setTagCompound(new NBTTagCompound()) + -1 + } + val index = (currentIndex + 1) % architectures.length + val (archClass, archName) = architectures(index) + stack.getTagCompound.setString(Settings.namespace + "archClass", archClass.getName) + stack.getTagCompound.setString(Settings.namespace + "archName", archName) + player.addChatMessage(new ChatComponentTranslation(Settings.namespace + "tooltip.CPU.Architecture", archName)) + } + player.swingItem() + } + } + stack + } + + private def allArchitectures = api.Machine.architectures.map { arch => + arch.getAnnotation(classOf[Architecture.Name]) match { + case annotation: Architecture.Name => (arch, annotation.value) + case _ => (arch, arch.getSimpleName) + } + }.toArray +} diff --git a/src/main/scala/li/cil/oc/common/item/traits/GPULike.scala b/src/main/scala/li/cil/oc/common/item/traits/GPULike.scala new file mode 100644 index 000000000..afe31f028 --- /dev/null +++ b/src/main/scala/li/cil/oc/common/item/traits/GPULike.scala @@ -0,0 +1,20 @@ +package li.cil.oc.common.item.traits + +import li.cil.oc.Settings +import li.cil.oc.common.item.Delegate +import li.cil.oc.util.PackedColor + +trait GPULike extends Delegate { + def gpuTier: Int + + override protected def tooltipData: Seq[Any] = { + val (w, h) = Settings.screenResolutionsByTier(gpuTier) + val depth = PackedColor.Depth.bits(Settings.screenDepthsByTier(gpuTier)) + Seq(w, h, depth, + gpuTier match { + case 0 => "1/1/4/2/2" + case 1 => "2/4/8/4/4" + case 2 => "4/8/16/8/8" + }) + } +} diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/DriverAPU.scala b/src/main/scala/li/cil/oc/integration/opencomputers/DriverAPU.scala new file mode 100644 index 000000000..97fa16316 --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/opencomputers/DriverAPU.scala @@ -0,0 +1,39 @@ +package li.cil.oc.integration.opencomputers + +import li.cil.oc.Constants +import li.cil.oc.api +import li.cil.oc.api.driver.EnvironmentAware +import li.cil.oc.api.driver.EnvironmentHost +import li.cil.oc.api.driver.item.HostAware +import li.cil.oc.common +import li.cil.oc.common.Tier +import li.cil.oc.common.item.Delegator +import li.cil.oc.server.component +import net.minecraft.item.ItemStack + +object DriverAPU extends DriverCPU with HostAware with EnvironmentAware { + override def worksWith(stack: ItemStack) = isOneOf(stack, + api.Items.get(Constants.ItemName.APUTier1), + api.Items.get(Constants.ItemName.APUTier2)) + + override def createEnvironment(stack: ItemStack, host: EnvironmentHost) = + gpuTier(stack) match { + case Tier.One => new component.GraphicsCard.Tier1() + case Tier.Two => new component.GraphicsCard.Tier2() + case _ => null + } + + override def cpuTier(stack: ItemStack) = + Delegator.subItem(stack) match { + case Some(apu: common.item.APU) => apu.tier + case _ => Tier.One + } + + def gpuTier(stack: ItemStack) = + Delegator.subItem(stack) match { + case Some(apu: common.item.APU) => apu.gpuTier + case _ => Tier.One + } + + override def providedEnvironment(stack: ItemStack) = classOf[component.GraphicsCard] +} diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/DriverCPU.scala b/src/main/scala/li/cil/oc/integration/opencomputers/DriverCPU.scala index e21f5e925..81655f760 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/DriverCPU.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/DriverCPU.scala @@ -7,6 +7,7 @@ import li.cil.oc.api import li.cil.oc.api.driver.EnvironmentHost import li.cil.oc.api.driver.item.Processor import li.cil.oc.api.machine.Architecture +import li.cil.oc.api.network.ManagedEnvironment import li.cil.oc.common.Slot import li.cil.oc.common.Tier import li.cil.oc.common.item @@ -15,32 +16,32 @@ import net.minecraft.item.ItemStack import scala.collection.convert.WrapAsScala._ -object DriverCPU extends Item with Processor { +object DriverCPU extends DriverCPU + +abstract class DriverCPU extends Item with Processor { override def worksWith(stack: ItemStack) = isOneOf(stack, api.Items.get(Constants.ItemName.CPUTier1), api.Items.get(Constants.ItemName.CPUTier2), api.Items.get(Constants.ItemName.CPUTier3)) - override def createEnvironment(stack: ItemStack, host: EnvironmentHost) = null + override def createEnvironment(stack: ItemStack, host: EnvironmentHost): ManagedEnvironment = null override def slot(stack: ItemStack) = Slot.CPU - override def tier(stack: ItemStack) = + override def tier(stack: ItemStack) = cpuTier(stack) + + def cpuTier(stack: ItemStack): Int = Delegator.subItem(stack) match { case Some(cpu: item.CPU) => cpu.tier case _ => Tier.One } - override def supportedComponents(stack: ItemStack) = - Delegator.subItem(stack) match { - case Some(cpu: item.CPU) => Settings.get.cpuComponentSupport(cpu.tier) - case _ => Tier.One - } + override def supportedComponents(stack: ItemStack) = Settings.get.cpuComponentSupport(cpuTier(stack)) override def architecture(stack: ItemStack): Class[_ <: Architecture] = { if (stack.hasTagCompound) { val archClass = stack.getTagCompound.getString(Settings.namespace + "archClass") - try return Class.forName(archClass).asSubclass(classOf[Architecture]) catch { + if (!archClass.isEmpty) try return Class.forName(archClass).asSubclass(classOf[Architecture]) catch { case t: Throwable => OpenComputers.log.warn("Failed getting class for CPU architecture. Resetting CPU to use the default.", t) stack.getTagCompound.removeTag(Settings.namespace + "archClass") 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 361fc0844..3997dc7be 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala @@ -87,6 +87,7 @@ object ModOpenComputers extends ModProxy { api.Driver.add(DriverBlockEnvironments) + api.Driver.add(DriverAPU) api.Driver.add(DriverComponentBus) api.Driver.add(DriverCPU) api.Driver.add(DriverDebugCard) @@ -150,6 +151,8 @@ object ModOpenComputers extends ModProxy { Constants.ItemName.TractorBeamUpgrade, Constants.ItemName.LeashUpgrade) blacklistHost(classOf[internal.Drone], + Constants.ItemName.APUTier1, + Constants.ItemName.APUTier2, Constants.ItemName.GraphicsCardTier1, Constants.ItemName.GraphicsCardTier2, Constants.ItemName.GraphicsCardTier3, @@ -162,6 +165,8 @@ object ModOpenComputers extends ModProxy { Constants.ItemName.HoverUpgradeTier1, Constants.ItemName.HoverUpgradeTier2) blacklistHost(classOf[internal.Microcontroller], + Constants.ItemName.APUTier1, + Constants.ItemName.APUTier2, Constants.ItemName.GraphicsCardTier1, Constants.ItemName.GraphicsCardTier2, Constants.ItemName.GraphicsCardTier3,