From 311973e33e152eac9d1519f53b9cb1f2c3711222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 23 Mar 2015 21:02:08 +0100 Subject: [PATCH] Materials for printing (plastic and ink). --- assets/items.psd | Bin 580270 -> 583622 bytes src/main/resources/application.conf | 4 + .../assets/opencomputers/lang/en_US.lang | 10 ++ .../opencomputers/recipes/default.recipes | 15 ++ .../textures/gui/printer_ink.png | Bin 0 -> 1615 bytes .../textures/gui/printer_plastic.png | Bin 0 -> 1266 bytes .../textures/gui/printer_progress.png | Bin 189 -> 189 bytes .../textures/items/InkCartridge.png | Bin 0 -> 645 bytes .../textures/items/InkCartridgeEmpty.png | Bin 0 -> 636 bytes .../opencomputers/textures/items/Plastic.png | Bin 0 -> 316 bytes src/main/scala/li/cil/oc/Settings.scala | 1 + .../li/cil/oc/client/PacketHandler.scala | 9 ++ .../scala/li/cil/oc/client/Textures.scala | 2 + .../scala/li/cil/oc/client/gui/Printer.scala | 42 ++++-- .../oc/client/gui/widget/ProgressBar.scala | 4 +- .../scala/li/cil/oc/common/PacketType.scala | 1 + src/main/scala/li/cil/oc/common/Slot.scala | 1 + .../scala/li/cil/oc/common/block/Item.scala | 9 ++ .../scala/li/cil/oc/common/block/Print.scala | 10 ++ .../li/cil/oc/common/block/Printer.scala | 4 +- .../container/DynamicComponentSlot.scala | 2 +- .../li/cil/oc/common/container/Printer.scala | 36 ++--- .../container/StaticComponentSlot.scala | 2 +- .../scala/li/cil/oc/common/init/Items.scala | 5 + .../li/cil/oc/common/item/InkCartridge.scala | 5 + .../oc/common/item/InkCartridgeEmpty.scala | 5 + .../scala/li/cil/oc/common/item/Plastic.scala | 3 + .../li/cil/oc/common/tileentity/Printer.scala | 133 +++++++++++------- .../scala/li/cil/oc/server/PacketSender.scala | 9 ++ 29 files changed, 223 insertions(+), 89 deletions(-) create mode 100644 src/main/resources/assets/opencomputers/textures/gui/printer_ink.png create mode 100644 src/main/resources/assets/opencomputers/textures/gui/printer_plastic.png create mode 100644 src/main/resources/assets/opencomputers/textures/items/InkCartridge.png create mode 100644 src/main/resources/assets/opencomputers/textures/items/InkCartridgeEmpty.png create mode 100644 src/main/resources/assets/opencomputers/textures/items/Plastic.png create mode 100644 src/main/scala/li/cil/oc/common/item/InkCartridge.scala create mode 100644 src/main/scala/li/cil/oc/common/item/InkCartridgeEmpty.scala create mode 100644 src/main/scala/li/cil/oc/common/item/Plastic.scala diff --git a/assets/items.psd b/assets/items.psd index 6856b63bd4ca7fff37968744184d5d205d6918be..9eaa421ece300068932778eed3f24445ca692638 100644 GIT binary patch delta 8632 zcmbtZ30PCd+MYx_=O758aB%@y6%Z022}lAFL;`{uAVERdqN0cbE}&H`oA#=0MNrhy z+E#7rZWl|hY3-%fwrW*GZA+`YTC`Pf(R%ITQjwhbzd2zIt@=EFl9SAt^L?|w-@I?; zoqu_qIOkR4ZrA^du;}pr_-z{D3CV#SFZSbM6&I)7-Rfw!ENv0LKDW2|T+tE_F zLM5-eHdrfqYO{LOX6|5+^U2yB3{z+G5ta?;^E(|0)DIydyy{-PecDQ#F|l^euZKkI za1tx>b@KfIEZE#d^A|6OkIA23m9WjSvqM`%R(QZyJxvp)QdhUf)+d2=jj8 zO7mz{Z|NAVcejW-ebP3o#GliScjinrH?28BXxcP$JNzTX!g$-`Mme;@?O>OEy4j+7 zl4!uDyUHxH&A*s(n_I)nKbvm1_5KahJjuhH!~6S4 z=bQ?4n6&BQnK5Uxq#=d(7arWn;{&tS-4Cu0yl@HM;x~Tzvu|-zbVf|;#HGdj!JmcK> zJo}6~GVWgX8~4YYKhnBjVV*P~_p8FMTqdk)zOowo+}>kb+5GaPkI|cUGkm@q{Kdef zsRAQ=gCC-hAiYfAm>*cNu>^l+wB_wdvNcvdEjJcRwC-$?9^J%SGeYl3nl2 z8&**KSRMM!-I;1d^qu^y|Fy<@zm(E3V%>*ukFjup*oEmYSIOk=9Wiz_ULuC84_sD8 zyrl2sEmmc>3uX9MJ7%sqm1WN)aoavcqHP<=AK2Z2Q5x^sGikPi+F%W$sdMRioLYp$ z2&LV{Qb#5l^X^PAKI_7~!Nd$YIBCf>eAI&(Zme}>rihrBfhhU@G2`9g%v%}Z!;ue? zq97Cs?;sQ+{Hjqb8jgmdfrvxH;JGjI7T!LP_C{WC`NCRvG&U}0-goH#C*nyfGLbg; zCAhMR8QT95dJMOZi3ze1cEHRa{B9LvXWfeaguFi>?~^LV$GQzYAiQvU?PbOZSFB^K zFsWi3`|{`>;c?NR1b)QAH+>z`ufG*MBItL)0O5{;ovl%? zJS$fo-G}yw!Imc+EmQdPE*R=}w5G=0THCLh8D?!l522&?q2D8`8Kw1O)Jh&f7LN_p zjE7e%YJ*#NiYieZdJl@H17d>TN6?Xng5kz$CIE`*7`|iG%y6iwW9Y6{Gj1>%Fk+i) zAk`*x*qtWt3$;ddD>%q(1NDoL3x!2i~-^dT>5&0ha@H_2;F?l_+#wJ{WB9I;}Mr%+t zyw{@|c&~>2P=*48l_W<=um>(dS!g+$jmpqUuw91I&{z~^bbO839N=LUK}dZ)|AqL= zb8Gl)@&$LSg^;EXnm+izM6BSK;I~gP!-vB%10#N+&HC)@)MH??Fhi~2gLq<8kaeeQUW zC@;w$yPaX?d9(4#f@RGaCQB~6_N7oL zI805M6gxp1r%5DAX}rNu25y;?HBzOLC^P|^@vi+hu82_86o1^Oftev4I+l>cI32W# zfbTe>1Sg>;jYi5V?TI2qIxlx#(W2r-FYQe8!~-rcj`+m}Mk|#-w_~W=1n`3NC*Y~k z(3+qs4OFH`Ox8}BoT$?!>0Dj$%?2jRZ+I-YBod8Q=ohJP0UvOp9@2UxAtpteKk+24 z2sDO=#yn)I`>?$^({ACGsPWqe{`-djvc0#Bi_q@|+-u`3~! zq>j8tklIB0Bx=TvH4(9zKzXdPMW|J2qUDWjb0j6E!t9t+E(kx>ugj(>ZL zkdoO6k$fl^%uY#2z$GJC1;&kxj{_lgB@t0kp^*s*DJi<7sR{UKBa`ZALl!L}WOme; zefvKDoIh{%`P9jgc-T2cI{@12XEQn^JUCJv9yea0z;n+rS*|V(&CNG%eD_`BzZWfn zNRyBlG9h8CdVGvCs+g|8-=1TVog5o(G}A{j$7H2VO3)>_pelGIInU%dIeymk*=K}A zP9Bq*Ha;N{xXAW73jFGMCg1rV-#0bY(Y8d+ie6E+V$JFoSHJq++);EEbD;4g($+8| zJ9oArCuc^Emls}qfhn}%i7B#8K}HcTgs)#<671Rt8O%Bl88VoDcpUf@qp@jgHxhdh zyw;EP#8nk+f9qDlOWQ^gH{Q7GD`vch0RQY>@L!C=o&o;8_n1n6e{m=LSMlk81^nZ$ST4vDkQ7~c4@(c!i#+_BQ!(X4CzGp>A39qN{e`%6lAEh%G^77`+ zDK=ongN-+XUaw!bqOcI+jov!8g)Gx2Z`g49G=Tne@d6!A@?Zh-&({P`DFmabe`xl$^{zj?8M_pRhLa+K^kvX_t=n8_CK0VnF=TQ38& z>e^yRD3KzZ>CL9O3V4^9e36Xz70CdfB#@N^2M5v*j}LpZ5;Nds1Rg^}1;7hMh^3u? zF9yKx$5mAT_@x5iWi3LrG6C=rZQ#t~N8apT0^S{`jbL5dQD0G@i{(|Yhzc@vI*R&q z3iyiXxHwg;PM499K6R#!0zM4ejbz>0QC|?J@%5ET`A{qA%2{6}~f)?S#IrAYo=^lvHfYdDao(!%Y6L zoV@Fa&628$A%UXI#)|wcD5E=kppG z7ZwC76hZQch`6|MW5-8OTF@RBG@6x53zhFT2cl<0X)OPXiZR67*rBgv4jSNmmuQoC!6+cA>;)b6u<|Z zsE1d*1ZGiKLzD!>EN4^9BtT;FLK5CfB%zzO6LGe3a&~rd=JADpLQCFW&N`U`gM@$y zv{(oXLNVQ#Kpq5!SJzaOLtrQr0)wPQs9GWfh7oOUlnGp1ZVn9H*BAyS;EqQ>-x(PG zf(}$Y&;AV^2*Y=t?~D$>2|A(!G!`PuN zF2m@jeJ+$0Z17Xr!L|zaPfxt@O|~W657cEM{44eXS_=wcBj|%F&;hfMKk^V1LLi!e z=7L6;3jb5hKqY7?sE5T!i0>z$VHN8DPb=y;s2wU zKitng4%Yrj#A~v%TS*^ELEFsI27p)z+LjOF{UILH*cLS@2AFmNCEnv65q_Z<x(x10e`&ud+I)$MBGf8JM|lI%elpc7y_iHu%v;oj$_s_Yg2h z{RqrJUAL>2%U9WOI|ypsmJA+zjSY9?NnaYGLPKFmP{krFiLw!_1po6I>+QhzQZ4(h zu_+F1gt3q;!c-6XkqsFDe^_+aEdqQ=P!bXF?&C>O>gj=9v2BI@=yfVW^VJ zrN9AVPNLzG0dP7%%z#KHa%L z!7qk$0(>m^{x9L203QpkKPG|`;A6q__eO96d@L9~47~s!3vyqm=H^o5bW-+9YED2- zcV6FtoKB+-#JbI>NjvvbXyYWHOx^rX3cNld?>EK z8A$+F9gZEi>SEKV5O5^{T(wi^@LDc>AZ$w(ivvfDU|le-<%T_Bf4W|42AIXaYOp_r z;jtSzm-bDnJBJpg9yTd=ykR5f)O)AeyU`3a3kGeo$qY3M_MExN3^fbpd~%Z+Y8IS1 zaI+a|7IYZ~-Vwu2H5y;s%(?a0u7qK?#hjGxS>4%lIOd+VX9bFkr?zmVGDVN$6*x$! zgcF~~a1dc4^>7i?S2(kP6NT3lf$M&#GV(0f^H8PoZw^(aorM;4 z9jdH8%XL3g*?pGlJPx5r^Qp>BnlzuPFpZtLBOAGnQ^V+PLX-V#Uzh72asJtdkR_FJ8K7A``mp^`e`h3pmInQ~{bKdXgJm=|Rk>in* zj$7@#QC09U zt$^9Ht6FDgzNV41UNB|-0>#d4?C;cTlnZ9bL3K?E`Ah3s*3VKmddutYYEs;_sd=%Y z;cqOK-K238>;~`|m8#s=K`xdJ75sCVyZ&&EMB|_N3sTG5!<%kRUMQV9{4V>Pf+( zfw4MqmKbh4^t(%YJf4P*_+ohNS@&ZRo~fm4i;C;Bsx@)>wMVbUCTeOjq6}8nY;p|h z*>Rb<`^4zwjditIzRZ8I7&tfdOlf#v726u-fAYk_)5nt*KU^H{m^NRN!I44jdzIy* zt{b|!ESy!iAk_QB8Fsz9!{HrI=VpXY9Ts<}lB0bbsRFvMI2n59%#TjnoP+(Hwr$_$ z@3hZpo4+&k$4i1;YNI7$ln~d)U3K`L&*i$at`Q%dvWomzlXGKLm33p%A67A@eLDeQ5np?h`VMNP>0pHo)FCOs_%d#IR&EJL zhIuh_5AE~Fo?luzvvSqa+*5T^JC&b$PhAobu=;$8Cg=Mpl@YVU4t-O|QO1k&PZrLz zSQh=!98F-#>AZ-OB~PB;nQ|`Sc?nz5)h4uh?>7IQ&8W12DNemVQnbM)ZX*V{+BF~5 zjm67Fcopy(sEe0(2uU@t_V_i4^)bO8HuX|X@FcvQA|d&%y2=D68(WN#f+)-q3GlT+ zB0`~QEY=EpvthP)AS2c|2M?@E{Gr^9*_&fKb&)lmDqy<@z8^$}sh!`(duMu>BWv^y z>W%ut+9)X%r!HkojdCFXqu!B$~HC@<}By0k9Vqs)tH8@wxlfX_f0QCZFaV{Vkvr6=m zSG_jOVfYoQ2NaNgi89G{CF{5a+jcIO{eH&p!>rq2q)hF-1%GbjVFk<#LLq1oS_aQY zC&L1Tkqt~BbaWA=B!e*9$|Xlm>w zO@e_5U>?>YKjT@QjK+X0i2DUf=Cv&GXB-Sp+24XmW>>I@!JM{~mj1`y5G|;yx#*47xLg|GIH7vat zFQFZ7mzL&BrsREHTTh(XjH|d8nA&y~M?zy%g2zK}$UFF?1iL}d*t-x17QKO(2v60I zOYk^*nbcA3NSzK;|0}8L$XcufK9_5mnFEpdoajJC0H3)IMB=lvBUzw88?-FVkpPv+ zJcI8)&GYzS&XcvQw-W&>4|1;3F|`xXQ>o${M4D^g9?3tIow`TI#`PpXWdi2~d6)Td z&JV~FZi3X*IG*zyu*Xk;<#=sMKVr!~eTR(iWR%8t@&dl^%zn3gXGik@4Qys_8By;P0pkf&BXKRKfY12vjZ7 zvcT0cRhw7KRF$oksamrZHUdY_oJFKlBev#KGDLw^0wkYGIB(zyoP7ZxXL1g7E{Kts zOXGZvj@8CAGpFPnL_eI*%gElhbyJFtZHSeaivvQ_Px35zRH8 z>fU|x{M}YIv*ykM){^G)2RjY~xbLrR&)W2Lt*jNSYh~@-^{=xgZv;-=B(O5%GnqTt z+Y6tOp+F$s&`e;Q(D65A1xe_Ec`!L`@v)6l^fib zryt1SSp9%VH-R>dTC~{CS@n5A7loGX$d6khFLN}ICM!Lgg zeXUH2x;In*mS+%0(dA@17<^Vv7DBW235eEJK-_59^$OBc4lQN-{663j@c=&W`%*iW z`iNLVKVlah%<3Kyd*~;Prta*6--r#|%;2#l%lVBAfy=t$H!=rAGb+hsILBuz$s$l5 z`WTk3X0kUI9>dA2lDx5Gu1`oPD1%Era0%<4z>4Lpcn@_D%G7`Ep#uc=@*1{dM>Y~e z^`R;WS?BR%Pej`z99HJbHY$&NY@7gp#=En#SK5Vd5TM$t*29XpBwif^P~ zLoeErg44X{44ZB*IDhft_ur*UwOuB5@uq)~iO+e{2(a%K0Bg`Hdfy@N^hMB|J07Pzg`V zu{0cnvJWX^sRX6$gV8wJza5@mjiVbUIced7RzeBb=-$}3kvBM<<3=B=)~tq`iSxC5 zm2}rDS>kHa%Z%UB!R^q%YA)Ko_C8vP0p%r(WatYiP{$B18>uQ9jc{mv6w_C#;RH3ZEEY>T$n5Wt}xeE z)Jj&92>&QluzHvU*!8$W9Xd9b+e$V&NjACU4h+KCze9UCw+uq5-mVr0tMyQrH$W+` ZWY3bY1@KS@ljXWxiC(YE2i&F1=zq}Y diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index f68159751..f3a84f3ba 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -509,6 +509,10 @@ opencomputers { # controls the speed at which items are disassembled, basically. disassemblerTickAmount: 25 + # The amount of energy the printer can apply per tick. This controls + # the speed at which prints are completed, basically. + printerTickAmount: 10 + # If you don't want OpenComputers to accept power from one or more of the # supported power mods, for example because it doesn't suit the vision # of your mod pack, you can disable support for them here. To stop diff --git a/src/main/resources/assets/opencomputers/lang/en_US.lang b/src/main/resources/assets/opencomputers/lang/en_US.lang index 5de7bef65..629e1551e 100644 --- a/src/main/resources/assets/opencomputers/lang/en_US.lang +++ b/src/main/resources/assets/opencomputers/lang/en_US.lang @@ -23,6 +23,8 @@ tile.oc.microcontroller.name=Microcontroller tile.oc.motionSensor.name=Motion Sensor tile.oc.powerConverter.name=Power Converter tile.oc.powerDistributor.name=Power Distributor +tile.oc.print.name=3D Print +tile.oc.printer.name=3D Printer tile.oc.raid.name=Raid tile.oc.redstone.name=Redstone I/O tile.oc.robot.name=Robot @@ -66,6 +68,8 @@ item.oc.GraphicsCard2.name=Graphics Card (Tier 3) item.oc.HardDiskDrive0.name=Hard Disk Drive (Tier 1) item.oc.HardDiskDrive1.name=Hard Disk Drive (Tier 2) item.oc.HardDiskDrive2.name=Hard Disk Drive (Tier 3) +item.oc.InkCartridge.name=Ink Cartidge +item.oc.InkCartridgeEmpty.name=Ink Cartidge (Empty) item.oc.InternetCard.name=Internet Card item.oc.Interweb.name=Interweb item.oc.IronNugget.name=Iron Nugget @@ -84,6 +88,7 @@ item.oc.MicrocontrollerCase1.name=Microcontroller Case (Tier 2) item.oc.MicrocontrollerCase3.name=Microcontroller Case (Creative) item.oc.NetworkCard.name=Network Card item.oc.NumPad.name=Numeric Keypad +item.oc.Plastic.name=Plastic item.oc.Present.name=A little something... item.oc.PrintedCircuitBoard.name=Printed Circuit Board (PCB) item.oc.RawCircuitBoard.name=Raw Circuit Board @@ -197,6 +202,7 @@ oc:container.Charger=Charger oc:container.Case=Computer oc:container.Disassembler=Disassembler oc:container.DiskDrive=Disk Drive +oc:container.Printer=Printer oc:container.Raid=Raid oc:container.Server=Server oc:container.ServerRack=Server Rack @@ -237,6 +243,8 @@ oc:tooltip.DroneCase=This casing is used to build Drones in the assembler. It ha oc:tooltip.EEPROM=Small, programmable storage that contains the BIOS computers use to boot. oc:tooltip.Geolyzer=Allows scanning the surrounding area's blocks' hardness. This information can be useful for generating holograms of the area or for detecting ores. oc:tooltip.GraphicsCard=Used to change what's displayed on screens.[nl] Maximum resolution: §f%sx%s§7[nl] Maximum color depth: §f%s§7[nl] Operations/tick: §f%s§7 +oc:tooltip.InkCartridge=Used to refill ink in 3D printers. For mysterious reasons it does not have to remain in the printer. +oc:tooltip.InkCartridgeEmpty=This ink cartridge has been sucked dry. Refill it using dyes. Or throw it away. See if I care. oc:tooltip.InternetCard=This card allows making HTTP requests and using real TCP sockets. oc:tooltip.Interweb=Congratulations, you win one (1) interweb. You can connect to it using an Internet Card. Beware: don't feed the trolls. oc:tooltip.IronNugget=A nugget made of iron, that's why it's called an Iron Nugget, duh... @@ -253,6 +261,7 @@ oc:tooltip.Microcontroller=Microcontrollers are computers boiled down to the ess oc:tooltip.MicrocontrollerCase=Base component for building microcontrollers. Place it into an assembler to add further components and assemble a microcontroller. oc:tooltip.MotionSensor=Can detect movement of nearby living beings. Requires clear line-of-sight. oc:tooltip.NetworkCard=Allows distant computers connected by other blocks (such as cable) to communicate by sending messages to each other. +oc:tooltip.Plastic=Raw material for 3D prints. Do not swallow. Not that you could even if you wanted to. oc:tooltip.PowerAcceptor=Energy conversion speed: §f%s/t§7 oc:tooltip.PowerConverter.BuildCraft=§fBuildCraft MJ§7: §a%s:%s§7 oc:tooltip.PowerConverter.Factorization=§fFactorization Charge§7: §a%s:%s§7 @@ -262,6 +271,7 @@ oc:tooltip.PowerConverter.ThermalExpansion=§fThermal Expansion RF§7: §a%s:%s oc:tooltip.PowerConverter.ResonantEngine=§fResonant Engine Coulombs§7: §a%s:%s§7 oc:tooltip.PowerConverter=Converts power from other mods to the internal energy type. Conversion rates: oc:tooltip.PowerDistributor=Distributes energy among different networks. This is useful for sharing power fed into your system from one converter among different sub-networks that should remain separate. +oc:tooltip.Printer=Allows printing blocks of user-defined shapes using plastic and ink cartridges. Must be configured using a computer. Keep away from small children. Because reasons. oc:tooltip.PrintedCircuitBoard=The basic building block for expansion cards and memory and such. oc:tooltip.Present=... for your troubles. Open this present for a chance to receive some §kphat lewt§7![nl]§8Craft OpenComputers items when the time is right for a chance to receive a present.§7 oc:tooltip.Raid=Allows combining three hard drives into one larger file system that can be used by all connected computers. diff --git a/src/main/resources/assets/opencomputers/recipes/default.recipes b/src/main/resources/assets/opencomputers/recipes/default.recipes index 6cb743bcd..b85a2a94b 100644 --- a/src/main/resources/assets/opencomputers/recipes/default.recipes +++ b/src/main/resources/assets/opencomputers/recipes/default.recipes @@ -318,6 +318,21 @@ disk { [nuggetIron, "", nuggetIron] ["", nuggetIron, ""]] } +plastic { + input: [[gravel, gravel, gravel], + [gravel, {item=coal, subID=1}, gravel], + [gravel, water_bucket, gravel]] + output: 8 +} +inkCartridgeEmpty { + input: [[nuggetIron, dispenser, nuggetIron], + ["oc:materialTransistor", bucket, "oc:materialTransistor"], + [nuggetIron, "oc:materialCircuitBoardPrinted", nuggetIron]] +} +inkCartridge { + type: shapeless + input: [dyeCyan, dyeMagenta, dyeYellow, dyeBlack, "oc:inkCartridgeEmpty"] +} buttonGroup { input: [[button, button, button] diff --git a/src/main/resources/assets/opencomputers/textures/gui/printer_ink.png b/src/main/resources/assets/opencomputers/textures/gui/printer_ink.png new file mode 100644 index 0000000000000000000000000000000000000000..b125722a708216366bd10a19b8ce211061ad0905 GIT binary patch literal 1615 zcmV-V2C(^wP)B#|g%)0pr0}GS`8kmv;s;T)D1p0_y$%tStw7)B5TGdfEcJ0=3rx zw++Z@@&f_>uLJya0rCO9)C>#)QMvR5!rTU{2qU5Z&y&sg1LFDv{>udD3&{f9{sG&o z2Jrl70Ga#400PpX0lZ!60s?LUpa8N;Zr&9P_Wu0a0qXw>7OxcR0=4~;006pY{5=K& z%!Cd1>i{&P-v1N@;r}DNA}Yct6uB(_;ROCH0}Zk!Rnr+q(IMG~ z3=;hR7YUdE;>5!L5&*sN)&B|vA)Fili|qut^a~3(0h9b%0072*1H$&?3AF$J3gQI? zCIpo9`~p139`$Vi1MT4etvUDp1pwym{3ZYerRx5&1PaXm{P+L_)|!R@o(8!^0GZ#R z@eKJ@0RJ-z0iosqwqmyR1^M*=4zBY9!*K2O006XA0zIw&{|5g;0|35j@wou>PymYS z6ZWM6g5nBZ3#9*u4Y~69013ZU_yNQ+0F9mP2;l|7ao`u_6TknN2IvH{_6-34^#=d(1NGDZNC1ui zV86-;2pYaJ1Ghr}+PeqYoCv%~&j7Cx9;5)kc>m=HKg%IS44~E#5&vimF%Y1D-vxSP{QtQN{|5z+@E8EejqS?-5-qIskpTa`5b&P> z2gr2)@(8Nx00X#B4Z1~@^c??r2>%Y#_6x`d&xrpD&hQAn|IrFS%OUxw0036C5aOo) z&j|Vb2L|A;@-zVWI{*OK`d!;057GYs=iK!W5DD+l|C$I8zd-=$-v3e&0IuQ+sqX-? zJ_xuu=n)YI?9B<&LA$59>{og!-v@E>@&>Q-)Z+fQa;kiY0s}}p z6N__oxb(xz+H2-TC!4eu^N1SmjJJ36Nb1%tTm4gq&06!j-P1z$Ma;}WTtMxy(}3Fh zXY^e#Q(#!%uE(@jFZEWwbVvHdH6m5zD!+@THyXO~**m^iVW4~T+;W{|_fiCJXA}xE z$k_x1t@7m!p0-e*`=j_&nK@A)+nJc=7IfzSFmF(G5&_!&n}cVQVecge7mw#BDlDv& zbe1LZ3)*GmvI~E*d4G_L(>HeALM?7FwLY_uD2Bx`dQ5tf&YeKp8&nS*oA{2k)jzKu zXuE^Ui=_s-HLLgEU`y28tsa@nzDUmIy&@;CFWB)PSDrWfH;X~`rQTjimQ>5|Er<48 zGoCl`x{5Lf(CnFY(AZp$OUJL-=$m=~Fz9-0 zAR!;-*^>QnhP(_g;vm{ntHV!s9I0IZ3_4)EzXjS3bi7B>6p1pcs~T+0nu2zbrR)r! zDuWb3wohvUIo?cW4lv^MB=>r=e7+ejZJu7cW_wk#imiX%rkSp86P5^_G|(-xS`PBN z;Ozily!U+KQsm|J-S`C*bmC{uhRg!_U2^Z-0?T~q*;3k0A`{=4*cMM0HT=Uj!9^%% zif+-ltQ)VoQUtf&O=D;1VScZ;iq|*zYm?RvF>zq3n*?-xC=-)pL3O^g`DN7wZ!*hS zm5+Pv1KIBQVrh4U#p>4rY}Q7aK-+~E$yIVGazTPFyMHAx*-QcmFaUOr8A~G3qHq8J N002ovPDHLkV1iqL2)zIR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/opencomputers/textures/gui/printer_plastic.png b/src/main/resources/assets/opencomputers/textures/gui/printer_plastic.png new file mode 100644 index 0000000000000000000000000000000000000000..3f67324d2e16922104e70b410e9a4066bc9723a8 GIT binary patch literal 1266 zcmViSJ-q_UJ)6dq<%HP-1(#yx%)X?PJ+1%97-qzCJ+12Ud-sj=n z*wD<^&&%D{)7;k5*3Zl7f+wj z&B@Qm#O&qa*3it^(ahl3)YZ+%(#pou%g62K*eC#+1BOX+~wWb(8$Bg#K7X(*6rux>Ez+r z)6ePQ-0$e*&Bej!;@{iS&Dqn?=HcGb%*o5czVhnk&Bns*=;h(t*v`hn=;Pqv+t}C9 z>RZ%*Dac%g5Hv$?oUl)z8c0+STvs=i}Sf<>1}X$;92))a>Ts@apE+($CAp!0qPZ z+SSs}#=+Fg$M5Ik%fr9vCVW+*3ixN@a*N?*x%aM+SJi3 z-ScMv00N>(L_t(|+62LaqFq-M0Km0%Y~$KCo^8iA>n24|8?maCf7%%!EU)Hf!X-oK zCw8bvf>Ts?K>xJ>b&Pf`K4OZE4Mw$$6{((6L6I@|S0T!E^#y)%2e2{KmgEEify-rz zxYcDSH7c{W)m^~TfkWBHlf0T=-mqp**rL*DbSX-LrE}+g0JOtAy7z=hCFg)~?!{ZVt z0yXmi$#%6%ickEnd6qy<$^$oB$GzT}KdC@x#E9F&+T7EI=!CrwL1@Bbnw9TKMpfkO zY@ByaB({rveTws}bxv_5+*&zVN-H*+Gto8wQUwcD7?GbBTjCF+FVw#cNc>XNxoo^W z$@PCC#ep3kDHpi?e8h=qu7f=&&}E63TimCOjNd*<>=f zPsPTP%&o-$E9)B{N#!!39PWJ<;wbk-+=zA zh~4hc;jU_?r=@SxH`9@aNS5XJQTlE=pDV{n{y&w|=7mQ@AsK(udmpL!VNH_Y5D!zh z85T;y=A54T{=3LNdqf7#dt;oLac4ua!Uo45&cgp_k1QRautIE)+lw?%MGmnaC*P4ZP{b;iZ zLW^~{bP0l+XkKOdt-r delta 40 vcmdnXxR-H48K=opo{WZFr!F3uSg$1_=*>R;`CJzc1|aZs^>bP0l+XkKNU9FJ diff --git a/src/main/resources/assets/opencomputers/textures/items/InkCartridge.png b/src/main/resources/assets/opencomputers/textures/items/InkCartridge.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b92d00b00f8d421ef0c158818df9ca1960c33f GIT binary patch literal 645 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8{{cQBt|mdo+AdnQ2{v4Y;tEFcN@hy3da|7QqF1k$m93Kw zETeaCPiS+I`WLzWYE&J4|bp*ImbShodJA zraK(n?DMjCO;N?h@^>E$U9y}5>jRuJ9GAM@(2duA{>rRj@v(@`@P%i8SzB8hXBqm{ z`0AzV1lI+HwTGrJNqhRjWX8eQ|NsBD`qSAC^gw7ykY6y6OLf4oVIli@par`okL*zhmWRfb<37txFe_`c5bWr;q?1Fq3`-$#I9{O4d%|;UbnzOp|-R$yfpAk zmkDq51$L$d8n-O(rp@5-Gzxg9|DV$}(8fXGf!e-GZUcq@Q60bbZ+Rbp-eB-_^>bP0 Hl+XkKdde~m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/opencomputers/textures/items/InkCartridgeEmpty.png b/src/main/resources/assets/opencomputers/textures/items/InkCartridgeEmpty.png new file mode 100644 index 0000000000000000000000000000000000000000..007697d69a7571dd7956a253f31a27ce7f0bcbd6 GIT binary patch literal 636 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8p8-B0uJ&&BCRQe1L0)QFYFc_)l1egHua+pQD+A>v6r{Io zNlD31IjpB=W@VO^n|8s>%)#9uBql`9ST8X3AV=09aB3xr*+O>HQznNT}DR6$=}H%)WgQfCN4SC%P!E{Kg7|@ z-NVBqJSNf0FWB1E+Sb!HDL2VK!r#{+#KYRJuBR?OGv3A3sG+YRqc|fd$jZ>#Ff~6_ zTwW@zAkEIzE-5F;%Qhe&GN5->uYZ80xr4d2yLEbD`i31F<}9BR6djaRn&snTYVU0y z5NMU0n=CFa{{R2~6KYW}fSwF43GxdDa;Xd$(mLxRfyVFhba4!+xRug>Rj4UIppD=C zkwWjHMNDPo<>jY;+xO_jt-Sx{=sENMISSv|pX^#Q|7-Q%-Hd`$4JWAxY-%&?XjsYv=C^*_$d%Vc@_U*bCsC+`OqH=6DRF!&bVd#QK+ uyhL03uRovWUnsrH-g0>U5p#V;HilI^+ETjJSDyfV!QkoY=d#Wzp$Py><{4lB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/opencomputers/textures/items/Plastic.png b/src/main/resources/assets/opencomputers/textures/items/Plastic.png new file mode 100644 index 0000000000000000000000000000000000000000..914588f6b48eb3be3830a4a60542384f5862057d GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!fo%K)DcS4$&ZJq_jJyo7`pzwlsJPd6J^CySK$fV!%j_-Mb- zK-btvpTgXv#2CMcea&r6WgTs`E0@pz|NsBq{(JdALxf9${DOg8G{CT__6`S7y2{hV zF{I*F%=yK%i(##NymOIXTXVmmhPKCL- onHologramPositionOffsetY(p) case PacketType.PetVisibility => onPetVisibility(p) case PacketType.PowerState => onPowerState(p) + case PacketType.PrinterState => onPrinterState(p) case PacketType.RaidStateChange => onRaidStateChange(p) case PacketType.RedstoneState => onRedstoneState(p) case PacketType.RobotAnimateSwing => onRobotAnimateSwing(p) @@ -242,6 +243,14 @@ object PacketHandler extends CommonPacketHandler { case _ => // Invalid packet. } + def onPrinterState(p: PacketParser) = + p.readTileEntity[Printer]() match { + case Some(t) => + if (p.readBoolean()) t.requiredEnergy = 9001 + else t.requiredEnergy = 0 + case _ => // Invalid packet. + } + def onRaidStateChange(p: PacketParser) = p.readTileEntity[Raid]() match { case Some(t) => diff --git a/src/main/scala/li/cil/oc/client/Textures.scala b/src/main/scala/li/cil/oc/client/Textures.scala index 4d02efe8f..19e3ce67d 100644 --- a/src/main/scala/li/cil/oc/client/Textures.scala +++ b/src/main/scala/li/cil/oc/client/Textures.scala @@ -26,6 +26,8 @@ object Textures { val guiDrone = new ResourceLocation(Settings.resourceDomain, "textures/gui/drone.png") val guiKeyboardMissing = new ResourceLocation(Settings.resourceDomain, "textures/gui/keyboard_missing.png") val guiPrinter = new ResourceLocation(Settings.resourceDomain, "textures/gui/printer.png") + val guiPrinterInk = new ResourceLocation(Settings.resourceDomain, "textures/gui/printer_ink.png") + val guiPrinterPlastic = new ResourceLocation(Settings.resourceDomain, "textures/gui/printer_plastic.png") val guiPrinterProgress = new ResourceLocation(Settings.resourceDomain, "textures/gui/printer_progress.png") val guiRaid = new ResourceLocation(Settings.resourceDomain, "textures/gui/raid.png") val guiRange = new ResourceLocation(Settings.resourceDomain, "textures/gui/range.png") diff --git a/src/main/scala/li/cil/oc/client/gui/Printer.scala b/src/main/scala/li/cil/oc/client/gui/Printer.scala index 3ad735a26..d5217af59 100644 --- a/src/main/scala/li/cil/oc/client/gui/Printer.scala +++ b/src/main/scala/li/cil/oc/client/gui/Printer.scala @@ -3,19 +3,31 @@ package li.cil.oc.client.gui import li.cil.oc.Localization import li.cil.oc.client.Textures import li.cil.oc.client.gui.widget.ProgressBar -import li.cil.oc.client.{PacketSender => ClientPacketSender} import li.cil.oc.common.container import li.cil.oc.common.container.ComponentSlot import li.cil.oc.common.tileentity import net.minecraft.entity.player.InventoryPlayer -import net.minecraft.util.ResourceLocation import org.lwjgl.opengl.GL11 class Printer(playerInventory: InventoryPlayer, val printer: tileentity.Printer) extends DynamicGuiContainer(new container.Printer(playerInventory, printer)) { xSize = 176 ySize = 166 - private val progress = addWidget(new ProgressBar(104, 21) { + private val plasticBar = addWidget(new ProgressBar(40, 21) { + override def width = 62 + + override def height = 12 + + override def barTexture = Textures.guiPrinterPlastic + }) + private val inkBar = addWidget(new ProgressBar(40, 53) { + override def width = 62 + + override def height = 12 + + override def barTexture = Textures.guiPrinterInk + }) + private val progressBar = addWidget(new ProgressBar(105, 20) { override def width = 46 override def height = 46 @@ -23,7 +35,7 @@ class Printer(playerInventory: InventoryPlayer, val printer: tileentity.Printer) override def barTexture = Textures.guiPrinterProgress }) - private def assemblerContainer = inventorySlots.asInstanceOf[container.Printer] + private def printerContainer = inventorySlots.asInstanceOf[container.Printer] override def initGui() { super.initGui() @@ -35,27 +47,27 @@ class Printer(playerInventory: InventoryPlayer, val printer: tileentity.Printer) Localization.localizeImmediately(printer.getInventoryName), 8, 6, 0x404040) GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS) // Me lazy... prevents NEI render glitch. - if (assemblerContainer.isAssembling && func_146978_c(progress.x, progress.y, progress.width, progress.height, mouseX, mouseY)) { + if (func_146978_c(plasticBar.x, plasticBar.y, plasticBar.width, plasticBar.height, mouseX, mouseY)) { val tooltip = new java.util.ArrayList[String] - val timeRemaining = formatTime(assemblerContainer.assemblyRemainingTime) - tooltip.add(Localization.Assembler.Progress(assemblerContainer.assemblyProgress, timeRemaining)) + tooltip.add(printerContainer.amountPlastic + "/" + printer.maxAmountPlastic) + copiedDrawHoveringText(tooltip, mouseX - guiLeft, mouseY - guiTop, fontRendererObj) + } + if (func_146978_c(inkBar.x, inkBar.y, inkBar.width, inkBar.height, mouseX, mouseY)) { + val tooltip = new java.util.ArrayList[String] + tooltip.add(printerContainer.amountInk + "/" + printer.maxAmountInk) copiedDrawHoveringText(tooltip, mouseX - guiLeft, mouseY - guiTop, fontRendererObj) } GL11.glPopAttrib() } - private def formatTime(seconds: Int) = { - // Assembly times should not / rarely exceed one hour, so this is good enough. - if (seconds < 60) f"0:$seconds%02d" - else f"${seconds / 60}:${seconds % 60}%02d" - } - override def drawGuiContainerBackgroundLayer(dt: Float, mouseX: Int, mouseY: Int) { GL11.glColor3f(1, 1, 1) // Required under Linux. mc.renderEngine.bindTexture(Textures.guiPrinter) drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize) - if (assemblerContainer.isAssembling) progress.level = assemblerContainer.assemblyProgress / 100.0 - else progress.level = 0 + plasticBar.level = printerContainer.amountPlastic / printer.maxAmountPlastic.toDouble + inkBar.level = printerContainer.amountInk / printer.maxAmountInk.toDouble + if (printerContainer.isPrinting) progressBar.level = (System.currentTimeMillis() % 3000) / 3000.0 + else progressBar.level = 0 drawWidgets() drawInventorySlots() } diff --git a/src/main/scala/li/cil/oc/client/gui/widget/ProgressBar.scala b/src/main/scala/li/cil/oc/client/gui/widget/ProgressBar.scala index 22541fbe5..4a049d221 100644 --- a/src/main/scala/li/cil/oc/client/gui/widget/ProgressBar.scala +++ b/src/main/scala/li/cil/oc/client/gui/widget/ProgressBar.scala @@ -16,8 +16,8 @@ class ProgressBar(val x: Int, val y: Int) extends Widget { def draw() { if (level > 0) { val u0 = 0 - val u1 = width / 256.0 * level - val v0 = 1 - height / 256.0 + val u1 = level + val v0 = 0 val v1 = 1 val tx = owner.windowX + x val ty = owner.windowY + y diff --git a/src/main/scala/li/cil/oc/common/PacketType.scala b/src/main/scala/li/cil/oc/common/PacketType.scala index 6a0a0f201..f2f16c868 100644 --- a/src/main/scala/li/cil/oc/common/PacketType.scala +++ b/src/main/scala/li/cil/oc/common/PacketType.scala @@ -20,6 +20,7 @@ object PacketType extends Enumeration { HologramTranslation, PetVisibility, // Goes both ways. PowerState, + PrinterState, RaidStateChange, RedstoneState, RobotAnimateSwing, diff --git a/src/main/scala/li/cil/oc/common/Slot.scala b/src/main/scala/li/cil/oc/common/Slot.scala index 4cbb05bd6..fed8e914b 100644 --- a/src/main/scala/li/cil/oc/common/Slot.scala +++ b/src/main/scala/li/cil/oc/common/Slot.scala @@ -5,6 +5,7 @@ import li.cil.oc.api.driver object Slot { val None = driver.item.Slot.None val Any = driver.item.Slot.Any + val Filtered = "filtered" val Card = driver.item.Slot.Card val ComponentBus = driver.item.Slot.ComponentBus diff --git a/src/main/scala/li/cil/oc/common/block/Item.scala b/src/main/scala/li/cil/oc/common/block/Item.scala index 022012ada..42a121d6b 100644 --- a/src/main/scala/li/cil/oc/common/block/Item.scala +++ b/src/main/scala/li/cil/oc/common/block/Item.scala @@ -5,6 +5,7 @@ import java.util import li.cil.oc.Settings import li.cil.oc.api import li.cil.oc.client.KeyBindings +import li.cil.oc.common.item.data.PrintData import li.cil.oc.common.item.data.RobotData import li.cil.oc.common.tileentity import li.cil.oc.util.ItemCosts @@ -47,6 +48,14 @@ class Item(value: Block) extends ItemBlock(value) { override def getMetadata(itemDamage: Int) = itemDamage + override def getItemStackDisplayName(stack: ItemStack): String = { + if (api.Items.get(stack) == api.Items.get("print")) { + val data = new PrintData(stack) + data.label.getOrElse(super.getItemStackDisplayName(stack)) + } + else super.getItemStackDisplayName(stack) + } + override def getUnlocalizedName = block match { case simple: SimpleBlock => simple.getUnlocalizedName case _ => Settings.namespace + "tile" diff --git a/src/main/scala/li/cil/oc/common/block/Print.scala b/src/main/scala/li/cil/oc/common/block/Print.scala index f28a8540f..5fe0b37bc 100644 --- a/src/main/scala/li/cil/oc/common/block/Print.scala +++ b/src/main/scala/li/cil/oc/common/block/Print.scala @@ -1,6 +1,9 @@ package li.cil.oc.common.block +import java.util + import li.cil.oc.Settings +import li.cil.oc.common.item.data.PrintData import li.cil.oc.common.tileentity import li.cil.oc.util.ExtendedAABB import net.minecraft.entity.EntityLivingBase @@ -11,6 +14,7 @@ import net.minecraft.world.IBlockAccess import net.minecraft.world.World import net.minecraftforge.common.util.ForgeDirection +import scala.collection.convert.WrapAsJava._ import scala.reflect.ClassTag class Print(protected implicit val tileTag: ClassTag[tileentity.Print]) extends SimpleBlock with traits.SpecialBlock with traits.CustomDrops[tileentity.Print] { @@ -19,6 +23,12 @@ class Print(protected implicit val tileTag: ClassTag[tileentity.Print]) extends // NEI.hide(this) setBlockTextureName(Settings.resourceDomain + "GenericTop") + override protected def tooltipBody(metadata: Int, stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean): Unit = { + super.tooltipBody(metadata, stack, player, tooltip, advanced) + val data = new PrintData(stack) + data.tooltip.foreach(s => tooltip.addAll(s.lines.toIterable)) + } + override def shouldSideBeRendered(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection) = true override def isBlockSolid(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection) = true diff --git a/src/main/scala/li/cil/oc/common/block/Printer.scala b/src/main/scala/li/cil/oc/common/block/Printer.scala index d0be27b26..5f56b939e 100644 --- a/src/main/scala/li/cil/oc/common/block/Printer.scala +++ b/src/main/scala/li/cil/oc/common/block/Printer.scala @@ -9,7 +9,7 @@ import net.minecraft.world.IBlockAccess import net.minecraft.world.World import net.minecraftforge.common.util.ForgeDirection -class Printer extends SimpleBlock with traits.SpecialBlock with traits.PowerAcceptor with traits.StateAware with traits.GUI { +class Printer extends SimpleBlock with traits.SpecialBlock with traits.StateAware with traits.GUI { override protected def customTextures = Array( None, Some("AssemblerTop"), @@ -32,8 +32,6 @@ class Printer extends SimpleBlock with traits.SpecialBlock with traits.PowerAcce // ----------------------------------------------------------------------- // - override def energyThroughput = Settings.get.assemblerRate - override def guiType = GuiType.Printer override def hasTileEntity(metadata: Int) = true diff --git a/src/main/scala/li/cil/oc/common/container/DynamicComponentSlot.scala b/src/main/scala/li/cil/oc/common/container/DynamicComponentSlot.scala index 0d296d213..bc96137b4 100644 --- a/src/main/scala/li/cil/oc/common/container/DynamicComponentSlot.scala +++ b/src/main/scala/li/cil/oc/common/container/DynamicComponentSlot.scala @@ -28,7 +28,7 @@ class DynamicComponentSlot(val container: Player, inventory: IInventory, index: override def getSlotStackLimit = slot match { - case common.Slot.Tool | common.Slot.Any => super.getSlotStackLimit + case common.Slot.Tool | common.Slot.Any | common.Slot.Filtered => super.getSlotStackLimit case common.Slot.None => 0 case _ => 1 } diff --git a/src/main/scala/li/cil/oc/common/container/Printer.scala b/src/main/scala/li/cil/oc/common/container/Printer.scala index c50c50acf..b9172c9d1 100644 --- a/src/main/scala/li/cil/oc/common/container/Printer.scala +++ b/src/main/scala/li/cil/oc/common/container/Printer.scala @@ -2,51 +2,53 @@ package li.cil.oc.common.container import cpw.mods.fml.relauncher.Side import cpw.mods.fml.relauncher.SideOnly +import li.cil.oc.common.Slot import li.cil.oc.common.tileentity import li.cil.oc.util.SideTracker import net.minecraft.entity.player.InventoryPlayer class Printer(playerInventory: InventoryPlayer, val printer: tileentity.Printer) extends Player(playerInventory, printer) { - addSlotToContainer(18, 19) - addSlotToContainer(18, 51) + addSlotToContainer(18, 19, Slot.Filtered) + addSlotToContainer(18, 51, Slot.Filtered) addSlotToContainer(152, 35) // Show the player's inventory. addPlayerInventorySlots(8, 84) - var isAssembling = false - var assemblyProgress = 0.0 - var assemblyRemainingTime = 0 + var isPrinting = false + var amountPlastic = 0 + var amountInk = 0 @SideOnly(Side.CLIENT) override def updateProgressBar(id: Int, value: Int) { super.updateProgressBar(id, value) if (id == 0) { - isAssembling = value == 1 + isPrinting = value == 1 } if (id == 1) { - assemblyProgress = value / 5.0 + amountPlastic = value } if (id == 2) { - assemblyRemainingTime = value + amountInk = value } } override def detectAndSendChanges() { super.detectAndSendChanges() if (SideTracker.isServer) { - if (isAssembling != printer.isAssembling) { - isAssembling = printer.isAssembling - sendProgressBarUpdate(0, if (isAssembling) 1 else 0) + if (isPrinting != printer.isPrinting) { + isPrinting = printer.isPrinting + sendProgressBarUpdate(0, if (isPrinting) 1 else 0) } - val timeRemaining = printer.timeRemaining - if (math.abs(printer.progress - assemblyProgress) > 0.2 || assemblyRemainingTime != timeRemaining) { - assemblyProgress = printer.progress - assemblyRemainingTime = timeRemaining - sendProgressBarUpdate(1, (assemblyProgress * 5).toInt) - sendProgressBarUpdate(2, timeRemaining) + if (amountPlastic != printer.amountPlastic) { + amountPlastic = printer.amountPlastic + sendProgressBarUpdate(1, amountPlastic) + } + if (amountInk != printer.amountInk) { + amountInk = printer.amountInk + sendProgressBarUpdate(2, amountInk) } } } diff --git a/src/main/scala/li/cil/oc/common/container/StaticComponentSlot.scala b/src/main/scala/li/cil/oc/common/container/StaticComponentSlot.scala index 0155308b4..ea7bae721 100644 --- a/src/main/scala/li/cil/oc/common/container/StaticComponentSlot.scala +++ b/src/main/scala/li/cil/oc/common/container/StaticComponentSlot.scala @@ -12,7 +12,7 @@ class StaticComponentSlot(val container: Player, inventory: IInventory, index: I override def getSlotStackLimit = slot match { - case common.Slot.Tool | common.Slot.Any => super.getSlotStackLimit + case common.Slot.Tool | common.Slot.Any | common.Slot.Filtered => super.getSlotStackLimit case common.Slot.None => 0 case _ => 1 } 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 88fb189e5..960dac1ce 100644 --- a/src/main/scala/li/cil/oc/common/init/Items.scala +++ b/src/main/scala/li/cil/oc/common/init/Items.scala @@ -470,5 +470,10 @@ object Items extends ItemAPI { // 1.4.7 Recipes.addMultiItem(new item.TabletCase(multi, Tier.Two), "tabletCase2", "oc:tabletCase2") registerItem(new item.TabletCase(multi, Tier.Four), "tabletCaseCreative") + + // 1.5.4 + Recipes.addMultiItem(new item.InkCartridgeEmpty(multi), "inkCartridgeEmpty", "oc:inkCartridgeEmpty") + Recipes.addMultiItem(new item.InkCartridge(multi), "inkCartridge", "oc:inkCartridge") + Recipes.addMultiItem(new item.Plastic(multi), "plastic", "oc:plastic") } } diff --git a/src/main/scala/li/cil/oc/common/item/InkCartridge.scala b/src/main/scala/li/cil/oc/common/item/InkCartridge.scala new file mode 100644 index 000000000..363af10c2 --- /dev/null +++ b/src/main/scala/li/cil/oc/common/item/InkCartridge.scala @@ -0,0 +1,5 @@ +package li.cil.oc.common.item + +class InkCartridge(val parent: Delegator) extends Delegate { + override def maxStackSize = 1 +} diff --git a/src/main/scala/li/cil/oc/common/item/InkCartridgeEmpty.scala b/src/main/scala/li/cil/oc/common/item/InkCartridgeEmpty.scala new file mode 100644 index 000000000..913460404 --- /dev/null +++ b/src/main/scala/li/cil/oc/common/item/InkCartridgeEmpty.scala @@ -0,0 +1,5 @@ +package li.cil.oc.common.item + +class InkCartridgeEmpty(val parent: Delegator) extends Delegate { + override def maxStackSize = 1 +} diff --git a/src/main/scala/li/cil/oc/common/item/Plastic.scala b/src/main/scala/li/cil/oc/common/item/Plastic.scala new file mode 100644 index 000000000..ead7618ac --- /dev/null +++ b/src/main/scala/li/cil/oc/common/item/Plastic.scala @@ -0,0 +1,3 @@ +package li.cil.oc.common.item + +class Plastic(val parent: Delegator) extends Delegate diff --git a/src/main/scala/li/cil/oc/common/tileentity/Printer.scala b/src/main/scala/li/cil/oc/common/tileentity/Printer.scala index 00954516d..b54aa3cee 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Printer.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Printer.scala @@ -11,6 +11,7 @@ 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.item.data.PrintData +import li.cil.oc.server.{PacketSender => ServerPacketSender} import li.cil.oc.util.ExtendedAABB._ import li.cil.oc.util.ExtendedNBT._ import li.cil.oc.util.ItemUtils @@ -19,18 +20,26 @@ import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.AxisAlignedBB import net.minecraftforge.common.util.ForgeDirection -class Printer extends traits.Environment with traits.PowerAcceptor with traits.Inventory with traits.Rotatable with SidedEnvironment with traits.StateAware { +class Printer extends traits.Environment with traits.Inventory with traits.Rotatable with SidedEnvironment with traits.StateAware { val node = api.Network.newNode(this, Visibility.Network). withComponent("printer3d"). withConnector(Settings.get.bufferConverter). create() + val maxAmountPlastic = 256000 + var amountPlastic = 0 + val maxAmountInk = 100000 + var amountInk = 0 + var data = new PrintData() var isActive = false var output: Option[ItemStack] = None var totalRequiredEnergy = 0.0 var requiredEnergy = 0.0 + val plasticPerItem = 2000 + val inkPerCartridge = 50000 + val slotPlastic = 0 val slotInk = 1 val slotOutput = 2 @@ -42,27 +51,22 @@ class Printer extends traits.Environment with traits.PowerAcceptor with traits.I override def sidedNode(side: ForgeDirection) = if (side != ForgeDirection.UP) node else null - @SideOnly(Side.CLIENT) - override protected def hasConnector(side: ForgeDirection) = canConnect(side) - - override protected def connector(side: ForgeDirection) = Option(if (side != ForgeDirection.UP) node else null) - - override protected def energyThroughput = Settings.get.assemblerRate - override def currentState = { - if (isAssembling) util.EnumSet.of(traits.State.IsWorking) - else if (canAssemble) util.EnumSet.of(traits.State.CanWork) + if (isPrinting) util.EnumSet.of(traits.State.IsWorking) + else if (canPrint) util.EnumSet.of(traits.State.CanWork) else util.EnumSet.noneOf(classOf[traits.State]) } // ----------------------------------------------------------------------- // - def canAssemble = { + def canPrint = { val complexity = data.stateOff.size + data.stateOn.size complexity > 0 && complexity <= Settings.get.maxPrintComplexity } - def isAssembling = requiredEnergy > 0 + def isPrinting = (requiredEnergy > 0 || isActive) && Option(getStackInSlot(slotOutput)).fold(true)(stack => { + stack.stackSize < stack.getMaxStackSize && output.fold(true)(ItemStack.areItemStackTagsEqual(stack, _)) + }) def progress = (1 - requiredEnergy / totalRequiredEnergy) * 100 @@ -79,7 +83,7 @@ class Printer extends traits.Environment with traits.PowerAcceptor with traits.I @Callback(doc = """function(value:string) -- Set a label for the block being printed.""") def setLabel(context: Context, args: Arguments): Array[Object] = { - data.label = Option(args.optString(0, null)) + data.label = Option(args.optString(0, null)).map(_.take(16)) isActive = false // Needs committing. null } @@ -91,7 +95,7 @@ class Printer extends traits.Environment with traits.PowerAcceptor with traits.I @Callback(doc = """function(value:string) -- Set a tooltip for the block being printed.""") def setTooltip(context: Context, args: Arguments): Array[Object] = { - data.tooltip = Option(args.optString(0, null)) + data.tooltip = Option(args.optString(0, null)).map(_.take(128)) isActive = false // Needs committing. null } @@ -140,7 +144,7 @@ class Printer extends traits.Environment with traits.PowerAcceptor with traits.I @Callback(doc = """function():boolean -- Commit and begin printing the current configuration.""") def commit(context: Context, args: Arguments): Array[Object] = { - if (!canAssemble) { + if (!canPrint) { return result(null, "model invalid") } isActive = true @@ -149,8 +153,8 @@ class Printer extends traits.Environment with traits.PowerAcceptor with traits.I @Callback(doc = """function(): string, number or boolean -- The current state of the printer, `busy' or `idle', followed by the progress or model validity, respectively.""") def status(context: Context, args: Arguments): Array[Object] = { - if (isAssembling) result("busy", progress) - else if (canAssemble) result("idle", true) + if (isPrinting) result("busy", progress) + else if (canPrint) result("idle", true) else result("idle", false) } @@ -163,47 +167,74 @@ class Printer extends traits.Environment with traits.PowerAcceptor with traits.I override def updateEntity() { super.updateEntity() - if (world.getTotalWorldTime % Settings.get.tickFrequency == 0) { - if (isActive && output.isEmpty) { - val totalVolume = data.stateOn.foldLeft(0)((acc, shape) => acc + shape.bounds.volume) + data.stateOff.foldLeft(0)((acc, shape) => acc + shape.bounds.volume) - val totalSurface = data.stateOn.foldLeft(0)((acc, shape) => acc + shape.bounds.surface) + data.stateOff.foldLeft(0)((acc, shape) => acc + shape.bounds.surface) - val totalShapes = data.stateOn.size + data.stateOff.size - // TODO Consume plastic (totalVolume) and ink (totalSurface). + if (isActive && output.isEmpty) { + val totalVolume = data.stateOn.foldLeft(0)((acc, shape) => acc + shape.bounds.volume) + data.stateOff.foldLeft(0)((acc, shape) => acc + shape.bounds.volume) + val totalSurface = data.stateOn.foldLeft(0)((acc, shape) => acc + shape.bounds.surface) + data.stateOff.foldLeft(0)((acc, shape) => acc + shape.bounds.surface) + val totalShapes = data.stateOn.size + data.stateOff.size + + if (totalVolume == 0) { + isActive = false + } + else { + val plasticRequired = totalVolume + val inkRequired = (totalSurface / 6) max 1 + totalRequiredEnergy = totalShapes * Settings.get.printShapeCost requiredEnergy = totalRequiredEnergy - output = Option(data.createItemStack()) - // ServerPacketSender.sendRobotAssembling(this, assembling = true) - } - if (output.isDefined) { - val want = math.max(1, math.min(requiredEnergy, Settings.get.assemblerTickAmount * Settings.get.tickFrequency)) - val success = Settings.get.ignorePower || node.tryChangeBuffer(-want) - if (success) { - requiredEnergy -= want + if (amountPlastic >= plasticRequired && amountInk >= inkRequired) { + amountPlastic -= plasticRequired + amountInk -= inkRequired + output = Option(data.createItemStack()) + ServerPacketSender.sendPrinting(this, printing = true) } - if (requiredEnergy <= 0) { - val result = getStackInSlot(slotOutput) - if (result == null) { - setInventorySlotContents(slotOutput, output.get) - } - else if (output.get.isItemEqual(result) && ItemStack.areItemStackTagsEqual(output.get, result) && result.stackSize < result.getMaxStackSize) { - result.stackSize += 1 - markDirty() - } - else { - return - } - requiredEnergy = 0 - output = None + } + } + + if (output.isDefined) { + val want = math.max(1, math.min(requiredEnergy, Settings.get.printerTickAmount)) + val success = Settings.get.ignorePower || node.tryChangeBuffer(-want) + if (success) { + requiredEnergy -= want + } + if (requiredEnergy <= 0) { + val result = getStackInSlot(slotOutput) + if (result == null) { + setInventorySlotContents(slotOutput, output.get) } - // ServerPacketSender.sendRobotAssembling(this, success && output.isDefined) + else if (output.get.isItemEqual(result) && ItemStack.areItemStackTagsEqual(output.get, result) && result.stackSize < result.getMaxStackSize) { + result.stackSize += 1 + markDirty() + } + else { + return + } + requiredEnergy = 0 + output = None + } + ServerPacketSender.sendPrinting(this, success && output.isDefined) + } + + if (maxAmountPlastic - amountPlastic >= plasticPerItem) { + val plastic = decrStackSize(slotPlastic, 1) + if (plastic != null) { + amountPlastic += plasticPerItem + } + } + + if (maxAmountInk - amountInk >= inkPerCartridge) { + if (api.Items.get(getStackInSlot(slotInk)) == api.Items.get("inkCartridge")) { + setInventorySlotContents(slotInk, api.Items.get("inkCartridgeEmpty").createItemStack(1)) + amountInk += inkPerCartridge } } } override def readFromNBTForServer(nbt: NBTTagCompound) { super.readFromNBTForServer(nbt) - data.load(nbt.getCompoundTag("data")) + amountPlastic = nbt.getInteger(Settings.namespace + "amountPlastic") + amountInk = nbt.getInteger(Settings.namespace + "amountInk") + data.load(nbt.getCompoundTag(Settings.namespace + "data")) isActive = nbt.getBoolean(Settings.namespace + "active") if (nbt.hasKey(Settings.namespace + "output")) { output = Option(ItemUtils.loadStack(nbt.getCompoundTag(Settings.namespace + "output"))) @@ -214,7 +245,9 @@ class Printer extends traits.Environment with traits.PowerAcceptor with traits.I override def writeToNBTForServer(nbt: NBTTagCompound) { super.writeToNBTForServer(nbt) - nbt.setNewCompoundTag("data", data.save) + nbt.setInteger(Settings.namespace + "amountPlastic", amountPlastic) + nbt.setInteger(Settings.namespace + "amountInk", amountInk) + nbt.setNewCompoundTag(Settings.namespace + "data", data.save) nbt.setBoolean(Settings.namespace + "active", isActive) output.foreach(stack => nbt.setNewCompoundTag(Settings.namespace + "output", stack.writeToNBT)) nbt.setDouble(Settings.namespace + "total", totalRequiredEnergy) @@ -240,8 +273,8 @@ class Printer extends traits.Environment with traits.PowerAcceptor with traits.I override def isItemValidForSlot(slot: Int, stack: ItemStack) = if (slot == 0) - true // TODO Plastic + api.Items.get(stack) == api.Items.get("plastic") else if (slot == 1) - true // TODO Color + api.Items.get(stack) == api.Items.get("inkCartridge") else false } diff --git a/src/main/scala/li/cil/oc/server/PacketSender.scala b/src/main/scala/li/cil/oc/server/PacketSender.scala index 68e1df349..17c4278fd 100644 --- a/src/main/scala/li/cil/oc/server/PacketSender.scala +++ b/src/main/scala/li/cil/oc/server/PacketSender.scala @@ -226,6 +226,15 @@ object PacketSender { pb.sendToPlayersNearTileEntity(t) } + def sendPrinting(t: tileentity.Printer, printing: Boolean) { + val pb = new SimplePacketBuilder(PacketType.PrinterState) + + pb.writeTileEntity(t) + pb.writeBoolean(printing) + + pb.sendToPlayersNearHost(t) + } + def sendRaidChange(t: tileentity.Raid) { val pb = new SimplePacketBuilder(PacketType.RaidStateChange)