From f485c7a898d3c927e659a6f6431c04b138eb6439 Mon Sep 17 00:00:00 2001 From: Xyxen Date: Thu, 14 Dec 2017 07:13:35 -0700 Subject: [PATCH 01/10] 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 zcmV-Y46XBtP)EX>4Tx07!|QmUmQC*A|D*y?1({%`g-xL+`x}AiX!K z(nMjH8DJ;_4l^{dA)*2iMMMM@L4qO%jD{kyB8r88V8I@cAfUux6j4!mGqP56<>kGX zm){>}eQTe+_dRFteb%}Fki7l5ymVL!fHa~vAmcQ7uoQ$&mudEnVrUCi&%W-40ak@%snFBnkD3j81WZzQ5Khz zE#g}u)=U+qaYg)A9Gk{rW&(gBiR}UoD@nwrA|~;}Lfk~W6aXA4@hgu1iUph;f%sBx z=^43vZeo&vuFKM+o7vhj=-!;{RE|Jk6vSkuF!^k{TY6dsla~v?;+;QBMqFFEsL0l4 zw$|20=Ei1U73#lk{!NK{yGXBsKlcox^?kAZm0x;20E}5tZFYRI#qR~6V>1Bq_rKUQ z4+0=5>RbE3SNEZb=OsxX$gndp$O~2}Gii1cZ;QLyD0~q#kKOx{zMvCNhFdBkxcc6a_^`8KLY^ z-l*j$7HTzW9jX*njXHvANA;j?qDE0Os847zS_y4{wnO`%BhiWIY;+O265WVyLtjGQ zMvtT4U@#aOMh9bq@y0}9k}+#ArI`JgR?K_yPPl zex4vr&>=Vw!U)NPjf5&f3*i#sA>kE~NK_}<5`&3c;s# zLeh59VbXchJ<=;OnXFBACP$M6>atgt3H=1Y2UgM2$qd#E`@bNxY<% zq>JP#$vnwQ$&-=;lG9RnDQzh?DW=pqsT!$MQo~ZS(iCYk=|Jf;=~C&V(pRM?Ww0{Z zG9EH)nL?REG8bjWC@3{{8fLrtcZP`{)0Q)gslWG!XGWpiX} zWY5Ts&=8t7&4-psE2EvD-J!jgQfv(`8 zkfN|tp+n)3B1%zTF<3EM@qpqb#pxx~CH6~LONy7ASaM$pR?=4rQCg#PNU2Y0R#`>a zOF2V%ukuCZX%(7^vr4i`h00l#DOHN9qbgUmLiL>LGrBC@g`P^UqW92e)Rfe`)r4ww zYW-^S>N@Jn)eF>H)gNgPG#DBQ8WkGd8Z(-zngN>mn$4Q`weVUDtt72ITD@9x+B(`1 z+FP_cv?q1sb$oR4beeS@>XLPxbXV)v>)z7C=rQzC^!DrB(1-P{^po^!^al)J18W1W z!G425L$sl-Ayeeqo|%5^b{6q}Sw=sg-G}X@ltl zGZ`~qvjVd&v)|42%~|F(=C>@!7M>RCEjle;S{hh#EDu=TwW3%BSZ%TDw)$voW6ig2 zv7WNgw28CXXEV&8GJ+VTj4QTiTUXolwx@01*;(5O>`vJIW^ZJlVt>?ra;eTz&eDdZ zV-D&LOouv$5l6aXoZ~^q5hpb#rc=Gs6K4%)wsWKNgo~a_vdb}-7p|tReAhPDIX64E zwQlF#5qB^5V)uRz8IR>2)gF&M)jbnEn>}Z|ti0BEo%cq2`+4v59`;f8Vfi%q%=p^) zuJ!HlBl(5;Rr@{h*Z1f9cLl%!z5%-e9xl^b##`1A2m*ZqcLhEQ(g|7}^kXn4I4HO# z_-Tk)NPb9fC?zyD^l0dtFxRlMum{U^mkXD7hf9XXgg1rHMYuc#Ks{QOuo{IxBNlUR|ZQDs|PFSjkvs?8!KETtwW_xDU)g zW<7H@-Y0%v{0z&DwTJbb?aZ!VPjMVL<(!EGhlKKk$wY_5U5QgkPDzzX(_A-hHTPw* zcXDm=TuNZd;gp5ch}70JTv}Y(DV_{3h1Zj=lAe=3m|>7nlrgf}ZuRcfGkiaOVz}3Y2Bx^Z`;1P{p|fi2b>SI)GF7O)V@E+J$SdytFFCXyT0-e=1|t5rw!o^z27pv zZE93(ENT3Bn0I*ONXU_%CYz?Fqe@51n&D<)^VG4JV>iBY|E{yesHLuz)>?8L92Xvc z_I=#J{_+2=_${t8_!le8-Jehe15v28mBOpTuPtA9&j!stev|fQey;ef!rLS781H)DN4%ey&;Ee@ zQ1wyoW7j9YPY)N;78d>m1DNyt6gNdX0000WV@Og>004R>004l5008;`004mK004C` z008P>0026e000+ooVrmw0004@NklyQ6e_fXi6Gi)LzO`C%nx6Zm*eo7w6Bq_ z;(^OO=iYP9_sjPj_}8WZFndJ+DE$ilRvW>%+YQEFMKgQ;q!Fbm9=fUf$Iu~i8302W zcx?|WY+;7{lH%T{GYqCLNiO@2)#oqxa`+AB$1wnvqwfH$udHx&>@$f(lt@Goi!Bh3 z$F)F%$wZtO*ZH`!9bj22ml?l1j$s+7sG{9y15o%-fP<5I#tg~jax!)Mj=Wjg64SC| z$hIXqG9rLH+t`qNepPmNm!(j6B&AYGdH{V5(ralnhWp5`(wk&n-v{8y+oxo=6aa43 z1zti7!QoWI?1L;z50`P86%3_tnw5UD`I!tiZ~eSLgQO_v0d7N2iZgG)Xxje8e>C_zeW_3cL&czH`^%ek~-yMH%T3s~DPq9bs szcT1I7=V>CPwvUxJeTA2#`s^`A8ibnYuLyj^Z)<=07*qoM6N<$f_%CXO#lD@ 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 } From 11f2c0a35801fffd5a590f28cc3723a28e95e923 Mon Sep 17 00:00:00 2001 From: TheCodex6824 Date: Thu, 14 Dec 2017 10:44:23 -0500 Subject: [PATCH 02/10] Add tier 1 wireless card (#2657) * Added tier 1 wireless card as discussed in #2562 * Update lang/doc files Remove unneeded component callback override Add alias for old wlanCard name * Moved wired and wireless max ports into one array Added tested OreDict entry for wlanCard * Bump version number for config updates Fix typo in config comment --- src/main/resources/application.conf | 12 ++- .../opencomputers/doc/de_DE/block/relay.md | 2 +- .../opencomputers/doc/de_DE/block/robot.md | 2 +- .../opencomputers/doc/de_DE/item/index.md | 2 +- .../de_DE/item/{wlanCard.md => wlanCard1.md} | 2 +- .../opencomputers/doc/de_DE/item/wlanCard2.md | 1 + .../opencomputers/doc/en_US/block/relay.md | 2 +- .../opencomputers/doc/en_US/block/robot.md | 2 +- .../opencomputers/doc/en_US/block/switch.md | 2 +- .../opencomputers/doc/en_US/item/index.md | 2 +- .../doc/en_US/item/nanomachines.md | 2 +- .../en_US/item/{wlanCard.md => wlanCard1.md} | 4 +- .../opencomputers/doc/en_US/item/wlanCard2.md | 1 + .../opencomputers/doc/fr_FR/block/relay.md | 2 +- .../opencomputers/doc/fr_FR/block/robot.md | 2 +- .../opencomputers/doc/fr_FR/block/switch.md | 2 +- .../opencomputers/doc/fr_FR/item/index.md | 2 +- .../doc/fr_FR/item/nanomachines.md | 2 +- .../fr_FR/item/{wlanCard.md => wlanCard1.md} | 2 +- .../opencomputers/doc/fr_FR/item/wlanCard2.md | 1 + .../opencomputers/doc/ru_RU/block/relay.md | 2 +- .../opencomputers/doc/ru_RU/block/robot.md | 2 +- .../opencomputers/doc/ru_RU/block/switch.md | 2 +- .../opencomputers/doc/ru_RU/item/index.md | 2 +- .../doc/ru_RU/item/nanomachines.md | 2 +- .../ru_RU/item/{wlanCard.md => wlanCard1.md} | 2 +- .../opencomputers/doc/ru_RU/item/wlanCard2.md | 1 + .../opencomputers/doc/zh_CN/block/_robot.md | 2 +- .../opencomputers/doc/zh_CN/block/relay.md | 2 +- .../opencomputers/doc/zh_CN/block/robot.md | 2 +- .../opencomputers/doc/zh_CN/block/switch.md | 2 +- .../opencomputers/doc/zh_CN/item/index.md | 2 +- .../zh_CN/item/{wlanCard.md => wlanCard1.md} | 2 +- .../opencomputers/doc/zh_CN/item/wlanCard2.md | 1 + .../assets/opencomputers/lang/de_DE.lang | 3 +- .../assets/opencomputers/lang/en_US.lang | 3 +- .../assets/opencomputers/lang/fr_FR.lang | 3 +- .../assets/opencomputers/lang/it_IT.lang | 3 +- .../assets/opencomputers/lang/pt_BR.lang | 3 +- .../assets/opencomputers/lang/pt_PT.lang | 3 +- .../assets/opencomputers/lang/ru_RU.lang | 3 +- .../assets/opencomputers/lang/zh_CN.lang | 3 +- .../assets/opencomputers/lang/zh_TW.lang | 3 +- .../opencomputers/recipes/default.recipes | 16 +-- .../opencomputers/recipes/gregtech.recipes | 9 +- .../opencomputers/recipes/hardmode.recipes | 14 ++- .../opencomputers/recipes/peaceful.recipes | 6 +- .../textures/items/WirelessNetworkCard0.png | Bin 0 -> 473 bytes ...tworkCard.png => WirelessNetworkCard1.png} | Bin src/main/scala/li/cil/oc/Constants.scala | 3 +- src/main/scala/li/cil/oc/Settings.scala | 31 +++++- .../scala/li/cil/oc/common/Achievement.scala | 3 +- src/main/scala/li/cil/oc/common/Proxy.scala | 6 +- .../oc/common/component/TerminalServer.scala | 2 +- .../cil/oc/common/component/TextBuffer.scala | 2 +- .../scala/li/cil/oc/common/init/Items.scala | 16 +-- .../scala/li/cil/oc/common/item/Present.scala | 3 +- .../oc/common/item/WirelessNetworkCard.scala | 8 +- .../common/nanomachines/ControllerImpl.scala | 3 +- .../oc/common/tileentity/AccessPoint.scala | 12 ++- .../li/cil/oc/common/tileentity/Relay.scala | 34 +++--- .../DriverWirelessNetworkCard.scala | 28 +++-- .../cil/oc/server/component/LinkedCard.scala | 3 +- .../cil/oc/server/component/NetworkCard.scala | 15 ++- .../server/component/UpgradeNavigation.scala | 5 +- .../component/WirelessNetworkCard.scala | 102 +++++++++++++----- 66 files changed, 291 insertions(+), 132 deletions(-) rename src/main/resources/assets/opencomputers/doc/de_DE/item/{wlanCard.md => wlanCard1.md} (94%) create mode 100644 src/main/resources/assets/opencomputers/doc/de_DE/item/wlanCard2.md rename src/main/resources/assets/opencomputers/doc/en_US/item/{wlanCard.md => wlanCard1.md} (68%) create mode 100644 src/main/resources/assets/opencomputers/doc/en_US/item/wlanCard2.md rename src/main/resources/assets/opencomputers/doc/fr_FR/item/{wlanCard.md => wlanCard1.md} (94%) create mode 100644 src/main/resources/assets/opencomputers/doc/fr_FR/item/wlanCard2.md rename src/main/resources/assets/opencomputers/doc/ru_RU/item/{wlanCard.md => wlanCard1.md} (99%) create mode 100644 src/main/resources/assets/opencomputers/doc/ru_RU/item/wlanCard2.md rename src/main/resources/assets/opencomputers/doc/zh_CN/item/{wlanCard.md => wlanCard1.md} (90%) create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard2.md create mode 100644 src/main/resources/assets/opencomputers/textures/items/WirelessNetworkCard0.png rename src/main/resources/assets/opencomputers/textures/items/{WirelessNetworkCard.png => WirelessNetworkCard1.png} (100%) diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index faeec0252..eb7745abd 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -703,7 +703,8 @@ opencomputers { # 400 * `wirelessCostPerRange`. In other words, the higher this value, # the higher the cost of wireless messages. # See also: `maxWirelessRange`. - wirelessCostPerRange: 0.05 + # These values are for the tier 1 and 2 wireless cards, in that order. + wirelessCostPerRange: [0.05, 0.05] # The cost of a single packet sent via StargateTech 2's abstract bus. abstractBusPacket: 1 @@ -1225,10 +1226,12 @@ opencomputers { # packet. This limit mostly serves as a protection for lower-tier # computers, to avoid them getting nuked by more powerful computers. maxNetworkPacketParts: 8 - + # The maximum number of ports a single network card can have opened at # any given time. - maxOpenPorts: 16 + # Note that the order for this list is: Wired Network Card -> Tier 1 Wireless + # Network Card -> Tier 2 Wireless Network Card + maxOpenPorts: [16, 1, 16] # The maximum distance a wireless message can be sent. In other words, # this is the maximum signal strength a wireless network card supports. @@ -1236,7 +1239,8 @@ opencomputers { # which may or may not lead to performance issues for ridiculous ranges - # like, you know, more than the loaded area. # See also: `wirelessCostPerRange`. - maxWirelessRange: 400 + # These values are for the tier 1 and 2 wireless cards, in that order. + maxWirelessRange: [16, 400] # The number of remote terminals supported by each server tier. terminalsPerTier: [2, 4, 8] diff --git a/src/main/resources/assets/opencomputers/doc/de_DE/block/relay.md b/src/main/resources/assets/opencomputers/doc/de_DE/block/relay.md index 76b2d011d..e2842edd6 100644 --- a/src/main/resources/assets/opencomputers/doc/de_DE/block/relay.md +++ b/src/main/resources/assets/opencomputers/doc/de_DE/block/relay.md @@ -4,7 +4,7 @@ Das Relay kann verwendet werden um verschiedene Subnetzwerken das Senden von Nachrichten zueinander zu ermöglichen, ohne Komponenten Computern in anderen Netzen zugänglich zu machen. Grundsätzlich ist es eine gute Idee Komponenten lokal zu behalten, damit [Computer](../general/computer.md) nicht die falschen Komponenten ansprechen oder Komponenten-Overflows zu verursachen (welche dazu führen, dass Computer crashen und nicht hochfahren.) -Mit einer [Drahtlosnetzwerkkarte](../item/wlanCard.md) können auch kabellose Nachrichten weitergeleitet werden. Dann kann dieser Block als Repeater verwendet werden: Es kann Nachrichten aus verkabelten Netzwerken zu anderen Geräten in verkabelten Netzwerken weiterleiten, oder Nachrichten aus kabellosen Netzwerken zu verkabelten oder kabellosen Netzwerken. +Mit einer [Drahtlosnetzwerkkarte](../item/wlanCard1.md) können auch kabellose Nachrichten weitergeleitet werden. Dann kann dieser Block als Repeater verwendet werden: Es kann Nachrichten aus verkabelten Netzwerken zu anderen Geräten in verkabelten Netzwerken weiterleiten, oder Nachrichten aus kabellosen Netzwerken zu verkabelten oder kabellosen Netzwerken. Relays führen *kein Protokoll* über kürzlich versendete Nachrichten, also ist es wichtig, Kreisläufe im Netzwerk zu vermeiden, oder das selbe Paket kann mehrmals empfangen werden. Aufgrund der geringen Puffergröße von Switches kann Paketverlust zu einem Problem werden, wenn Netzwerknachrichten zu oft gesendet werden. Ein Upgrade für Switches und Access Points zur Beschleunigung der Nachrichtenweiterleitung ist möglich, genau wie die interne Nachrichtenqueue erweitert werden kann. diff --git a/src/main/resources/assets/opencomputers/doc/de_DE/block/robot.md b/src/main/resources/assets/opencomputers/doc/de_DE/block/robot.md index 54ea87f73..0f4a9ac6c 100644 --- a/src/main/resources/assets/opencomputers/doc/de_DE/block/robot.md +++ b/src/main/resources/assets/opencomputers/doc/de_DE/block/robot.md @@ -2,7 +2,7 @@ ![Er hieß Retobor.](block:OpenComputers:robot) -Im Gegensatz zu [Computern](../general/computer.md) können Roboter sich bewegen und mit der Welt fast wie ein Spieler interagieren. Sie können jedoch *nicht* mit externen Komponenten interagieren. Wenn die Kommunikation mit einem Computer benötigt wird, muss eine [kabellose Netzwerkkarte](../item/wlanCard.md) verwendet werden, oder ein Low-Level-Protokoll mit Redstonesignalen erstellt werden. +Im Gegensatz zu [Computern](../general/computer.md) können Roboter sich bewegen und mit der Welt fast wie ein Spieler interagieren. Sie können jedoch *nicht* mit externen Komponenten interagieren. Wenn die Kommunikation mit einem Computer benötigt wird, muss eine [kabellose Netzwerkkarte](../item/wlanCard1.md) verwendet werden, oder ein Low-Level-Protokoll mit Redstonesignalen erstellt werden. Roboter werden gebaut, indem ein [Computergehäuse](case1.md) jeder Stufe in einer [Elektronik-Werkbank](assembler.md) verwendet werden. Hochstufige [Computergehäuse](case1.md) erlauben komplexere Roboter, da sie eine bessere [CPU](../item/cpu1.md) verwalten können. Die Komplexität des Roboters ist von den Stufen der verwendeten Komponenten und Upgrades abhängig, wobei hochstufige Komponenten komplexer sind als niedrigstufige Komponenten. Wenn der Roboter zu komplex ist, kann die [Elektronik-Werkbank](assembler.md) den Roboter nicht bauen. diff --git a/src/main/resources/assets/opencomputers/doc/de_DE/item/index.md b/src/main/resources/assets/opencomputers/doc/de_DE/item/index.md index 24ee97624..f43ad33f6 100644 --- a/src/main/resources/assets/opencomputers/doc/de_DE/item/index.md +++ b/src/main/resources/assets/opencomputers/doc/de_DE/item/index.md @@ -27,7 +27,7 @@ Je nach dem, welches Recipe Set verwendet wird können einzelne Items nicht verf * [Verknüpfte Karte](linkedCard.md) * [Netzwerkkarte](lanCard.md) * [Redstonekarte](redstoneCard1.md) -* [Drahtlosnetzwerkkarte](wlanCard.md) +* [Drahtlosnetzwerkkarte](wlanCard1.md) * [Weltsensorkarte](worldSensorCard.md) ### Upgrades diff --git a/src/main/resources/assets/opencomputers/doc/de_DE/item/wlanCard.md b/src/main/resources/assets/opencomputers/doc/de_DE/item/wlanCard1.md similarity index 94% rename from src/main/resources/assets/opencomputers/doc/de_DE/item/wlanCard.md rename to src/main/resources/assets/opencomputers/doc/de_DE/item/wlanCard1.md index 012819cef..ca07529a3 100644 --- a/src/main/resources/assets/opencomputers/doc/de_DE/item/wlanCard.md +++ b/src/main/resources/assets/opencomputers/doc/de_DE/item/wlanCard1.md @@ -1,6 +1,6 @@ # Drahtlosnetzwerkkarte -![Kann Krebs verursachen. Oder nicht.](oredict:oc:wlanCard) +![Kann Krebs verursachen. Oder nicht.](oredict:oc:wlanCard2) Die kabellose Netzwerkkarte ist eine aufgewertete [Netzwerkkarte](lanCard.md) die, zusätzlich zu verkabelten Nachrichten, zudem das Senden von Nachrichten über kabellose Netzwerke ermöglicht. Die Signalstärke kontrolliert die Distanz über die Nachrichten versendet werden können. Die Signalstärke gleicht der Distanz in Blöcken. diff --git a/src/main/resources/assets/opencomputers/doc/de_DE/item/wlanCard2.md b/src/main/resources/assets/opencomputers/doc/de_DE/item/wlanCard2.md new file mode 100644 index 000000000..5afe21e05 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/de_DE/item/wlanCard2.md @@ -0,0 +1 @@ +#REDIRECT wlanCard1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/en_US/block/relay.md b/src/main/resources/assets/opencomputers/doc/en_US/block/relay.md index 212369838..94fc589c2 100644 --- a/src/main/resources/assets/opencomputers/doc/en_US/block/relay.md +++ b/src/main/resources/assets/opencomputers/doc/en_US/block/relay.md @@ -4,7 +4,7 @@ The relay can be used to allow different subnetworks to send network messages to each other, without exposing components to [computers](../general/computer.md) in other networks. Keeping components local is usually a good idea, to avoid [computers](../general/computer.md) using the wrong [screen](screen1.md) or to avoid component overflows to happen (causing [computers](../general/computer.md) to crash and refuse to boot up). -The relay can be upgraded by inserting a [wireless network card](../item/wlanCard.md) to also relay messages wirelessly. Wireless messages can be received and relayed by other relays with a wireless network card, or by [computers](../general/computer.md) with a wireless network card. +The relay can be upgraded by inserting a [wireless network card](../item/wlanCard1.md) to also relay messages wirelessly. Wireless messages can be received and relayed by other relays with a wireless network card, or by [computers](../general/computer.md) with a wireless network card. Alternatively the relay can be upgraded using [linked cards](../item/linkedCard.md). In this case it will forward messages through the tunnel provided by the linked card, too; at the usual cost, so make sure the relay is sufficiently powered. diff --git a/src/main/resources/assets/opencomputers/doc/en_US/block/robot.md b/src/main/resources/assets/opencomputers/doc/en_US/block/robot.md index 7b32bc5c0..5fb4be3cb 100644 --- a/src/main/resources/assets/opencomputers/doc/en_US/block/robot.md +++ b/src/main/resources/assets/opencomputers/doc/en_US/block/robot.md @@ -2,7 +2,7 @@ ![His name was Tobor.](block:OpenComputers:robot) -Unlike [computers](../general/computer.md), robots can move around and interact with the world much like a player can. They can *not* interact with external components, however! If you need to communicate with a [computer](../general/computer.md) or other robots, use a [wireless network card](../item/wlanCard.md), or create some low-level protocol using redstone signals via a [redstone card](../item/redstoneCard1.md), for example. +Unlike [computers](../general/computer.md), robots can move around and interact with the world much like a player can. They can *not* interact with external components, however! If you need to communicate with a [computer](../general/computer.md) or other robots, use a [wireless network card](../item/wlanCard1.md), or create some low-level protocol using redstone signals via a [redstone card](../item/redstoneCard1.md), for example. Robots are built by placing a [computer case](case1.md) of any tier in an [assembler](assembler.md). Higher tier [computer cases](case1.md) can build more complex robots, due to being able to hold a higher tier [CPU](../item/cpu1.md). Complexity of the robot (as shown in the [assembler](assembler.md)) is determined by the tier of the components and upgrades placed in the robot slots; higher tier components will increase the complexity more than a lower tier component. If the complexity of the robot is too high, the [assembler](assembler.md) will not build the robot. diff --git a/src/main/resources/assets/opencomputers/doc/en_US/block/switch.md b/src/main/resources/assets/opencomputers/doc/en_US/block/switch.md index 35ad59fd4..cff609e1c 100644 --- a/src/main/resources/assets/opencomputers/doc/en_US/block/switch.md +++ b/src/main/resources/assets/opencomputers/doc/en_US/block/switch.md @@ -6,7 +6,7 @@ The switch can be used to allow different subnetworks to send network messages to each other, without exposing components to [computers](../general/computer.md) in other networks. Keeping components local is usually a good idea, to avoid [computers](../general/computer.md) using the wrong [screen](screen1.md) or to avoid component overflows to happen (causing [computers](../general/computer.md) to crash and refuse to boot up). -There is also a wireless variation of this block, called the [access point](accessPoint.md), which will also relay messages wirelessly. Wireless messages can be received and relayed by other [access points](accessPoint.md), or by [computers](../general/computer.md) with a [wireless network card](../item/wlanCard.md). +There is also a wireless variation of this block, called the [access point](accessPoint.md), which will also relay messages wirelessly. Wireless messages can be received and relayed by other [access points](accessPoint.md), or by [computers](../general/computer.md) with a [wireless network card](../item/wlanCard1.md). Switches and [access points](accessPoint.md) do *not* keep track of which packets they relayed recently, so avoid cycles in your network or you may receive the same packet multiple times. Due to the limited buffer size of switches, sending messages too frequently will result in packet loss. You can upgrade your switches and [access points](accessPoint.md) to increase the speed with which they relay messages, as well as their internal message queue size. diff --git a/src/main/resources/assets/opencomputers/doc/en_US/item/index.md b/src/main/resources/assets/opencomputers/doc/en_US/item/index.md index f0eb3a298..2a5d9592c 100644 --- a/src/main/resources/assets/opencomputers/doc/en_US/item/index.md +++ b/src/main/resources/assets/opencomputers/doc/en_US/item/index.md @@ -27,7 +27,7 @@ Keep in mind that some of these may not be available, depending on the recipe se * [Linked Card](linkedCard.md) * [Network Card](lanCard.md) * [Redstone Card](redstoneCard1.md) -* [Wireless Network Card](wlanCard.md) +* [Wireless Network Card](wlanCard1.md) * [World Sensor Card](worldSensorCard.md) ### Upgrades diff --git a/src/main/resources/assets/opencomputers/doc/en_US/item/nanomachines.md b/src/main/resources/assets/opencomputers/doc/en_US/item/nanomachines.md index ac87a14e9..aa1f48ce7 100644 --- a/src/main/resources/assets/opencomputers/doc/en_US/item/nanomachines.md +++ b/src/main/resources/assets/opencomputers/doc/en_US/item/nanomachines.md @@ -10,7 +10,7 @@ Nanomachines provide a certain number of "inputs" that can be triggered, causing Which input triggers what effect depends on the current configuration of the nanomachines, the actual "connections" being random per configuration. This means you'll have to try enabling different inputs to see what they do. If you're unhappy with a configuration, you can always reconfigure your nanomachines by injecting a new batch (just eat some more). To completely get rid of the nanomachines in you, consider drinking some [grog](acid.md). Beware that enabling too many inputs at a time has severe negative effects on you! -By default, the nanomachines will be on standby. You'll need to control them using wireless messages, so carrying a [tablet](tablet.md) with a [wireless network card](wlanCard.md) is strongly recommended. Nanomachines will only react to wireless signals emitted by devices no further than two meters away, but they will react to messages on any port, and from any device! +By default, the nanomachines will be on standby. You'll need to control them using wireless messages, so carrying a [tablet](tablet.md) with a [wireless network card](wlanCard1.md) is strongly recommended. Nanomachines will only react to wireless signals emitted by devices no further than two meters away, but they will react to messages on any port, and from any device! Nanomachines react to a simple, proprietary protocol: each packet must consist of multiple parts, the first of which is the "header" and must equal the string `nanomachines`. The second part must be the command name. Additional parts are parameters for the command. The following commands are available, formatted as `commandName(arg1, ...)`: diff --git a/src/main/resources/assets/opencomputers/doc/en_US/item/wlanCard.md b/src/main/resources/assets/opencomputers/doc/en_US/item/wlanCard1.md similarity index 68% rename from src/main/resources/assets/opencomputers/doc/en_US/item/wlanCard.md rename to src/main/resources/assets/opencomputers/doc/en_US/item/wlanCard1.md index 9404851cb..c6b69aed8 100644 --- a/src/main/resources/assets/opencomputers/doc/en_US/item/wlanCard.md +++ b/src/main/resources/assets/opencomputers/doc/en_US/item/wlanCard1.md @@ -1,7 +1,7 @@ # WLAN Card -![May cause cancer. May not.](oredict:oc:wlanCard) +![May cause cancer. May not.](oredict:oc:wlanCard2) -The wireless network card is an upgraded [network card](lanCard.md) that, in addition to wired network messages, can also send and receive wireless network messages. The signal strength directly controls the distance up to which a sent message can be received, where the strength is equal to the distance in blocks. +The wireless network card is an upgraded [network card](lanCard.md) that can send and receive wireless network messages. Tier two cards can also send and receive wired messages. The signal strength directly controls the distance up to which a sent message can be received, where the strength is equal to the distance in blocks. The higher the signal strength, the more energy it will take to send a single message. The terrain between the sender and receiver also determines whether a message will be successfully transmitted or not. To penetrate a block, the blocks hardness is subtracted from the signal strength - with the minimum being one for air blocks. If no strength remains to reach the receiver, the message will not be received. This is not an exact science however - sometimes messages may still reach the target. In general you will want to make sure the line of sight between the sender and receiver is clear. diff --git a/src/main/resources/assets/opencomputers/doc/en_US/item/wlanCard2.md b/src/main/resources/assets/opencomputers/doc/en_US/item/wlanCard2.md new file mode 100644 index 000000000..5afe21e05 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/en_US/item/wlanCard2.md @@ -0,0 +1 @@ +#REDIRECT wlanCard1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/block/relay.md b/src/main/resources/assets/opencomputers/doc/fr_FR/block/relay.md index 348be55c5..6e70c3eee 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/block/relay.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/block/relay.md @@ -4,7 +4,7 @@ Le relai peut être utilisé pour permettre à différents sous-réseaux de s'envoyer des messages réseau entre eux, sans exposer leurs composants aux [ordinateurs](../general/computer.md) des autres réseaux. Maintenir l'état "local" d'un composant est généralement une bonne idée, pour éviter aux [ordinateurs](../general/computer.md) d'utiliser le mauvais [écran](screen1.md) ou pour éviter qu'une surcharge de composants survienne (ce qui provoque le crash de l'[ordinateur](../general/computer.md) et l'empêche de démarrer). -Le relai peut être amélioré en insérant une [carte de réseau sans-fil](../item/wlanCard.md) pour relayer aussi des messages sans-fil. Les messages sans-fil peuvent être reçus et relayés par d'autres relais avec une carte de réseau sans-fil, ou par des ordinateurs équipés d'une carte réseau sans-fil. +Le relai peut être amélioré en insérant une [carte de réseau sans-fil](../item/wlanCard1.md) pour relayer aussi des messages sans-fil. Les messages sans-fil peuvent être reçus et relayés par d'autres relais avec une carte de réseau sans-fil, ou par des ordinateurs équipés d'une carte réseau sans-fil. Par ailleurs, le relai peut être amélioré en utilisé des [cartes liées](../item/linkedCard.md). Dans ce cas, il transmettra aussi les messages à travers le tunnel de la carte liée; ceci aura le coût habituel, donc assurez vous que le relai a suffisamment d'énergie. diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/block/robot.md b/src/main/resources/assets/opencomputers/doc/fr_FR/block/robot.md index f2606d2fc..1d0a6a9c7 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/block/robot.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/block/robot.md @@ -2,7 +2,7 @@ ![Son nom était Tobor.](block:OpenComputers:robot) -Contrairement aux [ordinateurs](../general/computer.md), les robots peuvent se déplacer et interagir avec le monde un peu comme un joueur. Ils *ne peuvent pas* interagir avec des composants externes, cependant ! Si vous avez besoin de communiquer avec un [ordinateur](../general/computer.md) ou d'autres robots, utilisez une [carte réseau sans-fil](../item/wlanCard.md), ou créez une sorte de protocle de bas niveau en utilisant les signaux de redstone via une [carte de redstone](../item/redstoneCard1.md), par exemple. +Contrairement aux [ordinateurs](../general/computer.md), les robots peuvent se déplacer et interagir avec le monde un peu comme un joueur. Ils *ne peuvent pas* interagir avec des composants externes, cependant ! Si vous avez besoin de communiquer avec un [ordinateur](../general/computer.md) ou d'autres robots, utilisez une [carte réseau sans-fil](../item/wlanCard1.md), ou créez une sorte de protocle de bas niveau en utilisant les signaux de redstone via une [carte de redstone](../item/redstoneCard1.md), par exemple. Les robots sont construits en plaçant un [boîtier d'ordinateur](case1.md) de n'importe quel niveau dans un [assembleur](assembler.md). Des [boîtiers](case1.md) de plus haut niveau permettent de construire des robots plus complexes, grâce à leur capacité à contenir un [processeur](../item/cpu1.md) plus puissant. La complexité du robot (affichée dans l'[assembleur](assembler.md)) est déterminée par le niveau des composants et améliorations placés dans les emplacements du robot; des composants de plus haut niveau augmenteront d'avantage la complexité qu'un composant de plus bas niveau. Si la complexité du robot est trop élevée, l'[assembleur](assembler.md) ne construira pas le robot. diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/block/switch.md b/src/main/resources/assets/opencomputers/doc/fr_FR/block/switch.md index 24313fa86..c5421f898 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/block/switch.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/block/switch.md @@ -6,7 +6,7 @@ Le routeur peut être utilisé pour permettre à différents sous-réseaux de s'envoyer des messages réseau entre eux, sans exposer leurs composants aux [ordinateurs](../general/computer.md) des autres réseaux. Maintenir l'état "local" d'un composant est généralement une bonne idée, pour éviter aux [ordinateurs](../general/computer.md) d'utiliser le mauvais [écran](screen1.md) ou pour éviter qu'une surcharge de composants survienne (ce qui provoque le crash de l'[ordinateur](../general/computer.md) et l'empêche de démarrer). -Il y a également une version sans-fil de ce bloc, appelée le [point d'accès](accessPoint.md), qui peut aussi relayer des messages sans-fil. Les messages sans-fil peuvent être reçus et relayés par d'autres [points d'accès](accessPoint.md), ou par des [ordinateurs](../general/computer.md) équipés d'une [carte réseau sans-fil](../item/wlanCard.md). +Il y a également une version sans-fil de ce bloc, appelée le [point d'accès](accessPoint.md), qui peut aussi relayer des messages sans-fil. Les messages sans-fil peuvent être reçus et relayés par d'autres [points d'accès](accessPoint.md), ou par des [ordinateurs](../general/computer.md) équipés d'une [carte réseau sans-fil](../item/wlanCard1.md). Les routeurs et [points d'accès](accessPoint.md) ne gardent *pas* de trace des paquets qu'ils ont récemment relayé, donc évitez les boucles dans votre réseau ou vous pourriez recevoir le même paquet plusieurs fois. A cause de la taille limitée de la mémoire tampon des routeurs, une perte des paquets peut survenir si vous essayez d'envoyer des messages réseau trop fréquemment. Vous pouvez améliorer vos routeurs et points d'accès pour augmenter la vitesse à laquelle ils relaient les messages, ainsi que la taille interne de la file des messages. diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/item/index.md b/src/main/resources/assets/opencomputers/doc/fr_FR/item/index.md index d0c8aa2b3..e7ebf4037 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/item/index.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/item/index.md @@ -27,7 +27,7 @@ Gardez en tête que certains d'entre eux ne sont pas disponibles, en fonction de * [Carte liée](linkedCard.md) * [Carte réseau](lanCard.md) * [Carte de Redstone](redstoneCard1.md) -* [Carte de réseau sans-fil](wlanCard.md) +* [Carte de réseau sans-fil](wlanCard1.md) * [Carte de capteur du monde](worldSensorCard.md) ### Améliorations diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/item/nanomachines.md b/src/main/resources/assets/opencomputers/doc/fr_FR/item/nanomachines.md index 515037b6a..e283b9792 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/item/nanomachines.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/item/nanomachines.md @@ -10,7 +10,7 @@ Les nanomachines fournissent un certain nombre "d'entrées" qui peuvent être ac En fonction de la configuration des nanomachines, les entrées déclenchent différents effets, les "connexions" étant aléatoires par configuration. Cela signifie que vous devrez essayer d'activer différentes entrées pour découvrir ce qu'elles activent. Si vous n'êtes pas satisfaits d'une configuration, vous pouvez reconfigurer vos nanomachines en en injectant d'autres (mangez en d'autres). Pour vous débarrasser complètement des nanomachines en vous, buvez du [grog](acid.md). Faites attention, activer trop d'entrées à la fois peut avoir de sérieuses conséquences sur votre organisme ! -Par défaut, les nanomachines seront passives. Vous devrez les contrôler en utilisant des messages sans fil, donc transporter une [tablette](tablet.md) avec une [carte de réseau sans-fil](wlanCard.md) est vivement recommandé. Les nanomachines réagiront seulement aux signaux sans fil émis par des appareils situés à moins de 2 mètres, mais elles réagiront aux messages provenant de n'importe quel port, et de n'importe quel appareil ! +Par défaut, les nanomachines seront passives. Vous devrez les contrôler en utilisant des messages sans fil, donc transporter une [tablette](tablet.md) avec une [carte de réseau sans-fil](wlanCard1.md) est vivement recommandé. Les nanomachines réagiront seulement aux signaux sans fil émis par des appareils situés à moins de 2 mètres, mais elles réagiront aux messages provenant de n'importe quel port, et de n'importe quel appareil ! Les nanomachines réagissent à un protocole propriétaire très simple : chaque paquet doit être constitué de plusieurs parties, la première étant le "header" (en-tête) et qui doit valoir `nanomachines`. La deuxième partie doit être le nom de la commande. Les parties supplémentaires sont les paramètres de la commande. Les commandes suivantes sont disponibles, avec le format `nomDeLaCommande(argument1, ...)` : diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/item/wlanCard.md b/src/main/resources/assets/opencomputers/doc/fr_FR/item/wlanCard1.md similarity index 94% rename from src/main/resources/assets/opencomputers/doc/fr_FR/item/wlanCard.md rename to src/main/resources/assets/opencomputers/doc/fr_FR/item/wlanCard1.md index 36d7ceb8f..e6f6eefee 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/item/wlanCard.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/item/wlanCard1.md @@ -1,6 +1,6 @@ # Carte de réseau sans-fil -![Peut provoquer le cancer. Ou pas.](oredict:oc:wlanCard) +![Peut provoquer le cancer. Ou pas.](oredict:oc:wlanCard2) La carte de réseau sans fil est une [carte réseau](lanCard.md) améliorée qui, en plus de gérer les messages réseaux filaires, peut également envoyer et recevoir des messages réseaux sans fil. La force du signal contrôle directement la distance jusqu'à laquelle un message peut être reçu, avec cette force étant égale à la distance en blocs. diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/item/wlanCard2.md b/src/main/resources/assets/opencomputers/doc/fr_FR/item/wlanCard2.md new file mode 100644 index 000000000..5afe21e05 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/item/wlanCard2.md @@ -0,0 +1 @@ +#REDIRECT wlanCard1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/relay.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/relay.md index 7a7cf01e6..0645ca522 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/block/relay.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/relay.md @@ -4,7 +4,7 @@ Ретранслятор используется для передачи сообщений между несколькими подсетями без предоставления компонентов [компьютерам](../general/computer.md) в других подсетях. Как правило, изоляция компонентов - хорошая идея, чтобы не позволить [компьютерам](../general/computer.md) использовать не тот [монитор](screen1.md) или избежать достижения лимита компонентов (в результате чего [компьютеры](../general/computer.md) выключатся и отказываются загружаться). -Может быть улучшен добавлением [беспроводной сетевой карты](../item/wlanCard.md), что позволит ретранслировать беспроводные сообщения. Сообщения, переданные по беспроводной линии, могут быть получены или перенаправлены другими ретрансляторами или [компьютерами](../general/computer.md) с [беспроводной сетевой картой](../item/wlanCard.md). +Может быть улучшен добавлением [беспроводной сетевой карты](../item/wlanCard1.md), что позволит ретранслировать беспроводные сообщения. Сообщения, переданные по беспроводной линии, могут быть получены или перенаправлены другими ретрансляторами или [компьютерами](../general/computer.md) с [беспроводной сетевой картой](../item/wlanCard1.md). Также ретранслятор может быть улучшен с помощью [соединенной карты](../item/linkedCard.md). Это позволит передавать сообщения внутри туннеля, предоставленного картой, с соответствующими затратами энергии, поэтому убедитесь, что ретранслятору поступает достаточное количество энергии. diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/robot.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/robot.md index 323e89ef6..1416e2997 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/block/robot.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/robot.md @@ -2,7 +2,7 @@ ![Его имя Тобор.](block:OpenComputers:robot) -В отличие от [компьютеров](../general/computer.md), роботы могут двигаться и взаимодействовать с игровым миром, как и игроки. Но они *не* могут взаимодействовать с внешними компонентами! Если вам нужно связать робота с [компьютером](../general/computer.md) или другими роботами, используйте [беспроводные сетевые карты](../item/wlanCard.md) или, например, создайте низкоуровневый протокол на основе красных сигналов и [плат на красном камне](../item/redstoneCard1.md). +В отличие от [компьютеров](../general/computer.md), роботы могут двигаться и взаимодействовать с игровым миром, как и игроки. Но они *не* могут взаимодействовать с внешними компонентами! Если вам нужно связать робота с [компьютером](../general/computer.md) или другими роботами, используйте [беспроводные сетевые карты](../item/wlanCard1.md) или, например, создайте низкоуровневый протокол на основе красных сигналов и [плат на красном камне](../item/redstoneCard1.md). Роботы создаются путем помещения [системного блока](case1.md) любого уровня в [сборщик](assembler.md). Чем выше уровень [системного блока](case1.md), тем более сложных роботов можно построить, благодаря возможности использовать [процессоры](../item/cpu1.md) высокого уровня. Сложность робота (показываемая в [сборщике](assembler.md)) определяется уровнем компонентов и улучшений, помещенных в слоты робота; компонент более высокого уровня увеличивает сложность больше, чем компонент уровня ниже. Если сложность робота превысила предел, тогда [сборщик](assembler.md) не сможет создать робота. diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/switch.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/switch.md index 5e4cb2e76..559d2f3ae 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/block/switch.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/switch.md @@ -6,7 +6,7 @@ Коммутатор используется для передачи сообщений между несколькими подсетями, без предоставления компонентов [компьютерам](../general/computer.md) в других подсетях. Как правило, изоляция компонентов - хорошая идея, чтобы не позволить [компьютерам](../general/computer.md) использовать не тот [монитор](screen1.md) или избежать достижения лимита компонентов (в результате чего [компьютеры](../general/computer.md) выключатся и отказываются загружаться). -Также есть беспроводная версия коммутатора, называемая [точкой доступа](accessPoint.md). С ее помощью сообщения передаются по беспроводному каналу. Беспроводные сообщения могут быть получены или перенаправлены другими [точками доступа](accessPoint.md) или [компьютерами](../general/computer.md) с [беспроводной сетевой картой](../item/wlanCard.md). +Также есть беспроводная версия коммутатора, называемая [точкой доступа](accessPoint.md). С ее помощью сообщения передаются по беспроводному каналу. Беспроводные сообщения могут быть получены или перенаправлены другими [точками доступа](accessPoint.md) или [компьютерами](../general/computer.md) с [беспроводной сетевой картой](../item/wlanCard1.md). Коммутаторы и [точки доступа](accessPoint.md) *не* отслеживают, какие пакеты и куда они передали, поэтому для в сети могут образовываться петли или вы можете получать одно сообщение несколько раз. Из-за ограниченного буфера сообщений коммутатора пакеты могут теряться, если их отсылать слишком часто. Вы можете улучшить коммутатор или [точку доступа](accessPoint.md) для увеличения скорости обработки сообщений, а также увеличения размера буфера сообщений. diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/item/index.md b/src/main/resources/assets/opencomputers/doc/ru_RU/item/index.md index 026a0df83..2d61ac264 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/item/index.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/item/index.md @@ -27,7 +27,7 @@ * [Связанная карта](linkedCard.md) * [Сетевая карта](lanCard.md) * [Карта на красном камне](redstoneCard1.md) -* [Беспроводная сетевая карта](wlanCard.md) +* [Беспроводная сетевая карта](wlanCard1.md) * [Карта-мировой сенсор](worldSensorCard.md) ### Улучшения diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/item/nanomachines.md b/src/main/resources/assets/opencomputers/doc/ru_RU/item/nanomachines.md index 17154672a..6a4dffe3f 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/item/nanomachines.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/item/nanomachines.md @@ -10,7 +10,7 @@ Какой эффект получится при активации контакта, зависит от текущей конфигурации нанороботов, где сами связи между контактами и эффектами случайны для каждой конфигурации. Это означает, что потребуется активировать различные контакты, чтобы узнать, что они делают. Если вам не повезло с конфигурацией, вы всегда можете переконфигурировать ваших нанороботов, съев еще. Если вы захотите избавиться от них, выпейте [кислоту](acid.md). Помните, что большое количество одновременно активных контактов будет давать серьезные отрицательные эффекты! -По умолчанию нанороботы находятся в режиме ожидания. Вы можете контролировать их с помощью беспроводных сообщений, поэтому рекомендуется носить с собою [планшет](tablet.md) с [беспроводной сетевой картой](wlanCard.md). Нанороботы реагируют только на беспроводные сигналы, источник которых находится не дальше двух метров, но они реагируют на все сообщения на любом порту и с любых устройств! +По умолчанию нанороботы находятся в режиме ожидания. Вы можете контролировать их с помощью беспроводных сообщений, поэтому рекомендуется носить с собою [планшет](tablet.md) с [беспроводной сетевой картой](wlanCard1.md). Нанороботы реагируют только на беспроводные сигналы, источник которых находится не дальше двух метров, но они реагируют на все сообщения на любом порту и с любых устройств! Нанороботы работают по простому проепритарному протоколу: каждый пакет должен состоять из множества частей, где первый - это "заголовок", и он должен быть строкой с текстом `nanomachines`. Вторая часть должна быть именем команды. Остальные части - это параметры для команды. Доступны следующие команды (форматировано как `имякоманды(параметр1, ...)`): diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/item/wlanCard.md b/src/main/resources/assets/opencomputers/doc/ru_RU/item/wlanCard1.md similarity index 99% rename from src/main/resources/assets/opencomputers/doc/ru_RU/item/wlanCard.md rename to src/main/resources/assets/opencomputers/doc/ru_RU/item/wlanCard1.md index 003f5eeab..7f007d1f8 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/item/wlanCard.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/item/wlanCard1.md @@ -1,6 +1,6 @@ # Беспроводная сетевая карта -![Может вызвать рак. Не может.](oredict:oc:wlanCard) +![Может вызвать рак. Не может.](oredict:oc:wlanCard2) Беспроводная сетевая карта - это улучшенная версия [сетевой карты](lanCard.md), которая в дополнение к сообщениям по проводной линии также может принимать сообщения и по беспроводной сети. Сила сигнала напрямую контролирует, на каком расстоянии может быть получено отправленное сообщение, и равна расстоянию в блоках. diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/item/wlanCard2.md b/src/main/resources/assets/opencomputers/doc/ru_RU/item/wlanCard2.md new file mode 100644 index 000000000..5afe21e05 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/item/wlanCard2.md @@ -0,0 +1 @@ +#REDIRECT wlanCard1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/_robot.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/_robot.md index 32434c842..94688890e 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/block/_robot.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/_robot.md @@ -1,6 +1,6 @@ # Robot ![His name was Tobor.](block:OpenComputers:robot) -和电脑不同 ,机器人可以如同实体那样在地图上移动,但机器人无法和外界组件交互,但!如果要和电脑或者其他机器人通讯,请安装 [无线网卡](../item/wlanCard.md),或者是通过[红石卡](../item/redstoneCard1.md)收发红石信号建立底层的协议 +和电脑不同 ,机器人可以如同实体那样在地图上移动,但机器人无法和外界组件交互,但!如果要和电脑或者其他机器人通讯,请安装 [无线网卡](../item/wlanCard1.md),或者是通过[红石卡](../item/redstoneCard1.md)收发红石信号建立底层的协议 把[任意机箱](case1.md)放进[组装机](assembler.md)就可以制作机器人. 高级的机箱由于有更高级的[CPU](../item/cpu1.md),可以制造更复杂的机器人. 机器人的复杂度 (显示在 [组装机](assembler.md)GUI) 由槽内安装的组件和升级决定; diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/relay.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/relay.md index d57ae78f3..e883684eb 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/block/relay.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/relay.md @@ -6,7 +6,7 @@ 可避免电脑链接到错误的屏幕,或者避免组件崩溃(可能崩掉电脑,并使之无法启动). -中继器可以安装[无线网卡](../item/wlanCard.md),发送无线消息.其他的中继器可接受并转发,或者是被有无线网卡的电脑收到. +中继器可以安装[无线网卡](../item/wlanCard1.md),发送无线消息.其他的中继器可接受并转发,或者是被有无线网卡的电脑收到. 中继器也可以安装[连接卡](../item/linkedCard.md).消息被转发到链接卡的信道里面, 记得保持中继器能源. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/robot.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/robot.md index 53f45877d..2bfe69c45 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/block/robot.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/robot.md @@ -2,7 +2,7 @@ ![His name was Tobor.](block:OpenComputers:robot) -机器人不像 [电脑](../general/computer.md), 他们是可以像一个玩家一样去和世界交互的. 不过它们不能直接和其他设备交互! 如果需要和 [电脑](../general/computer.md) 和其他机器人通讯, 那么用[无线网卡](../item/wlanCard.md), 或者通过[红石卡](../item/redstoneCard1.md)实现更底层的协议去通信. +机器人不像 [电脑](../general/computer.md), 他们是可以像一个玩家一样去和世界交互的. 不过它们不能直接和其他设备交互! 如果需要和 [电脑](../general/computer.md) 和其他机器人通讯, 那么用[无线网卡](../item/wlanCard1.md), 或者通过[红石卡](../item/redstoneCard1.md)实现更底层的协议去通信. 机器人通过将任意等级[机箱](case1.md) 放入 [组装机](assembler.md)制作的. 更高规格的[机箱](case1.md) 可以做出更复杂的机器人. 机器人的复杂度会显示在 [组装机](assembler.md),复杂度取决于携带和安装的卡片和扩展数量; 级别越高,数量越多,越复杂,达到一定程度组装机将罢工. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/switch.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/switch.md index 1fa933e32..da055b4af 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/block/switch.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/switch.md @@ -6,7 +6,7 @@ The switch can be used to allow different subnetworks to send network messages to each other, without exposing components to [computers](../general/computer.md) in other networks. Keeping components local is usually a good idea, to avoid [computers](../general/computer.md) using the wrong [screen](screen1.md) or to avoid component overflows to happen (causing [computers](../general/computer.md) to crash and refuse to boot up). -There is also a wireless variation of this block, called the [access point](accessPoint.md), which will also relay messages wirelessly. Wireless messages can be received and relayed by other [access points](accessPoint.md), or by [computers](../general/computer.md) with a [wireless network card](../item/wlanCard.md). +There is also a wireless variation of this block, called the [access point](accessPoint.md), which will also relay messages wirelessly. Wireless messages can be received and relayed by other [access points](accessPoint.md), or by [computers](../general/computer.md) with a [wireless network card](../item/wlanCard1.md). Switches and [access points](accessPoint.md) do *not* keep track of which packets they relayed recently, so avoid cycles in your network or you may receive the same packet multiple times. Due to the limited buffer size of switches, sending messages too frequently will result in packet loss. You can upgrade your switches and [access points](accessPoint.md) to increase the speed with which they relay messages, as well as their internal message queue size. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/index.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/index.md index 922616ed3..d1d241d30 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/item/index.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/index.md @@ -27,7 +27,7 @@ * [连接卡](linkedCard.md) * [网卡](lanCard.md) * [红石卡](redstoneCard1.md) -* [无线网卡](wlanCard.md) +* [无线网卡](wlanCard1.md) * [世界传感器卡](worldSensorCard.md) ### 升级 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard1.md similarity index 90% rename from src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard.md rename to src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard1.md index f32b26a08..ba98fd463 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard1.md @@ -1,6 +1,6 @@ # WLAN Card -![May cause cancer. May not.](oredict:oc:wlanCard) +![May cause cancer. May not.](oredict:oc:wlanCard2) 无线网卡是 [网卡](lanCard.md) 的升级, 添加了收发无线信号的能力.无线信号发射强度决定了信息可以传多远, 信号强度等于方块距离. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard2.md new file mode 100644 index 000000000..5afe21e05 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard2.md @@ -0,0 +1 @@ +#REDIRECT wlanCard1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/lang/de_DE.lang b/src/main/resources/assets/opencomputers/lang/de_DE.lang index c2876d199..da9e7481f 100644 --- a/src/main/resources/assets/opencomputers/lang/de_DE.lang +++ b/src/main/resources/assets/opencomputers/lang/de_DE.lang @@ -153,7 +153,8 @@ item.oc.UpgradeTank.name=Tank-Upgrade item.oc.UpgradeTankController.name=Tankbedienungs-Upgrade item.oc.UpgradeTractorBeam.name=Traktorstrahl-Upgrade item.oc.UpgradeTrading.name=Handels-Upgrade -item.oc.WirelessNetworkCard.name=Drahtlosnetzwerkkarte +item.oc.WirelessNetworkCard0.name=Drahtlosnetzwerkkarte (Stufe 1) +item.oc.WirelessNetworkCard1.name=Drahtlosnetzwerkkarte (Stufe 2) item.oc.WorldSensorCard.name=Weltsensorkarte item.oc.wrench.name=Schraubenziehschlüssel diff --git a/src/main/resources/assets/opencomputers/lang/en_US.lang b/src/main/resources/assets/opencomputers/lang/en_US.lang index 79d7002d6..281977170 100644 --- a/src/main/resources/assets/opencomputers/lang/en_US.lang +++ b/src/main/resources/assets/opencomputers/lang/en_US.lang @@ -154,7 +154,8 @@ item.oc.UpgradeTank.name=Tank Upgrade item.oc.UpgradeTankController.name=Tank Controller Upgrade item.oc.UpgradeTractorBeam.name=Tractor Beam Upgrade item.oc.UpgradeTrading.name=Trading Upgrade -item.oc.WirelessNetworkCard.name=Wireless Network Card +item.oc.WirelessNetworkCard0.name=Wireless Network Card (Tier 1) +item.oc.WirelessNetworkCard1.name=Wireless Network Card (Tier 2) item.oc.WorldSensorCard.name=World Sensor Card item.oc.wrench.name=Scrench diff --git a/src/main/resources/assets/opencomputers/lang/fr_FR.lang b/src/main/resources/assets/opencomputers/lang/fr_FR.lang index 815fa4a47..25cc596b5 100644 --- a/src/main/resources/assets/opencomputers/lang/fr_FR.lang +++ b/src/main/resources/assets/opencomputers/lang/fr_FR.lang @@ -144,7 +144,8 @@ item.oc.UpgradeSolarGenerator.name=Amélioration du générateur solaire item.oc.UpgradeTank.name=Amélioration de réservoir item.oc.UpgradeTankController.name=Amélioration du contrôleur de réservoir item.oc.UpgradeTractorBeam.name=Amélioration du rayon tracteur -item.oc.WirelessNetworkCard.name=Carte de réseau sans-fils +item.oc.WirelessNetworkCard0.name=Carte de réseau sans-fils (Niveau 1) +item.oc.WirelessNetworkCard1.name=Carte de réseau sans-fils (Niveau 2) item.oc.WorldSensorCard.name=Carte de capteur du monde item.oc.wrench.name=Crisseur diff --git a/src/main/resources/assets/opencomputers/lang/it_IT.lang b/src/main/resources/assets/opencomputers/lang/it_IT.lang index dad51bebd..9742694bb 100644 --- a/src/main/resources/assets/opencomputers/lang/it_IT.lang +++ b/src/main/resources/assets/opencomputers/lang/it_IT.lang @@ -107,7 +107,8 @@ item.oc.UpgradeSolarGenerator.name=Upgrade Panneli Solari item.oc.UpgradeTank.name=Upgrade Taniche item.oc.UpgradeTankController.name=Upgrade Controllore Taniche item.oc.UpgradeTractorBeam.name=Upgrade Raggio Traente -item.oc.WirelessNetworkCard.name=Scheda di Rete Wireless +item.oc.WirelessNetworkCard0.name=Scheda di Rete Wireless (Livello 1) +item.oc.WirelessNetworkCard1.name=Scheda di Rete Wireless (Livello 2) # GUI oc:gui.Analyzer.Address=§6Indirizzo§f: %s diff --git a/src/main/resources/assets/opencomputers/lang/pt_BR.lang b/src/main/resources/assets/opencomputers/lang/pt_BR.lang index 20143a355..504c6ef7d 100644 --- a/src/main/resources/assets/opencomputers/lang/pt_BR.lang +++ b/src/main/resources/assets/opencomputers/lang/pt_BR.lang @@ -151,7 +151,8 @@ item.oc.UpgradeTank.name=Aprimoramento de Tanque item.oc.UpgradeTankController.name=Aprimoramento de Controlador de Tanque item.oc.UpgradeTractorBeam.name=Aprimoramento de Raio Trator item.oc.UpgradeTrading.name=Aprimoramento de Troca -item.oc.WirelessNetworkCard.name=Cartão de Rede Sem Fio +item.oc.WirelessNetworkCard0.name=Cartão de Rede Sem Fio (Nível 1) +item.oc.WirelessNetworkCard1.name=Cartão de Rede Sem Fio (Nível 2) item.oc.WorldSensorCard.name=Cartão de Sensor de Mundo item.oc.wrench.name=Chave de fenda-boca diff --git a/src/main/resources/assets/opencomputers/lang/pt_PT.lang b/src/main/resources/assets/opencomputers/lang/pt_PT.lang index 323ee7833..8a8038664 100644 --- a/src/main/resources/assets/opencomputers/lang/pt_PT.lang +++ b/src/main/resources/assets/opencomputers/lang/pt_PT.lang @@ -63,7 +63,8 @@ item.oc.UpgradeGenerator.name=Melhoramento: Gerador item.oc.UpgradeNavigation.name=Melhoramento: Navegação item.oc.UpgradeSign.name=Melhoramento: Escrita e Leitura de Placas item.oc.UpgradeSolarGenerator.name=Melhoramento: Gerador Solar -item.oc.WirelessNetworkCard.name=Placa de Rede sem Fios +item.oc.WirelessNetworkCard0.name=Placa de Rede sem Fios +item.oc.WirelessNetworkCard1.name=Placa de Rede sem Fios # GUI oc:gui.Analyzer.Address=§6Endereço§f: %s diff --git a/src/main/resources/assets/opencomputers/lang/ru_RU.lang b/src/main/resources/assets/opencomputers/lang/ru_RU.lang index fd5f9e917..ae2410bc3 100644 --- a/src/main/resources/assets/opencomputers/lang/ru_RU.lang +++ b/src/main/resources/assets/opencomputers/lang/ru_RU.lang @@ -153,7 +153,8 @@ item.oc.UpgradeTank.name=Улучшение "Бак для жидкостей" item.oc.UpgradeTankController.name=Улучшение "Контроллер бака" item.oc.UpgradeTractorBeam.name=Улучшение "Притягивающий луч" item.oc.UpgradeTrading.name=Улучшение "Торговля" -item.oc.WirelessNetworkCard.name=Плата беспроводной сети +item.oc.WirelessNetworkCard0.name=Плата беспроводной сети (1-ый уровень) +item.oc.WirelessNetworkCard1.name=Плата беспроводной сети (2-ой уровень) item.oc.WorldSensorCard.name=Карта-мировой сенсор item.oc.wrench.name=Ключ diff --git a/src/main/resources/assets/opencomputers/lang/zh_CN.lang b/src/main/resources/assets/opencomputers/lang/zh_CN.lang index 18f8db369..6153d4467 100644 --- a/src/main/resources/assets/opencomputers/lang/zh_CN.lang +++ b/src/main/resources/assets/opencomputers/lang/zh_CN.lang @@ -152,7 +152,8 @@ item.oc.UpgradeTank.name=水箱升级 item.oc.UpgradeTankController.name=高级水箱升级 item.oc.UpgradeTractorBeam.name=牵引光束升级 item.oc.UpgradeTrading.name=交易升级 -item.oc.WirelessNetworkCard.name=无线网卡 +item.oc.WirelessNetworkCard0.name=无线网卡 +item.oc.WirelessNetworkCard1.name=无线网卡 item.oc.WorldSensorCard.name=世界感应卡 item.oc.wrench.name=螺丝刀扳手 diff --git a/src/main/resources/assets/opencomputers/lang/zh_TW.lang b/src/main/resources/assets/opencomputers/lang/zh_TW.lang index c102ebf00..31974bf91 100644 --- a/src/main/resources/assets/opencomputers/lang/zh_TW.lang +++ b/src/main/resources/assets/opencomputers/lang/zh_TW.lang @@ -147,7 +147,8 @@ item.oc.UpgradeSolarGenerator.name=太陽能發電升級 item.oc.UpgradeTank.name=水箱升級 item.oc.UpgradeTankController.name=高級水箱升級 item.oc.UpgradeTractorBeam.name=牽引光束升級 -item.oc.WirelessNetworkCard.name=無線網卡 +item.oc.WirelessNetworkCard0.name=無線網卡 +item.oc.WirelessNetworkCard1.name=無線網卡 item.oc.WorldSensorCard.name=世界傳感器卡 item.oc.wrench.name=螺絲刀扳手 diff --git a/src/main/resources/assets/opencomputers/recipes/default.recipes b/src/main/resources/assets/opencomputers/recipes/default.recipes index 9230e0101..85745834a 100644 --- a/src/main/resources/assets/opencomputers/recipes/default.recipes +++ b/src/main/resources/assets/opencomputers/recipes/default.recipes @@ -16,7 +16,7 @@ manual { input: [book, "oc:circuitChip1"] } nanomachines { - input: [["oc:chamelium", "oc:wlanCard", "oc:chamelium"] + input: [["oc:chamelium", "oc:wlanCard2", "oc:chamelium"] ["oc:cpu2", "oc:materialAcid", "oc:ram1"] ["oc:chamelium", "oc:capacitor", "oc:chamelium"]] } @@ -69,7 +69,7 @@ microcontrollerCase2 { } terminal { input: [[nuggetIron, "oc:solarGeneratorUpgrade", nuggetIron] - ["oc:circuitChip3", "oc:screen2", "oc:wlanCard"] + ["oc:circuitChip3", "oc:screen2", "oc:wlanCard2"] [nuggetIron, "oc:keyboard", nuggetIron]] } tabletCase1 { @@ -104,8 +104,8 @@ server3 { [obsidian, "oc:materialCircuitBoardPrinted", obsidian]] } terminalServer { - input: [[obsidian, "oc:wlanCard", obsidian] - ["oc:wlanCard", "oc:circuitChip2", "oc:wlanCard"] + input: [[obsidian, "oc:wlanCard2", obsidian] + ["oc:wlanCard2", "oc:circuitChip2", "oc:wlanCard2"] [obsidian, "oc:materialCircuitBoardPrinted", obsidian]] } @@ -200,7 +200,11 @@ lanCard { input: [["oc:cable", "oc:circuitChip1", ""] ["", "oc:materialCard", ""]] } -wlanCard { +wlanCard1 { + input: [[torchRedstoneActive, "oc:circuitChip1", torchRedstoneActive] + ["", "oc:materialCard", ""]] +} +wlanCard2 { input: [[materialEnderPearl, "oc:circuitChip2", ""] ["", "oc:materialCard", ""]] } @@ -643,7 +647,7 @@ powerDistributor { [ingotIron, "oc:materialCircuitBoardPrinted", ingotIron]] } rack { - input: [[gemDiamond, "oc:wlanCard", gemDiamond] + input: [[gemDiamond, "oc:wlanCard2", gemDiamond] [fenceIron, chest, fenceIron] ["oc:relay", "oc:materialCircuitBoardPrinted", "oc:powerDistributor"]] } diff --git a/src/main/resources/assets/opencomputers/recipes/gregtech.recipes b/src/main/resources/assets/opencomputers/recipes/gregtech.recipes index 2de98266a..c24ada2d7 100644 --- a/src/main/resources/assets/opencomputers/recipes/gregtech.recipes +++ b/src/main/resources/assets/opencomputers/recipes/gregtech.recipes @@ -124,7 +124,12 @@ lanCard { ["oc:cable", "oc:materialCard", "oc:cable"] [screwStainlessSteel , craftingToolScrewdriver, screwStainlessSteel]] } -wlanCard { +wlanCard1 { + input: [[screwAluminium , "oc:circuitChip2" , screwAluminium] + [torchRedstoneActive, "oc:lanCard", torchRedstoneActive] + [screwAluminium , craftingToolScrewdriver, screwAluminium]] +} +wlanCard2 { input: [[screwTitanium , "oc:circuitChip3" , screwTitanium] [materialEnderPearl, "oc:lanCard", materialEnderPearl] [screwTitanium , craftingToolScrewdriver, screwTitanium]] @@ -312,7 +317,7 @@ powerDistributor { ["oc:materialCircuitBoardPrinted", plateAluminium, craftingToolWrench]] } rack { - input: [[craftingToolScrewdriver, "oc:wlanCard", craftingToolWrench] + input: [[craftingToolScrewdriver, "oc:wlanCard2", craftingToolWrench] [{item="ic2.reactorVentDiamond", subID=1}, chest, {item="ic2.reactorVentDiamond", subID=1}] ["oc:relay", "oc:materialCircuitBoardPrinted","oc:powerDistributor"]] } diff --git a/src/main/resources/assets/opencomputers/recipes/hardmode.recipes b/src/main/resources/assets/opencomputers/recipes/hardmode.recipes index ff093d2cc..e37ff1f05 100644 --- a/src/main/resources/assets/opencomputers/recipes/hardmode.recipes +++ b/src/main/resources/assets/opencomputers/recipes/hardmode.recipes @@ -10,7 +10,7 @@ analyzer { } terminal { input: [[nuggetIron, "oc:solarGeneratorUpgrade", nuggetIron] - ["oc:circuitChip3", "oc:screen2", "oc:wlanCard"] + ["oc:circuitChip3", "oc:screen2", "oc:wlanCard2"] [nuggetIron, "oc:keyboard", nuggetIron]] } @@ -102,7 +102,7 @@ graphicsCard3 { } internetCard { input: [["oc:materialInterweb", "oc:circuitChip3", torchRedstoneActive] - ["", "oc:wlanCard", obsidian]] + ["", "oc:wlanCard2", obsidian]] } redstoneCard1 { input: [[torchRedstoneActive, "oc:circuitChip1", ""] @@ -116,13 +116,17 @@ lanCard { input: [["oc:cable", "oc:circuitChip1", ""] ["", "oc:materialCard", ""]] } -wlanCard { +wlanCard1 { + input: [[torchRedstoneActive, "oc:circuitChip1", torchRedstoneActive] + ["", "oc:lanCard", ""]] +} +wlanCard2 { input: [[materialEnderPearl, "oc:circuitChip2", ""] ["", "oc:lanCard", ""]] } linkedCard { input: [[eyeOfEnder, "", eyeOfEnder] - ["oc:wlanCard", "oc:materialInterweb", "oc:wlanCard"] + ["oc:wlanCard2", "oc:materialInterweb", "oc:wlanCard2"] ["oc:circuitChip3", "", "oc:circuitChip3"]] output: 2 # Note: all resulting cards are linked to each other. } @@ -372,7 +376,7 @@ powerDistributor { [ingotIron, "oc:materialCircuitBoardPrinted", ingotIron]] } rack { - input: [["oc:circuitChip3", "oc:wlanCard", "oc:circuitChip3"] + input: [["oc:circuitChip3", "oc:wlanCard2", "oc:circuitChip3"] [fenceIron, chest, fenceIron] ["oc:relay", "oc:materialCircuitBoardPrinted","oc:powerDistributor"]] } diff --git a/src/main/resources/assets/opencomputers/recipes/peaceful.recipes b/src/main/resources/assets/opencomputers/recipes/peaceful.recipes index 58ba2d0d0..99be64b7c 100644 --- a/src/main/resources/assets/opencomputers/recipes/peaceful.recipes +++ b/src/main/resources/assets/opencomputers/recipes/peaceful.recipes @@ -4,7 +4,11 @@ redstoneCard2 { input: [[blockRedstone, "oc:circuitChip2", gemDiamond] ["", "oc:materialCard", ""]] } -wlanCard { +wlanCard1 { + input: [[torchRedstoneActive, "oc:circuitChip1", torchRedstoneActive] + ["", "oc:materialCard", ""]] +} +wlanCard2 { input: [[gemDiamond, "oc:circuitChip2", ""] ["", "oc:materialCard", ""]] } diff --git a/src/main/resources/assets/opencomputers/textures/items/WirelessNetworkCard0.png b/src/main/resources/assets/opencomputers/textures/items/WirelessNetworkCard0.png new file mode 100644 index 0000000000000000000000000000000000000000..7f10401995f9cc1522dbda719295f882680f6c5c GIT binary patch literal 473 zcmV;~0Ve*5P)7H_)z)ZKn)B(2c{BjWal~;Pp^p9V=!>hFr~sValodeEG6kUK z)&4fHZM)%aMYFz`Ff~z? zHvl-h|4?`3uSRcgG|WrI{dt355{5>~3}JQa^hI=vRgdG1Jh$a9lv2{%`||Dr_zk*3 ziel9R;QH0&`O`yB4&Zu%h$sw(R_H;+?8z1Vrq0E3 ziKj}9wgmlxsVj*Ynk4FK_cMVToL}ycN*UO8iF7*Nb^#?Kbb>~QbZqbqA=^cD*JF`f P00000NkvXXu0mjf*+9#Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/opencomputers/textures/items/WirelessNetworkCard.png b/src/main/resources/assets/opencomputers/textures/items/WirelessNetworkCard1.png similarity index 100% rename from src/main/resources/assets/opencomputers/textures/items/WirelessNetworkCard.png rename to src/main/resources/assets/opencomputers/textures/items/WirelessNetworkCard1.png diff --git a/src/main/scala/li/cil/oc/Constants.scala b/src/main/scala/li/cil/oc/Constants.scala index d64a6d8d5..4d0fd41c7 100644 --- a/src/main/scala/li/cil/oc/Constants.scala +++ b/src/main/scala/li/cil/oc/Constants.scala @@ -162,7 +162,8 @@ object Constants { final val UpgradeContainerTier1 = "upgradeContainer1" final val UpgradeContainerTier2 = "upgradeContainer2" final val UpgradeContainerTier3 = "upgradeContainer3" - final val WirelessNetworkCard = "wlanCard" + final val WirelessNetworkCardTier1 = "wlanCard1" + final val WirelessNetworkCardTier2 = "wlanCard2" final val WorldSensorCard = "worldSensorCard" final val Wrench = "wrench" diff --git a/src/main/scala/li/cil/oc/Settings.scala b/src/main/scala/li/cil/oc/Settings.scala index ebf349a9c..b9954346f 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -193,7 +193,13 @@ class Settings(val config: Config) { val robotTurnCost = config.getDouble("power.cost.robotTurn") max 0 val robotMoveCost = config.getDouble("power.cost.robotMove") max 0 val robotExhaustionCost = config.getDouble("power.cost.robotExhaustion") max 0 - val wirelessCostPerRange = config.getDouble("power.cost.wirelessCostPerRange") max 0 + val wirelessCostPerRange = Array(config.getDoubleList("power.cost.wirelessCostPerRange"): _*) match { + case Array(tier1, tier2) => + Array((tier1: Double) max 0.0, (tier2: Double) max 0.0) + case _ => + OpenComputers.log.warn("Bad number of wireless card energy costs, ignoring.") + Array(0.05, 0.05) + } val abstractBusPacketCost = config.getDouble("power.cost.abstractBusPacket") max 0 val geolyzerScanCost = config.getDouble("power.cost.geolyzerScan") max 0 val robotBaseCost = config.getDouble("power.cost.robotAssemblyBase") max 0 @@ -332,8 +338,20 @@ class Settings(val config: Config) { val maxNetworkPacketSize = config.getInt("misc.maxNetworkPacketSize") max 0 // Need at least 4 for nanomachine protocol. Because I can! val maxNetworkPacketParts = config.getInt("misc.maxNetworkPacketParts") max 4 - val maxOpenPorts = config.getInt("misc.maxOpenPorts") max 0 - val maxWirelessRange = config.getDouble("misc.maxWirelessRange") max 0 + val maxOpenPorts = Array(config.getIntList("misc.maxOpenPorts"): _*) match { + case Array(wired, tier1, tier2) => + Array((wired: Int) max 0, (tier1: Int) max 0, (tier2: Int) max 0) + case _ => + OpenComputers.log.warn("Bad number of max open ports, ignoring.") + Array(16, 1, 16) + } + val maxWirelessRange = Array(config.getDoubleList("misc.maxWirelessRange"): _*) match { + case Array(tier1, tier2) => + Array((tier1: Double) max 0.0, (tier2: Double) max 0.0) + case _ => + OpenComputers.log.warn("Bad number of wireless card max ranges, ignoring.") + Array(16.0, 400.0) + } val rTreeMaxEntries = 10 val terminalsPerServer = 4 val updateCheck = config.getBoolean("misc.updateCheck") @@ -523,6 +541,13 @@ object Settings { // Upgrading to version 1.5.20, changed relay delay default. VersionRange.createFromVersionSpec("[0.0, 1.5.20)") -> Array( "switch.relayDelayUpgrade" + ), + // Upgrading past version 1.7.1 (?), changed wireless card stuff for t1 card. + // TODO Update next version when its known what it will actually be + VersionRange.createFromVersionSpec("[0.0, 1.7.2)") -> Array( + "power.cost.wirelessCostPerRange", + "misc.maxWirelessRange", + "misc.maxOpenPorts" ) ) diff --git a/src/main/scala/li/cil/oc/common/Achievement.scala b/src/main/scala/li/cil/oc/common/Achievement.scala index ca02165f6..fe343dc5a 100644 --- a/src/main/scala/li/cil/oc/common/Achievement.scala +++ b/src/main/scala/li/cil/oc/common/Achievement.scala @@ -196,7 +196,8 @@ object Achievement { val WirelessNetworkCard = newAchievement("wirelessNetworkCard"). at(2, -6). withParent(NetworkCard). - whenCrafting(Constants.ItemName.WirelessNetworkCard). + whenCrafting(Constants.ItemName.WirelessNetworkCardTier1). + whenCrafting(Constants.ItemName.WirelessNetworkCardTier2). add() val Cable = newAchievement("cable"). diff --git a/src/main/scala/li/cil/oc/common/Proxy.scala b/src/main/scala/li/cil/oc/common/Proxy.scala index 4bc1e260a..19129f234 100644 --- a/src/main/scala/li/cil/oc/common/Proxy.scala +++ b/src/main/scala/li/cil/oc/common/Proxy.scala @@ -45,6 +45,9 @@ class Proxy { OreDictionary.registerOre("nuggetGold", net.minecraft.init.Items.gold_nugget) OreDictionary.registerOre("chest", net.minecraft.init.Blocks.chest) OreDictionary.registerOre("chest", net.minecraft.init.Blocks.trapped_chest) + + // Make mods that use old wireless card name not have broken recipes + OreDictionary.registerOre("oc:wlanCard", Items.get(Constants.ItemName.WirelessNetworkCardTier2).createItemStack(1)) tryRegisterNugget[item.IronNugget](Constants.ItemName.IronNugget, "nuggetIron", net.minecraft.init.Items.iron_ingot, "ingotIron") tryRegisterNugget[item.DiamondChip](Constants.ItemName.DiamondChip, "chipDiamond", net.minecraft.init.Items.diamond, "gemDiamond") @@ -140,7 +143,8 @@ class Proxy { OpenComputers.ID + ":droneCase" -> Constants.ItemName.DroneCaseTier1, OpenComputers.ID + ":tabletCase" -> Constants.ItemName.TabletCaseTier1, OpenComputers.ID + ":dataCard" -> Constants.ItemName.DataCardTier1, - OpenComputers.ID + ":serverRack" -> Constants.BlockName.Rack + OpenComputers.ID + ":serverRack" -> Constants.BlockName.Rack, + OpenComputers.ID + ":wlanCard" -> Constants.ItemName.WirelessNetworkCardTier2 ) def missingMappings(e: FMLMissingMappingsEvent) { 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 3129da961..399a53371 100644 --- a/src/main/scala/li/cil/oc/common/component/TerminalServer.scala +++ b/src/main/scala/li/cil/oc/common/component/TerminalServer.scala @@ -60,7 +60,7 @@ class TerminalServer(val rack: api.internal.Rack, val slot: Int) extends Environ keyboard } - var range = Settings.get.maxWirelessRange + var range = Settings.get.maxWirelessRange(Tier.Two) val keys = mutable.ListBuffer.empty[String] def address = rack.getMountableData(slot).getString("terminalAddress") 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 b923b762d..693a6ca01 100644 --- a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala @@ -155,7 +155,7 @@ class TextBuffer(val host: EnvironmentHost) extends prefab.ManagedEnvironment wi } this.synchronized { - _pendingCommands.foreach(_.sendToPlayersNearHost(host, Option(Settings.get.maxWirelessRange * Settings.get.maxWirelessRange))) + _pendingCommands.foreach(_.sendToPlayersNearHost(host, Option(Settings.get.maxWirelessRange(Tier.Two) * Settings.get.maxWirelessRange(Tier.Two)))) _pendingCommands = None } 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 14dcbda09..d2bc11150 100644 --- a/src/main/scala/li/cil/oc/common/init/Items.scala +++ b/src/main/scala/li/cil/oc/common/init/Items.scala @@ -42,7 +42,8 @@ object Items extends ItemAPI { val names = mutable.Map.empty[Any, String] val aliases = Map( - "dataCard" -> Constants.ItemName.DataCardTier1 + "dataCard" -> Constants.ItemName.DataCardTier1, + "wlanCard" -> Constants.ItemName.WirelessNetworkCardTier2 ) override def get(name: String): ItemInfo = descriptors.get(name).orNull @@ -195,7 +196,7 @@ object Items extends ItemAPI { safeGetStack(Constants.ItemName.TankControllerUpgrade), safeGetStack(Constants.ItemName.LeashUpgrade), - safeGetStack(Constants.ItemName.WirelessNetworkCard), + safeGetStack(Constants.ItemName.WirelessNetworkCardTier2), safeGetStack(Constants.ItemName.CPUTier3), safeGetStack(Constants.ItemName.RAMTier6), @@ -215,7 +216,7 @@ object Items extends ItemAPI { safeGetStack(Constants.ItemName.PistonUpgrade), safeGetStack(Constants.ItemName.RedstoneCardTier2), - safeGetStack(Constants.ItemName.WirelessNetworkCard), + safeGetStack(Constants.ItemName.WirelessNetworkCardTier2), safeGetStack(Constants.ItemName.CPUTier3), safeGetStack(Constants.ItemName.RAMTier6), @@ -246,7 +247,7 @@ object Items extends ItemAPI { safeGetStack(Constants.ItemName.GraphicsCardTier3), safeGetStack(Constants.ItemName.RedstoneCardTier2), - safeGetStack(Constants.ItemName.WirelessNetworkCard), + safeGetStack(Constants.ItemName.WirelessNetworkCardTier2), safeGetStack(Constants.ItemName.InternetCard), safeGetStack(Constants.ItemName.CPUTier3), @@ -283,7 +284,7 @@ object Items extends ItemAPI { Option(safeGetStack(Constants.ItemName.GraphicsCardTier2)), Option(safeGetStack(Constants.ItemName.RedstoneCardTier2)), - Option(safeGetStack(Constants.ItemName.WirelessNetworkCard)), + Option(safeGetStack(Constants.ItemName.WirelessNetworkCardTier2)), Option(safeGetStack(Constants.ItemName.CPUTier3)), Option(safeGetStack(Constants.ItemName.RAMTier6)), @@ -344,7 +345,7 @@ object Items extends ItemAPI { Recipes.addSubItem(new item.GraphicsCard(multi, Tier.Three), Constants.ItemName.GraphicsCardTier3, "oc:graphicsCard3") Recipes.addSubItem(new item.NetworkCard(multi), Constants.ItemName.NetworkCard, "oc:lanCard") Recipes.addSubItem(new item.RedstoneCard(multi, Tier.Two), Constants.ItemName.RedstoneCardTier2, "oc:redstoneCard2") - Recipes.addSubItem(new item.WirelessNetworkCard(multi), Constants.ItemName.WirelessNetworkCard, "oc:wlanCard") + Recipes.addSubItem(new item.WirelessNetworkCard(multi, Tier.Two), Constants.ItemName.WirelessNetworkCardTier2, "oc:wlanCard2") Recipes.addSubItem(new item.UpgradeCrafting(multi), Constants.ItemName.CraftingUpgrade, "oc:craftingUpgrade") Recipes.addSubItem(new item.UpgradeGenerator(multi), Constants.ItemName.GeneratorUpgrade, "oc:generatorUpgrade") @@ -539,6 +540,9 @@ object Items extends ItemAPI { Recipes.addSubItem(new item.UpgradeTrading(multi), Constants.ItemName.TradingUpgrade, "oc:tradingUpgrade") registerItem(new item.DiamondChip(multi), Constants.ItemName.DiamondChip) Recipes.addSubItem(new item.UpgradeMF(multi), Constants.ItemName.MFU, "oc:mfu") + + // 1.7.? + Recipes.addSubItem(new item.WirelessNetworkCard(multi, Tier.One), Constants.ItemName.WirelessNetworkCardTier1, "oc:wlanCard1") registerItem(new item.ComponentBus(multi, Tier.Four), Constants.ItemName.ComponentBusCreative) diff --git a/src/main/scala/li/cil/oc/common/item/Present.scala b/src/main/scala/li/cil/oc/common/item/Present.scala index 5c3ea962d..7eb344d19 100644 --- a/src/main/scala/li/cil/oc/common/item/Present.scala +++ b/src/main/scala/li/cil/oc/common/item/Present.scala @@ -72,6 +72,7 @@ object Present { add(Constants.ItemName.Alu, 45) add(Constants.ItemName.BatteryUpgradeTier1, 43) add(Constants.ItemName.NetworkCard, 38) + add(Constants.ItemName.WirelessNetworkCardTier1, 37) add(Constants.ItemName.HDDTier1, 36) add(Constants.ItemName.GeneratorUpgrade, 35) add(Constants.ItemName.CPUTier1, 31) @@ -86,7 +87,7 @@ object Present { add(Constants.ItemName.ChipTier2, 15) add(Constants.ItemName.ComponentBusTier1, 13) add(Constants.ItemName.BatteryUpgradeTier2, 12) - add(Constants.ItemName.WirelessNetworkCard, 11) + add(Constants.ItemName.WirelessNetworkCardTier2, 11) add(Constants.ItemName.RAMTier3, 10) add(Constants.ItemName.ServerTier1, 10) add(Constants.ItemName.InternetCard, 9) diff --git a/src/main/scala/li/cil/oc/common/item/WirelessNetworkCard.scala b/src/main/scala/li/cil/oc/common/item/WirelessNetworkCard.scala index 6552e2edb..6356d8771 100644 --- a/src/main/scala/li/cil/oc/common/item/WirelessNetworkCard.scala +++ b/src/main/scala/li/cil/oc/common/item/WirelessNetworkCard.scala @@ -1,3 +1,9 @@ package li.cil.oc.common.item -class WirelessNetworkCard(val parent: Delegator) extends traits.Delegate with traits.ItemTier \ No newline at end of file +import li.cil.oc.common.Tier + +class WirelessNetworkCard(val parent: Delegator, var tier: Int) extends traits.Delegate with traits.ItemTier { + override val unlocalizedName = super.unlocalizedName + tier + + override protected def tooltipName = Option(super.unlocalizedName) +} diff --git a/src/main/scala/li/cil/oc/common/nanomachines/ControllerImpl.scala b/src/main/scala/li/cil/oc/common/nanomachines/ControllerImpl.scala index 7d005cfbc..4d8c7ced8 100644 --- a/src/main/scala/li/cil/oc/common/nanomachines/ControllerImpl.scala +++ b/src/main/scala/li/cil/oc/common/nanomachines/ControllerImpl.scala @@ -14,6 +14,7 @@ import li.cil.oc.api.nanomachines.DisableReason import li.cil.oc.api.network.Packet import li.cil.oc.api.network.WirelessEndpoint import li.cil.oc.common.item.data.NanomachineData +import li.cil.oc.common.Tier import li.cil.oc.integration.util.DamageSourceWithRandomCause import li.cil.oc.server.PacketSender import li.cil.oc.util.BlockPosition @@ -149,7 +150,7 @@ class ControllerImpl(val player: EntityPlayer) extends Controller with WirelessE def respond(endpoint: WirelessEndpoint, data: Any*): Unit = { queuedCommand = Option(() => { if (responsePort > 0) { - val cost = Settings.get.wirelessCostPerRange * CommandRange + val cost = Settings.get.wirelessCostPerRange(Tier.Two) * CommandRange val epsilon = 0.1 if (changeBuffer(-cost) > -epsilon) { val packet = api.Network.newPacket(uuid, null, responsePort, (Iterable("nanomachines") ++ data.map(_.asInstanceOf[AnyRef])).toArray) diff --git a/src/main/scala/li/cil/oc/common/tileentity/AccessPoint.scala b/src/main/scala/li/cil/oc/common/tileentity/AccessPoint.scala index 0c40bc06c..cb1a792b0 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/AccessPoint.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/AccessPoint.scala @@ -2,6 +2,7 @@ package li.cil.oc.common.tileentity import cpw.mods.fml.relauncher.Side import cpw.mods.fml.relauncher.SideOnly +import li.cil.oc.Constants import li.cil.oc.Localization import li.cil.oc.Settings import li.cil.oc.api @@ -9,6 +10,7 @@ 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._ +import li.cil.oc.common.Tier import li.cil.oc.integration.Mods import li.cil.oc.util.ExtendedNBT._ import net.minecraft.entity.player.EntityPlayer @@ -16,9 +18,9 @@ import net.minecraft.nbt.NBTTagCompound import net.minecraftforge.common.util.Constants.NBT import net.minecraftforge.common.util.ForgeDirection -// TODO Remove in 1.7 +// Removed in MC 1.11 class AccessPoint extends Switch with WirelessEndpoint with traits.PowerAcceptor { - var strength = Settings.get.maxWirelessRange + var strength = Settings.get.maxWirelessRange(Tier.Two) var isRepeater = true @@ -54,7 +56,7 @@ class AccessPoint extends Switch with WirelessEndpoint with traits.PowerAcceptor @Callback(doc = """function(strength:number):number -- Set the signal strength (range) used when relaying messages.""") def setStrength(context: Context, args: Arguments): Array[AnyRef] = synchronized { - strength = math.max(args.checkDouble(0), math.min(0, Settings.get.maxWirelessRange)) + strength = math.max(args.checkDouble(0), math.min(0, Settings.get.maxWirelessRange(Tier.Two))) result(strength) } @@ -82,7 +84,7 @@ class AccessPoint extends Switch with WirelessEndpoint with traits.PowerAcceptor override protected def relayPacket(sourceSide: Option[ForgeDirection], packet: Packet) { super.relayPacket(sourceSide, packet) if (strength > 0 && (sourceSide.isDefined || isRepeater)) { - val cost = Settings.get.wirelessCostPerRange + val cost = Settings.get.wirelessCostPerRange(Tier.Two) val tryChangeBuffer = sourceSide match { case Some(side) => (amount: Double) => plugs(side.ordinal).node.asInstanceOf[Connector].tryChangeBuffer(amount) @@ -128,7 +130,7 @@ class AccessPoint extends Switch with WirelessEndpoint with traits.PowerAcceptor override def readFromNBTForServer(nbt: NBTTagCompound) = { super.readFromNBTForServer(nbt) if (nbt.hasKey(Settings.namespace + "strength")) { - strength = nbt.getDouble(Settings.namespace + "strength") max 0 min Settings.get.maxWirelessRange + strength = nbt.getDouble(Settings.namespace + "strength") max 0 min Settings.get.maxWirelessRange(Tier.Two) } if (nbt.hasKey(Settings.namespace + "isRepeater")) { isRepeater = nbt.getBoolean(Settings.namespace + "isRepeater") diff --git a/src/main/scala/li/cil/oc/common/tileentity/Relay.scala b/src/main/scala/li/cil/oc/common/tileentity/Relay.scala index e906ddfb0..cb73be902 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Relay.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Relay.scala @@ -20,6 +20,7 @@ import li.cil.oc.api.network.Visibility import li.cil.oc.api.network.WirelessEndpoint import li.cil.oc.common.InventorySlots import li.cil.oc.common.Slot +import li.cil.oc.common.Tier import li.cil.oc.common.item import li.cil.oc.common.item.Delegator import li.cil.oc.integration.Mods @@ -33,15 +34,18 @@ import net.minecraftforge.common.util.Constants.NBT import net.minecraftforge.common.util.ForgeDirection class Relay extends traits.SwitchLike with traits.ComponentInventory with traits.PowerAcceptor with Analyzable with WirelessEndpoint with QuantumNetwork.QuantumNode { - lazy final val WirelessNetworkCard = api.Items.get(Constants.ItemName.WirelessNetworkCard) + lazy final val WirelessNetworkCardTier1 = api.Items.get(Constants.ItemName.WirelessNetworkCardTier1) + lazy final val WirelessNetworkCardTier2 = api.Items.get(Constants.ItemName.WirelessNetworkCardTier2) lazy final val LinkedCard = api.Items.get(Constants.ItemName.LinkedCard) - - var strength = Settings.get.maxWirelessRange + + var wirelessTier = -1 + + override def isWirelessEnabled = wirelessTier >= Tier.One + + var strength = Settings.get.maxWirelessRange(Tier.Two) var isRepeater = true - var isWirelessEnabled = false - var isLinkedEnabled = false var tunnel = "creative" @@ -81,7 +85,7 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits @Callback(doc = """function(strength:number):number -- Set the signal strength (range) used when relaying messages.""") def setStrength(context: Context, args: Arguments): Array[AnyRef] = synchronized { - strength = math.max(args.checkDouble(0), math.min(0, Settings.get.maxWirelessRange)) + strength = math.max(args.checkDouble(0), math.min(0, Settings.get.maxWirelessRange(wirelessTier))) result(strength) } @@ -142,14 +146,14 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits } if (isWirelessEnabled && strength > 0 && (sourceSide.isDefined || isRepeater)) { - val cost = Settings.get.wirelessCostPerRange + val cost = Settings.get.wirelessCostPerRange(Tier.Two) if (tryChangeBuffer(-strength * cost)) { api.Network.sendWirelessPacket(this, strength, packet) } } if (isLinkedEnabled && sourceSide.isDefined) { - val cost = packet.size / 32.0 + Settings.get.wirelessCostPerRange * Settings.get.maxWirelessRange * 5 + val cost = packet.size / 32.0 + Settings.get.wirelessCostPerRange(wirelessTier) * Settings.get.maxWirelessRange(wirelessTier) * 5 if (tryChangeBuffer(-cost)) { val endpoints = QuantumNetwork.getEndpoints(tunnel).filter(_ != this) for (endpoint <- endpoints) { @@ -195,7 +199,7 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits super.onItemAdded(slot, stack) updateLimits(slot, stack) } - + private def updateLimits(slot: Int, stack: ItemStack) { Option(Driver.driverFor(stack, getClass)) match { case Some(driver) if driver.slot(stack) == Slot.CPU => @@ -209,9 +213,8 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits maxQueueSize = math.max(1, queueBaseSize + (driver.tier(stack) + 1) * queueSizePerUpgrade) case Some(driver) if driver.slot(stack) == Slot.Card => val descriptor = api.Items.get(stack) - if (descriptor == WirelessNetworkCard) { - isWirelessEnabled = true - } + if (descriptor == WirelessNetworkCardTier1 || descriptor == WirelessNetworkCardTier2) + wirelessTier = if (descriptor == WirelessNetworkCardTier1) Tier.One else Tier.Two if (descriptor == LinkedCard) { val data = DriverLinkedCard.dataTag(stack) if (data.hasKey(Settings.namespace + "tunnel")) { @@ -231,7 +234,7 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits case driver if driver.slot(stack) == Slot.Memory => relayAmount = relayBaseAmount case driver if driver.slot(stack) == Slot.HDD => maxQueueSize = queueBaseSize case driver if driver.slot(stack) == Slot.Card => - isWirelessEnabled = false + wirelessTier = -1 isLinkedEnabled = false QuantumNetwork.remove(this) } @@ -243,7 +246,8 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits Option(Driver.driverFor(stack, getClass)).fold(false)(driver => { val provided = InventorySlots.relay(slot) val tierSatisfied = driver.slot(stack) == provided.slot && driver.tier(stack) <= provided.tier - val cardTypeSatisfied = if (provided.slot == Slot.Card) api.Items.get(stack) == WirelessNetworkCard || api.Items.get(stack) == LinkedCard else true + val cardTypeSatisfied = if (provided.slot == Slot.Card) api.Items.get(stack) == WirelessNetworkCardTier1 || + api.Items.get(stack) == WirelessNetworkCardTier2 || api.Items.get(stack) == LinkedCard else true tierSatisfied && cardTypeSatisfied }) @@ -256,7 +260,7 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits } if (nbt.hasKey(Settings.namespace + "strength")) { - strength = nbt.getDouble(Settings.namespace + "strength") max 0 min Settings.get.maxWirelessRange + strength = nbt.getDouble(Settings.namespace + "strength") max 0 min Settings.get.maxWirelessRange(wirelessTier) } if (nbt.hasKey(Settings.namespace + "isRepeater")) { isRepeater = nbt.getBoolean(Settings.namespace + "isRepeater") diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/DriverWirelessNetworkCard.scala b/src/main/scala/li/cil/oc/integration/opencomputers/DriverWirelessNetworkCard.scala index c2967a73b..485e1de09 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/DriverWirelessNetworkCard.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/DriverWirelessNetworkCard.scala @@ -4,27 +4,41 @@ import li.cil.oc.Constants import li.cil.oc.api import li.cil.oc.api.driver.EnvironmentProvider import li.cil.oc.api.network.EnvironmentHost +import li.cil.oc.common import li.cil.oc.common.Slot 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 DriverWirelessNetworkCard extends Item { override def worksWith(stack: ItemStack) = isOneOf(stack, - api.Items.get(Constants.ItemName.WirelessNetworkCard)) - + api.Items.get(Constants.ItemName.WirelessNetworkCardTier1), + api.Items.get(Constants.ItemName.WirelessNetworkCardTier2)) + override def createEnvironment(stack: ItemStack, host: EnvironmentHost) = if (host.world != null && host.world.isRemote) null - else new component.WirelessNetworkCard(host) + else tier(stack) match { + case Tier.One => new component.WirelessNetworkCard.Tier1(host) + case Tier.Two => new component.WirelessNetworkCard.Tier2(host) + case _ => null + } override def slot(stack: ItemStack) = Slot.Card - override def tier(stack: ItemStack) = Tier.Two + override def tier(stack: ItemStack) = + Delegator.subItem(stack) match { + case Some(card: common.item.WirelessNetworkCard) => card.tier + case _ => Tier.One + } object Provider extends EnvironmentProvider { - override def getEnvironment(stack: ItemStack) = - if (worksWith(stack)) - classOf[component.WirelessNetworkCard] + override def getEnvironment(stack: ItemStack): Class[_] = + if (worksWith(stack)) tier(stack) match { + case Tier.One => classOf[component.WirelessNetworkCard.Tier1] + case Tier.Two => classOf[component.WirelessNetworkCard.Tier2] + case _ => null + } else null } diff --git a/src/main/scala/li/cil/oc/server/component/LinkedCard.scala b/src/main/scala/li/cil/oc/server/component/LinkedCard.scala index b7255f020..b2f8a8a19 100644 --- a/src/main/scala/li/cil/oc/server/component/LinkedCard.scala +++ b/src/main/scala/li/cil/oc/server/component/LinkedCard.scala @@ -13,6 +13,7 @@ import li.cil.oc.api.network._ import li.cil.oc.api.Network import li.cil.oc.api.driver.DeviceInfo import li.cil.oc.api.prefab +import li.cil.oc.common.Tier import li.cil.oc.server.network.QuantumNetwork import net.minecraft.nbt.NBTTagCompound @@ -47,7 +48,7 @@ class LinkedCard extends prefab.ManagedEnvironment with QuantumNetwork.QuantumNo val endpoints = QuantumNetwork.getEndpoints(tunnel).filter(_ != this) // Cast to iterable to use Scala's toArray instead of the Arguments' one (which converts byte arrays to Strings). val packet = Network.newPacket(node.address, null, 0, args.asInstanceOf[java.lang.Iterable[AnyRef]].toArray) - if (node.tryChangeBuffer(-(packet.size / 32.0 + Settings.get.wirelessCostPerRange * Settings.get.maxWirelessRange * 5))) { + if (node.tryChangeBuffer(-(packet.size / 32.0 + Settings.get.wirelessCostPerRange(Tier.Two) * Settings.get.maxWirelessRange(Tier.Two) * 5))) { for (endpoint <- endpoints) { endpoint.receivePacket(packet) } diff --git a/src/main/scala/li/cil/oc/server/component/NetworkCard.scala b/src/main/scala/li/cil/oc/server/component/NetworkCard.scala index b00ecb58f..55ab6f743 100644 --- a/src/main/scala/li/cil/oc/server/component/NetworkCard.scala +++ b/src/main/scala/li/cil/oc/server/component/NetworkCard.scala @@ -4,6 +4,7 @@ import java.util import com.google.common.base.Charsets import li.cil.oc.Constants +import li.cil.oc.common.Tier import li.cil.oc.api.driver.DeviceInfo.DeviceAttribute import li.cil.oc.api.driver.DeviceInfo.DeviceClass import li.cil.oc.Settings @@ -36,6 +37,9 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment w create() protected val openPorts = mutable.Set.empty[Int] + + // wired network card is the 1st in the max ports list (before both wireless cards) + protected def maxOpenPorts = Settings.get.maxOpenPorts(Tier.One) protected var wakeMessage: Option[String] = None @@ -48,7 +52,9 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment w DeviceAttribute.Description -> "Ethernet controller", DeviceAttribute.Vendor -> Constants.DeviceInfo.DefaultVendor, DeviceAttribute.Product -> "42i520 (MPN-01)", + DeviceAttribute.Version -> "1.0", DeviceAttribute.Capacity -> Settings.get.maxNetworkPacketSize.toString, + DeviceAttribute.Size -> maxOpenPorts.toString, DeviceAttribute.Width -> Settings.get.maxNetworkPacketParts.toString ) @@ -60,7 +66,7 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment w def open(context: Context, args: Arguments): Array[AnyRef] = { val port = checkPort(args.checkInteger(0)) if (openPorts.contains(port)) result(false) - else if (openPorts.size >= Settings.get.maxOpenPorts) { + else if (openPorts.size >= maxOpenPorts) { throw new java.io.IOException("too many open ports") } else result(openPorts.add(port)) @@ -85,8 +91,11 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment w result(openPorts.contains(port)) } - @Callback(direct = true, doc = """function():boolean -- Whether this is a wireless network card.""") + @Callback(direct = true, doc = """function():boolean -- Whether this card has wireless networking capability.""") def isWireless(context: Context, args: Arguments): Array[AnyRef] = result(false) + + @Callback(direct = true, doc = """function():boolean -- Whether this card has wired networking capability.""") + def isWired(context: Context, args: Arguments): Array[AnyRef] = result(true) @Callback(doc = """function(address:string, port:number, data...) -- Sends the specified data to the specified target.""") def send(context: Context, args: Arguments): Array[AnyRef] = { @@ -107,7 +116,7 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment w result(true) } - // TODO 1.7 Remove, covered by device info now + //Removed in MC 1.11 @Callback(direct = true, doc = """function():number -- Gets the maximum packet size (config setting).""") def maxPacketSize(context: Context, args: Arguments): Array[AnyRef] = result(Settings.get.maxNetworkPacketSize) diff --git a/src/main/scala/li/cil/oc/server/component/UpgradeNavigation.scala b/src/main/scala/li/cil/oc/server/component/UpgradeNavigation.scala index 0d73a9e0e..41b62a985 100644 --- a/src/main/scala/li/cil/oc/server/component/UpgradeNavigation.scala +++ b/src/main/scala/li/cil/oc/server/component/UpgradeNavigation.scala @@ -18,6 +18,7 @@ import li.cil.oc.api.network.EnvironmentHost import li.cil.oc.api.network._ import li.cil.oc.api.prefab import li.cil.oc.common.item.data.NavigationUpgradeData +import li.cil.oc.common.Tier import li.cil.oc.server.network.Waypoints import li.cil.oc.util.BlockPosition import net.minecraft.entity.player.EntityPlayer @@ -68,9 +69,9 @@ class UpgradeNavigation(val host: EnvironmentHost with Rotatable) extends prefab @Callback(doc = """function(range:number):table -- Find waypoints in the specified range.""") def findWaypoints(context: Context, args: Arguments): Array[AnyRef] = { - val range = args.checkDouble(0) max 0 min Settings.get.maxWirelessRange + val range = args.checkDouble(0) max 0 min Settings.get.maxWirelessRange(Tier.Two) if (range <= 0) return result(Array.empty) - if (!node.tryChangeBuffer(-range * Settings.get.wirelessCostPerRange * 0.25)) return result(Unit, "not enough energy") + if (!node.tryChangeBuffer(-range * Settings.get.wirelessCostPerRange(Tier.Two) * 0.25)) return result(Unit, "not enough energy") context.pause(0.5) val position = BlockPosition(host) val positionVec = position.toVec3 diff --git a/src/main/scala/li/cil/oc/server/component/WirelessNetworkCard.scala b/src/main/scala/li/cil/oc/server/component/WirelessNetworkCard.scala index 5638aa821..05e3572e1 100644 --- a/src/main/scala/li/cil/oc/server/component/WirelessNetworkCard.scala +++ b/src/main/scala/li/cil/oc/server/component/WirelessNetworkCard.scala @@ -7,6 +7,7 @@ import li.cil.oc.Constants import li.cil.oc.api.driver.DeviceInfo.DeviceAttribute import li.cil.oc.api.driver.DeviceInfo.DeviceClass import li.cil.oc.Settings +import li.cil.oc.common.Tier import li.cil.oc.api import li.cil.oc.api.Network import li.cil.oc.api.network.EnvironmentHost @@ -20,29 +21,20 @@ import net.minecraft.nbt.NBTTagCompound import scala.collection.convert.WrapAsJava._ import scala.language.implicitConversions -class WirelessNetworkCard(host: EnvironmentHost) extends NetworkCard(host) with WirelessEndpoint { +abstract class WirelessNetworkCard(host: EnvironmentHost) extends NetworkCard(host) with WirelessEndpoint { override val node = Network.newNode(this, Visibility.Network). withComponent("modem", Visibility.Neighbors). withConnector(). create() - var strength = Settings.get.maxWirelessRange - - // ----------------------------------------------------------------------- // - - private final lazy val deviceInfo = Map( - DeviceAttribute.Class -> DeviceClass.Network, - DeviceAttribute.Description -> "Wireless ethernet controller", - DeviceAttribute.Vendor -> Constants.DeviceInfo.DefaultVendor, - DeviceAttribute.Product -> "62i230 (MPW-01)", - DeviceAttribute.Capacity -> Settings.get.maxNetworkPacketSize.toString, - DeviceAttribute.Width -> Settings.get.maxWirelessRange.toString - ) - - override def getDeviceInfo: util.Map[String, String] = deviceInfo - - // ----------------------------------------------------------------------- // - + protected def wirelessCostPerRange: Double + + protected def maxWirelessRange: Double + + protected def shouldSendWiredTraffic: Boolean + + var strength = maxWirelessRange + override def x = BlockPosition(host).x override def y = BlockPosition(host).y @@ -58,24 +50,27 @@ class WirelessNetworkCard(host: EnvironmentHost) extends NetworkCard(host) with } // ----------------------------------------------------------------------- // - + @Callback(direct = true, doc = """function():number -- Get the signal strength (range) used when sending messages.""") def getStrength(context: Context, args: Arguments): Array[AnyRef] = result(strength) @Callback(doc = """function(strength:number):number -- Set the signal strength (range) used when sending messages.""") def setStrength(context: Context, args: Arguments): Array[AnyRef] = { - strength = math.max(0, math.min(args.checkDouble(0), Settings.get.maxWirelessRange)) + strength = math.max(0, math.min(args.checkDouble(0), maxWirelessRange)) result(strength) } override def isWireless(context: Context, args: Arguments): Array[AnyRef] = result(true) - + + override def isWired(context: Context, args: Arguments): Array[AnyRef] = result(shouldSendWiredTraffic) + override protected def doSend(packet: Packet) { if (strength > 0) { checkPower() api.Network.sendWirelessPacket(this, strength, packet) } - super.doSend(packet) + if (shouldSendWiredTraffic) + super.doSend(packet) } override protected def doBroadcast(packet: Packet) { @@ -83,11 +78,12 @@ class WirelessNetworkCard(host: EnvironmentHost) extends NetworkCard(host) with checkPower() api.Network.sendWirelessPacket(this, strength, packet) } - super.doBroadcast(packet) + if (shouldSendWiredTraffic) + super.doBroadcast(packet) } - + private def checkPower() { - val cost = Settings.get.wirelessCostPerRange + val cost = wirelessCostPerRange if (cost > 0 && !Settings.get.ignorePower) { if (!node.tryChangeBuffer(-strength * cost)) { throw new IOException("not enough energy") @@ -125,7 +121,7 @@ class WirelessNetworkCard(host: EnvironmentHost) extends NetworkCard(host) with override def load(nbt: NBTTagCompound) { super.load(nbt) if (nbt.hasKey("strength")) { - strength = nbt.getDouble("strength") max 0 min Settings.get.maxWirelessRange + strength = nbt.getDouble("strength") max 0 min maxWirelessRange } } @@ -134,3 +130,57 @@ class WirelessNetworkCard(host: EnvironmentHost) extends NetworkCard(host) with nbt.setDouble("strength", strength) } } + +object WirelessNetworkCard { + class Tier1(host: EnvironmentHost) extends WirelessNetworkCard(host) { + override protected def wirelessCostPerRange = Settings.get.wirelessCostPerRange(Tier.One) + + override protected def maxWirelessRange = Settings.get.maxWirelessRange(Tier.One) + + // wired network card is before wireless cards in max port list + override protected def maxOpenPorts = Settings.get.maxOpenPorts(Tier.One + 1) + + override protected def shouldSendWiredTraffic = false + + // ----------------------------------------------------------------------- // + + private final lazy val deviceInfo = Map( + DeviceAttribute.Class -> DeviceClass.Network, + DeviceAttribute.Description -> "Wireless ethernet controller", + DeviceAttribute.Vendor -> Constants.DeviceInfo.DefaultVendor, + DeviceAttribute.Product -> "39i110 (LPPW-01)", + DeviceAttribute.Version -> "1.0", + DeviceAttribute.Capacity -> Settings.get.maxNetworkPacketSize.toString, + DeviceAttribute.Size -> maxOpenPorts.toString, + DeviceAttribute.Width -> maxWirelessRange.toString + ) + + override def getDeviceInfo: util.Map[String, String] = deviceInfo + } + + class Tier2(host: EnvironmentHost) extends Tier1(host) { + override protected def wirelessCostPerRange = Settings.get.wirelessCostPerRange(Tier.Two) + + override protected def maxWirelessRange = Settings.get.maxWirelessRange(Tier.Two) + + // wired network card is before wireless cards in max port list + override protected def maxOpenPorts = Settings.get.maxOpenPorts(Tier.Two + 1) + + override protected def shouldSendWiredTraffic = true + + // ----------------------------------------------------------------------- // + + private final lazy val deviceInfo = Map( + DeviceAttribute.Class -> DeviceClass.Network, + DeviceAttribute.Description -> "Wireless ethernet controller", + DeviceAttribute.Vendor -> Constants.DeviceInfo.DefaultVendor, + DeviceAttribute.Product -> "62i230 (MPW-01)", + DeviceAttribute.Version -> "2.0", + DeviceAttribute.Capacity -> Settings.get.maxNetworkPacketSize.toString, + DeviceAttribute.Size -> maxOpenPorts.toString, + DeviceAttribute.Width -> maxWirelessRange.toString + ) + + override def getDeviceInfo: util.Map[String, String] = deviceInfo + } +} From d82a05fa2897f09bef11239d4f542eaf232a9272 Mon Sep 17 00:00:00 2001 From: payonel Date: Thu, 14 Dec 2017 07:59:26 -0800 Subject: [PATCH 03/10] comment version for new items --- src/main/scala/li/cil/oc/common/init/Items.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 d2bc11150..e18073ae7 100644 --- a/src/main/scala/li/cil/oc/common/init/Items.scala +++ b/src/main/scala/li/cil/oc/common/init/Items.scala @@ -541,9 +541,8 @@ object Items extends ItemAPI { registerItem(new item.DiamondChip(multi), Constants.ItemName.DiamondChip) Recipes.addSubItem(new item.UpgradeMF(multi), Constants.ItemName.MFU, "oc:mfu") - // 1.7.? + // 1.7.3 Recipes.addSubItem(new item.WirelessNetworkCard(multi, Tier.One), Constants.ItemName.WirelessNetworkCardTier1, "oc:wlanCard1") - registerItem(new item.ComponentBus(multi, Tier.Four), Constants.ItemName.ComponentBusCreative) // Register aliases. From 22c6b15d392cbb223d0d4f8e2d75d3b3ea970da0 Mon Sep 17 00:00:00 2001 From: payonel Date: Thu, 14 Dec 2017 09:50:15 -0800 Subject: [PATCH 04/10] missed settings changes needed for t1 card and version check --- src/main/scala/li/cil/oc/Settings.scala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/scala/li/cil/oc/Settings.scala b/src/main/scala/li/cil/oc/Settings.scala index b9954346f..c532b080c 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -542,9 +542,8 @@ object Settings { VersionRange.createFromVersionSpec("[0.0, 1.5.20)") -> Array( "switch.relayDelayUpgrade" ), - // Upgrading past version 1.7.1 (?), changed wireless card stuff for t1 card. - // TODO Update next version when its known what it will actually be - VersionRange.createFromVersionSpec("[0.0, 1.7.2)") -> Array( + // Upgrading past version 1.7.2, changed wireless card stuff for t1 card. + VersionRange.createFromVersionSpec("[0.0, 1.7.3)") -> Array( "power.cost.wirelessCostPerRange", "misc.maxWirelessRange", "misc.maxOpenPorts" From aa375ec823d1da24584051698d894bfc9004af83 Mon Sep 17 00:00:00 2001 From: payonel Date: Fri, 15 Dec 2017 05:38:20 -0800 Subject: [PATCH 05/10] fix config/settings to expect 1.7.2 next, not 1.7.3 --- src/main/scala/li/cil/oc/Settings.scala | 7 ++++--- src/main/scala/li/cil/oc/common/init/Items.scala | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/scala/li/cil/oc/Settings.scala b/src/main/scala/li/cil/oc/Settings.scala index c532b080c..75ba36eeb 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -542,11 +542,12 @@ object Settings { VersionRange.createFromVersionSpec("[0.0, 1.5.20)") -> Array( "switch.relayDelayUpgrade" ), - // Upgrading past version 1.7.2, changed wireless card stuff for t1 card. - VersionRange.createFromVersionSpec("[0.0, 1.7.3)") -> Array( + // Upgrading past version 1.7.1, changed wireless card stuff for t1 card. + VersionRange.createFromVersionSpec("[0.0, 1.7.2)") -> Array( "power.cost.wirelessCostPerRange", "misc.maxWirelessRange", - "misc.maxOpenPorts" + "misc.maxOpenPorts", + "computer.cpuComponentCount" ) ) 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 e18073ae7..aabfbf956 100644 --- a/src/main/scala/li/cil/oc/common/init/Items.scala +++ b/src/main/scala/li/cil/oc/common/init/Items.scala @@ -541,7 +541,7 @@ object Items extends ItemAPI { registerItem(new item.DiamondChip(multi), Constants.ItemName.DiamondChip) Recipes.addSubItem(new item.UpgradeMF(multi), Constants.ItemName.MFU, "oc:mfu") - // 1.7.3 + // 1.7.2 Recipes.addSubItem(new item.WirelessNetworkCard(multi, Tier.One), Constants.ItemName.WirelessNetworkCardTier1, "oc:wlanCard1") registerItem(new item.ComponentBus(multi, Tier.Four), Constants.ItemName.ComponentBusCreative) From 62c661649b5a267554c5c1551a13937d5ef93409 Mon Sep 17 00:00:00 2001 From: Xyxen Date: Fri, 15 Dec 2017 22:06:48 -0700 Subject: [PATCH 06/10] Fix wrong Gradle version being used on Travis CI (#2672) Using the default Gradle install on Travis is dangerous, because a version upgrade on their end could break the build. It's already broken because the version of ForgeGradle the current script relies on expects ScalaCompileOptions.setUseAnt to exist, but it was removed in Gradle 3. This patch reconfigures Travis to use the Gradle wrapper instead, which standardizes the version in use. --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index b0be91422..df81f4ef6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,8 +8,8 @@ notifications: env: global: TERM=dumb -install: gradle setupCIWorkspace -script: gradle build +install: ./gradlew setupCIWorkspace +script: ./gradlew build cache: directories: From 719498163c1e81478a89abec5fa7547e8c2b9a93 Mon Sep 17 00:00:00 2001 From: payonel Date: Sat, 16 Dec 2017 01:16:45 -0800 Subject: [PATCH 07/10] fix relays save/load without wireless cards --- .../li/cil/oc/common/tileentity/Relay.scala | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/tileentity/Relay.scala b/src/main/scala/li/cil/oc/common/tileentity/Relay.scala index cb73be902..00a3ec34f 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Relay.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Relay.scala @@ -41,8 +41,14 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits var wirelessTier = -1 override def isWirelessEnabled = wirelessTier >= Tier.One + + def maxWirelessRange = if (wirelessTier == Tier.One || wirelessTier == Tier.Two) + Settings.get.maxWirelessRange(wirelessTier) else 0 + + def wirelessCostPerRange = if (wirelessTier == Tier.One || wirelessTier == Tier.Two) + Settings.get.wirelessCostPerRange(wirelessTier) else 0 - var strength = Settings.get.maxWirelessRange(Tier.Two) + var strength = maxWirelessRange var isRepeater = true @@ -85,7 +91,7 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits @Callback(doc = """function(strength:number):number -- Set the signal strength (range) used when relaying messages.""") def setStrength(context: Context, args: Arguments): Array[AnyRef] = synchronized { - strength = math.max(args.checkDouble(0), math.min(0, Settings.get.maxWirelessRange(wirelessTier))) + strength = math.max(args.checkDouble(0), math.min(0, maxWirelessRange)) result(strength) } @@ -146,14 +152,14 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits } if (isWirelessEnabled && strength > 0 && (sourceSide.isDefined || isRepeater)) { - val cost = Settings.get.wirelessCostPerRange(Tier.Two) + val cost = wirelessCostPerRange if (tryChangeBuffer(-strength * cost)) { api.Network.sendWirelessPacket(this, strength, packet) } } if (isLinkedEnabled && sourceSide.isDefined) { - val cost = packet.size / 32.0 + Settings.get.wirelessCostPerRange(wirelessTier) * Settings.get.maxWirelessRange(wirelessTier) * 5 + val cost = packet.size / 32.0 + wirelessCostPerRange * maxWirelessRange * 5 if (tryChangeBuffer(-cost)) { val endpoints = QuantumNetwork.getEndpoints(tunnel).filter(_ != this) for (endpoint <- endpoints) { @@ -260,7 +266,7 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits } if (nbt.hasKey(Settings.namespace + "strength")) { - strength = nbt.getDouble(Settings.namespace + "strength") max 0 min Settings.get.maxWirelessRange(wirelessTier) + strength = nbt.getDouble(Settings.namespace + "strength") max 0 min maxWirelessRange } if (nbt.hasKey(Settings.namespace + "isRepeater")) { isRepeater = nbt.getBoolean(Settings.namespace + "isRepeater") From fd9b81582b807d07f3c542f6613c4a16d954f224 Mon Sep 17 00:00:00 2001 From: Xyxen Date: Sun, 17 Dec 2017 22:10:31 -0700 Subject: [PATCH 08/10] Fix runClient and runServer Gradle tasks (#2673) Compile dependencies are placed on the runtime classpath by Gradle. Because the compile configuration is set to extend from the provided config, all of those dependencies are put on the runtime classpath as well. In this patch, provided is instead made a separate configuration, and explicitly added to ONLY the compile classpath of the main sourceset. --- build.gradle | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1d653e168..76520abd0 100644 --- a/build.gradle +++ b/build.gradle @@ -178,7 +178,7 @@ repositories { configurations { provided embedded - compile.extendsFrom provided, embedded + compile.extendsFrom embedded } dependencies { @@ -230,6 +230,9 @@ dependencies { testCompile "org.scalatest:scalatest_2.11:2.2.6" } +// Add the "provided" dependencies to the compile (but NOT runtime) classpath. +sourceSets.main.compileClasspath += [configurations.provided] + idea.module.scopes.PROVIDED.plus += [configurations.provided] // TODO Causes errors on Gradle 2 for me (No such property: allDependencies for class: java.io.File). //eclipse.classpath.plusConfigurations += [configurations.provided] From 9c509508a7b47f7e18c7d20685ad0b9617bd7649 Mon Sep 17 00:00:00 2001 From: payonel Date: Mon, 18 Dec 2017 17:47:26 -0800 Subject: [PATCH 09/10] French translation fixes Thanks to @Naheulf Closes #2061 --- .../assets/opencomputers/doc/fr_FR/block/hologram1.md | 2 +- .../resources/assets/opencomputers/doc/fr_FR/block/index.md | 2 +- .../resources/assets/opencomputers/doc/fr_FR/block/raid.md | 2 +- .../resources/assets/opencomputers/doc/fr_FR/block/robot.md | 2 +- .../resources/assets/opencomputers/doc/fr_FR/general/lua.md | 2 +- .../assets/opencomputers/doc/fr_FR/general/openOS.md | 4 ++-- src/main/resources/assets/opencomputers/doc/fr_FR/index.md | 4 ++-- .../assets/opencomputers/doc/fr_FR/item/databaseUpgrade1.md | 2 +- .../resources/assets/opencomputers/doc/fr_FR/item/hdd1.md | 2 +- .../doc/fr_FR/item/inventoryControllerUpgrade.md | 2 +- .../assets/opencomputers/doc/fr_FR/item/redstoneCard1.md | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/block/hologram1.md b/src/main/resources/assets/opencomputers/doc/fr_FR/block/hologram1.md index 7dbb351f2..482d06985 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/block/hologram1.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/block/hologram1.md @@ -2,6 +2,6 @@ ![Is this the real life? Is this just fantasy?](oredict:oc:hologram1) -Le projecteur d'hologramme est un afficheur volumétrique, c'est à dire qu'il fournit un tableau de voxels en trois dimensions qui peuvent être individuellement par un [ordinateur](../general/computer.md) auquel il serait connecté. Le deuxième niveau de projecteur, même s'il a la même résolution que le projecteur de niveau 1, gère l'affichage de chaque voxel avec trois couleurs définissable par l'utilisateur. +Le projecteur d'hologramme est un afficheur volumétrique, c'est à dire qu'il fournit un tableau de voxels en trois dimensions qui peuvent être contrôlés individuellement par un [ordinateur](../general/computer.md) auquel il serait connecté. Le deuxième niveau de projecteur, même s'il a la même résolution que le projecteur de niveau 1, gère l'affichage de chaque voxel avec trois couleurs définissable par l'utilisateur. Les hologrammes peuvent être pivotés sur leur axe vertical en les frappant sur le haut ou le bas du projecteur avec une [clé](../item/wrench.md). Cela peut économiser beaucoup d'efforts, pour que la sortie ne soit pas transformée côté programme. Les hologrammes peuvent également être redimensionnés à volonté. diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/block/index.md b/src/main/resources/assets/opencomputers/doc/fr_FR/block/index.md index d20244dbd..2503af8f3 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/block/index.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/block/index.md @@ -18,7 +18,7 @@ Gardez en tête que certains d'entre eux ne sont pas disponibles, en fonction de * [Ecran](screen1.md) ### Stockage -* [Lecteur de disquette](diskDrive.md) +* [Lecteur de disquettes](diskDrive.md) * [RAID](raid.md) ### Extensions diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/block/raid.md b/src/main/resources/assets/opencomputers/doc/fr_FR/block/raid.md index d7d814779..6a849e991 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/block/raid.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/block/raid.md @@ -8,4 +8,4 @@ Le RAID fonctionne uniquement (et se présente en tant que système de fichiers) Faites attention, car l'ajout d'un [disque dur](../item/hdd1.md) au bloc de RAID effacera son contenu. Retirer un [disque dur](../item/hdd1.md) du RAID effacera le contenu complet du RAID. Remettre le disque en place *ne restaurera pas* les anciens fichiers; le RAID sera ré-initialisé en tant que système de fichiers vierge. -Casser un bloc de RAID gardera son contenu, dons il peut être déplacé en tout sécurité sans risque de perte de données. +Casser un bloc de RAID gardera son contenu, il peut donc être déplacé en tout sécurité sans risque de perte de données. diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/block/robot.md b/src/main/resources/assets/opencomputers/doc/fr_FR/block/robot.md index 1d0a6a9c7..add16c185 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/block/robot.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/block/robot.md @@ -6,4 +6,4 @@ Contrairement aux [ordinateurs](../general/computer.md), les robots peuvent se d Les robots sont construits en plaçant un [boîtier d'ordinateur](case1.md) de n'importe quel niveau dans un [assembleur](assembler.md). Des [boîtiers](case1.md) de plus haut niveau permettent de construire des robots plus complexes, grâce à leur capacité à contenir un [processeur](../item/cpu1.md) plus puissant. La complexité du robot (affichée dans l'[assembleur](assembler.md)) est déterminée par le niveau des composants et améliorations placés dans les emplacements du robot; des composants de plus haut niveau augmenteront d'avantage la complexité qu'un composant de plus bas niveau. Si la complexité du robot est trop élevée, l'[assembleur](assembler.md) ne construira pas le robot. -De nombreuses améliorations peuvent être placées dans les robots pour augmenter les fonctionnalités. Cela inclut les amélioration d'[inventaire](../item/inventoryUpgrade.md) et de [contrôle d'inventaire](../item/inventoryControllerUpgrade.md), de [réservoir](../item/tankUpgrade.md), de [navigation](../item/navigationUpgrade.md), entre autres. Les conteneurs d'[amélioration](../item/upgradeContainer1.md) et de [carte](../item/cardContainer1.md) et de [carte](../item/cardContainer1.md) peuvent être placés dans le robot pour insérer et retirer des composants et des améliorations à la volée. Un [lecteur de disquettes](diskDrive.md) peut également être placé dans le robot pour permettre l'insertion de [disquettes](../item/floppy.md), ce qui vous permettra d'installer [OpenOS](../general/openOS.md) sur le robot (une alternative est d'installer [OpenOS](../general/openOS.md) sur un [disque dur](../item/hdd1.md) vierge en utilisant un [ordinateur](../general/computer.md), et d'utiliser le [disque dur](../item/hdd1.md) pré-installé comme un composant dans l'assembleur de robot). +De nombreuses améliorations peuvent être placées dans les robots pour augmenter les fonctionnalités. Cela inclut les amélioration d'[inventaire](../item/inventoryUpgrade.md) et de [contrôle d'inventaire](../item/inventoryControllerUpgrade.md), de [réservoir](../item/tankUpgrade.md), de [navigation](../item/navigationUpgrade.md), entre autres. Les conteneurs d'[amélioration](../item/upgradeContainer1.md) et de [carte](../item/cardContainer1.md) peuvent être placés dans le robot pour insérer et retirer des composants et des améliorations à la volée. Un [lecteur de disquettes](diskDrive.md) peut également être placé dans le robot pour permettre l'insertion de [disquettes](../item/floppy.md), ce qui vous permettra d'installer [OpenOS](../general/openOS.md) sur le robot (une alternative est d'installer [OpenOS](../general/openOS.md) sur un [disque dur](../item/hdd1.md) vierge en utilisant un [ordinateur](../general/computer.md), et d'utiliser le [disque dur](../item/hdd1.md) pré-installé comme un composant dans l'assembleur de robot). diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/general/lua.md b/src/main/resources/assets/opencomputers/doc/fr_FR/general/lua.md index 486b04205..8919f6922 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/general/lua.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/general/lua.md @@ -1,6 +1,6 @@ # Lua -Le [manuel de référence](http://www.lua.org/manual/5.2/manual.html) en Lua et le livre [Programming Lua](http://www.lua.org/pil/) (la première édition est disponible gratuitement en ligne) sont un bon endroit pour démarrer avec les bases de Lua et se familiariser avec la synntaxe de base et les bibliothèques standard. [OpenOS](openOS.md) s'efforce d'émuler les bibliothèques standard au plus près, avec quelques écarts, comme la bibliothèque de débogage qui est principalement absente (pour des raisons de sécurité liées au mode "bac à sable"). Ces différences sont [documentées sur le wiki](http://ocdoc.cil.li/api:non-standard-lua-libs). +Le [manuel de référence](http://www.lua.org/manual/5.2/manual.html) en Lua et le livre [Programming Lua](http://www.lua.org/pil/) (la première édition est disponible gratuitement en ligne) sont un bon endroit pour démarrer avec les bases de Lua et se familiariser avec la syntaxe de base et les bibliothèques standard. [OpenOS](openOS.md) s'efforce d'émuler les bibliothèques standard au plus près, avec quelques écarts, comme la bibliothèque de débogage qui est principalement absente (pour des raisons de sécurité liées au mode "bac à sable"). Ces différences sont [documentées sur le wiki](http://ocdoc.cil.li/api:non-standard-lua-libs). Les bibliothèques non-standard devront être importées avec `require` pour les utiliser dans un script. Par exemple : diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/general/openOS.md b/src/main/resources/assets/opencomputers/doc/fr_FR/general/openOS.md index 9dcdd6290..b4a427390 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/general/openOS.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/general/openOS.md @@ -2,8 +2,8 @@ OpenOS est un système d'exploitation basique disponible dans OpenComputers. Il est nécessaire pour faire démarrer un [ordinateur](computer.md) pour la première fois, et peut être fabriqué en plaçant une [disquette](../item/floppy.md) vide et un manuel d'OpenComputers dans une table de craft. -Une fois créée, la [disquette](../item/floppy.md) peut être placée dans un [lecteur de disquette](../block/diskDrive.md) connectée à un système [informatique](computer.md) [correctement configuré](quickstart.md), ce qui permettra à l'[ordinateur](computer.md) de lancer OpenOS. -Une fois démarré, il est conseillé d'installer OpenOS sur un [disque dur](../item/hdd1.md) vierge, ce qui évite la nécessité d'une [disquette](../item/floppy.md) et donne accès à un système de fichiers en lecture/écriture (la [disquette](../item/floppy.md) d'OpenOS et les autres disquettes "trouvées" sont en lecture seule). Un [boîtier](../block/case3.md) de niveau 3 n'a pas besoin de [lecteur de disquette](../block/diskDrive.md), car il a un emplacement intégré pour les [disquettes](../item/floppy.md). +Une fois créée, la [disquette](../item/floppy.md) peut être placée dans un [lecteur de disquettes](../block/diskDrive.md) connectée à un système [informatique](computer.md) [correctement configuré](quickstart.md), ce qui permettra à l'[ordinateur](computer.md) de lancer OpenOS. +Une fois démarré, il est conseillé d'installer OpenOS sur un [disque dur](../item/hdd1.md) vierge, ce qui évite la nécessité d'une [disquette](../item/floppy.md) et donne accès à un système de fichiers en lecture/écriture (la [disquette](../item/floppy.md) d'OpenOS et les autres disquettes "trouvées" sont en lecture seule). Un [boîtier](../block/case3.md) de niveau 3 n'a pas besoin de [lecteur de disquettes](../block/diskDrive.md), car il a un emplacement intégré pour les [disquettes](../item/floppy.md). OpenOS peut être installé en écrivant simplement `install`, et en suivant les informations affichées à l'écran pour finaliser l'installation. La [disquette](../item/floppy.md) peut être retirée une fois que le système a été redémarré. OpenOS peut être installé sur tous les appareils sauf les [drones](../item/drone.md) et les [micro-contrôleurs](../block/microcontroller.md) (ils nécessitent tous les deux une programmation manuelle d'une [EEPROM](../item/eeprom.md) pour fournir des fonctionnalités, parce qu'ils n'ont pas de système de fichiers intégré). diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/index.md b/src/main/resources/assets/opencomputers/doc/fr_FR/index.md index 4b01c515f..01f6860f5 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/index.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/index.md @@ -32,8 +32,8 @@ Tous les appareils sont modulaires et peuvent être assemblés avec une grande v Les appareils d'OpenComputers sont compatibles avec différents mods pour la manipulation de blocs et d'entités (à travers l'[adaptateur](block/adapter.md), ou des améliorations spécifiques d'un [robot](block/robot.md) ou d'un [drone](item/drone.md)). L'énergie peut être fournie grâce à une large gamme de mods, incluant, sans limitation, les Redstone Flux, les EU d'IndustrialCraft2, les Joules de Mekanism, l'énergie d'Applied Energistics 2 autant que la charge de Factorization. -Les appareils d'OpenComputers ont des fonctionnalités supplémentaires ainsi que quelques limitations. Les [ordinateurs](general/computer.md) sont la base, et sont capables de contenir un bon nombre de composants, contrôlés par le niveau du processeur utilisé. Les [ordinateurs](general/computer.md) ont également accès aux composants par leurs six faces. Les [serveurs](item/server1.md) sont capables de se connecter à plus de composants (en interne ou en externe) qu'un [ordinateur](general/computer.md), en utilisant des [bus de composants](item/componentBus1.md); cependant, à cause du [support de serveur](block/serverRack.md), le [serveur](item/server1.md) est seulement capable d'accéder aux composants par une unique face du [support de serveur](block/serverRack.md), tel que configuré dans l'interface du [server rack](block/serverRack.md). Les [micro-contrôleurs](block/microcontroller.md) sont encore plus limités (comparés aux [ordinateurs](general/computer.md)) par leur manque d'emplacements de [disque dur](item/hdd1.md) et de [lecteur de disquette](block/diskDrive.md), ce qui veut dire qu'[OpenOS](general/openOS.md) ne peut pas être installé sur un [micro-contrôleur](block/microcontroller.md). Les [micro-contrôleurs](block/microcontroller.md) ont un emplacement pour une [EEPROM](item/eeprom.md), et peuvent être programmés avec un système d'exploitation plus spécifique pour un ensemble limité de tâches. +Les appareils d'OpenComputers ont des fonctionnalités supplémentaires ainsi que quelques limitations. Les [ordinateurs](general/computer.md) sont la base, et sont capables de contenir un bon nombre de composants, contrôlés par le niveau du processeur utilisé. Les [ordinateurs](general/computer.md) ont également accès aux composants par leurs six faces. Les [serveurs](item/server1.md) sont capables de se connecter à plus de composants (en interne ou en externe) qu'un [ordinateur](general/computer.md), en utilisant des [bus de composants](item/componentBus1.md); cependant, à cause du [support de serveur](block/serverRack.md), le [serveur](item/server1.md) est seulement capable d'accéder aux composants par une unique face du [support de serveur](block/serverRack.md), tel que configuré dans l'interface du [server rack](block/serverRack.md). Les [micro-contrôleurs](block/microcontroller.md) sont encore plus limités (comparés aux [ordinateurs](general/computer.md)) par leur manque d'emplacements de [disque dur](item/hdd1.md) et de [lecteur de disquettes](block/diskDrive.md), ce qui veut dire qu'[OpenOS](general/openOS.md) ne peut pas être installé sur un [micro-contrôleur](block/microcontroller.md). Les [micro-contrôleurs](block/microcontroller.md) ont un emplacement pour une [EEPROM](item/eeprom.md), et peuvent être programmés avec un système d'exploitation plus spécifique pour un ensemble limité de tâches. -Les [robots](block/robot.md) sont des [ordinateurs](general/computer.md) mobiles, et sont capables d'interagir avec le monde (mais ne peuvent pas interagir avec d'autres blocs d'OpenComputers). Contrairement aux [ordinateurs](general/computer.md), une fois qu'un robot est construit, les composants à l'intérieur du [robot](block/robot.md) ne peuvent pas être retirés. Pour contourner cette limitation, les [robots](block/robot.md) peuvent être construits avec des conteneurs d'[amélioration](item/upgradeContainer1.md) ou de [carte](item/cardContainer1.md), ce qui permettra d'échanger à la volée des cartes ou des améliorations, si nécessaire. [OpenOS](general/openOS.md) peut être installé sur les [robots](block/robot.md) en plaçant un [lecteur de disquette](block/diskDrive.md) dans un emplacement de conteneur, ce qui permettra l'insertion de [disquettes](item/floppy.md), ou en plaçant un [disque dur](item/hdd1.md) avec [OpenOS](general/openOS.md) pré-installé dans l'un des emplacements de [disque dur](item/hdd1.md). Pour complètement reconfigurer un [robot](block/robot.md), il devra être [désassemblé](block/disassembler.md) avant. Les [drones](item/drone.md) sont une version limitée des [robots](block/robot.md). Ils se déplacent différemment, ont moins d'emplacements d'inventaire, et n'ont pas de système d'exploitation (à l'instar des [micro-contrôleurs](block/microcontroller.md), les [drones](item/drone.md) peuvent être configurés avec une [EEPROM](item/eeprom.md) programmée pour un ensemble limité de tâches). Pour la plupart, les [robots](block/robot.md) et les [drones](item/drone.md) partagent les mêmes améliorations et composants; cependant, les améliorations se comportent différemment avec les [drones](item/drone.md), comme les [améliorations d'inventaire](item/inventoryUpgrade.md) qui fournissent seulement 4 emplacements par amélioration, pour un total de 8 emplacements, tandis que les [robots](block/robot.md) sont capables d'accepter plus d'[améliorations d'inventaire](item/inventoryUpgrade.md) (pour un total de 4) ainsi que l'obtention de plus d'emplacements par amélioration (16 emplacements par amélioration). +Les [robots](block/robot.md) sont des [ordinateurs](general/computer.md) mobiles, et sont capables d'interagir avec le monde (mais ne peuvent pas interagir avec d'autres blocs d'OpenComputers). Contrairement aux [ordinateurs](general/computer.md), une fois qu'un robot est construit, les composants à l'intérieur du [robot](block/robot.md) ne peuvent pas être retirés. Pour contourner cette limitation, les [robots](block/robot.md) peuvent être construits avec des conteneurs d'[amélioration](item/upgradeContainer1.md) ou de [carte](item/cardContainer1.md), ce qui permettra d'échanger à la volée des cartes ou des améliorations, si nécessaire. [OpenOS](general/openOS.md) peut être installé sur les [robots](block/robot.md) en plaçant un [lecteur de disquettes](block/diskDrive.md) dans un emplacement de conteneur, ce qui permettra l'insertion de [disquettes](item/floppy.md), ou en plaçant un [disque dur](item/hdd1.md) avec [OpenOS](general/openOS.md) pré-installé dans l'un des emplacements de [disque dur](item/hdd1.md). Pour complètement reconfigurer un [robot](block/robot.md), il devra être [désassemblé](block/disassembler.md) avant. Les [drones](item/drone.md) sont une version limitée des [robots](block/robot.md). Ils se déplacent différemment, ont moins d'emplacements d'inventaire, et n'ont pas de système d'exploitation (à l'instar des [micro-contrôleurs](block/microcontroller.md), les [drones](item/drone.md) peuvent être configurés avec une [EEPROM](item/eeprom.md) programmée pour un ensemble limité de tâches). Pour la plupart, les [robots](block/robot.md) et les [drones](item/drone.md) partagent les mêmes améliorations et composants; cependant, les améliorations se comportent différemment avec les [drones](item/drone.md), comme les [améliorations d'inventaire](item/inventoryUpgrade.md) qui fournissent seulement 4 emplacements par amélioration, pour un total de 8 emplacements, tandis que les [robots](block/robot.md) sont capables d'accepter plus d'[améliorations d'inventaire](item/inventoryUpgrade.md) (pour un total de 4) ainsi que l'obtention de plus d'emplacements par amélioration (16 emplacements par amélioration). Ce manuel contient des informations détaillées concernant tous les blocs et objets, comment mettre en place différents types de systèmes et d'appareils, ainsi qu'une introduction à la programmation. diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/item/databaseUpgrade1.md b/src/main/resources/assets/opencomputers/doc/fr_FR/item/databaseUpgrade1.md index 81962dd58..64b34c2e8 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/item/databaseUpgrade1.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/item/databaseUpgrade1.md @@ -2,7 +2,7 @@ ![Je suis dans la matrice!](oredict:oc:databaseUpgrade1) -L'amélioration de base de données peut être configurée pour stocker un liste de représentation de groupes d'objets, qui peuvent ensuite être utilisés par d'autres composants. C'est particulièrement utile pour les objets qui sont uniquement distinguables par leurs données NBT, ce qui ne fait pas partie des données affichées de base pour un groupe d'objets. +L'amélioration de base de données peut être configurée pour stocker une liste de représentations de groupes d'objets, qui peuvent ensuite être utilisés par d'autres composants. C'est particulièrement utile pour les objets qui sont uniquement distinguables par leurs données NBT, ce qui ne fait pas partie des données affichées de base pour un groupe d'objets. Pour configurer une base de données, ouvrez la en faisant un clic droit avec la base de données dans la main. Placez les objets avec lesquels vous souhaitez la configurer dans l'inventaire du haut. Cela stockera un "objet fantôme", ce qui veut dire qu'aucun objet "réel" n'est stocké dans la base de données. diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/item/hdd1.md b/src/main/resources/assets/opencomputers/doc/fr_FR/item/hdd1.md index a4b8d1448..5580dd8b3 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/item/hdd1.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/item/hdd1.md @@ -2,4 +2,4 @@ ![Spaaaace.](oredict:oc:hdd1) -Le disque dur est un moyen de stockage de données de haut niveau dans OpenComputers. Tous les moyens de stockage de données fonctionnent à la même vitesse ; un moyen de stockage de plus haut niveau fournit juste plus d'espace. Il y a également quelques appareils qui peuvent seulement utiliser les disques durs (bien que les serveurs pourraient utiliser un [lecteur de disquette](../block/diskDrive.md) externe, par exemple). Les disques durs peuvent être placés dans un [raid](../block/raid.md), ce qui permet à plusieurs disques de partager le même système de fichiers. Remarquez que placer un disque dur dans un [raid](../block/raid.md) efface le contenu du disque. +Le disque dur est un moyen de stockage de données de haut niveau dans OpenComputers. Tous les moyens de stockage de données fonctionnent à la même vitesse ; un moyen de stockage de plus haut niveau fournit juste plus d'espace. Il y a également quelques appareils qui peuvent seulement utiliser les disques durs (bien que les serveurs pourraient utiliser un [lecteur de disquettes](../block/diskDrive.md) externe, par exemple). Les disques durs peuvent être placés dans un [raid](../block/raid.md), ce qui permet à plusieurs disques de partager le même système de fichiers. Remarquez que placer un disque dur dans un [raid](../block/raid.md) efface le contenu du disque. diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/item/inventoryControllerUpgrade.md b/src/main/resources/assets/opencomputers/doc/fr_FR/item/inventoryControllerUpgrade.md index 4541c5540..d872e3894 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/item/inventoryControllerUpgrade.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/item/inventoryControllerUpgrade.md @@ -2,6 +2,6 @@ ![J'ai le contrôle.](oredict:oc:inventoryControllerUpgrade) -L'amélioration du contrôleur d'inventaire permet aux [robots](../block/robot.md) et aux [drones](drone.md) des capacités d'interaction étendues avec les inventaires. Elle permet à un appareil de viser spécifiquement un emplacement dans un inventaire externe quand il lâche ou ramasse un objet. Elle permet également à un appareil de lire des informations détaillées à propos d'un objet. Enfin, elle fournit aux [robots](../block/robot.md) un moyen de changer leur outil équipé sans aide extérieure. +L'amélioration du contrôleur d'inventaire donne aux [robots](../block/robot.md) et aux [drones](drone.md) des capacités d'interactions étendues avec les inventaires. Elle permet à un appareil de viser spécifiquement un emplacement dans un inventaire externe quand il lâche ou ramasse un objet. Elle permet également à un appareil de lire des informations détaillées à propos d'un objet. Enfin, elle fournit aux [robots](../block/robot.md) un moyen de changer leur outil équipé sans aide extérieure. Cette amélioration peut également être placée dans un [adaptateur](../block/adapter.md), ce qui lui permet d'utiliser des méthodes d'inspection d'inventaires adjacents similaires à celles des [robots](../block/robot.md). Cependant, elle ne permet pas à l'[adaptateur](../block/adapter.md) de déplacer des objets hors et vers ces inventaires. Cette fonctionnalité est seulement disponible pour les [robots](../block/robot.md) et les [drones](drone.md). diff --git a/src/main/resources/assets/opencomputers/doc/fr_FR/item/redstoneCard1.md b/src/main/resources/assets/opencomputers/doc/fr_FR/item/redstoneCard1.md index 22c3e420b..5f818f81b 100644 --- a/src/main/resources/assets/opencomputers/doc/fr_FR/item/redstoneCard1.md +++ b/src/main/resources/assets/opencomputers/doc/fr_FR/item/redstoneCard1.md @@ -4,6 +4,6 @@ La carte de redstone permet aux [ordinateurs](../general/computer.md) de lire et émettre des signaux de redstone analogiques dans les blocs adjacents. Quand la force d'un signal entrant change, un signal est injecté dans l'[ordinateur](../general/computer.md). -Si un des mods supportés fournissant des câbles empaquetés (bundled) est présent, comme RedLogic, Project:Red ou Minefactory Reloaded; ou un mod qui fournit des capacités de signal sans fil, comme WirelessRedstone-ChickenBonesEdition (WR-CBE), ou le Slimevoid's Wireless mod, un carte de redstone de niveau 2 est disponible pour interagir avec ces systèmes. +Si un des mods supportés fournissant des câbles empaquetés (bundled) est présent, comme RedLogic, Project:Red ou Minefactory Reloaded; ou un mod qui fournit des capacités de signal sans fil, comme WirelessRedstone-ChickenBonesEdition (WR-CBE), ou le Slimevoid's Wireless mod, une carte de redstone de niveau 2 est disponible pour interagir avec ces systèmes. Le côté renseigné dans les méthodes de la carte est relatif à l'orientation du [boîtier d'ordinateur](../block/case1.md) / [robot](../block/robot.md) / [support de serveur](../block/serverRack.md). Cela signifie que quand vous regardez l'avant d'un ordinateur, le côté `sides.right` est à votre gauche, et inversement. From d67156ed52d2417142685f188914c06f5ff04dd2 Mon Sep 17 00:00:00 2001 From: payonel Date: Fri, 22 Dec 2017 06:34:55 -0800 Subject: [PATCH 10/10] update font.hex (thanks @asie) and drop wcwidth.bin now server loads glyph sizes by parsing font.hex closes #2676 --- .../resources/assets/opencomputers/font.hex | 324 ++++++++---------- .../assets/opencomputers/wcwidth.bin | Bin 65536 -> 0 bytes .../client/renderer/font/FontParserHex.java | 3 +- src/main/scala/li/cil/oc/util/FontUtils.scala | 194 +++++++++-- 4 files changed, 310 insertions(+), 211 deletions(-) delete mode 100644 src/main/resources/assets/opencomputers/wcwidth.bin diff --git a/src/main/resources/assets/opencomputers/font.hex b/src/main/resources/assets/opencomputers/font.hex index 551966dbf..00221c12f 100644 --- a/src/main/resources/assets/opencomputers/font.hex +++ b/src/main/resources/assets/opencomputers/font.hex @@ -186,8 +186,8 @@ 00B9:00307030303030300000000000000000 00BA:0000003C6666663C007E000000000000 00BB:0000000000CC663366CC000000000000 -00BC:000066E66C6C18183032666ACFC20000 -00BD:000066E66C6C181830306C66CCCE0000 +00BC:000046C64C4C58183032666ACFC20000 +00BD:000046C64C4C581830306C66CCCE0000 00BE:0000C6266C2CD8183032666ACFC20000 00BF:0018180000183030606066663C000000 00C0:301800183C6666667E66666666000000 @@ -910,13 +910,14 @@ 201D:66CC0000000000000000000000000000 2020:00001818187E18181818181818000000 2021:00001818187E1818187E181818000000 -2022:0000000018183C3C3C3C181800000000 +2022:000000000000183C3C18000000000000 2024:00000000000000000000181818000000 2025:00000000000000000000666666660000 2026:00000000000000000000009292000000 2030:0000C6C6CCCC18186060DBDBDBDB0000 2031:0000C6C6CCCC18186060D5D5D5D50000 203C:66666666666666666666000066660000 +2044:000006060C0C181830306060C0C00000 2047:CCCC66666666CCCCCCCC0000CCCC0000 2048:E6E6363636366666C6C60000C6C60000 2049:DCDCC6C6C6C6CCCCD8D80000D8D80000 @@ -928,11 +929,31 @@ 2078:00386C6C386C6C380000000000000000 2079:00386C6C3C0C0C380000000000000000 207F:000000786C6C6C6C0000000000000000 +20A3:00007E6060607C6060F8606060000000 +20A4:0000386C6C60F060F0606666FC000000 20A7:00FC66667C62666F666666F300000000 +20AA:000000FA8AAAAAAAAAA2BE0000000000 20AC:00003C666660FC60F86066663C000000 2117:7E7E8181B9B9A5A5B9B9A1A181817E7E 2120:006A8E8E4A2A2ACA0000000000000000 2122:00EA4E4E4A4A4A4A0000000000000000 +2150:000046C64C4C581830376162C2C20000 +2151:000046C64C4C581830366967C1C60000 +2152:000046C64C4C581A36326062C5C20000 +2153:000046C64C4C581830366162C1C60000 +2154:0000C6264C8CF81830366162C1C60000 +2155:000046C64C4C5818303E686CC2CC0000 +2156:0000C6264C8CF818303E686CC2CC0000 +2157:0000C6266C2CD818303E686CC2CC0000 +2158:00002666ACFC3818303E686CC2CC0000 +2159:000046C64C4C58183036686EC9C60000 +215A:0000E686CC2CD8183036686EC9C60000 +215B:000046C64C4C581830366966C9C60000 +215C:0000C6266C2CD81830366966C9C60000 +215D:0000E686CC2CD81830366966C9C60000 +215E:0000E6264C4C581830366966C9C60000 +215F:000046C64C4C581830306060C0C00000 +2189:000046A6ACAC581830366162C1C60000 2190:000000000010307F7F30100000000000 2191:183C7E18181818181818181818181818 2192:0000000000080CFEFE0C080000000000 @@ -943,26 +964,53 @@ 2199:000004040E0E1C1CB8B8F0F0E0E0F0F0 21A5:183C7E181818181818181818187E3C18 21A8:183C7E1818181818181818187E3C18FF -21E6:181838386F6FC1C1C1C16F6F38381818 -21E7:18183C3C6666C3C3E7E7242424243C3C -21E8:18181C1CF6F683838383F6F61C1C1818 -21E9:3C3C24242424E7E7C3C366663C3C1818 +21E6:0000000018386FC1C16F381800000000 +21E7:00000000183C66C3E724243C00000000 +21E8:00000000181CF68383F61C1800000000 +21E9:000000003C2424E7C3663C1800000000 +220E:00000000007E7E7E7E7E7E0000000000 +2211:0000FEC06030180C183060C0FE000000 2212:000000000000007E0000000000000000 -2218:000000003C3C666666663C3C00000000 +2213:000000007E001818187E181818000000 +2214:0000001818001818187E181818000000 +2215:000006060C0C181830306060C0C00000 +2218:0000000000003C66663C000000000000 +2219:000000000000183C3C18000000000000 221A:0003030606060606CCCC6C3818000000 +221B:0063132616660606CCCC6C3818000000 +221C:002363A6F6262606CCCC6C3818000000 221E:000000000076DBDBDB6E000000000000 221F:000000000000FE060606060000000000 +2223:00001818181818181818181818000000 +2224:000018181A1C18183858181818000000 +2225:00006C6C6C6C6C6C6C6C6C6C6C000000 +2226:00006C6C6E6C6C7C6C6CEC6C6C000000 2229:0000003C666666666666666600000000 +222A:00000066666666666666663C00000000 +222B:00000E1B18181818181818D870000000 2248:0000000072D69C0072D69C0000000000 2261:000000007E00007E00007E0000000000 2264:000000000C18306030180C007E000000 2265:0000000030180C060C1830007E000000 +2295:0000000000385492FE92543800000000 +2296:0000000000384482FE82443800000000 +2297:00000000003844AA92AA443800000000 +2298:000000000038448A92A2443800000000 +2299:00000000003844829282443800000000 +229A:0000000000384492AA92443800000000 +229C:00000000003844BA82BA443800000000 +229D:0000000000384482BA82443800000000 +229E:0000000000FE9292FE9292FE00000000 +229F:0000000000FE8282FE8282FE00000000 +22A0:0000000000FEC6AA92AAC6FE00000000 +22A1:0000000000FE8282928282FE00000000 22C5:00000000181818180000000000000000 2320:00000E1B1B1B18181818181818181818 2321:181818181818181818D8D8D870000000 +23E9:000000008888CCCCEEEECCCC88880000 23EA:0000000022226666EEEE666622220000 23EB:101038387C7C0000101038387C7C0000 -23EC:000000008888CCCCEEEECCCC88880000 +23EC:7C7C3838101000007C7C383810100000 2500:00000000000000FFFF00000000000000 2501:000000000000FFFFFFFF000000000000 2502:18181818181818181818181818181818 @@ -1123,20 +1171,20 @@ 259D:0F0F0F0F0F0F0F0F0000000000000000 259E:0F0F0F0F0F0F0F0FF0F0F0F0F0F0F0F0 259F:0F0F0F0F0F0F0F0FFFFFFFFFFFFFFFFF -25A0:00007E7E7E7E7E7E7E7E7E7E7E7E0000 -25A1:00007E7E66666666666666667E7E0000 -25A2:7C7CC6C6C6C6C6C6C6C6C6C67C7C0000 -25A3:FEFE8282BABABABABABA8282FEFE0000 +25A0:00000000007E7E7E7E7E7E0000000000 +25A1:00000000007E666666667E0000000000 +25A2:000000007CC6C6C6C6C67C0000000000 +25A3:00000000FE82BABABA82FE0000000000 25A4:FF00FF00FF00FF00FF00FF00FF00FF00 25A5:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 25A6:44FF444444FF444444FF444444FF4444 25A7:88884444222211118888444422221111 25A8:11112222444488881111222244448888 25A9:AAAA4444AAAA1111AAAA4444AAAA1111 -25AA:00000000383838383838000000000000 -25AB:00000000383828283838000000000000 -25AC:00000000000000007E7E7E7E7E7E0000 -25AD:00000000000000007E7E66667E7E0000 +25AA:00000000000038383800000000000000 +25AB:00000000000038283800000000000000 +25AC:0000000000000000007E7E7E00000000 +25AD:0000000000000000007E667E00000000 25AE:3C3C3C3C3C3C3C3C3C3C3C3C3C3C0000 25AF:3C3C242424242424242424243C3C0000 25B0:00000000000000003F3F7E7EFCFC0000 @@ -1147,8 +1195,8 @@ 25B5:000010103828286C4444C68282FE0000 25B6:80C0E0F0F8FCFEFFFEFCF8F0E0C08000 25B7:80C0E0F0D8CCC6C3C6CCD8F0E0C08000 -25B8:00000000406070787C78706040000000 -25B9:00000000406050484448506040000000 +25B8:000000002030383C3E3C383020000000 +25B9:00000000203028242224283020000000 25BA:00000000C0F0FCFFFCF0C00000000000 25BB:00000000C0F0DCC7DCF0C00000000000 25BC:FEFEFEFE7C7C7C7C3838383810101010 @@ -1164,25 +1212,25 @@ 25C6:18183C3C7E7EFFFFFFFF7E7E3C3C1818 25C7:18183C3C6666C3C3C3C366663C3C1818 25C8:181824245A5ABDBDBDBD5A5A24241818 -25C9:3C3C6666C3C3DBDBDBDBC3C366663C3C +25C9:000000003C66C3DBDBC3663C00000000 25CA:101038386C6CC6C6C6C66C6C38381010 -25CB:00003C3C66664242424266663C3C0000 -25CC:10104444000082820000444410100000 -25CD:000038386C6CAAAAAAAA6C6C38380000 -25CE:383844449292AAAA9292444438380000 -25CF:00003C3C7E7E7E7E7E7E7E7E3C3C0000 -25D0:3C3C7676F3F3F3F3F3F3F3F376763C3C -25D1:3C3C6E6ECFCFCFCFCFCFCFCF6E6E3C3C -25D2:3C3C6666C3C3C3C3FFFFFFFF7E7E3C3C -25D3:3C3C7E7EFFFFFFFFC3C3C3C366663C3C -25D4:3C3C6E6ECFCFCFCFC3C3C3C366663C3C -25D5:3C3C6E6ECFCFCFCFFFFFFFFF7E7E3C3C +25CB:00000000003C664242663C0000000000 +25CC:00000000104400820044100000000000 +25CD:0000000000386CAAAA6C380000000000 +25CE:00000000384492AA9244380000000000 +25CF:00000000003C7E7E7E7E3C0000000000 +25D0:000000003C76F3F3F3F3763C00000000 +25D1:000000003C6ECFCFCFCF6E3C00000000 +25D2:000000003C66C3C3FFFF7E3C00000000 +25D3:000000003C7EFFFFC3C3663C00000000 +25D4:000000003C6ECFCFC3C3663C00000000 +25D5:000000003C6ECFCFFFFF7E3C00000000 25D6:00030F1F1F3F3F3F3F3F1F1F0F030000 25D7:00C0F0F8F8FCFCFCFCFCF8F8F0C00000 -25D8:FFFFFFFFE7E7C3C3C3C3E7E7FFFFFFFF -25D9:FFFFC3C39999BDBDBDBD9999C3C3FFFF -25DA:FFFFC3C39999BDBD0000000000000000 -25DB:0000000000000000BDBD9999C3C3FFFF +25D8:FFFFFFFFFFFFE7C3C3E7FFFFFFFFFFFF +25D9:FFFFFFFFFFC399BDBD99C3FFFFFFFFFF +25DA:FFFFFFFFFFC399BD0000000000000000 +25DB:0000000000000000BD99C3FFFFFFFFFF 25DC:38386060C0C0C0C00000000000000000 25DD:1C1C0606030303030000000000000000 25DE:00000000000000000303030306061C1C @@ -1193,32 +1241,38 @@ 25E3:8080C0C0E0E0F0F0F8F8FCFCFEFEFFFF 25E4:FFFFFEFEFCFCF8F8F0F0E0E0C0C08080 25E5:FFFF7F7F3F3F1F1F0F0F070703030101 -25E6:00000000181824242424181800000000 -25E7:FFFFF3F3F3F3F3F3F3F3F3F3F3F3FFFF -25E8:FFFFCFCFCFCFCFCFCFCFCFCFCFCFFFFF -25E9:FFFFFFFFFFFFFBFBF3F3E3E3C3C3FFFF -25EA:FFFFC3C3C7C7CFCFDFDFFFFFFFFFFFFF -25EB:FFFFDBDBDBDBDBDBDBDBDBDBDBDBFFFF +25E6:00000000000018242418000000000000 +25E7:00000000FFF3F3F3F3F3F3FF00000000 +25E8:00000000FFCFCFCFCFCFCFFF00000000 +25E9:00000000FFFFFFFBF3E3C3FF00000000 +25EA:00000000FFC3C7CFDFFFFFFF00000000 +25EB:00000000FFDBDBDBDBDBDBFF00000000 25EC:18181818242442425A5A99998181FFFF 25ED:181818183C3C76767676F3F3F3F3FFFF 25EE:181818183C3C6E6E6E6ECFCFCFCFFFFF -25EF:3C3C6666C3C3C3C3C3C3C3C366663C3C -25F0:FFFFDBDBDBDBDBDBFBFBC3C3C3C3FFFF -25F1:FFFFC3C3C3C3C3C3FBFBDBDBDBDBFFFF -25F2:FFFFC3C3C3C3C3C3DFDFDBDBDBDBFFFF -25F3:FFFFDBDBDBDBDBDBDFDFC3C3C3C3FFFF -25F4:3C3C7E7EDBDBDBDBFBFBC3C366663C3C -25F5:3C3C6666C3C3FBFBDBDBDBDB7E7E3C3C -25F6:3C3C6666C3C3DFDFDBDBDBDB7E7E3C3C -25F7:3C3C7E7EDBDBDBDBDFDFC3C366663C3C +25EF:000000003C66C3C3C3C3663C00000000 +25F0:00000000FFDBDBDBFBC3C3FF00000000 +25F1:00000000FFC3C3C3FBDBDBFF00000000 +25F2:00000000FFC3C3C3DFDBDBFF00000000 +25F3:00000000FFDBDBDBDFC3C3FF00000000 +25F4:000000003C7EDBDBFBC3663C00000000 +25F5:000000003C66C3FBDBDB7E3C00000000 +25F6:000000003C66C3DFDBDB7E3C00000000 +25F7:000000003C7EDBDBDFC3663C00000000 25F8:FFFFC6C6CCCCD8D8F0F0E0E0C0C08080 25F9:FFFF636333331B1B0F0F070703030101 -25FA:0101030307070F0F1B1B33336363FFFF -25FB:00007C7C6C6C6C6C6C6C7C7C00000000 -25FC:00007C7C7C7C7C7C7C7C7C7C00000000 -25FD:000000003C3C242424243C3C00000000 -25FE:000000003C3C3C3C3C3C3C3C00000000 -25FF:8080C0C0E0E0F0F0D8D8CCCCC6C6FFFF +25FA:8080C0C0E0E0F0F0D8D8CCCCC6C6FFFF +25FB:00000000007C6C6C6C7C000000000000 +25FC:00000000007C7C7C7C7C000000000000 +25FD:0000000000003C24243C000000000000 +25FE:0000000000003C3C3C3C000000000000 +25FF:0101030307070F0F1B1B33336363FFFF +2605:000001000380038007C03FF87FFC3FF80FE00FE01FF03C783018000000000000 +2606:000001000380038006C03C78600C38380C600C601BB03C783018000000000000 +2609:00000000003C425A5A423C0000000000 +2610:00000000FE8282828282FE0000000000 +2611:00000000FE868AAA9282FE0000000000 +2612:00000000FE82AA92AA82FE0000000000 2625:00007CC6C66C38FE3838383838000000 2628:000018183C18187E1818181818000000 262F:0000003C428D81B3FFCF7E3C00000000 @@ -1230,9 +1284,12 @@ 2635:00000000C6C60000FEFE0000C6C60000 2636:00000000FEFE0000C6C60000C6C60000 2637:00000000C6C60000C6C60000C6C60000 -2639:00003C4281A5818199BD81423C000000 -263A:00003C4281A58181BD9981423C000000 -263B:00003C7EFFDBFFFFC3E7FF7E3C000000 +2639:0000007E81A5A5818199BD817E000000 +263A:0000007E81A5A58181BD99817E000000 +263B:0000007EFFDBDBFFFFC3E7FF7E000000 +2640:0000003C6666663C187E181800000000 +2641:00000018187E183C6666663C00000000 +2642:0000001E0E1A78CCCCCCCC7800000000 2660:00000010387CFEFEFE38387C00000000 2661:0000006CFEC6C6C66C6C381000000000 2662:0000001038386CC66C38381000000000 @@ -1251,9 +1308,9 @@ 268D:0000000000000000C6C60000FEFE0000 268E:0000000000000000FEFE0000C6C60000 268F:0000000000000000C6C60000C6C60000 -26AA:000000003C3C4242424242423C3C0000 -26AB:000000003C3C7E7E7E7E7E7E3C3C0000 -26AC:000038387C7C6C6C7C7C383800000000 +26AA:0000000000003C4242423C0000000000 +26AB:0000000000003C7E7E7E3C0000000000 +26AC:0000000000387C6C7C38000000000000 2708:303038389C9CFFFFFFFF9C9C38383030 2734:929254543838FEFE3838545492920000 2800:00000000000000000000000000000000 @@ -1513,10 +1570,17 @@ 28FE:0F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFF 28FF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 2913:181818181818181818181818187E3C18 +2A00:000007C01C7030183018600C638C638C638C600C301830181C7007C000000000 +2A01:000007C01D7031183118610C610C7FFC610C610C311831181D7007C000000000 +2A02:000007C01C70301838386C6C66CC638C66CC6C6C383830181C7007C000000000 +2A03:44444444444454544444444438380000 +2A04:4444444454547C7C5454444438380000 +2A05:7C7C4444444444444444444444440000 +2A06:4444444444444444444444447C7C0000 2B1D:00000000000018181818000000000000 -2B24:3C3C7E7EFFFFFFFFFFFFFFFF7E7E3C3C -2B55:3C3C7E7EE7E7C3C3C3C3E7E77E7E3C3C -2B58:00003C3C7E7E666666667E7E3C3C0000 +2B24:000000003C7EFFFFFFFF7E3C00000000 +2B55:000000003C7EE7C3C3E77E3C00000000 +2B58:00000000003C7E66667E3C0000000000 2E2E:3C3C6666666630301818000018180000 3000:0000000000000000000000000000000000000000000000000000000000000000 3001:0000000000000000000000000000000000000000000000002000100008000800 @@ -8509,125 +8573,6 @@ EC03:000052523434060660602C2C4A4A0000 EC04:000010102C2C3A3A5C5C343404040000 EC05:525244442D2DC4C41111B4B423234A4A EC06:9191525200000303C0C000004A4A8989 -EC07:00003C7EFF99FFFFC3BDFF7E3C000000 -EC08:7E7EC3C3D3D3D3D3DBDBC3C3C3C37E7E -EC09:18183C3C3C3C3C3C7E7E101038381010 -EC0A:0505050505050D0D0D0D191979797171 -EC0B:A0A0A0A0A0A0B0B0B0B098989E9E8E8E -EC0C:10105454545454545454545454549292 -EC0D:7070C6C6C4C4C0C0C4C4C6C670700000 -EC0E:181818183C3C7E7EFFFFDBDB18183C3C -EC0F:3C3C1818DBDBFFFF7E7E3C3C18181818 -EC10:0C0C1C1C3939FFFFFFFF39391C1C0C0C -EC11:BABAEEEEAAAA38383838BABAFEFEBABA -EC12:BABAFEFEBABA38383838AAAAEEEEBABA -EC13:E7E74242FFFFF9F9FFFF4242E7E70000 -EC14:E7E74242FFFF9F9FFFFF4242E7E70000 -EC15:22226363F7F7B7B7FFFF7E7E3C3C3C3C -EC16:3C3C7E7EFFFFBFBFFFFF7E7E3C3C3C3C -EC17:3C3C3C3C18183C3C3C3C3C3C3C3C1818 -EC18:18183C3C3C3C3C3C3C3C18183C3C3C3C -EC19:000000007B7BFFFFFFFF7B7B00000000 -EC1A:00000000DEDEFFFFFFFFDEDE00000000 -EC1B:2020606020202020303028283C3C3C3C -EC1C:000030305858FDFDFFFF797930300000 -EC1D:00000C0C1A1ABFBFFFFF9E9E0C0C0000 -EC1E:000030305858FDFD3F3FF9F930300000 -EC1F:00000C0C1A1ABFBFFCFC9F9F0C0C0000 -EC20:101028286868BCBCFCFC787810103838 -EC21:00000000FCFC1C1C7F7F63633E3E0000 -EC22:3838383892927C7C1010282828282828 -EC23:383838381010FEFE1010282844448282 -EC24:8282444428281010FEFE101038383838 -EC25:11111212D4D4F8F8D4D4121211110000 -EC26:888848482B2B1F1F2B2B484888880000 -EC27:3838383812127C7C9090282824242222 -EC28:3838383890907C7C1212282848488888 -EC29:383838381010FEFE101038387C7CFEFE -EC2A:8181C3C3E7E7FFFFFFFF99992424C3C3 -EC2B:00007C7CD6D67C7C3838545492920000 -EC2C:0000000038385454FEFE000000000000 -EC2D:3C3C5A5AFFFFE7E77E7E242442428181 -EC2E:3C3C5A5AFFFFE7E77E7E242424246666 -EC2F:08081C1C2A2A7F7F77773E3E36366363 -EC30:08081C1C2A2A7F7F77773E3E36361414 -EC31:4141A2A23C3C5A5A7E7EFFFF42426363 -EC32:828245453C3C5A5A7E7EFFFF4242C6C6 -EC33:00005A5ABDBD99992424424224240000 -EC34:8181A5A55A5A181818182424C3C30000 -EC35:000024247E7EBDBD7E7E24242424E7E7 -EC36:24247E7EBDBD7E7E242442424242C3C3 -EC37:3C3C5A5AFFFFABABD5D5FFFFDDDD8989 -EC38:3C3C5A5AFFFFABABD5D5FFFF77772222 -EC39:3C3C4242A5A5818199998181D5D5AAAA -EC3A:3C3C4242A5A5818199998181ABAB5555 -EC3B:181824247E7EFFFF5A5A242400000000 -EC3C:3C3CFFFFFFFF18180C0C181830301818 -EC3D:3C3C4242ABABD5D51010101014140808 -EC3E:0000C0C0C8C854545454555522220000 -EC3F:FFFF89899191C5C5A3A389899191FFFF -EC40:FFFFC3C3A5A599999999A5A5C3C3FFFF -EC41:FFFF99999999FFFFFFFF99999999FFFF -EC42:FFFF8181A5A581818181A5A58181FFFF -EC43:E7E7818181810000000081818181E7E7 -EC44:92925454383810101010101010101010 -EC45:38381010383810103838101038381010 -EC46:000000000000AAAAFFFFAAAA00000000 -EC47:7E7E42427E7E42427E7E42427E7E4242 -EC48:0000FFFF5555555555555555FFFF0000 -EC49:000000000000C0C0B0B08C8C8383FFFF -EC4A:00000000000003030D0D3131C1C1FFFF -EC4B:0F0F303040404E4E8A8A8E8E80808181 -EC4C:F0F00C0C020272725151717101018181 -EC4D:0F0F3030404040408E8E808080808181 -EC4E:F0F00C0C020202027171010101018181 -EC4F:81818080888884844343404030300F0F -EC50:8181010111112121C2C202020C0CF0F0 -EC51:81818080808087874040404030300F0F -EC52:818101010101E1E1020202020C0CF0F0 -EC53:81818080838384844343404030300F0F -EC54:81810101C1C12121C2C202020C0CF0F0 -EC55:81818080878788884848404030300F0F -EC56:81810101E1E11111121202020C0CF0F0 -EC57:07070F0F1F1F1818181810101E1E1717 -EC58:F0F0F8F8ECEC0404040404043C3C5454 -EC59:11110B0B0D0D060607072E2E39393838 -EC5A:04042828D8D82828D0D01010E0E00000 -EC5B:00000303040408083F3F7F7FFFFF3F3F -EC5C:0000C0C020201010FCFCFEFEFFFFFCFC -EC5D:03030C0C3F3F3F3FFFFF7F7F37371F1F -EC5E:C0C03030B8B8DCDCEEEEF6F6FBFBFBFB -EC5F:04044E4EE4E446466F6F7F7F60603F3F -EC60:2020727227276262F6F6FEFE0606FCFC -EC61:3B3B31311B1B1F1F10101F1F0F0F0707 -EC62:DCDC8C8CD8D8F8F80808F8F8F0F0E0E0 -EC63:010133337B7B59598C8CDFDF7F7F3F3F -EC64:8080CCCCDEDE9A9A3131FBFBFEFEFCFC -EC65:01010303070706060E0E3E3E70703030 -EC66:8080C0C0E0E0606070707C7C0E0E0C0C -EC67:787870706060E0E0C0C0ECECFEFED1D1 -EC68:1E1E0E0E06060707030337377F7F8B8B -EC69:3F3F1F1F1F1F0F0F0F0F7F7F0000FFFF -EC6A:FCFCF8F8F8F8F0F0F0F0FEFE0000FFFF -EC6B:0000010102020404020201011F1F1F1F -EC6C:000080804040202040408080F8F8F8F8 -EC6D:02020202020202021F1F20207F7F0000 -EC6E:4040404040404040F8F80404FEFE0000 -EC6F:7373737373737F7F3F3F1F1F0F0F0F0F -EC70:CECECECECECEFEFEFCFCF8F8F0F0F0F0 -EC71:0F0F0F0F0F0F18187F7F40407F7FFFFF -EC72:F0F0F0F0F0F01818FEFE0202FEFEFFFF -EC73:F8F8444442422121212142424444F8F8 -EC74:FFFF050507070000000007070505FFFF -EC75:FCFC868682828181818182828686FCFC -EC76:00000000808040407F7F808000000000 -EC77:0000010106061D1D2A2A2A2A2A2A1F1F -EC78:1B1B8F8F65651111C9C9A9A9B1B1F3F3 -EC79:4C4CF7F7F0F01818070702023E3EFEFE -EC7A:7F7F9F9F3131414181818181F9F9FDFD -EC7B:5F5F60606363626264647B7B60605F5F -EC7C:FFFF04040303FCFC0202FCFC0404F8F8 -EC7D:FCFC0202FCFC00000000000000000000 FE81:7E801010101010101010000000000000 FE82:3C401010101010101F0F000000000000 FE84:30403840101010101F0F000000000000 @@ -8781,7 +8726,9 @@ FF37:00000000781E781E781E781E781E799E7BDE7FFE7E7E7C3E781E000000000000 FF38:00000000F00F781E3C3C1E780FF007E00FF01E783C3C781EF00F000000000000 FF39:00000000F00F781E3C3C1E780FF007E003C003C003C003C003C0000000000000 FF3A:000000003FFC003C007800F001E003C007800F001E003C003FFC000000000000 +FF3B:00000FF00F000F000F000F000F000F000F000F000F000F000F000FF000000000 FF3C:F00078003C001E000F00078003C001E000F00078003C001E000F000700000000 +FF3D:00000FF000F000F000F000F000F000F000F000F000F000F000F00FF000000000 FF3E:000003C007E00FF01E783C3C781E000000000000000000000000000000000000 FF3F:0000000000000000000000000000000000000000000000000000000000007FFE FF40:000003C001E000F0003C00000000000000000000000000000000000000000000 @@ -8811,9 +8758,12 @@ FF57:000000000000000000000000781E781E799E7BDE7FFE3FFC1E78000000000000 FF58:000000000000000000000000781E3C3C1E780FF01E783C3C781E000000000000 FF59:0000000000000000000000003C3C3C3C3C3C3C3C3C3C3C3C0FFC003C003C0FF0 FF5A:0000000000000000000000003FFC003C00F003C00F003C003FFC000000000000 -FF5C:0000007E01E001E001E001E003C07F8003C001E001E001E001E0007E00000000 +FF5B:0000007E01E001E001E001E003C07F8003C001E001E001E001E0007E00000000 +FF5C:03C003C003C003C003C003C003C003C003C003C003C003C003C003C000000000 FF5D:00007E00078007800780078003C001FE03C007800780078007807E0000000000 FF5E:00001F867BDE60F8000000000000000000000000000000000000000000000000 +FF5F:00000330066006600CC00CC00CC00CC00CC00CC00CC006600660033000000000 +FF60:00000CC0066006600330033003300330033003300330066006600CC000000000 FF61:000000000000000000386C6C38000000 FF62:001E1818181800000000000000000000 FF63:00000000000000000018181818780000 @@ -8964,7 +8914,3 @@ FF9F:00386C6C380000000000000000000000 1D354:929200009292000092920000FEFE0000 1D355:929200009292000092920000C6C60000 1D356:92920000929200009292000092920000 -1F34E:080810106C6CFEFEFCFCFCFC7E7E6C6C -1F34F:080810106C6C82828484848452526C6C -1F352:00000606080810103030787878783030 -1F860:1010383838383838383838387C7CD6D6 diff --git a/src/main/resources/assets/opencomputers/wcwidth.bin b/src/main/resources/assets/opencomputers/wcwidth.bin deleted file mode 100644 index 7fa116d286f1bf6a7fe5fcf95d405d28ef4e2b3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 zcmeI40h?Vljzq)!{~x_NrzBn9P6C|_8DO#dJzFkSm1K2TW?;Yh?YF!B&J+0ZBkMa4 z`SPU_?Ze6CJJc8alzuB7{QFTUre>F(4!)=PPU-K_UpNmc;6sTI*Oy{0ud4Lym*eA@ zxcf5O(9CiSgT!*ffCEpnz_@wd$W7}Hmua9@@`btxZoe_Z;PFs9|V`O(f_ z)!4hCUv``Kf8+ewnoO+iUZ;LXozMA~;B&;wx)Zn)xD&V&xD&V&xD&V&xD&V&xD&V& zxD)v2Oo0D>oNnhI8~t^?S113t|L%SK^M&+&0{>0?*Zmr9EAu%-Uj|B=~wfBY-4y4i+)>P<}iv%(Pb?nCtl`tPPIakzZ8i67&AxA>3Qe2e|d zd;eC^UxNL>AAw&||L-Ch*_>|84Paf2&RZ zrE2Yba`9jOa^Vqd9Yd&is1?T{pzIhx)2)JI4O@r{zP0;rV<&EC(3DsPrSgTR#|TM8 zC58G@fQeF%pl-q3%|+OEm|+aS*~0jAzE~4=i)qQrin|)*rXvCkBu>sU59nPNbh-7> z+5x?`X&rp>(**M9H)ZJpgdet|P)CpCd`{V%ec^C+Hf8W;HMc2}jcc28c_FQ#cyFm; zAH#|{H#m62|YlSFwfYBIR#W&32QbcDohl*fsLWG(D-v69ue`)!YD zz;br7iAZDA2C>r!n=FHr>o7G^ig=P!83dE(gK@j134vzNLT6V9BDP0gWrnWqQA$7) zw?tc3e7aC+3l@ZA9eYa{VG>=l4%@=H7tj_Y&1IzAk`#YZ6`84HD4d$J6PW1;T7Dus zR8W_VNJD75Rtb+P3Oub6H1wfRI8L%-ODOEo8-_{aJ=VjBYck1oNeG=(Shi^1$k0-@g&b^`qOF? z1ns$rVTQ!pjh;=Wx=sN!d(T1`%aNfFSL(rcgW%#G{-nu|py{JKv`-PZwPH>Hi^Fre z0qQkwU3TCzOI+!;-ct(wCb9eQIzP4Ng#U0Wdhx9V)-1VJ=rT=Eg>ntFv6(QFcvKzL zK_*?JQD?_*ND=|u+1e=`ud?84h`LXarYHQXZ3$kdBZS^3OfMt z%W``gm{U2rT1Z=+xEQV)ojZ{Hk6`fF=)iN<46m=<8i@!p3hi-g$1Nlv z4y{*+q!K0g?p_u0GmKW|if+OKYS*8s# z82FK6r&(Bi6^x>jO+(kr5zIXrYva<3`WR(xm$sBmM-rv5r?fWqRtyfI+nz&-O86F` zFzG>s71D?)eYoYTsdThKIsNfWvQ0PToegG;D@1??VKVU<6fC7f>xywjPSj#U0lg9} zhbwDqQQ7Yt*w_xcUDkaURf=G(qa=2ZT70 z#zE0kPmik1S^^7xhSV*fkB7;+#8UbQo3h+Vs)TPlLA$dpj3b|}vVrAH0i~^qLXTl^ zpy^8FU?-tx*ByTib4l6~^nqO$N7G0$-Z2eJUdXi%szO~MX&hIO*r|rz3KC*VF{OBw zl3*Qcgaw_UW@7NU`fjIo?(2+J6%Clbk>1s@JKzONVps=?5GE&DXv0T_|s$J;`e^<2UWPEQZ1 z9VlG_kBYeL)*0@NE27uXj+cmlx}u0_GE^W+#sDPA*6b}oUmtzsl6xD+akV139$@l8 zDYp5uk1?!d*9tP^fNj~A)*#3yZ&@l<>OuP3$>6&a@Oh-G7y-r3xNoB%oi!xRF;ux1 zcwVHuRk^tz<9k}`d?^ocfw{52*C20p_|243{p183(OBjFLhI6s3cReFeV_Ta&DpA! zJBp()i6qzdg{ZNE{N{$$hUXC@X|dcg#gZ8D5rU5Z5-DC)ORnd{jYJZzaa<>i1uo#R ziSl)&?f@0#Ge`L4Fmk&Le}vtYlA+l=n+Cm|7c;aLko|aK!A;INx5M#eHVy4r*~f#J zE61!O{0iD?l1ApasYleL0xBXeFh^$(e3Z}mXoA%stTWn&xe+N@GSk(wABOGG#;e~z zBW@C3!M8788P;41t8Ztz_jH4YogM*96!}3_VIVJKzyl+b$yJ)#xI)m!Oq)>e(KdUa zg23q!H#?n%L2AK(vCp|@=r&iPn# z-}VQN_oN^cvfU0VovS7*J)50?*l@b;B7l%)h0)+<)Jkcnj@W#Z7wI(w?)iywlQ@K` zSGkF>pPm8RG$q4_wo4H=7+l6}pej2YQ-g=y0(w~C(9O-3Q(A>~j4?$I{$!fMD`i1T zLGPpidO=}n*R*j4s~-rbKxaj7xL9k}3Z(`12R^zbgC<(&$&|~m!=>pD z8txjrx#?SSM8gYt%9r0+-Exn}WNk%B-HP%-2g)YjE}B2Uo+CEDrSSyu=ZUqXN{B=* z+`62hx9}<~NCi}5WkkTqwSm?Rp`Sv~dMQ!Zk**MP*NIXiH`rYBCRs*=d!3T_S){5) z3ql0h)ra}1Ayyk7kJCIjiHcZS$!ow|XoD2j_F}lUT~HPdf78WNkM26$dDnfRyr5DJ zB)Yu4-5h6o@C;7mLe42Kd2$BOvy$@c0B+5sfCfK3YX~f&Qz1B9vn=Fk)m7!o2 zK@a`B1a`;#ydPjrbwOLEbli05_fHExtkNkF zzn5S$@xapWQQAxl`Vp^|+H?+ktBXwuio_l~&BXNaYx>f{v=CSY%~jvDcMWRN`xH=T zAJTgyL9whg^0>+5SdBNra|O5GY4QUB_$X&qmzLsI zV17rjRG1*848>GCsWBEgs;nmR5j>0sAsXkA71o4Oq&z{W=6KRjXd&t7Gu&gUQ4q}STudLtb@NjxZjs4l3qu1lM4@j^ z9k<0zg*NmqZ7nkCWcM)(9V*H8N>J_H3pp6 z&yFtfnyr^cMQv}LTY1P+aB28y1*LOg=VG(P_^{Myf|z_ZTJ{-TcGR0T0wEFzG`#8 z(q8OCc97p;+P*dsITYp>`hh&TftT5;x_{-?+>tcXYtu`k zQM*rS6m;ie_5`q4cVVC4h8d4fr)RRZ;CZEc!*I8~_NC`Gxg)LHMF zNHDwZG&Gg*%)RR|O2a9Jt85B&0OWTPVT?9OWiJ93+{b3R`qbI|>~V;&Jgytsqip~| z@@)@0Pc=hlx-`jHtgLOkE!JJn&gAf2A4B2{sw>{ZYQM z4)%~3Dq$(DMl_s6WCkLNKa$~{r{IUoajj6d!?D#CZum5bSRKsJQoB=WFPE`DTT+zK zU^7o8jN|jOvXqFl?$XN|XZ}OWkHW z5udu4P0`T-`H?$lUvfRbCp1da6;9BVe9dwRa#;xfz9{W9@)yTGj_nT#2lodiJD zx`%-(@t~8n6&O#QqCpfHxG`xa*^t!MoW7dCU{;5d9=LQ5XFMiZnIkC^_B1UmEhX1% zG^gv>0e9SI+>ZPW?*#4y?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x z?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x z?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gZ`x?gW0p1b(~gyA${Y^mH1V#n8?2f1&@UHvX6X Te{Yff-M+S;-wCG8Uv>T;Th% OpenComputers.log.warn("Failed loading character widths. Font rendering will probably be derpy as all hell.", e) - } - } - ba - } + private val defined_double_wide: BitSet = BitSet() + + // font.hex actually has some codepoints larger than 0x10000 + // but, UnicodeAPI.scala is using java's Integer.ToChar which only supports the utf-16 range + // and thus will truncate any incoming codepoint, forcing it below 0x10000 + // I believe the solution is to use StringBuffer.appendCodePoint + // but that change would deserve a bit of testing first, postponing for a later update + // review http://www.oracle.com/us/technologies/java/supplementary-142654.html + val codepoint_limit: Int = 0x10000 + def wcwidth(charCode: Int): Int = if (defined_double_wide(charCode)) 2 else 1 - def wcwidth(ch: Int) = if (ch < 0 || ch >= widths.length) -1 else widths(ch) + { + val table = Array[Int]( + 16,16,16,18,19,20,21,22,23,24,25,26,27,28,29,30,31,16,16,32,16,16,16,33,34,35, + 36,37,38,39,16,16,40,16,16,16,16,16,16,16,16,16,16,16,41,42,16,16,43,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,44,16,45,46,47,48,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,49,16,16,50,51,16,52,16,16, + 16,16,16,16,16,16,53,16,16,16,16,16,54,55,16,16,16,16,56,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,57,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,58,59,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,3,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,191, + 182,0,0,0,0,0,0,0,31,0,255,7,0,0,0,0,0,248,255,255,0,0,1,0,0,0,0,0,0,0,0,0,0, + 0,192,191,159,61,0,0,0,128,2,0,0,0,255,255,255,7,0,0,0,0,0,0,0,0,0,0,192,255, + 1,0,0,0,0,0,0,248,15,0,0,0,192,251,239,62,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,240,255,255,127,7,0,0,0,0,0,0,20,254,33,254,0,12,0,0,0,2,0,0,0,0,0, + 0,16,30,32,0,0,12,0,0,0,6,0,0,0,0,0,0,16,134,57,2,0,0,0,35,0,6,0,0,0,0,0,0,16, + 190,33,0,0,12,0,0,0,2,0,0,0,0,0,0,144,30,32,64,0,12,0,0,0,4,0,0,0,0,0,0,0,1, + 32,0,0,0,0,0,0,0,0,0,0,0,0,0,192,193,61,96,0,12,0,0,0,0,0,0,0,0,0,0,144,64,48, + 0,0,12,0,0,0,0,0,0,0,0,0,0,0,30,32,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,4,92,0,0,0, + 0,0,0,0,0,0,0,0,242,7,128,127,0,0,0,0,0,0,0,0,0,0,0,0,242,27,0,63,0,0,0,0,0,0, + 0,0,0,3,0,0,160,2,0,0,0,0,0,0,254,127,223,224,255,254,255,255,255,31,64,0,0,0, + 0,0,0,0,0,0,0,0,0,224,253,102,0,0,0,195,1,0,30,0,100,32,0,32,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 28,0,0,0,28,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,176,63,64,254,15,32,0,0,0,0,0,56, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,1,4, + 14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,1,0,0,0,0,0,0,64, + 127,229,31,248,159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,208,23,4,0,0, + 0,0,248,15,0,3,0,0,0,60,11,0,0,0,0,0,0,64,163,3,0,0,0,0,0,0,240,207,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,255,253,33,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,255,255,255,255,127,0,0,240,0,248,0,0,0,124,0,0,0,0,0,0,31, + 252,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0, + 0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,247,63,0,0,0,128,0,0,0,0,0, + 0,0,0,0,0,3,0,68,8,0,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,255, + 255,3,0,0,0,0,0,192,63,0,0,128,255,3,0,0,0,0,0,7,0,0,0,0,0,200,19,0,0,0,0,0,0, + 0,0,0,0,0,0,0,126,102,0,8,16,0,0,0,0,0,0,0,0,0,0,0,0,157,193,2,0,0,0,0,48,64, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,33,0,0,0,0,0,64, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,32,110,240,0,0,0,0,0,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,255,127,0,0,0,0,0,0,0,3,0,0,0,0,0,120,38,0,0, + 0,0,0,0,0,0,7,0,0,0,128,239,31,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,192,127,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,191,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,128,3,248,255,231,15,0,0,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ) + val wtable = Array[Int]( + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,18,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,19,16,16,16,16,16,16,16,16,16,16,20,21,22,23,24,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,25, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,26,16,16,16,16,27,16,16,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,28,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,16,16,16,29,30,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,31,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,32,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0, + 0,248,0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,251,255,255,255, + 255,255,255,255,255,255,255,15,0,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,255,15, + 255,255,255,255,255,255,255,127,254,255,255,255,255,255,255,255,255,255,127, + 254,255,255,255,255,255,255,255,255,255,255,255,255,224,255,255,255,255,63, + 254,255,255,255,255,255,255,255,255,255,255,127,255,255,255,255,255,7,255,255, + 255,255,15,0,255,255,255,255,255,127,255,255,255,255,255,0,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,31,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,255,255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255, + 255,127,248,255,255,255,255,255,15,0,0,255,3,0,0,255,255,255,255,247,255,127, + 15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,255,255,255,255, + 255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,255,255,255,255,255,7,255,1,3,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ) + def c_wcwidth(charCode: Int): Int = { + if (charCode < 0xFF) { + if (((charCode + 1) & 0x7F) >= 0x21) 1 + else if (charCode > 0) -1 + else 0 + } + else if ((charCode & 0xfffeffff) < 0xfffe) { + if (((table(table(charCode >> 8) * 32 + ((charCode & 0xFF) >> 3)) >> (charCode & 7)) & 1) == 1) 0 + else if (((wtable(wtable(charCode >> 8) * 32 + ((charCode & 0xFF) >> 3)) >> (charCode & 7)) & 1) == 1) 2 + else 1 + } + else if ((charCode & 0xfffe) == 0xfffe) -1 + else if ((charCode - 0x20000) < 0x20000) 2 + else if ((charCode == 0xe0001) || ((charCode - 0xe0020) < 0x5f) || ((charCode - 0xe0100) < 0xef)) 0 + else 1 + } + OpenComputers.log.info("Initializing unicode wcwidth.") + for (i <- 0 until codepoint_limit) { + if (c_wcwidth(i) == 2) + defined_double_wide += i + } + try { + OpenComputers.log.info("Initializing font glyph widths.") + val font = FontUtils.getClass.getResourceAsStream("/assets/opencomputers/font.hex") + try { + var line: String = null + val input = new BufferedReader(new InputStreamReader(font, StandardCharsets.UTF_8)) + while ({line = input.readLine; line != null}) { + val info = line.split(":") + val charCode = Integer.parseInt(info(0), 16) + if (charCode >= 0 && charCode < codepoint_limit) { + info(1).trim.length match { + case 64 => defined_double_wide += charCode + case 32 => defined_double_wide -= charCode + case n => OpenComputers.log.warn(s"Invalid glyph size detected in font.hex. Expected 64 or 32, got: $n") + } + } else { + OpenComputers.log.warn(f"Invalid glyph char code detected in font.hex. Expected 0<= charCode <$codepoint_limit%X, got: $charCode%X") + } + } + } finally { + try { + font.close() + } catch { + case ex: Throwable => OpenComputers.log.error(s"Error closing font.hex: $ex") + } + } + } catch { + case ex: Throwable => OpenComputers.log.error(s"Error parsing glyphs to determine widths: $ex") + } + OpenComputers.log.info("glyph width ready.") + } }