From f485c7a898d3c927e659a6f6431c04b138eb6439 Mon Sep 17 00:00:00 2001 From: Xyxen Date: Thu, 14 Dec 2017 07:13:35 -0700 Subject: [PATCH] Add creative component bus (#2670) Supports 1024 components by default, and fits into a tier 3 slot. --- assets/items.psd | Bin 629333 -> 630739 bytes src/main/resources/application.conf | 3 ++- .../doc/de_DE/item/componentBusCreative.md | 1 + .../doc/en_us/item/componentBusCreative.md | 1 + .../doc/fr_FR/item/componentBusCreative.md | 1 + .../doc/ru_RU/item/componentBusCreative.md | 1 + .../doc/zh_CN/item/componentBusCreative.md | 1 + .../assets/opencomputers/lang/en_US.lang | 1 + .../textures/items/ComponentBus3.png | Bin 0 -> 3154 bytes src/main/scala/li/cil/oc/Constants.scala | 1 + src/main/scala/li/cil/oc/Settings.scala | 6 +++--- .../scala/li/cil/oc/common/init/Items.scala | 2 ++ .../li/cil/oc/common/item/ComponentBus.scala | 10 ++++++++++ .../opencomputers/DriverComponentBus.scala | 6 ++++-- 14 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/assets/opencomputers/doc/de_DE/item/componentBusCreative.md create mode 100644 src/main/resources/assets/opencomputers/doc/en_us/item/componentBusCreative.md create mode 100644 src/main/resources/assets/opencomputers/doc/fr_FR/item/componentBusCreative.md create mode 100644 src/main/resources/assets/opencomputers/doc/ru_RU/item/componentBusCreative.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBusCreative.md create mode 100644 src/main/resources/assets/opencomputers/textures/items/ComponentBus3.png diff --git a/assets/items.psd b/assets/items.psd index 75f167bfa4eef165c5fc63bf49774f4eb2fb75c4..1c48a13074a881eb43c8daa29095e3b742032d42 100644 GIT binary patch delta 3160 zcmc&#dr(tX8b3G5eNX}hGf0?G5XJCP1Pg=$A%sU-5YZK-MXFe;R0M+M)z%fEx`K}u zl}OLp+J}^>7GX68ygFsqb#{d9Oqpb@_(0vv2yL~xI;&`%6}WrOxi=Opx_|D?+_~p_ zf4}d3znlI}?f0j(duDnz6vif}FH$G~x@3#3;YQhB17|6dsa02*9j}dU*ni`bTh<|u z%4@;4CfQ@kD{{fS2;H&;FUCda;-Yl(B4RC{DWZR?wGAn%8ly}xX)$TZ(YE)v9>xFkvgCW{CaG}9BRWbYzlR$KF90BrYwHCgf5AxY zdrJnE!6nBi3om?4@stcKClYkNO{pxUIV$-17nI62V_6jim;9AdQ#qo!7HKW{?V_2_ zw^0o!^fewO%8NX! zTdJjc1$^BplJiY5XMQ)yxmJ{p{DsO)Aps;Kq+`?_z7 z8&@XVj%&)m<85m{>$_6p9KIMKfW!VLf^VL>bZw!3p?>v+yVjFk|E|tjSOeF_3>3dJ za3XKXftBZLzj$EKhv}P-SU=qR zUSHdxp@^n??)1MZ8n0csaFkezU~cYP@*uwE3dGVut(A^r!wu zbNlN{Up;YaQRCskk`0R2FYLTyPWiL5ee>Qic)H;B?=qUw1NXHyrOycoY)a2a4{XZj zBhFL5_l=GL@&Bb4oI?2er6h{hRoS^#GWwN=nd!NXRP{M@`pP z+prBKsd#P_p^d3RjKUH4GMZ}3OD7bsFqON~j8C7LVjkBd2C=k^G{cFB03d){i8Q^m zu)GMJWaw6*TWVi=$`T#{S;BY1ed5c{sHc-DW@qD`Uwq1;b2}Zxf6zcLk~B^pY1T-> z2sY2;i+0ipqDC`|KeCH{MG_3yd>vl-klsSlX;zE=TN|JFAL7sMe&YY5=>K4^ z{y|=(FVZYk2NZ$;z>5J`x1$9scjRJR+b_XAJLzP&4$_fOXQ5k2N#8);X`w5{hI~zY zZZlmc3F~<0N3PPo4Y-mYzwnQ=Cf7R@B!Og*3KG#T4*inQGXW;{vc0_F9&Mm#0o)fH zu=YM3FCE`5a?{geU|6ujqeX58Nqe`*?IlTzjy^DHz1u9w)GzE8Y&CE62cg~a1gS#DZ%WJkXf@(&g~&g3yJCuI=~)K zf_kY|SSZsBt)UF==i5+bpK45yfez&eplf@@ysN^PS5e**VT=LxhcPPT_%MuFC*tAr z=Q8s5y_ZjddmBW!!}yjCW||EC=_vC83N**E;jm@}mjpXjaJc0BW8w%RdRC{*o2OPc z;kNu7u;&=l2(RZ6pOsb-a6pf)n08l#CJflq0R<}oyyiFo9FU2u#cJ?!c6MqivbG)< z0S9#J3fv3SU>nYi^e@{G;657x{DVyd9MG;tfHz~n$YWzC0er5Li7laZ2F+ag))YHL-ujc&aeEUhJxMtEhRN*;<@XKRZjSM;mIcW}Nm^I`Y zfe(Bf%hux8;@GAWNC3gHOcxbam)xWO7)Hs%`g1jg844KRy#Hh|V z7O#SDJd0OBu0_@}>L;s^8_$wekax#g-K}UcQmv7Awi&IR|C|u57OfpM#}C&MMF;#i zfhEf!7iU!`R+_J8@p3fiSp)n^&*J6i)w5<64TyS#`bWd@_IVT9Np}&?;KnBT($+n1K+dnlF0Ftv%~R>vz=#~r??oWAdIua z^nNz?DZ&l*vqirW4y{|sW%g>Fi&Z}la#0glb#?^@Vb?LlRXZFT;xw=-kK5#;(|__f z0%!uA?C`+r90v4kHU-1tl^g*yfl~GfjM}n_BY+5_6ogTBsLAIrAWSHYAUs7V;eBCL zV7%apn_MtV>S8jVCf7GxU93SkD_yK99OB5koIn_YcKo}1iZ7r1AVQzO7dzDdNT5HP zF2PXwlL&nRXYBC#l$m`)90s9`Vl$?U9iF;DhB2No**Cee-!O)e^Ve^4OE*b>IRBqN IwoBpv1zM4*82|tP delta 2108 zcmb`HdrVVz6vywc^gdW7)@cznB5u&4LZRg)l(tkvR@5QWIUkv_fbU3|Q8(wKpqcVe zP)hkZoy^x{iVC*CPs1YpL!FvTO`xJqg~cU4K-5hj!!dX6?SpP(*+1*e@7{aP@0{QH z+;hHZbCb+bC)*w5_eJOADTbM1F$F(S>KTPzWd2k%T#{Khac-f13p1o+Rx~QQ5O3Qj zdWD8Xs=_0q=BQK&F;NLh<)lcZ`ItE7pI%$1c%4sBa*BRRj4EzgOk9dSC0417kBUi7 zj#KL6r|M&4^-7g3pSvXf&nWYN)EW_B)N<63LG{vvlA#Z$9bTH#T_oPY^gY zO(c?6I|EC{Ltw=360`A)#O4)u(sd3(65O@~Zj0f~mY(T3=#&s(F5N0Ir>6`xYcnOb zoRsx$jMJp@oKU958K%1`F~2V1!-kR9OOWT3T49@9IgjQ_LXw5Cy~&R)&>wCH)S}isWy^^(N!2>*drF#7K=UVfsu%4VByIxbr&h6+=>OYe@^V+2+ z^Ij=C7_xcS#hPO4nuVQ>6B?Qqo_AR9nA)3aPkr=9M1<`Wsor@vx5wHr`n}-NtkB~R z9izfc{m1U5_KnM!q_I@rc+l)%QkLF$HbZ@Pv!S`K(ej-vJNj%}oOvR z1Plp{_=8eV`Q`g>UdPDX6DJ zaGy-H<+RjQw%%D_gN2^s@?0m)6?C4FX@2!QW=#lkfVF{t*s(s> zR}EHvE`->zvX_oScCxyc-lLGlQ|l=V*J0`#>IhXyS*X3#3T(f?O7Ybi#-C_qj93Io zsi8~`M+c34TPCCI_=ixY0uEd^fhqB2sCQ&xayfX%Ok@s$_u51z8)@-xH(8#`(8`A5 z>PgJ!u+!JdT5#npmIMFKVN5x=3c{HWA-Fx9;e#U;%yK|GpkRFRrPBvN+bEzBKnvrk zkd?{7CM(0jd%Kz)i7Ty)2~Lf$F(o)Dlj93HYywq5oj~=pPAH_QXAVQ$i+aWaAD~N{ zJ!6KS9alC8OjC%!`CsTy%WL z3KCiGjwv)O-?5)GEZ?zdTA^bVT9#)^(?PSkbV9Rwbu8bk{Yfm}tn@AcELqRy03U#j zB8q1m<3n1fvMna5hS~%}JOCrDq7K1GE2w?cN&+M8K+^O<_BIjwrGMMYCHBkw-k_=^ zph~qbvRAaQYX`KkvxUXL8tq`qy|mHp5WckRCcE@6+BgWI-m<8=#ah5M{Wd#)Ko;G% z*%eM%jPt?Kzi{Kpk$Y@oo>18z+aGa(IKs*#xs}kph~o+FKjs2({bFvDTM33tj_>xX zOpa$5P(moa^D*}s?EFm*8BaNXEX(3}Mb%|-JdjHhi?X?mPECySAwJ8wue?|mxkn!R z*p1=ch@vL~L}G^kF);E_Jf>5C@SZym@ZIQsDin9k{p&8y=r#9wCNTcDzl4wg5>)7G G^Zyeg69|0( diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index 9c834010e..faeec0252 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -145,11 +145,12 @@ opencomputers { eepromDataSize: 256 # The number of components the different CPU tiers support. This list - # must contain exactly three entries, or it will be ignored. + # must contain exactly four entries, or it will be ignored. cpuComponentCount: [ 8 12 16 + 1024 ] # The provided call budgets by the three tiers of CPU and memory. Higher diff --git a/src/main/resources/assets/opencomputers/doc/de_DE/item/componentBusCreative.md b/src/main/resources/assets/opencomputers/doc/de_DE/item/componentBusCreative.md new file mode 100644 index 000000000..a49cd378a --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/de_DE/item/componentBusCreative.md @@ -0,0 +1 @@ +#REDIRECT componentBus1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/en_us/item/componentBusCreative.md b/src/main/resources/assets/opencomputers/doc/en_us/item/componentBusCreative.md new file mode 100644 index 000000000..a49cd378a --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/en_us/item/componentBusCreative.md @@ -0,0 +1 @@ +#REDIRECT componentBus1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/item/componentBusCreative.md b/src/main/resources/assets/opencomputers/doc/fr_FR/item/componentBusCreative.md new file mode 100644 index 000000000..a49cd378a --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/item/componentBusCreative.md @@ -0,0 +1 @@ +#REDIRECT componentBus1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/item/componentBusCreative.md b/src/main/resources/assets/opencomputers/doc/ru_RU/item/componentBusCreative.md new file mode 100644 index 000000000..a49cd378a --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/item/componentBusCreative.md @@ -0,0 +1 @@ +#REDIRECT componentBus1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBusCreative.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBusCreative.md new file mode 100644 index 000000000..a49cd378a --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBusCreative.md @@ -0,0 +1 @@ +#REDIRECT componentBus1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/lang/en_US.lang b/src/main/resources/assets/opencomputers/lang/en_US.lang index e938d2ce9..79d7002d6 100644 --- a/src/main/resources/assets/opencomputers/lang/en_US.lang +++ b/src/main/resources/assets/opencomputers/lang/en_US.lang @@ -57,6 +57,7 @@ item.oc.CircuitBoard.name=Circuit Board item.oc.ComponentBus0.name=Component Bus (Tier 1) item.oc.ComponentBus1.name=Component Bus (Tier 2) item.oc.ComponentBus2.name=Component Bus (Tier 3) +item.oc.ComponentBus3.name=Component Bus (Creative) item.oc.ControlUnit.name=Control Unit (CU) item.oc.CPU0.name=Central Processing Unit (CPU) (Tier 1) item.oc.CPU1.name=Central Processing Unit (CPU) (Tier 2) diff --git a/src/main/resources/assets/opencomputers/textures/items/ComponentBus3.png b/src/main/resources/assets/opencomputers/textures/items/ComponentBus3.png new file mode 100644 index 0000000000000000000000000000000000000000..8d58a787dc7a79f7ee29130ec37189c9ae6f051a GIT binary patch literal 3154 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 literal 0 HcmV?d00001 diff --git a/src/main/scala/li/cil/oc/Constants.scala b/src/main/scala/li/cil/oc/Constants.scala index 3eee3ce77..d64a6d8d5 100644 --- a/src/main/scala/li/cil/oc/Constants.scala +++ b/src/main/scala/li/cil/oc/Constants.scala @@ -73,6 +73,7 @@ object Constants { final val ComponentBusTier1 = "componentBus1" final val ComponentBusTier2 = "componentBus2" final val ComponentBusTier3 = "componentBus3" + final val ComponentBusCreative = "componentBusCreative" final val CPUTier1 = "cpu1" final val CPUTier2 = "cpu2" final val CPUTier3 = "cpu3" diff --git a/src/main/scala/li/cil/oc/Settings.scala b/src/main/scala/li/cil/oc/Settings.scala index a7a8efee4..ebf349a9c 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -62,11 +62,11 @@ class Settings(val config: Config) { val eepromSize = config.getInt("computer.eepromSize") max 0 val eepromDataSize = config.getInt("computer.eepromDataSize") max 0 val cpuComponentSupport = Array(config.getIntList("computer.cpuComponentCount"): _*) match { - case Array(tier1, tier2, tier3) => - Array(tier1: Int, tier2: Int, tier3: Int) + case Array(tier1, tier2, tier3, tierCreative) => + Array(tier1: Int, tier2: Int, tier3: Int, tierCreative: Int) case _ => OpenComputers.log.warn("Bad number of CPU component counts, ignoring.") - Array(8, 12, 16) + Array(8, 12, 16, 1024) } val callBudgets = Array(config.getDoubleList("computer.callBudgets"): _*) match { case Array(tier1, tier2, tier3) => 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 6864a77da..14dcbda09 100644 --- a/src/main/scala/li/cil/oc/common/init/Items.scala +++ b/src/main/scala/li/cil/oc/common/init/Items.scala @@ -540,6 +540,8 @@ object Items extends ItemAPI { registerItem(new item.DiamondChip(multi), Constants.ItemName.DiamondChip) Recipes.addSubItem(new item.UpgradeMF(multi), Constants.ItemName.MFU, "oc:mfu") + registerItem(new item.ComponentBus(multi, Tier.Four), Constants.ItemName.ComponentBusCreative) + // Register aliases. for ((k, v) <- aliases) { descriptors.getOrElseUpdate(k, descriptors(v)) diff --git a/src/main/scala/li/cil/oc/common/item/ComponentBus.scala b/src/main/scala/li/cil/oc/common/item/ComponentBus.scala index 7d03028be..867fe47fe 100644 --- a/src/main/scala/li/cil/oc/common/item/ComponentBus.scala +++ b/src/main/scala/li/cil/oc/common/item/ComponentBus.scala @@ -1,10 +1,20 @@ package li.cil.oc.common.item import li.cil.oc.Settings +import li.cil.oc.common.Tier +import li.cil.oc.util.Rarity +import net.minecraft.item.EnumRarity +import net.minecraft.item.ItemStack class ComponentBus(val parent: Delegator, val tier: Int) extends traits.Delegate with traits.ItemTier { override val unlocalizedName = super.unlocalizedName + tier + // Because the driver considers the creative bus to be tier 3, the superclass + // will believe it has T3 rarity. We override that here. + override def rarity(stack: ItemStack): EnumRarity = + if (tier == Tier.Four) Rarity.byTier(Tier.Four) + else super.rarity(stack) + override protected def tooltipName = Option(super.unlocalizedName) override protected def tooltipData = Seq(Settings.get.cpuComponentSupport(tier)) diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/DriverComponentBus.scala b/src/main/scala/li/cil/oc/integration/opencomputers/DriverComponentBus.scala index 429568eee..eae787469 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/DriverComponentBus.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/DriverComponentBus.scala @@ -15,15 +15,17 @@ object DriverComponentBus extends Item with Processor { override def worksWith(stack: ItemStack) = isOneOf(stack, api.Items.get(Constants.ItemName.ComponentBusTier1), api.Items.get(Constants.ItemName.ComponentBusTier2), - api.Items.get(Constants.ItemName.ComponentBusTier3)) + api.Items.get(Constants.ItemName.ComponentBusTier3), + api.Items.get(Constants.ItemName.ComponentBusCreative)) override def createEnvironment(stack: ItemStack, host: EnvironmentHost) = null override def slot(stack: ItemStack) = Slot.ComponentBus + // Clamp item tier because the creative bus needs to fit into tier 3 slots. override def tier(stack: ItemStack) = Delegator.subItem(stack) match { - case Some(bus: item.ComponentBus) => bus.tier + case Some(bus: item.ComponentBus) => bus.tier min Tier.Three case _ => Tier.One }