From 85da1f047d95bd154ffcfd2c3d459ccc52c6378d Mon Sep 17 00:00:00 2001 From: Dustin Norberg Date: Tue, 29 Sep 2026 09:06:34 -0400 Subject: [PATCH] Add Legacy-style Book Binder --- BUILDING.txt | 12 + README.md | 16 + build.gradle | 41 +++ dev images/Pasted image (2).png | Bin 0 -> 28681 bytes dev images/Pasted image (3).png | Bin 0 -> 23806 bytes dev images/Pasted image.png | Bin 81590 -> 41953 bytes docs/ASSET_PROVENANCE.md | 4 +- gradle.properties | 2 +- .../rivencraft/block/BookBinderBlock.java | 66 ++++ .../block/entity/BookBinderBlockEntity.java | 258 ++++++++++++++++ .../rivencraft/client/ClientEvents.java | 2 + .../client/screen/BookBinderScreen.java | 215 +++++++++++++ .../gametest/BookBinderGameTests.java | 284 ++++++++++++++++++ .../rivencraft/menu/BookBinderMenu.java | 224 ++++++++++++++ .../rivencraft/network/ModNetworking.java | 13 +- .../network/SetBookBinderTitlePayload.java | 19 ++ .../rivencraft/registry/ModBlockEntities.java | 4 + .../rivencraft/registry/ModBlocks.java | 5 + .../rivencraft/registry/ModCreativeTabs.java | 1 + .../registry/ModDataComponents.java | 7 + .../rivencraft/registry/ModItems.java | 1 + .../rivencraft/registry/ModMenus.java | 3 + .../rivencraft/blockstates/book_binder.json | 8 + .../assets/rivencraft/lang/en_us.json | 11 + .../rivencraft/models/block/book_binder.json | 61 ++++ .../rivencraft/models/item/book_binder.json | 3 + .../rivencraft/textures/block/book_binder.png | Bin 0 -> 1424 bytes .../textures/block/book_binder_press.png | Bin 0 -> 1211 bytes .../textures/block/writing_desk_inlay.png | Bin 5369 -> 0 bytes .../textures/block/writing_desk_wood.png | Bin 3093 -> 0 bytes .../textures/gui/book_binder_legacy.png | Bin 0 -> 1165 bytes .../loot_table/blocks/book_binder.json | 4 + .../data/rivencraft/recipe/book_binder.json | 10 + 33 files changed, 1271 insertions(+), 3 deletions(-) create mode 100644 dev images/Pasted image (2).png create mode 100644 dev images/Pasted image (3).png create mode 100644 src/main/java/net/dnorberg/rivencraft/block/BookBinderBlock.java create mode 100644 src/main/java/net/dnorberg/rivencraft/block/entity/BookBinderBlockEntity.java create mode 100644 src/main/java/net/dnorberg/rivencraft/client/screen/BookBinderScreen.java create mode 100644 src/main/java/net/dnorberg/rivencraft/gametest/BookBinderGameTests.java create mode 100644 src/main/java/net/dnorberg/rivencraft/menu/BookBinderMenu.java create mode 100644 src/main/java/net/dnorberg/rivencraft/network/SetBookBinderTitlePayload.java create mode 100644 src/main/resources/assets/rivencraft/blockstates/book_binder.json create mode 100644 src/main/resources/assets/rivencraft/models/block/book_binder.json create mode 100644 src/main/resources/assets/rivencraft/models/item/book_binder.json create mode 100644 src/main/resources/assets/rivencraft/textures/block/book_binder.png create mode 100644 src/main/resources/assets/rivencraft/textures/block/book_binder_press.png delete mode 100644 src/main/resources/assets/rivencraft/textures/block/writing_desk_inlay.png delete mode 100644 src/main/resources/assets/rivencraft/textures/block/writing_desk_wood.png create mode 100644 src/main/resources/assets/rivencraft/textures/gui/book_binder_legacy.png create mode 100644 src/main/resources/data/rivencraft/loot_table/blocks/book_binder.json create mode 100644 src/main/resources/data/rivencraft/recipe/book_binder.json diff --git a/BUILDING.txt b/BUILDING.txt index 2e26d73..09b8496 100644 --- a/BUILDING.txt +++ b/BUILDING.txt @@ -73,6 +73,18 @@ Or, with mise: All required GameTests should pass before distributing a build. +GameTests use `build/gametest-run/world`, separate from the normal development +world. Before each run, Gradle removes that test world if it exceeds 512 MiB. +Override the limit with `-PgameTestMaxWorldMiB=NUMBER`. A caller-supplied +`-PgameTestRunDir` is never removed automatically. + +To run the suite in a fresh temporary directory instead, use: + + test_dir=$(mktemp -d /tmp/rivencraft-gametest.XXXXXX) + ./gradlew runGameTestServer --offline -PgameTestRunDir="$test_dir" + +With mise, prefix the second command with `mise exec --`. + 6. Locate and inspect the JAR ----------------------------- diff --git a/README.md b/README.md index f9415dc..6fb3362 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,22 @@ copy selection is checked by the server. Selecting a stored page on the desk surface shows its Legacy-proportioned portrait preview and name above the player inventory. +## Book Binder + +Craft a Book Binder from three iron ingots and five planks. Put leather or an +empty Notebook in the left cover slot. Enter a title, then place a Link Panel +Page first in the horizontal page strip. Click a page in the strip with a +written Page on the cursor to insert it before that position; click it with an +empty cursor to take it out. The arrows or mouse wheel scroll through up to +27 written Pages. Clicking the strip with a filled Notebook imports its Pages +at that position and leaves the emptied Notebook on the cursor. The right slot +outputs a Descriptive Book once the title, cover, and Link Panel are present. +Inputs are consumed only when the result is taken. + +The completed book receives its Age identity when assembled. With only a Link +Panel, it describes a randomly generated Age. Its writing is stored on the +book; Milestone 5 will interpret additional symbols during Age generation. + ## Linking Book Craft a Linking Book from a vanilla book and an ender pearl, then use it in the diff --git a/build.gradle b/build.gradle index c81103c..1cab065 100644 --- a/build.gradle +++ b/build.gradle @@ -78,6 +78,9 @@ neoForge { // The gametest system is also enabled by default for other run configs under the /test command. gameTestServer { type = "gameTestServer" + // Keep generated test Ages separate from worlds used by the dev client/server. + gameDirectory = project.file(project.findProperty('gameTestRunDir') + ?: layout.buildDirectory.dir('gametest-run').get().asFile) systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id } @@ -116,6 +119,44 @@ neoForge { } } +// GameTests generate Ages, so their dedicated world can grow quickly across runs. +// Never auto-delete a caller-supplied gameTestRunDir or a normal dev world. +long gameTestWorldLimitMiB = providers.gradleProperty('gameTestMaxWorldMiB').orElse('512').get().toLong() +if (gameTestWorldLimitMiB <= 0) { + throw new GradleException('gameTestMaxWorldMiB must be a positive number') +} +boolean customGameTestRunDir = providers.gradleProperty('gameTestRunDir').isPresent() +File dedicatedGameTestDir = layout.buildDirectory.dir('gametest-run').get().asFile.canonicalFile +File dedicatedGameTestWorld = new File(dedicatedGameTestDir, 'world') +def cleanOversizedGameTestWorld = tasks.register('cleanOversizedGameTestWorld') { + doLast { + if (customGameTestRunDir) { + getLogger().lifecycle('Skipping automatic GameTest world cleanup for custom gameTestRunDir') + return + } + + def worldDir = dedicatedGameTestWorld + if (!worldDir.isDirectory() || java.nio.file.Files.isSymbolicLink(worldDir.toPath())) { + return + } + + def paths = java.nio.file.Files.walk(worldDir.toPath()).withCloseable { it.toList() } + long bytes = paths.sum(0L) { path -> + java.nio.file.Files.isRegularFile(path, java.nio.file.LinkOption.NOFOLLOW_LINKS) + ? java.nio.file.Files.size(path) : 0L + } + long limit = gameTestWorldLimitMiB * 1024L * 1024L + if (bytes > limit) { + getLogger().lifecycle('Removing oversized GameTest world {} ({} MiB; limit {} MiB)', + worldDir, Math.ceil(bytes / 1048576d) as long, gameTestWorldLimitMiB) + paths.toSorted(java.util.Comparator.reverseOrder()).each { java.nio.file.Files.delete(it) } + } + } +} +tasks.named('runGameTestServer').configure { + dependsOn(cleanOversizedGameTestWorld) +} + // Sets up a dependency configuration called 'localRuntime'. // This configuration should be used instead of 'runtimeOnly' to declare // a dependency that will be present for runtime testing but that is diff --git a/dev images/Pasted image (2).png b/dev images/Pasted image (2).png new file mode 100644 index 0000000000000000000000000000000000000000..9f5d330fa9bad0c6c54f0ab5d517e46888734909 GIT binary patch literal 28681 zcmYg&2Q*v%`~UUPR;xCxwiMMtYZX;{w6)dVyY?QnH?10_D2j?*GghirBSO`x6??`W zu@eL_<9~h6`JMAWhm#{WH~0O1p4anw=G$itH3drYd*lEBP%0_PY5~B15b)RK`hVa% zcaIfrfG=09l-_8NPy!^G4&nmf-z1(|3a^1m6!SU&umMW4uXOw}w`Tk^A9)Aw?7Hdt z_6KioZFQMd_Y_|L7}F5hN&0+HqRmetaWq)s-5P?4HlK` z=y_U8wi3UGKPD3X-8CZ&lTObq`?J4Q&6Z5Z~H*W#vg9);VqqDib;5+th4 zj@jVTp9|OKhD64wr;O4UJ3#hpdQY6xRTcD9zeum(qbPqk>1OnlL1u6%*~90iJ?o_S z1)Q3`slG8XptiYegkeTOyC550$Ybv11g~^p|ApK6{I-L*lxx8KSrMuu<`QgfrxN=h zsc$)`#`>6)eczyxciNzmGX{Kx8kiNA8#Gu zInn9HVomjl?DAT^m6C9qnTmp~?TcH&%;Cc4in7;`&AZ01sf9hqkq;8)oXXbvBE>f6 z;Wt|~vt~X7I=bF?ToQQl=LLn8wRHikU+QMJZENrEjdmDSpX7N>`EU9C;3yY5I+Z8+ ztN5$5gD+;DpLN2VS4;J1yXveN@*Ne-dwLDFyT1pdo6}eu?I+!>QFSx@N_1 zw-%I~c~ZFUdGg%z2`2_8;decgW#yewEO&Js@(_`4`<9AX#!tth&J^ys=3S?RRU_mY zgF;ROg~aTnt_zo-?=dlXmevhdH)p^!w%D;uZN*%Q7THi~X$E zZV@Tb`d?Uiskd*%vu1lF45tswkaMG9 zqb+hE^yYaXhL^z#o&t#q^p?X`osB#!z@$V*S>20R&RddjP9_i6?3NQ#;mHlyzWG_j z&R4~5!Z0d!x7c=C0mC8UKA}W@+HB>1Vp)jP%3HHoPSp}o|Jhra4Ji}(<@Q#V!OCCG z5xaP_@YN1Gnl_>3S@y@w%;Dl76t0@2ra>;vnMj9yW%}L#AtqQ72zj5T*y&G!S$&xK zdhg%P;;NSalS(rOzKXS1`+}x`<9OhV+)Q`H;^ zoWaj)y(Z3#IU`Kpkju%N6QlIFMR^s%U%1~u^QX-{9w86P^2zB`LJncSK{7@H2dV{= zh5n*VDoDB8r(@Jp4_QvMF{1e8;%_Xb!7Qem^V#-O>CmEi%h?565Zpd{~OzO1xOdr}9)Z3XEa zr*Z2avU)?JE4KU?~qz zj2a58FHy7sRL)WN6oR`7aFJ%9K~lC3SQ<9fmeuQ)Q(NPl2wHBwc}|dH4yN*wrElD~vK;i5M2Cf+peL-#fu$q2D;+EIiUIGf* z$jv zX^z~S*fhK2;*>;VnG>K7TSYBRbgT)5Ma8G|noM%u#cJ1NKHKIB7#Iz~aaH3#ddOty z%;rrxYWFQHW|0ThrjKyI`umFrMATy;x1W1P4ASx5DDye~<1Z?RH`1Zi{F$9|_S4D* zN(H1VEGK4Gm1O!n8#mU3iuHfPShOo8Y7mds5*g8>p-Zn5Rul+vJiWJsT{m^pB~o4b zz9evtmKz!A#-0iC^HOS7@ITwG^D>1QynS*_(~ETUW||^wXZF^M6>T15B1zccy{-5; zJ=1aYs$iLMEJr)2-Y?|~7PKYD%#+#BVW z%wC?c@X#v|QA!EucS8GJOn)8sO`%8_hTl4ziHWmx2zGWZMd@`04>gRg||L#-zw_+TT%%G-8diFE}WeR&XrV|f8m1wxd zqsmKf?aVky5o=jEGu%0CDWadSvhgE&g)+ZV8{Y<+XHe4*()LxVmarc#tL0KV^Gcz( zINlQVgyW~*PVSJUeG8Jx(ea=QdglC~`X$2ML~jg@{NiAqXZsNg$4N{Ih(qBqC84L< zDJN;Wcnj!n2ux(o3-z|GUV$|kwW%1Wzry$SM9@2QY5oZZ$0leaoD4}*7N&(myzD<5 zVgf^~)mgHzh7}SAhJp~x95TvrQQBln2g8COh$-v(YKT#?*-kV-ayX|x*M|GmKh zS?n}~zN_(F5!0`Y{y=g=FTaj=P=jw}h5k43BAt+2Sm*Qi5 zKsQq6*143ht2vHddOHxTH#JJ<#U~wJG!_5DL;Y;Je4{hjlAATal6yRL(yL>!f!|ic zcW@SJ#H7)`Y+H15vOLF}prM7Y(fcduo|82MNas3)l$zPivvG5M41h$|K9pU#(Qr`U zScr_#{wT#ST)~W@k6WSr%$}M-ezjA&GMRe3kL{c63o~C*I!ztp?|hWTP~L0aIJbRa zs>)W2^+~py|3 z!@r0v5f<&?Wp+^iJ^Zs^aZHA6?hmkXN!^s%5mmh}H4PcgG2*&0e3n5@IB(Y1=RoECj&<=3_aCZ#r-d? z;R;;I-l45in?}fSbX?tm?crT}CC62k{ohtH#>E@AZdt+gvyck~m|Iy47568{BGI?2 zP1sWoW3D|CSd!RX|F&a?SCy6uI=-3YDtE=Q{7)HIiZWd=K~!&`Ch4C^h*|2Pt=Cy$ zbV+ZeUqM42M~A@O^P1sSoRF_lAM##PLf+u)cfvnjlG%XI{u_#U|3aVU=a`L;jp^;? z-jzinPx3n%Z!Uijd&b-#y0ugmz@4Djt&JzI=(Z|&I7E?h2%*D?s0Yd0&=lTT43AE& zD-ck&m35oPuE;j@(@($SF@2#bTeNB?_XzRALDc>Zn-C02qJ=Nv+Wzs?y1u?1!L0o( z%o@KYU{vT%XEZL5)AS5l$ul=q2W#|Yc-%wkcXCV^33_hd>1ga+F4D=glC%uzg ztHbp<>gJf<6g*CT<4f4W>@-!`Sv?OI(X zWxsz7-W2S~N#KZbptb@U->Jf-K%!c93p3H6!HCOc&GV;uPyr(W?gxymdx{=Gdm}w_V=bLj#1@+$qY> z7RHdeUF6?$Gn#pA3z3cGix_rDduDX8aD{UtoM>_(nLnC0x7H&W94y`h!bx+#a2(B)!g zTFrFHA0yM++&E)xbwO?>HX&b4(`tcG-*o%~iloZk> zp=O={u<_4Wz9_ebJ@#^Bq5H+N~$ zTzv1aYW6)&jaBUFK3DRrU=d?c_Ai`G%OhQ4|K;lG8v=a{uUkP`m34&l@YI)>-vb5| z&5pbEA=H0M8;U;-vx%rY>iOvxvqI0otj|%RSHxXEyboL zl!++D@ZS-8p53=zynQ{?-v?Z&>5*X850yTb;MI<(Ub2x15@6iaH|uzQ+btAv%(kNI zo5HdWN%7I_MLksR8wHUs3b2K|SCgSG@ev^~^hg$B0N~H!P&hUlqVl`_FuHrIMH|0h zago7B0&M(qsh_cxI+~d~H^sM9)XzFf?dW?acy>T|+BH243CD})OkxeP-V3`+QBSzC z9X81u-XTOq;{?Qk+`C8F;n>tHg4@o|b`NiE#zfJmgCU{BF`q&msqv(zx8p27+cb~> zls!*h>EFF#M_xSP%G8rp(qAdQ*XCDc?>s%YnXmLZ?mj>hd1qt0MU*N6{|!P4gt1Mh zeS^X|vV%pa&1`+?j2)=}83VfXDm^m?*wZ9AGZG+7|J7Jf?YcMzsHzv)K~e*1(^7O^ zt=GlkjcsT$p#tLSO5BXJmY^IYgT6!#HwGR}EZ)v<=wy&Ie!uFzH}NG(c$L{rm;6{J z9Eg>(Eg}JOyDwyg2bX>{wR=4q?&FiHC!d7;mV}0j%cFQ~Red~^TBEpWCSx{GfpXSzo z6Dhd_Fv*=oj&-9o&&@fxznzTLaj~%enDakHFEw+9jhtY-#~;sJ8Tl~rB)3ek6|Q+` z&e#!i0T&Z`QDFd)-a9g|$XoVS8i!V0RqrGPG@2cstd$0@-b$}WXula|XOEmp+xtL; zy9Thi?ovdH2bJpX{wr60yU)@ygl>D@A9o znU}5ufc+h{*fw28bXo!zH#c_BXK|pQTWG4mBc?)hZ=$5g0o{MMB*ekBF4vC^0FrJQ zBWH}XI+XNYmm1W2V;E9@Xo{#KOnsZwghc@${uh@OT-6a9_qU=Yu~R-)&T4o)I0Quv zgz*(7!G2?8#u>?S+H-QzRMA}O5$BzIb!wvm2x`caA9Xnt0IFe?T(aFj+=Hn{F)R9gZ-_r7&bNW3t_4*nR_NlKQL8*0faFD+f z+1*|LPE*h4_ldm^zc&73)j9<=6zr#0SF2TkIiCM_TI zYDNISi|V~AGY*`YMzc=;+CGb>kS5$`9v7VIXla5!9o4n0akg=t9lMSCBMCCp_+ZuH z@QE!~wh7hOYHj~2%B9HQuD}p6>{-lq>BISv>|`r44%s$OZZZHcTl=8!=kB4K zdC~(3QUD^)e&Eyk-0Oypt*__SysZ5AOXp2(+`%CPQZ0BB$aP4ej_$$W>mF1|)bL58 zYA3fy>Ys1YEN!PHdIqV<8Z_SmG;o(pWMy$XpIhBmIm>veT6b{rPJm@2lFN6BD$2|g zA(-M=aW{>xob%pSkj)^OwFPhE+$*1cdMm9ts{aU8k@+RNYf=qD2IQ{)mT&uYHvUwo zzM_Cyl0Vz2OQZMT9$!1pU%I^2LP)hRivU6GaZ(C>n z1tHla8s(W|>9J;EF~+@O0Sa!hJxp0{%AjF8#x6|1d{LIO zvhy&XKHrn6{-CtU0+i(6W-T|d1rSH#E8?X*phIB|vDT4&N%5?G?;aZ3kUPu_XhfNG zbVvMyPGBL|_1l*|55gwRgo=g7E=$9Y1>A|hnao zDx>b|-rtP9$iJlD>TWt8iih)=TAop{cQLYl#e4vu#TywA=v_5~zb?`~Vp3px z$bZZKGSAVDnYA%$^`M@GxEax%>Zk^0yDCd~w6jz->_iA3=8Di=?nvm5XUV9NUh2kG ztWNb{UzU1%A$Y_|0hwe2?mDiHJr5*lib_qSg`Bf*!V0^9VAqeIK-dY519Aqv$h~6Y zlQuFvcJv-0er=R0008C{8O@<^{llupqS_)_4h*L1Pr>o7|ZvPm4b@u37QU2{n+2?_X$DTAP0*1rD(JHoh2=_miVc;=1wTXKVJxc0TW{I=4nX-f`usO(C;W6*dwV z1Y07eKH_GRT3^mwSc)EBr}jj94SC{G)JGzB;K{TkOC z$w>5y4-}q#Gt`|8$bFEaT)5}vJ%e7W`c`%e754`WtAKTF+8Mb=F~?Ss3wJ16v#N^3 zaMK)@&YOPtMZJgt=cnQJ%syLF70Ln(5LQIH9&eZUjDg&B;S5{?yT?@gEQDiE_`i5i zv;)1bx0-#W5+7W)d}ww>MOAM&NC3bG(MbG?Kp@WtEj%Q7cx&<8!x1$DHnSvl$I-3I z1J&(k9*W%5@$Ek>7;M&8jjH0mL|fI2+3fm{H-#cLpF%@OcR}n&C2lLQu=e%e62`98 zCZwuWnV5&n{@mQDG)wb#6?5~=oM>Aw^sL_76+g5s{94w{Oz z9mmg(O=SEB*jsxWxz&qCq(j_(t_%5=Ij0q44sqm35I)0NJ%`piV4%}&DN?_^%z*)^JPW)p+4EdCY3ep^ZmGQY>Pc37cKzzwiH)|1-&| za*3vAliZyU)Fs}o-Tpb-bcT6Rgt0j(sUZaxwR{f_y8}OX6=G^#Z@ftI2W0ZECxMm| z=wbPnwj^vo;J{YqrKA+0Bj}m>cMrhFjx$OPuz&O&dD)MH%w)f8wA+HrYNoZ>HDV$xwJ8Kg(hEl&f5U!V>Z`G)`WSoh%YUht|j>DI;l`{5M1l=_Scdi(>v{&864lQ{q^7S!de3%Ei3g=$9{x5_Uy zUZd=Ie&`q=rtMiaL*gPsS`87#Y$70{XdY<{AWrKbMH&^Mq7BwUoK)J*3<{v==x=<<>dyaQ1e=2oYZWs zPpgfU`)QeE@~>t5>+X3h6Rhx&5G*}jfrq#(LgXr{AOY>i13tZ| z@mukKT#+sMSK_I%;A95RrCl^xM~pNM3N1wcd~%jZ@&Z0Jd71G8&*;kQ?da9}-k3Dp zUV%J+Zw;+pqaiHBLZ;{nRn&Q3Z9Cg24{hDU=oHzPFBldl+4JDW}%3A)Hz!sriCe(t9y zOUN)^$Udw(f5UrlkzHB0DSe0{1Rv%6MREd&HMrDosu&4_&3HEbu@rbu)W z0HNdGuEN)N_KR_%>BN{%0#+eJfbs<)P71a2wVMNuWc2M$Gl)BoX!Lc!L4QwCNSvDP zn^Ip!XYIuqtKIg*{>j|A8*gXOE^am$O~9dR1J&in&522NF0;>{i}6d7VKa8jSISbCe;naI^@Sv*oWiOXMgg^reWD#YvVy{Jm+N%e~~YMk;Ho- z`uzn@&j~?VvQqeQH&bLO`Y`OkDPZoPBMrG3$9Foh>N;5)*q?*k6zUI}s%u6NnL>}o z^sm6Nm%1aEc~6dC;8%r%m&hPb*!Qv!A(NAnhmbVM`m>*IbN>C**bqh8nD!y@i$&G| zgt*kjU_BX}7Z~A-a#wSl-6zhI=1c~!xZ#58h8#CS&*JrC{(&0tah};}Yb7IYMp2u1 z48n<(r-@FkybLNi#Kn5b)}uZ~vz-`~Y{8!mr_jXR&{IOr76{qt>bj7f85o?b{9@&sQ>U3 zxKTs2y7rfqROGmsq>vD36`CnHCG#$kN^@Aa(K1) zCVu$18BG(x}u(lniZlXbnqu4?KWUpSP@|Uv7cllMsx>B!m+6)N#S+ zoDgDXv!6A{y40>_gaoRU7v)o4W(R8#4GiqkC2X$no;$D3tP0tdW-%b)o-GgQT$ z51${TI)gq1PJPxFx0+dX5RMC}#R;BuiJL!W$3R^58!v|Ka1;A2GeW3Clyq~`naSR|1azqmGm4Vc(Otgu0mNaa?CoUXpwnjaGiKW3zZ|pPxNtH) z5xcT&3-hx!EGTmt6p4=0JQnZlFWw5&5;L{yPwyaW-IYIP1`a0%_TvLhN{v?f@YaNh@x>5NCT*8-|bm^ zB6Z_~cS|I>X664-jBf%*Z$GOvuGM3a)GN;%VbBywSgTRp?3dmht#85>4rX1zSF?!I zc(nxV*)5c$6WX^a6z7Iq`#4c~9k@a6uTWdn>GFhA;hQ`?sdSC>HDM3+MXj3taJFaLPp8qP9|z*(f5S& z)A)o>&o_P)5t}N_C4>G1ot?}DTl6iVjf{V|&;SJ;-Ijsp1(@sO57k+YS@}YnPIf!v z6Phks&1n*6u_(}ovidE*t1{TYIycW+H2HB757lRnq%W4M!Fb}NS~z4iOaDx-Zz;#; zq-gCPDFCH2ngfZ$R6NAPIoFX)kb@O|h#_MUeaG|D@pwTp0SlUA1?-|v#cb!x^(jtC zQz)4STkODZUe1Pch`6~*AL)3{Y8D%*p%^kK^v&FQyQ-9qZ z%}yg@6+f~=Tqwwa*9oB$(09Uxf%f<)$8@(kkZ|55ZdT~= zvoc~b?F!&<8?|~L>W|#qTo)61S>d;%FLh3Ah9Aylnw^)G@$oUJH2ckWeTC?)`!klH ze3-Jne<`5^zP^09kU7$LBMZ4ybILLW3po?Db3N`yV0{A)E?q^Zbg0UmZSv)XV1*>t z|A01GMpJsz;TNjIjLrM)d`~YtUV&|Ol(ZchjEWS_k9hP}PN&F7t9oEHjrl#O zfcWc7l{5@e(M2m+t5`-QM^L`+uyE*pZ?TI?9VI}+lp)aIl4?s}`0W4YxGl&0SUBg{ z$iS}poTuSpA$;!lc{X40d1dGY7MZXueS56dIrv;$I&j;DQ7+&H;9b$Ou|3HK6}_iq zuD+Ubv9x$;;^s$f2uGH)(8}W}CbM()lwlSLu|55qMh9CTGudpP4oq0lR> zkJyZp^0zmTed%U`XT%*Nvn#vfjy_I+T-qt^xAONt#O8nYw^M>wOQG=S7hZ+ImjPfn z2)SezCFg7rzq8(!IQ-4y3tzN)C~S=UeRIhEd`|PJkQ%IMof_tk(@p#QZ_XqTPny7T z)UCh)dQM+wbf>1LeRXo@7WGfg-@)1{RkGa6a@>6u)1}gARVxjmzM}L!xJInSHt9g zv1f`GV^m*U$3_vTb)_dKL{GM*&H1HIAF}$jl1UQ_v6Y96(ifQ<;g??=pxckK%USoT zbDQ1uq!lHUS6sTk0LKo{QH0>4i0cP9;%Slvvxvtc4}upeg_$ER+0_$QXMBlAA2u(> zY~LUG2JNtd$m-1?1xlcadVvSE&rBS(JX>=Wr0H0X|1ecvbZ>`-w$^v&G@cTJF9Wg* z2SN=>bq6?|Qr^(5Sc7mc3r@1zc`bs}W%B_3i%o4rqGE{*?~G4nW* z5bQYDVzD`zI0&7&IA#630yK8(C^g7Q@z{YeI45C6y%|^JcJ4Qhl^hdf8b1idz~&kP zQqZNZE>3XLhRD*>3*tIckU1fT(0HmE>a`7W7oMm<^(~=>ulXc{uX*{$%^YH)Q`5`K zoW%_64>Hoz(~qi`7DtehlD?`mX4O}np*wi1Gt2@OV&Y_dolVaY z`I@(`rkNl9r(WD}JQqqQQ53REkGPaFNZ#sk>c~?*VpTC>DHM605}u)dCYMjSt8h>A|mRMgb1|NE!NK=~X;7o<=#G?cV8S%?GE zh>?-rpzZLHv-ZHy{x56h#QoD=J8V?kTPy7*WrcRyWt;0bRen1Bhf z_lvSasx-8NH8Kadsdk_IEn29kiSz8wfRG2~yUQ?ENeSVcxu2D|8t-#6^`q-dsia|$ zt$hRg*0eBHCcU}+K2}qrcr(9{B%w|kQE9-vJ<*U?jXbC#edFnQGyMy3MV;S+QYOaW zVe6)8+*YH6P>y)Rv&D{FZ17^ZKIkg!Y<-C0zB2@U{bp?WHdD8`r2FzGQ8P&>hC~M9 z0Kp*6ww!c-%W68P!`07@GnzcdgF$3Au!DhBovPEJS)ljv&QiVHC1Fx`vk$UJ@q-Y=PzKzs`vy7wsY`!!Gh4s!YEad z1iKK(_-XhHM)~>Cxw#$6v@T~>I0n07Zk3AT^ZeA;EUa3G#T^7)hiCdXtXf~1Zhz>$3%?1cq_jX7 zgX7kLidTEC3-N)8yPy}v4|Z9+Hnzc@ zu7rzq_84?c^GB~*`h6Ks<$g!lvtL%~eR@)Mik+pmX$P7A`qtU-^QbkFWr2$tpm405 z!+y^aZ}*^m%Kd`)g!7h?f8T1c9VXvdjX6_K#BRkCP;4%BZ~6w|5+evBSdRLk&yBAD zGGbr8d?{gm`TRMJw~FJhew3*eJ_S-Ge7VmU&AH?a<12)K({6VxzmV|U-j_6=^OM64 zrGZeti?0d3-oEOQvq=-vMEpY~VG@Ad?oQ-M{F6nS(_~JaIreYLu97n^C*dBK72j6! z-_ilSzND|@Bbh9@_0T!HLzV7e;aKL)^Vcicke(QKZ2o2GQ!7_MobdcQ%7C9H9^BVg z50cGQB~6DzEfMNWhZe}x2y4NDxJ@-gAK|7 z|7VZZShVro#}2xDJ#}`&;o!QS(g0+%cN_cy z*&7dc)6{j!?)JFY->o=P>9-HiLlYbI-0VPHkocKZ&v2^r6?d+K#j6o;Mk?8hUg!8u zh&lX~qd}cC?4T=WRQo=W%ltTISOpe(zPaSA^s!v}6XrOPB$wY{60Y?~xclUuV*%#i z1&kUPFd33Koi<0GIe#q`DRVjXTz>`D#HehmOdV)46AvxIJ{YXnkfVTs5`px$RR(Vx zZn*}fQA*gYDu>Uf-h1;A+z^EqSQVC`SGFMde|=)(#H!Vy?dUp1oF3!ARTe+M@|wsu z8<(o=KN}59vyz~MQ&0R|o6??1TUa+8U85%n^N3|Ckmv9gmIfy%Ql}#*lqDj;bo`!>P(t2y=AZLh>!#20Pg*wwc6@CCd*>GMJ#Sjkz2C+k zQEVcB%#zXtFL!o{nhu`-dL=WMOo3y06{iy4_zx#l?e_2c2W|aZvdTcMRm0`O0@LIx zYC7NA{0umOGYmniNM+n72a9c=D6Gm_??cn~81*VPf3lFh?Nbf!cbS>v6dVJK$2^iL zhd+y&?c}V_$Fdi~>08M-z?q{evyx~mJDAX9W@s;^9HLU$Dy{&zyPtl4i`)3;Q*VIn zb;NA#zkXTf7GR6{2h&0txH6b@#FbHOxc)V&>469WG$znxjvs|!(OE>0k5x)!VU^h{ zi4>UE{9V?|o8U~%Fu46qSTMu1aiGYq$VuV>kPCfb?Z_L`?h}f{9JCKNtPqdNs!oj~ zXIRs2m)3CXhmfQ^b^>x)BAQ5gWBgYiJXz!Idj#tD(GN{+Pt7jWIps&=_i@fEmO@0V z@{k}5Jia&AjeGW&++`{>aAp0LIwfl+&6_bdVauWo*h*tLV2E27nbs7H0J0FZB*IL+dMR+dUqv#a?I9eL>WdV=+xPzXnhqHjx zUT0AE`c`X2daks${m^c3NVwba>C3Df{?sE0FzC{lV-s?2a|2{NKiA-A`7>dY(~q$? z8t%iw=U&{Tmd-%M*O^UqE< zTu@vQAa15HH-AOpC@qxk0>IGI$fvjz)A6z~Z-$#a`lhvYOCW-Vmu`X}G7fUIG4LTD z5?s1Tg`d7``CT{6O|<8&GLaQXPXQaJ`Dx9pK|Vc1bM7k+V2^j5q2JM~w)MD3@FZSB z%4d1E3dE$4nPYG(x zMzojLu=)p;pD7VW8gJ(>X1MgbYWgt(z`>)sh{Yu%`J#m(aFSriO0H_=rI0XB>NFwF zMGUF_Iu11kt&>Eo$aqMu>G5+s_Q6g&Nd4?KuNmMny2H#v5r6xdUF}b79WvgNy8dgm z=czIR51JG}GwmS)4l2vZQt;#V9-ekgQ{9YY@d8yC?H}kZJ?Z~Dd>(Av$jttQr{}UB ze9H~|JTW=8wa#Zx7y$?IhMr(XOv>}zg}AmgFT0p+9nZH~mQM4$8HykK3aP~ z`B6}I`AgQLH6ZN!odtgNJE4xewm#X4j;_Ps#>)Nqe}QH!Dey4hN%D;q=XOiY^LK8O z@VoY9^!qeqEe?^<|JE;W6)V`x>jV1z@)W*90-3KU7=a`#&Em@59q!`)u`(4B*hGFq z3~b+g0xvgt>2Ubmzp`rP0M007TXU%Q#VUG#+QzzZg;t88vV8*P27|4@vndru!?ZQD zR4IqUzIC|MF6TeVqySC$6>U#Lh_5TXGI$?PsFluH=wR>iM@@l-6TQk_BX4&VUMoVt zU>H4ex^x%ZQ$-x#GmG`F#eIIT1ltqC+u<0lUad*pd{74 zc7le8Hk9GD*v#ng#@H6LOSeuMPcMfz1e~SX%EYRhp zJ!~L6cP+wTaSuWBF3`KDh1Y`Wl+mIRUnUAUkN`5Gg3M8#>Q&!!Ss@I#6rYqOC6HI2 zev2HLUIr(ojveTFF4a7bD*blaR8c~)x>@HH`)?;t2@(EA2IP3fl>GwC4?0xJ(2o7J z7Vx?^rtQ#_F2W) zk+Pnh9$)Gwc*L9Xq&3(1Q5MaMi0+R;wuQyTF|Pj#q& zdke*Ta943vNzKWRvLWKoDcrP6h><;4%T)@p~@r^9Twi{&?9bMy7I;#!zOT{8_N8So_U7wmW!W2e;2d!l zL_wG|Oc@;eRpLZ>C0K|xR)rWRR64birR!eyyvc;k;co7t?Bm-{^u1HWPpqjJOb}d)^hdj02CbafJBWW&De3`)V>X(DPRGz zRPG*%t9t*y_%^-QrOM~qI$xH@yD2VsT{gS3n|Vg_dr)Q9T0SfOWbt|i2AC7Ss85~dc&_6~}t9?%o_{H0FWQlJ5GM# zqt{I%qwOn;r+*{WWx)d}o?`DjYW8Nq*k8vu@oqxSbq=BWXWJn* zzxNCsQ=0Ab^#4cwASt69^OPA&V^^gJaCQ&EjBnIHk;YZ^zC!NIsOIk(wj)yO9oxZg z)Z-~7MQv?206=#6U*bddU+U`>H|xcn4n37)L(TPE7z1rQ8ApQSY4p{NUvE| zgSaH|+}BVYj{paL6o>frN(_xJ$R4i~>=lMJ)RZq}umgsRJIQP83)CMyb6j1W_+QOQ zKhc>IG_VT$zgYm#Xcg10Uu!w0MT4`h_9DchN(F)Iu1oVCA9-~^%xe@CTR#3RfET>k zqW&KsbN|L{F!r}}jN2=*MPaJL?a-a0e*NL&P_z{$6W;Hv5~9CQs2)i_06pZBcSy-krY7AHNgBqqmx&H=i|a4^wIj>kC9r8S zn;e5XOAqenWpd3szE~;i{0e4ZxvuZ61Gl4HC!`o?@7~YmXI(aWV^9S87R}Cp ztr7o(-G&+Ww>vx6fH1cQ{o>R!Q#>>5mQU6qvkI8512TIIf8maWGplSO#$_R=38i{o*cvBZ^fi)Cx z-}CGX|MS}5Br+50fzP-*%Q>6Ks1p`O zb=Ba96<049a?M)?P5GJ`qTeYBUvtT0GFPMASz5BWEFOS)eAR+r_ zf4GWD)_hOrSVPLX>2T9x@55@L+4*|ZF6r(r$(53JS(ffbx}|%OS{nWjzfbS`eB!#;Yv!4m zbI#mz=DyDZy*+XF&kYS{9!}}46>)e8Akfc-HG243Aub9dEc;;3vHg!JOh4HHUMwQS z?IWNt2(2s1vKZqKoc&?#C{_9rsXfPw)?Jh{IlRg`mS)VSXnS49R_mcAg>9y;dBo;^ zrT7p02q4xJg-!~Ki{xE;bT0HDGE)%d92P6I*GK^$iW;-wqaxWh6L;)S?&P>G$di^i z?^zrC_di-+ve8#c+SDjJK2?9roSRqAk+7K-3mlczt=q2Fqef5!J>dTrf|9c+wcP;d z#Fr!^p6MtWz)VFNK{ZR68QYxRl_i6YloM}%V;94G0qBmqnJNK2tlX)*YCY70&qLO( zVq#Vv#(O(Ps)t99TlR3yI#`;PKu-0Oja*v*arIR-MpT%_Mf2I{|JxR{WLe0`$tyhn z0qPjdli~k#F>^JhVUy55@tG*~CLgi~bD2I8PXd19Vcg>kCY{ekD7Y^yq9B#=x;5J? zy}T`OqqG}Ueu&wO!UZu!%)?d!y&~9i3aYV zk>aNU5OUrJ0Ba8Wm`c-O-_>Wt@wy6eQex7&+aM3Tj2SbLe~-JO&=5@H91f80JoFUc z1?azZF?VV-7LZNq$&uRgia;)x2cdr;tu2h%vq=yjp{)g&RT8) z68lrB!P20&9<;Z&o%OVbo;QZNrb-$P<$be}dZxU0M^04WUbyoqFA;5g=@hRRY?lKNc=Hz4npI!uqg{2gHX02oNY?78j$du$FdQ38gImvH4g zrJ`=c3P7oM-nQ1)WF}hG{gte?>LUH}X&Al{qCC~%Thxhmc4O%=PM$y#W?;wlsiA<- zR5|8qzdwh9)f34x?y$SE$U;>NRl(d&ZSuV)FW)c_*?+Bq5;CL03LG&58{^poTCJGl z7DV}l3Y`;DXHt3|i_gA#b-sZEdm~G~luObqiT$*>d(w{QPQ>O|F|IW*xB5YS&L`UC zqBd$xc7Rw*_$QLxi_y{uAc8XUm)oWSbi#xq5yqnx4b24`J%Ae8{XH?$dn-9JYSu(B z0nlNTeobwdhSqGvZLylWt8v>jssT$nl_jO=uJ#!qLx5_YfG3ioN$d?=f141iyc6dO z0ErDpru4oNE#5P4$~+;3^vE8Q9F z{^Bbo3##K~N|{&wxt84zL}vVKd(`)qmNF{JQT<~6JDU|7>pz!|C_psXD7tgg^!C8P z3kQ|&JInTfb=K^5g*M!;h-5FN_DqhZLhZ>Il0Ohe84zh zS#9Tp1u_GPLduSvQic_5+b^^08|tHLPu7TpN%Pm|Q`{CvfbKxI;mz_>Y*l8e z(5|vNxY4Al(Gy~!!K1GQ4##yT6hl2Vb1U2_h$yz!IiFuHJEJdHs{;sM$pR6mkg&?I zO=Lcm5By*3VfS+?+18zHdgbXIbNJL%K7Ws%1(6{zZ_t2D*J8oF0|1YezXeth(W#YV zaGh;@%YLVD8+o|2_JimCZ>sNhu&zC%c)fUS&6uk4Inq@1qCFJgMd&)frhOb2tV_Xp z^gyg`*Jg$HxIdZLdv#g;?NrNN{>;d(b83) z{Q1`!?ZItM9@R9%e+@-;3Xk7`0n-D@97%?{tlG8EKYCFL7c0B)hH4h2IJWQeq)13D z;asT>UuK=xHoV$ytzaUBE4yZ;m7mQrV6PG~ z%k(_zV?75vK1AZ(l{~%!>ge){sH;g!L$Ucr=E~`gK7z-ii8{LvPbr7-Xc`p`(3(wq zopHc`2mM)ISv$^ds5_f`@vS}icaqgR!R zk7|i7yhc^`$rfInMRz=y(i5tkIgaU>A{hjwxI4Q6nay?PI$8W7x?B@)*Azre0>7vO zlM9fjc_AbzRgr^s+;TQ*rn~6rff1_cF0Qq(iMM(EEOTj+nD{Jw~DU~#pX zbsCV5_6Q69cX%<1#2X1_L-@fF(+R!K99^D8HEQ5LaK(QL-u&h1Nw~n?%T1-d#ip}M z@Lx^_u$MX=VtC_h0W)bKb*MHgPgrM2f8`$)P5@p>?bsVqjD?W@7nH;bBUyOT!lA<~ z^8%Ii$ZO4KhN6TM8Ek$>RI;uXNDtiF8TwKxv8s!fI|ZfN1zHPTM|@aXU+KM(#JIRp zyImlbaAIQ0jB#$3eQoIjdVZt;g_G)?pD4LIn$ED7 z{QMtTbduLvz>G({t3GG#?P4FZaOZrSew$YeX9LPMzE!kpo|2ys z%kBFbHnZodN~-fuvGxJDWFQW$`8xg6q$Yi6>-4&%>Y&Hu1iE@(RbtKNcM_Fk{}#w& zmqRaVBEI149ayvZuS6a^Ft1=#L~qS(xDqTLFeT(s-B=&=?q~_|3kc{irf60huuwNw zW!=tMa%Mo`&5BY6SDi$?t13X`OUbO>8;DjJw#uy7uUUmG!JOeg*6sghsIJ-z!}ks& z8MAqPitqbPFRS(vuM6@b!wIGq7ZxIW*6;4_29oG?b#%PEy}2@!MDlopy=-ileD{&Y zH#_$gcojlF6Pht~dBQXnHd^&RjP-~0a#A}_@E#8jU9Pe^FOyiNk9oMcMf7)ec3xfm zHYSF_V1VE>l%J=QJ^Jyc`VlulkrhI_-HR;7>{Dx9e+tRF$*JIL~hNFUGLai{EzLbT9#ryZ~rHb0x3<09xkBf52Jg=MO z>!AfnHa0&^U33=tl)RNz-i~rnfE83e)>Eh1@O| zSe!NQPJ%8J2VYtt1jJe{%I^x|G8+nAd0;YNrY^O=Td9^hrQV4&laku}d3#Kh;4iWo zeHyiOxwp5cR;rS*N*L7x+?))U4HuBC-orhlH|f|s<+DX8fZQM-fF%bdg6<7V`q@;$s^@t#+t+!H}y_Uj5LYAy)cnLltqWt^})V{vH8A`oMlUU?@*vn(U z)J`p|*rJ0Wip*)Jjs}B^=s|Bdj8eng$uPBQbKTp>P}3mqhn>mLC8hk%3#nL`>no44 zi4s6H+(~0ijb?Q}j;RDR7zYu`MmLl-4Yzm8jBUKeF|Y-5Hp&Xm;W~s*^)^Ra%S{hY z-1W>Qf~g)gTtld)r35vsb7bsQ&YBkG>M%60L03RpD%vshZ8M+K`uFhj^K+}r)Uh31 zUEPt>tB8z`IQ*`=S9N2Q*a<<&uKH{QimK%Nbkvr1`cTB6Vr21pf6VIbG}-D0>SEAd zxB5_KRR~euV%CV6Lz_ppP+JB#D;N+3xP7&AP@)-J2C}ZeJ(szAdZR5zBVZhMc6QX9 z92^`UKc)_tp@jfBiNT#SKtq%_=CIg!w5gX?wbxt{6<%QNC4-kBi@*}C_1Equ{=F`J z-z#pj-PP~97_m1aQS&eH?8d;yzM5Y|1xVXRyGiTEIUEC56xz6KbyjO|qJZD=akRb9A$<4zme(ri$P2(Pm7Vl_=Z2etm&TvN-4ZgkuD88{jg9<5|4 zJsSfWKwsIusosv}QJz##979H;1~I1SrAD1JCk~6LZcklBho4{6-|9ALn0xZ|XtSCF znCA8e^tg3V@34nG+SdJKtWO8e!q!$vsu>C$+2P8FhKvoWC9wd*v+S@f$Q>fhWHk|T z`lc=wsuG>+J2NRIHR*-}Isc=047)VYpRIH?lo}N}8_v5wv>fwZIs5VO>{-4wWJ+8^ zp=j%!|Kx(7J{eI$jN)R3_p))%<@!-$twgbJaiMHn=I5Ck8?LZQK=6k^xa-fBmOMRX z*2?LCq3W?(S}fAT||sMEvs4q(#W$1p9a+=uhh zEF!Oe9VoAN$^;n;N7^nbDjQV0%iM}`2~P9ewwnv^m`orq<{qcieR&;M<{L_5w1*G5 zHp6v}QxG8`FT2=>KiCt?fGZ?e-EBJ4_Zpb*mGd$W1YCFHORR~qAp%*`4blA|W;RhJ zsgHIGW+LAXYx;HtQ39GBA4qKCD5>zCkiR~sZMANtt$UacPlFv(ySdApQkGxc z{3ZHQIyyST56;Sy6;n$}Gb8<#2VSgcLl$+wvn|H&BCC!w-{vnJYHZ)vRIj{ma{Rl* zT2fMSd&Bn@fzuDrQnUSg7fk7UrOmoBN!MmnS$y{>kjrmdT6q+UVG;$OtgNkTWU|Ia zM=dx>T)t*}q34yY%0OPP;4vQd+@GABtWEY2z07W?#UGWXU91zAiry=2e$`0D?<_TY zaesT6)r1;Vd}YE>!QzXJlh(7CJHpDWrvSG<7gG7XcW(;a<_-H-rkyI_df353iuq@Nwr#98s3tev}0d=P` z8;Wee>a}q6ib!Fkw>eX4E~|Gv&NVEJ^ttTxBGMzni5OkLFmQ0VB2|G$S$VJ7-eTW^ zVuiUsD{v{Z-6E#wK+iiie3;z-m&Y=R1*)jy-+%`3pW*muA*Tw0I21@ArciB4sUNpF zgF#GzFO+Zch@!~Ol? z#^+JVKnC9`x2}b3C3=;>S{PKG!L-l%oUk37SIF9pH{@HojqAnd5Ul`(2tk=E!By4^ zhldpzE?L)JB6)ck853@>h6W9(VUkS?+s4q2xM*h9u~vsw5gVZ#&yP$$vg#HqO^{62 z0l9l6{Fo)~xq+;jM(A1hhWt84nMEj|j~|vc1;QC%7F*7MSpdp?3mI1PsH!}-nJ?Rh zT@UxSXV)#)iP!CV`MpbCz)_6IL~cauQY&}fCMZp>Mz|*haa!Owl*WbbV$)#zQBYLW zK}8)8$HkD4YwRP@cMkN84iqX|YwH1vI*S|oTKhMH)#mn|Dh9DP1ddiWXNJv+_eY{I z-|CwVu@ATrTO!{{M#=L3u$oUhyF3GG-IyZm(#8aNsqoQWa{b8Ct+LK+^nZK+AjH9y zNsX0zF&i^;x-~33-GRejcoC3H5-0E5#tVG?3KuPK*`!u4L2=HmSEVNp5IJlS1 z5Y3YJMJKNUH{&Jh=r9dBO=zenl1q-TS**h zY_YQai|2p@hXdNKymi*Y)F{PO==MH|17$Mh*v7!`7yp=YD&w=y4@zR{#F?>PYdk`E zP}t+HS|N3~%by~&NaXy~B(jM;E*G%RqbhuV>wMq57)~)E<;tkL|wbPib3nOCB zX4@VvYSnd!5=?5eMKYHw@}O9CFSfM=xoX<;ZRe zwr`$!UOmV*bXo`5nm-&UTzUw!q^>0a8V_wGCv?DGmZ!8zuM1I7UvI$$>50(h!h6HR zn!eui*A}*~QH`5W?R#Vcq{0s@O6*lwtILYD>P#Sz(dgt65Dg7VfO>=gPaJFN5QuL! z`A1RbX9{5!dp2n7b!Kiqv?a4*wq=`#+Ido$_X|*jO`BWGDXmstx58|he9*r2>-1dZ zRJIr<(uoU|$K5bRc~Z<)b4eQd<5_Cu;gYUYHJ{GW2#+gba~LI5uEvO2xPs3uG3U@C z??#yyFz__Rc_ZGl8XlGrFU6kZ#`3CW#_f+?O-~1*qAaAh??3lBSNpi;-BO`hhW<;P zvAu3;SSf_i@0K8{vPV)5Tjjr#OpTmEi+ysNnMY{SYCU%xye6|u?C6l*@=&wXWes+D zTG4sTHZe(`Kd!DcaLYT>n#Xxv-tw4mGhsI#cACtYgl~{*54(O3eqphW@{j%s;|@8e z{r8V3*Do1Is(+t{9vNRgUx#p2ObJge^Gs^!>kqs$Oh`C!ybP}x+&?*HSIgO3gJ+Q7 z82*+uE1KO!kWdVsLsj;tWi@|Z4xL#$e>r@Qjrzj3S60;LwA`UuyrYi3uNO>v8)O?W zR6vk3nGR}rSP~hrCnNwjc?2P6(5$}nxzqAbdb|qrzti2A@(v@rlzEHo`uYHo^D-?s zWGL|VrgY&4*Mi(_)9!pwVMaRdBCNMuWdi}T2R`ks`3v*@9R$WR^2V7ve2^T7PE ze(?Q#&mqxj%Zq@?jr+8;GP}QwLc&dBwOYsl9b&@1$1q|n`QV6;If{ch5o02^wu`K& zFP;Ym1c*bP?TRtbtYudswg9mMgJ5%x* zWs}dd?71;|wPmM`zp7da(emS&gx%pcAi>93Zv#0 zomc%)sm5BZ*^aZ@Qldof3Hlfsv7~L$gviHvdUN>Op;}=5++3hd;!ExvdMzxS<19DHT)!UgFq(?8|K5~2 zn}TcdkP>tQ2nxL)f@{ic77D~V3Vl@|Z~kkbJq`iqc)d30ad6wrg!0+*>cG(N#DVf8 zf%GQj?n<_;@=;y~t+aR2So{jhbF1Qe&XJGPVz3ZqSRd`5S$ZTB8nUk_Ob>WGfYSA zH6%b3z1r_S^yg0o6CAI{E}FDgH^N}W7BA1fKiEOXOfe+Cc`F(fcNk%o*Pq(Y`r6O18Xnl=?EtB-`zf;=Jd=zOwS-1L;W< z_*3-sYW(7;f^1khx#cG+Vni#^ALr1kd}ft#9&C(s`gdyDpv&9TA0kEPvP44_wY%Q> zZ?^4UI_KHL7D!6tXUn(c`*h50oZR&rhQI^1^?DWm5Xv|NnB$;#`elY2S3WWrjuKPSF?5LztlK@A=p{!MCiNvWUQTttIJ$5pe-S^qNJNl)dHE(y z+e2|b!_Z!`NTtys(l&mIV@|W|c&;u7_3PlhP`0(KptOg8o(WBK?u*_}Mzy@^NQi9{ z+FkYa%lABrA%49sfxEgX96BCW*qcN3&_OZ0?+FD&u7F|Edy4ZtlXMLD0EW;xekRW3SfAZ?vkCgnCHBMq(d56>z!pS9mR^ECFn zW7cY(cJkqXKE$%G0`CDa`beJyf=hizK3|+&i*SkT%|Rcx)9j!sX;N`vVF(D4_Pu$Z zL>3764#O$HZaxl-I;#b3##-ZoB`U@S0aorTR!W6MLk9KABY2>Ax8 zHosNazZ?oX>4ustY3dg?r}fMEYK^<6y3P7*5c!noOJ1G4q#xzQ%a>fU`5>_$FmarA zP&SzQU3;Ca@2mVX{H(_tb<9#^q;@;oPhVg0wR{M62!k({hZMTHy9yNRTc~3aXecoR zpz~JL@^2)nkolTqi(4rw?aRq{K)c_$EsdA+7O8M;i*_mU{6iDOUr?uwmhnO%6rbA@ z@+Xfr5K+sQI3aoUQRbMnWm)C#aM+Q&szt{ov+s+ouf&ru4$F^nDFgPFYkx?l$OPR; z-k!V0{NSxly=tJK~CfEy5E2^e*I(p`<86lqFf;*55+%n6xL95TpfwH z?^8}1p@|xq!!kpH-I)8wZ^3v8`_c`hi%O8v8LO&$6{38H*MSDT`xJgbbp;yF0z@yX z$W~r}EfrE=ybCXokcKgX4K;r;i~yp9(FVUkFRsDGD2&NxlZx&VG5v{hAdf2z+q9{ZmfXcN4{s0AKw$I@SulFx(K^8U$KlLlsDj5rfTKrSnaky9%gZ`f?RgPpc5)6gGgX-)g-{EbY@b|9s8EcDlOf-CL=VNypCu4!u;DQr! z!8L0|P3q&-gCS_XmBsCW-wAu}{*i!q3z=W(#KfnHg`a0Dsr4+NvHlBk#r->W7-6Y; z&!!}IS)D!VMEods5uDPKnFtGSQL}pU+fRP{4^6TEf}OsE8fKH>mAFuP(s^Pm2cAb) zg_LlQEMu^K3=&()x5d3 zRuMeK-L3*Ah&u9{ZatGF6_?FT@y`KzV_ijX13ForAWsRMQo`g5(z=|QcmaW!mll;5 znbb_&qeap@znhqNW%=Dd!SONN1$bxbUF3(DW#`eW)C1)peP#(e z+w=G2-UaqKwPBd=2$J*nxKyc=8ISuWc5`vKuL#11xACF!z$Z8U zmPhvrU2k9OSh@49FCUHLH8s$$1W!jUvklwjs~3uVX11zL^6~2b&4c3yCs$#`_3=$X zxM2u@mh}D2l~K&^R-fH)IKd@;^JvQpSE3NA$$_x&tn!6&Cko~CGiK$*;^9jc7+>(g z8y67nt2{aGw)d_KR<3S&@4kN~9XhK~QY7xBqjMV?z%Qzz^5m5l#!WTzZgfAT=lS%< zP*U`E#n1Em{$?m|s(9W+EQh^{AxvG?DCx6Md%pWi79U1bNw z3F~Y~P|tkB==fg&Fw)iDr?uFV|+ z>I;R@5soBb2QN;pM^a3i>)Wl!f1AtBsSDZBQxv`+A@HrRagvuV-%Ic@`rQh3RUYC8 zX<7~GR{9Hvrkn?-BfacOUpb6tom&OCk>k`C-?LEX2QcOLvwu~;`(5dFY|LZeD^#=Y zCXpApZdOuj(h}^7yBB)v>1jvz)~y=eTR4Hm*Y+=g=br07W0C+sef@EBu|R!E7P3d8*N!Z6U$9Au}#)imsoax zkEp49fq+7u(r&X!JKei6=_W18(p!k>TT5NE2wi2cO#zghf*f*53nLZuu}hncYaocR z9P}VHMnQ#KrUt_6^81&dO+vK&FciJAXd}$Y=~5auhjcjY#T-1yo5r!d2+K4->j%1Wqm)9IC%E?H{%75Se_wUBPl8h@v>MR zZ@hKb-ioqt4HKvWa=DM+Ei9mz75jloAX?~%xxOZCo)3fi8IuSuXf|YZCfgKt^Fpn z##XT`M=w+!5Etv)U!Nh#TJE*oVE)R%Z|ZUHr&3a0@QUHkdBcjM*bj?4Gd}{m^fR7L zKwXYi8Wu-kw>}$!>5)@WryZ{^%CzPvd=hDuP~KK01`~sLhiJcbED+}+BQ`o9yu=`n z12wVh{)#FTl7$2&aQPWV^gOaamEV1%{^22PE@La{Y~BWb?n%EY*ie1dwcQLo*{beTa&M{fG*^2y~ z&+;f~NtR!#TqH75hR=t%%)1$rXYeFS306f{O1gN#!oGAA8r#7DrYh$+Wnic0tZHO-py7Dux1rUFHI0ANHU9W z)?mz>(v`uBzj>Ir8i^rcD5iGvbBvpS$=m)q7`sHXjecH{l0ud5;mGlBo3{9cZ;T7~ z4?6>(o`!ZxS3Bm9yODhDnbE^Ic8G^1mfC$!vkQj(?)yv3L9V)i_in2)G@%vcO%?uL zdXeugLhUfYM8zIiQz@W$oc`&F@P71Z1~Bkx0}Q{5x~2`s*`n4gVSCPKq`&nICCf-I zC;VeH-xu~ee!DUExJ3W^eQLx<+UUycgDn4-;Y&i$N3^^wKd|L2i)iJdXQS3PXxUx<_cp;_c`cFKKzeSK_~y_=nNsHGQB0 z5GcE#V3OV61&XC;!MvTWMv2Xj%%Yc+ z3LZryeP?pZGDh`@bmcE&TJOdVN~tJ=M?`hYXY{{brva_Im7 literal 0 HcmV?d00001 diff --git a/dev images/Pasted image (3).png b/dev images/Pasted image (3).png new file mode 100644 index 0000000000000000000000000000000000000000..41f2ed0783ea7c2e9f40ff4f4dc4d47dab5a603e GIT binary patch literal 23806 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 R<}v^P002ovPDHLkV1mq3M?L@m literal 0 HcmV?d00001 diff --git a/dev images/Pasted image.png b/dev images/Pasted image.png index 7beeff143f4f013e91868cd6aa3ffbba23565d04..e525c44dd422aa84a2032021eebfe70a0642d240 100644 GIT binary patch literal 41953 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 LNkvXXu0mjf<-Fw9 literal 81590 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 Zj(XGpvE`HUv;cfuG7{g!tHlg{{ttN;90mXY diff --git a/docs/ASSET_PROVENANCE.md b/docs/ASSET_PROVENANCE.md index 9d7df04..df1f1d0 100644 --- a/docs/ASSET_PROVENANCE.md +++ b/docs/ASSET_PROVENANCE.md @@ -10,9 +10,11 @@ project's GNU LGPL v3 license. Rivencraft itself uses the same license. | `assets/rivencraft/textures/gui/notebook_pages.png` | `assets/mystcraft/gui/bookui_pagel.png` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Namespace/path rename only; Notebook draws the native 30×40 page at atlas coordinates `(156, 0)` | | `assets/rivencraft/textures/item/writing_desk.png` | `assets/mystcraft/textures/items/writingdesk.png` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Namespace/path rename only | | `assets/rivencraft/textures/block/writing_desk.png` | `assets/mystcraft/textures/entity/desk.png` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Namespace/path rename only | -| `assets/rivencraft/textures/block/writing_desk_wood.png` and `writing_desk_inlay.png` | `assets/mystcraft/textures/entity/desk.png` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Cropped opaque wood and red inlay regions for the two-block model | | `assets/rivencraft/textures/gui/writing_desk_legacy.png` | `assets/mystcraft/gui/writingdesk.png` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Namespace/path rename only; full desk panel, tabs, and cycling controls at original atlas coordinates | | `assets/rivencraft/textures/gui/scrollbar.png` | `assets/mystcraft/gui/scrollbar.png` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Namespace/path rename only; tiled track and normal/pressed thumb | +| `assets/rivencraft/textures/block/book_binder.png` | `assets/mystcraft/textures/entity/bookbinder/bookbinder.png` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Namespace/path rename only; Book Binder model uses this body texture | +| `assets/rivencraft/textures/block/book_binder_press.png` | `assets/mystcraft/textures/entity/bookbinder/press_part.png` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Namespace/path rename only; Book Binder model uses this press texture | +| `assets/rivencraft/textures/gui/book_binder_legacy.png` | `assets/mystcraft/gui/pagebinder.png` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Namespace/path rename only; Book Binder GUI uses the original 176×181 panel | | `assets/rivencraft/textures/item/linking_book_unwritten.png` | `assets/mystcraft/textures/items/unlinked.png` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Namespace/path rename only | | `assets/rivencraft/textures/item/page_link_panel.png` | `page_background.png` and `PageBuilder.BasicPageSprite` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Reproduces the legacy 160 px scale, black panel at `(25,30)`–`(135,75)`, and 128 px resample | | `assets/rivencraft/textures/item/page_symbol*.png` and `page_unresolved.png` | `page_background.png`, `textures/symbolcomponents.png`, `WordData`, `ModSymbols`, and `PageBuilder.PageSprite` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Static 1.21.1 renditions of the legacy runtime-composed four-word symbol pages; `normal_time` uses the legacy Full Length poem | diff --git a/gradle.properties b/gradle.properties index 25522fb..c3b3bf7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -35,7 +35,7 @@ mod_name=Rivencraft # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=LGPL-3.0-or-later # The mod version. Rivencraft uses the x.y.z.b policy documented in README.md. -mod_version=0.3.6.9 +mod_version=0.3.7.2 immersive_portals_version=6.0.7 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. diff --git a/src/main/java/net/dnorberg/rivencraft/block/BookBinderBlock.java b/src/main/java/net/dnorberg/rivencraft/block/BookBinderBlock.java new file mode 100644 index 0000000..be3837a --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/block/BookBinderBlock.java @@ -0,0 +1,66 @@ +package net.dnorberg.rivencraft.block; + +import com.mojang.serialization.MapCodec; +import net.dnorberg.rivencraft.block.entity.BookBinderBlockEntity; +import net.dnorberg.rivencraft.menu.BookBinderMenu; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.SimpleMenuProvider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.BlockHitResult; + +public final class BookBinderBlock extends BaseEntityBlock { + public static final MapCodec CODEC = simpleCodec(BookBinderBlock::new); + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + + public BookBinderBlock(Properties properties) { + super(properties); + registerDefaultState(stateDefinition.any().setValue(FACING, Direction.NORTH)); + } + + @Override public MapCodec codec() { return CODEC; } + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } + @Override public BlockState getStateForPlacement(BlockPlaceContext context) { + Direction facing = context.getHorizontalDirection().getOpposite(); + return defaultBlockState().setValue(FACING, facing); + } + @Override protected RenderShape getRenderShape(BlockState state) { return RenderShape.MODEL; } + @Override public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new BookBinderBlockEntity(pos, state); + } + @Override protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, + Player player, BlockHitResult hit) { + if (!level.isClientSide && player instanceof ServerPlayer serverPlayer + && level.getBlockEntity(pos) instanceof BookBinderBlockEntity binder) { + serverPlayer.openMenu(new SimpleMenuProvider( + (id, inventory, ignored) -> new BookBinderMenu(id, inventory, binder), + Component.translatable("container.rivencraft.book_binder")), + buffer -> buffer.writeBlockPos(pos)); + } + return InteractionResult.sidedSuccess(level.isClientSide); + } + @Override protected void onRemove(BlockState state, Level level, BlockPos pos, + BlockState replacement, boolean moving) { + if (!state.is(replacement.getBlock()) && !level.isClientSide + && level.getBlockEntity(pos) instanceof BookBinderBlockEntity binder) { + Containers.dropContents(level, pos, binder); + level.updateNeighbourForOutputSignal(pos, this); + } + super.onRemove(state, level, pos, replacement, moving); + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/block/entity/BookBinderBlockEntity.java b/src/main/java/net/dnorberg/rivencraft/block/entity/BookBinderBlockEntity.java new file mode 100644 index 0000000..d0a5872 --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/block/entity/BookBinderBlockEntity.java @@ -0,0 +1,258 @@ +package net.dnorberg.rivencraft.block.entity; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import net.dnorberg.rivencraft.book.AgeReference; +import net.dnorberg.rivencraft.book.AgeRegistrySavedData; +import net.dnorberg.rivencraft.item.PageItem; +import net.dnorberg.rivencraft.registry.ModBlockEntities; +import net.dnorberg.rivencraft.registry.ModDataComponents; +import net.dnorberg.rivencraft.registry.ModItems; +import net.dnorberg.rivencraft.writing.NotebookContents; +import net.dnorberg.rivencraft.writing.OrderedWriting; +import net.dnorberg.rivencraft.writing.PageContent; +import net.dnorberg.rivencraft.writing.WritingEntry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.NonNullList; +import net.minecraft.core.component.DataComponents; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.Container; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.server.level.ServerLevel; + +/** Persistent inputs for a binder; the assembled output is never stored here. */ +public final class BookBinderBlockEntity extends BlockEntity implements Container { + public static final int COVER = 0; + public static final int LINK_PANEL = 1; + public static final int NOTEBOOK = 2; + public static final int FIRST_PAGE = 3; + public static final int PAGE_COUNT = NotebookContents.MAX_PAGES; + public static final int SIZE = FIRST_PAGE + PAGE_COUNT; + public static final int MAX_TITLE_LENGTH = 32; + + private NonNullList items = NonNullList.withSize(SIZE, ItemStack.EMPTY); + private String title = ""; + private UUID pendingAgeId; + + public BookBinderBlockEntity(BlockPos pos, BlockState state) { + super(ModBlockEntities.BOOK_BINDER.get(), pos, state); + } + + public String title() { return title; } + + public void setTitle(String value) { + String normalized = value == null ? "" : value.strip(); + if (normalized.length() > MAX_TITLE_LENGTH) normalized = normalized.substring(0, MAX_TITLE_LENGTH); + if (!normalized.equals(title)) { + title = normalized; + setChanged(); + } + } + + public static boolean validCover(ItemStack stack) { + return stack.is(Items.LEATHER) || stack.is(ModItems.NOTEBOOK.get()) + && stack.getOrDefault(ModDataComponents.NOTEBOOK_CONTENTS.get(), NotebookContents.EMPTY).pageCount() == 0; + } + + private static boolean validPage(ItemStack stack) { + return stack.is(ModItems.PAGE.get()) && PageItem.content(stack).kind() != PageContent.Kind.LINK_PANEL; + } + + @Override public int getContainerSize() { return SIZE; } + @Override public boolean isEmpty() { return items.stream().allMatch(ItemStack::isEmpty); } + @Override public ItemStack getItem(int slot) { return items.get(slot); } + @Override public ItemStack removeItem(int slot, int amount) { + ItemStack removed = ContainerHelper.removeItem(items, slot, amount); + if (!removed.isEmpty()) setChanged(); + return removed; + } + @Override public ItemStack removeItemNoUpdate(int slot) { return ContainerHelper.takeItem(items, slot); } + @Override public void setItem(int slot, ItemStack stack) { + items.set(slot, stack); + if (stack.getCount() > getMaxStackSize()) stack.setCount(getMaxStackSize()); + setChanged(); + } + @Override public boolean canPlaceItem(int slot, ItemStack stack) { + return switch (slot) { + case COVER -> validCover(stack); + case LINK_PANEL -> stack.is(ModItems.PAGE.get()) + && PageItem.content(stack).kind() == PageContent.Kind.LINK_PANEL; + case NOTEBOOK -> stack.is(ModItems.NOTEBOOK.get()); + default -> slot >= FIRST_PAGE && slot < SIZE && validPage(stack); + }; + } + @Override public boolean stillValid(Player player) { + return level != null && level.isLoaded(worldPosition) && level.getBlockEntity(worldPosition) == this + && player.distanceToSqr(worldPosition.getX() + 0.5, worldPosition.getY() + 0.5, + worldPosition.getZ() + 0.5) <= 64.0; + } + + /** All checks precede any mutation so a failed assembly leaves every input intact. */ + public boolean canAssemble() { + if (title.isBlank() || !validCover(items.get(COVER)) + || !canPlaceItem(LINK_PANEL, items.get(LINK_PANEL)) + || items.get(LINK_PANEL).getCount() != 1) return false; + for (int slot = FIRST_PAGE; slot < SIZE; slot++) { + ItemStack page = items.get(slot); + if (!page.isEmpty() && (!validPage(page) || page.getCount() != 1 + || PageItem.content(page).kind() == PageContent.Kind.BLANK)) return false; + } + return true; + } + + public ItemStack previewBook() { + if (!canAssemble()) return ItemStack.EMPTY; + if (pendingAgeId == null) { + pendingAgeId = UUID.randomUUID(); + setChanged(); + } + List entries = new ArrayList<>(); + entries.add(WritingEntry.linkPanel()); + for (int slot = FIRST_PAGE; slot < SIZE; slot++) { + ItemStack page = items.get(slot); + if (!page.isEmpty()) entries.add(WritingEntry.symbol(PageItem.content(page).symbol().orElseThrow())); + } + ItemStack book = new ItemStack(ModItems.DESCRIPTIVE_BOOK.get()); + book.set(ModDataComponents.AGE_REFERENCE.get(), new AgeReference(pendingAgeId, title)); + book.set(ModDataComponents.BOOK_WRITING.get(), new OrderedWriting(entries)); + book.set(DataComponents.CUSTOM_NAME, Component.literal(title)); + return book; + } + + /** Called once, on the server, after the output can be delivered. */ + public boolean consumeAssembly() { + if (!canAssemble()) return false; + if (pendingAgeId == null) pendingAgeId = UUID.randomUUID(); + if (level instanceof ServerLevel serverLevel) + AgeRegistrySavedData.resolveOrCreate(serverLevel, new AgeReference(pendingAgeId, title)); + items.get(COVER).shrink(1); + if (items.get(COVER).isEmpty()) items.set(COVER, ItemStack.EMPTY); + items.get(LINK_PANEL).shrink(1); + if (items.get(LINK_PANEL).isEmpty()) items.set(LINK_PANEL, ItemStack.EMPTY); + for (int slot = FIRST_PAGE; slot < SIZE; slot++) items.set(slot, ItemStack.EMPTY); + title = ""; + pendingAgeId = null; + setChanged(); + return true; + } + + public int nextPageIndex() { + for (int index = PAGE_COUNT - 1; index >= 0; index--) { + if (!items.get(FIRST_PAGE + index).isEmpty()) return index + 1; + } + return 0; + } + + /** Insert before a displayed page, shifting later pages as Legacy's strip does. */ + public boolean insertPage(int index, ItemStack page) { + int end = nextPageIndex(); + if (index < 0 || index > end || end >= PAGE_COUNT || page.getCount() != 1 + || !validPage(page)) return false; + for (int current = end; current > index; current--) + items.set(FIRST_PAGE + current, items.get(FIRST_PAGE + current - 1)); + items.set(FIRST_PAGE + index, page.copy()); + setChanged(); + return true; + } + + /** Take a page back to the cursor, closing the gap in the displayed order. */ + public ItemStack takePage(int index) { + int end = nextPageIndex(); + if (index < 0 || index >= end || items.get(FIRST_PAGE + index).isEmpty()) return ItemStack.EMPTY; + ItemStack removed = items.get(FIRST_PAGE + index); + for (int current = index; current < end - 1; current++) + items.set(FIRST_PAGE + current, items.get(FIRST_PAGE + current + 1)); + items.set(FIRST_PAGE + end - 1, ItemStack.EMPTY); + setChanged(); + return removed; + } + + /** Move every Notebook page as one transaction, leaving its empty cover in the input slot. */ + public boolean importNotebook() { + ItemStack notebook = items.get(NOTEBOOK); + ItemStack emptied = importNotebookFromStack(notebook, nextPageIndex()); + if (emptied.isEmpty()) return false; + items.set(NOTEBOOK, emptied); + setChanged(); + return true; + } + + /** Import a Notebook from either its stored slot or the player's cursor. */ + public ItemStack importNotebookFromStack(ItemStack notebook, int index) { + if (!notebook.is(ModItems.NOTEBOOK.get()) || notebook.getCount() != 1) return ItemStack.EMPTY; + List pages = notebook.getOrDefault(ModDataComponents.NOTEBOOK_CONTENTS.get(), NotebookContents.EMPTY).pages(); + if (pages.isEmpty()) return ItemStack.EMPTY; + int end = nextPageIndex(); + if (index < 0 || index > end) return ItemStack.EMPTY; + boolean link = false; + List writing = new ArrayList<>(); + for (ItemStack page : pages) { + if (page.isEmpty()) continue; + if (!page.is(ModItems.PAGE.get()) || page.getCount() != 1) return ItemStack.EMPTY; + if (PageItem.content(page).kind() == PageContent.Kind.LINK_PANEL) { + if (link || !items.get(LINK_PANEL).isEmpty()) return ItemStack.EMPTY; + link = true; + } else if (validPage(page)) writing.add(page); + else return ItemStack.EMPTY; + } + if (end + writing.size() > PAGE_COUNT || writing.isEmpty() && !link) return ItemStack.EMPTY; + if (link) { + for (ItemStack page : pages) { + if (!page.isEmpty() && PageItem.content(page).kind() == PageContent.Kind.LINK_PANEL) { + items.set(LINK_PANEL, page.copy()); + break; + } + } + } + for (int current = end - 1; current >= index; current--) + items.set(FIRST_PAGE + current + writing.size(), items.get(FIRST_PAGE + current)); + for (ItemStack page : writing) items.set(FIRST_PAGE + index++, page.copy()); + ItemStack emptyNotebook = notebook.copy(); + emptyNotebook.set(ModDataComponents.NOTEBOOK_CONTENTS.get(), NotebookContents.EMPTY); + setChanged(); + return emptyNotebook; + } + + @Override public void clearContent() { + items = NonNullList.withSize(SIZE, ItemStack.EMPTY); + title = ""; + pendingAgeId = null; + setChanged(); + } + @Override protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.loadAdditional(tag, registries); + items = NonNullList.withSize(SIZE, ItemStack.EMPTY); + ContainerHelper.loadAllItems(tag, items, registries); + title = tag.getString("Title"); + pendingAgeId = tag.hasUUID("PendingAgeId") ? tag.getUUID("PendingAgeId") : null; + } + @Override protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); + ContainerHelper.saveAllItems(tag, items, registries); + tag.putString("Title", title); + if (pendingAgeId != null) tag.putUUID("PendingAgeId", pendingAgeId); + } + @Override public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + @Override public CompoundTag getUpdateTag(HolderLookup.Provider registries) { + return saveWithoutMetadata(registries); + } + @Override public void setChanged() { + super.setChanged(); + if (level != null && !level.isClientSide) { + level.sendBlockUpdated(worldPosition, getBlockState(), getBlockState(), 2); + } + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/client/ClientEvents.java b/src/main/java/net/dnorberg/rivencraft/client/ClientEvents.java index 2d580d5..57bff58 100644 --- a/src/main/java/net/dnorberg/rivencraft/client/ClientEvents.java +++ b/src/main/java/net/dnorberg/rivencraft/client/ClientEvents.java @@ -15,6 +15,7 @@ import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; import net.dnorberg.rivencraft.client.screen.NotebookScreen; import net.dnorberg.rivencraft.client.screen.WritingDeskScreen; +import net.dnorberg.rivencraft.client.screen.BookBinderScreen; import net.dnorberg.rivencraft.registry.ModMenus; @EventBusSubscriber(modid = Rivencraft.MOD_ID, value = Dist.CLIENT) @@ -32,6 +33,7 @@ public final class ClientEvents { public static void registerScreens(RegisterMenuScreensEvent event) { event.register(ModMenus.NOTEBOOK.get(), NotebookScreen::new); event.register(ModMenus.WRITING_DESK.get(), WritingDeskScreen::new); + event.register(ModMenus.BOOK_BINDER.get(), BookBinderScreen::new); } @SubscribeEvent diff --git a/src/main/java/net/dnorberg/rivencraft/client/screen/BookBinderScreen.java b/src/main/java/net/dnorberg/rivencraft/client/screen/BookBinderScreen.java new file mode 100644 index 0000000..0aa69cb --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/client/screen/BookBinderScreen.java @@ -0,0 +1,215 @@ +package net.dnorberg.rivencraft.client.screen; + +import net.dnorberg.rivencraft.Rivencraft; +import net.dnorberg.rivencraft.block.entity.BookBinderBlockEntity; +import net.dnorberg.rivencraft.item.PageItem; +import net.dnorberg.rivencraft.menu.BookBinderMenu; +import net.dnorberg.rivencraft.network.SetBookBinderTitlePayload; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.network.PacketDistributor; + +/** Legacy-sized binder: cover and result flank a scrolling strip of full page thumbnails. */ +public final class BookBinderScreen extends AbstractContainerScreen { + private static final ResourceLocation BACKGROUND = ResourceLocation.fromNamespaceAndPath( + Rivencraft.MOD_ID, "textures/gui/book_binder_legacy.png"); + private static final ResourceLocation PAGE_ATLAS = ResourceLocation.fromNamespaceAndPath( + Rivencraft.MOD_ID, "textures/gui/notebook_pages.png"); + private static final int STRIP_X = 7; + private static final int STRIP_Y = 45; + private static final int STRIP_WIDTH = 162; + private static final int STRIP_HEIGHT = 40; + private static final int PAGE_WIDTH = 26; + private static final int PAGE_HEIGHT = 34; + private static final int PAGE_STEP = 28; + private static final int VISIBLE_PAGES = 5; + + private EditBox titleInput; + private int firstVisible; + private boolean stripClickPendingRelease; + + public BookBinderScreen(BookBinderMenu menu, Inventory inventory, Component title) { + super(menu, inventory, title); + imageWidth = 176; + imageHeight = 181; + inventoryLabelX = 8; + inventoryLabelY = 87; + } + + @Override protected void init() { + super.init(); + titleInput = new EditBox(font, leftPos + 9, topPos + 10, 112, 12, + Component.translatable("screen.rivencraft.book_binder.title")); + titleInput.setBordered(false); + titleInput.setTextColor(0xFFFFFFFF); + titleInput.setMaxLength(BookBinderBlockEntity.MAX_TITLE_LENGTH); + titleInput.setValue(menu.title()); + titleInput.setHint(Component.translatable("screen.rivencraft.book_binder.title_hint")); + titleInput.setResponder(value -> PacketDistributor.sendToServer( + new SetBookBinderTitlePayload(menu.containerId, value))); + addRenderableWidget(titleInput); + } + + @Override public void renderBackground(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + renderBg(graphics, partialTick, mouseX, mouseY); + } + + @Override protected void renderBg(GuiGraphics graphics, float partialTick, int mouseX, int mouseY) { + graphics.blit(BACKGROUND, leftPos, topPos, 0, 0, imageWidth, imageHeight, 256, 256); + if (menu.getSlot(BookBinderBlockEntity.LINK_PANEL).getItem().isEmpty()) { + float fade = (System.currentTimeMillis() % 4000L) / 2000F; + if (fade > 1F) fade = 2F - fade; + graphics.blit(BACKGROUND, leftPos + 27, topPos + 26, + 18, 18, 176, 0, 30, 40, 256, 256); + graphics.setColor(1F, 0.3F, 0.3F, 0.8F * fade); + graphics.blit(BACKGROUND, leftPos + 27, topPos + 26, + 18, 18, 176, 0, 30, 40, 256, 256); + graphics.setColor(1F, 1F, 1F, 1F); + } + graphics.fill(leftPos + 7, topPos + 9, leftPos + 123, topPos + 23, 0xFF000000); + graphics.renderOutline(leftPos + 7, topPos + 9, 116, 14, + titleInput == null || titleInput.getValue().isBlank() ? 0xFFFF3030 : 0xFFA0A0A0); + } + + @Override protected void renderLabels(GuiGraphics graphics, int mouseX, int mouseY) { + graphics.drawString(font, playerInventoryTitle, inventoryLabelX, inventoryLabelY, 0xFF404040, false); + } + + @Override public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + super.render(graphics, mouseX, mouseY, partialTick); + firstVisible = Math.min(firstVisible, maxFirstVisible()); + graphics.enableScissor(leftPos + STRIP_X + 8, topPos + STRIP_Y, + leftPos + STRIP_X + STRIP_WIDTH - 8, topPos + STRIP_Y + STRIP_HEIGHT); + int count = visiblePageCount(); + for (int visible = 0; visible < VISIBLE_PAGES; visible++) { + int index = firstVisible + visible; + if (index >= count) break; + drawPage(graphics, pageAtIndex(index), index, + leftPos + 16 + visible * PAGE_STEP, topPos + STRIP_Y + 3); + } + graphics.disableScissor(); + drawScrollEnds(graphics); + if (pageAtIndex(0).isEmpty() && mouseX >= leftPos + 27 && mouseX < leftPos + 45 + && mouseY >= topPos + 26 && mouseY < topPos + 44) { + graphics.renderTooltip(font, + Component.translatable("screen.rivencraft.book_binder.missing_panel"), mouseX, mouseY); + return; + } + int hovered = pageIndexAt(mouseX, mouseY); + if (hovered >= 0 && hovered < displayedPages() && !pageAtIndex(hovered).isEmpty()) + graphics.renderTooltip(font, pageAtIndex(hovered), mouseX, mouseY); + else renderTooltip(graphics, mouseX, mouseY); + } + + private ItemStack pageAtIndex(int index) { + return menu.getSlot(index == 0 ? BookBinderBlockEntity.LINK_PANEL + : BookBinderBlockEntity.FIRST_PAGE + index - 1).getItem(); + } + + private int displayedPages() { + for (int index = BookBinderBlockEntity.PAGE_COUNT; index >= 1; index--) + if (!pageAtIndex(index).isEmpty()) return index + 1; + return pageAtIndex(0).isEmpty() ? 0 : 1; + } + + private int maxFirstVisible() { + return Math.max(0, visiblePageCount() - VISIBLE_PAGES); + } + + private int visiblePageCount() { + return Math.min(BookBinderBlockEntity.PAGE_COUNT + 1, + displayedPages() + (menu.getCarried().isEmpty() ? 0 : 1)); + } + + private void drawPage(GuiGraphics graphics, ItemStack page, int index, int x, int y) { + graphics.blit(PAGE_ATLAS, x, y, PAGE_WIDTH, PAGE_HEIGHT, 156, 0, 30, 40, 256, 256); + if (page.isEmpty()) { + graphics.fill(x, y, x + PAGE_WIDTH, y + PAGE_HEIGHT, 0xAA000000); + return; + } + switch (PageItem.content(page).kind()) { + case BLANK -> { } + case LINK_PANEL -> graphics.fill(x + 5, y + 6, x + 22, y + 17, 0xFF000000); + case SYMBOL, UNRESOLVED_SYMBOL -> graphics.blit(NotebookScreen.symbolTexture(page), + x + 1, y + 5, 24, 24, 16, 16, 96, 96, 128, 128); + } + } + + private void drawScrollEnds(GuiGraphics graphics) { + int x = leftPos + STRIP_X; + int y = topPos + STRIP_Y; + graphics.fill(x, y, x + 8, y + STRIP_HEIGHT, + firstVisible == 0 ? 0x33000000 : 0xAA000000); + graphics.fill(x + STRIP_WIDTH - 8, y, x + STRIP_WIDTH, y + STRIP_HEIGHT, + firstVisible >= maxFirstVisible() ? 0x33000000 : 0xAA000000); + } + + private int pageIndexAt(double mouseX, double mouseY) { + int localX = (int) mouseX - leftPos; + int localY = (int) mouseY - topPos; + if (localX < STRIP_X + 8 || localX >= STRIP_X + STRIP_WIDTH - 8 + || localY < STRIP_Y || localY >= STRIP_Y + STRIP_HEIGHT) return -1; + int visible = (localX - 16) / PAGE_STEP; + if (visible < 0 || visible >= VISIBLE_PAGES) return -1; + return Math.min(firstVisible + visible, BookBinderBlockEntity.PAGE_COUNT); + } + + @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { + int localX = (int) mouseX - leftPos; + int localY = (int) mouseY - topPos; + if ((button == 0 || button == 1) && localY >= STRIP_Y && localY < STRIP_Y + STRIP_HEIGHT + && localX >= STRIP_X && localX < STRIP_X + STRIP_WIDTH) { + stripClickPendingRelease = true; + if (localX < STRIP_X + 8) firstVisible = Math.max(0, firstVisible - 1); + else if (localX >= STRIP_X + STRIP_WIDTH - 8) + firstVisible = Math.min(maxFirstVisible(), firstVisible + 1); + else { + int index = pageIndexAt(mouseX, mouseY); + if (index >= 0 && index <= displayedPages() + && (index < displayedPages() || !menu.getCarried().isEmpty())) + clickStrip(index); + } + return true; + } + return super.mouseClicked(mouseX, mouseY, button); + } + + private void clickStrip(int index) { + if (minecraft != null && minecraft.gameMode != null) + minecraft.gameMode.handleInventoryButtonClick(menu.containerId, + BookBinderMenu.STRIP_CLICK_BASE + index); + } + + @Override public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (stripClickPendingRelease) { + stripClickPendingRelease = false; + return true; + } + return super.mouseReleased(mouseX, mouseY, button); + } + + @Override public boolean mouseScrolled(double mouseX, double mouseY, double scrollX, double scrollY) { + if (mouseX >= leftPos + STRIP_X && mouseX < leftPos + STRIP_X + STRIP_WIDTH + && mouseY >= topPos + STRIP_Y && mouseY < topPos + STRIP_Y + STRIP_HEIGHT) { + firstVisible = Math.clamp(firstVisible - (int) Math.signum(scrollY), 0, maxFirstVisible()); + return true; + } + return super.mouseScrolled(mouseX, mouseY, scrollX, scrollY); + } + + @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (titleInput != null && titleInput.isFocused()) { + if (keyCode == 256) { + setFocused(null); + titleInput.setFocused(false); + } else titleInput.keyPressed(keyCode, scanCode, modifiers); + return true; + } + return super.keyPressed(keyCode, scanCode, modifiers); + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/gametest/BookBinderGameTests.java b/src/main/java/net/dnorberg/rivencraft/gametest/BookBinderGameTests.java new file mode 100644 index 0000000..36e6fc6 --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/gametest/BookBinderGameTests.java @@ -0,0 +1,284 @@ +package net.dnorberg.rivencraft.gametest; + +import java.util.List; +import net.dnorberg.rivencraft.Rivencraft; +import net.dnorberg.rivencraft.block.entity.BookBinderBlockEntity; +import net.dnorberg.rivencraft.book.AgeReference; +import net.dnorberg.rivencraft.book.AgeDimensionService; +import net.dnorberg.rivencraft.book.AgeRegistrySavedData; +import net.dnorberg.rivencraft.item.PageItem; +import net.dnorberg.rivencraft.menu.BookBinderMenu; +import net.dnorberg.rivencraft.registry.ModBlocks; +import net.dnorberg.rivencraft.registry.ModDataComponents; +import net.dnorberg.rivencraft.registry.ModItems; +import net.dnorberg.rivencraft.writing.NotebookContents; +import net.dnorberg.rivencraft.writing.OrderedWriting; +import net.dnorberg.rivencraft.writing.SymbolReference; +import net.dnorberg.rivencraft.writing.WritingEntry; +import net.minecraft.core.BlockPos; +import net.minecraft.gametest.framework.GameTest; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.AABB; +import net.neoforged.neoforge.gametest.GameTestHolder; +import net.neoforged.neoforge.gametest.PrefixGameTestTemplate; + +@GameTestHolder(Rivencraft.MOD_ID) +@PrefixGameTestTemplate(false) +public final class BookBinderGameTests { + private BookBinderGameTests() {} + + private static ItemStack terrainPage() { + return PageItem.createSymbolPage(new SymbolReference( + ResourceLocation.fromNamespaceAndPath(Rivencraft.MOD_ID, "terrain/standard"))); + } + + private static ItemStack weatherPage() { + return PageItem.createSymbolPage(new SymbolReference( + ResourceLocation.fromNamespaceAndPath(Rivencraft.MOD_ID, "weather/normal"))); + } + + private static BookBinderBlockEntity place(GameTestHelper helper) { + BlockPos pos = helper.absolutePos(new BlockPos(1, 1, 1)); + helper.getLevel().setBlock(pos, ModBlocks.BOOK_BINDER.get().defaultBlockState(), 3); + return (BookBinderBlockEntity) helper.getLevel().getBlockEntity(pos); + } + + @GameTest(template = "empty") + public static void binderInputsAndTitleSurviveSaveLoad(GameTestHelper helper) { + BookBinderBlockEntity binder = place(helper); + binder.setTitle("Ordered Age"); + binder.setItem(BookBinderBlockEntity.COVER, new ItemStack(Items.LEATHER)); + binder.setItem(BookBinderBlockEntity.LINK_PANEL, PageItem.createLinkPanelPage()); + binder.setItem(BookBinderBlockEntity.FIRST_PAGE, terrainPage()); + var saved = binder.saveWithoutMetadata(helper.getLevel().registryAccess()); + var restored = new BookBinderBlockEntity(binder.getBlockPos(), binder.getBlockState()); + restored.loadWithComponents(saved, helper.getLevel().registryAccess()); + helper.assertValueEqual(restored.title(), "Ordered Age", "Title must persist"); + helper.assertTrue(restored.getItem(BookBinderBlockEntity.COVER).is(Items.LEATHER), "Cover must persist"); + helper.assertTrue(restored.getItem(BookBinderBlockEntity.LINK_PANEL).is(ModItems.PAGE.get()), + "Link Panel must persist"); + helper.assertTrue(ItemStack.matches(restored.getItem(BookBinderBlockEntity.FIRST_PAGE), terrainPage()), + "Ordered page must persist"); + helper.assertTrue(restored.canAssemble(), "Restored binder must remain ready to assemble"); + AgeReference beforeSave = binder.previewBook().get(ModDataComponents.AGE_REFERENCE.get()); + var previewSaved = binder.saveWithoutMetadata(helper.getLevel().registryAccess()); + restored.loadWithComponents(previewSaved, helper.getLevel().registryAccess()); + helper.assertValueEqual(restored.previewBook().get(ModDataComponents.AGE_REFERENCE.get()), beforeSave, + "Pending Age identity must survive a world restart"); + helper.succeed(); + } + + @GameTest(template = "empty") + public static void assemblyIsAtomicAndRetainsPageOrder(GameTestHelper helper) { + BookBinderBlockEntity binder = place(helper); + binder.setTitle("A New Age"); + binder.setItem(BookBinderBlockEntity.COVER, new ItemStack(Items.LEATHER)); + binder.setItem(BookBinderBlockEntity.FIRST_PAGE, terrainPage()); + binder.setItem(BookBinderBlockEntity.FIRST_PAGE + 1, weatherPage()); + helper.assertFalse(binder.canAssemble(), "Missing Link Panel must prevent assembly"); + helper.assertFalse(binder.consumeAssembly(), "Failure must consume nothing"); + helper.assertTrue(binder.getItem(BookBinderBlockEntity.COVER).is(Items.LEATHER), + "Rejected assembly must preserve cover"); + binder.setItem(BookBinderBlockEntity.LINK_PANEL, PageItem.createLinkPanelPage()); + var player = helper.makeMockServerPlayerInLevel(); + player.moveTo(binder.getBlockPos().getX() + 0.5, binder.getBlockPos().getY() + 0.5, + binder.getBlockPos().getZ() + 0.5); + BookBinderMenu menu = new BookBinderMenu(1, player.getInventory(), binder); + menu.broadcastChanges(); + helper.assertTrue(menu.getSlot(BookBinderMenu.RESULT).hasItem(), "Valid binder must show output"); + menu.clicked(BookBinderMenu.RESULT, 0, ClickType.PICKUP, player); + ItemStack book = menu.getCarried(); + helper.assertTrue(book.is(ModItems.DESCRIPTIVE_BOOK.get()), "Result must be a Descriptive Book"); + AgeReference age = book.get(ModDataComponents.AGE_REFERENCE.get()); + helper.assertTrue(age != null, "Assembled book must already be a written Age book"); + OrderedWriting writing = book.get(ModDataComponents.BOOK_WRITING.get()); + helper.assertTrue(writing != null, "Assembled book must keep its writing"); + helper.assertValueEqual(writing.entries().size(), 3, "Link Panel and two pages must be present"); + helper.assertValueEqual(writing.entries().get(0).kind(), WritingEntry.Kind.LINK_PANEL, + "Link Panel must be first"); + helper.assertValueEqual(writing.entries().get(1).symbol().orElseThrow().id().toString(), + "rivencraft:terrain/standard", "Terrain page order must be preserved"); + helper.assertValueEqual(writing.entries().get(2).symbol().orElseThrow().id().toString(), + "rivencraft:weather/normal", "Weather page order must be preserved"); + helper.assertTrue(AgeRegistrySavedData.get(helper.getLevel()).find(age.id()).isPresent(), + "Taking the completed book must register its random Age definition"); + helper.assertTrue(binder.getItem(BookBinderBlockEntity.COVER).isEmpty(), "Cover must be consumed once"); + helper.assertTrue(binder.getItem(BookBinderBlockEntity.LINK_PANEL).isEmpty(), "Link Panel must be consumed once"); + helper.assertTrue(binder.getItem(BookBinderBlockEntity.FIRST_PAGE).isEmpty(), "Pages must be consumed once"); + menu.broadcastChanges(); + helper.assertTrue(menu.getSlot(BookBinderMenu.RESULT).getItem().isEmpty(), "No duplicate output may remain"); + helper.succeed(); + } + + @GameTest(template = "empty") + public static void linkPanelOnlyCreatesCompletedRandomAgeBook(GameTestHelper helper) { + BookBinderBlockEntity binder = place(helper); + binder.setTitle("Random Binder Age"); + binder.setItem(BookBinderBlockEntity.COVER, new ItemStack(Items.LEATHER)); + binder.setItem(BookBinderBlockEntity.LINK_PANEL, PageItem.createLinkPanelPage()); + var player = helper.makeMockServerPlayerInLevel(); + player.moveTo(binder.getBlockPos().getX() + 0.5, binder.getBlockPos().getY() + 0.5, + binder.getBlockPos().getZ() + 0.5); + BookBinderMenu menu = new BookBinderMenu(1, player.getInventory(), binder); + menu.clicked(BookBinderMenu.RESULT, 0, ClickType.PICKUP, player); + ItemStack book = menu.getCarried(); + AgeReference age = book.get(ModDataComponents.AGE_REFERENCE.get()); + helper.assertTrue(age != null, "Link-Panel-only output must be written, not unwritten"); + helper.assertValueEqual(age.name(), "Random Binder Age", "The assigned title must name the Age"); + helper.assertValueEqual(book.get(ModDataComponents.BOOK_WRITING.get()).entries().size(), 1, + "A random Age book must contain only its Link Panel when no symbols are supplied"); + helper.assertTrue(AgeRegistrySavedData.get(helper.getLevel()).find(age.id()).isPresent(), + "Taking the book must register its random Age definition"); + helper.assertTrue(AgeDimensionService.resolve(player, age).isPresent(), + "The completed book must resolve to a usable random Age"); + helper.succeed(); + } + + @GameTest(template = "empty") + public static void notebookImportPreservesOrderAndRejectsOverflow(GameTestHelper helper) { + BookBinderBlockEntity binder = place(helper); + ItemStack notebook = new ItemStack(ModItems.NOTEBOOK.get()); + notebook.set(ModDataComponents.NOTEBOOK_CONTENTS.get(), new NotebookContents(List.of( + PageItem.createLinkPanelPage(), terrainPage(), weatherPage()))); + binder.setItem(BookBinderBlockEntity.NOTEBOOK, notebook); + helper.assertTrue(binder.importNotebook(), "Notebook pages must import together"); + helper.assertTrue(binder.getItem(BookBinderBlockEntity.LINK_PANEL).is(ModItems.PAGE.get()), + "Imported Link Panel must use its dedicated slot"); + helper.assertTrue(ItemStack.matches(binder.getItem(BookBinderBlockEntity.FIRST_PAGE), terrainPage()), + "First Notebook symbol must stay first"); + helper.assertTrue(ItemStack.matches(binder.getItem(BookBinderBlockEntity.FIRST_PAGE + 1), weatherPage()), + "Second Notebook symbol must stay second"); + helper.assertValueEqual(binder.getItem(BookBinderBlockEntity.NOTEBOOK) + .getOrDefault(ModDataComponents.NOTEBOOK_CONTENTS.get(), NotebookContents.EMPTY).pageCount(), 0, + "Empty Notebook cover must remain recoverable"); + for (int slot = BookBinderBlockEntity.FIRST_PAGE + 2; slot < BookBinderBlockEntity.SIZE; slot++) + binder.setItem(slot, terrainPage()); + ItemStack overflow = new ItemStack(ModItems.NOTEBOOK.get()); + overflow.set(ModDataComponents.NOTEBOOK_CONTENTS.get(), new NotebookContents(List.of(weatherPage()))); + binder.setItem(BookBinderBlockEntity.NOTEBOOK, overflow); + helper.assertFalse(binder.importNotebook(), "Full binder must reject Notebook import"); + helper.assertValueEqual(binder.getItem(BookBinderBlockEntity.NOTEBOOK) + .getOrDefault(ModDataComponents.NOTEBOOK_CONTENTS.get(), NotebookContents.EMPTY).pageCount(), 1, + "Rejected import must preserve the Notebook page"); + helper.succeed(); + } + + @GameTest(template = "empty") + public static void pageControlsAndBreakingPreserveStoredInputs(GameTestHelper helper) { + BookBinderBlockEntity binder = place(helper); + binder.setItem(BookBinderBlockEntity.COVER, new ItemStack(Items.LEATHER)); + binder.setItem(BookBinderBlockEntity.LINK_PANEL, PageItem.createLinkPanelPage()); + binder.setItem(BookBinderBlockEntity.FIRST_PAGE, terrainPage()); + var player = helper.makeMockServerPlayerInLevel(); + player.moveTo(binder.getBlockPos().getX() + 0.5, binder.getBlockPos().getY() + 0.5, + binder.getBlockPos().getZ() + 0.5); + BookBinderMenu menu = new BookBinderMenu(1, player.getInventory(), binder); + helper.assertFalse(menu.clickMenuButton(player, BookBinderMenu.MOVE_PREVIOUS), + "Move without selection must be rejected"); + helper.assertTrue(menu.clickMenuButton(player, BookBinderMenu.SELECT_BASE), "Page selection must succeed"); + helper.assertTrue(menu.clickMenuButton(player, BookBinderMenu.MOVE_NEXT), "Page move must succeed"); + helper.assertTrue(binder.getItem(BookBinderBlockEntity.FIRST_PAGE).isEmpty(), "Old position must be empty"); + helper.assertTrue(ItemStack.matches(binder.getItem(BookBinderBlockEntity.FIRST_PAGE + 1), terrainPage()), + "Moved page must keep its data"); + helper.assertFalse(menu.clickMenuButton(player, 999), "Unknown action must be rejected"); + BlockPos pos = binder.getBlockPos(); + helper.getLevel().setBlock(pos, Blocks.AIR.defaultBlockState(), 3); + helper.assertFalse(menu.stillValid(player), "Removed binder must invalidate the menu"); + var drops = helper.getLevel().getEntitiesOfClass(ItemEntity.class, new AABB(pos).inflate(2)); + int leather = drops.stream().filter(entity -> entity.getItem().is(Items.LEATHER)) + .mapToInt(entity -> entity.getItem().getCount()).sum(); + int pages = drops.stream().filter(entity -> entity.getItem().is(ModItems.PAGE.get())) + .mapToInt(entity -> entity.getItem().getCount()).sum(); + helper.assertValueEqual(leather, 1, "Cover must drop once"); + helper.assertValueEqual(pages, 2, "Link Panel and writing page must drop once each"); + helper.succeed(); + } + + @GameTest(template = "empty") + public static void fullInventoryCannotConsumeBinderInputs(GameTestHelper helper) { + BookBinderBlockEntity binder = place(helper); + binder.setTitle("Full Inventory"); + binder.setItem(BookBinderBlockEntity.COVER, new ItemStack(Items.LEATHER)); + binder.setItem(BookBinderBlockEntity.LINK_PANEL, PageItem.createLinkPanelPage()); + var player = helper.makeMockServerPlayerInLevel(); + player.moveTo(binder.getBlockPos().getX() + 0.5, binder.getBlockPos().getY() + 0.5, + binder.getBlockPos().getZ() + 0.5); + for (int slot = 0; slot < 36; slot++) + player.getInventory().setItem(slot, new ItemStack(Items.COBBLESTONE, 64)); + BookBinderMenu menu = new BookBinderMenu(1, player.getInventory(), binder); + helper.assertTrue(menu.quickMoveStack(player, BookBinderMenu.RESULT).isEmpty(), + "Full inventory must reject output transfer"); + helper.assertTrue(binder.getItem(BookBinderBlockEntity.COVER).is(Items.LEATHER), + "Rejected transfer must preserve cover"); + helper.assertTrue(binder.getItem(BookBinderBlockEntity.LINK_PANEL).is(ModItems.PAGE.get()), + "Rejected transfer must preserve Link Panel"); + helper.assertTrue(menu.getSlot(BookBinderMenu.RESULT).hasItem(), + "Result must remain available after inventory space is freed"); + helper.assertFalse(menu.setTitle(player, "A title that is much too long for the binder slot"), + "Oversized title packet must be rejected"); + helper.assertValueEqual(binder.title(), "Full Inventory", "Rejected title must preserve existing title"); + helper.succeed(); + } + + @GameTest(template = "empty") + public static void legacyStripInsertsAndRemovesPagesInOrder(GameTestHelper helper) { + BookBinderBlockEntity binder = place(helper); + var player = helper.makeMockServerPlayerInLevel(); + player.moveTo(binder.getBlockPos().getX() + 0.5, binder.getBlockPos().getY() + 0.5, + binder.getBlockPos().getZ() + 0.5); + BookBinderMenu menu = new BookBinderMenu(1, player.getInventory(), binder); + menu.setCarried(PageItem.createLinkPanelPage()); + helper.assertTrue(menu.clickMenuButton(player, BookBinderMenu.STRIP_CLICK_BASE), + "The first thumbnail must accept a Link Panel"); + helper.assertTrue(menu.getCarried().isEmpty(), "Inserted panel must leave the cursor"); + menu.setCarried(terrainPage()); + helper.assertTrue(menu.clickMenuButton(player, BookBinderMenu.STRIP_CLICK_BASE + 1), + "The strip must accept a written Page"); + menu.setCarried(weatherPage()); + helper.assertTrue(menu.clickMenuButton(player, BookBinderMenu.STRIP_CLICK_BASE + 1), + "Inserting before a Page must shift it right"); + helper.assertTrue(ItemStack.matches(binder.getItem(BookBinderBlockEntity.FIRST_PAGE), weatherPage()), + "Inserted Page must be first"); + helper.assertTrue(ItemStack.matches(binder.getItem(BookBinderBlockEntity.FIRST_PAGE + 1), terrainPage()), + "Existing Page must move right"); + helper.assertTrue(menu.clickMenuButton(player, BookBinderMenu.STRIP_CLICK_BASE + 1), + "Clicking a thumbnail with an empty cursor must take the Page"); + helper.assertTrue(ItemStack.matches(menu.getCarried(), weatherPage()), + "Removed Page must return to the cursor"); + helper.assertTrue(ItemStack.matches(binder.getItem(BookBinderBlockEntity.FIRST_PAGE), terrainPage()), + "Removal must close the gap"); + helper.assertFalse(menu.clickMenuButton(player, BookBinderMenu.STRIP_CLICK_BASE), + "A symbol Page must not replace the Link Panel"); + helper.succeed(); + } + + @GameTest(template = "empty") + public static void legacyStripImportsNotebookAtClickedPosition(GameTestHelper helper) { + BookBinderBlockEntity binder = place(helper); + binder.setItem(BookBinderBlockEntity.LINK_PANEL, PageItem.createLinkPanelPage()); + binder.setItem(BookBinderBlockEntity.FIRST_PAGE, terrainPage()); + var player = helper.makeMockServerPlayerInLevel(); + player.moveTo(binder.getBlockPos().getX() + 0.5, binder.getBlockPos().getY() + 0.5, + binder.getBlockPos().getZ() + 0.5); + BookBinderMenu menu = new BookBinderMenu(1, player.getInventory(), binder); + ItemStack notebook = new ItemStack(ModItems.NOTEBOOK.get()); + notebook.set(ModDataComponents.NOTEBOOK_CONTENTS.get(), new NotebookContents(List.of(weatherPage()))); + menu.setCarried(notebook); + helper.assertTrue(menu.clickMenuButton(player, BookBinderMenu.STRIP_CLICK_BASE + 1), + "Notebook pages must import where clicked"); + helper.assertValueEqual(menu.getCarried().getOrDefault( + ModDataComponents.NOTEBOOK_CONTENTS.get(), NotebookContents.EMPTY).pageCount(), 0, + "The empty Notebook must remain on the cursor"); + helper.assertTrue(ItemStack.matches(binder.getItem(BookBinderBlockEntity.FIRST_PAGE), weatherPage()), + "Imported Page must occupy the clicked position"); + helper.assertTrue(ItemStack.matches(binder.getItem(BookBinderBlockEntity.FIRST_PAGE + 1), terrainPage()), + "Existing Page must shift right"); + helper.succeed(); + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/menu/BookBinderMenu.java b/src/main/java/net/dnorberg/rivencraft/menu/BookBinderMenu.java new file mode 100644 index 0000000..46065f2 --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/menu/BookBinderMenu.java @@ -0,0 +1,224 @@ +package net.dnorberg.rivencraft.menu; + +import net.dnorberg.rivencraft.block.entity.BookBinderBlockEntity; +import net.dnorberg.rivencraft.item.PageItem; +import net.dnorberg.rivencraft.registry.ModItems; +import net.dnorberg.rivencraft.registry.ModMenus; +import net.dnorberg.rivencraft.writing.PageContent; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.DataSlot; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; + +/** Fixed, ordered binder slots and a server-owned virtual result. */ +public final class BookBinderMenu extends AbstractContainerMenu { + public static final int RESULT = BookBinderBlockEntity.SIZE; + public static final int SELECT_BASE = 100; + public static final int MOVE_PREVIOUS = 200; + public static final int MOVE_NEXT = 201; + public static final int IMPORT_NOTEBOOK = 202; + public static final int STRIP_CLICK_BASE = 300; + private static final int PLAYER_START = RESULT + 1; + + private final BookBinderBlockEntity binder; + private final Container inputs; + private final SimpleContainer result = new SimpleContainer(1); + private final boolean clientSide; + private int selectedPage = -1; + + public BookBinderMenu(int id, Inventory inventory, RegistryFriendlyByteBuf data) { + this(id, inventory, inventory.player.level().getBlockEntity(data.readBlockPos()) + instanceof BookBinderBlockEntity found ? found : null); + } + + public BookBinderMenu(int id, Inventory inventory, BookBinderBlockEntity binder) { + super(ModMenus.BOOK_BINDER.get(), id); + this.binder = binder; + inputs = binder == null ? new SimpleContainer(BookBinderBlockEntity.SIZE) : binder; + clientSide = inventory.player.level().isClientSide; + addDataSlot(new DataSlot() { + @Override public int get() { return selectedPage; } + @Override public void set(int value) { selectedPage = value; } + }); + addSlot(new BinderSlot(BookBinderBlockEntity.COVER, 8, 27, 64)); + addSlot(new BinderSlot(BookBinderBlockEntity.LINK_PANEL, -1000, -1000, 1)); + addSlot(new BinderSlot(BookBinderBlockEntity.NOTEBOOK, -1000, -1000, 1)); + for (int page = 0; page < BookBinderBlockEntity.PAGE_COUNT; page++) { + addSlot(new BinderSlot(BookBinderBlockEntity.FIRST_PAGE + page, -1000, -1000, 1)); + } + addSlot(new ResultSlot(result, 0, 152, 27)); + for (int row = 0; row < 3; row++) { + for (int column = 0; column < 9; column++) { + addSlot(new Slot(inventory, column + row * 9 + 9, 8 + column * 18, 99 + row * 18)); + } + } + for (int column = 0; column < 9; column++) { + addSlot(new Slot(inventory, column, 8 + column * 18, 157)); + } + refreshResult(); + } + + public int selectedPage() { return selectedPage; } + public String title() { return binder == null ? "" : binder.title(); } + public boolean setTitle(Player player, String title) { + if (clientSide || !stillValid(player) || title == null + || title.length() > BookBinderBlockEntity.MAX_TITLE_LENGTH) return false; + binder.setTitle(title); + refreshResult(); + broadcastChanges(); + return true; + } + + @Override public boolean stillValid(Player player) { + return binder != null && binder.stillValid(player); + } + + @Override public boolean clickMenuButton(Player player, int id) { + if (clientSide || !stillValid(player)) return false; + if (id >= STRIP_CLICK_BASE && id <= STRIP_CLICK_BASE + BookBinderBlockEntity.PAGE_COUNT) { + if (!clickStrip(id - STRIP_CLICK_BASE)) return false; + } else if (id >= SELECT_BASE && id < SELECT_BASE + BookBinderBlockEntity.PAGE_COUNT) { + selectedPage = id - SELECT_BASE; + } else if (id == MOVE_PREVIOUS || id == MOVE_NEXT) { + int target = selectedPage + (id == MOVE_PREVIOUS ? -1 : 1); + if (selectedPage < 0 || target < 0 || target >= BookBinderBlockEntity.PAGE_COUNT + || binder.getItem(BookBinderBlockEntity.FIRST_PAGE + selectedPage).isEmpty() + || !getCarried().isEmpty()) return false; + int fromSlot = BookBinderBlockEntity.FIRST_PAGE + selectedPage; + int toSlot = BookBinderBlockEntity.FIRST_PAGE + target; + ItemStack from = binder.getItem(fromSlot); + ItemStack to = binder.getItem(toSlot); + binder.setItem(fromSlot, to); + binder.setItem(toSlot, from); + selectedPage = target; + } else if (id == IMPORT_NOTEBOOK) { + if (!binder.importNotebook()) return false; + } else return false; + refreshResult(); + broadcastChanges(); + return true; + } + + private boolean clickStrip(int index) { + ItemStack carried = getCarried(); + if (carried.is(ModItems.NOTEBOOK.get())) { + ItemStack emptied = binder.importNotebookFromStack(carried, Math.min(index == 0 ? 0 : index - 1, + binder.nextPageIndex())); + if (emptied.isEmpty()) return false; + setCarried(emptied); + return true; + } + if (!carried.isEmpty()) { + if (index == 0) { + if (!binder.getItem(BookBinderBlockEntity.LINK_PANEL).isEmpty() + || !binder.canPlaceItem(BookBinderBlockEntity.LINK_PANEL, carried)) return false; + binder.setItem(BookBinderBlockEntity.LINK_PANEL, carried.copyWithCount(1)); + } else if (!binder.insertPage(index - 1, carried.copyWithCount(1))) return false; + ItemStack remainder = carried.copy(); + remainder.shrink(1); + setCarried(remainder); + return true; + } + ItemStack removed; + if (index == 0) { + removed = binder.removeItem(BookBinderBlockEntity.LINK_PANEL, 1); + } else { + removed = binder.takePage(index - 1); + } + if (removed.isEmpty()) return false; + setCarried(removed); + return true; + } + + @Override public ItemStack quickMoveStack(Player player, int index) { + if (!stillValid(player) || index < 0 || index >= slots.size()) return ItemStack.EMPTY; + if (index == RESULT) { + refreshResult(); + if (!binder.canAssemble()) return ItemStack.EMPTY; + ItemStack book = binder.previewBook(); + ItemStack remainder = book.copy(); + if (!moveItemStackTo(remainder, PLAYER_START, slots.size(), true) || !remainder.isEmpty()) { + return ItemStack.EMPTY; + } + binder.consumeAssembly(); + refreshResult(); + return book; + } + Slot sourceSlot = slots.get(index); + if (!sourceSlot.hasItem()) return ItemStack.EMPTY; + ItemStack source = sourceSlot.getItem(); + ItemStack original = source.copy(); + boolean moved; + if (index < RESULT) { + moved = moveItemStackTo(source, PLAYER_START, slots.size(), true); + } else if (source.is(Items.LEATHER) || BookBinderBlockEntity.validCover(source)) { + moved = moveItemStackTo(source, BookBinderBlockEntity.COVER, BookBinderBlockEntity.COVER + 1, false); + } else if (source.is(ModItems.NOTEBOOK.get())) { + ItemStack emptied = binder.importNotebookFromStack(source, binder.nextPageIndex()); + if (emptied.isEmpty()) return ItemStack.EMPTY; + sourceSlot.setByPlayer(emptied); + refreshResult(); + return original; + } else if (source.is(ModItems.PAGE.get()) + && PageItem.content(source).kind() == PageContent.Kind.LINK_PANEL) { + moved = moveItemStackTo(source, BookBinderBlockEntity.LINK_PANEL, + BookBinderBlockEntity.LINK_PANEL + 1, false); + } else if (source.is(ModItems.PAGE.get())) { + moved = moveItemStackTo(source, BookBinderBlockEntity.FIRST_PAGE, RESULT, false); + } else moved = false; + if (!moved) return ItemStack.EMPTY; + if (source.isEmpty()) sourceSlot.setByPlayer(ItemStack.EMPTY); + else sourceSlot.setChanged(); + refreshResult(); + return original; + } + + @Override public void clicked(int slotId, int button, ClickType clickType, Player player) { + if (!stillValid(player)) { + player.closeContainer(); + return; + } + refreshResult(); + super.clicked(slotId, button, clickType, player); + } + + @Override public void broadcastChanges() { + refreshResult(); + super.broadcastChanges(); + } + + private void refreshResult() { + if (clientSide) return; + ItemStack preview = binder == null ? ItemStack.EMPTY : binder.previewBook(); + if (!ItemStack.matches(result.getItem(0), preview)) result.setItem(0, preview); + } + + private final class BinderSlot extends Slot { + private final int capacity; + private BinderSlot(int index, int x, int y, int capacity) { + super(inputs, index, x, y); + this.capacity = capacity; + } + @Override public boolean mayPlace(ItemStack stack) { return inputs.canPlaceItem(getContainerSlot(), stack); } + @Override public int getMaxStackSize() { return capacity; } + } + + private final class ResultSlot extends Slot { + private ResultSlot(Container container, int index, int x, int y) { super(container, index, x, y); } + @Override public boolean mayPlace(ItemStack stack) { return false; } + @Override public boolean mayPickup(Player player) { + return clientSide ? hasItem() : stillValid(player) && binder.canAssemble(); + } + @Override public void onTake(Player player, ItemStack stack) { + if (!clientSide && binder.consumeAssembly()) refreshResult(); + super.onTake(player, stack); + } + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/network/ModNetworking.java b/src/main/java/net/dnorberg/rivencraft/network/ModNetworking.java index ade2596..74a94f3 100644 --- a/src/main/java/net/dnorberg/rivencraft/network/ModNetworking.java +++ b/src/main/java/net/dnorberg/rivencraft/network/ModNetworking.java @@ -13,6 +13,7 @@ import net.dnorberg.rivencraft.client.ClientWritingDeskCatalog; import net.dnorberg.rivencraft.event.AgeCelestialAngleSync; import net.dnorberg.rivencraft.item.DescriptiveBookItem; import net.dnorberg.rivencraft.item.LinkingBookItem; +import net.dnorberg.rivencraft.menu.BookBinderMenu; import net.dnorberg.rivencraft.registry.ModDataComponents; import net.dnorberg.rivencraft.registry.ModItems; import net.minecraft.core.component.DataComponents; @@ -49,7 +50,7 @@ public final class ModNetworking { } public static void register(RegisterPayloadHandlersEvent event) { - PayloadRegistrar registrar = event.registrar("11"); + PayloadRegistrar registrar = event.registrar("12"); registrar.playToServer(RequestDescriptiveBookScreenPayload.TYPE, RequestDescriptiveBookScreenPayload.STREAM_CODEC, ModNetworking::requestDescriptiveBookScreen); registrar.playToClient(OpenDescriptiveBookScreenPayload.TYPE, OpenDescriptiveBookScreenPayload.STREAM_CODEC, @@ -71,6 +72,16 @@ public final class ModNetworking { ClientAgeCelestialAngles::handle); registrar.playToClient(WritingDeskCatalogPayload.TYPE, WritingDeskCatalogPayload.STREAM_CODEC, ClientWritingDeskCatalog::handle); + registrar.playToServer(SetBookBinderTitlePayload.TYPE, SetBookBinderTitlePayload.STREAM_CODEC, + ModNetworking::setBookBinderTitle); + } + + private static void setBookBinderTitle(SetBookBinderTitlePayload payload, IPayloadContext context) { + if (context.player() instanceof ServerPlayer player + && player.containerMenu instanceof BookBinderMenu menu + && menu.containerId == payload.containerId()) { + menu.setTitle(player, payload.title()); + } } private static void requestDescriptiveBookScreen(RequestDescriptiveBookScreenPayload payload, IPayloadContext context) { diff --git a/src/main/java/net/dnorberg/rivencraft/network/SetBookBinderTitlePayload.java b/src/main/java/net/dnorberg/rivencraft/network/SetBookBinderTitlePayload.java new file mode 100644 index 0000000..a48766b --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/network/SetBookBinderTitlePayload.java @@ -0,0 +1,19 @@ +package net.dnorberg.rivencraft.network; + +import net.dnorberg.rivencraft.Rivencraft; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public record SetBookBinderTitlePayload(int containerId, String title) implements CustomPacketPayload { + public static final Type TYPE = new Type<>( + ResourceLocation.fromNamespaceAndPath(Rivencraft.MOD_ID, "set_book_binder_title")); + public static final StreamCodec STREAM_CODEC = + StreamCodec.composite(ByteBufCodecs.VAR_INT, SetBookBinderTitlePayload::containerId, + ByteBufCodecs.STRING_UTF8, SetBookBinderTitlePayload::title, + SetBookBinderTitlePayload::new); + + @Override public Type type() { return TYPE; } +} diff --git a/src/main/java/net/dnorberg/rivencraft/registry/ModBlockEntities.java b/src/main/java/net/dnorberg/rivencraft/registry/ModBlockEntities.java index e335cd3..11aacd6 100644 --- a/src/main/java/net/dnorberg/rivencraft/registry/ModBlockEntities.java +++ b/src/main/java/net/dnorberg/rivencraft/registry/ModBlockEntities.java @@ -2,6 +2,7 @@ package net.dnorberg.rivencraft.registry; import net.dnorberg.rivencraft.Rivencraft; import net.dnorberg.rivencraft.block.entity.BookStandBlockEntity; +import net.dnorberg.rivencraft.block.entity.BookBinderBlockEntity; import net.dnorberg.rivencraft.block.entity.WritingDeskBlockEntity; import net.minecraft.core.registries.Registries; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -20,6 +21,9 @@ public final class ModBlockEntities { public static final DeferredHolder, BlockEntityType> WRITING_DESK = BLOCK_ENTITIES.register("writing_desk", () -> BlockEntityType.Builder .of(WritingDeskBlockEntity::new, ModBlocks.WRITING_DESK.get()).build(null)); + public static final DeferredHolder, BlockEntityType> BOOK_BINDER = + BLOCK_ENTITIES.register("book_binder", () -> BlockEntityType.Builder + .of(BookBinderBlockEntity::new, ModBlocks.BOOK_BINDER.get()).build(null)); private ModBlockEntities() { } diff --git a/src/main/java/net/dnorberg/rivencraft/registry/ModBlocks.java b/src/main/java/net/dnorberg/rivencraft/registry/ModBlocks.java index 5ecd3f5..e0fd842 100644 --- a/src/main/java/net/dnorberg/rivencraft/registry/ModBlocks.java +++ b/src/main/java/net/dnorberg/rivencraft/registry/ModBlocks.java @@ -2,6 +2,7 @@ package net.dnorberg.rivencraft.registry; import net.dnorberg.rivencraft.Rivencraft; import net.dnorberg.rivencraft.block.BookStandBlock; +import net.dnorberg.rivencraft.block.BookBinderBlock; import net.dnorberg.rivencraft.block.WritingDeskBlock; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockBehaviour; @@ -21,6 +22,10 @@ public final class ModBlocks { "writing_desk", WritingDeskBlock::new, BlockBehaviour.Properties.ofFullCopy(Blocks.CRAFTING_TABLE).noOcclusion() ); + public static final DeferredBlock BOOK_BINDER = BLOCKS.registerBlock( + "book_binder", BookBinderBlock::new, + BlockBehaviour.Properties.ofFullCopy(Blocks.CRAFTING_TABLE).noOcclusion() + ); private ModBlocks() { } diff --git a/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java b/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java index 2f5891c..9aca6a8 100644 --- a/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java +++ b/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java @@ -23,6 +23,7 @@ public final class ModCreativeTabs { output.accept(ModItems.NOTEBOOK.get()); output.accept(ModItems.INK_VIAL.get()); output.accept(ModItems.WRITING_DESK.get()); + output.accept(ModItems.BOOK_BINDER.get()); }) .build()); diff --git a/src/main/java/net/dnorberg/rivencraft/registry/ModDataComponents.java b/src/main/java/net/dnorberg/rivencraft/registry/ModDataComponents.java index e41f4f4..636225f 100644 --- a/src/main/java/net/dnorberg/rivencraft/registry/ModDataComponents.java +++ b/src/main/java/net/dnorberg/rivencraft/registry/ModDataComponents.java @@ -5,6 +5,7 @@ import net.dnorberg.rivencraft.book.LinkTarget; import net.dnorberg.rivencraft.book.AgeReference; import net.dnorberg.rivencraft.writing.PageContent; import net.dnorberg.rivencraft.writing.NotebookContents; +import net.dnorberg.rivencraft.writing.OrderedWriting; import net.dnorberg.rivencraft.writing.SymbolDisplayMetadata; import com.mojang.serialization.Codec; import net.minecraft.core.component.DataComponentType; @@ -61,6 +62,12 @@ public final class ModDataComponents { .networkSynchronized(NotebookContents.STREAM_CODEC) .cacheEncoding() .build()); + public static final DeferredHolder, DataComponentType> BOOK_WRITING = + DATA_COMPONENTS.register("book_writing", () -> DataComponentType.builder() + .persistent(OrderedWriting.CODEC) + .networkSynchronized(OrderedWriting.STREAM_CODEC) + .cacheEncoding() + .build()); public static final DeferredHolder, DataComponentType> INK_REMAINING = DATA_COMPONENTS.register("ink_remaining", () -> DataComponentType.builder() .persistent(Codec.intRange(0, 16)) diff --git a/src/main/java/net/dnorberg/rivencraft/registry/ModItems.java b/src/main/java/net/dnorberg/rivencraft/registry/ModItems.java index 4751d04..8f48b2a 100644 --- a/src/main/java/net/dnorberg/rivencraft/registry/ModItems.java +++ b/src/main/java/net/dnorberg/rivencraft/registry/ModItems.java @@ -41,6 +41,7 @@ public final class ModItems { new Item.Properties().stacksTo(16) ); public static final DeferredItem WRITING_DESK = ITEMS.registerSimpleBlockItem(ModBlocks.WRITING_DESK); + public static final DeferredItem BOOK_BINDER = ITEMS.registerSimpleBlockItem(ModBlocks.BOOK_BINDER); private ModItems() { } diff --git a/src/main/java/net/dnorberg/rivencraft/registry/ModMenus.java b/src/main/java/net/dnorberg/rivencraft/registry/ModMenus.java index 757703b..aff506f 100644 --- a/src/main/java/net/dnorberg/rivencraft/registry/ModMenus.java +++ b/src/main/java/net/dnorberg/rivencraft/registry/ModMenus.java @@ -3,6 +3,7 @@ package net.dnorberg.rivencraft.registry; import net.dnorberg.rivencraft.Rivencraft; import net.dnorberg.rivencraft.menu.NotebookMenu; import net.dnorberg.rivencraft.menu.WritingDeskMenu; +import net.dnorberg.rivencraft.menu.BookBinderMenu; import net.minecraft.core.registries.Registries; import net.minecraft.world.inventory.MenuType; import net.neoforged.bus.api.IEventBus; @@ -18,6 +19,8 @@ public final class ModMenus { MENUS.register("notebook", () -> IMenuTypeExtension.create(NotebookMenu::new)); public static final DeferredHolder, MenuType> WRITING_DESK = MENUS.register("writing_desk", () -> IMenuTypeExtension.create(WritingDeskMenu::new)); + public static final DeferredHolder, MenuType> BOOK_BINDER = + MENUS.register("book_binder", () -> IMenuTypeExtension.create(BookBinderMenu::new)); private ModMenus() { } diff --git a/src/main/resources/assets/rivencraft/blockstates/book_binder.json b/src/main/resources/assets/rivencraft/blockstates/book_binder.json new file mode 100644 index 0000000..8ea80dd --- /dev/null +++ b/src/main/resources/assets/rivencraft/blockstates/book_binder.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": {"model":"rivencraft:block/book_binder"}, + "facing=east": {"model":"rivencraft:block/book_binder","y":90}, + "facing=south": {"model":"rivencraft:block/book_binder","y":180}, + "facing=west": {"model":"rivencraft:block/book_binder","y":270} + } +} diff --git a/src/main/resources/assets/rivencraft/lang/en_us.json b/src/main/resources/assets/rivencraft/lang/en_us.json index 7fab302..34ec84e 100644 --- a/src/main/resources/assets/rivencraft/lang/en_us.json +++ b/src/main/resources/assets/rivencraft/lang/en_us.json @@ -18,6 +18,17 @@ "item.rivencraft.ink_vial": "Ink Vial", "block.rivencraft.writing_desk": "Writing Desk", "container.rivencraft.writing_desk": "Writing Desk", + "block.rivencraft.book_binder": "Book Binder", + "container.rivencraft.book_binder": "Book Binder", + "screen.rivencraft.book_binder.title": "Book title", + "screen.rivencraft.book_binder.title_hint": "Name the book", + "screen.rivencraft.book_binder.missing_panel": "Link Panel required as the first page", + "screen.rivencraft.book_binder.cover": "Cover · Link Panel · Notebook", + "screen.rivencraft.book_binder.import": "Import Notebook", + "screen.rivencraft.book_binder.import.tooltip": "Move all Notebook pages into the binder in order", + "screen.rivencraft.book_binder.move_previous": "Move selected page left", + "screen.rivencraft.book_binder.move_next": "Move selected page right", + "screen.rivencraft.book_binder.select_hint": "Right-click page to select", "screen.rivencraft.writing_desk.ink": "Ink: %s/%s", "screen.rivencraft.writing_desk.search": "Search", "screen.rivencraft.writing_desk.no_symbols": "No available symbols", diff --git a/src/main/resources/assets/rivencraft/models/block/book_binder.json b/src/main/resources/assets/rivencraft/models/block/book_binder.json new file mode 100644 index 0000000..6061d43 --- /dev/null +++ b/src/main/resources/assets/rivencraft/models/block/book_binder.json @@ -0,0 +1,61 @@ +{ + "parent": "minecraft:block/block", + "textures": { + "particle": "rivencraft:block/book_binder", + "body": "rivencraft:block/book_binder", + "press": "rivencraft:block/book_binder_press" + }, + "elements": [ + { + "from": [0, 0, 0], "to": [16, 10, 16], + "faces": { + "north": {"texture":"#body","uv":[0,4,4,6.5]}, + "east": {"texture":"#body","uv":[4,4,8,6.5]}, + "south": {"texture":"#body","uv":[8,4,12,6.5]}, + "west": {"texture":"#body","uv":[12,4,16,6.5]}, + "up": {"texture":"#body","uv":[4,0,8,4]}, + "down": {"texture":"#body","uv":[8,0,12,4]} + } + }, + { + "from": [0, 10, 1], "to": [3, 14, 15], + "faces": { + "north": {"texture":"#press","uv":[0,4,1.5,6]}, + "east": {"texture":"#press","uv":[0,0,7,2]}, + "south": {"texture":"#press","uv":[2,4,3.5,6]}, + "west": {"texture":"#press","uv":[0,2,7,4]}, + "up": {"texture":"#press","uv":[7,0,8.5,6]}, + "down": {"texture":"#press","uv":[8.5,0,10,7]} + } + }, + { + "from": [13, 10, 1], "to": [16, 14, 15], + "faces": { + "north": {"texture":"#press","uv":[0,4,1.5,6]}, + "east": {"texture":"#press","uv":[0,0,7,2]}, + "south": {"texture":"#press","uv":[2,4,3.5,6]}, + "west": {"texture":"#press","uv":[0,2,7,4]}, + "up": {"texture":"#press","uv":[7,0,8.5,6]}, + "down": {"texture":"#press","uv":[8.5,0,10,7]} + } + }, + { + "from": [3, 11, 3], "to": [13, 12, 4], + "faces": { + "north": {"texture":"#press","uv":[1,15.5,6,16]}, + "south": {"texture":"#press","uv":[7,15.5,12,16]}, + "up": {"texture":"#press","uv":[0.5,15,5.5,15.5]}, + "down": {"texture":"#press","uv":[5.5,15,10.5,15.5]} + } + }, + { + "from": [3, 11, 12], "to": [13, 12, 13], + "faces": { + "north": {"texture":"#press","uv":[1,15.5,6,16]}, + "south": {"texture":"#press","uv":[7,15.5,12,16]}, + "up": {"texture":"#press","uv":[0.5,15,5.5,15.5]}, + "down": {"texture":"#press","uv":[5.5,15,10.5,15.5]} + } + } + ] +} diff --git a/src/main/resources/assets/rivencraft/models/item/book_binder.json b/src/main/resources/assets/rivencraft/models/item/book_binder.json new file mode 100644 index 0000000..3619e0a --- /dev/null +++ b/src/main/resources/assets/rivencraft/models/item/book_binder.json @@ -0,0 +1,3 @@ +{ + "parent": "rivencraft:block/book_binder" +} diff --git a/src/main/resources/assets/rivencraft/textures/block/book_binder.png b/src/main/resources/assets/rivencraft/textures/block/book_binder.png new file mode 100644 index 0000000000000000000000000000000000000000..13518c55b6b6fd9cbb9fd03fb80104133d15a245 GIT binary patch literal 1424 zcmcIkYfuts6#XblP~PNfn1z@wZslqcQ&|CuftVR;Tdv#sAT*s+4AxRJ(cFa8#KqPu zeBdKB%SS8r(8@Jav$cFs**0R1B{EjN$jlO#rhfH*f1G>gp8MmTd*;rS?%B;kni5O_ z07y?Z)7O~kp8;ELjF%!}HO2%DXLvIJsLwY06tc`%!v*XBApoe>&w!YdIbtJeDe~Aa z@{0)*9Su3c2ZE4@Xpv(yUqqxhIyt&zj^^zFU>VAj$?!k+>#Mwu=r>LX<^n@^>pj#6 zjqK&((S*&=_7^VKu~(&hh>-7BQWM5D-{(*s6cQi5<;s;SkM{=zcve?eN5sZD_ck^( z9E>Zh@2@$bmdoW4adD09YPJ9Q{Cv-mk&!1vN-HV)`FE@R~Om8sDdn2W!o}8pWqD*B|UOESdWi?b`~oX z3ZLv8RQNc$@lfojPU+?{DTUZ4yWQMOX>E|(G;sey5Ff9lQK?~;*4C;+*_oMYZbf#R zGDf)L1}tj}aj8b5iJX?5n$+p4hR4Rp1qB89S-XfXz$+zb3F$IFCtW`|DIly`ML{4C zWlE(D9#Wr+RZIH5jKqLYS%v*gnPzCHHdY`ACXuK09#AT~Xq5R~iR|t8cy;g4Pz*_C zu77OLUi`8goq$ieDy}RnDzX|jdPPV~O#IEBuHZAWYWsq!eAG6B{r!HW*REZA2xTw* zK+(!Gdd@ASZX}svUd+wS(I7;0XPR7&4Amk?La1%ZY^H7E`I-A3 zhyF>K1<>G9Ip8d^#Tgl9crnu7D$oyLv!P%*;^FreN@o)ss57DWOh9meEBXPp9s;NP zKT{8YfEjN{osJR=ryG3ML)e(4sA$Cu(-KQWqR{B>Q(!9`1E#jcvl)M=P$4C#2KW)T z9@d>rbd{3rMULoqTIi zTFclNEEM+lt(?5AQteHC8#+^TCt-O5V`r~Pv(V$>pJZGrp~oKk*~5D+m$%oH?^4hz zmSdi4G>r*7-rd7Yg^zzpdwUw~0v^vpc;w!nx-6YJv*wZa;*f!6kVqFbWw%gx540d&Oon`6yUXDx#Z`?+pgBOuLk8t=SeUco<(voPT*i`0>f8raN#t zA;RP${`5x6u3_S)s#yCh_8RZvZiD&Js6LqO$>PU(*T2G*1v=?(X|l%4oLQ)%svHk3HHvfc}p tb-?Y=Yn&S|4?}25>lv{7wuSP2hmOM;)||6g_saM^fv3lAW{q2L>VJMsfN=l- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rivencraft/textures/block/book_binder_press.png b/src/main/resources/assets/rivencraft/textures/block/book_binder_press.png new file mode 100644 index 0000000000000000000000000000000000000000..de698799054dc3aee72cb69c52d05913bda9dd6d GIT binary patch literal 1211 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 diff --git a/src/main/resources/assets/rivencraft/textures/gui/book_binder_legacy.png b/src/main/resources/assets/rivencraft/textures/gui/book_binder_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..7d2cf6d09bfcaab87e8f003f685171509083dc28 GIT binary patch literal 1165 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G!U;i$lZxy-8q?;Kn`1yx4R3& ze-K=-cll(X2xoyuWHAE+-$4*&+%YlxEl`lX#M9T6{XPeiAd^whf!a_81{PjV7srr_ zTW{|=X5Ds>Xt+4@(PfEEd@d~x=M8Q?VQQSz>o|Lkf_J`?qWFtrcFqeWayIGxuzIyf zBX@3+jIWIM;_qRNm+mWM@AD`!>U`L*cEI4sx9;WbyC=`tzWsau#ujGFO!4~55&wBo zz8=5vN4D|W)1O;DpSk+^+k^l6tL}*v>)1#B;W=Bi_uuobub*mWZT(UFIPj3@f$pk;)xZB{Up#(Jl)*J-mNG*F0|OHS2ZI8P(KB~G%aVwt|3&6&GdO^Pl!ZY6 z$k2%Ij4tJ5ka_UtmD;@6yDow+j-6*T$gr=k$#&YHc_NU>VD{Nf@d`^tR;?;p;{Ias zIr;AY9pMa`OV^06czvtvvGTJ&A9=tgH9WLoW~kHtxY&)cfm!_j+rP;o3=#`Zf6lC^ z+EM*8`^eHG2aFjioLT-927v5uxEEoY|2J&`gTb|<_wOw)wwTWpaOTndzfz0~3RLUN z-irYZebBNUXj8!Tt&3gM&&_XSU$9DRw&8`DpO5Pz`~~+QVFpTg5LS*9cu>WAZl>I~ zKbN-ojkt$q>(iplKFhh!Lqb!R&QoG|D?MTHy4M?G^v)VC|2*exTJq9etPGGKhKDsW z0~G!ev-kdHTr$Ne_WDizq&~|p!90p4zL#4B4z2DLf5VaDC;#ltI}Vfi=bbqeb;P>A z$vl$?2ibGD&-~ewa~qW>q{HGCn_m{k?zP-m{D$L+B)*{JXmAFmqMiw|jb~o|mFY`=-{)|_y^N)Z8=SHn)T`y0Zi(KQ zV|V7}UC|l*TwsG=uLT-xGp7uq20a-F(xsZ$9{e;X~~kxdX=(6Bj(!W1t!+*b$#4#(ZmQ Re3>T5Oix!omvv4FO#ndZgZ%&i literal 0 HcmV?d00001 diff --git a/src/main/resources/data/rivencraft/loot_table/blocks/book_binder.json b/src/main/resources/data/rivencraft/loot_table/blocks/book_binder.json new file mode 100644 index 0000000..1169792 --- /dev/null +++ b/src/main/resources/data/rivencraft/loot_table/blocks/book_binder.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:block", + "pools": [{"rolls":1,"entries":[{"type":"minecraft:item","name":"rivencraft:book_binder"}]}] +} diff --git a/src/main/resources/data/rivencraft/recipe/book_binder.json b/src/main/resources/data/rivencraft/recipe/book_binder.json new file mode 100644 index 0000000..ae44e6f --- /dev/null +++ b/src/main/resources/data/rivencraft/recipe/book_binder.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": ["III", "PPP", "P P"], + "key": { + "I": {"item":"minecraft:iron_ingot"}, + "P": {"tag":"minecraft:planks"} + }, + "result": {"id":"rivencraft:book_binder","count":1} +}