From d92ff7b8e5376a4bb5b0089d9502f7adbf330f62 Mon Sep 17 00:00:00 2001 From: zelophed Date: Sun, 5 Dec 2021 19:07:03 +0100 Subject: [PATCH 1/7] get started on 1.17 --- build.gradle | 10 +- gradle/wrapper/gradle-wrapper.jar | Bin 54708 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 282 +++++++++++------- gradlew.bat | 43 +-- .../simibubi/mightyarchitect/AllBlocks.java | 8 +- .../simibubi/mightyarchitect/AllItems.java | 6 +- .../simibubi/mightyarchitect/AllPackets.java | 10 +- .../mightyarchitect/AllSpecialTextures.java | 6 +- .../mightyarchitect/MightyClient.java | 36 +-- .../mightyarchitect/TheMightyArchitect.java | 4 +- .../block/DesignAnchorBlock.java | 16 +- .../block/SliceMarkerBlock.java | 48 +-- .../control/ArchitectKits.java | 18 +- .../control/ArchitectManager.java | 28 +- .../control/ArchitectMenu.java | 2 +- .../mightyarchitect/control/Schematic.java | 10 +- .../control/SchematicRenderer.java | 35 +-- .../control/TemplateBlockAccess.java | 64 ++-- .../control/compose/Cuboid.java | 16 +- .../control/compose/GroundPlan.java | 2 +- .../mightyarchitect/control/compose/Room.java | 4 +- .../control/compose/Stack.java | 2 +- .../AbstractRoomFaceSelectionTool.java | 6 +- .../compose/planner/ComposerToolBase.java | 34 +-- .../compose/planner/CopyDesignTool.java | 44 +-- .../compose/planner/CylinderRoomTool.java | 16 +- .../planner/GroundPlanningToolBase.java | 30 +- .../control/compose/planner/HeightTool.java | 10 +- .../compose/planner/IComposerTool.java | 4 +- .../compose/planner/LayerStyleTool.java | 4 +- .../compose/planner/MoveReshapeTool.java | 12 +- .../compose/planner/PalettePainterTool.java | 4 +- .../compose/planner/RerollTargetTool.java | 2 +- .../control/compose/planner/RoofTool.java | 6 +- .../control/compose/planner/RoomTool.java | 6 +- .../control/compose/planner/StackTool.java | 4 +- .../planner/WallDecorationToolBase.java | 10 +- .../control/design/DesignExporter.java | 38 +-- .../control/design/DesignResourceLoader.java | 44 +-- .../control/design/DesignSlice.java | 12 +- .../control/design/DesignTheme.java | 24 +- .../control/design/Sketch.java | 2 +- .../control/design/ThemeStatistics.java | 4 +- .../control/design/ThemeStorage.java | 44 +-- .../control/design/ThemeValidator.java | 30 +- .../control/design/partials/Corner.java | 6 +- .../control/design/partials/Design.java | 16 +- .../control/design/partials/Facade.java | 4 +- .../control/design/partials/FlatRoof.java | 6 +- .../control/design/partials/Roof.java | 6 +- .../control/design/partials/Tower.java | 6 +- .../design/partials/TowerFlatRoof.java | 4 +- .../control/design/partials/TowerRoof.java | 6 +- .../control/design/partials/Trim.java | 4 +- .../control/design/partials/Wall.java | 6 +- .../control/palette/BlockOrientation.java | 22 +- .../control/palette/PaletteBlockInfo.java | 2 +- .../control/palette/PaletteDefinition.java | 38 +-- .../control/palette/PaletteStorage.java | 10 +- .../control/phase/IArchitectPhase.java | 6 +- .../control/phase/PhaseBase.java | 4 +- .../control/phase/PhaseComposing.java | 8 +- .../control/phase/PhaseCreatingPalette.java | 36 +-- .../control/phase/PhaseEmpty.java | 6 +- .../control/phase/PhasePaused.java | 22 +- .../control/phase/PhasePreviewing.java | 8 +- .../control/phase/PrintingToMultiplayer.java | 36 +-- .../control/phase/export/PhaseEditTheme.java | 12 +- .../export/PhaseListThemesForEditing.java | 6 +- .../phase/export/PhaseManageThemes.java | 6 +- .../foundation/MatrixStacker.java | 22 +- .../foundation/RenderTypes.java | 174 ++++++----- .../foundation/SpriteShiftEntry.java | 6 +- .../foundation/SuperByteBuffer.java | 40 +-- .../foundation/SuperByteBufferCache.java | 36 +-- .../foundation/SuperRenderTypeBuffer.java | 101 +++---- .../foundation/WrappedWorld.java | 141 ++++++--- .../foundation/utility/AngleHelper.java | 10 +- .../foundation/utility/BuildingHelper.java | 2 +- .../foundation/utility/ColorHelper.java | 10 +- .../foundation/utility/DesignHelper.java | 2 +- .../foundation/utility/FilesHelper.java | 16 +- .../foundation/utility/Iterate.java | 6 +- .../foundation/utility/Keyboard.java | 4 +- .../foundation/utility/RaycastHelper.java | 80 ++--- .../foundation/utility/ShaderManager.java | 16 +- .../foundation/utility/Shaders.java | 6 +- .../foundation/utility/VecHelper.java | 110 +++---- .../utility/outliner/AABBOutline.java | 76 +++-- .../utility/outliner/BlockClusterOutline.java | 40 +-- .../utility/outliner/ChasingAABBOutline.java | 28 +- .../utility/outliner/LineOutline.java | 38 +-- .../foundation/utility/outliner/Outline.java | 97 +++--- .../utility/outliner/OutlinedText.java | 61 ++-- .../foundation/utility/outliner/Outliner.java | 30 +- .../gui/AbstractSimiScreen.java | 32 +- .../gui/ArchitectMenuScreen.java | 42 ++- .../gui/DesignExporterScreen.java | 20 +- .../mightyarchitect/gui/GuiGameElement.java | 240 +++++++-------- .../gui/PalettePickerScreen.java | 65 ++-- .../mightyarchitect/gui/ScreenHelper.java | 2 +- .../mightyarchitect/gui/ScreenResources.java | 11 +- .../gui/TextInputPromptScreen.java | 32 +- .../gui/ThemeSettingsScreen.java | 20 +- .../gui/ToolSelectionScreen.java | 53 ++-- .../gui/widgets/AbstractSimiWidget.java | 24 +- .../gui/widgets/IconButton.java | 14 +- .../gui/widgets/Indicator.java | 12 +- .../mightyarchitect/gui/widgets/Label.java | 37 +-- .../gui/widgets/ScrollInput.java | 21 +- .../gui/widgets/SelectionScrollInput.java | 24 +- .../item/ArchitectWandItem.java | 46 +-- .../networking/InstantPrintPacket.java | 29 +- .../networking/PlaceSignPacket.java | 28 +- .../networking/SetHotbarItemPacket.java | 21 +- .../resources/META-INF/accesstransformer.cfg | 1 + 117 files changed, 1702 insertions(+), 1552 deletions(-) create mode 100644 src/main/resources/META-INF/accesstransformer.cfg diff --git a/build.gradle b/build.gradle index 0876fa3..73e5227 100644 --- a/build.gradle +++ b/build.gradle @@ -5,19 +5,20 @@ buildscript { mavenCentral() } dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true } } apply plugin: 'net.minecraftforge.gradle' // Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. apply plugin: 'eclipse' apply plugin: 'maven-publish' +apply from: 'https://raw.githubusercontent.com/SizableShrimp/Forge-Class-Remapper/main/classremapper.gradle' version = 'mc1.16.5_v0.5' group = 'com.simibubi.mightyarchitect' archivesBaseName = 'mightyarchitect' -sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' +sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '16' repositories { @@ -29,7 +30,8 @@ repositories { } minecraft { - mappings channel: 'official', version: '1.16.5' + mappings channel: 'official', version: '1.17.1' + accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') runs { client { @@ -67,7 +69,7 @@ minecraft { } dependencies { - minecraft 'net.minecraftforge:forge:1.16.5-36.2.19' + minecraft 'net.minecraftforge:forge:1.17.1-37.1.0' } jar { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7a3265ee94c0ab25cf079ac8ccdf87f41d455d42..7454180f2ae8848c63b8b4dea2cb829da983f2fa 100644 GIT binary patch literal 59536 zcma&NbC71ylI~qywr$(CZQJHswz}-9F59+k+g;UV+cs{`J?GrGXYR~=-ydruB3JCa zB64N^cILAcWk5iofq)<(fq;O7{th4@;QxID0)qN`mJ?GIqLY#rX8-|G{5M0pdVW5^ zzXk$-2kQTAC?_N@B`&6-N-rmVFE=$QD?>*=4<|!MJu@}isLc4AW#{m2if&A5T5g&~ ziuMQeS*U5sL6J698wOd)K@oK@1{peP5&Esut<#VH^u)gp`9H4)`uE!2$>RTctN+^u z=ASkePDZA-X8)rp%D;p*~P?*a_=*Kwc<^>QSH|^<0>o37lt^+Mj1;4YvJ(JR-Y+?%Nu}JAYj5 z_Qc5%Ao#F?q32i?ZaN2OSNhWL;2oDEw_({7ZbgUjna!Fqn3NzLM@-EWFPZVmc>(fZ z0&bF-Ch#p9C{YJT9Rcr3+Y_uR^At1^BxZ#eo>$PLJF3=;t_$2|t+_6gg5(j{TmjYU zK12c&lE?Eh+2u2&6Gf*IdKS&6?rYbSEKBN!rv{YCm|Rt=UlPcW9j`0o6{66#y5t9C zruFA2iKd=H%jHf%ypOkxLnO8#H}#Zt{8p!oi6)7#NqoF({t6|J^?1e*oxqng9Q2Cc zg%5Vu!em)}Yuj?kaP!D?b?(C*w!1;>R=j90+RTkyEXz+9CufZ$C^umX^+4|JYaO<5 zmIM3#dv`DGM;@F6;(t!WngZSYzHx?9&$xEF70D1BvfVj<%+b#)vz)2iLCrTeYzUcL z(OBnNoG6Le%M+@2oo)&jdOg=iCszzv59e zDRCeaX8l1hC=8LbBt|k5?CXgep=3r9BXx1uR8!p%Z|0+4Xro=xi0G!e{c4U~1j6!) zH6adq0}#l{%*1U(Cb%4AJ}VLWKBPi0MoKFaQH6x?^hQ!6em@993xdtS%_dmevzeNl z(o?YlOI=jl(`L9^ z0O+H9k$_@`6L13eTT8ci-V0ljDMD|0ifUw|Q-Hep$xYj0hTO@0%IS^TD4b4n6EKDG z??uM;MEx`s98KYN(K0>c!C3HZdZ{+_53DO%9k5W%pr6yJusQAv_;IA}925Y%;+!tY z%2k!YQmLLOr{rF~!s<3-WEUs)`ix_mSU|cNRBIWxOox_Yb7Z=~Q45ZNe*u|m^|)d* zog=i>`=bTe!|;8F+#H>EjIMcgWcG2ORD`w0WD;YZAy5#s{65~qfI6o$+Ty&-hyMyJ z3Ra~t>R!p=5ZpxA;QkDAoPi4sYOP6>LT+}{xp}tk+<0k^CKCFdNYG(Es>p0gqD)jP zWOeX5G;9(m@?GOG7g;e74i_|SmE?`B2i;sLYwRWKLy0RLW!Hx`=!LH3&k=FuCsM=9M4|GqzA)anEHfxkB z?2iK-u(DC_T1};KaUT@3nP~LEcENT^UgPvp!QC@Dw&PVAhaEYrPey{nkcn(ro|r7XUz z%#(=$7D8uP_uU-oPHhd>>^adbCSQetgSG`e$U|7mr!`|bU0aHl_cmL)na-5x1#OsVE#m*+k84Y^+UMeSAa zbrVZHU=mFwXEaGHtXQq`2ZtjfS!B2H{5A<3(nb-6ARVV8kEmOkx6D2x7~-6hl;*-*}2Xz;J#a8Wn;_B5=m zl3dY;%krf?i-Ok^Pal-}4F`{F@TYPTwTEhxpZK5WCpfD^UmM_iYPe}wpE!Djai6_{ z*pGO=WB47#Xjb7!n2Ma)s^yeR*1rTxp`Mt4sfA+`HwZf%!7ZqGosPkw69`Ix5Ku6G z@Pa;pjzV&dn{M=QDx89t?p?d9gna*}jBly*#1!6}5K<*xDPJ{wv4& zM$17DFd~L*Te3A%yD;Dp9UGWTjRxAvMu!j^Tbc}2v~q^59d4bz zvu#!IJCy(BcWTc`;v$9tH;J%oiSJ_i7s;2`JXZF+qd4C)vY!hyCtl)sJIC{ebI*0> z@x>;EzyBv>AI-~{D6l6{ST=em*U( z(r$nuXY-#CCi^8Z2#v#UXOt`dbYN1z5jzNF2 z411?w)whZrfA20;nl&C1Gi+gk<`JSm+{|*2o<< zqM#@z_D`Cn|0H^9$|Tah)0M_X4c37|KQ*PmoT@%xHc3L1ZY6(p(sNXHa&49Frzto& zR`c~ClHpE~4Z=uKa5S(-?M8EJ$zt0&fJk~p$M#fGN1-y$7!37hld`Uw>Urri(DxLa;=#rK0g4J)pXMC zxzraOVw1+kNWpi#P=6(qxf`zSdUC?D$i`8ZI@F>k6k zz21?d+dw7b&i*>Kv5L(LH-?J%@WnqT7j#qZ9B>|Zl+=> z^U-pV@1y_ptHo4hl^cPRWewbLQ#g6XYQ@EkiP z;(=SU!yhjHp%1&MsU`FV1Z_#K1&(|5n(7IHbx&gG28HNT)*~-BQi372@|->2Aw5It z0CBpUcMA*QvsPy)#lr!lIdCi@1k4V2m!NH)%Px(vu-r(Q)HYc!p zJ^$|)j^E#q#QOgcb^pd74^JUi7fUmMiNP_o*lvx*q%_odv49Dsv$NV;6J z9GOXKomA{2Pb{w}&+yHtH?IkJJu~}Z?{Uk++2mB8zyvh*xhHKE``99>y#TdD z&(MH^^JHf;g(Tbb^&8P*;_i*2&fS$7${3WJtV7K&&(MBV2~)2KB3%cWg#1!VE~k#C z!;A;?p$s{ihyojEZz+$I1)L}&G~ml=udD9qh>Tu(ylv)?YcJT3ihapi!zgPtWb*CP zlLLJSRCj-^w?@;RU9aL2zDZY1`I3d<&OMuW=c3$o0#STpv_p3b9Wtbql>w^bBi~u4 z3D8KyF?YE?=HcKk!xcp@Cigvzy=lnFgc^9c%(^F22BWYNAYRSho@~*~S)4%AhEttv zvq>7X!!EWKG?mOd9&n>vvH1p4VzE?HCuxT-u+F&mnsfDI^}*-d00-KAauEaXqg3k@ zy#)MGX!X;&3&0s}F3q40ZmVM$(H3CLfpdL?hB6nVqMxX)q=1b}o_PG%r~hZ4gUfSp zOH4qlEOW4OMUc)_m)fMR_rl^pCfXc{$fQbI*E&mV77}kRF z&{<06AJyJ!e863o-V>FA1a9Eemx6>^F$~9ppt()ZbPGfg_NdRXBWoZnDy2;#ODgf! zgl?iOcF7Meo|{AF>KDwTgYrJLb$L2%%BEtO>T$C?|9bAB&}s;gI?lY#^tttY&hfr# zKhC+&b-rpg_?~uVK%S@mQleU#_xCsvIPK*<`E0fHE1&!J7!xD#IB|SSPW6-PyuqGn3^M^Rz%WT{e?OI^svARX&SAdU77V(C~ zM$H{Kg59op{<|8ry9ecfP%=kFm(-!W&?U0@<%z*+!*<e0XesMxRFu9QnGqun6R_%T+B%&9Dtk?*d$Q zb~>84jEAPi@&F@3wAa^Lzc(AJz5gsfZ7J53;@D<;Klpl?sK&u@gie`~vTsbOE~Cd4 z%kr56mI|#b(Jk&;p6plVwmNB0H@0SmgdmjIn5Ne@)}7Vty(yb2t3ev@22AE^s!KaN zyQ>j+F3w=wnx7w@FVCRe+`vUH)3gW%_72fxzqX!S&!dchdkRiHbXW1FMrIIBwjsai8`CB2r4mAbwp%rrO>3B$Zw;9=%fXI9B{d(UzVap7u z6piC-FQ)>}VOEuPpuqznpY`hN4dGa_1Xz9rVg(;H$5Te^F0dDv*gz9JS<|>>U0J^# z6)(4ICh+N_Q`Ft0hF|3fSHs*?a=XC;e`sJaU9&d>X4l?1W=|fr!5ShD|nv$GK;j46@BV6+{oRbWfqOBRb!ir88XD*SbC(LF}I1h#6@dvK%Toe%@ zhDyG$93H8Eu&gCYddP58iF3oQH*zLbNI;rN@E{T9%A8!=v#JLxKyUe}e}BJpB{~uN zqgxRgo0*-@-iaHPV8bTOH(rS(huwK1Xg0u+e!`(Irzu@Bld&s5&bWgVc@m7;JgELd zimVs`>vQ}B_1(2#rv#N9O`fJpVfPc7V2nv34PC);Dzbb;p!6pqHzvy?2pD&1NE)?A zt(t-ucqy@wn9`^MN5apa7K|L=9>ISC>xoc#>{@e}m#YAAa1*8-RUMKwbm|;5p>T`Z zNf*ph@tnF{gmDa3uwwN(g=`Rh)4!&)^oOy@VJaK4lMT&5#YbXkl`q?<*XtsqD z9PRK6bqb)fJw0g-^a@nu`^?71k|m3RPRjt;pIkCo1{*pdqbVs-Yl>4E>3fZx3Sv44grW=*qdSoiZ9?X0wWyO4`yDHh2E!9I!ZFi zVL8|VtW38}BOJHW(Ax#KL_KQzarbuE{(%TA)AY)@tY4%A%P%SqIU~8~-Lp3qY;U-} z`h_Gel7;K1h}7$_5ZZT0&%$Lxxr-<89V&&TCsu}LL#!xpQ1O31jaa{U34~^le*Y%L za?7$>Jk^k^pS^_M&cDs}NgXlR>16AHkSK-4TRaJSh#h&p!-!vQY%f+bmn6x`4fwTp z$727L^y`~!exvmE^W&#@uY!NxJi`g!i#(++!)?iJ(1)2Wk;RN zFK&O4eTkP$Xn~4bB|q8y(btx$R#D`O@epi4ofcETrx!IM(kWNEe42Qh(8*KqfP(c0 zouBl6>Fc_zM+V;F3znbo{x#%!?mH3`_ANJ?y7ppxS@glg#S9^MXu|FM&ynpz3o&Qh z2ujAHLF3($pH}0jXQsa#?t--TnF1P73b?4`KeJ9^qK-USHE)4!IYgMn-7z|=ALF5SNGkrtPG@Y~niUQV2?g$vzJN3nZ{7;HZHzWAeQ;5P|@Tl3YHpyznGG4-f4=XflwSJY+58-+wf?~Fg@1p1wkzuu-RF3j2JX37SQUc? zQ4v%`V8z9ZVZVqS8h|@@RpD?n0W<=hk=3Cf8R?d^9YK&e9ZybFY%jdnA)PeHvtBe- zhMLD+SSteHBq*q)d6x{)s1UrsO!byyLS$58WK;sqip$Mk{l)Y(_6hEIBsIjCr5t>( z7CdKUrJTrW%qZ#1z^n*Lb8#VdfzPw~OIL76aC+Rhr<~;4Tl!sw?Rj6hXj4XWa#6Tp z@)kJ~qOV)^Rh*-?aG>ic2*NlC2M7&LUzc9RT6WM%Cpe78`iAowe!>(T0jo&ivn8-7 zs{Qa@cGy$rE-3AY0V(l8wjI^uB8Lchj@?L}fYal^>T9z;8juH@?rG&g-t+R2dVDBe zq!K%{e-rT5jX19`(bP23LUN4+_zh2KD~EAYzhpEO3MUG8@}uBHH@4J zd`>_(K4q&>*k82(dDuC)X6JuPrBBubOg7qZ{?x!r@{%0);*`h*^F|%o?&1wX?Wr4b z1~&cy#PUuES{C#xJ84!z<1tp9sfrR(i%Tu^jnXy;4`Xk;AQCdFC@?V%|; zySdC7qS|uQRcH}EFZH%mMB~7gi}a0utE}ZE_}8PQH8f;H%PN41Cb9R%w5Oi5el^fd z$n{3SqLCnrF##x?4sa^r!O$7NX!}&}V;0ZGQ&K&i%6$3C_dR%I7%gdQ;KT6YZiQrW zk%q<74oVBV>@}CvJ4Wj!d^?#Zwq(b$E1ze4$99DuNg?6t9H}k_|D7KWD7i0-g*EO7 z;5{hSIYE4DMOK3H%|f5Edx+S0VI0Yw!tsaRS2&Il2)ea^8R5TG72BrJue|f_{2UHa z@w;^c|K3da#$TB0P3;MPlF7RuQeXT$ zS<<|C0OF(k)>fr&wOB=gP8!Qm>F41u;3esv7_0l%QHt(~+n; zf!G6%hp;Gfa9L9=AceiZs~tK+Tf*Wof=4!u{nIO90jH@iS0l+#%8=~%ASzFv7zqSB^?!@N7)kp0t&tCGLmzXSRMRyxCmCYUD2!B`? zhs$4%KO~m=VFk3Buv9osha{v+mAEq=ik3RdK@;WWTV_g&-$U4IM{1IhGX{pAu%Z&H zFfwCpUsX%RKg);B@7OUzZ{Hn{q6Vv!3#8fAg!P$IEx<0vAx;GU%}0{VIsmFBPq_mb zpe^BChDK>sc-WLKl<6 zwbW|e&d&dv9Wu0goueyu>(JyPx1mz0v4E?cJjFuKF71Q1)AL8jHO$!fYT3(;U3Re* zPPOe%*O+@JYt1bW`!W_1!mN&=w3G9ru1XsmwfS~BJ))PhD(+_J_^N6j)sx5VwbWK| zwRyC?W<`pOCY)b#AS?rluxuuGf-AJ=D!M36l{ua?@SJ5>e!IBr3CXIxWw5xUZ@Xrw z_R@%?{>d%Ld4p}nEsiA@v*nc6Ah!MUs?GA7e5Q5lPpp0@`%5xY$C;{%rz24$;vR#* zBP=a{)K#CwIY%p} zXVdxTQ^HS@O&~eIftU+Qt^~(DGxrdi3k}DdT^I7Iy5SMOp$QuD8s;+93YQ!OY{eB24%xY7ml@|M7I(Nb@K_-?F;2?et|CKkuZK_>+>Lvg!>JE~wN`BI|_h6$qi!P)+K-1Hh(1;a`os z55)4Q{oJiA(lQM#;w#Ta%T0jDNXIPM_bgESMCDEg6rM33anEr}=|Fn6)|jBP6Y}u{ zv9@%7*#RI9;fv;Yii5CI+KrRdr0DKh=L>)eO4q$1zmcSmglsV`*N(x=&Wx`*v!!hn6X-l0 zP_m;X??O(skcj+oS$cIdKhfT%ABAzz3w^la-Ucw?yBPEC+=Pe_vU8nd-HV5YX6X8r zZih&j^eLU=%*;VzhUyoLF;#8QsEfmByk+Y~caBqSvQaaWf2a{JKB9B>V&r?l^rXaC z8)6AdR@Qy_BxQrE2Fk?ewD!SwLuMj@&d_n5RZFf7=>O>hzVE*seW3U?_p|R^CfoY`?|#x9)-*yjv#lo&zP=uI`M?J zbzC<^3x7GfXA4{FZ72{PE*-mNHyy59Q;kYG@BB~NhTd6pm2Oj=_ zizmD?MKVRkT^KmXuhsk?eRQllPo2Ubk=uCKiZ&u3Xjj~<(!M94c)Tez@9M1Gfs5JV z->@II)CDJOXTtPrQudNjE}Eltbjq>6KiwAwqvAKd^|g!exgLG3;wP+#mZYr`cy3#39e653d=jrR-ulW|h#ddHu(m9mFoW~2yE zz5?dB%6vF}+`-&-W8vy^OCxm3_{02royjvmwjlp+eQDzFVEUiyO#gLv%QdDSI#3W* z?3!lL8clTaNo-DVJw@ynq?q!%6hTQi35&^>P85G$TqNt78%9_sSJt2RThO|JzM$iL zg|wjxdMC2|Icc5rX*qPL(coL!u>-xxz-rFiC!6hD1IR%|HSRsV3>Kq~&vJ=s3M5y8SG%YBQ|{^l#LGlg!D?E>2yR*eV%9m$_J6VGQ~AIh&P$_aFbh zULr0Z$QE!QpkP=aAeR4ny<#3Fwyw@rZf4?Ewq`;mCVv}xaz+3ni+}a=k~P+yaWt^L z@w67!DqVf7D%7XtXX5xBW;Co|HvQ8WR1k?r2cZD%U;2$bsM%u8{JUJ5Z0k= zZJARv^vFkmWx15CB=rb=D4${+#DVqy5$C%bf`!T0+epLJLnh1jwCdb*zuCL}eEFvE z{rO1%gxg>1!W(I!owu*mJZ0@6FM(?C+d*CeceZRW_4id*D9p5nzMY&{mWqrJomjIZ z97ZNnZ3_%Hx8dn;H>p8m7F#^2;T%yZ3H;a&N7tm=Lvs&lgJLW{V1@h&6Vy~!+Ffbb zv(n3+v)_D$}dqd!2>Y2B)#<+o}LH#%ogGi2-?xRIH)1!SD)u-L65B&bsJTC=LiaF+YOCif2dUX6uAA|#+vNR z>U+KQekVGon)Yi<93(d!(yw1h3&X0N(PxN2{%vn}cnV?rYw z$N^}_o!XUB!mckL`yO1rnUaI4wrOeQ(+&k?2mi47hzxSD`N#-byqd1IhEoh!PGq>t z_MRy{5B0eKY>;Ao3z$RUU7U+i?iX^&r739F)itdrTpAi-NN0=?^m%?{A9Ly2pVv>Lqs6moTP?T2-AHqFD-o_ znVr|7OAS#AEH}h8SRPQ@NGG47dO}l=t07__+iK8nHw^(AHx&Wb<%jPc$$jl6_p(b$ z)!pi(0fQodCHfM)KMEMUR&UID>}m^(!{C^U7sBDOA)$VThRCI0_+2=( zV8mMq0R(#z;C|7$m>$>`tX+T|xGt(+Y48@ZYu#z;0pCgYgmMVbFb!$?%yhZqP_nhn zy4<#3P1oQ#2b51NU1mGnHP$cf0j-YOgAA}A$QoL6JVLcmExs(kU{4z;PBHJD%_=0F z>+sQV`mzijSIT7xn%PiDKHOujX;n|M&qr1T@rOxTdxtZ!&u&3HHFLYD5$RLQ=heur zb>+AFokUVQeJy-#LP*^)spt{mb@Mqe=A~-4p0b+Bt|pZ+@CY+%x}9f}izU5;4&QFE zO1bhg&A4uC1)Zb67kuowWY4xbo&J=%yoXlFB)&$d*-}kjBu|w!^zbD1YPc0-#XTJr z)pm2RDy%J3jlqSMq|o%xGS$bPwn4AqitC6&e?pqWcjWPt{3I{>CBy;hg0Umh#c;hU3RhCUX=8aR>rmd` z7Orw(5tcM{|-^J?ZAA9KP|)X6n9$-kvr#j5YDecTM6n z&07(nD^qb8hpF0B^z^pQ*%5ePYkv&FabrlI61ntiVp!!C8y^}|<2xgAd#FY=8b*y( zuQOuvy2`Ii^`VBNJB&R!0{hABYX55ooCAJSSevl4RPqEGb)iy_0H}v@vFwFzD%>#I>)3PsouQ+_Kkbqy*kKdHdfkN7NBcq%V{x^fSxgXpg7$bF& zj!6AQbDY(1u#1_A#1UO9AxiZaCVN2F0wGXdY*g@x$ByvUA?ePdide0dmr#}udE%K| z3*k}Vv2Ew2u1FXBaVA6aerI36R&rzEZeDDCl5!t0J=ug6kuNZzH>3i_VN`%BsaVB3 zQYw|Xub_SGf{)F{$ZX5`Jc!X!;eybjP+o$I{Z^Hsj@D=E{MnnL+TbC@HEU2DjG{3-LDGIbq()U87x4eS;JXnSh;lRlJ z>EL3D>wHt-+wTjQF$fGyDO$>d+(fq@bPpLBS~xA~R=3JPbS{tzN(u~m#Po!?H;IYv zE;?8%^vle|%#oux(Lj!YzBKv+Fd}*Ur-dCBoX*t{KeNM*n~ZPYJ4NNKkI^MFbz9!v z4(Bvm*Kc!-$%VFEewYJKz-CQN{`2}KX4*CeJEs+Q(!kI%hN1!1P6iOq?ovz}X0IOi z)YfWpwW@pK08^69#wSyCZkX9?uZD?C^@rw^Y?gLS_xmFKkooyx$*^5#cPqntNTtSG zlP>XLMj2!VF^0k#ole7`-c~*~+_T5ls?x4)ah(j8vo_ zwb%S8qoaZqY0-$ZI+ViIA_1~~rAH7K_+yFS{0rT@eQtTAdz#8E5VpwnW!zJ_^{Utv zlW5Iar3V5t&H4D6A=>?mq;G92;1cg9a2sf;gY9pJDVKn$DYdQlvfXq}zz8#LyPGq@ z+`YUMD;^-6w&r-82JL7mA8&M~Pj@aK!m{0+^v<|t%APYf7`}jGEhdYLqsHW-Le9TL z_hZZ1gbrz7$f9^fAzVIP30^KIz!!#+DRLL+qMszvI_BpOSmjtl$hh;&UeM{ER@INV zcI}VbiVTPoN|iSna@=7XkP&-4#06C};8ajbxJ4Gcq8(vWv4*&X8bM^T$mBk75Q92j z1v&%a;OSKc8EIrodmIiw$lOES2hzGDcjjB`kEDfJe{r}yE6`eZL zEB`9u>Cl0IsQ+t}`-cx}{6jqcANucqIB>Qmga_&<+80E2Q|VHHQ$YlAt{6`Qu`HA3 z03s0-sSlwbvgi&_R8s={6<~M^pGvBNjKOa>tWenzS8s zR>L7R5aZ=mSU{f?ib4Grx$AeFvtO5N|D>9#)ChH#Fny2maHWHOf2G=#<9Myot#+4u zWVa6d^Vseq_0=#AYS(-m$Lp;*8nC_6jXIjEM`omUmtH@QDs3|G)i4j*#_?#UYVZvJ z?YjT-?!4Q{BNun;dKBWLEw2C-VeAz`%?A>p;)PL}TAZn5j~HK>v1W&anteARlE+~+ zj>c(F;?qO3pXBb|#OZdQnm<4xWmn~;DR5SDMxt0UK_F^&eD|KZ=O;tO3vy4@4h^;2 zUL~-z`-P1aOe?|ZC1BgVsL)2^J-&vIFI%q@40w0{jjEfeVl)i9(~bt2z#2Vm)p`V_ z1;6$Ae7=YXk#=Qkd24Y23t&GvRxaOoad~NbJ+6pxqzJ>FY#Td7@`N5xp!n(c!=RE& z&<<@^a$_Ys8jqz4|5Nk#FY$~|FPC0`*a5HH!|Gssa9=~66&xG9)|=pOOJ2KE5|YrR zw!w6K2aC=J$t?L-;}5hn6mHd%hC;p8P|Dgh6D>hGnXPgi;6r+eA=?f72y9(Cf_ho{ zH6#)uD&R=73^$$NE;5piWX2bzR67fQ)`b=85o0eOLGI4c-Tb@-KNi2pz=Ke@SDcPn za$AxXib84`!Sf;Z3B@TSo`Dz7GM5Kf(@PR>Ghzi=BBxK8wRp>YQoXm+iL>H*Jo9M3 z6w&E?BC8AFTFT&Tv8zf+m9<&S&%dIaZ)Aoqkak_$r-2{$d~0g2oLETx9Y`eOAf14QXEQw3tJne;fdzl@wV#TFXSLXM2428F-Q}t+n2g%vPRMUzYPvzQ9f# zu(liiJem9P*?0%V@RwA7F53r~|I!Ty)<*AsMX3J{_4&}{6pT%Tpw>)^|DJ)>gpS~1rNEh z0$D?uO8mG?H;2BwM5a*26^7YO$XjUm40XmBsb63MoR;bJh63J;OngS5sSI+o2HA;W zdZV#8pDpC9Oez&L8loZO)MClRz!_!WD&QRtQxnazhT%Vj6Wl4G11nUk8*vSeVab@N#oJ}`KyJv+8Mo@T1-pqZ1t|?cnaVOd;1(h9 z!$DrN=jcGsVYE-0-n?oCJ^4x)F}E;UaD-LZUIzcD?W^ficqJWM%QLy6QikrM1aKZC zi{?;oKwq^Vsr|&`i{jIphA8S6G4)$KGvpULjH%9u(Dq247;R#l&I0{IhcC|oBF*Al zvLo7Xte=C{aIt*otJD}BUq)|_pdR>{zBMT< z(^1RpZv*l*m*OV^8>9&asGBo8h*_4q*)-eCv*|Pq=XNGrZE)^(SF7^{QE_~4VDB(o zVcPA_!G+2CAtLbl+`=Q~9iW`4ZRLku!uB?;tWqVjB0lEOf}2RD7dJ=BExy=<9wkb- z9&7{XFA%n#JsHYN8t5d~=T~5DcW4$B%3M+nNvC2`0!#@sckqlzo5;hhGi(D9=*A4` z5ynobawSPRtWn&CDLEs3Xf`(8^zDP=NdF~F^s&={l7(aw&EG}KWpMjtmz7j_VLO;@ zM2NVLDxZ@GIv7*gzl1 zjq78tv*8#WSY`}Su0&C;2F$Ze(q>F(@Wm^Gw!)(j;dk9Ad{STaxn)IV9FZhm*n+U} zi;4y*3v%A`_c7a__DJ8D1b@dl0Std3F||4Wtvi)fCcBRh!X9$1x!_VzUh>*S5s!oq z;qd{J_r79EL2wIeiGAqFstWtkfIJpjVh%zFo*=55B9Zq~y0=^iqHWfQl@O!Ak;(o*m!pZqe9 z%U2oDOhR)BvW8&F70L;2TpkzIutIvNQaTjjs5V#8mV4!NQ}zN=i`i@WI1z0eN-iCS z;vL-Wxc^Vc_qK<5RPh(}*8dLT{~GzE{w2o$2kMFaEl&q zP{V=>&3kW7tWaK-Exy{~`v4J0U#OZBk{a9{&)&QG18L@6=bsZ1zC_d{{pKZ-Ey>I> z;8H0t4bwyQqgu4hmO`3|4K{R*5>qnQ&gOfdy?z`XD%e5+pTDzUt3`k^u~SaL&XMe= z9*h#kT(*Q9jO#w2Hd|Mr-%DV8i_1{J1MU~XJ3!WUplhXDYBpJH><0OU`**nIvPIof z|N8@I=wA)sf45SAvx||f?Z5uB$kz1qL3Ky_{%RPdP5iN-D2!p5scq}buuC00C@jom zhfGKm3|f?Z0iQ|K$Z~!`8{nmAS1r+fp6r#YDOS8V*;K&Gs7Lc&f^$RC66O|)28oh`NHy&vq zJh+hAw8+ybTB0@VhWN^0iiTnLsCWbS_y`^gs!LX!Lw{yE``!UVzrV24tP8o;I6-65 z1MUiHw^{bB15tmrVT*7-#sj6cs~z`wk52YQJ*TG{SE;KTm#Hf#a~|<(|ImHH17nNM z`Ub{+J3dMD!)mzC8b(2tZtokKW5pAwHa?NFiso~# z1*iaNh4lQ4TS)|@G)H4dZV@l*Vd;Rw;-;odDhW2&lJ%m@jz+Panv7LQm~2Js6rOW3 z0_&2cW^b^MYW3)@o;neZ<{B4c#m48dAl$GCc=$>ErDe|?y@z`$uq3xd(%aAsX)D%l z>y*SQ%My`yDP*zof|3@_w#cjaW_YW4BdA;#Glg1RQcJGY*CJ9`H{@|D+*e~*457kd z73p<%fB^PV!Ybw@)Dr%(ZJbX}xmCStCYv#K3O32ej{$9IzM^I{6FJ8!(=azt7RWf4 z7ib0UOPqN40X!wOnFOoddd8`!_IN~9O)#HRTyjfc#&MCZ zZAMzOVB=;qwt8gV?{Y2?b=iSZG~RF~uyx18K)IDFLl})G1v@$(s{O4@RJ%OTJyF+Cpcx4jmy|F3euCnMK!P2WTDu5j z{{gD$=M*pH!GGzL%P)V2*ROm>!$Y=z|D`!_yY6e7SU$~a5q8?hZGgaYqaiLnkK%?0 zs#oI%;zOxF@g*@(V4p!$7dS1rOr6GVs6uYCTt2h)eB4?(&w8{#o)s#%gN@BBosRUe z)@P@8_Zm89pr~)b>e{tbPC~&_MR--iB{=)y;INU5#)@Gix-YpgP<-c2Ms{9zuCX|3 z!p(?VaXww&(w&uBHzoT%!A2=3HAP>SDxcljrego7rY|%hxy3XlODWffO_%g|l+7Y_ zqV(xbu)s4lV=l7M;f>vJl{`6qBm>#ZeMA}kXb97Z)?R97EkoI?x6Lp0yu1Z>PS?2{ z0QQ(8D)|lc9CO3B~e(pQM&5(1y&y=e>C^X$`)_&XuaI!IgDTVqt31wX#n+@!a_A0ZQkA zCJ2@M_4Gb5MfCrm5UPggeyh)8 zO9?`B0J#rkoCx(R0I!ko_2?iO@|oRf1;3r+i)w-2&j?=;NVIdPFsB)`|IC0zk6r9c zRrkfxWsiJ(#8QndNJj@{@WP2Ackr|r1VxV{7S&rSU(^)-M8gV>@UzOLXu9K<{6e{T zXJ6b92r$!|lwjhmgqkdswY&}c)KW4A)-ac%sU;2^fvq7gfUW4Bw$b!i@duy1CAxSn z(pyh$^Z=&O-q<{bZUP+$U}=*#M9uVc>CQVgDs4swy5&8RAHZ~$)hrTF4W zPsSa~qYv_0mJnF89RnnJTH`3}w4?~epFl=D(35$ zWa07ON$`OMBOHgCmfO(9RFc<)?$x)N}Jd2A(<*Ll7+4jrRt9w zwGxExUXd9VB#I|DwfxvJ;HZ8Q{37^wDhaZ%O!oO(HpcqfLH%#a#!~;Jl7F5>EX_=8 z{()l2NqPz>La3qJR;_v+wlK>GsHl;uRA8%j`A|yH@k5r%55S9{*Cp%uw6t`qc1!*T za2OeqtQj7sAp#Q~=5Fs&aCR9v>5V+s&RdNvo&H~6FJOjvaj--2sYYBvMq;55%z8^o z|BJDA4vzfow#DO#ZQHh;Oq_{r+qP{R9ox2TOgwQiv7Ow!zjN+A@BN;0tA2lUb#+zO z(^b89eV)D7UVE+h{mcNc6&GtpOqDn_?VAQ)Vob$hlFwW%xh>D#wml{t&Ofmm_d_+; zKDxzdr}`n2Rw`DtyIjrG)eD0vut$}dJAZ0AohZ+ZQdWXn_Z@dI_y=7t3q8x#pDI-K z2VVc&EGq445Rq-j0=U=Zx`oBaBjsefY;%)Co>J3v4l8V(T8H?49_@;K6q#r~Wwppc z4XW0(4k}cP=5ex>-Xt3oATZ~bBWKv)aw|I|Lx=9C1s~&b77idz({&q3T(Y(KbWO?+ zmcZ6?WeUsGk6>km*~234YC+2e6Zxdl~<_g2J|IE`GH%n<%PRv-50; zH{tnVts*S5*_RxFT9eM0z-pksIb^drUq4>QSww=u;UFCv2AhOuXE*V4z?MM`|ABOC4P;OfhS(M{1|c%QZ=!%rQTDFx`+}?Kdx$&FU?Y<$x;j7z=(;Lyz+?EE>ov!8vvMtSzG!nMie zsBa9t8as#2nH}n8xzN%W%U$#MHNXmDUVr@GX{?(=yI=4vks|V)!-W5jHsU|h_&+kY zS_8^kd3jlYqOoiI`ZqBVY!(UfnAGny!FowZWY_@YR0z!nG7m{{)4OS$q&YDyw6vC$ zm4!$h>*|!2LbMbxS+VM6&DIrL*X4DeMO!@#EzMVfr)e4Tagn~AQHIU8?e61TuhcKD zr!F4(kEebk(Wdk-?4oXM(rJwanS>Jc%<>R(siF+>+5*CqJLecP_we33iTFTXr6W^G z7M?LPC-qFHK;E!fxCP)`8rkxZyFk{EV;G-|kwf4b$c1k0atD?85+|4V%YATWMG|?K zLyLrws36p%Qz6{}>7b>)$pe>mR+=IWuGrX{3ZPZXF3plvuv5Huax86}KX*lbPVr}L z{C#lDjdDeHr~?l|)Vp_}T|%$qF&q#U;ClHEPVuS+Jg~NjC1RP=17=aQKGOcJ6B3mp z8?4*-fAD~}sX*=E6!}^u8)+m2j<&FSW%pYr_d|p_{28DZ#Cz0@NF=gC-o$MY?8Ca8 zr5Y8DSR^*urS~rhpX^05r30Ik#2>*dIOGxRm0#0YX@YQ%Mg5b6dXlS!4{7O_kdaW8PFSdj1=ryI-=5$fiieGK{LZ+SX(1b=MNL!q#lN zv98?fqqTUH8r8C7v(cx#BQ5P9W>- zmW93;eH6T`vuJ~rqtIBg%A6>q>gnWb3X!r0wh_q;211+Om&?nvYzL1hhtjB zK_7G3!n7PL>d!kj){HQE zE8(%J%dWLh1_k%gVXTZt zEdT09XSKAx27Ncaq|(vzL3gm83q>6CAw<$fTnMU05*xAe&rDfCiu`u^1)CD<>sx0i z*hr^N_TeN89G(nunZoLBf^81#pmM}>JgD@Nn1l*lN#a=B=9pN%tmvYFjFIoKe_(GF z-26x{(KXdfsQL7Uv6UtDuYwV`;8V3w>oT_I<`Ccz3QqK9tYT5ZQzbop{=I=!pMOCb zCU68`n?^DT%^&m>A%+-~#lvF!7`L7a{z<3JqIlk1$<||_J}vW1U9Y&eX<}l8##6i( zZcTT@2`9(Mecptm@{3A_Y(X`w9K0EwtPq~O!16bq{7c0f7#(3wn-^)h zxV&M~iiF!{-6A@>o;$RzQ5A50kxXYj!tcgme=Qjrbje~;5X2xryU;vH|6bE(8z^<7 zQ>BG7_c*JG8~K7Oe68i#0~C$v?-t@~@r3t2inUnLT(c=URpA9kA8uq9PKU(Ps(LVH zqgcqW>Gm?6oV#AldDPKVRcEyQIdTT`Qa1j~vS{<;SwyTdr&3*t?J)y=M7q*CzucZ&B0M=joT zBbj@*SY;o2^_h*>R0e({!QHF0=)0hOj^B^d*m>SnRrwq>MolNSgl^~r8GR#mDWGYEIJA8B<|{{j?-7p zVnV$zancW3&JVDtVpIlI|5djKq0(w$KxEFzEiiL=h5Jw~4Le23@s(mYyXWL9SX6Ot zmb)sZaly_P%BeX_9 zw&{yBef8tFm+%=--m*J|o~+Xg3N+$IH)t)=fqD+|fEk4AAZ&!wcN5=mi~Vvo^i`}> z#_3ahR}Ju)(Px7kev#JGcSwPXJ2id9%Qd2A#Uc@t8~egZ8;iC{e! z%=CGJOD1}j!HW_sgbi_8suYnn4#Ou}%9u)dXd3huFIb!ytlX>Denx@pCS-Nj$`VO&j@(z!kKSP0hE4;YIP#w9ta=3DO$7f*x zc9M4&NK%IrVmZAe=r@skWD`AEWH=g+r|*13Ss$+{c_R!b?>?UaGXlw*8qDmY#xlR= z<0XFbs2t?8i^G~m?b|!Hal^ZjRjt<@a? z%({Gn14b4-a|#uY^=@iiKH+k?~~wTj5K1A&hU z2^9-HTC)7zpoWK|$JXaBL6C z#qSNYtY>65T@Zs&-0cHeu|RX(Pxz6vTITdzJdYippF zC-EB+n4}#lM7`2Ry~SO>FxhKboIAF#Z{1wqxaCb{#yEFhLuX;Rx(Lz%T`Xo1+a2M}7D+@wol2)OJs$TwtRNJ={( zD@#zTUEE}#Fz#&(EoD|SV#bayvr&E0vzmb%H?o~46|FAcx?r4$N z&67W3mdip-T1RIxwSm_&(%U|+WvtGBj*}t69XVd&ebn>KOuL(7Y8cV?THd-(+9>G7*Nt%T zcH;`p={`SOjaf7hNd(=37Lz3-51;58JffzIPgGs_7xIOsB5p2t&@v1mKS$2D$*GQ6 zM(IR*j4{nri7NMK9xlDy-hJW6sW|ZiDRaFiayj%;(%51DN!ZCCCXz+0Vm#};70nOx zJ#yA0P3p^1DED;jGdPbQWo0WATN=&2(QybbVdhd=Vq*liDk`c7iZ?*AKEYC#SY&2g z&Q(Ci)MJ{mEat$ZdSwTjf6h~roanYh2?9j$CF@4hjj_f35kTKuGHvIs9}Re@iKMxS-OI*`0S z6s)fOtz}O$T?PLFVSeOjSO26$@u`e<>k(OSP!&YstH3ANh>)mzmKGNOwOawq-MPXe zy4xbeUAl6tamnx))-`Gi2uV5>9n(73yS)Ukma4*7fI8PaEwa)dWHs6QA6>$}7?(L8 ztN8M}?{Tf!Zu22J5?2@95&rQ|F7=FK-hihT-vDp!5JCcWrVogEnp;CHenAZ)+E+K5 z$Cffk5sNwD_?4+ymgcHR(5xgt20Z8M`2*;MzOM#>yhk{r3x=EyM226wb&!+j`W<%* zSc&|`8!>dn9D@!pYow~(DsY_naSx7(Z4i>cu#hA5=;IuI88}7f%)bRkuY2B;+9Uep zpXcvFWkJ!mQai63BgNXG26$5kyhZ2&*3Q_tk)Ii4M>@p~_~q_cE!|^A;_MHB;7s#9 zKzMzK{lIxotjc};k67^Xsl-gS!^*m*m6kn|sbdun`O?dUkJ{0cmI0-_2y=lTAfn*Y zKg*A-2sJq)CCJgY0LF-VQvl&6HIXZyxo2#!O&6fOhbHXC?%1cMc6y^*dOS{f$=137Ds1m01qs`>iUQ49JijsaQ( zksqV9@&?il$|4Ua%4!O15>Zy&%gBY&wgqB>XA3!EldQ%1CRSM(pp#k~-pkcCg4LAT zXE=puHbgsw)!xtc@P4r~Z}nTF=D2~j(6D%gTBw$(`Fc=OOQ0kiW$_RDd=hcO0t97h zb86S5r=>(@VGy1&#S$Kg_H@7G^;8Ue)X5Y+IWUi`o;mpvoV)`fcVk4FpcT|;EG!;? zHG^zrVVZOm>1KFaHlaogcWj(v!S)O(Aa|Vo?S|P z5|6b{qkH(USa*Z7-y_Uvty_Z1|B{rTS^qmEMLEYUSk03_Fg&!O3BMo{b^*`3SHvl0 zhnLTe^_vVIdcSHe)SQE}r~2dq)VZJ!aSKR?RS<(9lzkYo&dQ?mubnWmgMM37Nudwo z3Vz@R{=m2gENUE3V4NbIzAA$H1z0pagz94-PTJyX{b$yndsdKptmlKQKaaHj@3=ED zc7L?p@%ui|RegVYutK$64q4pe9+5sv34QUpo)u{1ci?)_7gXQd{PL>b0l(LI#rJmN zGuO+%GO`xneFOOr4EU(Wg}_%bhzUf;d@TU+V*2#}!2OLwg~%D;1FAu=Un>OgjPb3S z7l(riiCwgghC=Lm5hWGf5NdGp#01xQ59`HJcLXbUR3&n%P(+W2q$h2Qd z*6+-QXJ*&Kvk9ht0f0*rO_|FMBALen{j7T1l%=Q>gf#kma zQlg#I9+HB+z*5BMxdesMND`_W;q5|FaEURFk|~&{@qY32N$G$2B=&Po{=!)x5b!#n zxLzblkq{yj05#O7(GRuT39(06FJlalyv<#K4m}+vs>9@q-&31@1(QBv82{}Zkns~K ze{eHC_RDX0#^A*JQTwF`a=IkE6Ze@j#-8Q`tTT?k9`^ZhA~3eCZJ-Jr{~7Cx;H4A3 zcZ+Zj{mzFZbVvQ6U~n>$U2ZotGsERZ@}VKrgGh0xM;Jzt29%TX6_&CWzg+YYMozrM z`nutuS)_0dCM8UVaKRj804J4i%z2BA_8A4OJRQ$N(P9Mfn-gF;4#q788C@9XR0O3< zsoS4wIoyt046d+LnSCJOy@B@Uz*#GGd#+Ln1ek5Dv>(ZtD@tgZlPnZZJGBLr^JK+!$$?A_fA3LOrkoDRH&l7 zcMcD$Hsjko3`-{bn)jPL6E9Ds{WskMrivsUu5apD z?grQO@W7i5+%X&E&p|RBaEZ(sGLR@~(y^BI@lDMot^Ll?!`90KT!JXUhYS`ZgX3jnu@Ja^seA*M5R@f`=`ynQV4rc$uT1mvE?@tz)TN<=&H1%Z?5yjxcpO+6y_R z6EPuPKM5uxKpmZfT(WKjRRNHs@ib)F5WAP7QCADvmCSD#hPz$V10wiD&{NXyEwx5S z6NE`3z!IS^$s7m}PCwQutVQ#~w+V z=+~->DI*bR2j0^@dMr9`p>q^Ny~NrAVxrJtX2DUveic5vM%#N*XO|?YAWwNI$Q)_) zvE|L(L1jP@F%gOGtnlXtIv2&1i8q<)Xfz8O3G^Ea~e*HJsQgBxWL(yuLY+jqUK zRE~`-zklrGog(X}$9@ZVUw!8*=l`6mzYLtsg`AvBYz(cxmAhr^j0~(rzXdiOEeu_p zE$sf2(w(BPAvO5DlaN&uQ$4@p-b?fRs}d7&2UQ4Fh?1Hzu*YVjcndqJLw0#q@fR4u zJCJ}>_7-|QbvOfylj+e^_L`5Ep9gqd>XI3-O?Wp z-gt*P29f$Tx(mtS`0d05nHH=gm~Po_^OxxUwV294BDKT>PHVlC5bndncxGR!n(OOm znsNt@Q&N{TLrmsoKFw0&_M9$&+C24`sIXGWgQaz=kY;S{?w`z^Q0JXXBKFLj0w0U6P*+jPKyZHX9F#b0D1$&(- zrm8PJd?+SrVf^JlfTM^qGDK&-p2Kdfg?f>^%>1n8bu&byH(huaocL>l@f%c*QkX2i znl}VZ4R1en4S&Bcqw?$=Zi7ohqB$Jw9x`aM#>pHc0x z0$!q7iFu zZ`tryM70qBI6JWWTF9EjgG@>6SRzsd}3h+4D8d~@CR07P$LJ}MFsYi-*O%XVvD@yT|rJ+Mk zDllJ7$n0V&A!0flbOf)HE6P_afPWZmbhpliqJuw=-h+r;WGk|ntkWN(8tKlYpq5Ow z(@%s>IN8nHRaYb*^d;M(D$zGCv5C|uqmsDjwy4g=Lz>*OhO3z=)VD}C<65;`89Ye} zSCxrv#ILzIpEx1KdLPlM&%Cctf@FqTKvNPXC&`*H9=l=D3r!GLM?UV zOxa(8ZsB`&+76S-_xuj?G#wXBfDY@Z_tMpXJS7^mp z@YX&u0jYw2A+Z+bD#6sgVK5ZgdPSJV3>{K^4~%HV?rn~4D)*2H!67Y>0aOmzup`{D zzDp3c9yEbGCY$U<8biJ_gB*`jluz1ShUd!QUIQJ$*1;MXCMApJ^m*Fiv88RZ zFopLViw}{$Tyhh_{MLGIE2~sZ)t0VvoW%=8qKZ>h=adTe3QM$&$PO2lfqH@brt!9j ziePM8$!CgE9iz6B<6_wyTQj?qYa;eC^{x_0wuwV~W+^fZmFco-o%wsKSnjXFEx02V zF5C2t)T6Gw$Kf^_c;Ei3G~uC8SM-xyycmXyC2hAVi-IfXqhu$$-C=*|X?R0~hu z8`J6TdgflslhrmDZq1f?GXF7*ALeMmOEpRDg(s*H`4>_NAr`2uqF;k;JQ+8>A|_6ZNsNLECC%NNEb1Y1dP zbIEmNpK)#XagtL4R6BC{C5T(+=yA-(Z|Ap}U-AfZM#gwVpus3(gPn}Q$CExObJ5AC z)ff9Yk?wZ}dZ-^)?cbb9Fw#EjqQ8jxF4G3=L?Ra zg_)0QDMV1y^A^>HRI$x?Op@t;oj&H@1xt4SZ9(kifQ zb59B*`M99Td7@aZ3UWvj1rD0sE)d=BsBuW*KwkCds7ay(7*01_+L}b~7)VHI>F_!{ zyxg-&nCO?v#KOUec0{OOKy+sjWA;8rTE|Lv6I9H?CI?H(mUm8VXGwU$49LGpz&{nQp2}dinE1@lZ1iox6{ghN&v^GZv9J${7WaXj)<0S4g_uiJ&JCZ zr8-hsu`U%N;+9N^@&Q0^kVPB3)wY(rr}p7{p0qFHb3NUUHJb672+wRZs`gd1UjKPX z4o6zljKKA+Kkj?H>Ew63o%QjyBk&1!P22;MkD>sM0=z_s-G{mTixJCT9@_|*(p^bz zJ8?ZZ&;pzV+7#6Mn`_U-)k8Pjg?a;|Oe^us^PoPY$Va~yi8|?+&=y$f+lABT<*pZr zP}D{~Pq1Qyni+@|aP;ixO~mbEW9#c0OU#YbDZIaw=_&$K%Ep2f%hO^&P67hApZe`x zv8b`Mz@?M_7-)b!lkQKk)JXXUuT|B8kJlvqRmRpxtQDgvrHMXC1B$M@Y%Me!BSx3P z#2Eawl$HleZhhTS6Txm>lN_+I`>eV$&v9fOg)%zVn3O5mI*lAl>QcHuW6!Kixmq`X zBCZ*Ck6OYtDiK!N47>jxI&O2a9x7M|i^IagRr-fmrmikEQGgw%J7bO|)*$2FW95O4 zeBs>KR)izRG1gRVL;F*sr8A}aRHO0gc$$j&ds8CIO1=Gwq1%_~E)CWNn9pCtBE}+`Jelk4{>S)M)`Ll=!~gnn1yq^EX(+y*ik@3Ou0qU`IgYi3*doM+5&dU!cho$pZ zn%lhKeZkS72P?Cf68<#kll_6OAO26bIbueZx**j6o;I0cS^XiL`y+>{cD}gd%lux} z)3N>MaE24WBZ}s0ApfdM;5J_Ny}rfUyxfkC``Awo2#sgLnGPewK};dORuT?@I6(5~ z?kE)Qh$L&fwJXzK){iYx!l5$Tt|^D~MkGZPA}(o6f7w~O2G6Vvzdo*a;iXzk$B66$ zwF#;wM7A+(;uFG4+UAY(2`*3XXx|V$K8AYu#ECJYSl@S=uZW$ksfC$~qrrbQj4??z-)uz0QL}>k^?fPnJTPw% zGz)~?B4}u0CzOf@l^um}HZzbaIwPmb<)< zi_3@E9lc)Qe2_`*Z^HH;1CXOceL=CHpHS{HySy3T%<^NrWQ}G0i4e1xm_K3(+~oi$ zoHl9wzb?Z4j#90DtURtjtgvi7uw8DzHYmtPb;?%8vb9n@bszT=1qr)V_>R%s!92_` zfnHQPANx z<#hIjIMm#*(v*!OXtF+w8kLu`o?VZ5k7{`vw{Yc^qYclpUGIM_PBN1+c{#Vxv&E*@ zxg=W2W~JuV{IuRYw3>LSI1)a!thID@R=bU+cU@DbR^_SXY`MC7HOsCN z!dO4OKV7(E_Z8T#8MA1H`99?Z!r0)qKW_#|29X3#Jb+5+>qUidbeP1NJ@)(qi2S-X zao|f0_tl(O+$R|Qwd$H{_ig|~I1fbp_$NkI!0E;Y z6JrnU{1Ra6^on{9gUUB0mwzP3S%B#h0fjo>JvV~#+X0P~JV=IG=yHG$O+p5O3NUgG zEQ}z6BTp^Fie)Sg<){Z&I8NwPR(=mO4joTLHkJ>|Tnk23E(Bo`FSbPc05lF2-+)X? z6vV3*m~IBHTy*^E!<0nA(tCOJW2G4DsH7)BxLV8kICn5lu6@U*R`w)o9;Ro$i8=Q^V%uH8n3q=+Yf;SFRZu z!+F&PKcH#8cG?aSK_Tl@K9P#8o+jry@gdexz&d(Q=47<7nw@e@FFfIRNL9^)1i@;A z28+$Z#rjv-wj#heI|<&J_DiJ*s}xd-f!{J8jfqOHE`TiHHZVIA8CjkNQ_u;Ery^^t zl1I75&u^`1_q)crO+JT4rx|z2ToSC>)Or@-D zy3S>jW*sNIZR-EBsfyaJ+Jq4BQE4?SePtD2+jY8*%FsSLZ9MY>+wk?}}}AFAw)vr{ml)8LUG-y9>^t!{~|sgpxYc0Gnkg`&~R z-pilJZjr@y5$>B=VMdZ73svct%##v%wdX~9fz6i3Q-zOKJ9wso+h?VME7}SjL=!NUG{J?M&i!>ma`eoEa@IX`5G>B1(7;%}M*%-# zfhJ(W{y;>MRz!Ic8=S}VaBKqh;~7KdnGEHxcL$kA-6E~=!hrN*zw9N+_=odt<$_H_8dbo;0=42wcAETPCVGUr~v(`Uai zb{=D!Qc!dOEU6v)2eHSZq%5iqK?B(JlCq%T6av$Cb4Rko6onlG&?CqaX7Y_C_cOC3 zYZ;_oI(}=>_07}Oep&Ws7x7-R)cc8zfe!SYxJYP``pi$FDS)4Fvw5HH=FiU6xfVqIM!hJ;Rx8c0cB7~aPtNH(Nmm5Vh{ibAoU#J6 zImRCr?(iyu_4W_6AWo3*vxTPUw@vPwy@E0`(>1Qi=%>5eSIrp^`` zK*Y?fK_6F1W>-7UsB)RPC4>>Ps9)f+^MqM}8AUm@tZ->j%&h1M8s*s!LX5&WxQcAh z8mciQej@RPm?660%>{_D+7er>%zX_{s|$Z+;G7_sfNfBgY(zLB4Ey}J9F>zX#K0f6 z?dVNIeEh?EIShmP6>M+d|0wMM85Sa4diw1hrg|ITJ}JDg@o8y>(rF9mXk5M z2@D|NA)-7>wD&wF;S_$KS=eE84`BGw3g0?6wGxu8ys4rwI?9U=*^VF22t3%mbGeOh z`!O-OpF7#Vceu~F`${bW0nYVU9ecmk31V{tF%iv&5hWofC>I~cqAt@u6|R+|HLMMX zVxuSlMFOK_EQ86#E8&KwxIr8S9tj_goWtLv4f@!&h8;Ov41{J~496vp9vX=(LK#j! zAwi*21RAV-LD>9Cw3bV_9X(X3)Kr0-UaB*7Y>t82EQ%!)(&(XuAYtTsYy-dz+w=$ir)VJpe!_$ z6SGpX^i(af3{o=VlFPC);|J8#(=_8#vdxDe|Cok+ANhYwbE*FO`Su2m1~w+&9<_9~ z-|tTU_ACGN`~CNW5WYYBn^B#SwZ(t4%3aPp z;o)|L6Rk569KGxFLUPx@!6OOa+5OjQLK5w&nAmwxkC5rZ|m&HT8G%GVZxB_@ME z>>{rnXUqyiJrT(8GMj_ap#yN_!9-lO5e8mR3cJiK3NE{_UM&=*vIU`YkiL$1%kf+1 z4=jk@7EEj`u(jy$HnzE33ZVW_J4bj}K;vT?T91YlO(|Y0FU4r+VdbmQ97%(J5 zkK*Bed8+C}FcZ@HIgdCMioV%A<*4pw_n}l*{Cr4}a(lq|injK#O?$tyvyE`S%(1`H z_wwRvk#13ElkZvij2MFGOj`fhy?nC^8`Zyo%yVcUAfEr8x&J#A{|moUBAV_^f$hpaUuyQeY3da^ zS9iRgf87YBwfe}>BO+T&Fl%rfpZh#+AM?Dq-k$Bq`vG6G_b4z%Kbd&v>qFjow*mBl z-OylnqOpLg}or7_VNwRg2za3VBK6FUfFX{|TD z`Wt0Vm2H$vdlRWYQJqDmM?JUbVqL*ZQY|5&sY*?!&%P8qhA~5+Af<{MaGo(dl&C5t zE%t!J0 zh6jqANt4ABdPxSTrVV}fLsRQal*)l&_*rFq(Ez}ClEH6LHv{J#v?+H-BZ2)Wy{K@9 z+ovXHq~DiDvm>O~r$LJo!cOuwL+Oa--6;UFE2q@g3N8Qkw5E>ytz^(&($!O47+i~$ zKM+tkAd-RbmP{s_rh+ugTD;lriL~`Xwkad#;_aM?nQ7L_muEFI}U_4$phjvYgleK~`Fo`;GiC07&Hq1F<%p;9Q;tv5b?*QnR%8DYJH3P>Svmv47Y>*LPZJy8_{9H`g6kQpyZU{oJ`m%&p~D=K#KpfoJ@ zn-3cqmHsdtN!f?~w+(t+I`*7GQA#EQC^lUA9(i6=i1PqSAc|ha91I%X&nXzjYaM{8$s&wEx@aVkQ6M{E2 zfzId#&r(XwUNtPcq4Ngze^+XaJA1EK-%&C9j>^9(secqe{}z>hR5CFNveMsVA)m#S zk)_%SidkY-XmMWlVnQ(mNJ>)ooszQ#vaK;!rPmGKXV7am^_F!Lz>;~{VrIO$;!#30XRhE1QqO_~#+Ux;B_D{Nk=grn z8Y0oR^4RqtcYM)7a%@B(XdbZCOqnX#fD{BQTeLvRHd(irHKq=4*jq34`6@VAQR8WG z^%)@5CXnD_T#f%@-l${>y$tfb>2LPmc{~5A82|16mH)R?&r#KKLs7xpN-D`=&Cm^R zvMA6#Ahr<3X>Q7|-qfTY)}32HkAz$_mibYV!I)u>bmjK`qwBe(>za^0Kt*HnFbSdO z1>+ryKCNxmm^)*$XfiDOF2|{-v3KKB?&!(S_Y=Ht@|ir^hLd978xuI&N{k>?(*f8H z=ClxVJK_%_z1TH0eUwm2J+2To7FK4o+n_na)&#VLn1m;!+CX+~WC+qg1?PA~KdOlC zW)C@pw75_xoe=w7i|r9KGIvQ$+3K?L{7TGHwrQM{dCp=Z*D}3kX7E-@sZnup!BImw z*T#a=+WcTwL78exTgBn|iNE3#EsOorO z*kt)gDzHiPt07fmisA2LWN?AymkdqTgr?=loT7z@d`wnlr6oN}@o|&JX!yPzC*Y8d zu6kWlTzE1)ckyBn+0Y^HMN+GA$wUO_LN6W>mxCo!0?oiQvT`z$jbSEu&{UHRU0E8# z%B^wOc@S!yhMT49Y)ww(Xta^8pmPCe@eI5C*ed96)AX9<>))nKx0(sci8gwob_1}4 z0DIL&vsJ1_s%<@y%U*-eX z5rN&(zef-5G~?@r79oZGW1d!WaTqQn0F6RIOa9tJ=0(kdd{d1{<*tHT#cCvl*i>YY zH+L7jq8xZNcTUBqj(S)ztTU!TM!RQ}In*n&Gn<>(60G7}4%WQL!o>hbJqNDSGwl#H z`4k+twp0cj%PsS+NKaxslAEu9!#U3xT1|_KB6`h=PI0SW`P9GTa7caD1}vKEglV8# zjKZR`pluCW19c2fM&ZG)c3T3Um;ir3y(tSCJ7Agl6|b524dy5El{^EQBG?E61H0XY z`bqg!;zhGhyMFl&(o=JWEJ8n~z)xI}A@C0d2hQGvw7nGv)?POU@(kS1m=%`|+^ika zXl8zjS?xqW$WlO?Ewa;vF~XbybHBor$f<%I&*t$F5fynwZlTGj|IjZtVfGa7l&tK} zW>I<69w(cZLu)QIVG|M2xzW@S+70NinQzk&Y0+3WT*cC)rx~04O-^<{JohU_&HL5XdUKW!uFy|i$FB|EMu0eUyW;gsf`XfIc!Z0V zeK&*hPL}f_cX=@iv>K%S5kL;cl_$v?n(Q9f_cChk8Lq$glT|=e+T*8O4H2n<=NGmn z+2*h+v;kBvF>}&0RDS>)B{1!_*XuE8A$Y=G8w^qGMtfudDBsD5>T5SB;Qo}fSkkiV ze^K^M(UthkwrD!&*tTsu>Dacdj_q`~V%r_twr$(Ct&_dKeeXE?fA&4&yASJWJ*}~- zel=@W)tusynfC_YqH4ll>4Eg`Xjs5F7Tj>tTLz<0N3)X<1px_d2yUY>X~y>>93*$) z5PuNMQLf9Bu?AAGO~a_|J2akO1M*@VYN^VxvP0F$2>;Zb9;d5Yfd8P%oFCCoZE$ z4#N$^J8rxYjUE_6{T%Y>MmWfHgScpuGv59#4u6fpTF%~KB^Ae`t1TD_^Ud#DhL+Dm zbY^VAM#MrAmFj{3-BpVSWph2b_Y6gCnCAombVa|1S@DU)2r9W<> zT5L8BB^er3zxKt1v(y&OYk!^aoQisqU zH(g@_o)D~BufUXcPt!Ydom)e|aW{XiMnes2z&rE?og>7|G+tp7&^;q?Qz5S5^yd$i z8lWr4g5nctBHtigX%0%XzIAB8U|T6&JsC4&^hZBw^*aIcuNO47de?|pGXJ4t}BB`L^d8tD`H`i zqrP8?#J@8T#;{^B!KO6J=@OWKhAerih(phML`(Rg7N1XWf1TN>=Z3Do{l_!d~DND&)O)D>ta20}@Lt77qSnVsA7>)uZAaT9bsB>u&aUQl+7GiY2|dAEg@%Al3i316y;&IhQL^8fw_nwS>f60M_-m+!5)S_6EPM7Y)(Nq^8gL7(3 zOiot`6Wy6%vw~a_H?1hLVzIT^i1;HedHgW9-P#)}Y6vF%C=P70X0Tk^z9Te@kPILI z_(gk!k+0%CG)%!WnBjjw*kAKs_lf#=5HXC00s-}oM-Q1aXYLj)(1d!_a7 z*Gg4Fe6F$*ujVjI|79Z5+Pr`us%zW@ln++2l+0hsngv<{mJ%?OfSo_3HJXOCys{Ug z00*YR-(fv<=&%Q!j%b-_ppA$JsTm^_L4x`$k{VpfLI(FMCap%LFAyq;#ns5bR7V+x zO!o;c5y~DyBPqdVQX)8G^G&jWkBy2|oWTw>)?5u}SAsI$RjT#)lTV&Rf8;>u*qXnb z8F%Xb=7#$m)83z%`E;49)t3fHInhtc#kx4wSLLms!*~Z$V?bTyUGiS&m>1P(952(H zuHdv=;o*{;5#X-uAyon`hP}d#U{uDlV?W?_5UjJvf%11hKwe&(&9_~{W)*y1nR5f_ z!N(R74nNK`y8>B!0Bt_Vr!;nc3W>~RiKtGSBkNlsR#-t^&;$W#)f9tTlZz>n*+Fjz z3zXZ;jf(sTM(oDzJt4FJS*8c&;PLTW(IQDFs_5QPy+7yhi1syPCarvqrHFcf&yTy)^O<1EBx;Ir`5W{TIM>{8w&PB>ro4;YD<5LF^TjTb0!zAP|QijA+1Vg>{Afv^% zmrkc4o6rvBI;Q8rj4*=AZacy*n8B{&G3VJc)so4$XUoie0)vr;qzPZVbb<#Fc=j+8CGBWe$n|3K& z_@%?{l|TzKSlUEO{U{{%Fz_pVDxs7i9H#bnbCw7@4DR=}r_qV!Zo~CvD4ZI*+j3kO zW6_=|S`)(*gM0Z;;}nj`73OigF4p6_NPZQ-Od~e$c_);;4-7sR>+2u$6m$Gf%T{aq zle>e3(*Rt(TPD}03n5)!Ca8Pu!V}m6v0o1;5<1h$*|7z|^(3$Y&;KHKTT}hV056wuF0Xo@mK-52~r=6^SI1NC%c~CC?n>yX6wPTgiWYVz!Sx^atLby9YNn1Rk{g?|pJaxD4|9cUf|V1_I*w zzxK)hRh9%zOl=*$?XUjly5z8?jPMy%vEN)f%T*|WO|bp5NWv@B(K3D6LMl!-6dQg0 zXNE&O>Oyf%K@`ngCvbGPR>HRg5!1IV$_}m@3dWB7x3t&KFyOJn9pxRXCAzFr&%37wXG;z^xaO$ekR=LJG ztIHpY8F5xBP{mtQidqNRoz= z@){+N3(VO5bD+VrmS^YjG@+JO{EOIW)9=F4v_$Ed8rZtHvjpiEp{r^c4F6Ic#ChlC zJX^DtSK+v(YdCW)^EFcs=XP7S>Y!4=xgmv>{S$~@h=xW-G4FF9?I@zYN$e5oF9g$# zb!eVU#J+NjLyX;yb)%SY)xJdvGhsnE*JEkuOVo^k5PyS=o#vq!KD46UTW_%R=Y&0G zFj6bV{`Y6)YoKgqnir2&+sl+i6foAn-**Zd1{_;Zb7Ki=u394C5J{l^H@XN`_6XTKY%X1AgQM6KycJ+= zYO=&t#5oSKB^pYhNdzPgH~aEGW2=ec1O#s-KG z71}LOg@4UEFtp3GY1PBemXpNs6UK-ax*)#$J^pC_me;Z$Je(OqLoh|ZrW*mAMBFn< zHttjwC&fkVfMnQeen8`Rvy^$pNRFVaiEN4Pih*Y3@jo!T0nsClN)pdrr9AYLcZxZ| zJ5Wlj+4q~($hbtuY zVQ7hl>4-+@6g1i`1a)rvtp-;b0>^`Dloy(#{z~ytgv=j4q^Kl}wD>K_Y!l~ zp(_&7sh`vfO(1*MO!B%<6E_bx1)&s+Ae`O)a|X=J9y~XDa@UB`m)`tSG4AUhoM=5& znWoHlA-(z@3n0=l{E)R-p8sB9XkV zZ#D8wietfHL?J5X0%&fGg@MH~(rNS2`GHS4xTo7L$>TPme+Is~!|79=^}QbPF>m%J zFMkGzSndiPO|E~hrhCeo@&Ea{M(ieIgRWMf)E}qeTxT8Q#g-!Lu*x$v8W^M^>?-g= zwMJ$dThI|~M06rG$Sv@C@tWR>_YgaG&!BAbkGggVQa#KdtDB)lMLNVLN|51C@F^y8 zCRvMB^{GO@j=cHfmy}_pCGbP%xb{pNN>? z?7tBz$1^zVaP|uaatYaIN+#xEN4jBzwZ|YI_)p(4CUAz1ZEbDk>J~Y|63SZaak~#0 zoYKruYsWHoOlC1(MhTnsdUOwQfz5p6-D0}4;DO$B;7#M{3lSE^jnTT;ns`>!G%i*F?@pR1JO{QTuD0U+~SlZxcc8~>IB{)@8p`P&+nDxNj`*gh|u?yrv$phpQcW)Us)bi`kT%qLj(fi{dWRZ%Es2!=3mI~UxiW0$-v3vUl?#g{p6eF zMEUAqo5-L0Ar(s{VlR9g=j7+lt!gP!UN2ICMokAZ5(Agd>})#gkA2w|5+<%-CuEP# zqgcM}u@3(QIC^Gx<2dbLj?cFSws_f3e%f4jeR?4M^M3cx1f+Qr6ydQ>n)kz1s##2w zk}UyQc+Z5G-d-1}{WzjkLXgS-2P7auWSJ%pSnD|Uivj5u!xk0 z_^-N9r9o;(rFDt~q1PvE#iJZ_f>J3gcP$)SOqhE~pD2|$=GvpL^d!r z6u=sp-CrMoF7;)}Zd7XO4XihC4ji?>V&(t^?@3Q&t9Mx=qex6C9d%{FE6dvU6%d94 zIE;hJ1J)cCqjv?F``7I*6bc#X)JW2b4f$L^>j{*$R`%5VHFi*+Q$2;nyieduE}qdS{L8y8F08yLs?w}{>8>$3236T-VMh@B zq-nujsb_1aUv_7g#)*rf9h%sFj*^mIcImRV*k~Vmw;%;YH(&ylYpy!&UjUVqqtfG` zox3esju?`unJJA_zKXRJP)rA3nXc$m^{S&-p|v|-0x9LHJm;XIww7C#R$?00l&Yyj z=e}gKUOpsImwW?N)+E(awoF@HyP^EhL+GlNB#k?R<2>95hz!h9sF@U20DHSB3~WMa zk90+858r@-+vWwkawJ)8ougd(i#1m3GLN{iSTylYz$brAsP%=&m$mQQrH$g%3-^VR zE%B`Vi&m8f3T~&myTEK28BDWCVzfWir1I?03;pX))|kY5ClO^+bae z*7E?g=3g7EiisYOrE+lA)2?Ln6q2*HLNpZEWMB|O-JI_oaHZB%CvYB(%=tU= zE*OY%QY58fW#RG5=gm0NR#iMB=EuNF@)%oZJ}nmm=tsJ?eGjia{e{yuU0l3{d^D@)kVDt=1PE)&tf_hHC%0MB znL|CRCPC}SeuVTdf>-QV70`0(EHizc21s^sU>y%hW0t!0&y<7}Wi-wGy>m%(-jsDj zP?mF|>p_K>liZ6ZP(w5(|9Ga%>tLgb$|doDDfkdW>Z z`)>V2XC?NJT26mL^@ zf+IKr27TfM!UbZ@?zRddC7#6ss1sw%CXJ4FWC+t3lHZupzM77m^=9 z&(a?-LxIq}*nvv)y?27lZ{j zifdl9hyJudyP2LpU$-kXctshbJDKS{WfulP5Dk~xU4Le4c#h^(YjJit4#R8_khheS z|8(>2ibaHES4+J|DBM7I#QF5u-*EdN{n=Kt@4Zt?@Tv{JZA{`4 zU#kYOv{#A&gGPwT+$Ud}AXlK3K7hYzo$(fBSFjrP{QQ zeaKg--L&jh$9N}`pu{Bs>?eDFPaWY4|9|foN%}i;3%;@4{dc+iw>m}{3rELqH21G! z`8@;w-zsJ1H(N3%|1B@#ioLOjib)j`EiJqPQVSbPSPVHCj6t5J&(NcWzBrzCiDt{4 zdlPAUKldz%6x5II1H_+jv)(xVL+a;P+-1hv_pM>gMRr%04@k;DTokASSKKhU1Qms| zrWh3a!b(J3n0>-tipg{a?UaKsP7?+|@A+1WPDiQIW1Sf@qDU~M_P65_s}7(gjTn0X zucyEm)o;f8UyshMy&>^SC3I|C6jR*R_GFwGranWZe*I>K+0k}pBuET&M~ z;Odo*ZcT?ZpduHyrf8E%IBFtv;JQ!N_m>!sV6ly$_1D{(&nO~w)G~Y`7sD3#hQk%^ zp}ucDF_$!6DAz*PM8yE(&~;%|=+h(Rn-=1Wykas_-@d&z#=S}rDf`4w(rVlcF&lF! z=1)M3YVz7orwk^BXhslJ8jR);sh^knJW(Qmm(QdSgIAIdlN4Te5KJisifjr?eB{FjAX1a0AB>d?qY4Wx>BZ8&}5K0fA+d{l8 z?^s&l8#j7pR&ijD?0b%;lL9l$P_mi2^*_OL+b}4kuLR$GAf85sOo02?Y#90}CCDiS zZ%rbCw>=H~CBO=C_JVV=xgDe%b4FaEFtuS7Q1##y686r%F6I)s-~2(}PWK|Z8M+Gu zl$y~5@#0Ka%$M<&Cv%L`a8X^@tY&T7<0|(6dNT=EsRe0%kp1Qyq!^43VAKYnr*A5~ zsI%lK1ewqO;0TpLrT9v}!@vJK{QoVa_+N4FYT#h?Y8rS1S&-G+m$FNMP?(8N`MZP zels(*?kK{{^g9DOzkuZXJ2;SrOQsp9T$hwRB1(phw1c7`!Q!by?Q#YsSM#I12RhU{$Q+{xj83axHcftEc$mNJ8_T7A-BQc*k(sZ+~NsO~xAA zxnbb%dam_fZlHvW7fKXrB~F&jS<4FD2FqY?VG?ix*r~MDXCE^WQ|W|WM;gsIA4lQP zJ2hAK@CF*3*VqPr2eeg6GzWFlICi8S>nO>5HvWzyZTE)hlkdC_>pBej*>o0EOHR|) z$?};&I4+_?wvL*g#PJ9)!bc#9BJu1(*RdNEn>#Oxta(VWeM40ola<0aOe2kSS~{^P zDJBd}0L-P#O-CzX*%+$#v;(x%<*SPgAje=F{Zh-@ucd2DA(yC|N_|ocs*|-!H%wEw z@Q!>siv2W;C^^j^59OAX03&}&D*W4EjCvfi(ygcL#~t8XGa#|NPO+*M@Y-)ctFA@I z-p7npT1#5zOLo>7q?aZpCZ=iecn3QYklP;gF0bq@>oyBq94f6C=;Csw3PkZ|5q=(c zfs`aw?II0e(h=|7o&T+hq&m$; zBrE09Twxd9BJ2P+QPN}*OdZ-JZV7%av@OM7v!!NL8R;%WFq*?{9T3{ct@2EKgc8h) zMxoM$SaF#p<`65BwIDfmXG6+OiK0e)`I=!A3E`+K@61f}0e z!2a*FOaDrOe>U`q%K!QN`&=&0C~)CaL3R4VY(NDt{Xz(Xpqru5=r#uQN1L$Je1*dkdqQ*=lofQaN%lO!<5z9ZlHgxt|`THd>2 zsWfU$9=p;yLyJyM^t zS2w9w?Bpto`@H^xJpZDKR1@~^30Il6oFGfk5%g6w*C+VM)+%R@gfIwNprOV5{F^M2 zO?n3DEzpT+EoSV-%OdvZvNF+pDd-ZVZ&d8 zKeIyrrfPN=EcFRCPEDCVflX#3-)Ik_HCkL(ejmY8vzcf-MTA{oHk!R2*36`O68$7J zf}zJC+bbQk--9Xm!u#lgLvx8TXx2J258E5^*IZ(FXMpq$2LUUvhWQPs((z1+2{Op% z?J}9k5^N=z;7ja~zi8a_-exIqWUBJwohe#4QJ`|FF*$C{lM18z^#hX6!5B8KAkLUX ziP=oti-gpV(BsLD{0(3*dw}4JxK23Y7M{BeFPucw!sHpY&l%Ws4pSm`+~V7;bZ%Dx zeI)MK=4vC&5#;2MT7fS?^ch9?2;%<8Jlu-IB&N~gg8t;6S-#C@!NU{`p7M8@2iGc& zg|JPg%@gCoCQ&s6JvDU&`X2S<57f(k8nJ1wvBu{8r?;q3_kpZZ${?|( z+^)UvR33sjSd)aT!UPkA;ylO6{aE3MQa{g%Mcf$1KONcjO@&g5zPHWtzM1rYC{_K> zgQNcs<{&X{OA=cEWw5JGqpr0O>x*Tfak2PE9?FuWtz^DDNI}rwAaT0(bdo-<+SJ6A z&}S%boGMWIS0L}=S>|-#kRX;e^sUsotry(MjE|3_9duvfc|nwF#NHuM-w7ZU!5ei8 z6Mkf>2)WunY2eU@C-Uj-A zG(z0Tz2YoBk>zCz_9-)4a>T46$(~kF+Y{#sA9MWH%5z#zNoz)sdXq7ZR_+`RZ%0(q zC7&GyS_|BGHNFl8Xa%@>iWh%Gr?=J5<(!OEjauj5jyrA-QXBjn0OAhJJ9+v=!LK`` z@g(`^*84Q4jcDL`OA&ZV60djgwG`|bcD*i50O}Q{9_noRg|~?dj%VtKOnyRs$Uzqg z191aWoR^rDX#@iSq0n z?9Sg$WSRPqSeI<}&n1T3!6%Wj@5iw5`*`Btni~G=&;J+4`7g#OQTa>u`{4ZZ(c@s$ zK0y;ySOGD-UTjREKbru{QaS>HjN<2)R%Nn-TZiQ(Twe4p@-saNa3~p{?^V9Nixz@a zykPv~<@lu6-Ng9i$Lrk(xi2Tri3q=RW`BJYOPC;S0Yly%77c727Yj-d1vF!Fuk{Xh z)lMbA69y7*5ufET>P*gXQrxsW+ zz)*MbHZv*eJPEXYE<6g6_M7N%#%mR{#awV3i^PafNv(zyI)&bH?F}2s8_rR(6%!V4SOWlup`TKAb@ee>!9JKPM=&8g#BeYRH9FpFybxBXQI2|g}FGJfJ+ zY-*2hB?o{TVL;Wt_ek;AP5PBqfDR4@Z->_182W z{P@Mc27j6jE*9xG{R$>6_;i=y{qf(c`5w9fa*`rEzX6t!KJ(p1H|>J1pC-2zqWENF zmm=Z5B4u{cY2XYl(PfrInB*~WGWik3@1oRhiMOS|D;acnf-Bs(QCm#wR;@Vf!hOPJ zgjhDCfDj$HcyVLJ=AaTbQ{@vIv14LWWF$=i-BDoC11}V;2V8A`S>_x)vIq44-VB-v z*w-d}$G+Ql?En8j!~ZkCpQ$|cA0|+rrY>tiCeWxkRGPoarxlGU2?7%k#F693RHT24 z-?JsiXlT2PTqZqNb&sSc>$d;O4V@|b6VKSWQb~bUaWn1Cf0+K%`Q&Wc<>mQ>*iEGB zbZ;aYOotBZ{vH3y<0A*L0QVM|#rf*LIsGx(O*-7)r@yyBIzJnBFSKBUSl1e|8lxU* zzFL+YDVVkIuzFWeJ8AbgN&w(4-7zbiaMn{5!JQXu)SELk*CNL+Fro|2v|YO)1l15t zs(0^&EB6DPMyaqvY>=KL>)tEpsn;N5Q#yJj<9}ImL((SqErWN3Q=;tBO~ExTCs9hB z2E$7eN#5wX4<3m^5pdjm#5o>s#eS_Q^P)tm$@SawTqF*1dj_i#)3};JslbLKHXl_N z)Fxzf>FN)EK&Rz&*|6&%Hs-^f{V|+_vL1S;-1K-l$5xiC@}%uDuwHYhmsV?YcOUlk zOYkG5v2+`+UWqpn0aaaqrD3lYdh0*!L`3FAsNKu=Q!vJu?Yc8n|CoYyDo_`r0mPoo z8>XCo$W4>l(==h?2~PoRR*kEe)&IH{1sM41mO#-36`02m#nTX{r*r`Q5rZ2-sE|nA zhnn5T#s#v`52T5|?GNS`%HgS2;R(*|^egNPDzzH_z^W)-Q98~$#YAe)cEZ%vge965AS_am#DK#pjPRr-!^za8>`kksCAUj(Xr*1NW5~e zpypt_eJpD&4_bl_y?G%>^L}=>xAaV>KR6;^aBytqpiHe%!j;&MzI_>Sx7O%F%D*8s zSN}cS^<{iiK)=Ji`FpO#^zY!_|D)qeRNAtgmH)m;qC|mq^j(|hL`7uBz+ULUj37gj zksdbnU+LSVo35riSX_4z{UX=%n&}7s0{WuZYoSfwAP`8aKN9P@%e=~1`~1ASL-z%# zw>DO&ixr}c9%4InGc*_y42bdEk)ZdG7-mTu0bD@_vGAr*NcFoMW;@r?@LUhRI zCUJgHb`O?M3!w)|CPu~ej%fddw20lod?Ufp8Dmt0PbnA0J%KE^2~AIcnKP()025V> zG>noSM3$5Btmc$GZoyP^v1@Poz0FD(6YSTH@aD0}BXva?LphAiSz9f&Y(aDAzBnUh z?d2m``~{z;{}kZJ>a^wYI?ry(V9hIoh;|EFc0*-#*`$T0DRQ1;WsqInG;YPS+I4{g zJGpKk%%Sdc5xBa$Q^_I~(F97eqDO7AN3EN0u)PNBAb+n+ zWBTxQx^;O9o0`=g+Zrt_{lP!sgWZHW?8bLYS$;1a@&7w9rD9|Ge;Gb?sEjFoF9-6v z#!2)t{DMHZ2@0W*fCx;62d#;jouz`R5Y(t{BT=$N4yr^^o$ON8d{PQ=!O zX17^CrdM~7D-;ZrC!||<+FEOxI_WI3CA<35va%4v>gc zEX-@h8esj=a4szW7x{0g$hwoWRQG$yK{@3mqd-jYiVofJE!Wok1* znV7Gm&Ssq#hFuvj1sRyHg(6PFA5U*Q8Rx>-blOs=lb`qa{zFy&n4xY;sd$fE+<3EI z##W$P9M{B3c3Si9gw^jlPU-JqD~Cye;wr=XkV7BSv#6}DrsXWFJ3eUNrc%7{=^sP> zrp)BWKA9<}^R9g!0q7yWlh;gr_TEOD|#BmGq<@IV;ueg+D2}cjpp+dPf&Q(36sFU&K8}hA85U61faW&{ zlB`9HUl-WWCG|<1XANN3JVAkRYvr5U4q6;!G*MTdSUt*Mi=z_y3B1A9j-@aK{lNvx zK%p23>M&=KTCgR!Ee8c?DAO2_R?B zkaqr6^BSP!8dHXxj%N1l+V$_%vzHjqvu7p@%Nl6;>y*S}M!B=pz=aqUV#`;h%M0rU zHfcog>kv3UZAEB*g7Er@t6CF8kHDmKTjO@rejA^ULqn!`LwrEwOVmHx^;g|5PHm#B zZ+jjWgjJ!043F+&#_;D*mz%Q60=L9Ove|$gU&~As5^uz@2-BfQ!bW)Khn}G+Wyjw- z19qI#oB(RSNydn0t~;tAmK!P-d{b-@@E5|cdgOS#!>%#Rj6ynkMvaW@37E>@hJP^8 z2zk8VXx|>#R^JCcWdBCy{0nPmYFOxN55#^-rlqobe0#L6)bi?E?SPymF*a5oDDeSd zO0gx?#KMoOd&G(2O@*W)HgX6y_aa6iMCl^~`{@UR`nMQE`>n_{_aY5nA}vqU8mt8H z`oa=g0SyiLd~BxAj2~l$zRSDHxvDs;I4>+M$W`HbJ|g&P+$!U7-PHX4RAcR0szJ*( ze-417=bO2q{492SWrqDK+L3#ChUHtz*@MP)e^%@>_&#Yk^1|tv@j4%3T)diEX zATx4K*hcO`sY$jk#jN5WD<=C3nvuVsRh||qDHnc~;Kf59zr0;c7VkVSUPD%NnnJC_ zl3F^#f_rDu8l}l8qcAz0FFa)EAt32IUy_JLIhU_J^l~FRH&6-ivSpG2PRqzDdMWft>Zc(c)#tb%wgmWN%>IOPm zZi-noqS!^Ftb81pRcQi`X#UhWK70hy4tGW1mz|+vI8c*h@ zfFGJtW3r>qV>1Z0r|L>7I3un^gcep$AAWfZHRvB|E*kktY$qQP_$YG60C@X~tTQjB3%@`uz!qxtxF+LE!+=nrS^07hn` zEgAp!h|r03h7B!$#OZW#ACD+M;-5J!W+{h|6I;5cNnE(Y863%1(oH}_FTW})8zYb$7czP zg~Szk1+_NTm6SJ0MS_|oSz%e(S~P-&SFp;!k?uFayytV$8HPwuyELSXOs^27XvK-D zOx-Dl!P|28DK6iX>p#Yb%3`A&CG0X2S43FjN%IB}q(!hC$fG}yl1y9W&W&I@KTg6@ zK^kpH8=yFuP+vI^+59|3%Zqnb5lTDAykf z9S#X`3N(X^SpdMyWQGOQRjhiwlj!0W-yD<3aEj^&X%=?`6lCy~?`&WSWt z?U~EKFcCG_RJ(Qp7j=$I%H8t)Z@6VjA#>1f@EYiS8MRHZphp zMA_5`znM=pzUpBPO)pXGYpQ6gkine{6u_o!P@Q+NKJ}k!_X7u|qfpAyIJb$_#3@wJ z<1SE2Edkfk9C!0t%}8Yio09^F`YGzpaJHGk*-ffsn85@)%4@`;Fv^8q(-Wk7r=Q8p zT&hD`5(f?M{gfzGbbwh8(}G#|#fDuk7v1W)5H9wkorE0ZZjL0Q1=NRGY>zwgfm81DdoaVwNH;or{{eSyybt)m<=zXoA^RALYG-2t zouH|L*BLvmm9cdMmn+KGopyR@4*=&0&4g|FLoreZOhRmh=)R0bg~ zT2(8V_q7~42-zvb)+y959OAv!V$u(O3)%Es0M@CRFmG{5sovIq4%8Ahjk#*5w{+)+ zMWQoJI_r$HxL5km1#6(e@{lK3Udc~n0@g`g$s?VrnQJ$!oPnb?IHh-1qA`Rz$)Ai< z6w$-MJW-gKNvOhL+XMbE7&mFt`x1KY>k4(!KbbpZ`>`K@1J<(#vVbjx@Z@(6Q}MF# zMnbr-f55(cTa^q4+#)=s+ThMaV~E`B8V=|W_fZWDwiso8tNMTNse)RNBGi=gVwgg% zbOg8>mbRN%7^Um-7oj4=6`$|(K7!+t^90a{$18Z>}<#!bm%ZEFQ{X(yBZMc>lCz0f1I2w9Sq zuGh<9<=AO&g6BZte6hn>Qmvv;Rt)*cJfTr2=~EnGD8P$v3R|&1RCl&7)b+`=QGapi zPbLg_pxm`+HZurtFZ;wZ=`Vk*do~$wB zxoW&=j0OTbQ=Q%S8XJ%~qoa3Ea|au5o}_(P;=!y-AjFrERh%8la!z6Fn@lR?^E~H12D?8#ht=1F;7@o4$Q8GDj;sSC%Jfn01xgL&%F2 zwG1|5ikb^qHv&9hT8w83+yv&BQXOQyMVJSBL(Ky~p)gU3#%|blG?IR9rP^zUbs7rOA0X52Ao=GRt@C&zlyjNLv-} z9?*x{y(`509qhCV*B47f2hLrGl^<@SuRGR!KwHei?!CM10Tq*YDIoBNyRuO*>3FU? zHjipIE#B~y3FSfOsMfj~F9PNr*H?0oHyYB^G(YyNh{SxcE(Y-`x5jFMKb~HO*m+R% zrq|ic4fzJ#USpTm;X7K+E%xsT_3VHKe?*uc4-FsILUH;kL>_okY(w`VU*8+l>o>Jm ziU#?2^`>arnsl#)*R&nf_%>A+qwl%o{l(u)M?DK1^mf260_oteV3#E_>6Y4!_hhVD zM8AI6MM2V*^_M^sQ0dmHu11fy^kOqXqzpr?K$`}BKWG`=Es(9&S@K@)ZjA{lj3ea7_MBP zk(|hBFRjHVMN!sNUkrB;(cTP)T97M$0Dtc&UXSec<+q?y>5=)}S~{Z@ua;1xt@=T5 zI7{`Z=z_X*no8s>mY;>BvEXK%b`a6(DTS6t&b!vf_z#HM{Uoy_5fiB(zpkF{})ruka$iX*~pq1ZxD?q68dIo zIZSVls9kFGsTwvr4{T_LidcWtt$u{kJlW7moRaH6+A5hW&;;2O#$oKyEN8kx`LmG)Wfq4ykh+q{I3|RfVpkR&QH_x;t41Uw z`P+tft^E2B$domKT@|nNW`EHwyj>&}K;eDpe z1bNOh=fvIfk`&B61+S8ND<(KC%>y&?>opCnY*r5M+!UrWKxv0_QvTlJc>X#AaI^xo zaRXL}t5Ej_Z$y*|w*$6D+A?Lw-CO-$itm^{2Ct82-<0IW)0KMNvJHgBrdsIR0v~=H z?n6^}l{D``Me90`^o|q!olsF?UX3YSq^6Vu>Ijm>>PaZI8G@<^NGw{Cx&%|PwYrfw zR!gX_%AR=L3BFsf8LxI|K^J}deh0ZdV?$3r--FEX`#INxsOG6_=!v)DI>0q|BxT)z z-G6kzA01M?rba+G_mwNMQD1mbVbNTWmBi*{s_v_Ft9m2Avg!^78(QFu&n6mbRJ2bA zv!b;%yo{g*9l2)>tsZJOOp}U~8VUH`}$ z8p_}t*XIOehezolNa-a2x0BS})Y9}&*TPgua{Ewn-=wVrmJUeU39EKx+%w%=ixQWK zDLpwaNJs65#6o7Ln7~~X+p_o2BR1g~VCfxLzxA{HlWAI6^H;`juI=&r1jQrUv_q0Z z1Ja-tjdktrrP>GOC*#p?*xfQU5MqjMsBe!9lh(u8)w$e@Z|>aUHI5o;MGw*|Myiz3 z-f0;pHg~Q#%*Kx8MxH%AluVXjG2C$)WL-K63@Q`#y9_k_+}eR(x4~dp7oV-ek0H>I zgy8p#i4GN{>#v=pFYUQT(g&b$OeTy-X_#FDgNF8XyfGY6R!>inYn8IR2RDa&O!(6< znXs{W!bkP|s_YI*Yx%4stI`=ZO45IK6rBs`g7sP40ic}GZ58s?Mc$&i`kq_tfci>N zIHrC0H+Qpam1bNa=(`SRKjixBTtm&e`j9porEci!zdlg1RI0Jw#b(_Tb@RQK1Zxr_ z%7SUeH6=TrXt3J@js`4iDD0=IoHhK~I7^W8^Rcp~Yaf>2wVe|Hh1bUpX9ATD#moByY57-f2Ef1TP^lBi&p5_s7WGG9|0T}dlfxOx zXvScJO1Cnq`c`~{Dp;{;l<-KkCDE+pmexJkd}zCgE{eF=)K``-qC~IT6GcRog_)!X z?fK^F8UDz$(zFUrwuR$qro5>qqn>+Z%<5>;_*3pZ8QM|yv9CAtrAx;($>4l^_$_-L z*&?(77!-=zvnCVW&kUcZMb6;2!83si518Y%R*A3JZ8Is|kUCMu`!vxDgaWjs7^0j( ziTaS4HhQ)ldR=r)_7vYFUr%THE}cPF{0H45FJ5MQW^+W>P+eEX2kLp3zzFe*-pFVA zdDZRybv?H|>`9f$AKVjFWJ=wegO7hOOIYCtd?Vj{EYLT*^gl35|HQ`R=ti+ADm{jyQE7K@kdjuqJhWVSks>b^ zxha88-h3s;%3_5b1TqFCPTxVjvuB5U>v=HyZ$?JSk+&I%)M7KE*wOg<)1-Iy)8-K! z^XpIt|0ibmk9RtMmlUd7#Ap3Q!q9N4atQy)TmrhrFhfx1DAN`^vq@Q_SRl|V z#lU<~n67$mT)NvHh`%als+G-)x1`Y%4Bp*6Un5Ri9h=_Db zA-AdP!f>f0m@~>7X#uBM?diI@)Egjuz@jXKvm zJo+==juc9_<;CqeRaU9_Mz@;3e=E4=6TK+c`|uu#pIqhSyNm`G(X)&)B`8q0RBv#> z`gGlw(Q=1Xmf55VHj%C#^1lpc>LY8kfA@|rlC1EA<1#`iuyNO z(=;irt{_&K=i4)^x%;U(Xv<)+o=dczC5H3W~+e|f~{*ucxj@{Yi-cw^MqYr3fN zF5D+~!wd$#al?UfMnz(@K#wn`_5na@rRr8XqN@&M&FGEC@`+OEv}sI1hw>Up0qAWf zL#e4~&oM;TVfjRE+10B_gFlLEP9?Q-dARr3xi6nQqnw>k-S;~b z;!0s2VS4}W8b&pGuK=7im+t(`nz@FnT#VD|!)eQNp-W6)@>aA+j~K*H{$G`y2|QHY z|Hmy+CR@#jWY4~)lr1qBJB_RfHJFfP<}pK5(#ZZGSqcpyS&}01LnTWk5fzmXMGHkJ zTP6L^B+uj;lmB_W<~4=${+v0>z31M!-_O@o-O9GyW)j_mjx}!0@br_LE-7SIuPP84 z;5=O(U*g_um0tyG|61N@d9lEuOeiRd+#NY^{nd5;-CVlw&Ap7J?qwM^?E29wvS}2d zbzar4Fz&RSR(-|s!Z6+za&Z zY#D<5q_JUktIzvL0)yq_kLWG6DO{ri=?c!y!f(Dk%G{8)k`Gym%j#!OgXVDD3;$&v@qy#ISJfp=Vm>pls@9-mapVQChAHHd-x+OGx)(*Yr zC1qDUTZ6mM(b_hi!TuFF2k#8uI2;kD70AQ&di$L*4P*Y-@p`jdm%_c3f)XhYD^6M8&#Y$ZpzQMcR|6nsH>b=*R_Von!$BTRj7yGCXokoAQ z&ANvx0-Epw`QIEPgI(^cS2f(Y85yV@ygI{ewyv5Frng)e}KCZF7JbR(&W618_dcEh(#+^zZFY;o<815<5sOHQdeax9_!PyM&;{P zkBa5xymca0#)c#tke@3KNEM8a_mT&1gm;p&&JlMGH(cL(b)BckgMQ^9&vRwj!~3@l zY?L5}=Jzr080OGKb|y`ee(+`flQg|!lo6>=H)X4`$Gz~hLmu2a%kYW_Uu8x09Pa0J zKZ`E$BKJ=2GPj_3l*TEcZ*uYRr<*J^#5pILTT;k_cgto1ZL-%slyc16J~OH-(RgDA z%;EjEnoUkZ&acS{Q8`{i6T5^nywgqQI5bDIymoa7CSZG|WWVk>GM9)zy*bNih|QIm z%0+(Nnc*a_xo;$=!HQYaapLms>J1ToyjtFByY`C2H1wT#178#4+|{H0BBqtCdd$L% z_3Hc60j@{t9~MjM@LBalR&6@>B;9?r<7J~F+WXyYu*y3?px*=8MAK@EA+jRX8{CG?GI-< z54?Dc9CAh>QTAvyOEm0^+x;r2BWX|{3$Y7)L5l*qVE*y0`7J>l2wCmW zL1?|a`pJ-l{fb_N;R(Z9UMiSj6pQjOvQ^%DvhIJF!+Th7jO2~1f1N+(-TyCFYQZYw z4)>7caf^Ki_KJ^Zx2JUb z&$3zJy!*+rCV4%jqwyuNY3j1ZEiltS0xTzd+=itTb;IPYpaf?8Y+RSdVdpacB(bVQ zC(JupLfFp8y43%PMj2}T|VS@%LVp>hv4Y!RPMF?pp8U_$xCJ)S zQx!69>bphNTIb9yn*_yfj{N%bY)t{L1cs8<8|!f$;UQ*}IN=2<6lA;x^(`8t?;+ST zh)z4qeYYgZkIy{$4x28O-pugO&gauRh3;lti9)9Pvw+^)0!h~%m&8Q!AKX%urEMnl z?yEz?g#ODn$UM`+Q#$Q!6|zsq_`dLO5YK-6bJM6ya>}H+vnW^h?o$z;V&wvuM$dR& zeEq;uUUh$XR`TWeC$$c&Jjau2it3#%J-y}Qm>nW*s?En?R&6w@sDXMEr#8~$=b(gk zwDC3)NtAP;M2BW_lL^5ShpK$D%@|BnD{=!Tq)o(5@z3i7Z){} zGr}Exom_qDO{kAVkZ*MbLNHE666Kina#D{&>Jy%~w7yX$oj;cYCd^p9zy z8*+wgSEcj$4{WxKmCF(5o7U4jqwEvO&dm1H#7z}%VXAbW&W24v-tS6N3}qrm1OnE)fUkoE8yMMn9S$?IswS88tQWm4#Oid#ckgr6 zRtHm!mfNl-`d>O*1~d7%;~n+{Rph6BBy^95zqI{K((E!iFQ+h*C3EsbxNo_aRm5gj zKYug($r*Q#W9`p%Bf{bi6;IY0v`pB^^qu)gbg9QHQ7 zWBj(a1YSu)~2RK8Pi#C>{DMlrqFb9e_RehEHyI{n?e3vL_}L>kYJC z_ly$$)zFi*SFyNrnOt(B*7E$??s67EO%DgoZL2XNk8iVx~X_)o++4oaK1M|ou73vA0K^503j@uuVmLcHH4ya-kOIDfM%5%(E z+Xpt~#7y2!KB&)PoyCA+$~DXqxPxxALy!g-O?<9+9KTk4Pgq4AIdUkl`1<1#j^cJg zgU3`0hkHj_jxV>`Y~%LAZl^3o0}`Sm@iw7kwff{M%VwtN)|~!p{AsfA6vB5UolF~d zHWS%*uBDt<9y!9v2Xe|au&1j&iR1HXCdyCjxSgG*L{wmTD4(NQ=mFjpa~xooc6kju z`~+d{j7$h-;HAB04H!Zscu^hZffL#9!p$)9>sRI|Yovm)g@F>ZnosF2EgkU3ln0bR zTA}|+E(tt)!SG)-bEJi_0m{l+(cAz^pi}`9=~n?y&;2eG;d9{M6nj>BHGn(KA2n|O zt}$=FPq!j`p&kQ8>cirSzkU0c08%8{^Qyqi-w2LoO8)^E7;;I1;HQ6B$u0nNaX2CY zSmfi)F`m94zL8>#zu;8|{aBui@RzRKBlP1&mfFxEC@%cjl?NBs`cr^nm){>;$g?rhKr$AO&6qV_Wbn^}5tfFBry^e1`%du2~o zs$~dN;S_#%iwwA_QvmMjh%Qo?0?rR~6liyN5Xmej8(*V9ym*T`xAhHih-v$7U}8=dfXi2i*aAB!xM(Xekg*ix@r|ymDw*{*s0?dlVys2e)z62u1 z+k3esbJE=-P5S$&KdFp+2H7_2e=}OKDrf( z9-207?6$@f4m4B+9E*e((Y89!q?zH|mz_vM>kp*HGXldO0Hg#!EtFhRuOm$u8e~a9 z5(roy7m$Kh+zjW6@zw{&20u?1f2uP&boD}$#Zy)4o&T;vyBoqFiF2t;*g=|1=)PxB z8eM3Mp=l_obbc?I^xyLz?4Y1YDWPa+nm;O<$Cn;@ane616`J9OO2r=rZr{I_Kizyc zP#^^WCdIEp*()rRT+*YZK>V@^Zs=ht32x>Kwe zab)@ZEffz;VM4{XA6e421^h~`ji5r%)B{wZu#hD}f3$y@L0JV9f3g{-RK!A?vBUA}${YF(vO4)@`6f1 z-A|}e#LN{)(eXloDnX4Vs7eH|<@{r#LodP@Nz--$Dg_Par%DCpu2>2jUnqy~|J?eZ zBG4FVsz_A+ibdwv>mLp>P!(t}E>$JGaK$R~;fb{O3($y1ssQQo|5M;^JqC?7qe|hg zu0ZOqeFcp?qVn&Qu7FQJ4hcFi&|nR!*j)MF#b}QO^lN%5)4p*D^H+B){n8%VPUzi! zDihoGcP71a6!ab`l^hK&*dYrVYzJ0)#}xVrp!e;lI!+x+bfCN0KXwUAPU9@#l7@0& QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 54708 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

_x$+l{{cH8$W#CT diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 949819d..ffed3a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip diff --git a/gradlew b/gradlew index cccdd3d..c53aefa 100644 --- a/gradlew +++ b/gradlew @@ -1,78 +1,129 @@ -#!/usr/bin/env sh +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -89,84 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index f955316..107acd3 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -13,15 +29,18 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/main/java/com/simibubi/mightyarchitect/AllBlocks.java b/src/main/java/com/simibubi/mightyarchitect/AllBlocks.java index a400317..0217f4a 100644 --- a/src/main/java/com/simibubi/mightyarchitect/AllBlocks.java +++ b/src/main/java/com/simibubi/mightyarchitect/AllBlocks.java @@ -4,10 +4,10 @@ import com.simibubi.mightyarchitect.block.IJustForRendering; import com.simibubi.mightyarchitect.block.SliceMarkerBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; import net.minecraftforge.registries.IForgeRegistry; public enum AllBlocks { diff --git a/src/main/java/com/simibubi/mightyarchitect/AllItems.java b/src/main/java/com/simibubi/mightyarchitect/AllItems.java index c782c4e..cca40ba 100644 --- a/src/main/java/com/simibubi/mightyarchitect/AllItems.java +++ b/src/main/java/com/simibubi/mightyarchitect/AllItems.java @@ -2,9 +2,9 @@ import com.simibubi.mightyarchitect.item.ArchitectWandItem; -import net.minecraft.item.Item; -import net.minecraft.item.Item.Properties; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Item.Properties; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.registries.IForgeRegistry; public enum AllItems { diff --git a/src/main/java/com/simibubi/mightyarchitect/AllPackets.java b/src/main/java/com/simibubi/mightyarchitect/AllPackets.java index e999f4a..e1fb7c4 100644 --- a/src/main/java/com/simibubi/mightyarchitect/AllPackets.java +++ b/src/main/java/com/simibubi/mightyarchitect/AllPackets.java @@ -1,13 +1,12 @@ package com.simibubi.mightyarchitect; -import com.google.common.base.Predicates; import com.simibubi.mightyarchitect.networking.InstantPrintPacket; import com.simibubi.mightyarchitect.networking.PlaceSignPacket; import com.simibubi.mightyarchitect.networking.SetHotbarItemPacket; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.network.NetworkRegistry; -import net.minecraftforge.fml.network.simple.SimpleChannel; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.fmllegacy.network.NetworkRegistry; +import net.minecraftforge.fmllegacy.network.simple.SimpleChannel; public class AllPackets { @@ -15,9 +14,10 @@ public class AllPackets { public static void registerPackets() { channel = NetworkRegistry.newSimpleChannel(new ResourceLocation(TheMightyArchitect.ID, "simple_channel"), - () -> "1", Predicates.alwaysTrue(), v -> v.equals("1")); + () -> "1", s -> true, v -> v.equals("1")); int i = 0; + channel.registerMessage(i++, InstantPrintPacket.class, InstantPrintPacket::toBytes, InstantPrintPacket::new, InstantPrintPacket::handle); channel.registerMessage(i++, PlaceSignPacket.class, PlaceSignPacket::toBytes, PlaceSignPacket::new, diff --git a/src/main/java/com/simibubi/mightyarchitect/AllSpecialTextures.java b/src/main/java/com/simibubi/mightyarchitect/AllSpecialTextures.java index b48d318..a5180e0 100644 --- a/src/main/java/com/simibubi/mightyarchitect/AllSpecialTextures.java +++ b/src/main/java/com/simibubi/mightyarchitect/AllSpecialTextures.java @@ -1,7 +1,9 @@ package com.simibubi.mightyarchitect; +import com.mojang.blaze3d.systems.RenderSystem; + import net.minecraft.client.Minecraft; -import net.minecraft.util.ResourceLocation; +import net.minecraft.resources.ResourceLocation; public enum AllSpecialTextures { @@ -36,7 +38,7 @@ private AllSpecialTextures(String filename) { } public void bind() { - Minecraft.getInstance().getTextureManager().bind(location); + RenderSystem.setShaderTexture(0, location); } public ResourceLocation getLocation() { diff --git a/src/main/java/com/simibubi/mightyarchitect/MightyClient.java b/src/main/java/com/simibubi/mightyarchitect/MightyClient.java index 1b67988..5db5844 100644 --- a/src/main/java/com/simibubi/mightyarchitect/MightyClient.java +++ b/src/main/java/com/simibubi/mightyarchitect/MightyClient.java @@ -2,35 +2,32 @@ import java.util.Random; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.control.ArchitectManager; import com.simibubi.mightyarchitect.control.SchematicRenderer; +import com.simibubi.mightyarchitect.foundation.SuperRenderTypeBuffer; import com.simibubi.mightyarchitect.foundation.utility.AnimationTickHolder; import com.simibubi.mightyarchitect.foundation.utility.Keyboard; import com.simibubi.mightyarchitect.foundation.utility.outliner.Outliner; -import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ActiveRenderInfo; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.settings.KeyBinding; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.KeyMapping; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderWorldLastEvent; -import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.event.TickEvent.ClientTickEvent; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.fmlclient.registry.ClientRegistry; @EventBusSubscriber(value = Dist.CLIENT) public class MightyClient { - public static KeyBinding COMPOSE; - public static KeyBinding TOOL_MENU; + public static KeyMapping COMPOSE; + public static KeyMapping TOOL_MENU; public static SchematicRenderer renderer = new SchematicRenderer(); public static Outliner outliner = new Outliner(); @@ -38,8 +35,8 @@ public class MightyClient { public static void init() { AllItems.initColorHandlers(); String modName = TheMightyArchitect.NAME; - COMPOSE = new KeyBinding("Start composing", Keyboard.G, modName); - TOOL_MENU = new KeyBinding("Tool Menu (Hold)", Keyboard.LALT, modName); + COMPOSE = new KeyMapping("Start composing", Keyboard.G, modName); + TOOL_MENU = new KeyMapping("Tool Menu (Hold)", Keyboard.LALT, modName); ClientRegistry.registerKeyBinding(COMPOSE); ClientRegistry.registerKeyBinding(TOOL_MENU); } @@ -61,16 +58,18 @@ public static void onTick(ClientTickEvent event) { @SubscribeEvent public static void onRenderWorld(RenderWorldLastEvent event) { - MatrixStack ms = event.getMatrixStack(); - ActiveRenderInfo info = Minecraft.getInstance().gameRenderer.getMainCamera(); - Vector3d view = info.getPosition(); + PoseStack ms = event.getMatrixStack(); + Camera info = Minecraft.getInstance().gameRenderer.getMainCamera(); + Vec3 view = info.getPosition(); ms.pushPose(); ms.translate(-view.x(), -view.y(), -view.z()); - IRenderTypeBuffer.Impl buffer = Minecraft.getInstance() + MultiBufferSource.BufferSource buffer = Minecraft.getInstance() .renderBuffers() .bufferSource(); + //SuperRenderTypeBuffer b = SuperRenderTypeBuffer.getInstance(); + MightyClient.renderer.render(ms, buffer); ArchitectManager.render(ms, buffer); MightyClient.outliner.renderOutlines(ms, buffer); @@ -83,6 +82,7 @@ public static void onRenderWorld(RenderWorldLastEvent event) { // ms, buffer.getBuffer(RenderType.getSolid()), true, new Random(), EmptyModelData.INSTANCE); // ms.pop(); + //b.draw(); buffer.endBatch(); ms.popPose(); } diff --git a/src/main/java/com/simibubi/mightyarchitect/TheMightyArchitect.java b/src/main/java/com/simibubi/mightyarchitect/TheMightyArchitect.java index e59330f..8cc7c01 100644 --- a/src/main/java/com/simibubi/mightyarchitect/TheMightyArchitect.java +++ b/src/main/java/com/simibubi/mightyarchitect/TheMightyArchitect.java @@ -3,8 +3,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import net.minecraft.block.Block; -import net.minecraft.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.item.Item; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.IEventBus; diff --git a/src/main/java/com/simibubi/mightyarchitect/block/DesignAnchorBlock.java b/src/main/java/com/simibubi/mightyarchitect/block/DesignAnchorBlock.java index 9de10c5..883c26f 100644 --- a/src/main/java/com/simibubi/mightyarchitect/block/DesignAnchorBlock.java +++ b/src/main/java/com/simibubi/mightyarchitect/block/DesignAnchorBlock.java @@ -1,13 +1,13 @@ package com.simibubi.mightyarchitect.block; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; -import net.minecraft.item.BlockItemUseContext; -import net.minecraft.state.BooleanProperty; -import net.minecraft.state.StateContainer.Builder; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.StateDefinition.Builder; -import net.minecraft.block.AbstractBlock.Properties; +import net.minecraft.world.level.block.state.BlockBehaviour.Properties; public class DesignAnchorBlock extends Block { @@ -24,7 +24,7 @@ protected void createBlockStateDefinition(Builder builder) { } @Override - public BlockState getStateForPlacement(BlockItemUseContext context) { + public BlockState getStateForPlacement(BlockPlaceContext context) { return defaultBlockState().setValue(compass, true); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/block/SliceMarkerBlock.java b/src/main/java/com/simibubi/mightyarchitect/block/SliceMarkerBlock.java index 524086c..6f5ed60 100644 --- a/src/main/java/com/simibubi/mightyarchitect/block/SliceMarkerBlock.java +++ b/src/main/java/com/simibubi/mightyarchitect/block/SliceMarkerBlock.java @@ -3,23 +3,23 @@ import com.simibubi.mightyarchitect.AllItems; import com.simibubi.mightyarchitect.control.design.DesignSlice.DesignSliceTrait; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItemUseContext; -import net.minecraft.state.BooleanProperty; -import net.minecraft.state.EnumProperty; -import net.minecraft.state.StateContainer.Builder; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.world.World; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.InteractionResult; +import net.minecraft.core.Direction.Axis; +import net.minecraft.world.InteractionHand; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.level.Level; -import net.minecraft.block.AbstractBlock.Properties; +import net.minecraft.world.level.block.state.BlockBehaviour.Properties; public class SliceMarkerBlock extends Block { @@ -39,28 +39,28 @@ protected void createBlockStateDefinition(Builder builder) { } @Override - public BlockState getStateForPlacement(BlockItemUseContext context) { + public BlockState getStateForPlacement(BlockPlaceContext context) { if (context.getLevel().getBlockState(context.getClickedPos().below()).getBlock() == this) return defaultBlockState().setValue(compass, false); return defaultBlockState().setValue(compass, true); } @Override - public ActionResultType use(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, - BlockRayTraceResult hit) { + public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, + BlockHitResult hit) { if (hit.getDirection().getAxis() == Axis.Y) - return ActionResultType.PASS; + return InteractionResult.PASS; if (AllItems.ARCHITECT_WAND.typeOf(player.getItemInHand(handIn))) - return ActionResultType.PASS; + return InteractionResult.PASS; if (worldIn.isClientSide) - return ActionResultType.SUCCESS; + return InteractionResult.SUCCESS; DesignSliceTrait currentTrait = state.getValue(VARIANT); DesignSliceTrait newTrait = currentTrait.cycle(player.isShiftKeyDown() ? -1 : 1); worldIn.setBlockAndUpdate(pos, state.setValue(VARIANT, newTrait)); - player.displayClientMessage(new StringTextComponent(newTrait.getDescription()), true); + player.displayClientMessage(new TextComponent(newTrait.getDescription()), true); - return ActionResultType.SUCCESS; + return InteractionResult.SUCCESS; } } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/ArchitectKits.java b/src/main/java/com/simibubi/mightyarchitect/control/ArchitectKits.java index 9e941dd..072f6f4 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/ArchitectKits.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/ArchitectKits.java @@ -7,12 +7,12 @@ import com.simibubi.mightyarchitect.control.palette.Palette; import com.simibubi.mightyarchitect.networking.SetHotbarItemPacket; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TextFormatting; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.ChatFormatting; public class ArchitectKits { @@ -84,9 +84,9 @@ private static void setHotbarBlock(int slot, Palette palette) { BlockState state = DesignExporter.theme.getDefaultPalette().get(palette); ItemStack stack = new ItemStack(state.getBlock().asItem()); setHotbarItem(slot, - stack.setHoverName(new StringTextComponent(TextFormatting.RESET + "" + TextFormatting.GOLD - + palette.getDisplayName() + TextFormatting.WHITE + " (" + TextFormatting.GRAY - + stack.getHoverName().getString() + TextFormatting.WHITE + ")"))); + stack.setHoverName(new TextComponent(ChatFormatting.RESET + "" + ChatFormatting.GOLD + + palette.getDisplayName() + ChatFormatting.WHITE + " (" + ChatFormatting.GRAY + + stack.getHoverName().getString() + ChatFormatting.WHITE + ")"))); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/ArchitectManager.java b/src/main/java/com/simibubi/mightyarchitect/control/ArchitectManager.java index d86be8b..e4bebc0 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/ArchitectManager.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/ArchitectManager.java @@ -9,7 +9,7 @@ import org.apache.commons.io.IOUtils; import org.lwjgl.glfw.GLFW; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.mightyarchitect.AllPackets; import com.simibubi.mightyarchitect.MightyClient; @@ -34,12 +34,12 @@ import com.simibubi.mightyarchitect.networking.InstantPrintPacket; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.CompressedStreamTools; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TextFormatting; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.ChatFormatting; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.InputEvent.KeyInputEvent; import net.minecraftforge.client.event.InputEvent.MouseInputEvent; @@ -167,9 +167,9 @@ public static void writeToFile(String name) { OutputStream outputStream = null; try { outputStream = Files.newOutputStream(Paths.get(filepath), StandardOpenOption.CREATE); - CompoundNBT nbttagcompound = getModel().writeToTemplate() - .save(new CompoundNBT()); - CompressedStreamTools.writeCompressed(nbttagcompound, outputStream); + CompoundTag nbttagcompound = getModel().writeToTemplate() + .save(new CompoundTag()); + NbtIo.writeCompressed(nbttagcompound, outputStream); } catch (IOException e) { e.printStackTrace(); } finally { @@ -181,14 +181,14 @@ public static void writeToFile(String name) { BlockPos pos = model.getAnchor() .offset(((TemplateBlockAccess) model.getMaterializedSketch()).getBounds() .getOrigin()); - StringTextComponent component = new StringTextComponent("Deploy Schematic at: " + TextFormatting.BLUE + "[" + TextComponent component = new TextComponent("Deploy Schematic at: " + ChatFormatting.BLUE + "[" + pos.getX() + "," + pos.getY() + "," + pos.getZ() + "]"); Minecraft.getInstance().player.displayClientMessage(component, false); unload(); } public static void status(String message) { - Minecraft.getInstance().player.displayClientMessage(new StringTextComponent(message), true); + Minecraft.getInstance().player.displayClientMessage(new TextComponent(message), true); } public static void pickPalette() { @@ -281,7 +281,7 @@ public static void onMouseScrolled(MouseScrollEvent event) { event.setCanceled(true); } - public static void render(MatrixStack ms, IRenderTypeBuffer buffer) { + public static void render(PoseStack ms, MultiBufferSource buffer) { if (Minecraft.getInstance().level != null) phase.getPhaseHandler() .render(ms, buffer); @@ -335,7 +335,7 @@ public static void tickBlockHighlightOutlines() { @SubscribeEvent public static void onDrawGameOverlay(RenderGameOverlayEvent.Pre event) { - if (event.getType() != ElementType.HOTBAR) + if (event.getType() != ElementType.ALL) return; IArchitectPhase phaseHandler = phase.getPhaseHandler(); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/ArchitectMenu.java b/src/main/java/com/simibubi/mightyarchitect/control/ArchitectMenu.java index acf17a7..af3bc33 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/ArchitectMenu.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/ArchitectMenu.java @@ -17,7 +17,7 @@ import com.simibubi.mightyarchitect.gui.ThemeSettingsScreen; import net.minecraft.client.Minecraft; -import net.minecraft.util.Util; +import net.minecraft.Util; public class ArchitectMenu { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/Schematic.java b/src/main/java/com/simibubi/mightyarchitect/control/Schematic.java index 24116e3..b56a409 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/Schematic.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/Schematic.java @@ -15,10 +15,10 @@ import com.simibubi.mightyarchitect.control.palette.PaletteDefinition; import com.simibubi.mightyarchitect.networking.InstantPrintPacket; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.Minecraft; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; public class Schematic { @@ -198,8 +198,8 @@ private void checkBounds(BlockPos pos) { bounds.length = z - bounds.z + 1; } - public Template writeToTemplate() { - final Template template = new Template(); + public StructureTemplate writeToTemplate() { + final StructureTemplate template = new StructureTemplate(); template.setAuthor(Minecraft.getInstance().player.getName() .getString()); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/SchematicRenderer.java b/src/main/java/com/simibubi/mightyarchitect/control/SchematicRenderer.java index e240708..7fa4b91 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/SchematicRenderer.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/SchematicRenderer.java @@ -7,20 +7,21 @@ import org.lwjgl.opengl.GL11; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexFormat; import com.simibubi.mightyarchitect.foundation.MatrixStacker; import com.simibubi.mightyarchitect.foundation.SuperByteBuffer; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BlockRendererDispatcher; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import com.mojang.blaze3d.vertex.BufferBuilder; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.RenderTypeLookup; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockDisplayReader; +import net.minecraft.client.renderer.ItemBlockRenderTypes; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockAndTintGetter; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.model.data.EmptyModelData; @@ -64,7 +65,7 @@ public void tick() { changed = false; } - public void render(MatrixStack ms, IRenderTypeBuffer buffer) { + public void render(PoseStack ms, MultiBufferSource buffer) { if (!active) return; @@ -85,11 +86,11 @@ private void redraw(Minecraft minecraft) { usedBlockRenderLayers.clear(); startedBufferBuilders.clear(); - final IBlockDisplayReader blockAccess = schematic.getMaterializedSketch(); - final BlockRendererDispatcher blockRendererDispatcher = minecraft.getBlockRenderer(); + final BlockAndTintGetter blockAccess = schematic.getMaterializedSketch(); + final BlockRenderDispatcher blockRendererDispatcher = minecraft.getBlockRenderer(); Map buffers = new HashMap<>(); - MatrixStack ms = new MatrixStack(); + PoseStack ms = new PoseStack(); BlockPos.betweenClosedStream(schematic.getLocalBounds() .toMBB()) @@ -101,16 +102,16 @@ private void redraw(Minecraft minecraft) { BlockState state = blockAccess.getBlockState(pos); for (RenderType blockRenderLayer : RenderType.chunkBufferLayers()) { - if (!RenderTypeLookup.canRenderInLayer(state, blockRenderLayer)) + if (!ItemBlockRenderTypes.canRenderInLayer(state, blockRenderLayer)) continue; ForgeHooksClient.setRenderLayer(blockRenderLayer); if (!buffers.containsKey(blockRenderLayer)) - buffers.put(blockRenderLayer, new BufferBuilder(DefaultVertexFormats.BLOCK.getIntegerSize())); + buffers.put(blockRenderLayer, new BufferBuilder(DefaultVertexFormat.BLOCK.getIntegerSize())); BufferBuilder bufferBuilder = buffers.get(blockRenderLayer); if (startedBufferBuilders.add(blockRenderLayer)) - bufferBuilder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); - if (blockRendererDispatcher.renderModel(state, pos, blockAccess, ms, bufferBuilder, true, + bufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK); + if (blockRendererDispatcher.renderBatched(state, pos, blockAccess, ms, bufferBuilder, true, minecraft.level.random, EmptyModelData.INSTANCE)) { usedBlockRenderLayers.add(blockRenderLayer); } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java b/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java index aa165d7..b39e12b 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java @@ -11,26 +11,26 @@ import com.simibubi.mightyarchitect.control.compose.Cuboid; import com.simibubi.mightyarchitect.foundation.WrappedWorld; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; import net.minecraft.client.Minecraft; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.fluid.Fluid; -import net.minecraft.particles.IParticleData; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.SoundCategory; -import net.minecraft.util.SoundEvent; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.EmptyTickList; -import net.minecraft.world.ITickList; -import net.minecraft.world.LightType; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.Biomes; -import net.minecraft.world.gen.Heightmap.Type; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.phys.AABB; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.world.level.EmptyTickList; +import net.minecraft.world.level.TickList; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biomes; +import net.minecraft.world.level.levelgen.Heightmap.Types; public class TemplateBlockAccess extends WrappedWorld { @@ -66,7 +66,7 @@ public Set getAllPositions() { } @Override - public TileEntity getBlockEntity(BlockPos pos) { + public BlockEntity getBlockEntity(BlockPos pos) { return null; } @@ -96,24 +96,24 @@ public int getMaxLocalRawBrightness(BlockPos p_201696_1_) { } @Override - public List getEntities(Entity arg0, AxisAlignedBB arg1, Predicate arg2) { + public List getEntities(Entity arg0, AABB arg1, Predicate arg2) { return Collections.emptyList(); } @Override - public List getEntitiesOfClass(Class arg0, AxisAlignedBB arg1, + public List getEntitiesOfClass(Class arg0, AABB arg1, Predicate arg2) { return Collections.emptyList(); } @Override - public List players() { + public List players() { return Collections.emptyList(); } @Override - public int getBrightness(LightType lt, BlockPos p_226658_2_) { - return lt == LightType.BLOCK ? 12 : 14; + public int getBrightness(LightLayer lt, BlockPos p_226658_2_) { + return lt == LightLayer.BLOCK ? 12 : 14; } @Override @@ -122,12 +122,12 @@ public int getLightEmission(BlockPos pos) { } @Override - public BlockPos getHeightmapPos(Type heightmapType, BlockPos pos) { + public BlockPos getHeightmapPos(Types heightmapType, BlockPos pos) { return BlockPos.ZERO; } @Override - public int getHeight(Type heightmapType, int x, int z) { + public int getHeight(Types heightmapType, int x, int z) { return 256; } @@ -153,12 +153,12 @@ public boolean setBlock(BlockPos pos, BlockState state, int p_241211_3_, int p_2 } @Override - public ITickList getBlockTicks() { + public TickList getBlockTicks() { return EmptyTickList.empty(); } @Override - public ITickList getLiquidTicks() { + public TickList getLiquidTicks() { return EmptyTickList.empty(); } @@ -174,15 +174,15 @@ public void updateNeighborsAt(BlockPos p_195593_1_, Block p_195593_2_) {} public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newState, int flags) {} @Override - public void playSound(PlayerEntity player, BlockPos pos, SoundEvent soundIn, SoundCategory category, float volume, + public void playSound(Player player, BlockPos pos, SoundEvent soundIn, SoundSource category, float volume, float pitch) {} @Override - public void addParticle(IParticleData particleData, double x, double y, double z, double xSpeed, double ySpeed, + public void addParticle(ParticleOptions particleData, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) {} @Override - public void levelEvent(PlayerEntity player, int type, BlockPos pos, int data) {} + public void levelEvent(Player player, int type, BlockPos pos, int data) {} public Cuboid getBounds() { return bounds; diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/Cuboid.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/Cuboid.java index c10c346..a8721ce 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/Cuboid.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/Cuboid.java @@ -1,9 +1,9 @@ package com.simibubi.mightyarchitect.control.compose; -import net.minecraft.util.Direction; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.core.Direction; +import net.minecraft.world.phys.AABB; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.levelgen.structure.BoundingBox; public class Cuboid { @@ -109,12 +109,12 @@ public boolean equals(Object obj) { && ((Cuboid) obj).getSize().equals(getSize()); } - public MutableBoundingBox toMBB() { - return new MutableBoundingBox(getOrigin(), getOrigin().offset(getSize())); + public BoundingBox toMBB() { + return BoundingBox.fromCorners(getOrigin(), getOrigin().offset(getSize())); } - public AxisAlignedBB toAABB() { - return new AxisAlignedBB(getOrigin(), getOrigin().offset(getSize())); + public AABB toAABB() { + return new AABB(getOrigin(), getOrigin().offset(getSize())); } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/GroundPlan.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/GroundPlan.java index 08be03d..10dcb98 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/GroundPlan.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/GroundPlan.java @@ -7,7 +7,7 @@ import com.simibubi.mightyarchitect.control.design.DesignTheme; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; public class GroundPlan { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/Room.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/Room.java index ff25a2e..b9e8031 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/Room.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/Room.java @@ -3,8 +3,8 @@ import com.simibubi.mightyarchitect.control.design.DesignLayer; import com.simibubi.mightyarchitect.control.design.DesignType; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.BlockPos; public class Room extends Cuboid { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/Stack.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/Stack.java index 5e80aeb..c52cc19 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/Stack.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/Stack.java @@ -13,7 +13,7 @@ import com.simibubi.mightyarchitect.control.design.DesignType; import com.simibubi.mightyarchitect.control.design.ThemeStatistics; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; public class Stack { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/AbstractRoomFaceSelectionTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/AbstractRoomFaceSelectionTool.java index bb4886e..c4a14a0 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/AbstractRoomFaceSelectionTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/AbstractRoomFaceSelectionTool.java @@ -3,8 +3,8 @@ import com.simibubi.mightyarchitect.control.compose.Room; import com.simibubi.mightyarchitect.control.compose.Stack; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.util.math.BlockPos; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; public abstract class AbstractRoomFaceSelectionTool extends GroundPlanningToolBase { @@ -17,7 +17,7 @@ public void init() { } @Override - protected void makeStacksTransparent(ClientPlayerEntity player, BlockPos hit) {} + protected void makeStacksTransparent(LocalPlayer player, BlockPos hit) {} @Override public void tickToolOutlines() {} diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/ComposerToolBase.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/ComposerToolBase.java index b196d7b..a9a9379 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/ComposerToolBase.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/ComposerToolBase.java @@ -2,7 +2,7 @@ import org.lwjgl.glfw.GLFW; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.mightyarchitect.control.ArchitectManager; import com.simibubi.mightyarchitect.control.Schematic; @@ -13,13 +13,13 @@ import com.simibubi.mightyarchitect.foundation.utility.RaycastHelper; import com.simibubi.mightyarchitect.foundation.utility.RaycastHelper.PredicateTraceResult; -import net.minecraft.client.MainWindow; +import com.mojang.blaze3d.platform.Window; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.text.StringTextComponent; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.network.chat.TextComponent; public abstract class ComposerToolBase implements IComposerTool { @@ -63,7 +63,7 @@ protected void updateSelectedRooms() { return; } - ClientPlayerEntity player = Minecraft.getInstance().player; + LocalPlayer player = Minecraft.getInstance().player; PredicateTraceResult result = RaycastHelper.rayTraceUntil(player, 70, position -> { return groundPlan.getRoomAtPos(position.subtract(anchor)) != null; @@ -89,13 +89,13 @@ protected void updateOverlay() { } @Override - public void renderOverlay(MatrixStack ms) { - RenderSystem.pushMatrix(); + public void renderOverlay(PoseStack ms) { + ms.pushPose(); Minecraft mc = Minecraft.getInstance(); - MainWindow mainWindow = mc.getWindow(); - RenderSystem.translated(mainWindow.getGuiScaledWidth() / 2, mainWindow.getGuiScaledHeight() / 2 - 3, 0); - RenderSystem.translated(25, - -MathHelper.lerp(mc.getFrameTime(), lastToolModeYOffset, toolModeYOffset), + Window mainWindow = mc.getWindow(); + ms.translate(mainWindow.getGuiScaledWidth() / 2, mainWindow.getGuiScaledHeight() / 2 - 3, 0); + ms.translate(25, + -Mth.lerp(mc.getFrameTime(), lastToolModeYOffset, toolModeYOffset), 0); if (toolModeNoCtrl != null) { @@ -111,12 +111,12 @@ public void renderOverlay(MatrixStack ms) { mc.font.drawShadow(ms, toolModeCtrl, 0, 12, color); } - RenderSystem.color4f(1, 1, 1, 1); - RenderSystem.popMatrix(); + //RenderSystem.color4f(1, 1, 1, 1); + ms.popPose(); } protected void status(String message) { - Minecraft.getInstance().player.displayClientMessage(new StringTextComponent(message), true); + Minecraft.getInstance().player.displayClientMessage(new TextComponent(message), true); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CopyDesignTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CopyDesignTool.java index e356d95..3ce36b6 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CopyDesignTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CopyDesignTool.java @@ -14,11 +14,11 @@ import com.simibubi.mightyarchitect.control.design.partials.Design; import com.simibubi.mightyarchitect.foundation.utility.Keyboard; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TextFormatting; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.world.phys.AABB; +import net.minecraft.core.BlockPos; +import net.minecraft.ChatFormatting; public class CopyDesignTool extends WallDecorationToolBase { @@ -78,7 +78,7 @@ public void tickToolOutlines() { Consumer renderCorner = pos -> { MightyClient.outliner .showAABB(pos, - new AxisAlignedBB(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, + new AABB(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + selectedRoom.height, pos.getZ() + 1)) .lineWidth(1 / 8f); }; @@ -96,7 +96,7 @@ public void tickToolOutlines() { BlockPos end = start.offset(size); MightyClient.outliner .showAABB(start, - new AxisAlignedBB(start.getX() - 1 / 2d, start.getY(), start.getZ() - 1 / 2d, end.getX() - 1 / 2d, + new AABB(start.getX() - 1 / 2d, start.getY(), start.getZ() - 1 / 2d, end.getX() - 1 / 2d, end.getY(), end.getZ() - 1 / 2d)) .lineWidth(1 / 8f); }; @@ -129,7 +129,7 @@ public String handleRightClick() { boolean keyDown = Keyboard.isKeyDown(GLFW.GLFW_KEY_LEFT_CONTROL); if (copiedDesign == null && !keyDown) - return TextFormatting.RED + "Ctrl+Click to copy a Design"; + return ChatFormatting.RED + "Ctrl+Click to copy a Design"; DesignPicker designPicker = model.getTheme() .getDesignPicker(); @@ -153,7 +153,7 @@ public String handleRightClick() { copiedDesignType = DesignType.WALL; } - return "Copied " + TextFormatting.GREEN + copiedDesignType.getDisplayName(); + return "Copied " + ChatFormatting.GREEN + copiedDesignType.getDisplayName(); } if (!keyDown && selectedRoom != null) { @@ -161,10 +161,10 @@ public String handleRightClick() { if (DesignType.roofTypes() .contains(copiedDesignType)) { if (selectedStack.getRoofType() != copiedDesignType) - return TextFormatting.RED + "Roof types have to match."; + return ChatFormatting.RED + "Roof types have to match."; int facadeWidth = Math.min(selectedStack.highest().width, selectedStack.highest().length); if (!copiedDesign.fitsHorizontally(facadeWidth)) - return TextFormatting.RED + "Roof does not fit."; + return ChatFormatting.RED + "Roof does not fit."; designPicker.putRoof(selectedStack, copiedDesign); return pasteSuccessful(); @@ -172,11 +172,11 @@ public String handleRightClick() { if (copiedDesignType == DesignType.TOWER) { if (!(selectedStack instanceof CylinderStack)) - return TextFormatting.RED + "Room shapes have to match."; + return ChatFormatting.RED + "Room shapes have to match."; if (!copiedDesign.fitsHorizontally(selectedRoom.width)) - return TextFormatting.RED + "Target needs to have the same diameter."; + return ChatFormatting.RED + "Target needs to have the same diameter."; if (!copiedDesign.fitsVertically(selectedRoom.height)) - return TextFormatting.RED + "Design does not fit the targets height."; + return ChatFormatting.RED + "Design does not fit the targets height."; designPicker.putRoom(selectedRoom, new RoomDesignMapping(copiedDesign)); return pasteSuccessful(); @@ -184,9 +184,9 @@ public String handleRightClick() { if (copiedDesignType == DesignType.CORNER) { if (selectedStack instanceof CylinderStack) - return TextFormatting.RED + "Cylinders cannot have corners."; + return ChatFormatting.RED + "Cylinders cannot have corners."; if (!copiedDesign.fitsVertically(selectedRoom.height)) - return TextFormatting.RED + "Corner Design cannot fit the required height."; + return ChatFormatting.RED + "Corner Design cannot fit the required height."; RoomDesignMapping priorMapping = designPicker.getCachedRoom(selectedRoom); priorMapping.corner = copiedDesign; @@ -197,16 +197,16 @@ public String handleRightClick() { if (copiedDesignType == DesignType.WALL) { if (selectedStack instanceof CylinderStack) - return TextFormatting.RED + "Room shapes have to match."; + return ChatFormatting.RED + "Room shapes have to match."; if (selectedFace.getAxis() .isVertical()) - return TextFormatting.RED + "Cannot apply Wall vertically."; + return ChatFormatting.RED + "Cannot apply Wall vertically."; int wallWidth = selectedFace.getAxis() == Axis.Z ? selectedRoom.width - 2 : selectedRoom.length - 2; if (!copiedDesign.fitsHorizontally(wallWidth)) - return TextFormatting.RED + "Wall Design cannot fit the required width."; + return ChatFormatting.RED + "Wall Design cannot fit the required width."; if (!copiedDesign.fitsVertically(selectedRoom.height)) - return TextFormatting.RED + "Wall Design cannot fit the required height."; + return ChatFormatting.RED + "Wall Design cannot fit the required height."; RoomDesignMapping priorMapping = designPicker.getCachedRoom(selectedRoom); if (selectedFace.getAxis() == Axis.Z) @@ -218,7 +218,7 @@ public String handleRightClick() { return pasteSuccessful(); } - return TextFormatting.RED + "Couldn't apply " + copiedDesignType.getDisplayName() + " here."; + return ChatFormatting.RED + "Couldn't apply " + copiedDesignType.getDisplayName() + " here."; } return super.handleRightClick(); @@ -226,7 +226,7 @@ public String handleRightClick() { private String pasteSuccessful() { ArchitectManager.reAssemble(); - return "Applied " + TextFormatting.GREEN + copiedDesignType.getDisplayName(); + return "Applied " + ChatFormatting.GREEN + copiedDesignType.getDisplayName(); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CylinderRoomTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CylinderRoomTool.java index 9424ede..8dc61e6 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CylinderRoomTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CylinderRoomTool.java @@ -14,11 +14,11 @@ import com.simibubi.mightyarchitect.foundation.utility.RaycastHelper; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.RayTraceResult.Type; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.phys.AABB; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult.Type; public class CylinderRoomTool extends RoomTool { @@ -32,10 +32,10 @@ public void init() { @Override public void updateSelection() { - ClientPlayerEntity player = Minecraft.getInstance().player; + LocalPlayer player = Minecraft.getInstance().player; transparentStacks.clear(); - BlockRayTraceResult trace = RaycastHelper.rayTraceRange(player.level, player, 75); + BlockHitResult trace = RaycastHelper.rayTraceRange(player.level, player, 75); if (trace != null && trace.getType() == Type.BLOCK) { BlockPos hit = trace.getBlockPos(); @@ -124,7 +124,7 @@ public void tickToolOutlines() { BlockPos previouslySelectedPos = (firstPosition != null) ? firstPosition.offset(anchor) : cursorPos; if (firstPosition == null) { - MightyClient.outliner.chaseAABB(outlineKey, new AxisAlignedBB(cursorPos)) + MightyClient.outliner.chaseAABB(outlineKey, new AABB(cursorPos)) .withFaceTexture(AllSpecialTextures.CHECKERED); return; } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/GroundPlanningToolBase.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/GroundPlanningToolBase.java index cbbb867..09cccc5 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/GroundPlanningToolBase.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/GroundPlanningToolBase.java @@ -16,14 +16,14 @@ import com.simibubi.mightyarchitect.foundation.utility.outliner.Outline.OutlineParams; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.item.BlockItemUseContext; -import net.minecraft.item.ItemUseContext; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.RayTraceResult.Type; -import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.InteractionHand; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult.Type; +import net.minecraft.world.phys.Vec3; public abstract class GroundPlanningToolBase extends ComposerToolBase { @@ -40,17 +40,17 @@ public void init() { public void updateSelection() { super.updateSelection(); - ClientPlayerEntity player = Minecraft.getInstance().player; + LocalPlayer player = Minecraft.getInstance().player; transparentStacks.clear(); - BlockRayTraceResult trace = RaycastHelper.rayTraceRange(player.level, player, 75); + BlockHitResult trace = RaycastHelper.rayTraceRange(player.level, player, 75); if (trace != null && trace.getType() == Type.BLOCK) { BlockPos hit = new BlockPos(trace.getLocation()); makeStacksTransparent(player, hit); boolean replaceable = player.level.getBlockState(hit) - .canBeReplaced(new BlockItemUseContext(new ItemUseContext(player, Hand.MAIN_HAND, trace))); + .canBeReplaced(new BlockPlaceContext(new UseOnContext(player, InteractionHand.MAIN_HAND, trace))); if (trace.getDirection() .getAxis() .isVertical() && !replaceable) @@ -67,7 +67,7 @@ public void updateSelection() { } - protected void makeStacksTransparent(ClientPlayerEntity player, BlockPos hit) { + protected void makeStacksTransparent(LocalPlayer player, BlockPos hit) { if (!model.getGroundPlan() .isEmpty()) { final BlockPos target = hit; @@ -236,7 +236,7 @@ protected void tickRoofOutlines() { } - private Vector3d prevVertex; + private Vec3 prevVertex; private int vertexCounter; private String key; @@ -246,8 +246,8 @@ GroundPlanningToolBase key(String key) { } GroundPlanningToolBase vertex(double x, double y, double z, List lines) { - Vector3d previousVec = prevVertex; - prevVertex = new Vector3d(x, y, z); + Vec3 previousVec = prevVertex; + prevVertex = new Vec3(x, y, z); if (previousVec == null) return this; lines.add(MightyClient.outliner.chaseLine(key + vertexCounter, previousVec, prevVertex)); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/HeightTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/HeightTool.java index eaeb90e..da585a9 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/HeightTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/HeightTool.java @@ -5,7 +5,7 @@ import com.simibubi.mightyarchitect.control.compose.Room; import com.simibubi.mightyarchitect.foundation.utility.Keyboard; -import net.minecraft.util.text.TextFormatting; +import net.minecraft.ChatFormatting; public class HeightTool extends AbstractRoomFaceSelectionTool { @@ -25,12 +25,12 @@ public boolean handleMouseWheel(int scroll) { .getMaxFloorHeight()) { selectedRoom.height = model.getTheme() .getMaxFloorHeight(); - status("Height: " + TextFormatting.AQUA + selectedRoom.height + TextFormatting.WHITE + "m (max)"); + status("Height: " + ChatFormatting.AQUA + selectedRoom.height + ChatFormatting.WHITE + "m (max)"); return true; } if (selectedRoom.height + scroll < 1) { selectedRoom.height = 1; - status("Height: " + TextFormatting.AQUA + selectedRoom.height + TextFormatting.WHITE + "m (min)"); + status("Height: " + ChatFormatting.AQUA + selectedRoom.height + ChatFormatting.WHITE + "m (min)"); return true; } @@ -38,13 +38,13 @@ public boolean handleMouseWheel(int scroll) { selectedStack.forEachAbove(selectedRoom, room -> { room.y += scroll; }); - status("Height: " + TextFormatting.AQUA + selectedRoom.height + TextFormatting.WHITE + "m"); + status("Height: " + ChatFormatting.AQUA + selectedRoom.height + ChatFormatting.WHITE + "m"); } else { // Move selectedStack.forRoomAndEachAbove(selectedStack.lowest(), room -> { room.move(0, scroll, 0); }); - status("Position: " + TextFormatting.AQUA + selectedStack.lowest().y); + status("Position: " + ChatFormatting.AQUA + selectedStack.lowest().y); } return true; } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/IComposerTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/IComposerTool.java index 1c6609a..1b45385 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/IComposerTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/IComposerTool.java @@ -1,6 +1,6 @@ package com.simibubi.mightyarchitect.control.compose.planner; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; public interface IComposerTool { @@ -13,6 +13,6 @@ public interface IComposerTool { public void tickGroundPlanOutlines(); public void updateSelection(); - public void renderOverlay(MatrixStack ms); + public void renderOverlay(PoseStack ms); public void init(); } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/LayerStyleTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/LayerStyleTool.java index 938b9c4..1d96e2e 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/LayerStyleTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/LayerStyleTool.java @@ -5,7 +5,7 @@ import com.simibubi.mightyarchitect.control.ArchitectManager; import com.simibubi.mightyarchitect.control.design.DesignLayer; -import net.minecraft.util.text.TextFormatting; +import net.minecraft.ChatFormatting; public class LayerStyleTool extends WallDecorationToolBase { @@ -29,7 +29,7 @@ public boolean handleMouseWheel(int amount) { selectedRoom.designLayer = newLayer; model.getTheme().getDesignPicker().rerollRoom(selectedRoom); ArchitectManager.reAssemble(); - status("Style: " + TextFormatting.AQUA + newLayer.getDisplayName()); + status("Style: " + ChatFormatting.AQUA + newLayer.getDisplayName()); return true; } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/MoveReshapeTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/MoveReshapeTool.java index 1124036..ebc6f63 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/MoveReshapeTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/MoveReshapeTool.java @@ -9,8 +9,8 @@ import com.simibubi.mightyarchitect.control.design.ThemeStatistics; import com.simibubi.mightyarchitect.foundation.utility.Keyboard; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TextFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.ChatFormatting; public class MoveReshapeTool extends AbstractRoomFaceSelectionTool { @@ -78,16 +78,16 @@ public boolean handleMouseWheel(int scroll) { }); selectedStack.highest().roofType = statistics.fallbackRoof(selectedStack.highest(), selectedStack instanceof CylinderStack); - status("Size: " + TextFormatting.AQUA + selectedRoom.width + TextFormatting.WHITE + "x" - + TextFormatting.AQUA + selectedRoom.length); + status("Size: " + ChatFormatting.AQUA + selectedRoom.width + ChatFormatting.WHITE + "x" + + ChatFormatting.AQUA + selectedRoom.length); } else { // Move selectedStack.forRoomAndEachAbove(selectedRoom, room -> { BlockPos diff = BlockPos.ZERO.relative(selectedFace, scroll); room.move(-diff.getX(), 0, -diff.getZ()); }); - status("Position: " + TextFormatting.AQUA + selectedRoom.x + TextFormatting.WHITE + ", " - + TextFormatting.AQUA + selectedRoom.z); + status("Position: " + ChatFormatting.AQUA + selectedRoom.x + ChatFormatting.WHITE + ", " + + ChatFormatting.AQUA + selectedRoom.z); } return true; } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/PalettePainterTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/PalettePainterTool.java index 077082f..8c584ac 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/PalettePainterTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/PalettePainterTool.java @@ -5,7 +5,7 @@ import com.simibubi.mightyarchitect.control.ArchitectManager; import com.simibubi.mightyarchitect.foundation.utility.Keyboard; -import net.minecraft.util.text.TextFormatting; +import net.minecraft.ChatFormatting; public class PalettePainterTool extends WallDecorationToolBase { @@ -25,7 +25,7 @@ public void init() { public boolean handleMouseWheel(int amount) { if (model.getPrimary().getName().equals(model.getSecondary().getName())) { - status(TextFormatting.RED + "Choose a secondary Palette first [ G -> C ]"); + status(ChatFormatting.RED + "Choose a secondary Palette first [ G -> C ]"); return true; } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RerollTargetTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RerollTargetTool.java index 53ede1c..e0a0553 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RerollTargetTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RerollTargetTool.java @@ -5,7 +5,7 @@ import com.simibubi.mightyarchitect.control.ArchitectManager; import com.simibubi.mightyarchitect.foundation.utility.Keyboard; -import net.minecraft.util.Direction; +import net.minecraft.core.Direction; public class RerollTargetTool extends WallDecorationToolBase { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RoofTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RoofTool.java index 84f0af8..abe596a 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RoofTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RoofTool.java @@ -4,7 +4,7 @@ import com.simibubi.mightyarchitect.control.compose.Room; import com.simibubi.mightyarchitect.control.design.DesignType; -import net.minecraft.util.text.TextFormatting; +import net.minecraft.ChatFormatting; public class RoofTool extends AbstractRoomFaceSelectionTool { @@ -51,9 +51,9 @@ public void updateSelection() { if (selectedStack == null) return; if (selectedStack.highest().quadFacadeRoof) - status("Roof Type: " + TextFormatting.AQUA + "4-Facade Gable Roof"); + status("Roof Type: " + ChatFormatting.AQUA + "4-Facade Gable Roof"); else - status("Roof Type: " + TextFormatting.AQUA + selectedStack.highest().roofType.getDisplayName()); + status("Roof Type: " + ChatFormatting.AQUA + selectedStack.highest().roofType.getDisplayName()); } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RoomTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RoomTool.java index 32e9cd6..50d59c9 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RoomTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RoomTool.java @@ -16,8 +16,8 @@ import com.simibubi.mightyarchitect.control.design.ThemeStatistics; import com.simibubi.mightyarchitect.foundation.utility.Keyboard; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.Vec3; public class RoomTool extends GroundPlanningToolBase { @@ -242,7 +242,7 @@ protected void drawTextAroundBounds(Cuboid selection) { } private void chaseText(Object key, float x, float y, float z, String text) { - MightyClient.outliner.chaseText(key, new Vector3d(x, y, z), text) + MightyClient.outliner.chaseText(key, new Vec3(x, y, z), text) .colored(0) .coloredFaces(0xffffff) .disableNormals() diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/StackTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/StackTool.java index 434cd06..46946de 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/StackTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/StackTool.java @@ -9,7 +9,7 @@ import com.simibubi.mightyarchitect.control.compose.Stack; import com.simibubi.mightyarchitect.foundation.utility.Keyboard; -import net.minecraft.util.text.TextFormatting; +import net.minecraft.ChatFormatting; public class StackTool extends AbstractRoomFaceSelectionTool { @@ -68,7 +68,7 @@ public void updateSelection() { highlightRoom = Keyboard.isKeyDown(GLFW.GLFW_KEY_LEFT_CONTROL); if (selectedStack != null) - status("Floors: " + TextFormatting.AQUA + selectedStack.floors()); + status("Floors: " + ChatFormatting.AQUA + selectedStack.floors()); } public static void insertMatchingOthers(GroundPlan groundPlan, Stack stack, int index) { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/WallDecorationToolBase.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/WallDecorationToolBase.java index fa4846d..f30b4ff 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/WallDecorationToolBase.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/WallDecorationToolBase.java @@ -4,9 +4,9 @@ import com.simibubi.mightyarchitect.control.compose.Cuboid; import com.simibubi.mightyarchitect.control.compose.Room; -import net.minecraft.util.Direction; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.phys.AABB; +import net.minecraft.core.BlockPos; public abstract class WallDecorationToolBase extends ComposerToolBase { @@ -50,7 +50,7 @@ public void tickToolOutlines() { max = max.offset(0, selectedRoom.height, 0); } - MightyClient.outliner.chaseAABB(toolOutlineKey, new AxisAlignedBB(min.getX() - 1 / 2d, + MightyClient.outliner.chaseAABB(toolOutlineKey, new AABB(min.getX() - 1 / 2d, min.getY() + 1 / 4d, min.getZ() - 1 / 2d, max.getX() + 1 / 2d, max.getY(), max.getZ() + 1 / 2d)).lineWidth(1/8f); return; } @@ -84,7 +84,7 @@ public void tickToolOutlines() { BlockPos max = stack.getOrigin() .offset(stack.getSize()) .offset(model.getAnchor()); - MightyClient.outliner.chaseAABB(toolOutlineKey, new AxisAlignedBB(min.getX() - 1 / 2d, min.getY() + 1 / 4d, + MightyClient.outliner.chaseAABB(toolOutlineKey, new AABB(min.getX() - 1 / 2d, min.getY() + 1 / 4d, min.getZ() - 1 / 2d, max.getX() + 1 / 2d, max.getY(), max.getZ() + 1 / 2d)).lineWidth(1/8f); } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/DesignExporter.java b/src/main/java/com/simibubi/mightyarchitect/control/design/DesignExporter.java index eac5f5b..c57e2ad 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/DesignExporter.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/DesignExporter.java @@ -18,16 +18,16 @@ import com.simibubi.mightyarchitect.foundation.utility.FilesHelper; import com.simibubi.mightyarchitect.networking.PlaceSignPacket; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; import net.minecraft.client.Minecraft; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.nbt.NBTUtil; -import net.minecraft.tileentity.SignTileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.world.World; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.level.Level; public class DesignExporter { @@ -41,7 +41,7 @@ public class DesignExporter { public static boolean changed = true; - public static String exportDesign(World worldIn, BlockPos anchor) { + public static String exportDesign(Level worldIn, BlockPos anchor) { BlockPos layerDefAnchor = anchor; boolean found = false; for (int range = 1; range < 100 && !found; range++) { @@ -94,13 +94,13 @@ public static String exportDesign(World worldIn, BlockPos anchor) { PhaseEditTheme.resetVisualization(); // Assemble nbt - CompoundNBT compound = new CompoundNBT(); - compound.put("Size", NBTUtil.writeBlockPos(size)); + CompoundTag compound = new CompoundTag(); + compound.put("Size", NbtUtils.writeBlockPos(size)); - ListNBT layers = new ListNBT(); + ListTag layers = new ListTag(); for (int y = 0; y < size.getY(); y++) { - CompoundNBT layerTag = new CompoundNBT(); + CompoundTag layerTag = new CompoundTag(); DesignSliceTrait trait = DesignSliceTrait.values()[markerValueAt(worldIn, layerDefAnchor.above(y))]; layerTag.putString("Trait", trait.name()); @@ -114,7 +114,7 @@ public static String exportDesign(World worldIn, BlockPos anchor) { if (block == null && blockState.getBlock() != Blocks.AIR) { Minecraft.getInstance().player.displayClientMessage( - new StringTextComponent(blockState.getBlock() + new TextComponent(blockState.getBlock() .getDescriptionId() + " @" + pos.getX() + "," + pos.getY() + "," + pos.getZ() + " does not belong to the Scanner Palette"), false); return "Export failed"; @@ -187,8 +187,8 @@ public static String exportDesign(World worldIn, BlockPos anchor) { BlockPos signPos = anchor.above(); if (worldIn.getBlockState(signPos) .getBlock() == Blocks.SPRUCE_SIGN) { - SignTileEntity sign = (SignTileEntity) worldIn.getBlockEntity(signPos); - filename = sign.getMessage(1) + SignBlockEntity sign = (SignBlockEntity) worldIn.getBlockEntity(signPos); + filename = sign.getMessage(1, false) .getString(); designPath = typePath + "/" + filename; @@ -228,11 +228,11 @@ public static DesignTheme getTheme() { return theme; } - private static boolean isMarker(World worldIn, BlockPos pos) { + private static boolean isMarker(Level worldIn, BlockPos pos) { return AllBlocks.SLICE_MARKER.typeOf(worldIn.getBlockState(pos)); } - private static int markerValueAt(World worldIn, BlockPos pos) { + private static int markerValueAt(Level worldIn, BlockPos pos) { return worldIn.getBlockState(pos) .getValue(SliceMarkerBlock.VARIANT) .ordinal(); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/DesignResourceLoader.java b/src/main/java/com/simibubi/mightyarchitect/control/design/DesignResourceLoader.java index 541c845..36a9a01 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/DesignResourceLoader.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/DesignResourceLoader.java @@ -16,9 +16,9 @@ import com.simibubi.mightyarchitect.control.design.partials.Design; import com.simibubi.mightyarchitect.foundation.utility.FilesHelper; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.CompressedStreamTools; -import net.minecraft.nbt.ListNBT; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.nbt.ListTag; public class DesignResourceLoader { @@ -51,7 +51,7 @@ public static Map>> loadDesignsForTheme public static Map>> loadExternalDesignsForTheme(DesignTheme theme) { final Map>> designMap = new HashMap<>(); boolean isFile = theme.getFilePath().endsWith(".theme") || theme.getFilePath().endsWith(".json"); - final Map>> compoundMap = isFile ? loadThemeFromThemeFile(theme) : loadThemeFromFolder(theme); + final Map>> compoundMap = isFile ? loadThemeFromThemeFile(theme) : loadThemeFromFolder(theme); theme.getLayers().forEach(layer -> { if (!compoundMap.containsKey(layer)) @@ -71,16 +71,16 @@ public static Map>> loadExternalDesigns return designMap; } - private static Map>> loadThemeFromThemeFile(DesignTheme theme) { - final Map>> compoundMap = new HashMap<>(); + private static Map>> loadThemeFromThemeFile(DesignTheme theme) { + final Map>> compoundMap = new HashMap<>(); - CompoundNBT importedThemeFile = new CompoundNBT(); + CompoundTag importedThemeFile = new CompoundTag(); if (theme.getFilePath().endsWith(".theme")) { try { InputStream inputStream = Files.newInputStream(Paths.get("themes/" + theme.getFilePath()), StandardOpenOption.READ); - importedThemeFile = CompressedStreamTools.readCompressed(inputStream); + importedThemeFile = NbtIo.readCompressed(inputStream); inputStream.close(); } catch (IOException e) { e.printStackTrace(); @@ -89,21 +89,21 @@ private static Map>> loadThemeFrom importedThemeFile = FilesHelper.loadJsonAsNBT("themes/" + theme.getFilePath()); } - final CompoundNBT themeFile = importedThemeFile; + final CompoundTag themeFile = importedThemeFile; if (themeFile.contains("Designs")) { theme.getLayers().forEach(layer -> { - final HashMap> typeMap = new HashMap<>(); + final HashMap> typeMap = new HashMap<>(); theme.getTypes().forEach(type -> { - Set designs = new HashSet<>(); - CompoundNBT tagLayers = themeFile.getCompound("Designs"); + Set designs = new HashSet<>(); + CompoundTag tagLayers = themeFile.getCompound("Designs"); if (tagLayers.contains(layer.name())) { - CompoundNBT tagTypes = tagLayers.getCompound(layer.name()); + CompoundTag tagTypes = tagLayers.getCompound(layer.name()); if (tagTypes.contains(type.name())) { - ListNBT tagDesigns = tagTypes.getList(type.name(), 10); - tagDesigns.forEach(tag -> designs.add((CompoundNBT) tag)); + ListTag tagDesigns = tagTypes.getList(type.name(), 10); + tagDesigns.forEach(tag -> designs.add((CompoundTag) tag)); } } typeMap.put(type, designs); @@ -116,8 +116,8 @@ private static Map>> loadThemeFrom return compoundMap; } - public static Map>> loadThemeFromFolder(DesignTheme theme) { - final Map>> compoundMap = new HashMap<>(); + public static Map>> loadThemeFromFolder(DesignTheme theme) { + final Map>> compoundMap = new HashMap<>(); String folderPath = "themes"; String themePath = folderPath + "/" + theme.getFilePath(); @@ -127,7 +127,7 @@ public static Map>> loadThemeFromF theme.getLayers().forEach(layer -> { - final HashMap> typeMap = new HashMap<>(); + final HashMap> typeMap = new HashMap<>(); theme.getTypes().forEach(type -> { String path = folderPath + "/" + theme.getFilePath() + "/" + layer.getFilePath() + "/" @@ -150,7 +150,7 @@ private static Set importDesigns(DesignTheme theme, DesignLayer layer, D final String path = folderPath + "/design" + ((index == 0) ? "" : "_" + index) + ".json"; if (TheMightyArchitect.class.getClassLoader().getResource(path) == null) break; - final CompoundNBT designTag = FilesHelper.loadJsonResourceAsNBT(path); + final CompoundTag designTag = FilesHelper.loadJsonResourceAsNBT(path); designs.add(type.getDesign().fromNBT(designTag)); index++; } @@ -158,9 +158,9 @@ private static Set importDesigns(DesignTheme theme, DesignLayer layer, D return designs; } - private static Set importExternalDesigns(DesignTheme theme, DesignLayer layer, DesignType type, + private static Set importExternalDesigns(DesignTheme theme, DesignLayer layer, DesignType type, String folderPath) { - final Set designs = new HashSet<>(); + final Set designs = new HashSet<>(); if (!Files.exists(Paths.get(folderPath))) return designs; @@ -168,7 +168,7 @@ private static Set importExternalDesigns(DesignTheme theme, DesignL try { DirectoryStream newDirectoryStream = Files.newDirectoryStream(Paths.get(folderPath)); for (Path path : newDirectoryStream) { - final CompoundNBT designTag = FilesHelper.loadJsonAsNBT(path.toString()); + final CompoundTag designTag = FilesHelper.loadJsonAsNBT(path.toString()); designs.add(designTag); } newDirectoryStream.close(); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/DesignSlice.java b/src/main/java/com/simibubi/mightyarchitect/control/design/DesignSlice.java index 61ee93f..a1dc7d4 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/DesignSlice.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/DesignSlice.java @@ -9,14 +9,14 @@ import com.simibubi.mightyarchitect.control.palette.Palette; import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.IStringSerializable; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.util.StringRepresentable; public class DesignSlice { - public enum DesignSliceTrait implements IStringSerializable { + public enum DesignSliceTrait implements StringRepresentable { Standard("-> Use this slice once"), CloneOnce("-> Duplicate this slice if necessary"), CloneThrice("-> Duplicate up to 3 times"), @@ -49,7 +49,7 @@ public DesignSliceTrait cycle(int amount) { private Palette[][] blocks; private BlockOrientation[][] orientations; - public static DesignSlice fromNBT(CompoundNBT sliceTag) { + public static DesignSlice fromNBT(CompoundTag sliceTag) { DesignSlice slice = new DesignSlice(); slice.trait = DesignSliceTrait.valueOf(sliceTag.getString("Trait")); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/DesignTheme.java b/src/main/java/com/simibubi/mightyarchitect/control/design/DesignTheme.java index 880eaaa..cb408a4 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/DesignTheme.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/DesignTheme.java @@ -10,9 +10,9 @@ import com.simibubi.mightyarchitect.control.design.partials.Design; import com.simibubi.mightyarchitect.control.palette.PaletteDefinition; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.nbt.StringNBT; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; public class DesignTheme { @@ -151,17 +151,17 @@ public void setTypes(List types) { this.types = types; } - public CompoundNBT asTagCompound() { - CompoundNBT compound = new CompoundNBT(); + public CompoundTag asTagCompound() { + CompoundTag compound = new CompoundTag(); compound.putString("Name", getDisplayName()); compound.putString("Designer", getDesigner()); - ListNBT layers = new ListNBT(); - ListNBT types = new ListNBT(); + ListTag layers = new ListTag(); + ListTag types = new ListTag(); - this.layers.forEach(layer -> layers.add(StringNBT.valueOf(layer.name()))); - this.types.forEach(type -> types.add(StringNBT.valueOf(type.name()))); + this.layers.forEach(layer -> layers.add(StringTag.valueOf(layer.name()))); + this.types.forEach(type -> types.add(StringTag.valueOf(type.name()))); compound.put("Layers", layers); compound.put("Types", types); @@ -170,7 +170,7 @@ public CompoundNBT asTagCompound() { return compound; } - public static DesignTheme fromNBT(CompoundNBT compound) { + public static DesignTheme fromNBT(CompoundTag compound) { if (compound == null) return null; @@ -182,8 +182,8 @@ public static DesignTheme fromNBT(CompoundNBT compound) { if (compound.contains("Maximum Room Height")) theme.maxFloorHeight = compound.getInt("Maximum Room Height"); - compound.getList("Layers", 8).forEach(s -> theme.layers.add(DesignLayer.valueOf(((StringNBT) s).getAsString()))); - compound.getList("Types", 8).forEach(s -> theme.types.add(DesignType.valueOf(((StringNBT) s).getAsString()))); + compound.getList("Layers", 8).forEach(s -> theme.layers.add(DesignLayer.valueOf(((StringTag) s).getAsString()))); + compound.getList("Types", 8).forEach(s -> theme.types.add(DesignType.valueOf(((StringTag) s).getAsString()))); theme.updateRoomLayers(); return theme; diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/Sketch.java b/src/main/java/com/simibubi/mightyarchitect/control/design/Sketch.java index 69cf4a5..758efe8 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/Sketch.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/Sketch.java @@ -15,7 +15,7 @@ import com.simibubi.mightyarchitect.control.palette.Palette; import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; public class Sketch { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeStatistics.java b/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeStatistics.java index 3655f87..c36d2f2 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeStatistics.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeStatistics.java @@ -6,7 +6,7 @@ import com.simibubi.mightyarchitect.foundation.utility.DesignHelper; import net.minecraft.client.Minecraft; -import net.minecraft.util.text.StringTextComponent; +import net.minecraft.network.chat.TextComponent; public class ThemeStatistics { @@ -178,7 +178,7 @@ public void sendToPlayer() { } private void chat(String message) { - Minecraft.getInstance().player.displayClientMessage(new StringTextComponent(message), false); + Minecraft.getInstance().player.displayClientMessage(new TextComponent(message), false); } public DesignType fallbackRoof(Room room, boolean tower) { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeStorage.java b/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeStorage.java index 69641f4..555a2f9 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeStorage.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeStorage.java @@ -18,9 +18,9 @@ import com.simibubi.mightyarchitect.foundation.utility.FilesHelper; import net.minecraft.client.Minecraft; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.CompressedStreamTools; -import net.minecraft.nbt.ListNBT; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.nbt.ListTag; public class ThemeStorage { @@ -110,40 +110,40 @@ public static void exportTheme(DesignTheme theme) { String palettePath = folderPath + "/" + foldername + "/palette.json"; FilesHelper.saveTagCompoundAsJson(theme.getDefaultPalette() - .writeToNBT(new CompoundNBT()), palettePath); + .writeToNBT(new CompoundTag()), palettePath); String palette2Path = folderPath + "/" + foldername + "/palette2.json"; FilesHelper.saveTagCompoundAsJson(theme.getDefaultSecondaryPalette() - .writeToNBT(new CompoundNBT()), palette2Path); + .writeToNBT(new CompoundTag()), palette2Path); } public static String exportThemeFullyAsFile(DesignTheme theme, boolean compressed) { String folderPath = "themes/export"; FilesHelper.createFolderIfMissing(folderPath); - CompoundNBT massiveThemeTag = new CompoundNBT(); + CompoundTag massiveThemeTag = new CompoundTag(); massiveThemeTag.put("Theme", theme.asTagCompound()); massiveThemeTag.put("Palette", theme.getDefaultPalette() - .writeToNBT(new CompoundNBT())); + .writeToNBT(new CompoundTag())); massiveThemeTag.put("SecondaryPalette", theme.getDefaultSecondaryPalette() - .writeToNBT(new CompoundNBT())); + .writeToNBT(new CompoundTag())); - Map>> designFiles = + Map>> designFiles = DesignResourceLoader.loadThemeFromFolder(theme); - CompoundNBT layers = new CompoundNBT(); + CompoundTag layers = new CompoundTag(); for (DesignLayer layer : theme.getLayers()) { if (!designFiles.containsKey(layer)) continue; - CompoundNBT types = new CompoundNBT(); + CompoundTag types = new CompoundTag(); for (DesignType type : theme.getTypes()) { if (!designFiles.get(layer) .containsKey(type)) continue; - ListNBT designs = new ListNBT(); - for (CompoundNBT tag : designFiles.get(layer) + ListTag designs = new ListTag(); + for (CompoundTag tag : designFiles.get(layer) .get(type)) designs.add(tag); types.put(type.name(), designs); @@ -157,7 +157,7 @@ public static String exportThemeFullyAsFile(DesignTheme theme, boolean compresse Path path = Paths.get(folderPath + "/" + theme.getFilePath() + ".theme"); Files.deleteIfExists(path); OutputStream outputStream = Files.newOutputStream(path, StandardOpenOption.CREATE); - CompressedStreamTools.writeCompressed(massiveThemeTag, outputStream); + NbtIo.writeCompressed(massiveThemeTag, outputStream); outputStream.close(); } catch (IOException e) { e.printStackTrace(); @@ -174,9 +174,9 @@ public static DesignTheme importThemeFullyFromFile(String path) { } private static DesignTheme loadInternalTheme(String themeFolder) { - CompoundNBT themeCompound = FilesHelper.loadJsonResourceAsNBT("themes/" + themeFolder + "/theme.json"); - CompoundNBT paletteCompound = FilesHelper.loadJsonResourceAsNBT("themes/" + themeFolder + "/palette.json"); - CompoundNBT palette2Compound = FilesHelper.loadJsonResourceAsNBT("themes/" + themeFolder + "/palette2.json"); + CompoundTag themeCompound = FilesHelper.loadJsonResourceAsNBT("themes/" + themeFolder + "/theme.json"); + CompoundTag paletteCompound = FilesHelper.loadJsonResourceAsNBT("themes/" + themeFolder + "/palette.json"); + CompoundTag palette2Compound = FilesHelper.loadJsonResourceAsNBT("themes/" + themeFolder + "/palette2.json"); DesignTheme theme = DesignTheme.fromNBT(themeCompound); theme.setFilePath(themeFolder); theme.setImported(false); @@ -199,21 +199,21 @@ private static void importThemes() { String themeFolder = path.getFileName() .toString(); - CompoundNBT themeCompound; - CompoundNBT paletteCompound; - CompoundNBT secondaryPaletteCompound = null; + CompoundTag themeCompound; + CompoundTag paletteCompound; + CompoundTag secondaryPaletteCompound = null; if (themeFolder.equals("export")) continue; if (themeFolder.endsWith(".theme") || themeFolder.endsWith(".json")) { - CompoundNBT themeFile = new CompoundNBT(); + CompoundTag themeFile = new CompoundTag(); if (themeFolder.endsWith(".theme")) { try { InputStream inputStream = Files.newInputStream(Paths.get(folderPath + "/" + themeFolder), StandardOpenOption.READ); - themeFile = CompressedStreamTools.readCompressed(inputStream); + themeFile = NbtIo.readCompressed(inputStream); inputStream.close(); } catch (IOException e) { e.printStackTrace(); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeValidator.java b/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeValidator.java index 827d7a8..44eb2d6 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeValidator.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeValidator.java @@ -8,21 +8,21 @@ import com.simibubi.mightyarchitect.foundation.utility.DesignHelper; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TextFormatting; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.ChatFormatting; public class ThemeValidator { - static List complaints; + static List complaints; public static void check(DesignTheme theme) { - ClientPlayerEntity player = Minecraft.getInstance().player; + LocalPlayer player = Minecraft.getInstance().player; for (int i = 0; i < 3; i++) - player.displayClientMessage(new StringTextComponent(" "), false); - player.displayClientMessage(new StringTextComponent(TextFormatting.AQUA + "--> Validation on " - + TextFormatting.BLUE + TextFormatting.BOLD + theme.getDisplayName() + TextFormatting.AQUA + " <--"), + player.displayClientMessage(new TextComponent(" "), false); + player.displayClientMessage(new TextComponent(ChatFormatting.AQUA + "--> Validation on " + + ChatFormatting.BLUE + ChatFormatting.BOLD + theme.getDisplayName() + ChatFormatting.AQUA + " <--"), false); theme.clearDesigns(); ThemeStatistics stats = theme.getStatistics(); @@ -144,18 +144,18 @@ public static void check(DesignTheme theme) { if (complaints.size() > 0) { player.displayClientMessage( - new StringTextComponent(TextFormatting.GOLD + "The Following Designs are missing:"), false); - for (ITextComponent text : complaints) { + new TextComponent(ChatFormatting.GOLD + "The Following Designs are missing:"), false); + for (Component text : complaints) { player.displayClientMessage(text, false); } player.displayClientMessage( - new StringTextComponent( - TextFormatting.GOLD + "Try and add these missing designs or exclude their type from your theme."), + new TextComponent( + ChatFormatting.GOLD + "Try and add these missing designs or exclude their type from your theme."), false); } else { player.displayClientMessage( - new StringTextComponent(TextFormatting.GREEN + "For prior traits no missing designs have been found."), + new TextComponent(ChatFormatting.GREEN + "For prior traits no missing designs have been found."), false); } @@ -166,7 +166,7 @@ private static boolean exists(DesignQuery query) { } private static void alert(String message) { - complaints.add(new StringTextComponent("-> " + TextFormatting.RED + message)); + complaints.add(new TextComponent("-> " + ChatFormatting.RED + message)); } private static String glue(List heights) { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Corner.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Corner.java index 6e30efc..cc95865 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Corner.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Corner.java @@ -6,15 +6,15 @@ import com.simibubi.mightyarchitect.control.design.DesignSlice; import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.math.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.BlockPos; import com.simibubi.mightyarchitect.control.design.partials.Design.DesignInstance; public class Corner extends Design { @Override - public Design fromNBT(CompoundNBT compound) { + public Design fromNBT(CompoundTag compound) { Corner corner = new Corner(); corner.applyNBT(compound); return corner; diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Design.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Design.java index dfa21e5..714397a 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Design.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Design.java @@ -10,10 +10,10 @@ import com.simibubi.mightyarchitect.control.design.DesignSlice.DesignSliceTrait; import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.nbt.NBTUtil; -import net.minecraft.util.math.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.core.BlockPos; public abstract class Design { @@ -24,17 +24,17 @@ public abstract class Design { protected int defaultWidth; protected int yShift; - public abstract Design fromNBT(CompoundNBT compound); + public abstract Design fromNBT(CompoundTag compound); - protected void applyNBT(CompoundNBT compound) { - size = NBTUtil.readBlockPos(compound.getCompound("Size")); + protected void applyNBT(CompoundTag compound) { + size = NbtUtils.readBlockPos(compound.getCompound("Size")); defaultWidth = size.getX(); slices = new DesignSlice[size.getY()]; defaultHeight = 0; yShift = 0; heights = ImmutableSet.of(0); - ListNBT sliceTagList = compound.getList("Layers", 10); + ListTag sliceTagList = compound.getList("Layers", 10); for (int sliceIndex = 0; sliceIndex < slices.length; sliceIndex++) { DesignSlice slice = DesignSlice.fromNBT(sliceTagList.getCompound(sliceIndex)); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Facade.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Facade.java index 9290e04..76b3937 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Facade.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Facade.java @@ -1,13 +1,13 @@ package com.simibubi.mightyarchitect.control.design.partials; -import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.CompoundTag; import com.simibubi.mightyarchitect.control.design.partials.Wall.ExpandBehaviour; public class Facade extends Wall { @Override - public Design fromNBT(CompoundNBT compound) { + public Design fromNBT(CompoundTag compound) { Facade facade = new Facade(); facade.expandBehaviour = ExpandBehaviour.None; facade.applyNBT(compound); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/FlatRoof.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/FlatRoof.java index edc92a8..94e7248 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/FlatRoof.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/FlatRoof.java @@ -6,8 +6,8 @@ import com.simibubi.mightyarchitect.control.design.DesignSlice; import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.math.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.BlockPos; import com.simibubi.mightyarchitect.control.design.partials.Design.DesignInstance; @@ -16,7 +16,7 @@ public class FlatRoof extends Design { protected int margin; @Override - public Design fromNBT(CompoundNBT compound) { + public Design fromNBT(CompoundTag compound) { FlatRoof flatRoof = new FlatRoof(); flatRoof.applyNBT(compound); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Roof.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Roof.java index f23ad0e..979c66c 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Roof.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Roof.java @@ -6,8 +6,8 @@ import com.simibubi.mightyarchitect.control.design.DesignSlice; import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.math.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.BlockPos; import com.simibubi.mightyarchitect.control.design.partials.Design.DesignInstance; @@ -16,7 +16,7 @@ public class Roof extends Design { private static final int CROSS_ROOF_DEPTH = -1; @Override - public Design fromNBT(CompoundNBT compound) { + public Design fromNBT(CompoundTag compound) { Roof roof = new Roof(); roof.applyNBT(compound); roof.defaultWidth = compound.getInt("Roofspan"); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Tower.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Tower.java index ca48b5f..a9680da 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Tower.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Tower.java @@ -4,8 +4,8 @@ import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.math.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.BlockPos; import com.simibubi.mightyarchitect.control.design.partials.Design.DesignInstance; @@ -14,7 +14,7 @@ public class Tower extends Design { public int radius; @Override - public Design fromNBT(CompoundNBT compound) { + public Design fromNBT(CompoundTag compound) { Tower tower = new Tower(); tower.applyNBT(compound); tower.radius = compound.getInt("Radius"); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/TowerFlatRoof.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/TowerFlatRoof.java index 0f2a627..fd714ff 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/TowerFlatRoof.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/TowerFlatRoof.java @@ -1,11 +1,11 @@ package com.simibubi.mightyarchitect.control.design.partials; -import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.CompoundTag; public class TowerFlatRoof extends TowerRoof { @Override - public Design fromNBT(CompoundNBT compound) { + public Design fromNBT(CompoundTag compound) { TowerFlatRoof towerRoof = new TowerFlatRoof(); towerRoof.applyNBT(compound); towerRoof.radius = compound.getInt("Radius"); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/TowerRoof.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/TowerRoof.java index 57d19b8..34f2482 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/TowerRoof.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/TowerRoof.java @@ -4,15 +4,15 @@ import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.math.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.BlockPos; import com.simibubi.mightyarchitect.control.design.partials.Design.DesignInstance; public class TowerRoof extends Tower { @Override - public Design fromNBT(CompoundNBT compound) { + public Design fromNBT(CompoundTag compound) { TowerRoof towerRoof = new TowerRoof(); towerRoof.applyNBT(compound); towerRoof.radius = compound.getInt("Radius"); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Trim.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Trim.java index ffab009..5d4174a 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Trim.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Trim.java @@ -1,11 +1,11 @@ package com.simibubi.mightyarchitect.control.design.partials; -import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.CompoundTag; public class Trim extends Design { @Override - public Design fromNBT(CompoundNBT compound) { + public Design fromNBT(CompoundTag compound) { Trim trim = new Trim(); trim.applyNBT(compound); return trim; diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Wall.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Wall.java index ded04e1..1a02ce1 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Wall.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Wall.java @@ -4,8 +4,8 @@ import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.math.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.BlockPos; import com.simibubi.mightyarchitect.control.design.partials.Design.DesignInstance; @@ -18,7 +18,7 @@ public enum ExpandBehaviour { public ExpandBehaviour expandBehaviour; @Override - public Design fromNBT(CompoundNBT compound) { + public Design fromNBT(CompoundTag compound) { Wall wall = new Wall(); wall.applyNBT(compound); wall.expandBehaviour = ExpandBehaviour.valueOf(compound.getString("ExpandBehaviour")); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/palette/BlockOrientation.java b/src/main/java/com/simibubi/mightyarchitect/control/palette/BlockOrientation.java index 03efe4d..a51c4d0 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/palette/BlockOrientation.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/palette/BlockOrientation.java @@ -1,17 +1,17 @@ package com.simibubi.mightyarchitect.control.palette; -import net.minecraft.block.BlockState; -import net.minecraft.block.SlabBlock; -import net.minecraft.block.TrapDoorBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.TrapDoorBlock; import net.minecraft.client.Minecraft; -import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.state.properties.Half; -import net.minecraft.state.properties.SlabType; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.Direction.AxisDirection; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.Half; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.core.BlockPos; public enum BlockOrientation { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteBlockInfo.java b/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteBlockInfo.java index ad9b0dc..a12fe45 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteBlockInfo.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteBlockInfo.java @@ -1,6 +1,6 @@ package com.simibubi.mightyarchitect.control.palette; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; public class PaletteBlockInfo { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteDefinition.java b/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteDefinition.java index 25de5df..babf169 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteDefinition.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteDefinition.java @@ -4,18 +4,18 @@ import java.util.HashMap; import java.util.Map; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.TrapDoorBlock; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.NBTUtil; -import net.minecraft.state.DirectionProperty; -import net.minecraft.state.Property; -import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.TrapDoorBlock; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.block.state.properties.Property; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; public class PaletteDefinition { @@ -103,14 +103,14 @@ public String getName() { return name; } - public CompoundNBT writeToNBT(CompoundNBT compound) { - compound = (compound == null) ? new CompoundNBT() : compound; - CompoundNBT palette = new CompoundNBT(); + public CompoundTag writeToNBT(CompoundTag compound) { + compound = (compound == null) ? new CompoundTag() : compound; + CompoundTag palette = new CompoundTag(); palette.putString("Name", getName()); Palette[] values = Palette.values(); for (int i = 0; i < values.length; i++) { - CompoundNBT state = NBTUtil.writeBlockState(get(values[i])); + CompoundTag state = NbtUtils.writeBlockState(get(values[i])); palette.put(values[i].name(), state); } @@ -118,16 +118,16 @@ public CompoundNBT writeToNBT(CompoundNBT compound) { return compound; } - public static PaletteDefinition fromNBT(CompoundNBT compound) { + public static PaletteDefinition fromNBT(CompoundTag compound) { PaletteDefinition palette = defaultPalette().clone(); if (compound != null) { if (compound.contains("Palette")) { - CompoundNBT paletteTag = compound.getCompound("Palette"); + CompoundTag paletteTag = compound.getCompound("Palette"); palette.name = paletteTag.getString("Name"); for (Palette key : Palette.values()) { if (paletteTag.contains(key.name())) { - palette.put(key, NBTUtil.readBlockState(paletteTag.getCompound(key.name()))); + palette.put(key, NbtUtils.readBlockState(paletteTag.getCompound(key.name()))); } } } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteStorage.java b/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteStorage.java index 4082dc0..81a7844 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteStorage.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteStorage.java @@ -18,8 +18,8 @@ import com.simibubi.mightyarchitect.TheMightyArchitect; import com.simibubi.mightyarchitect.foundation.utility.FilesHelper; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.JsonToNBT; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.TagParser; public class PaletteStorage { @@ -61,7 +61,7 @@ public static void exportPalette(PaletteDefinition palette) { FilesHelper.createFolderIfMissing(folderPath); String filename = FilesHelper.findFirstValidFilename(palette.getName(), folderPath, "json"); String filepath = folderPath + "/" + filename; - FilesHelper.saveTagCompoundAsJson(palette.writeToNBT(new CompoundNBT()), filepath); + FilesHelper.saveTagCompoundAsJson(palette.writeToNBT(new CompoundTag()), filepath); } public static PaletteDefinition importPalette(Path path) { @@ -69,7 +69,7 @@ public static PaletteDefinition importPalette(Path path) { JsonReader reader = new JsonReader(Files.newBufferedReader(path)); reader.setLenient(true); JsonElement element = Streams.parse(reader); - return PaletteDefinition.fromNBT(JsonToNBT.parseTag(element.toString())); + return PaletteDefinition.fromNBT(TagParser.parseTag(element.toString())); } catch (IOException | CommandSyntaxException e) { e.printStackTrace(); } @@ -100,7 +100,7 @@ public static void loadResourcePalettes() { String path = "palettes/p" + index + ".json"; if (TheMightyArchitect.class.getClassLoader().getResource(path) == null) break; - CompoundNBT tag = FilesHelper.loadJsonResourceAsNBT(path); + CompoundTag tag = FilesHelper.loadJsonResourceAsNBT(path); PaletteDefinition paletteDefinition = PaletteDefinition.fromNBT(tag); resourcePalettes.put(paletteDefinition.getName(), paletteDefinition); index++; diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/IArchitectPhase.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/IArchitectPhase.java index 2c0153e..c99fa0b 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/IArchitectPhase.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/IArchitectPhase.java @@ -2,15 +2,15 @@ import java.util.List; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.MultiBufferSource; public interface IArchitectPhase { public void whenEntered(); public void update(); - public void render(MatrixStack ms, IRenderTypeBuffer buffer); + public void render(PoseStack ms, MultiBufferSource buffer); public void whenExited(); public List getToolTip(); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseBase.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseBase.java index 1b676cc..fce4fca 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseBase.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseBase.java @@ -4,7 +4,7 @@ import com.simibubi.mightyarchitect.control.Schematic; import net.minecraft.client.Minecraft; -import net.minecraft.util.text.StringTextComponent; +import net.minecraft.network.chat.TextComponent; public abstract class PhaseBase implements IArchitectPhase { @@ -35,7 +35,7 @@ protected void sendStatusMessage(String message) { if (message == null) return; - minecraft.player.displayClientMessage(new StringTextComponent(message), true); + minecraft.player.displayClientMessage(new TextComponent(message), true); } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseComposing.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseComposing.java index 623ab77..5321422 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseComposing.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseComposing.java @@ -3,7 +3,7 @@ import java.util.List; import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.MightyClient; import com.simibubi.mightyarchitect.control.compose.planner.Tools; import com.simibubi.mightyarchitect.foundation.utility.ShaderManager; @@ -11,7 +11,7 @@ import com.simibubi.mightyarchitect.gui.ToolSelectionScreen; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; public class PhaseComposing extends PhaseBase implements IRenderGameOverlay { @@ -90,7 +90,7 @@ public boolean onScroll(int amount) { } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) {} + public void render(PoseStack ms, MultiBufferSource buffer) {} @Override public void whenExited() { @@ -102,7 +102,7 @@ public void renderGameOverlay(Pre event) { if (Minecraft.getInstance().screen != null) return; - MatrixStack ms = event.getMatrixStack(); + PoseStack ms = event.getMatrixStack(); toolSelection.renderPassive(ms, event.getPartialTicks()); activeTool.getTool() .renderOverlay(ms); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseCreatingPalette.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseCreatingPalette.java index 7cb80eb..d451825 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseCreatingPalette.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseCreatingPalette.java @@ -5,24 +5,24 @@ import java.util.Map; import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.MightyClient; import com.simibubi.mightyarchitect.control.Schematic; import com.simibubi.mightyarchitect.control.palette.Palette; import com.simibubi.mightyarchitect.control.palette.PaletteDefinition; import com.simibubi.mightyarchitect.foundation.utility.RaycastHelper; -import net.minecraft.block.BlockState; -import net.minecraft.block.TrapDoorBlock; -import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.TrapDoorBlock; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.RayTraceResult.Type; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.world.gen.Heightmap; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.world.phys.AABB; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.HitResult.Type; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.level.levelgen.Heightmap; import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.common.ForgeMod; @@ -37,11 +37,11 @@ public class PhaseCreatingPalette extends PhaseBase implements IDrawBlockHighlig public void whenEntered() { Schematic model = getModel(); - ClientWorld world = minecraft.level; + ClientLevel world = minecraft.level; changed = new boolean[16]; palette = model.getCreatedPalette(); - center = world.getHeightmapPos(Heightmap.Type.WORLD_SURFACE, minecraft.player.blockPosition()); + center = world.getHeightmapPos(Heightmap.Types.WORLD_SURFACE, minecraft.player.blockPosition()); grid = new HashMap<>(); for (int i = 0; i < 16; i++) { @@ -90,7 +90,7 @@ public void update() { } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) { + public void render(PoseStack ms, MultiBufferSource buffer) { // Blocks for (int i = 0; i < 16; i++) { BlockState state = palette.get(Palette.values()[i]); @@ -106,7 +106,7 @@ public void render(MatrixStack ms, IRenderTypeBuffer buffer) { ms.translate(1 / 32f, 1 / 32f, 1 / 32f); ms.scale(15 / 16f, 15 / 16f, 15 / 16f); minecraft.getBlockRenderer() - .renderBlock(state, ms, buffer, 0xF000F0, OverlayTexture.NO_OVERLAY, EmptyModelData.INSTANCE); + .renderSingleBlock(state, ms, buffer, 0xF000F0, OverlayTexture.NO_OVERLAY, EmptyModelData.INSTANCE); ms.popPose(); } } @@ -119,7 +119,7 @@ public void whenExited() { protected void notifyChange() { getModel().updatePalettePreview(); - minecraft.player.displayClientMessage(new StringTextComponent("Updating Preview..."), true); + minecraft.player.displayClientMessage(new TextComponent("Updating Preview..."), true); MightyClient.renderer.update(); } @@ -129,7 +129,7 @@ protected void notifyChange() { public void tickHighlightOutlines() { BlockPos targetBlock = null; - RayTraceResult raytrace = RaycastHelper.rayTraceRange(minecraft.level, minecraft.player, + HitResult raytrace = RaycastHelper.rayTraceRange(minecraft.level, minecraft.player, minecraft.player.getAttributeValue(ForgeMod.REACH_DISTANCE.get())); if (raytrace != null && raytrace.getType() == Type.BLOCK) { targetBlock = new BlockPos(raytrace.getLocation()); @@ -144,7 +144,7 @@ public void tickHighlightOutlines() { // Render Outline boolean s = targetBlock != null && pos.equals(targetBlock); boolean b = changed[i]; - MightyClient.outliner.showAABB("pallete" + i, new AxisAlignedBB(pos)) + MightyClient.outliner.showAABB("pallete" + i, new AABB(pos)) .lineWidth(b || s ? 1 / 16f : 1 / 32f) .colored(s ? 0x8888ff : b ? 0x6666ff : 0xbbbbbb); } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseEmpty.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseEmpty.java index 37ae613..a046c86 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseEmpty.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseEmpty.java @@ -3,9 +3,9 @@ import java.util.List; import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.MultiBufferSource; public class PhaseEmpty extends PhaseBase { @@ -22,7 +22,7 @@ public void onClick(int button) { } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) { + public void render(PoseStack ms, MultiBufferSource buffer) { } @Override diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePaused.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePaused.java index e2b1e7c..22a04ae 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePaused.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePaused.java @@ -3,29 +3,29 @@ import java.util.List; import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.MightyClient; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TextFormatting; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.ChatFormatting; public class PhasePaused extends PhaseBase { @Override public void whenEntered() { - ClientPlayerEntity player = Minecraft.getInstance().player; + LocalPlayer player = Minecraft.getInstance().player; if (player == null) return; - player.displayClientMessage(new StringTextComponent( - "The Mighty Architect was " + TextFormatting.BOLD + "Paused" + TextFormatting.RESET + "."), false); - player.displayClientMessage(new StringTextComponent("You can continue composing with [" + TextFormatting.AQUA + player.displayClientMessage(new TextComponent( + "The Mighty Architect was " + ChatFormatting.BOLD + "Paused" + ChatFormatting.RESET + "."), false); + player.displayClientMessage(new TextComponent("You can continue composing with [" + ChatFormatting.AQUA + MightyClient.COMPOSE.getTranslatedKeyMessage() .getString() .toUpperCase() - + TextFormatting.WHITE + "]"), false); + + ChatFormatting.WHITE + "]"), false); } @Override @@ -34,7 +34,7 @@ public void update() { } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) { + public void render(PoseStack ms, MultiBufferSource buffer) { } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePreviewing.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePreviewing.java index 2914b66..c1bd9e9 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePreviewing.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePreviewing.java @@ -4,13 +4,13 @@ import java.util.function.Consumer; import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.MightyClient; import com.simibubi.mightyarchitect.control.compose.planner.Tools; import com.simibubi.mightyarchitect.gui.ToolSelectionScreen; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraftforge.client.event.RenderGameOverlayEvent; public class PhasePreviewing extends PhaseBase implements IRenderGameOverlay { @@ -91,7 +91,7 @@ public boolean onScroll(int amount) { } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) {} + public void render(PoseStack ms, MultiBufferSource buffer) {} @Override public void whenExited() { @@ -100,7 +100,7 @@ public void whenExited() { @Override public void renderGameOverlay(RenderGameOverlayEvent.Pre event) { - MatrixStack ms = event.getMatrixStack(); + PoseStack ms = event.getMatrixStack(); toolSelection.renderPassive(ms, event.getPartialTicks()); activeTool.getTool() .renderOverlay(ms); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/PrintingToMultiplayer.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/PrintingToMultiplayer.java index 5494b5b..9fa5520 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/PrintingToMultiplayer.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/PrintingToMultiplayer.java @@ -4,20 +4,20 @@ import java.util.List; import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.TheMightyArchitect; import com.simibubi.mightyarchitect.control.ArchitectManager; import com.simibubi.mightyarchitect.control.TemplateBlockAccess; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.shapes.ISelectionContext; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TextFormatting; -import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.ClientChatReceivedEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -59,7 +59,7 @@ public void update() { if (minecraft.level.getBlockState(pos) == state) continue; - if (!minecraft.level.isUnobstructed(state, pos, ISelectionContext.of(minecraft.player))) + if (!minecraft.level.isUnobstructed(state, pos, CollisionContext.of(minecraft.player))) continue; String blockstring = state.toString().replaceFirst("Block\\{", "").replaceFirst("\\}", ""); @@ -79,20 +79,20 @@ public static void onCommandFeedback(ClientChatReceivedEvent event) { return; if (cooldown > 0) { - List checking = new LinkedList<>(); + List checking = new LinkedList<>(); checking.add(event.getMessage()); while (!checking.isEmpty()) { - ITextComponent iTextComponent = checking.get(0); - if (iTextComponent instanceof TranslationTextComponent) { - String test = ((TranslationTextComponent) iTextComponent).getKey(); + Component iTextComponent = checking.get(0); + if (iTextComponent instanceof TranslatableComponent) { + String test = ((TranslatableComponent) iTextComponent).getKey(); TheMightyArchitect.logger.info(test); if (test.equals("command.unknown.command")) { cooldown = 0; - event.setMessage(new StringTextComponent( - TextFormatting.RED + "You do not have permission to print on this server.")); + event.setMessage(new TextComponent( + ChatFormatting.RED + "You do not have permission to print on this server.")); return; } if (test.equals("parsing.int.expected")) { @@ -113,13 +113,13 @@ public static void onCommandFeedback(ClientChatReceivedEvent event) { } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) { + public void render(PoseStack ms, MultiBufferSource buffer) { } @Override public void whenExited() { if (approved) { - Minecraft.getInstance().player.displayClientMessage(new StringTextComponent(TextFormatting.GREEN + "Finished Printing, enjoy!"), + Minecraft.getInstance().player.displayClientMessage(new TextComponent(ChatFormatting.GREEN + "Finished Printing, enjoy!"), false); Minecraft.getInstance().player.chat("/gamerule logAdminCommands true"); Minecraft.getInstance().player.chat("/gamerule sendCommandFeedback true"); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/export/PhaseEditTheme.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/export/PhaseEditTheme.java index 683f838..56a5639 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/export/PhaseEditTheme.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/export/PhaseEditTheme.java @@ -5,7 +5,7 @@ import java.util.function.Function; import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.AllSpecialTextures; import com.simibubi.mightyarchitect.MightyClient; import com.simibubi.mightyarchitect.control.compose.Cuboid; @@ -17,9 +17,9 @@ import com.simibubi.mightyarchitect.foundation.utility.outliner.BlockClusterOutline; import com.simibubi.mightyarchitect.foundation.utility.outliner.Outline; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.Vec3; public class PhaseEditTheme extends PhaseBase { @@ -119,7 +119,7 @@ private void tickOutlines() { } private void chaseText(Object key, float x, float y, float z, String text) { - MightyClient.outliner.chaseText(key, new Vector3d(x, y, z), text) + MightyClient.outliner.chaseText(key, new Vec3(x, y, z), text) .disableNormals() .colored(0xffffff); } @@ -197,6 +197,6 @@ public static void resetVisualization() { } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) {} + public void render(PoseStack ms, MultiBufferSource buffer) {} } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/export/PhaseListThemesForEditing.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/export/PhaseListThemesForEditing.java index 406ed01..dbadcf8 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/export/PhaseListThemesForEditing.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/export/PhaseListThemesForEditing.java @@ -3,10 +3,10 @@ import java.util.List; import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.control.phase.PhaseBase; -import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.MultiBufferSource; public class PhaseListThemesForEditing extends PhaseBase { @@ -20,7 +20,7 @@ public void update() { } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) { + public void render(PoseStack ms, MultiBufferSource buffer) { } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/export/PhaseManageThemes.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/export/PhaseManageThemes.java index d3bffb9..fecbfc1 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/export/PhaseManageThemes.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/export/PhaseManageThemes.java @@ -4,10 +4,10 @@ import java.util.List; import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.control.phase.PhaseBase; -import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.MultiBufferSource; public class PhaseManageThemes extends PhaseBase { @@ -22,7 +22,7 @@ public void update() { } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) { + public void render(PoseStack ms, MultiBufferSource buffer) { } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/MatrixStacker.java b/src/main/java/com/simibubi/mightyarchitect/foundation/MatrixStacker.java index 233639c..c3e1cce 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/MatrixStacker.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/MatrixStacker.java @@ -1,22 +1,22 @@ package com.simibubi.mightyarchitect.foundation; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.foundation.utility.AngleHelper; import com.simibubi.mightyarchitect.foundation.utility.VecHelper; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Vector3d; -import net.minecraft.util.math.vector.Vector3f; -import net.minecraft.util.math.vector.Vector3i; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.Vec3; +import com.mojang.math.Vector3f; +import net.minecraft.core.Vec3i; public class MatrixStacker { - static Vector3d center = VecHelper.getCenterOf(BlockPos.ZERO); + static Vec3 center = VecHelper.getCenterOf(BlockPos.ZERO); static MatrixStacker instance; - MatrixStack ms; + PoseStack ms; - public static MatrixStacker of(MatrixStack ms) { + public static MatrixStacker of(PoseStack ms) { if (instance == null) instance = new MatrixStacker(); instance.ms = ms; @@ -50,17 +50,17 @@ public MatrixStacker unCentre() { return translateBack(center); } - public MatrixStacker translate(Vector3i vec) { + public MatrixStacker translate(Vec3i vec) { ms.translate(vec.getX(), vec.getY(), vec.getZ()); return this; } - public MatrixStacker translate(Vector3d vec) { + public MatrixStacker translate(Vec3 vec) { ms.translate(vec.x, vec.y, vec.z); return this; } - public MatrixStacker translateBack(Vector3d vec) { + public MatrixStacker translateBack(Vec3 vec) { ms.translate(-vec.x, -vec.y, -vec.z); return this; } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/RenderTypes.java b/src/main/java/com/simibubi/mightyarchitect/foundation/RenderTypes.java index 79453e5..2f9ceb2 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/RenderTypes.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/RenderTypes.java @@ -1,114 +1,122 @@ package com.simibubi.mightyarchitect.foundation; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.VertexFormat; import com.simibubi.mightyarchitect.AllSpecialTextures; -import net.minecraft.client.renderer.RenderState; +import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.inventory.container.PlayerContainer; -import net.minecraft.util.ResourceLocation; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.simibubi.mightyarchitect.TheMightyArchitect; -public class RenderTypes extends RenderState { +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.resources.ResourceLocation; - protected static final RenderState.CullState DISABLE_CULLING = new NoCullState(); +public class RenderTypes extends RenderStateShard { - public static RenderType getOutlineTranslucent(ResourceLocation texture, boolean cull) { - RenderType.State rendertype$state = RenderType.State.builder() - .setTextureState(new RenderState.TextureState(texture, false, false)) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) - .setDiffuseLightingState(DIFFUSE_LIGHTING) - .setAlphaState(DEFAULT_ALPHA) - .setCullState(cull ? CULL : DISABLE_CULLING) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true); - return RenderType.create("outline_translucent" + (cull ? "_cull" : ""), - DefaultVertexFormats.NEW_ENTITY, 7, 256, true, true, rendertype$state); - } + protected static final RenderStateShard.CullStateShard DISABLE_CULLING = new NoCullState(); private static final RenderType OUTLINE_SOLID = - RenderType.create("outline_solid", DefaultVertexFormats.NEW_ENTITY, 7, 256, true, - false, RenderType.State.builder() - .setTextureState(new RenderState.TextureState(AllSpecialTextures.BLANK.getLocation(), false, false)) - .setTransparencyState(NO_TRANSPARENCY) - .setDiffuseLightingState(DIFFUSE_LIGHTING) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); + RenderType.create(createLayerName("outline_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, + false, RenderType.CompositeState.builder() + .setShaderState(RENDERTYPE_ENTITY_SOLID_SHADER) + .setTextureState(new RenderStateShard.TextureStateShard(AllSpecialTextures.BLANK.getLocation(), false, false)) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true)); + + public static RenderType getOutlineSolid() { + return OUTLINE_SOLID; + } + + public static RenderType getOutlineTranslucent(ResourceLocation texture, boolean cull) { + return RenderType.create(createLayerName("outline_translucent" + (cull ? "_cull" : "")), + DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder() + .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_SHADER) + .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setCullState(cull ? CULL : NO_CULL) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .setWriteMaskState(COLOR_WRITE) + .createCompositeState(true)); + } public static RenderType getGlowingSolid(ResourceLocation texture) { - RenderType.State rendertype$state = RenderType.State.builder() - .setTextureState(new RenderState.TextureState(texture, false, false)) - .setTransparencyState(NO_TRANSPARENCY) - .setDiffuseLightingState(NO_DIFFUSE_LIGHTING) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true); - return RenderType.create("glowing_solid", DefaultVertexFormats.NEW_ENTITY, 7, 256, - true, false, rendertype$state); + return RenderType.create(createLayerName("glowing_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, + true, false, RenderType.CompositeState.builder() + .setShaderState(NEW_ENTITY_SHADER) + .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true)); + } + + private static final RenderType GLOWING_SOLID_DEFAULT = getGlowingSolid(InventoryMenu.BLOCK_ATLAS); + + public static RenderType getGlowingSolid() { + return GLOWING_SOLID_DEFAULT; } public static RenderType getGlowingTranslucent(ResourceLocation texture) { - RenderType.State rendertype$state = RenderType.State.builder() - .setTextureState(new RenderState.TextureState(texture, false, false)) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) - .setDiffuseLightingState(NO_DIFFUSE_LIGHTING) - .setAlphaState(DEFAULT_ALPHA) - .setCullState(DISABLE_CULLING) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true); - return RenderType.create("glowing_translucent", DefaultVertexFormats.NEW_ENTITY, 7, - 256, true, true, rendertype$state); + return RenderType.create(createLayerName("glowing_translucent"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, + 256, true, true, RenderType.CompositeState.builder() + .setShaderState(NEW_ENTITY_SHADER) + .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setCullState(NO_CULL) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true)); } - private static final RenderType GLOWING_SOLID = RenderTypes.getGlowingSolid(PlayerContainer.BLOCK_ATLAS); - private static final RenderType GLOWING_TRANSLUCENT = - RenderTypes.getGlowingTranslucent(PlayerContainer.BLOCK_ATLAS); + private static final RenderType GLOWING_TRANSLUCENT_DEFAULT = getGlowingTranslucent(InventoryMenu.BLOCK_ATLAS); + + public static RenderType getGlowingTranslucent() { + return GLOWING_TRANSLUCENT_DEFAULT; + } private static final RenderType ITEM_PARTIAL_SOLID = - RenderType.create("item_solid", DefaultVertexFormats.NEW_ENTITY, 7, 256, true, - false, RenderType.State.builder() - .setTextureState(new RenderState.TextureState(PlayerContainer.BLOCK_ATLAS, false, false)) - .setTransparencyState(NO_TRANSPARENCY) - .setDiffuseLightingState(DIFFUSE_LIGHTING) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); - - private static final RenderType ITEM_PARTIAL_TRANSLUCENT = RenderType.create("entity_translucent", - DefaultVertexFormats.NEW_ENTITY, 7, 256, true, true, RenderType.State.builder() - .setTextureState(new RenderState.TextureState(PlayerContainer.BLOCK_ATLAS, false, false)) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) - .setDiffuseLightingState(DIFFUSE_LIGHTING) - .setAlphaState(DEFAULT_ALPHA) - .setCullState(DISABLE_CULLING) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); + RenderType.create(createLayerName("item_partial_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, + false, RenderType.CompositeState.builder() + .setShaderState(RENDERTYPE_ENTITY_SOLID_SHADER) + .setTextureState(BLOCK_SHEET) + .setTransparencyState(NO_TRANSPARENCY) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true)); public static RenderType getItemPartialSolid() { return ITEM_PARTIAL_SOLID; } - - public static RenderType getItemPartialTranslucent() { - return ITEM_PARTIAL_TRANSLUCENT; - } - public static RenderType getOutlineSolid() { - return OUTLINE_SOLID; - } + private static final RenderType ITEM_PARTIAL_TRANSLUCENT = RenderType.create(createLayerName("item_partial_translucent"), + DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder() + .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_SHADER) + .setTextureState(BLOCK_SHEET) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true)); - public static RenderType getGlowingSolid() { - return GLOWING_SOLID; + public static RenderType getItemPartialTranslucent() { + return ITEM_PARTIAL_TRANSLUCENT; } - public static RenderType getGlowingTranslucent() { - return GLOWING_TRANSLUCENT; + private static final RenderType FLUID = RenderType.create(createLayerName("fluid"), + DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder() + .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_SHADER) + .setTextureState(BLOCK_SHEET_MIPPED) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true)); + + public static RenderType getFluid() { + return FLUID; } - protected static class NoCullState extends RenderState.CullState { + protected static class NoCullState extends RenderStateShard.CullStateShard { public NoCullState() { super(false); } @@ -119,6 +127,10 @@ public void setupRenderState() { } } + private static String createLayerName(String name) { + return TheMightyArchitect.ID + ":" + name; + } + // Mmm gimme those protected fields public RenderTypes() { super(null, null, null); diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/SpriteShiftEntry.java b/src/main/java/com/simibubi/mightyarchitect/foundation/SpriteShiftEntry.java index 118e015..c722e65 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/SpriteShiftEntry.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/SpriteShiftEntry.java @@ -4,8 +4,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.inventory.container.PlayerContainer; -import net.minecraft.util.ResourceLocation; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.resources.ResourceLocation; public class SpriteShiftEntry { protected ResourceLocation originalTextureLocation; @@ -20,7 +20,7 @@ public void set(ResourceLocation originalTextureLocation, ResourceLocation targe protected void loadTextures() { Function textureMap = Minecraft.getInstance() - .getTextureAtlas(PlayerContainer.BLOCK_ATLAS); + .getTextureAtlas(InventoryMenu.BLOCK_ATLAS); original = textureMap.apply(originalTextureLocation); target = textureMap.apply(targetTextureLocation); } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBuffer.java b/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBuffer.java index 17cb134..fceed05 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBuffer.java @@ -3,21 +3,21 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.datafixers.util.Pair; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.BufferBuilder.DrawState; -import net.minecraft.client.renderer.GLAllocation; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferBuilder.DrawState; +import com.mojang.blaze3d.platform.MemoryTracker; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Matrix4f; -import net.minecraft.util.math.vector.Vector4f; -import net.minecraft.world.LightType; -import net.minecraft.world.World; +import net.minecraft.core.Direction; +import net.minecraft.core.BlockPos; +import com.mojang.math.Matrix4f; +import com.mojang.math.Vector4f; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.Level; public class SuperByteBuffer { @@ -29,7 +29,7 @@ public interface IVertexLighter { protected int formatSize; // Vertex Position - private MatrixStack transforms; + private PoseStack transforms; // Vertex Texture Coords private boolean shouldShiftUV; @@ -56,13 +56,13 @@ public SuperByteBuffer(BufferBuilder buf) { int size = state.getFirst() .vertexCount() * formatSize; - template = GLAllocation.createByteBuffer(size); + template = ByteBuffer.allocateDirect(size).order(ByteOrder.nativeOrder()); template.order(rendered.order()); template.limit(rendered.limit()); template.put(rendered); template.rewind(); - transforms = new MatrixStack(); + transforms = new PoseStack(); } public static float getUnInterpolatedU(TextureAtlasSprite sprite, float u) { @@ -75,7 +75,7 @@ public static float getUnInterpolatedV(TextureAtlasSprite sprite, float v) { return (v - sprite.getV0()) / f * 16.0F; } - public void renderInto(MatrixStack input, IVertexBuilder builder) { + public void renderInto(PoseStack input, VertexConsumer builder) { ByteBuffer buffer = template; if (buffer.limit() == 0) return; @@ -137,7 +137,7 @@ public void renderInto(MatrixStack input, IVertexBuilder builder) { .endVertex(); } - transforms = new MatrixStack(); + transforms = new PoseStack(); shouldShiftUV = false; shouldColor = false; shouldLight = false; @@ -265,16 +265,16 @@ protected byte getNZ(ByteBuffer buffer, int index) { return buffer.get(getBufferPosition(index) + 30); } - private static int getLight(World world, Vector4f lightPos) { - BlockPos.Mutable pos = new BlockPos.Mutable(); + private static int getLight(Level world, Vector4f lightPos) { + BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); float sky = 0, block = 0; float offset = 1 / 8f; for (float zOffset = offset; zOffset >= -offset; zOffset -= 2 * offset) for (float yOffset = offset; yOffset >= -offset; yOffset -= 2 * offset) for (float xOffset = offset; xOffset >= -offset; xOffset -= 2 * offset) { pos.set(lightPos.x() + xOffset, lightPos.y() + yOffset, lightPos.z() + zOffset); - sky += world.getBrightness(LightType.SKY, pos) / 8f; - block += world.getBrightness(LightType.BLOCK, pos) / 8f; + sky += world.getBrightness(LightLayer.SKY, pos) / 8f; + block += world.getBrightness(LightLayer.BLOCK, pos) / 8f; } return ((int) sky) << 20 | ((int) block) << 4; diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBufferCache.java b/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBufferCache.java index ae949b5..9370c10 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBufferCache.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBufferCache.java @@ -11,17 +11,19 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BlockModelRenderer; -import net.minecraft.client.renderer.BlockRendererDispatcher; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.block.ModelBlockRenderer; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import com.mojang.blaze3d.vertex.BufferBuilder; +import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.util.math.BlockPos; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; + +import net.minecraft.core.BlockPos; import net.minecraftforge.client.model.data.EmptyModelData; public class SuperByteBufferCache { @@ -69,21 +71,21 @@ public void registerCompartment(Compartment instance, long ticksTillExpired) } private SuperByteBuffer standardBlockRender(BlockState renderedState) { - BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRenderer(); + BlockRenderDispatcher dispatcher = Minecraft.getInstance().getBlockRenderer(); return standardModelRender(dispatcher.getBlockModel(renderedState), renderedState); } - private SuperByteBuffer standardModelRender(IBakedModel model, BlockState referenceState) { - return standardModelRender(model, referenceState, new MatrixStack()); + private SuperByteBuffer standardModelRender(BakedModel model, BlockState referenceState) { + return standardModelRender(model, referenceState, new PoseStack()); } - private SuperByteBuffer standardModelRender(IBakedModel model, BlockState referenceState, MatrixStack ms) { - BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRenderer(); - BlockModelRenderer blockRenderer = dispatcher.getModelRenderer(); - BufferBuilder builder = new BufferBuilder(DefaultVertexFormats.BLOCK.getIntegerSize()); + private SuperByteBuffer standardModelRender(BakedModel model, BlockState referenceState, PoseStack ms) { + BlockRenderDispatcher dispatcher = Minecraft.getInstance().getBlockRenderer(); + ModelBlockRenderer blockRenderer = dispatcher.getModelRenderer(); + BufferBuilder builder = new BufferBuilder(DefaultVertexFormat.BLOCK.getIntegerSize()); Random random = new Random(); - builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); - blockRenderer.renderModelFlat(Minecraft.getInstance().level, model, referenceState, BlockPos.ZERO.above(255), ms, + builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK); + blockRenderer.tesselateBlock(Minecraft.getInstance().level, model, referenceState, BlockPos.ZERO.above(255), ms, builder, true, random, 42, OverlayTexture.NO_OVERLAY, EmptyModelData.INSTANCE); builder.end(); diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/SuperRenderTypeBuffer.java b/src/main/java/com/simibubi/mightyarchitect/foundation/SuperRenderTypeBuffer.java index d8b28c0..8e43490 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/SuperRenderTypeBuffer.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/SuperRenderTypeBuffer.java @@ -3,18 +3,18 @@ import java.util.SortedMap; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.vertex.VertexConsumer; import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; -import net.minecraft.client.renderer.Atlases; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RegionRenderCacheBuilder; +import net.minecraft.client.renderer.Sheets; +import com.mojang.blaze3d.vertex.BufferBuilder; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.ChunkBufferBuilderPack; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.model.ModelBakery; -import net.minecraft.util.Util; +import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.Util; -public class SuperRenderTypeBuffer implements IRenderTypeBuffer { +public class SuperRenderTypeBuffer implements MultiBufferSource { static SuperRenderTypeBuffer instance; @@ -34,68 +34,65 @@ public SuperRenderTypeBuffer() { lateBuffer = new SuperRenderTypeBufferPhase(); } - public IVertexBuilder getEarlyBuffer(RenderType type) { - return earlyBuffer.getBuffer(type); + public VertexConsumer getEarlyBuffer(RenderType type) { + return earlyBuffer.bufferSource.getBuffer(type); } @Override - public IVertexBuilder getBuffer(RenderType type) { - return defaultBuffer.getBuffer(type); + public VertexConsumer getBuffer(RenderType type) { + return defaultBuffer.bufferSource.getBuffer(type); } - public IVertexBuilder getLateBuffer(RenderType type) { - return lateBuffer.getBuffer(type); + public VertexConsumer getLateBuffer(RenderType type) { + return lateBuffer.bufferSource.getBuffer(type); } public void draw() { - RenderSystem.disableCull(); - earlyBuffer.endBatch(); - defaultBuffer.endBatch(); - lateBuffer.endBatch(); + earlyBuffer.bufferSource.endBatch(); + defaultBuffer.bufferSource.endBatch(); + lateBuffer.bufferSource.endBatch(); } public void draw(RenderType type) { - RenderSystem.disableCull(); - earlyBuffer.endBatch(type); - defaultBuffer.endBatch(type); - lateBuffer.endBatch(type); + earlyBuffer.bufferSource.endBatch(type); + defaultBuffer.bufferSource.endBatch(type); + lateBuffer.bufferSource.endBatch(type); } - private static class SuperRenderTypeBufferPhase extends IRenderTypeBuffer.Impl { - - // Visible clones from net.minecraft.client.renderer.RenderTypeBuffers - static final RegionRenderCacheBuilder blockBuilders = new RegionRenderCacheBuilder(); - static final SortedMap createEntityBuilders() { - return Util.make(new Object2ObjectLinkedOpenHashMap<>(), (map) -> { - map.put(Atlases.solidBlockSheet(), blockBuilders.builder(RenderType.solid())); - assign(map, RenderTypes.getOutlineSolid()); - map.put(Atlases.cutoutBlockSheet(), blockBuilders.builder(RenderType.cutout())); - map.put(Atlases.bannerSheet(), blockBuilders.builder(RenderType.cutoutMipped())); - map.put(Atlases.translucentCullBlockSheet(), blockBuilders.builder(RenderType.translucent())); // FIXME new equivalent of getEntityTranslucent() ? - assign(map, Atlases.shieldSheet()); - assign(map, Atlases.bedSheet()); - assign(map, Atlases.shulkerBoxSheet()); - assign(map, Atlases.signSheet()); - assign(map, Atlases.chestSheet()); - assign(map, RenderType.translucentNoCrumbling()); - assign(map, RenderType.glint()); - assign(map, RenderType.entityGlint()); - assign(map, RenderType.waterMask()); - ModelBakery.DESTROY_TYPES.forEach((p_228488_1_) -> { - assign(map, p_228488_1_); - }); + private static class SuperRenderTypeBufferPhase { + + // Visible clones from RenderBuffers + private final ChunkBufferBuilderPack fixedBufferPack = new ChunkBufferBuilderPack(); + private final SortedMap fixedBuffers = Util.make(new Object2ObjectLinkedOpenHashMap<>(), map -> { + map.put(Sheets.solidBlockSheet(), fixedBufferPack.builder(RenderType.solid())); + map.put(Sheets.cutoutBlockSheet(), fixedBufferPack.builder(RenderType.cutout())); + map.put(Sheets.bannerSheet(), fixedBufferPack.builder(RenderType.cutoutMipped())); + map.put(Sheets.translucentCullBlockSheet(), fixedBufferPack.builder(RenderType.translucent())); + put(map, Sheets.shieldSheet()); + put(map, Sheets.bedSheet()); + put(map, Sheets.shulkerBoxSheet()); + put(map, Sheets.signSheet()); + put(map, Sheets.chestSheet()); + put(map, RenderType.translucentNoCrumbling()); + put(map, RenderType.armorGlint()); + put(map, RenderType.armorEntityGlint()); + put(map, RenderType.glint()); + put(map, RenderType.glintDirect()); + put(map, RenderType.glintTranslucent()); + put(map, RenderType.entityGlint()); + put(map, RenderType.entityGlintDirect()); + put(map, RenderType.waterMask()); + put(map, RenderTypes.getOutlineSolid()); + ModelBakery.DESTROY_TYPES.forEach((p_173062_) -> { + put(map, p_173062_); }); - } - + }); + private final MultiBufferSource.BufferSource bufferSource = MultiBufferSource.immediateWithBuffers(fixedBuffers, new BufferBuilder(256)); - private static void assign(Object2ObjectLinkedOpenHashMap map, RenderType type) { + private static void put(Object2ObjectLinkedOpenHashMap map, RenderType type) { map.put(type, new BufferBuilder(type.bufferSize())); } - protected SuperRenderTypeBufferPhase() { - super(new BufferBuilder(256), createEntityBuilders()); - } - } } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java b/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java index c9d8fea..2ab3058 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java @@ -2,35 +2,77 @@ import java.util.Collections; import java.util.List; +import java.util.UUID; +import java.util.function.Consumer; import java.util.function.Predicate; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.fluid.Fluid; -import net.minecraft.item.crafting.RecipeManager; -import net.minecraft.scoreboard.Scoreboard; -import net.minecraft.tags.ITagCollectionSupplier; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.SoundCategory; -import net.minecraft.util.SoundEvent; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.DynamicRegistries; -import net.minecraft.world.ITickList; -import net.minecraft.world.World; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.chunk.AbstractChunkProvider; -import net.minecraft.world.storage.ISpawnWorldInfo; -import net.minecraft.world.storage.MapData; - -public class WrappedWorld extends World { - - protected World world; - - public WrappedWorld(World world) { - super((ISpawnWorldInfo) world.getLevelData(), world.dimension(), world.dimensionType(), +import javax.annotation.Nullable; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.entity.EntityTypeTest; +import net.minecraft.world.level.entity.LevelEntityGetter; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.scores.Scoreboard; +import net.minecraft.tags.TagContainer; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.core.Direction; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.core.BlockPos; +import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.TickList; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkSource; +import net.minecraft.world.level.storage.WritableLevelData; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; + +public class WrappedWorld extends Level { + + protected Level world; + + protected LevelEntityGetter entityGetter = new LevelEntityGetter() { + @Nullable + @Override + public Entity get(int p_156931_) { + return null; + } + + @Nullable + @Override + public Entity get(UUID p_156939_) { + return null; + } + + @Override + public Iterable getAll() { + return Collections.emptyList(); + } + + @Override + public void get(EntityTypeTest p_156935_, Consumer p_156936_) { + + } + + @Override + public void get(AABB p_156937_, Consumer p_156938_) { + + } + + @Override + public void get(EntityTypeTest p_156932_, AABB p_156933_, Consumer p_156934_) { + + } + }; + + public WrappedWorld(Level world) { + super((WritableLevelData) world.getLevelData(), world.dimension(), world.dimensionType(), () -> world.getProfiler(), world.isClientSide, false, 0); this.world = world; } @@ -46,7 +88,7 @@ public boolean isStateAtPosition(BlockPos p_217375_1_, Predicate p_2 } @Override - public TileEntity getBlockEntity(BlockPos pos) { + public BlockEntity getBlockEntity(BlockPos pos) { return world.getBlockEntity(pos); } @@ -66,30 +108,40 @@ public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newSt } @Override - public ITickList getBlockTicks() { + public TickList getBlockTicks() { return world.getBlockTicks(); } @Override - public ITickList getLiquidTicks() { + public TickList getLiquidTicks() { return world.getLiquidTicks(); } @Override - public void levelEvent(PlayerEntity player, int type, BlockPos pos, int data) {} + public void levelEvent(Player player, int type, BlockPos pos, int data) {} @Override - public List players() { + public void gameEvent(@Nullable Entity p_151549_, GameEvent p_151550_, BlockPos p_151551_) { + + } + + @Override + public List players() { return Collections.emptyList(); } @Override - public void playSound(PlayerEntity player, double x, double y, double z, SoundEvent soundIn, SoundCategory category, + public void playSound(Player player, double x, double y, double z, SoundEvent soundIn, SoundSource category, float volume, float pitch) {} @Override - public void playSound(PlayerEntity p_217384_1_, Entity p_217384_2_, SoundEvent p_217384_3_, - SoundCategory p_217384_4_, float p_217384_5_, float p_217384_6_) {} + public void playSound(Player p_217384_1_, Entity p_217384_2_, SoundEvent p_217384_3_, + SoundSource p_217384_4_, float p_217384_5_, float p_217384_6_) {} + + @Override + public String gatherChunkSourceStats() { + return null; + } @Override public Entity getEntity(int id) { @@ -97,18 +149,18 @@ public Entity getEntity(int id) { } @Override - public MapData getMapData(String mapName) { + public MapItemSavedData getMapData(String mapName) { return null; } @Override public boolean addFreshEntity(Entity entityIn) { - entityIn.setLevel(world); + entityIn.level = world; return world.addFreshEntity(entityIn); } @Override - public void setMapData(MapData mapDataIn) {} + public void setMapData(String mapId, MapItemSavedData mapDataIn) {} @Override public int getFreeMapId() { @@ -134,12 +186,12 @@ public Biome getUncachedNoiseBiome(int p_225604_1_, int p_225604_2_, int p_22560 } @Override - public AbstractChunkProvider getChunkSource() { + public ChunkSource getChunkSource() { return world.getChunkSource(); } @Override - public DynamicRegistries registryAccess() { + public RegistryAccess registryAccess() { return world.registryAccess(); } @@ -149,11 +201,16 @@ public float getShade(Direction p_230487_1_, boolean p_230487_2_) { } @Override - public ITagCollectionSupplier getTagManager() { + public TagContainer getTagManager() { return world.getTagManager(); } - public World getWorld() { + @Override + protected LevelEntityGetter getEntities() { + return entityGetter; + } + + public Level getWorld() { return world; } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/AngleHelper.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/AngleHelper.java index 0b74c07..c26d678 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/AngleHelper.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/AngleHelper.java @@ -1,17 +1,17 @@ package com.simibubi.mightyarchitect.foundation.utility; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.vector.Vector3f; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import com.mojang.math.Vector3f; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; public class AngleHelper { @OnlyIn(Dist.CLIENT) - public static void applyRotation(Direction direction, MatrixStack ms) { + public static void applyRotation(Direction direction, PoseStack ms) { ms.mulPose(Vector3f.YP.rotationDegrees(AngleHelper.horizontalAngle(direction))); ms.mulPose(Vector3f.XP.rotationDegrees(AngleHelper.verticalAngle(direction))); } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/BuildingHelper.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/BuildingHelper.java index c8667b1..460d958 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/BuildingHelper.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/BuildingHelper.java @@ -3,7 +3,7 @@ import java.util.HashSet; import java.util.Set; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; public class BuildingHelper { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/ColorHelper.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/ColorHelper.java index 8dabcb9..6406ce1 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/ColorHelper.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/ColorHelper.java @@ -4,7 +4,7 @@ import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.world.phys.Vec3; public class ColorHelper { @@ -49,18 +49,18 @@ public static void glColor(int color) { int g = (color >> 8) & 0xFF; int b = color & 0xFF; - RenderSystem.color4f(r / 256f, g / 256f, b / 256f, 1); + //RenderSystem.color4f(r / 256f, g / 256f, b / 256f, 1); } public static void glResetColor() { - RenderSystem.color4f(1, 1, 1, 1); + //RenderSystem.color4f(1, 1, 1, 1); } - public static Vector3d getRGB(int color) { + public static Vec3 getRGB(int color) { int r = (color >> 16); int g = (color >> 8) & 0xFF; int b = color & 0xFF; - return new Vector3d(r, g, b).scale(1 / 256d); + return new Vec3(r, g, b).scale(1 / 256d); } public static int colorFromUUID(UUID uuid) { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/DesignHelper.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/DesignHelper.java index 16178c8..05f9f91 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/DesignHelper.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/DesignHelper.java @@ -22,7 +22,7 @@ import com.simibubi.mightyarchitect.control.design.partials.TowerFlatRoof; import com.simibubi.mightyarchitect.control.design.partials.TowerRoof; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; public class DesignHelper { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/FilesHelper.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/FilesHelper.java index caaa409..a863582 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/FilesHelper.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/FilesHelper.java @@ -16,8 +16,8 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.simibubi.mightyarchitect.TheMightyArchitect; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.JsonToNBT; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.TagParser; public class FilesHelper { @@ -47,7 +47,7 @@ public static String slug(String name) { return name.toLowerCase().replace(' ', '_'); } - public static boolean saveTagCompoundAsJson(CompoundNBT compound, String path) { + public static boolean saveTagCompoundAsJson(CompoundTag compound, String path) { try { Files.deleteIfExists(Paths.get(path)); JsonWriter writer = new JsonWriter(Files.newBufferedWriter(Paths.get(path), StandardOpenOption.CREATE)); @@ -62,7 +62,7 @@ public static boolean saveTagCompoundAsJson(CompoundNBT compound, String path) { } - public static boolean saveTagCompoundAsJsonCompact(CompoundNBT compound, String path) { + public static boolean saveTagCompoundAsJsonCompact(CompoundTag compound, String path) { try { Files.deleteIfExists(Paths.get(path)); JsonWriter writer = new JsonWriter(Files.newBufferedWriter(Paths.get(path), StandardOpenOption.CREATE)); @@ -76,14 +76,14 @@ public static boolean saveTagCompoundAsJsonCompact(CompoundNBT compound, String } - public static CompoundNBT loadJsonNBT(InputStream inputStream) { + public static CompoundTag loadJsonNBT(InputStream inputStream) { try { JsonReader reader = new JsonReader(new BufferedReader(new InputStreamReader(inputStream))); reader.setLenient(true); JsonElement element = Streams.parse(reader); reader.close(); inputStream.close(); - return JsonToNBT.parseTag(element.toString()); + return TagParser.parseTag(element.toString()); } catch (IOException e) { e.printStackTrace(); } catch (CommandSyntaxException e) { @@ -92,11 +92,11 @@ public static CompoundNBT loadJsonNBT(InputStream inputStream) { return null; } - public static CompoundNBT loadJsonResourceAsNBT(String filepath) { + public static CompoundTag loadJsonResourceAsNBT(String filepath) { return loadJsonNBT(TheMightyArchitect.class.getClassLoader().getResourceAsStream(filepath)); } - public static CompoundNBT loadJsonAsNBT(String filepath) { + public static CompoundTag loadJsonAsNBT(String filepath) { try { return loadJsonNBT(Files.newInputStream(Paths.get(filepath), StandardOpenOption.READ)); } catch (IOException e) { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Iterate.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Iterate.java index 08620d0..195cd12 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Iterate.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Iterate.java @@ -3,9 +3,9 @@ import java.util.Arrays; import java.util.List; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.BlockPos; public class Iterate { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Keyboard.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Keyboard.java index 420d409..0f557e8 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Keyboard.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Keyboard.java @@ -1,7 +1,7 @@ package com.simibubi.mightyarchitect.foundation.utility; import net.minecraft.client.Minecraft; -import net.minecraft.client.util.InputMappings; +import com.mojang.blaze3d.platform.InputConstants; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -24,7 +24,7 @@ public class Keyboard { public static final int G = 71; public static boolean isKeyDown(int key) { - return InputMappings.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), key); + return InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), key); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/RaycastHelper.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/RaycastHelper.java index 7aaca8e..3182079 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/RaycastHelper.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/RaycastHelper.java @@ -2,66 +2,66 @@ import java.util.function.Predicate; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.RayTraceContext; -import net.minecraft.util.math.RayTraceContext.BlockMode; -import net.minecraft.util.math.RayTraceContext.FluidMode; -import net.minecraft.util.math.vector.Vector3d; -import net.minecraft.world.World; +import net.minecraft.world.entity.player.Player; +import net.minecraft.core.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.util.Mth; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.ClipContext.Block; +import net.minecraft.world.level.ClipContext.Fluid; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.Level; public class RaycastHelper { - public static BlockRayTraceResult rayTraceRange(World worldIn, PlayerEntity playerIn, double range) { - Vector3d origin = getTraceOrigin(playerIn); - Vector3d target = getTraceTarget(playerIn, range, origin); - RayTraceContext context = new RayTraceContext(origin, target, BlockMode.COLLIDER, FluidMode.NONE, playerIn); + public static BlockHitResult rayTraceRange(Level worldIn, Player playerIn, double range) { + Vec3 origin = getTraceOrigin(playerIn); + Vec3 target = getTraceTarget(playerIn, range, origin); + ClipContext context = new ClipContext(origin, target, Block.COLLIDER, Fluid.NONE, playerIn); return worldIn.clip(context); } - public static PredicateTraceResult rayTraceUntil(PlayerEntity playerIn, double range, Predicate predicate) { - Vector3d origin = getTraceOrigin(playerIn); - Vector3d target = getTraceTarget(playerIn, range, origin); + public static PredicateTraceResult rayTraceUntil(Player playerIn, double range, Predicate predicate) { + Vec3 origin = getTraceOrigin(playerIn); + Vec3 target = getTraceTarget(playerIn, range, origin); return rayTraceUntil(origin, target, predicate); } - private static Vector3d getTraceTarget(PlayerEntity playerIn, double range, Vector3d origin) { - float f = playerIn.xRot; - float f1 = playerIn.yRot; - float f2 = MathHelper.cos(-f1 * 0.017453292F - (float) Math.PI); - float f3 = MathHelper.sin(-f1 * 0.017453292F - (float) Math.PI); - float f4 = -MathHelper.cos(-f * 0.017453292F); - float f5 = MathHelper.sin(-f * 0.017453292F); + private static Vec3 getTraceTarget(Player playerIn, double range, Vec3 origin) { + float f = playerIn.getXRot(); + float f1 = playerIn.getYRot(); + float f2 = Mth.cos(-f1 * 0.017453292F - (float) Math.PI); + float f3 = Mth.sin(-f1 * 0.017453292F - (float) Math.PI); + float f4 = -Mth.cos(-f * 0.017453292F); + float f5 = Mth.sin(-f * 0.017453292F); float f6 = f3 * f4; float f7 = f2 * f4; double d3 = range; - Vector3d Vector3d1 = origin.add((double) f6 * d3, (double) f5 * d3, (double) f7 * d3); + Vec3 Vector3d1 = origin.add((double) f6 * d3, (double) f5 * d3, (double) f7 * d3); return Vector3d1; } - private static Vector3d getTraceOrigin(PlayerEntity playerIn) { + private static Vec3 getTraceOrigin(Player playerIn) { double d0 = playerIn.getX(); double d1 = playerIn.getY() + (double) playerIn.getEyeHeight(); double d2 = playerIn.getZ(); - Vector3d Vector3d = new Vector3d(d0, d1, d2); + Vec3 Vector3d = new Vec3(d0, d1, d2); return Vector3d; } - private static PredicateTraceResult rayTraceUntil(Vector3d start, Vector3d end, Predicate predicate) { + private static PredicateTraceResult rayTraceUntil(Vec3 start, Vec3 end, Predicate predicate) { if (Double.isNaN(start.x) || Double.isNaN(start.y) || Double.isNaN(start.z)) return null; if (Double.isNaN(end.x) || Double.isNaN(end.y) || Double.isNaN(end.z)) return null; - int dx = MathHelper.floor(end.x); - int dy = MathHelper.floor(end.y); - int dz = MathHelper.floor(end.z); - int x = MathHelper.floor(start.x); - int y = MathHelper.floor(start.y); - int z = MathHelper.floor(start.z); + int dx = Mth.floor(end.x); + int dy = Mth.floor(end.y); + int dz = Mth.floor(end.z); + int x = Mth.floor(start.x); + int y = Mth.floor(start.y); + int z = Mth.floor(start.z); BlockPos currentPos = new BlockPos(x, y, z); @@ -145,18 +145,18 @@ private static PredicateTraceResult rayTraceUntil(Vector3d start, Vector3d end, if (d3 < d4 && d3 < d5) { enumfacing = dx > x ? Direction.WEST : Direction.EAST; - start = new Vector3d(d0, start.y + d7 * d3, start.z + d8 * d3); + start = new Vec3(d0, start.y + d7 * d3, start.z + d8 * d3); } else if (d4 < d5) { enumfacing = dy > y ? Direction.DOWN : Direction.UP; - start = new Vector3d(start.x + d6 * d4, d1, start.z + d8 * d4); + start = new Vec3(start.x + d6 * d4, d1, start.z + d8 * d4); } else { enumfacing = dz > z ? Direction.NORTH : Direction.SOUTH; - start = new Vector3d(start.x + d6 * d5, start.y + d7 * d5, d2); + start = new Vec3(start.x + d6 * d5, start.y + d7 * d5, d2); } - x = MathHelper.floor(start.x) - (enumfacing == Direction.EAST ? 1 : 0); - y = MathHelper.floor(start.y) - (enumfacing == Direction.UP ? 1 : 0); - z = MathHelper.floor(start.z) - (enumfacing == Direction.SOUTH ? 1 : 0); + x = Mth.floor(start.x) - (enumfacing == Direction.EAST ? 1 : 0); + y = Mth.floor(start.y) - (enumfacing == Direction.UP ? 1 : 0); + z = Mth.floor(start.z) - (enumfacing == Direction.SOUTH ? 1 : 0); currentPos = new BlockPos(x, y, z); if (predicate.test(currentPos)) diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/ShaderManager.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/ShaderManager.java index cc59120..aa0a4de 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/ShaderManager.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/ShaderManager.java @@ -1,9 +1,9 @@ package com.simibubi.mightyarchitect.foundation.utility; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Effects; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.event.TickEvent.ClientTickEvent; import net.minecraftforge.eventbus.api.EventPriority; @@ -20,10 +20,10 @@ public static void onClientTick(ClientTickEvent event) { if (Minecraft.getInstance().level == null && activeShader != Shaders.None) stopUsingShaders(); - ClientPlayerEntity player = Minecraft.getInstance().player; + LocalPlayer player = Minecraft.getInstance().player; if (player == null) return; - EffectInstance activePotionEffect = player.getEffect(Effects.NIGHT_VISION); + MobEffectInstance activePotionEffect = player.getEffect(MobEffects.NIGHT_VISION); if (activeShader == Shaders.Blueprint) { if (activePotionEffect == null || activePotionEffect.getDuration() < 999) @@ -32,7 +32,7 @@ public static void onClientTick(ClientTickEvent event) { } if (activePotionEffect instanceof NVEffectInstance) - player.removeEffectNoUpdate(Effects.NIGHT_VISION); + player.removeEffectNoUpdate(MobEffects.NIGHT_VISION); } public static Shaders getActiveShader() { @@ -51,10 +51,10 @@ public static void stopUsingShaders() { activeShader.setActive(true); } - private static class NVEffectInstance extends EffectInstance { + private static class NVEffectInstance extends MobEffectInstance { public NVEffectInstance() { - super(Effects.NIGHT_VISION, 1000, 0, false, false, false); + super(MobEffects.NIGHT_VISION, 1000, 0, false, false, false); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Shaders.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Shaders.java index 40b2a26..1274a43 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Shaders.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Shaders.java @@ -3,8 +3,8 @@ import com.simibubi.mightyarchitect.TheMightyArchitect; import net.minecraft.client.Minecraft; -import net.minecraft.client.shader.ShaderGroup; -import net.minecraft.util.ResourceLocation; +import net.minecraft.client.renderer.PostChain; +import net.minecraft.resources.ResourceLocation; public enum Shaders { @@ -18,7 +18,7 @@ private Shaders(String filename) { public boolean isActive() { Minecraft mc = Minecraft.getInstance(); - ShaderGroup shaderGroup = mc.gameRenderer.currentEffect(); + PostChain shaderGroup = mc.gameRenderer.currentEffect(); return shaderGroup != null && shaderGroup.getName() .equals(location.toString()); } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/VecHelper.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/VecHelper.java index f1ea411..2ac0e2d 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/VecHelper.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/VecHelper.java @@ -4,106 +4,106 @@ import javax.annotation.Nullable; -import net.minecraft.nbt.DoubleNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.vector.Vector3d; -import net.minecraft.util.math.vector.Vector3i; +import net.minecraft.nbt.DoubleTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; +import net.minecraft.core.Vec3i; public class VecHelper { - public static final Vector3d CENTER_OF_ORIGIN = new Vector3d(.5, .5, .5); + public static final Vec3 CENTER_OF_ORIGIN = new Vec3(.5, .5, .5); - public static Vector3d rotate(Vector3d vec, Vector3d rotationVec) { + public static Vec3 rotate(Vec3 vec, Vec3 rotationVec) { return rotate(vec, rotationVec.x, rotationVec.y, rotationVec.z); } - public static Vector3d rotate(Vector3d vec, double xRot, double yRot, double zRot) { + public static Vec3 rotate(Vec3 vec, double xRot, double yRot, double zRot) { return rotate(rotate(rotate(vec, xRot, Axis.X), yRot, Axis.Y), zRot, Axis.Z); } - public static Vector3d rotateCentered(Vector3d vec, double deg, Axis axis) { - Vector3d shift = getCenterOf(BlockPos.ZERO); + public static Vec3 rotateCentered(Vec3 vec, double deg, Axis axis) { + Vec3 shift = getCenterOf(BlockPos.ZERO); return VecHelper.rotate(vec.subtract(shift), deg, axis) .add(shift); } - public static Vector3d lerp(Vector3d start, Vector3d end, double pct) { + public static Vec3 lerp(Vec3 start, Vec3 end, double pct) { return start.add(end.subtract(start).scale(pct)); } - public static Vector3d rotate(Vector3d vec, double deg, Axis axis) { + public static Vec3 rotate(Vec3 vec, double deg, Axis axis) { if (deg == 0) return vec; - if (vec == Vector3d.ZERO) + if (vec == Vec3.ZERO) return vec; float angle = (float) (deg / 180f * Math.PI); - double sin = MathHelper.sin(angle); - double cos = MathHelper.cos(angle); + double sin = Mth.sin(angle); + double cos = Mth.cos(angle); double x = vec.x; double y = vec.y; double z = vec.z; if (axis == Axis.X) - return new Vector3d(x, y * cos - z * sin, z * cos + y * sin); + return new Vec3(x, y * cos - z * sin, z * cos + y * sin); if (axis == Axis.Y) - return new Vector3d(x * cos + z * sin, y, z * cos - x * sin); + return new Vec3(x * cos + z * sin, y, z * cos - x * sin); if (axis == Axis.Z) - return new Vector3d(x * cos - y * sin, y * cos + x * sin, z); + return new Vec3(x * cos - y * sin, y * cos + x * sin, z); return vec; } - public static boolean isVecPointingTowards(Vector3d vec, Direction direction) { - return Vector3d.atLowerCornerOf(direction.getNormal()).distanceTo(vec.normalize()) < .75; + public static boolean isVecPointingTowards(Vec3 vec, Direction direction) { + return Vec3.atLowerCornerOf(direction.getNormal()).distanceTo(vec.normalize()) < .75; } - public static Vector3d getCenterOf(Vector3i pos) { - if (pos.equals(Vector3i.ZERO)) + public static Vec3 getCenterOf(Vec3i pos) { + if (pos.equals(Vec3i.ZERO)) return CENTER_OF_ORIGIN; - return Vector3d.atLowerCornerOf(pos).add(.5f, .5f, .5f); + return Vec3.atLowerCornerOf(pos).add(.5f, .5f, .5f); } - public static Vector3d offsetRandomly(Vector3d vec, Random r, float radius) { - return new Vector3d(vec.x + (r.nextFloat() - .5f) * 2 * radius, vec.y + (r.nextFloat() - .5f) * 2 * radius, + public static Vec3 offsetRandomly(Vec3 vec, Random r, float radius) { + return new Vec3(vec.x + (r.nextFloat() - .5f) * 2 * radius, vec.y + (r.nextFloat() - .5f) * 2 * radius, vec.z + (r.nextFloat() - .5f) * 2 * radius); } - public static Vector3d axisAlingedPlaneOf(Vector3d vec) { + public static Vec3 axisAlingedPlaneOf(Vec3 vec) { vec = vec.normalize(); - return new Vector3d(1, 1, 1).subtract(Math.abs(vec.x), Math.abs(vec.y), Math.abs(vec.z)); + return new Vec3(1, 1, 1).subtract(Math.abs(vec.x), Math.abs(vec.y), Math.abs(vec.z)); } - public static Vector3d axisAlingedPlaneOf(Direction face) { - return axisAlingedPlaneOf(Vector3d.atLowerCornerOf(face.getNormal())); + public static Vec3 axisAlingedPlaneOf(Direction face) { + return axisAlingedPlaneOf(Vec3.atLowerCornerOf(face.getNormal())); } - public static ListNBT writeNBT(Vector3d vec) { - ListNBT listnbt = new ListNBT(); - listnbt.add(DoubleNBT.valueOf(vec.x)); - listnbt.add(DoubleNBT.valueOf(vec.y)); - listnbt.add(DoubleNBT.valueOf(vec.z)); + public static ListTag writeNBT(Vec3 vec) { + ListTag listnbt = new ListTag(); + listnbt.add(DoubleTag.valueOf(vec.x)); + listnbt.add(DoubleTag.valueOf(vec.y)); + listnbt.add(DoubleTag.valueOf(vec.z)); return listnbt; } - public static Vector3d readNBT(ListNBT list) { + public static Vec3 readNBT(ListTag list) { if (list.isEmpty()) - return Vector3d.ZERO; - return new Vector3d(list.getDouble(0), list.getDouble(1), list.getDouble(2)); + return Vec3.ZERO; + return new Vec3(list.getDouble(0), list.getDouble(1), list.getDouble(2)); } - public static Vector3d voxelSpace(double x, double y, double z) { - return new Vector3d(x, y, z).scale(1 / 16f); + public static Vec3 voxelSpace(double x, double y, double z) { + return new Vec3(x, y, z).scale(1 / 16f); } - public static int getCoordinate(Vector3i pos, Axis axis) { + public static int getCoordinate(Vec3i pos, Axis axis) { return axis.choose(pos.getX(), pos.getY(), pos.getZ()); } - public static float getCoordinate(Vector3d vec, Axis axis) { + public static float getCoordinate(Vec3 vec, Axis axis) { return (float) axis.choose(vec.x, vec.y, vec.z); } @@ -117,35 +117,35 @@ public static boolean onSameAxis(BlockPos pos1, BlockPos pos2, Axis axis) { return true; } - public static Vector3d clamp(Vector3d vec, float maxLength) { + public static Vec3 clamp(Vec3 vec, float maxLength) { return vec.length() > maxLength ? vec.normalize() .scale(maxLength) : vec; } - public static Vector3d clampComponentWise(Vector3d vec, float maxLength) { - return new Vector3d(MathHelper.clamp(vec.x, -maxLength, maxLength), MathHelper.clamp(vec.y, -maxLength, maxLength), - MathHelper.clamp(vec.z, -maxLength, maxLength)); + public static Vec3 clampComponentWise(Vec3 vec, float maxLength) { + return new Vec3(Mth.clamp(vec.x, -maxLength, maxLength), Mth.clamp(vec.y, -maxLength, maxLength), + Mth.clamp(vec.z, -maxLength, maxLength)); } - public static Vector3d project(Vector3d vec, Vector3d ontoVec) { - if (ontoVec.equals(Vector3d.ZERO)) - return Vector3d.ZERO; + public static Vec3 project(Vec3 vec, Vec3 ontoVec) { + if (ontoVec.equals(Vec3.ZERO)) + return Vec3.ZERO; return ontoVec.scale(vec.dot(ontoVec) / ontoVec.lengthSqr()); } @Nullable - public static Vector3d intersectSphere(Vector3d origin, Vector3d lineDirection, Vector3d sphereCenter, double radius) { - if (lineDirection.equals(Vector3d.ZERO)) + public static Vec3 intersectSphere(Vec3 origin, Vec3 lineDirection, Vec3 sphereCenter, double radius) { + if (lineDirection.equals(Vec3.ZERO)) return null; if (lineDirection.length() != 1) lineDirection = lineDirection.normalize(); - Vector3d diff = origin.subtract(sphereCenter); + Vec3 diff = origin.subtract(sphereCenter); double lineDotDiff = lineDirection.dot(diff); double delta = lineDotDiff * lineDotDiff - (diff.lengthSqr() - radius * radius); if (delta < 0) return null; - double t = -lineDotDiff + MathHelper.sqrt(delta); + double t = -lineDotDiff + Math.sqrt(delta); return origin.add(lineDirection.scale(t)); } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/AABBOutline.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/AABBOutline.java index 0c78cff..1aa8004 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/AABBOutline.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/AABBOutline.java @@ -1,48 +1,53 @@ package com.simibubi.mightyarchitect.foundation.utility.outliner; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.vertex.IVertexBuilder; +import org.apache.logging.log4j.LogManager; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.simibubi.mightyarchitect.MightyClient; import com.simibubi.mightyarchitect.foundation.RenderTypes; +import com.simibubi.mightyarchitect.foundation.SuperRenderTypeBuffer; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; public class AABBOutline extends Outline { - protected AxisAlignedBB bb; + protected AABB bb; - public AABBOutline(AxisAlignedBB bb) { + public AABBOutline(AABB bb) { this.setBounds(bb); } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) { + public void render(PoseStack ms, MultiBufferSource buffer) { renderBB(ms, buffer, bb); } - public void renderBB(MatrixStack ms, IRenderTypeBuffer buffer, AxisAlignedBB bb) { - Vector3d projectedView = Minecraft.getInstance().gameRenderer.getMainCamera() + public void renderBB(PoseStack ms, MultiBufferSource buffer, AABB bb) { + Vec3 projectedView = Minecraft.getInstance().gameRenderer.getMainCamera() .getPosition(); boolean noCull = bb.contains(projectedView); bb = bb.inflate(noCull ? -1 / 128d : 1 / 128d); noCull |= params.disableCull; - Vector3d xyz = new Vector3d(bb.minX, bb.minY, bb.minZ); - Vector3d Xyz = new Vector3d(bb.maxX, bb.minY, bb.minZ); - Vector3d xYz = new Vector3d(bb.minX, bb.maxY, bb.minZ); - Vector3d XYz = new Vector3d(bb.maxX, bb.maxY, bb.minZ); - Vector3d xyZ = new Vector3d(bb.minX, bb.minY, bb.maxZ); - Vector3d XyZ = new Vector3d(bb.maxX, bb.minY, bb.maxZ); - Vector3d xYZ = new Vector3d(bb.minX, bb.maxY, bb.maxZ); - Vector3d XYZ = new Vector3d(bb.maxX, bb.maxY, bb.maxZ); + Vec3 xyz = new Vec3(bb.minX, bb.minY, bb.minZ); + Vec3 Xyz = new Vec3(bb.maxX, bb.minY, bb.minZ); + Vec3 xYz = new Vec3(bb.minX, bb.maxY, bb.minZ); + Vec3 XYz = new Vec3(bb.maxX, bb.maxY, bb.minZ); + Vec3 xyZ = new Vec3(bb.minX, bb.minY, bb.maxZ); + Vec3 XyZ = new Vec3(bb.maxX, bb.minY, bb.maxZ); + Vec3 xYZ = new Vec3(bb.minX, bb.maxY, bb.maxZ); + Vec3 XYZ = new Vec3(bb.maxX, bb.maxY, bb.maxZ); - Vector3d start = xyz; + Vec3 start = xyz; renderAACuboidLine(ms, buffer, start, Xyz); renderAACuboidLine(ms, buffer, start, xYz); renderAACuboidLine(ms, buffer, start, xyZ); @@ -71,13 +76,17 @@ public void renderBB(MatrixStack ms, IRenderTypeBuffer buffer, AxisAlignedBB bb) } - protected void renderFace(MatrixStack ms, IRenderTypeBuffer buffer, Direction direction, Vector3d p1, Vector3d p2, - Vector3d p3, Vector3d p4, boolean noCull) { + protected void renderFace(PoseStack ms, MultiBufferSource buffer, Direction direction, Vec3 p1, Vec3 p2, + Vec3 p3, Vec3 p4, boolean noCull) { if (!params.faceTexture.isPresent()) return; if (params.isFaceHidden(direction)) return; + if (noCull) { + LogManager.getLogger().info("noCulling!"); + } + ResourceLocation faceTexture = params.faceTexture.get() .getLocation(); float alphaBefore = params.alpha; @@ -85,19 +94,26 @@ protected void renderFace(MatrixStack ms, IRenderTypeBuffer buffer, Direction di (direction == params.getHighlightedFace() && params.hightlightedFaceTexture.isPresent()) ? 1 : alphaBefore; RenderType translucentType = RenderTypes.getOutlineTranslucent(faceTexture, !noCull); - IVertexBuilder builder = buffer.getBuffer(translucentType); + VertexConsumer builder = buffer.getBuffer(translucentType); Axis axis = direction.getAxis(); - Vector3d uDiff = p2.subtract(p1); - Vector3d vDiff = p4.subtract(p1); + Vec3 uDiff = p2.subtract(p1); + Vec3 vDiff = p4.subtract(p1); float maxU = (float) Math.abs(axis == Axis.X ? uDiff.z : uDiff.x); float maxV = (float) Math.abs(axis == Axis.Y ? vDiff.z : vDiff.y); - putQuadUVColor(ms, builder, p1, p2, p3, p4, params.faceRgb == null ? params.rgb : params.faceRgb, 0, 0, maxU, - maxV, Direction.UP); + + Vec3 tmp = params.rgb; + if (params.faceRgb != null) { + params.rgb = params.faceRgb; + putQuadUV(ms, builder, p1, p2, p3, p4, 0, 0, maxU, maxV, Direction.UP); + params.rgb = tmp; + } else { + putQuadUV(ms, builder, p1, p2, p3, p4, 0, 0, maxU, maxV, Direction.UP); + } params.alpha = alphaBefore; } - public void setBounds(AxisAlignedBB bb) { + public void setBounds(AABB bb) { this.bb = bb; } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/BlockClusterOutline.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/BlockClusterOutline.java index b81b191..c622c00 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/BlockClusterOutline.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/BlockClusterOutline.java @@ -6,19 +6,19 @@ import java.util.Optional; import java.util.Set; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.mightyarchitect.AllSpecialTextures; import com.simibubi.mightyarchitect.foundation.RenderTypes; import com.simibubi.mightyarchitect.foundation.utility.VecHelper; -import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.Direction.AxisDirection; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.Vec3; public class BlockClusterOutline extends Outline { @@ -30,11 +30,11 @@ public BlockClusterOutline(Iterable selection) { } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) { + public void render(PoseStack ms, MultiBufferSource buffer) { for (MergeEntry edge : cluster.visibleEdges) { - Vector3d start = Vector3d.atLowerCornerOf(edge.pos); + Vec3 start = Vec3.atLowerCornerOf(edge.pos); Direction direction = Direction.get(AxisDirection.POSITIVE, edge.axis); - renderAACuboidLine(ms, buffer, start, Vector3d.atLowerCornerOf(edge.pos.relative(direction))); + renderAACuboidLine(ms, buffer, start, Vec3.atLowerCornerOf(edge.pos.relative(direction))); } for (MergeEntry face : cluster.visibleFaces.keySet()) { @@ -47,18 +47,18 @@ public void render(MatrixStack ms, IRenderTypeBuffer buffer) { } } - protected void renderBlockFace(MatrixStack ms, IRenderTypeBuffer buffer, BlockPos pos, Direction face) { + protected void renderBlockFace(PoseStack ms, MultiBufferSource buffer, BlockPos pos, Direction face) { Optional faceTexture = params.faceTexture; if (!faceTexture.isPresent()) return; RenderType translucentType = RenderTypes.getOutlineTranslucent(faceTexture.get() .getLocation(), true); - IVertexBuilder builder = buffer.getBuffer(translucentType); + VertexConsumer builder = buffer.getBuffer(translucentType); - Vector3d center = VecHelper.getCenterOf(pos); - Vector3d offset = Vector3d.atLowerCornerOf(face.getNormal()); - Vector3d plane = VecHelper.axisAlingedPlaneOf(offset); + Vec3 center = VecHelper.getCenterOf(pos); + Vec3 offset = Vec3.atLowerCornerOf(face.getNormal()); + Vec3 plane = VecHelper.axisAlingedPlaneOf(offset); Axis axis = face.getAxis(); offset = offset.scale(1 / 2f + 1 / 64d); @@ -67,13 +67,13 @@ protected void renderBlockFace(MatrixStack ms, IRenderTypeBuffer buffer, BlockPo int deg = face.getAxisDirection() .getStep() * 90; - Vector3d a1 = plane.add(center); + Vec3 a1 = plane.add(center); plane = VecHelper.rotate(plane, deg, axis); - Vector3d a2 = plane.add(center); + Vec3 a2 = plane.add(center); plane = VecHelper.rotate(plane, deg, axis); - Vector3d a3 = plane.add(center); + Vec3 a3 = plane.add(center); plane = VecHelper.rotate(plane, deg, axis); - Vector3d a4 = plane.add(center); + Vec3 a4 = plane.add(center); putQuad(ms, builder, a1, a2, a3, a4, face); } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/ChasingAABBOutline.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/ChasingAABBOutline.java index 0c57f21..c06528b 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/ChasingAABBOutline.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/ChasingAABBOutline.java @@ -1,24 +1,24 @@ package com.simibubi.mightyarchitect.foundation.utility.outliner; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.world.phys.AABB; +import net.minecraft.util.Mth; public class ChasingAABBOutline extends AABBOutline { - AxisAlignedBB targetBB; - AxisAlignedBB prevBB; + AABB targetBB; + AABB prevBB; - public ChasingAABBOutline(AxisAlignedBB bb) { + public ChasingAABBOutline(AABB bb) { super(bb); prevBB = bb.inflate(0); targetBB = bb.inflate(0); } - public void target(AxisAlignedBB target) { + public void target(AABB target) { targetBB = target; } @@ -29,16 +29,16 @@ public void tick() { } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) { + public void render(PoseStack ms, MultiBufferSource buffer) { renderBB(ms, buffer, interpolateBBs(prevBB, bb, Minecraft.getInstance() .getFrameTime())); } - private static AxisAlignedBB interpolateBBs(AxisAlignedBB current, AxisAlignedBB target, float pt) { - return new AxisAlignedBB(MathHelper.lerp(pt, current.minX, target.minX), - MathHelper.lerp(pt, current.minY, target.minY), MathHelper.lerp(pt, current.minZ, target.minZ), - MathHelper.lerp(pt, current.maxX, target.maxX), MathHelper.lerp(pt, current.maxY, target.maxY), - MathHelper.lerp(pt, current.maxZ, target.maxZ)); + private static AABB interpolateBBs(AABB current, AABB target, float pt) { + return new AABB(Mth.lerp(pt, current.minX, target.minX), + Mth.lerp(pt, current.minY, target.minY), Mth.lerp(pt, current.minZ, target.minZ), + Mth.lerp(pt, current.maxX, target.maxX), Mth.lerp(pt, current.maxY, target.maxY), + Mth.lerp(pt, current.maxZ, target.maxZ)); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/LineOutline.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/LineOutline.java index 9ec5398..b4e3a8c 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/LineOutline.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/LineOutline.java @@ -1,37 +1,37 @@ package com.simibubi.mightyarchitect.foundation.utility.outliner; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.foundation.utility.VecHelper; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; public class LineOutline extends Outline { - protected Vector3d start = Vector3d.ZERO; - protected Vector3d end = Vector3d.ZERO; + protected Vec3 start = Vec3.ZERO; + protected Vec3 end = Vec3.ZERO; - public LineOutline set(Vector3d start, Vector3d end) { + public LineOutline set(Vec3 start, Vec3 end) { this.start = start; this.end = end; return this; } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) { + public void render(PoseStack ms, MultiBufferSource buffer) { renderCuboidLine(ms, buffer, start, end); } public static class ChasingLineOutline extends LineOutline { - protected Vector3d prevStart = Vector3d.ZERO; - protected Vector3d prevEnd = Vector3d.ZERO; - protected Vector3d targetStart = Vector3d.ZERO; - protected Vector3d targetEnd = Vector3d.ZERO; + protected Vec3 prevStart = Vec3.ZERO; + protected Vec3 prevEnd = Vec3.ZERO; + protected Vec3 targetStart = Vec3.ZERO; + protected Vec3 targetEnd = Vec3.ZERO; - public ChasingLineOutline target(Vector3d start, Vector3d end) { + public ChasingLineOutline target(Vec3 start, Vec3 end) { if (end.distanceTo(targetStart) + start.distanceTo(targetEnd) < end.distanceTo(targetEnd) + start.distanceTo(targetStart)) { this.targetEnd = start; @@ -44,7 +44,7 @@ public ChasingLineOutline target(Vector3d start, Vector3d end) { } @Override - public LineOutline set(Vector3d start, Vector3d end) { + public LineOutline set(Vec3 start, Vec3 end) { prevEnd = end; prevStart = start; return super.set(start, end); @@ -59,7 +59,7 @@ public void tick() { } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) { + public void render(PoseStack ms, MultiBufferSource buffer) { float pt = Minecraft.getInstance() .getFrameTime(); renderCuboidLine(ms, buffer, VecHelper.lerp(prevStart, start, pt), VecHelper.lerp(prevEnd, end, pt)); @@ -82,18 +82,18 @@ public EndChasingLineOutline setProgress(float progress) { } @Override - public LineOutline set(Vector3d start, Vector3d end) { + public LineOutline set(Vec3 start, Vec3 end) { if (!end.equals(this.end)) super.set(start, end); return this; } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) { + public void render(PoseStack ms, MultiBufferSource buffer) { float pt = Minecraft.getInstance() .getFrameTime(); - float distanceToTarget = 1 - MathHelper.lerp(pt, prevProgress, progress); - Vector3d start = end.add(this.start.subtract(end) + float distanceToTarget = 1 - Mth.lerp(pt, prevProgress, progress); + Vec3 start = end.add(this.start.subtract(end) .scale(distanceToTarget)); renderCuboidLine(ms, buffer, start, end); } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outline.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outline.java index 7ea7311..e8aca88 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outline.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outline.java @@ -4,9 +4,10 @@ import javax.annotation.Nullable; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.matrix.MatrixStack.Entry; -import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.PoseStack.Pose; +import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.mightyarchitect.AllSpecialTextures; import com.simibubi.mightyarchitect.foundation.MatrixStacker; import com.simibubi.mightyarchitect.foundation.RenderTypes; @@ -14,13 +15,14 @@ import com.simibubi.mightyarchitect.foundation.utility.ColorHelper; import com.simibubi.mightyarchitect.foundation.utility.VecHelper; -import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.vector.Matrix3f; -import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.util.Mth; +import com.mojang.math.Matrix3f; +import net.minecraft.world.phys.Vec3; public abstract class Outline { @@ -31,38 +33,38 @@ public Outline() { params = new OutlineParams(); } - public abstract void render(MatrixStack ms, IRenderTypeBuffer buffer); + public abstract void render(PoseStack ms, MultiBufferSource buffer); - public void renderCuboidLine(MatrixStack ms, IRenderTypeBuffer buffer, Vector3d start, Vector3d end) { - Vector3d diff = end.subtract(start); - float hAngle = AngleHelper.deg(MathHelper.atan2(diff.x, diff.z)); + public void renderCuboidLine(PoseStack ms, MultiBufferSource buffer, Vec3 start, Vec3 end) { + Vec3 diff = end.subtract(start); + float hAngle = AngleHelper.deg(Mth.atan2(diff.x, diff.z)); float hDistance = (float) diff.multiply(1, 0, 1) .length(); - float vAngle = AngleHelper.deg(MathHelper.atan2(hDistance, diff.y)) - 90; + float vAngle = AngleHelper.deg(Mth.atan2(hDistance, diff.y)) - 90; ms.pushPose(); MatrixStacker.of(ms) .translate(start) .rotateY(hAngle) .rotateX(vAngle); - renderAACuboidLine(ms, buffer, Vector3d.ZERO, new Vector3d(0, 0, diff.length())); + renderAACuboidLine(ms, buffer, Vec3.ZERO, new Vec3(0, 0, diff.length())); ms.popPose(); } - public void renderAACuboidLine(MatrixStack ms, IRenderTypeBuffer buffer, Vector3d start, Vector3d end) { - IVertexBuilder builder = buffer.getBuffer(RenderTypes.getOutlineSolid()); + public void renderAACuboidLine(PoseStack ms, MultiBufferSource buffer, Vec3 start, Vec3 end) { + VertexConsumer builder = buffer.getBuffer(RenderTypes.getOutlineSolid()); - Vector3d diff = end.subtract(start); + Vec3 diff = end.subtract(start); if (diff.x + diff.y + diff.z < 0) { - Vector3d temp = start; + Vec3 temp = start; start = end; end = temp; diff = diff.scale(-1); } float lineWidth = params.getLineWidth(); - Vector3d extension = diff.normalize() + Vec3 extension = diff.normalize() .scale(lineWidth / 2); - Vector3d plane = VecHelper.axisAlingedPlaneOf(diff); + Vec3 plane = VecHelper.axisAlingedPlaneOf(diff); Direction face = Direction.getNearest(diff.x, diff.y, diff.z); Axis axis = face.getAxis(); @@ -70,17 +72,17 @@ public void renderAACuboidLine(MatrixStack ms, IRenderTypeBuffer buffer, Vector3 end = end.add(extension); plane = plane.scale(lineWidth / 2); - Vector3d a1 = plane.add(start); - Vector3d b1 = plane.add(end); + Vec3 a1 = plane.add(start); + Vec3 b1 = plane.add(end); plane = VecHelper.rotate(plane, -90, axis); - Vector3d a2 = plane.add(start); - Vector3d b2 = plane.add(end); + Vec3 a2 = plane.add(start); + Vec3 b2 = plane.add(end); plane = VecHelper.rotate(plane, -90, axis); - Vector3d a3 = plane.add(start); - Vector3d b3 = plane.add(end); + Vec3 a3 = plane.add(start); + Vec3 b3 = plane.add(end); plane = VecHelper.rotate(plane, -90, axis); - Vector3d a4 = plane.add(start); - Vector3d b4 = plane.add(end); + Vec3 a4 = plane.add(start); + Vec3 b4 = plane.add(end); if (params.disableNormals) { face = Direction.UP; @@ -95,7 +97,7 @@ public void renderAACuboidLine(MatrixStack ms, IRenderTypeBuffer buffer, Vector3 putQuad(ms, builder, b4, b3, b2, b1, face); putQuad(ms, builder, a1, a2, a3, a4, face.getOpposite()); - Vector3d vec = a1.subtract(a4); + Vec3 vec = a1.subtract(a4); face = Direction.getNearest(vec.x, vec.y, vec.z); putQuad(ms, builder, a1, b1, b2, a2, face); vec = VecHelper.rotate(vec, -90, axis); @@ -109,24 +111,21 @@ public void renderAACuboidLine(MatrixStack ms, IRenderTypeBuffer buffer, Vector3 putQuad(ms, builder, a4, b4, b1, a1, face); } - public void putQuad(MatrixStack ms, IVertexBuilder builder, Vector3d v1, Vector3d v2, Vector3d v3, Vector3d v4, + public void putQuad(PoseStack ms, VertexConsumer builder, Vec3 v1, Vec3 v2, Vec3 v3, Vec3 v4, Direction normal) { - putQuadUVColor(ms, builder, v1, v2, v3, v4, params.rgb, 0, 0, 1, 1, normal); + putQuadUV(ms, builder, v1, v2, v3, v4,0, 0, 1, 1, normal); } - public void putQuadUVColor(MatrixStack ms, IVertexBuilder builder, Vector3d v1, Vector3d v2, Vector3d v3, Vector3d v4, Vector3d rgb, float minU, + public void putQuadUV(PoseStack ms, VertexConsumer builder, Vec3 v1, Vec3 v2, Vec3 v3, Vec3 v4, float minU, float minV, float maxU, float maxV, Direction normal) { - putVertex(ms, builder, v1, rgb, minU, minV, normal); - putVertex(ms, builder, v2, rgb, maxU, minV, normal); - putVertex(ms, builder, v3, rgb, maxU, maxV, normal); - putVertex(ms, builder, v4, rgb, minU, maxV, normal); + putVertex(ms, builder, v1, minU, minV, normal); + putVertex(ms, builder, v2, maxU, minV, normal); + putVertex(ms, builder, v3, maxU, maxV, normal); + putVertex(ms, builder, v4, minU, maxV, normal); } - protected void putVertex(MatrixStack ms, IVertexBuilder builder, Vector3d pos, Vector3d rgb, float u, float v, Direction normal) { - int i = 15 << 20 | 15 << 4; - int j = i >> 16 & '\uffff'; - int k = i & '\uffff'; - Entry peek = ms.last(); + protected void putVertex(PoseStack ms, VertexConsumer builder, Vec3 pos, float u, float v, Direction normal) { + Pose peek = ms.last(); if (transformNormals == null) transformNormals = peek.normal(); @@ -141,10 +140,10 @@ protected void putVertex(MatrixStack ms, IVertexBuilder builder, Vector3d pos, V } builder.vertex(peek.pose(), (float) pos.x, (float) pos.y, (float) pos.z) - .color((float) rgb.x, (float) rgb.y, (float) rgb.z, params.alpha) + .color((float) params.rgb.x, (float) params.rgb.y, (float) params.rgb.z, params.alpha) .uv(u, v) .overlayCoords(OverlayTexture.NO_OVERLAY) - .uv2(j, k) + .uv2(params.lightMap) .normal(peek.normal(), xOffset, yOffset, zOffset) .endVertex(); @@ -167,9 +166,9 @@ public static class OutlineParams { protected boolean disableCull; protected boolean disableNormals; protected float alpha; - protected int lightMapU, lightMapV; - protected Vector3d rgb; - protected Vector3d faceRgb; + protected int lightMap; + protected Vec3 rgb; + protected Vec3 faceRgb; protected int color; protected int fadeTicks; private float lineWidth; @@ -185,9 +184,7 @@ public OutlineParams() { faceRgb = null; fadeTicks = 8; - int i = 15 << 20 | 15 << 4; - lightMapU = i >> 16 & '\uffff'; - lightMapV = i & '\uffff'; + lightMap = LightTexture.FULL_BRIGHT; } // builder diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/OutlinedText.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/OutlinedText.java index 99da42e..bf7231a 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/OutlinedText.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/OutlinedText.java @@ -1,35 +1,35 @@ package com.simibubi.mightyarchitect.foundation.utility.outliner; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.foundation.RenderTypes; import com.simibubi.mightyarchitect.foundation.utility.VecHelper; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.util.math.vector.Matrix4f; -import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import com.mojang.math.Matrix4f; +import net.minecraft.world.phys.Vec3; public class OutlinedText extends Outline { private String text; - Vector3d targetLocation; - Vector3d location; - Vector3d prevLocation; + Vec3 targetLocation; + Vec3 location; + Vec3 prevLocation; public OutlinedText() { setText(""); - targetLocation = Vector3d.ZERO; - location = Vector3d.ZERO; - prevLocation = Vector3d.ZERO; + targetLocation = Vec3.ZERO; + location = Vec3.ZERO; + prevLocation = Vec3.ZERO; } - public void set(Vector3d location) { + public void set(Vec3 location) { prevLocation = this.location = location; } - public void target(Vector3d location) { + public void target(Vec3 location) { targetLocation = location; } @@ -41,16 +41,15 @@ public void tick() { } @Override - public void render(MatrixStack ms, IRenderTypeBuffer buffer) { + public void render(PoseStack ms, MultiBufferSource buffer) { if (text == null) return; Minecraft mc = Minecraft.getInstance(); float pt = mc.getFrameTime(); - Vector3d vec = VecHelper.lerp(prevLocation, location, pt); - EntityRendererManager renderManager = mc.getEntityRenderDispatcher(); - FontRenderer fontrenderer = renderManager.getFont(); - float stringLength = fontrenderer.width(text); + Vec3 vec = VecHelper.lerp(prevLocation, location, pt); + EntityRenderDispatcher renderManager = mc.getEntityRenderDispatcher(); + float stringLength = mc.font.width(text); ms.pushPose(); ms.translate(vec.x, vec.y, vec.z); @@ -65,20 +64,23 @@ public void render(MatrixStack ms, IRenderTypeBuffer buffer) { float scaleMod = 0.025F; float f = -stringLength / 2; - float h = fontrenderer.lineHeight; + float h = mc.font.lineHeight; ms.pushPose(); - Vector3d v1 = new Vector3d(-f + 2, -scaleMod * (h - 1), 0); - Vector3d v2 = new Vector3d(-f + 2, scaleMod, 0); - Vector3d v3 = new Vector3d(f - 2, scaleMod, 0); - Vector3d v4 = new Vector3d(f - 2, -scaleMod * (h - 1), 0); + Vec3 v1 = new Vec3(-f + 2, -scaleMod * (h - 1), 0); + Vec3 v2 = new Vec3(-f + 2, scaleMod, 0); + Vec3 v3 = new Vec3(f - 2, scaleMod, 0); + Vec3 v4 = new Vec3(f - 2, -scaleMod * (h - 1), 0); ms.pushPose(); ms.scale(-scaleMod, 1, scaleMod); ms.translate(0, 0, .5f); - if (params.faceRgb != null) - putQuadUVColor(ms, buffer.getBuffer(RenderTypes.getOutlineSolid()), v1, v2, v3, v4, params.faceRgb, 0, 0, 1, - 1, null); + if (params.faceRgb != null) { + Vec3 tmp = params.rgb; + params.rgb = params.faceRgb; + putQuadUV(ms, buffer.getBuffer(RenderTypes.getOutlineSolid()), v1, v2, v3, v4,0, 0, 1, 1, null); + params.rgb = tmp; + } ms.popPose(); ms.scale(scaleMod, 1, 1); @@ -88,9 +90,8 @@ public void render(MatrixStack ms, IRenderTypeBuffer buffer) { ms.pushPose(); ms.scale(-scaleMod, -scaleMod, scaleMod); - Matrix4f matrix4f = ms.last() - .pose(); - fontrenderer.drawInBatch(text, f, 0, params.color, false, matrix4f, buffer, true, 0, 0xF000F0); + //mc.font.drawInBatch(text, f, 0, params.color, false, matrix4f, buffer, true, 0, 0xF000F0); + mc.font.draw(ms, text, f, 0, params.color); ms.popPose(); ms.popPose(); diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outliner.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outliner.java index c2904aa..236bf9f 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outliner.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outliner.java @@ -6,17 +6,17 @@ import java.util.Optional; import java.util.Set; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.foundation.utility.outliner.LineOutline.ChasingLineOutline; import com.simibubi.mightyarchitect.foundation.utility.outliner.LineOutline.EndChasingLineOutline; import com.simibubi.mightyarchitect.foundation.utility.outliner.Outline.OutlineParams; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.world.phys.AABB; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; public class Outliner { @@ -24,7 +24,7 @@ public class Outliner { // Facade - public OutlineParams showLine(Object slot, Vector3d start, Vector3d end) { + public OutlineParams showLine(Object slot, Vec3 start, Vec3 end) { if (!outlines.containsKey(slot)) { LineOutline outline = new LineOutline(); outlines.put(slot, new OutlineEntry(outline)); @@ -35,7 +35,7 @@ public OutlineParams showLine(Object slot, Vector3d start, Vector3d end) { return entry.outline.getParams(); } - public OutlineParams chaseLine(Object slot, Vector3d start, Vector3d end) { + public OutlineParams chaseLine(Object slot, Vec3 start, Vec3 end) { if (!outlines.containsKey(slot)) { ChasingLineOutline outline = new ChasingLineOutline(); outline.set(start, end); @@ -47,7 +47,7 @@ public OutlineParams chaseLine(Object slot, Vector3d start, Vector3d end) { return entry.outline.getParams(); } - public OutlineParams chaseText(Object slot, Vector3d location, String text) { + public OutlineParams chaseText(Object slot, Vec3 location, String text) { if (!outlines.containsKey(slot)) { OutlinedText outline = new OutlinedText(); outline.set(location); @@ -61,7 +61,7 @@ public OutlineParams chaseText(Object slot, Vector3d location, String text) { return entry.outline.getParams(); } - public OutlineParams endChasingLine(Object slot, Vector3d start, Vector3d end, float chasingProgress) { + public OutlineParams endChasingLine(Object slot, Vec3 start, Vec3 end, float chasingProgress) { if (!outlines.containsKey(slot)) { EndChasingLineOutline outline = new EndChasingLineOutline(); outlines.put(slot, new OutlineEntry(outline)); @@ -73,14 +73,14 @@ public OutlineParams endChasingLine(Object slot, Vector3d start, Vector3d end, f return entry.outline.getParams(); } - public OutlineParams showAABB(Object slot, AxisAlignedBB bb) { + public OutlineParams showAABB(Object slot, AABB bb) { createAABBOutlineIfMissing(slot, bb); ChasingAABBOutline outline = getAndRefreshAABB(slot); outline.prevBB = outline.targetBB = bb; return outline.getParams(); } - public OutlineParams chaseAABB(Object slot, AxisAlignedBB bb) { + public OutlineParams chaseAABB(Object slot, AABB bb) { createAABBOutlineIfMissing(slot, bb); ChasingAABBOutline outline = getAndRefreshAABB(slot); outline.targetBB = bb; @@ -123,7 +123,7 @@ public Optional edit(Object slot) { // Utility - private void createAABBOutlineIfMissing(Object slot, AxisAlignedBB bb) { + private void createAABBOutlineIfMissing(Object slot, AABB bb) { if (!outlines.containsKey(slot)) { ChasingAABBOutline outline = new ChasingAABBOutline(bb); outlines.put(slot, new OutlineEntry(outline)); @@ -157,7 +157,7 @@ public void tickOutlines() { toClear.forEach(outlines::remove); } - public void renderOutlines(MatrixStack ms, IRenderTypeBuffer buffer) { + public void renderOutlines(PoseStack ms, MultiBufferSource buffer) { outlines.forEach((key, entry) -> { Outline outline = entry.getOutline(); outline.params.alpha = 1; @@ -167,7 +167,7 @@ public void renderOutlines(MatrixStack ms, IRenderTypeBuffer buffer) { float fadeticks = (float) entry.outline.params.getFadeTicks(); float lastAlpha = prevTicks >= 0 ? 1 : 1 + (prevTicks / fadeticks); float currentAlpha = 1 + (entry.ticksTillRemoval / fadeticks); - float alpha = MathHelper.lerp(Minecraft.getInstance() + float alpha = Mth.lerp(Minecraft.getInstance() .getFrameTime(), lastAlpha, currentAlpha); outline.params.alpha = alpha * alpha * alpha; diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/AbstractSimiScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/AbstractSimiScreen.java index 1fc94a1..4cd2ad6 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/AbstractSimiScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/AbstractSimiScreen.java @@ -3,21 +3,21 @@ import java.util.ArrayList; import java.util.List; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.gui.widgets.AbstractSimiWidget; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.Widget; -import net.minecraft.util.text.StringTextComponent; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.network.chat.TextComponent; public abstract class AbstractSimiScreen extends Screen { protected int sWidth, sHeight; protected int topLeftX, topLeftY; - protected List widgets; + protected List widgets; protected AbstractSimiScreen() { - super(new StringTextComponent("")); + super(new TextComponent("")); widgets = new ArrayList<>(); } @@ -29,20 +29,20 @@ protected void setWindowSize(int width, int height) { } @Override - public void render(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { + public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { renderBackground(ms); renderWindow(ms, mouseX, mouseY, partialTicks); - for (Widget widget : widgets) + for (AbstractWidget widget : widgets) widget.render(ms, mouseX, mouseY, partialTicks); renderWindowForeground(ms, mouseX, mouseY, partialTicks); - for (Widget widget : widgets) + for (AbstractWidget widget : widgets) widget.renderToolTip(ms, mouseX, mouseY); } @Override public boolean mouseClicked(double x, double y, int button) { boolean result = false; - for (Widget widget : widgets) { + for (AbstractWidget widget : widgets) { if (widget.mouseClicked(x, y, button)) result = true; } @@ -51,7 +51,7 @@ public boolean mouseClicked(double x, double y, int button) { @Override public boolean keyPressed(int code, int p_keyPressed_2_, int p_keyPressed_3_) { - for (Widget widget : widgets) { + for (AbstractWidget widget : widgets) { if (widget.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_)) return true; } @@ -60,7 +60,7 @@ public boolean keyPressed(int code, int p_keyPressed_2_, int p_keyPressed_3_) { @Override public boolean charTyped(char character, int code) { - for (Widget widget : widgets) { + for (AbstractWidget widget : widgets) { if (widget.charTyped(character, code)) return true; } @@ -71,7 +71,7 @@ public boolean charTyped(char character, int code) { @Override public boolean mouseScrolled(double mouseX, double mouseY, double delta) { - for (Widget widget : widgets) { + for (AbstractWidget widget : widgets) { if (widget.mouseScrolled(mouseX, mouseY, delta)) return true; } @@ -88,10 +88,10 @@ public boolean isPauseScreen() { return false; } - protected abstract void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks); + protected abstract void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks); - protected void renderWindowForeground(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { - for (Widget widget : widgets) { + protected void renderWindowForeground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + for (AbstractWidget widget : widgets) { if (!widget.isHovered()) continue; if (widget instanceof AbstractSimiWidget && !((AbstractSimiWidget) widget).getToolTip() diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/ArchitectMenuScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/ArchitectMenuScreen.java index 96877da..26cea32 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/ArchitectMenuScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/ArchitectMenuScreen.java @@ -5,7 +5,7 @@ import org.lwjgl.glfw.GLFW; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.mightyarchitect.MightyClient; import com.simibubi.mightyarchitect.control.ArchitectManager; @@ -13,12 +13,12 @@ import com.simibubi.mightyarchitect.control.ArchitectMenu.KeyBindList; import com.simibubi.mightyarchitect.control.phase.ArchitectPhases; -import net.minecraft.client.MainWindow; +import com.mojang.blaze3d.platform.Window; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.util.IReorderingProcessor; -import net.minecraft.util.text.StringTextComponent; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.util.FormattedCharSequence; +import net.minecraft.network.chat.TextComponent; public class ArchitectMenuScreen extends Screen { @@ -35,7 +35,7 @@ public class ArchitectMenuScreen extends Screen { private float movingY; public ArchitectMenuScreen() { - super(new StringTextComponent("Architect Menu")); + super(new TextComponent("Architect Menu")); keybinds = new KeyBindList(); tooltip = new ArrayList<>(); title = ""; @@ -71,7 +71,7 @@ public void updateContents() { } @Override - public void render(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { + public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { // FOCUSED super.render(ms, mouseX, mouseY, partialTicks); draw(ms, partialTicks); @@ -82,7 +82,7 @@ public void drawPassive() { return; // NOT FOCUSED - draw(new MatrixStack(), Minecraft.getInstance() + draw(new PoseStack(), Minecraft.getInstance() .getFrameTime()); } @@ -129,8 +129,8 @@ public boolean charTyped(char p_charTyped_1_, int p_charTyped_2_) { return super.charTyped(p_charTyped_1_, p_charTyped_2_); } - private void draw(MatrixStack ms, float partialTicks) { - MainWindow mainWindow = Minecraft.getInstance() + private void draw(PoseStack ms, float partialTicks) { + Window mainWindow = Minecraft.getInstance() .getWindow(); int x = mainWindow.getGuiScaledWidth() - menuWidth - 10; int y = mainWindow.getGuiScaledHeight() - menuHeight; @@ -144,29 +144,27 @@ private void draw(MatrixStack ms, float partialTicks) { y -= 24; } - RenderSystem.pushMatrix(); + ms.pushPose(); float shift = yShift(partialTicks); float sidewaysShift = shift * ((float) menuWidth / (float) menuHeight) + (!focused ? 40 + menuHeight / 4f : 0) + 8; - RenderSystem.translatef(sideways ? sidewaysShift : 0, sideways ? 0 : shift, 0); + ms.translate(sideways ? sidewaysShift : 0, sideways ? 0 : shift, 0); mouseX -= sideways ? sidewaysShift : 0; mouseY -= sideways ? 0 : shift; ScreenResources gray = ScreenResources.GRAY; RenderSystem.enableBlend(); - RenderSystem.color4f(1, 1, 1, 3 / 4f); + RenderSystem.setShaderColor(1, 1, 1, 3 / 4f); - Minecraft.getInstance() - .getTextureManager() - .bind(gray.location); + RenderSystem.setShaderTexture(0, gray.location); RenderSystem.enableTexture(); blit(ms, x, y, gray.startX, gray.startY, menuWidth, menuHeight, gray.width, gray.height); - RenderSystem.color4f(1, 1, 1, 1); + RenderSystem.setShaderColor(1, 1, 1, 1); int yPos = y + 4; int xPos = x + 4; - FontRenderer textRenderer = Minecraft.getInstance().font; + Font textRenderer = Minecraft.getInstance().font; String compose = MightyClient.COMPOSE.getTranslatedKeyMessage() .getString() .toUpperCase(); @@ -214,14 +212,14 @@ private void draw(MatrixStack ms, float partialTicks) { for (String text : tooltip) { int height = Minecraft.getInstance().font.wordWrapHeight(text, menuWidth - 8); int lineY = yPos; - for (IReorderingProcessor iro : textRenderer.split(new StringTextComponent(text), menuWidth - 8)) { + for (FormattedCharSequence iro : textRenderer.split(new TextComponent(text), menuWidth - 8)) { textRenderer.draw(ms, iro, xPos, lineY, 0xEEEEEE); lineY += textRenderer.lineHeight; } yPos += height + 2; } - RenderSystem.popMatrix(); + ms.popPose(); } @Override @@ -229,7 +227,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { if (button != 0 || !visible || !focused) return super.mouseClicked(mouseX, mouseY, button); - MainWindow mainWindow = Minecraft.getInstance() + Window mainWindow = Minecraft.getInstance() .getWindow(); int x = mainWindow.getGuiScaledWidth() - menuWidth - 10; int y = mainWindow.getGuiScaledHeight() - menuHeight; diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/DesignExporterScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/DesignExporterScreen.java index 2b4b1e8..e8b3849 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/DesignExporterScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/DesignExporterScreen.java @@ -3,8 +3,9 @@ import java.util.ArrayList; import java.util.List; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.math.Vector3f; import com.simibubi.mightyarchitect.control.design.DesignExporter; import com.simibubi.mightyarchitect.control.design.DesignLayer; import com.simibubi.mightyarchitect.control.design.DesignTheme; @@ -232,17 +233,20 @@ public void tick() { } @Override - protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { + protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { ScreenResources.EXPORTER.draw(ms, this, topLeftX, topLeftY); - RenderSystem.pushMatrix(); - RenderSystem.translatef((this.width - this.sWidth) / 2 + 250, 220, 100); - RenderSystem.rotatef(-30, .4f, 0, -.2f); - RenderSystem.rotatef(90 + 0.2f * animationProgress, 0, 1, 0); - RenderSystem.scalef(100, -100, 100); + ms.pushPose(); + ms.translate((this.width - this.sWidth) / 2 + 250, 220, 100); + //RenderSystem.rotatef(-30, .4f, 0, -.2f); + ms.mulPose(Vector3f.XP.rotationDegrees(-30 * 0.4f)); + ms.mulPose(Vector3f.ZN.rotationDegrees(-30 * 0.2f)); + //RenderSystem.rotatef(90 + 0.2f * animationProgress, 0, 1, 0); + ms.mulPose(Vector3f.YP.rotationDegrees(90 + 0.2f * animationProgress)); + ms.scale(100, -100, 100); GuiGameElement.of(minecraft.player.getMainHandItem()) .render(ms); - RenderSystem.popMatrix(); + ms.popPose(); int color = ScreenResources.FONT_COLOR; font.draw(ms, "Export custom Designs", topLeftX + 10, topLeftY + 10, color); diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/GuiGameElement.java b/src/main/java/com/simibubi/mightyarchitect/gui/GuiGameElement.java index 7f5c5e3..d3dd1fc 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/GuiGameElement.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/GuiGameElement.java @@ -3,46 +3,50 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager.DestFactor; import com.mojang.blaze3d.platform.GlStateManager.SourceFactor; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.mightyarchitect.foundation.WrappedWorld; import com.simibubi.mightyarchitect.foundation.utility.AngleHelper; import com.simibubi.mightyarchitect.foundation.utility.ColorHelper; import com.simibubi.mightyarchitect.foundation.utility.Iterate; import com.simibubi.mightyarchitect.foundation.utility.VecHelper; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FireBlock; -import net.minecraft.block.FlowingFluidBlock; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FireBlock; +import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.Atlases; -import net.minecraft.client.renderer.BlockRendererDispatcher; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.ItemRenderer; -import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.ItemRenderer; +import com.mojang.blaze3d.platform.Lighting; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.RenderTypeLookup; -import net.minecraft.client.renderer.model.IBakedModel; -import net.minecraft.client.renderer.model.ItemCameraTransforms; +import net.minecraft.client.renderer.ItemBlockRenderTypes; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.fluid.Fluid; -import net.minecraft.inventory.container.PlayerContainer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.AxisDirection; -import net.minecraft.util.IItemProvider; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Vector3d; -import net.minecraft.util.math.vector.Vector3f; -import net.minecraft.world.LightType; -import net.minecraft.world.World; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.world.level.ItemLike; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.Vec3; +import com.mojang.math.Vector3f; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.Level; import net.minecraftforge.client.model.data.EmptyModelData; +import net.minecraftforge.client.model.data.IModelData; +import net.minecraftforge.client.model.data.ModelProperty; +import net.minecraftforge.fluids.FluidStack; public class GuiGameElement { @@ -50,7 +54,7 @@ public static GuiRenderBuilder of(ItemStack stack) { return new GuiItemRenderBuilder(stack); } - public static GuiRenderBuilder of(IItemProvider itemProvider) { + public static GuiRenderBuilder of(ItemLike itemProvider) { return new GuiItemRenderBuilder(itemProvider); } @@ -61,7 +65,7 @@ public static GuiRenderBuilder of(BlockState state) { public static GuiRenderBuilder of(Fluid fluid) { return new GuiBlockStateRenderBuilder(fluid.defaultFluidState() .createLegacyBlock() - .setValue(FlowingFluidBlock.LEVEL, 0)); + .setValue(LiquidBlock.LEVEL, 0)); } public static abstract class GuiRenderBuilder { @@ -70,7 +74,7 @@ public static abstract class GuiRenderBuilder { double xRot, yRot, zRot; double scale = 1; int color = 0xFFFFFF; - Vector3d rotationOffset = Vector3d.ZERO; + Vec3 rotationOffset = Vec3.ZERO; public GuiRenderBuilder atLocal(double x, double y, double z) { this.x = x; @@ -114,28 +118,27 @@ public GuiRenderBuilder color(int color) { return this; } - public GuiRenderBuilder withRotationOffset(Vector3d offset) { + public GuiRenderBuilder withRotationOffset(Vec3 offset) { this.rotationOffset = offset; return this; } - public abstract void render(MatrixStack matrixStack); + public abstract void render(PoseStack matrixStack); @Deprecated protected void prepare() {} - protected void prepareMatrix(MatrixStack matrixStack) { + protected void prepareMatrix(PoseStack matrixStack) { matrixStack.pushPose(); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.enableDepthTest(); RenderSystem.enableBlend(); - RenderSystem.enableRescaleNormal(); - RenderSystem.enableAlphaTest(); - RenderHelper.setupFor3DItems(); - RenderSystem.alphaFunc(516, 0.1F); RenderSystem.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA); - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + //prepareLighting(matrixStack); + Lighting.setupFor3DItems(); } - @Deprecated + /*@Deprecated protected void transform() { RenderSystem.translated(xBeforeScale, yBeforeScale, 0); RenderSystem.scaled(scale, scale, scale); @@ -146,9 +149,9 @@ protected void transform() { RenderSystem.rotatef((float) xRot, 1, 0, 0); RenderSystem.rotatef((float) yRot, 0, 1, 0); RenderSystem.translated(-rotationOffset.x, -rotationOffset.y, -rotationOffset.z); - } + }*/ - protected void transformMatrix(MatrixStack matrixStack) { + protected void transformMatrix(PoseStack matrixStack) { matrixStack.translate(xBeforeScale, yBeforeScale, zBeforeScale); matrixStack.scale((float) scale, (float) scale, (float) scale); matrixStack.translate(x, y, z); @@ -163,47 +166,44 @@ protected void transformMatrix(MatrixStack matrixStack) { @Deprecated protected void cleanUp() {} - protected void cleanUpMatrix(MatrixStack matrixStack) { + protected void cleanUpMatrix(PoseStack matrixStack) { matrixStack.popPose(); - RenderSystem.disableAlphaTest(); - RenderSystem.disableRescaleNormal(); } } private static class GuiBlockModelRenderBuilder extends GuiRenderBuilder { - protected IBakedModel blockmodel; + protected BakedModel blockmodel; protected BlockState blockState; - public GuiBlockModelRenderBuilder(IBakedModel blockmodel, @Nullable BlockState blockState) { + public GuiBlockModelRenderBuilder(BakedModel blockmodel, @Nullable BlockState blockState) { this.blockState = blockState == null ? Blocks.AIR.defaultBlockState() : blockState; this.blockmodel = blockmodel; } @Override - public void render(MatrixStack matrixStack) { + public void render(PoseStack matrixStack) { prepareMatrix(matrixStack); Minecraft mc = Minecraft.getInstance(); - BlockRendererDispatcher blockRenderer = mc.getBlockRenderer(); - IRenderTypeBuffer.Impl buffer = mc.renderBuffers() + BlockRenderDispatcher blockRenderer = mc.getBlockRenderer(); + MultiBufferSource.BufferSource buffer = mc.renderBuffers() .bufferSource(); - RenderType renderType = blockState.getBlock() == Blocks.AIR ? Atlases.translucentCullBlockSheet() - : RenderTypeLookup.getRenderType(blockState, true); - IVertexBuilder vb = buffer.getBuffer(renderType); + RenderType renderType = blockState.getBlock() == Blocks.AIR ? Sheets.translucentCullBlockSheet() + : ItemBlockRenderTypes.getRenderType(blockState, true); + VertexConsumer vb = buffer.getBuffer(renderType); transformMatrix(matrixStack); - mc.getTextureManager() - .bind(PlayerContainer.BLOCK_ATLAS); + RenderSystem.setShaderTexture(0, InventoryMenu.BLOCK_ATLAS); renderModel(blockRenderer, buffer, renderType, vb, matrixStack); cleanUpMatrix(matrixStack); } - protected void renderModel(BlockRendererDispatcher blockRenderer, IRenderTypeBuffer.Impl buffer, - RenderType renderType, IVertexBuilder vb, MatrixStack ms) { - Vector3d rgb = ColorHelper.getRGB(color); + protected void renderModel(BlockRenderDispatcher blockRenderer, MultiBufferSource.BufferSource buffer, + RenderType renderType, VertexConsumer vb, PoseStack ms) { + Vec3 rgb = ColorHelper.getRGB(color); blockRenderer.getModelRenderer() .renderModel(ms.last(), vb, blockState, blockmodel, (float) rgb.x, (float) rgb.y, (float) rgb.z, 0xF000F0, OverlayTexture.NO_OVERLAY, EmptyModelData.INSTANCE); @@ -220,53 +220,26 @@ public GuiBlockStateRenderBuilder(BlockState blockstate) { } @Override - protected void renderModel(BlockRendererDispatcher blockRenderer, IRenderTypeBuffer.Impl buffer, - RenderType renderType, IVertexBuilder vb, MatrixStack ms) { + protected void renderModel(BlockRenderDispatcher blockRenderer, MultiBufferSource.BufferSource buffer, + RenderType renderType, VertexConsumer vb, PoseStack ms) { if (blockState.getBlock() instanceof FireBlock) { - RenderHelper.setupForFlatItems(); - blockRenderer.renderBlock(blockState, ms, buffer, 0xF000F0, OverlayTexture.NO_OVERLAY, - EmptyModelData.INSTANCE); - RenderHelper.turnBackOn(); + Lighting.setupForFlatItems(); + blockRenderer.renderSingleBlock(blockState, ms, buffer, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, + VirtualEmptyModelData.INSTANCE); buffer.endBatch(); + Lighting.setupFor3DItems(); return; } super.renderModel(blockRenderer, buffer, renderType, vb, ms); if (blockState.getFluidState() - .isEmpty()) + .isEmpty()) return; - for (RenderType type : RenderType.chunkBufferLayers()) { - if (!RenderTypeLookup.canRenderInLayer(blockState.getFluidState(), type)) - continue; - - ms.pushPose(); - RenderHelper.turnOff(); - - ClientWorld world = Minecraft.getInstance().level; - if (renderWorld == null || renderWorld.getWorld() != world) - renderWorld = new FluidRenderWorld(world); - - for (Direction d : Iterate.directions) { - vb = buffer.getBuffer(type); - if (d.getAxisDirection() == AxisDirection.POSITIVE) - continue; - - ms.pushPose(); - ms.translate(.5, .5, .5); - ms.mulPose(Vector3f.YP.rotationDegrees(AngleHelper.horizontalAngle(d))); - ms.mulPose(Vector3f.ZP.rotationDegrees(AngleHelper.verticalAngle(d) - 90)); - ms.translate(-.5, -.5, -.5); - blockRenderer.renderLiquid(new BlockPos(0, 1, 0), renderWorld, vb, blockState.getFluidState()); - buffer.endBatch(type); - ms.popPose(); - } - - RenderHelper.turnBackOn(); - ms.popPose(); - break; - } + //todo fluids.. + //FluidRenderer.renderFluidBox(new FluidStack(blockState.getFluidState().getType(), 1000), 0, 0, 0, 1, 1, 1, buffer, ms, LightTexture.FULL_BRIGHT, false); + buffer.endBatch(); } } @@ -278,56 +251,46 @@ public GuiItemRenderBuilder(ItemStack stack) { this.stack = stack; } - public GuiItemRenderBuilder(IItemProvider provider) { + public GuiItemRenderBuilder(ItemLike provider) { this(new ItemStack(provider)); } @Override - public void render(MatrixStack matrixStack) { + public void render(PoseStack matrixStack) { prepareMatrix(matrixStack); // matrixStack.translate(0, 80, 0); transformMatrix(matrixStack); - renderItemIntoGUI(matrixStack, stack); + renderItemIntoGUI(matrixStack, stack, true); cleanUpMatrix(matrixStack); } - public static void renderItemIntoGUI(MatrixStack matrixStack, ItemStack stack) { - ItemRenderer renderer = Minecraft.getInstance() - .getItemRenderer(); - IBakedModel bakedModel = renderer.getModel(stack, null, null); - matrixStack.pushPose(); - Minecraft.getInstance().textureManager.bind(PlayerContainer.BLOCK_ATLAS); - Minecraft.getInstance().textureManager.getTexture(PlayerContainer.BLOCK_ATLAS) - .setFilter(false, false); - RenderSystem.enableRescaleNormal(); - RenderSystem.enableAlphaTest(); - RenderSystem.defaultAlphaFunc(); + public static void renderItemIntoGUI(PoseStack matrixStack, ItemStack stack, boolean useDefaultLighting) { + ItemRenderer renderer = Minecraft.getInstance().getItemRenderer(); + BakedModel bakedModel = renderer.getModel(stack, null, null, 0); + + + renderer.textureManager.getTexture(InventoryMenu.BLOCK_ATLAS).setFilter(false, false); + RenderSystem.setShaderTexture(0, InventoryMenu.BLOCK_ATLAS); RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, - GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); - matrixStack.translate((float) 0, (float) 0, 100.0F + renderer.blitOffset); - matrixStack.translate(8.0F, 8.0F, 0.0F); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + matrixStack.pushPose(); + matrixStack.translate(0, 0, 100.0F + renderer.blitOffset); + matrixStack.translate(8.0F, -8.0F, 0.0F); matrixStack.scale(16.0F, 16.0F, 16.0F); - IRenderTypeBuffer.Impl irendertypebuffer$impl = Minecraft.getInstance() - .renderBuffers() - .bufferSource(); - boolean flag = !bakedModel.usesBlockLight(); - if (flag) { - RenderHelper.setupForFlatItems(); + MultiBufferSource.BufferSource buffer = Minecraft.getInstance().renderBuffers().bufferSource(); + boolean flatLighting = !bakedModel.usesBlockLight(); + if (useDefaultLighting && flatLighting) { + Lighting.setupForFlatItems(); } - renderer.render(stack, ItemCameraTransforms.TransformType.GUI, false, matrixStack, - irendertypebuffer$impl, 15728880, OverlayTexture.NO_OVERLAY, bakedModel); - irendertypebuffer$impl.endBatch(); + renderer.render(stack, ItemTransforms.TransformType.GUI, false, matrixStack, buffer, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, bakedModel); + buffer.endBatch(); RenderSystem.enableDepthTest(); - if (flag) { - RenderHelper.setupFor3DItems(); + if (useDefaultLighting && flatLighting) { + Lighting.setupFor3DItems(); } - RenderSystem.disableAlphaTest(); - RenderSystem.disableRescaleNormal(); - RenderSystem.enableCull(); matrixStack.popPose(); } @@ -337,12 +300,12 @@ public static void renderItemIntoGUI(MatrixStack matrixStack, ItemStack stack) { private static class FluidRenderWorld extends WrappedWorld { - public FluidRenderWorld(World world) { + public FluidRenderWorld(Level world) { super(world); } @Override - public int getBrightness(@Nullable LightType p_226658_1_, @Nullable BlockPos p_226658_2_) { + public int getBrightness(@Nullable LightLayer p_226658_1_, @Nullable BlockPos p_226658_2_) { return 15; } @@ -353,4 +316,25 @@ public BlockState getBlockState(BlockPos pos) { } } + + public enum VirtualEmptyModelData implements IModelData { + + INSTANCE; + + @Override + public boolean hasProperty(ModelProperty prop) { + return false; + } + + @Override + public T getData(ModelProperty prop) { + return null; + } + + @Override + public T setData(ModelProperty prop, T data) { + return null; + } + + } } diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/PalettePickerScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/PalettePickerScreen.java index 9833f82..9298dc2 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/PalettePickerScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/PalettePickerScreen.java @@ -2,8 +2,9 @@ import java.nio.file.Paths; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.math.Vector3f; import com.simibubi.mightyarchitect.MightyClient; import com.simibubi.mightyarchitect.control.ArchitectManager; import com.simibubi.mightyarchitect.control.design.DesignExporter; @@ -14,12 +15,12 @@ import com.simibubi.mightyarchitect.gui.widgets.IconButton; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.Widget; -import net.minecraft.util.Util; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TextFormatting; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.ChatFormatting; public class PalettePickerScreen extends AbstractSimiScreen { @@ -72,22 +73,22 @@ public void init() { // create if (!scanPicker) { buttonAddPalette = new IconButton(x + (i % 5) * 23, y + (i / 5) * 23, ScreenResources.ICON_ADD); - buttonAddPalette.setToolTip(new StringTextComponent("Create Palette")); + buttonAddPalette.setToolTip(new TextComponent("Create Palette")); buttonAddPalette.getToolTip() - .add(new StringTextComponent("Will use currently selected").withStyle(TextFormatting.GRAY)); + .add(new TextComponent("Will use currently selected").withStyle(ChatFormatting.GRAY)); buttonAddPalette.getToolTip() - .add(new StringTextComponent("Palette as the template.").withStyle(TextFormatting.GRAY)); + .add(new TextComponent("Palette as the template.").withStyle(ChatFormatting.GRAY)); i++; widgets.add(buttonAddPalette); } buttonOpenFolder = new IconButton(x + (i % 5) * 23, y + (i / 5) * 23, ScreenResources.ICON_FOLDER); - buttonOpenFolder.setToolTip(new StringTextComponent("Open Palette Folder")); + buttonOpenFolder.setToolTip(new TextComponent("Open Palette Folder")); widgets.add(buttonOpenFolder); i++; buttonRefresh = new IconButton(x + (i % 5) * 23, y + (i / 5) * 23, ScreenResources.ICON_REFRESH); - buttonRefresh.setToolTip(new StringTextComponent("Refresh Imported Palettes")); + buttonRefresh.setToolTip(new TextComponent("Refresh Imported Palettes")); widgets.add(buttonRefresh); i++; @@ -100,11 +101,11 @@ public void removed() { if (scanPicker) { if (primary.palette.hasDuplicates()) minecraft.player.displayClientMessage( - new StringTextComponent(TextFormatting.RED + "Warning: Ambiguous Scanner Palette " - + TextFormatting.WHITE + "( " + primary.palette.getDuplicates() + " )"), + new TextComponent(ChatFormatting.RED + "Warning: Ambiguous Scanner Palette " + + ChatFormatting.WHITE + "( " + primary.palette.getDuplicates() + " )"), false); - minecraft.player.displayClientMessage(new StringTextComponent("Updated Default Palette"), true); + minecraft.player.displayClientMessage(new TextComponent("Updated Default Palette"), true); DesignExporter.theme.setDefaultPalette(primary.palette); DesignExporter.theme.setDefaultSecondaryPalette(secondary.palette); } @@ -138,7 +139,7 @@ private void updateSelected() { } @Override - public void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { + public void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { ScreenResources.PALETTES.draw(ms, this, topLeftX, topLeftY); int color = ScreenResources.FONT_COLOR; @@ -161,7 +162,7 @@ public void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTi @Override public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) { for (int i = 0; i < this.widgets.size(); ++i) { - Widget guibutton = this.widgets.get(i); + AbstractWidget guibutton = this.widgets.get(i); if (guibutton.isMouseOver(mouseX, mouseY)) { guibutton.playDownSound(this.minecraft.getSoundManager()); @@ -175,7 +176,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) { return super.mouseClicked(mouseX, mouseY, mouseButton); } - protected void buttonClicked(Widget button) { + protected void buttonClicked(AbstractWidget button) { if (button == buttonOpenFolder) { FilesHelper.createFolderIfMissing("palettes"); Util.getPlatform() @@ -208,7 +209,7 @@ protected void buttonClicked(Widget button) { } } - protected void buttonRightClicked(Widget button) { + protected void buttonRightClicked(AbstractWidget button) { if (scanPicker) { if (button instanceof PaletteButton) DesignExporter.theme.setDefaultSecondaryPalette(((PaletteButton) button).palette); @@ -239,38 +240,40 @@ public PaletteButton(PaletteDefinition palette, Screen parent, int buttonId, int active = true; } - private void preview(MatrixStack ms, Minecraft mc) { - RenderSystem.pushMatrix(); - RenderSystem.translatef(x + 5, y + 9, 100); - RenderSystem.rotatef(-35, 0, 1, 0); + private void preview(PoseStack ms, Minecraft mc) { + ms.pushPose(); + ms.translate(x + 5, y + 9, 100); + //RenderSystem.rotatef(-35, 0, 1, 0); + ms.mulPose(Vector3f.YP.rotationDegrees(-35)); renderBlock(ms, mc, new BlockPos(0, 1, 0), Palette.INNER_PRIMARY); renderBlock(ms, mc, new BlockPos(1, 1, 0), Palette.INNER_DETAIL); renderBlock(ms, mc, new BlockPos(0, 0, 0), Palette.HEAVY_PRIMARY); renderBlock(ms, mc, new BlockPos(1, 0, 0), Palette.ROOF_PRIMARY); - RenderSystem.popMatrix(); + ms.popPose(); } - protected void renderBlock(MatrixStack ms, Minecraft mc, BlockPos pos, Palette key) { - RenderSystem.pushMatrix(); + protected void renderBlock(PoseStack ms, Minecraft mc, BlockPos pos, Palette key) { + ms.pushPose(); GuiGameElement.of(palette.get(key)) .atLocal(pos.getX(), pos.getY(), pos.getZ()) .scale(7.9f) .render(ms); - RenderSystem.popMatrix(); + + ms.popPose(); } @Override - public void renderButton(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { + public void renderButton(PoseStack ms, int mouseX, int mouseY, float partialTicks) { super.renderButton(ms, mouseX, mouseY, partialTicks); preview(ms, minecraft); } @Override - public void renderToolTip(MatrixStack ms, int mouseX, int mouseY) { + public void renderToolTip(PoseStack ms, int mouseX, int mouseY) { if (isHovered) { - renderTooltip(ms, new StringTextComponent(palette.getName()), mouseX, mouseY); - RenderSystem.color4f(1, 1, 1, 1); + renderTooltip(ms, new TextComponent(palette.getName()), mouseX, mouseY); + RenderSystem.setShaderColor(1, 1, 1, 1); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/ScreenHelper.java b/src/main/java/com/simibubi/mightyarchitect/gui/ScreenHelper.java index a64556c..d812e68 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/ScreenHelper.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/ScreenHelper.java @@ -1,7 +1,7 @@ package com.simibubi.mightyarchitect.gui; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screens.Screen; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.event.TickEvent.ClientTickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/ScreenResources.java b/src/main/java/com/simibubi/mightyarchitect/gui/ScreenResources.java index e350718..c67028f 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/ScreenResources.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/ScreenResources.java @@ -1,11 +1,12 @@ package com.simibubi.mightyarchitect.gui; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.TheMightyArchitect; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.AbstractGui; -import net.minecraft.util.ResourceLocation; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.resources.ResourceLocation; public enum ScreenResources { @@ -85,13 +86,13 @@ private ScreenResources(String location, int startX, int startY, int width, int this.startX = startX; this.startY = startY; } - public void draw(MatrixStack ms, AbstractGui screen, int i, int j) { + public void draw(PoseStack ms, GuiComponent screen, int i, int j) { bind(); screen.blit(ms, i, j, startX, startY, width, height); } public void bind() { - Minecraft.getInstance().getTextureManager().bind(location); + RenderSystem.setShaderTexture(0, location); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/TextInputPromptScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/TextInputPromptScreen.java index f9509d2..a3ddaed 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/TextInputPromptScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/TextInputPromptScreen.java @@ -4,25 +4,25 @@ import org.lwjgl.glfw.GLFW; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.gui.widget.button.Button; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.components.Button; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; public class TextInputPromptScreen extends AbstractSimiScreen { private Consumer callback; private Consumer abortCallback; - private TextFieldWidget nameField; + private EditBox nameField; private Button confirm; private Button abort; - private ITextComponent buttonTextConfirm; - private ITextComponent buttonTextAbort; - private ITextComponent title; + private Component buttonTextConfirm; + private Component buttonTextAbort; + private Component title; private boolean confirmed; @@ -31,8 +31,8 @@ public TextInputPromptScreen(Consumer callBack, Consumer abortCa this.callback = callBack; this.abortCallback = abortCallback; - buttonTextConfirm = new StringTextComponent("Confirm"); - buttonTextAbort = new StringTextComponent("Abort"); + buttonTextConfirm = new TextComponent("Confirm"); + buttonTextAbort = new TextComponent("Abort"); confirmed = false; } @@ -42,7 +42,7 @@ public void init() { setWindowSize(ScreenResources.TEXT_INPUT.width, ScreenResources.TEXT_INPUT.height + 30); this.nameField = - new TextFieldWidget(font, topLeftX + 33, topLeftY + 26, 128, 8, new StringTextComponent("")); + new EditBox(font, topLeftX + 33, topLeftY + 26, 128, 8, new TextComponent("")); this.nameField.setTextColor(-1); this.nameField.setTextColorUneditable(-1); this.nameField.setBordered(false); @@ -65,7 +65,7 @@ public void init() { } @Override - public void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { + public void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { ScreenResources.TEXT_INPUT.draw(ms, this, topLeftX, topLeftY); font.draw(ms, title, topLeftX + (sWidth / 2) - (font.width(title) / 2), topLeftY + 11, ScreenResources.FONT_COLOR); @@ -79,15 +79,15 @@ public void removed() { } public void setButtonTextConfirm(String buttonTextConfirm) { - this.buttonTextConfirm = new StringTextComponent(buttonTextConfirm); + this.buttonTextConfirm = new TextComponent(buttonTextConfirm); } public void setButtonTextAbort(String buttonTextAbort) { - this.buttonTextAbort = new StringTextComponent(buttonTextAbort); + this.buttonTextAbort = new TextComponent(buttonTextAbort); } public void setTitle(String title) { - this.title = new StringTextComponent(title); + this.title = new TextComponent(title); } @Override diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/ThemeSettingsScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/ThemeSettingsScreen.java index 719675c..fe71b07 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/ThemeSettingsScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/ThemeSettingsScreen.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.control.ArchitectManager; import com.simibubi.mightyarchitect.control.design.DesignExporter; import com.simibubi.mightyarchitect.control.design.DesignLayer; @@ -16,18 +16,18 @@ import com.simibubi.mightyarchitect.gui.widgets.Label; import com.simibubi.mightyarchitect.gui.widgets.ScrollInput; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.util.text.StringTextComponent; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.network.chat.TextComponent; public class ThemeSettingsScreen extends AbstractSimiScreen { private DesignTheme theme; - private TextFieldWidget inputName; - private TextFieldWidget inputAuthor; + private EditBox inputName; + private EditBox inputAuthor; private List indicators; - private List inputs; + private List inputs; private List toggleButtons; private IconButton confirm; @@ -57,12 +57,12 @@ public void init() { int y = topLeftY + 14; int id = 0; - inputName = new TextFieldWidget(font, x, y, 104, 8, new StringTextComponent("")); + inputName = new EditBox(font, x, y, 104, 8, new TextComponent("")); inputName.setValue(theme.getDisplayName()); inputName.changeFocus(false); inputs.add(inputName); - inputAuthor = new TextFieldWidget(font, x, y + 20, 104, 8, new StringTextComponent("")); + inputAuthor = new EditBox(font, x, y + 20, 104, 8, new TextComponent("")); inputAuthor.setValue(theme.getDesigner()); inputAuthor.changeFocus(false); inputs.add(inputAuthor); @@ -268,7 +268,7 @@ private boolean activated(int index) { } @Override - public void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { + public void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { ScreenResources.THEME_EDITOR.draw(ms, this, topLeftX, topLeftY); int x = topLeftX + 10; @@ -332,7 +332,7 @@ public void removed() { ThemeStorage.exportTheme(theme); ThemeStorage.reloadExternal(); ArchitectManager.editTheme(theme); - minecraft.player.displayClientMessage(new StringTextComponent("Theme settings have been updated."), true); + minecraft.player.displayClientMessage(new TextComponent("Theme settings have been updated."), true); } private boolean roofLayerExists() { diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/ToolSelectionScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/ToolSelectionScreen.java index 6a04a25..a07fce8 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/ToolSelectionScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/ToolSelectionScreen.java @@ -3,16 +3,16 @@ import java.util.List; import java.util.function.Consumer; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.mightyarchitect.MightyClient; import com.simibubi.mightyarchitect.control.compose.planner.Tools; -import net.minecraft.client.MainWindow; +import com.mojang.blaze3d.platform.Window; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.util.text.StringTextComponent; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.TextComponent; public class ToolSelectionScreen extends Screen { @@ -26,7 +26,7 @@ public class ToolSelectionScreen extends Screen { protected int h; public ToolSelectionScreen(List tools, Consumer callback) { - super(new StringTextComponent("Tool Selection")); + super(new TextComponent("Tool Selection")); this.minecraft = Minecraft.getInstance(); this.tools = tools; this.callback = callback; @@ -43,24 +43,23 @@ public void cycle(int direction) { selection = (selection + tools.size()) % tools.size(); } - private void draw(MatrixStack ms, float partialTicks) { - MainWindow mainWindow = Minecraft.getInstance() + private void draw(PoseStack ms, float partialTicks) { + Window mainWindow = Minecraft.getInstance() .getWindow(); - FontRenderer font = minecraft.font; + Font font = minecraft.font; int x = (mainWindow.getGuiScaledWidth() - w) / 2 + 15; int y = 15; - RenderSystem.pushMatrix(); - RenderSystem.translatef(0, 0, focused ? 100 : 0); + ms.pushPose(); + ms.translate(0, 0, focused ? 100 : 0); ScreenResources gray = ScreenResources.GRAY; RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); RenderSystem.enableTexture(); - RenderSystem.color4f(1, 1, 1, focused ? 7 / 8f : 1 / 2f); - Minecraft.getInstance() - .getTextureManager() - .bind(gray.location); + RenderSystem.setShaderColor(1, 1, 1, focused ? 7 / 8f : 1 / 2f); + RenderSystem.setShaderTexture(0, gray.location); float toolTipAlpha = yOffset / 10; // render main box @@ -72,12 +71,10 @@ private void draw(MatrixStack ms, float partialTicks) { int stringAlphaComponent = ((int) (toolTipAlpha * 0xFF)) << 24; if (toolTipAlpha > 0.25f) { - Minecraft.getInstance() - .getTextureManager() - .bind(gray.location); - RenderSystem.color4f(.7f, .7f, .8f, toolTipAlpha); + RenderSystem.setShaderTexture(0, gray.location); + RenderSystem.setShaderColor(.7f, .7f, .8f, toolTipAlpha); blit(ms, x - 15, y + 30, gray.startX, gray.startY, w, h + 22, gray.width, gray.height); - RenderSystem.color4f(1, 1, 1, 1); + RenderSystem.setShaderColor(1, 1, 1, 1); if (toolTip.size() > 0) font.draw(ms, toolTip.get(0), x - 10, y + 35, 0xEEEEEE + stringAlphaComponent); @@ -89,7 +86,7 @@ private void draw(MatrixStack ms, float partialTicks) { font.draw(ms, toolTip.get(3), x - 10, y + 69, 0xCCCCDD + stringAlphaComponent); } - RenderSystem.color4f(1, 1, 1, 1); + RenderSystem.setShaderColor(1, 1, 1, 1); String translationKey = MightyClient.TOOL_MENU.getTranslatedKeyMessage() .getString() .toUpperCase(); @@ -102,28 +99,28 @@ private void draw(MatrixStack ms, float partialTicks) { drawCenteredString(ms, minecraft.font, "[SCROLL] to Cycle", width / 2, y - 10, 0xCCDDFF); for (int i = 0; i < tools.size(); i++) { - RenderSystem.pushMatrix(); + ms.pushPose(); float alpha = focused ? 1 : .2f; if (i == selection) { - RenderSystem.translatef(0, -10, 0); + ms.translate(0, -10, 0); drawCenteredString(ms, minecraft.font, tools.get(i) .getDisplayName(), x + i * 50 + 24, y + 28, 0xCCDDFF); alpha = 1; } - RenderSystem.color4f(0, 0, 0, alpha); + RenderSystem.setShaderColor(0, 0, 0, alpha); tools.get(i) .getIcon() .draw(ms, this, x + i * 50 + 16, y + 12); - RenderSystem.color4f(1, 1, 1, alpha); + RenderSystem.setShaderColor(1, 1, 1, alpha); tools.get(i) .getIcon() .draw(ms, this, x + i * 50 + 16, y + 11); - RenderSystem.popMatrix(); + ms.popPose(); } - RenderSystem.popMatrix(); + ms.popPose(); } public void update() { @@ -133,7 +130,7 @@ public void update() { yOffset *= .9f; } - public void renderPassive(MatrixStack ms, float partialTicks) { + public void renderPassive(PoseStack ms, float partialTicks) { if (Minecraft.getInstance().screen != null) return; draw(ms, partialTicks); diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/AbstractSimiWidget.java b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/AbstractSimiWidget.java index 6e3f200..e7ac316 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/AbstractSimiWidget.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/AbstractSimiWidget.java @@ -3,27 +3,33 @@ import java.util.LinkedList; import java.util.List; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.gui.widget.Widget; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; -public abstract class AbstractSimiWidget extends Widget { +public abstract class AbstractSimiWidget extends AbstractWidget { - protected List toolTip; + protected List toolTip; public AbstractSimiWidget(int xIn, int yIn, int widthIn, int heightIn) { - super(xIn, yIn, widthIn, heightIn, StringTextComponent.EMPTY); + super(xIn, yIn, widthIn, heightIn, TextComponent.EMPTY); toolTip = new LinkedList<>(); } - public List getToolTip() { + public List getToolTip() { return toolTip; } @Override - public void renderButton(MatrixStack matrixStack, int p_renderButton_1_, int p_renderButton_2_, float p_renderButton_3_) { + public void renderButton(PoseStack matrixStack, int p_renderButton_1_, int p_renderButton_2_, float p_renderButton_3_) { + } + + @Override + public void updateNarration(NarrationElementOutput pNarrationElementOutput) { + defaultButtonNarrationText(pNarrationElementOutput); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/IconButton.java b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/IconButton.java index f2f7fd3..397e6b3 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/IconButton.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/IconButton.java @@ -1,11 +1,11 @@ package com.simibubi.mightyarchitect.gui.widgets; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.mightyarchitect.gui.ScreenResources; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; public class IconButton extends AbstractSimiWidget { @@ -18,7 +18,7 @@ public IconButton(int x, int y, ScreenResources icon) { } @Override - public void renderButton(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { + public void renderButton(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { if (this.visible) { this.isHovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height; @@ -26,7 +26,7 @@ public void renderButton(MatrixStack matrixStack, int mouseX, int mouseY, float ScreenResources button = (pressed || !active) ? button = ScreenResources.BUTTON_DOWN : (isHovered) ? ScreenResources.BUTTON_HOVER : ScreenResources.BUTTON; - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); ScreenResources.BUTTON.bind(); blit(matrixStack, x, y, button.startX, button.startY, button.width, button.height); icon.draw(matrixStack, this, x + 1, y + 1); @@ -46,10 +46,10 @@ public void onRelease(double p_onRelease_1_, double p_onRelease_3_) { } public void setToolTip(String text) { - setToolTip(new StringTextComponent(text)); + setToolTip(new TextComponent(text)); } - public void setToolTip(ITextComponent text) { + public void setToolTip(Component text) { toolTip.clear(); toolTip.add(text); } diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/Indicator.java b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/Indicator.java index 7596584..aa839a4 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/Indicator.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/Indicator.java @@ -1,11 +1,11 @@ package com.simibubi.mightyarchitect.gui.widgets; import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.gui.ScreenResources; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; public class Indicator extends AbstractSimiWidget { @@ -17,17 +17,17 @@ public enum State { public State state; public Indicator(int x, int y, String tooltip) { - this(x, y, new StringTextComponent(tooltip)); + this(x, y, new TextComponent(tooltip)); } - public Indicator(int x, int y, ITextComponent tooltip) { + public Indicator(int x, int y, Component tooltip) { super(x, y, ScreenResources.INDICATOR.width, ScreenResources.INDICATOR.height); this.toolTip = ImmutableList.of(tooltip); this.state = State.OFF; } @Override - public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks ) { + public void render(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks ) { ScreenResources toDraw; switch(state) { case ON: toDraw = ScreenResources.INDICATOR_WHITE; break; diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/Label.java b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/Label.java index f523574..b105203 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/Label.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/Label.java @@ -1,30 +1,31 @@ package com.simibubi.mightyarchitect.gui.widgets; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.util.text.IFormattableTextComponent; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; public class Label extends AbstractSimiWidget { - public ITextComponent text; + public Component text; public String suffix; protected boolean hasShadow; protected int color; - protected FontRenderer font; + protected Font font; public Label(int x, int y, String tooltip) { - this(x, y, new StringTextComponent(tooltip)); + this(x, y, new TextComponent(tooltip)); } - public Label(int x, int y, ITextComponent text) { + public Label(int x, int y, Component text) { super(x, y, Minecraft.getInstance().font.width(text), 10); font = Minecraft.getInstance().font; - this.text = new StringTextComponent("Label"); + this.text = new TextComponent("Label"); color = 0xFFFFFF; hasShadow = false; suffix = ""; @@ -46,11 +47,11 @@ public Label withSuffix(String s) { } public void setText(String text) { - this.text = new StringTextComponent(text); + this.text = new TextComponent(text); } - public void setTextAndTrim(ITextComponent newText, boolean trimFront, int maxWidthPx) { - FontRenderer fontRenderer = Minecraft.getInstance().font; + public void setTextAndTrim(Component newText, boolean trimFront, int maxWidthPx) { + Font fontRenderer = Minecraft.getInstance().font; if (fontRenderer.width(newText) <= maxWidthPx) { text = newText; @@ -68,8 +69,8 @@ public void setTextAndTrim(ITextComponent newText, boolean trimFront, int maxWid for (int i = startIndex; i != endIndex; i += step) { String sub = builder.substring(trimFront ? i : startIndex, trimFront ? endIndex + 1 : i + 1); - if (fontRenderer.width(new StringTextComponent(sub).setStyle(newText.getStyle())) + trimWidth <= maxWidthPx) { - text = new StringTextComponent(trimFront ? trim + sub : sub + trim).setStyle(newText.getStyle()); + if (fontRenderer.width(new TextComponent(sub).setStyle(newText.getStyle())) + trimWidth <= maxWidthPx) { + text = new TextComponent(trimFront ? trim + sub : sub + trim).setStyle(newText.getStyle()); return; } } @@ -77,14 +78,14 @@ public void setTextAndTrim(ITextComponent newText, boolean trimFront, int maxWid } @Override - public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { + public void render(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { if (!visible) return; if (text == null || text.getString().isEmpty()) return; - RenderSystem.color4f(1, 1, 1, 1); - IFormattableTextComponent copy = text.plainCopy(); + RenderSystem.setShaderColor(1, 1, 1, 1); + MutableComponent copy = text.plainCopy(); if (suffix != null && !suffix.isEmpty()) copy.append(suffix); diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/ScrollInput.java b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/ScrollInput.java index 264cb4f..269969c 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/ScrollInput.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/ScrollInput.java @@ -2,18 +2,19 @@ import java.util.function.Consumer; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TextFormatting; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.ChatFormatting; public class ScrollInput extends AbstractSimiWidget { protected Consumer onScroll; protected int state; protected Label displayLabel; - protected ITextComponent title = new StringTextComponent("Choose an Option"); - protected ITextComponent scrollToModify = new StringTextComponent("Scroll to Modify"); + protected Component title = new TextComponent("Choose an Option"); + protected Component scrollToModify = new TextComponent("Scroll to Modify"); protected int min, max; protected int shiftStep; @@ -42,7 +43,7 @@ public ScrollInput removeCallback() { } public ScrollInput titled(String title) { - this.title = new StringTextComponent(title); + this.title = new TextComponent(title); updateTooltip(); return this; } @@ -108,15 +109,15 @@ public void onChanged() { } protected void writeToLabel() { - displayLabel.text = new StringTextComponent(String.valueOf(state)); + displayLabel.text = new TextComponent(String.valueOf(state)); } protected void updateTooltip() { toolTip.clear(); toolTip.add(title.plainCopy() - .withStyle(TextFormatting.BLUE)); + .withStyle(ChatFormatting.BLUE)); toolTip.add(scrollToModify.plainCopy() - .withStyle(TextFormatting.ITALIC, TextFormatting.DARK_GRAY)); + .withStyle(ChatFormatting.ITALIC, ChatFormatting.DARK_GRAY)); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/SelectionScrollInput.java b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/SelectionScrollInput.java index 5318a02..5f5a635 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/SelectionScrollInput.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/SelectionScrollInput.java @@ -3,14 +3,14 @@ import java.util.ArrayList; import java.util.List; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TextFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.ChatFormatting; public class SelectionScrollInput extends ScrollInput { protected List options; - protected ITextComponent scrollToSelect = new StringTextComponent("Scroll to Select"); + protected Component scrollToSelect = new TextComponent("Scroll to Select"); public SelectionScrollInput(int xIn, int yIn, int widthIn, int heightIn) { super(xIn, yIn, widthIn, heightIn); @@ -26,7 +26,7 @@ public ScrollInput forOptions(List options) { @Override protected void writeToLabel() { - displayLabel.text = new StringTextComponent(options.get(state)); + displayLabel.text = new TextComponent(options.get(state)); } @Override @@ -38,22 +38,22 @@ public boolean mouseScrolled(double mouseX, double mouseY, double delta) { protected void updateTooltip() { toolTip.clear(); toolTip.add(title.plainCopy() - .withStyle(TextFormatting.BLUE)); + .withStyle(ChatFormatting.BLUE)); for (int i = min; i < max; i++) { if (i == state) - toolTip.add(StringTextComponent.EMPTY.plainCopy() + toolTip.add(TextComponent.EMPTY.plainCopy() .append("-> ") .append(options.get(i)) - .withStyle(TextFormatting.WHITE)); + .withStyle(ChatFormatting.WHITE)); else - toolTip.add(StringTextComponent.EMPTY.plainCopy() + toolTip.add(TextComponent.EMPTY.plainCopy() .append("> ") .append(options.get(i)) - .withStyle(TextFormatting.GRAY)); + .withStyle(ChatFormatting.GRAY)); } - toolTip.add(StringTextComponent.EMPTY.plainCopy() + toolTip.add(TextComponent.EMPTY.plainCopy() .append(scrollToSelect) - .withStyle(TextFormatting.ITALIC, TextFormatting.DARK_GRAY)); + .withStyle(ChatFormatting.ITALIC, ChatFormatting.DARK_GRAY)); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/item/ArchitectWandItem.java b/src/main/java/com/simibubi/mightyarchitect/item/ArchitectWandItem.java index a15b49f..61da882 100644 --- a/src/main/java/com/simibubi/mightyarchitect/item/ArchitectWandItem.java +++ b/src/main/java/com/simibubi/mightyarchitect/item/ArchitectWandItem.java @@ -8,23 +8,23 @@ import com.simibubi.mightyarchitect.gui.DesignExporterScreen; import com.simibubi.mightyarchitect.gui.ScreenHelper; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUseContext; -import net.minecraft.item.Rarity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionHand; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.level.Level; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; -import net.minecraft.item.Item.Properties; +import net.minecraft.world.item.Item.Properties; public class ArchitectWandItem extends Item { @@ -33,18 +33,18 @@ public ArchitectWandItem(Properties properties) { } @Override - public ActionResultType useOn(ItemUseContext context) { - PlayerEntity player = context.getPlayer(); - World world = context.getLevel(); + public InteractionResult useOn(UseOnContext context) { + Player player = context.getPlayer(); + Level world = context.getLevel(); if (!world.isClientSide) - return ActionResultType.SUCCESS; + return InteractionResult.SUCCESS; if (player.isShiftKeyDown()) { DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { openGui(); }); - return ActionResultType.SUCCESS; + return InteractionResult.SUCCESS; } BlockPos anchor = context.getClickedPos(); @@ -55,7 +55,7 @@ public ActionResultType useOn(ItemUseContext context) { }); player.getCooldowns().addCooldown(this, 5); - return ActionResultType.SUCCESS; + return InteractionResult.SUCCESS; } @OnlyIn(value = Dist.CLIENT) @@ -64,14 +64,14 @@ protected void resetVisualization() { } @OnlyIn(value = Dist.CLIENT) - protected void handleUseOnDesignAnchor(PlayerEntity player, World world, BlockPos anchor, BlockState blockState) { + protected void handleUseOnDesignAnchor(Player player, Level world, BlockPos anchor, BlockState blockState) { if (AllBlocks.DESIGN_ANCHOR.typeOf(blockState)) { if (!ArchitectManager.inPhase(ArchitectPhases.EditingThemes)) return; String name = DesignExporter.exportDesign(world, anchor); if (!name.isEmpty()) { - player.displayClientMessage(new StringTextComponent(name), true); + player.displayClientMessage(new TextComponent(name), true); } } else { @@ -82,7 +82,7 @@ protected void handleUseOnDesignAnchor(PlayerEntity player, World world, BlockPo } @Override - public ActionResult use(World worldIn, PlayerEntity playerIn, Hand handIn) { + public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { if (worldIn.isClientSide) { DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { handleRightClick(worldIn, playerIn, handIn); @@ -93,7 +93,7 @@ public ActionResult use(World worldIn, PlayerEntity playerIn, Hand ha } @OnlyIn(value = Dist.CLIENT) - protected void handleRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) { + protected void handleRightClick(Level worldIn, Player playerIn, InteractionHand handIn) { if (!ArchitectManager.inPhase(ArchitectPhases.EditingThemes)) return; diff --git a/src/main/java/com/simibubi/mightyarchitect/networking/InstantPrintPacket.java b/src/main/java/com/simibubi/mightyarchitect/networking/InstantPrintPacket.java index 45d5c8e..8046c5d 100644 --- a/src/main/java/com/simibubi/mightyarchitect/networking/InstantPrintPacket.java +++ b/src/main/java/com/simibubi/mightyarchitect/networking/InstantPrintPacket.java @@ -7,12 +7,12 @@ import java.util.Map; import java.util.function.Supplier; -import net.minecraft.block.BlockState; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.NBTUtil; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.fml.network.NetworkEvent.Context; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.fmllegacy.network.NetworkEvent; public class InstantPrintPacket { @@ -25,30 +25,29 @@ public InstantPrintPacket(BunchOfBlocks blocks) { this.blocks = blocks; } - public InstantPrintPacket(PacketBuffer buf) { + public InstantPrintPacket(FriendlyByteBuf buf) { Map blocks = new HashMap<>(); int size = buf.readInt(); for (int i = 0; i < size; i++) { - CompoundNBT blockTag = buf.readNbt(); + CompoundTag blockTag = buf.readNbt(); BlockPos pos = buf.readBlockPos(); - blocks.put(pos, NBTUtil.readBlockState(blockTag)); + blocks.put(pos, NbtUtils.readBlockState(blockTag)); } this.blocks = new BunchOfBlocks(blocks); } - public void toBytes(PacketBuffer buf) { + public void toBytes(FriendlyByteBuf buf) { buf.writeInt(blocks.size); blocks.blocks.forEach((pos, state) -> { - buf.writeNbt(NBTUtil.writeBlockState(state)); + buf.writeNbt(NbtUtils.writeBlockState(state)); buf.writeBlockPos(pos); }); } - public void handle(Supplier context) { - Context ctx = context.get(); - ctx.enqueueWork(() -> { + public void handle(Supplier context) { + context.get().enqueueWork(() -> { blocks.blocks.forEach((pos, state) -> { - ctx.getSender().getCommandSenderWorld().setBlock(pos, state, 3); + context.get().getSender().getCommandSenderWorld().setBlock(pos, state, 3); }); }); } diff --git a/src/main/java/com/simibubi/mightyarchitect/networking/PlaceSignPacket.java b/src/main/java/com/simibubi/mightyarchitect/networking/PlaceSignPacket.java index 5fd476f..5b23e4a 100644 --- a/src/main/java/com/simibubi/mightyarchitect/networking/PlaceSignPacket.java +++ b/src/main/java/com/simibubi/mightyarchitect/networking/PlaceSignPacket.java @@ -2,13 +2,13 @@ import java.util.function.Supplier; -import net.minecraft.block.Blocks; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.SignTileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.world.World; -import net.minecraftforge.fml.network.NetworkEvent.Context; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.level.Level; +import net.minecraftforge.fmllegacy.network.NetworkEvent; public class PlaceSignPacket { @@ -25,23 +25,23 @@ public PlaceSignPacket(String textLine1, String textLine2, BlockPos position) { this.position = position; } - public PlaceSignPacket(PacketBuffer buffer) { + public PlaceSignPacket(FriendlyByteBuf buffer) { this(buffer.readUtf(128), buffer.readUtf(128), buffer.readBlockPos()); } - public void toBytes(PacketBuffer buffer) { + public void toBytes(FriendlyByteBuf buffer) { buffer.writeUtf(text1); buffer.writeUtf(text2); buffer.writeBlockPos(position); } - public void handle(Supplier context) { + public void handle(Supplier context) { context.get().enqueueWork(() -> { - World entityWorld = context.get().getSender().getCommandSenderWorld(); + Level entityWorld = context.get().getSender().getCommandSenderWorld(); entityWorld.setBlockAndUpdate(position, Blocks.SPRUCE_SIGN.defaultBlockState()); - SignTileEntity sign = (SignTileEntity) entityWorld.getBlockEntity(position); - sign.setMessage(0, new StringTextComponent(text1)); - sign.setMessage(1, new StringTextComponent(text2)); + SignBlockEntity sign = (SignBlockEntity) entityWorld.getBlockEntity(position); + sign.setMessage(0, new TextComponent(text1)); + sign.setMessage(1, new TextComponent(text2)); }); } diff --git a/src/main/java/com/simibubi/mightyarchitect/networking/SetHotbarItemPacket.java b/src/main/java/com/simibubi/mightyarchitect/networking/SetHotbarItemPacket.java index 762816f..1c57bb4 100644 --- a/src/main/java/com/simibubi/mightyarchitect/networking/SetHotbarItemPacket.java +++ b/src/main/java/com/simibubi/mightyarchitect/networking/SetHotbarItemPacket.java @@ -2,10 +2,10 @@ import java.util.function.Supplier; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.fml.network.NetworkEvent.Context; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.fmllegacy.network.NetworkEvent; public class SetHotbarItemPacket { @@ -17,22 +17,23 @@ public SetHotbarItemPacket(int slot, ItemStack stack) { this.stack = stack; } - public SetHotbarItemPacket(PacketBuffer buffer) { + public SetHotbarItemPacket(FriendlyByteBuf buffer) { this(buffer.readInt(), buffer.readItem()); } - public void toBytes(PacketBuffer buffer) { + public void toBytes(FriendlyByteBuf buffer) { buffer.writeInt(slot); buffer.writeItem(stack); } - public void handle(Supplier context) { + public void handle(Supplier context) { context.get().enqueueWork(() -> { - ServerPlayerEntity player = context.get().getSender(); + ServerPlayer player = context.get().getSender(); if (!player.isCreative()) return; - - player.setSlot(slot, stack); + + player.getInventory().setItem(slot, stack); + //player.setSlot(slot, stack); player.inventoryMenu.broadcastChanges(); }); } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 0000000..98406fe --- /dev/null +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1 @@ +public net.minecraft.client.renderer.entity.ItemRenderer f_115096_ # textureManager \ No newline at end of file From 5c7e86619e9e1e47fd64b6be2f0321aba06f0289 Mon Sep 17 00:00:00 2001 From: zelophed Date: Tue, 7 Dec 2021 17:32:48 +0100 Subject: [PATCH 2/7] hidden outlines - attempt to improve outline rendering --- .../mightyarchitect/MightyClient.java | 10 ++--- .../compose/planner/ComposerToolBase.java | 2 +- .../compose/planner/CopyDesignTool.java | 6 ++- .../control/compose/planner/RoomTool.java | 29 +++++++------- .../planner/WallDecorationToolBase.java | 13 ++++++- .../foundation/RenderTypes.java | 24 +++++++----- .../utility/outliner/AABBOutline.java | 38 +++++++------------ .../foundation/utility/outliner/Outline.java | 32 +++++++++++----- .../utility/outliner/OutlinedText.java | 9 ++--- .../foundation/utility/outliner/Outliner.java | 3 +- 10 files changed, 92 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/simibubi/mightyarchitect/MightyClient.java b/src/main/java/com/simibubi/mightyarchitect/MightyClient.java index 5db5844..a0fc752 100644 --- a/src/main/java/com/simibubi/mightyarchitect/MightyClient.java +++ b/src/main/java/com/simibubi/mightyarchitect/MightyClient.java @@ -68,11 +68,11 @@ public static void onRenderWorld(RenderWorldLastEvent event) { .renderBuffers() .bufferSource(); - //SuperRenderTypeBuffer b = SuperRenderTypeBuffer.getInstance(); + SuperRenderTypeBuffer b = SuperRenderTypeBuffer.getInstance(); - MightyClient.renderer.render(ms, buffer); - ArchitectManager.render(ms, buffer); - MightyClient.outliner.renderOutlines(ms, buffer); + MightyClient.renderer.render(ms, b); + ArchitectManager.render(ms, b); + MightyClient.outliner.renderOutlines(ms, b); // ms.push(); // ms.translate(5, 10, 4); @@ -82,7 +82,7 @@ public static void onRenderWorld(RenderWorldLastEvent event) { // ms, buffer.getBuffer(RenderType.getSolid()), true, new Random(), EmptyModelData.INSTANCE); // ms.pop(); - //b.draw(); + b.draw(); buffer.endBatch(); ms.popPose(); } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/ComposerToolBase.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/ComposerToolBase.java index a9a9379..5fd7c2d 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/ComposerToolBase.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/ComposerToolBase.java @@ -111,7 +111,7 @@ public void renderOverlay(PoseStack ms) { mc.font.drawShadow(ms, toolModeCtrl, 0, 12, color); } - //RenderSystem.color4f(1, 1, 1, 1); + RenderSystem.setShaderColor(1, 1, 1, 1); ms.popPose(); } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CopyDesignTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CopyDesignTool.java index 3ce36b6..08e61d2 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CopyDesignTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CopyDesignTool.java @@ -80,7 +80,8 @@ public void tickToolOutlines() { .showAABB(pos, new AABB(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + selectedRoom.height, pos.getZ() + 1)) - .lineWidth(1 / 8f); + .lineWidth(1 / 8f) + .withAlpha(1); }; renderCorner.accept(origin); @@ -98,7 +99,8 @@ public void tickToolOutlines() { .showAABB(start, new AABB(start.getX() - 1 / 2d, start.getY(), start.getZ() - 1 / 2d, end.getX() - 1 / 2d, end.getY(), end.getZ() - 1 / 2d)) - .lineWidth(1 / 8f); + .lineWidth(1 / 8f) + .withAlpha(1); }; if (selectedFace.getAxis() == Axis.X) { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RoomTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RoomTool.java index 50d59c9..e8c9b65 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RoomTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/RoomTool.java @@ -54,7 +54,7 @@ public String handleRightClick() { } else { return createRoom(ArchitectManager.getModel() - .getGroundPlan()); + .getGroundPlan()); } } @@ -66,7 +66,7 @@ protected String createRoom(GroundPlan groundPlan) { DesignTheme theme = groundPlan.theme; ThemeStatistics stats = theme.getStatistics(); boolean hasFoundation = theme.getLayers() - .contains(DesignLayer.Foundation); + .contains(DesignLayer.Foundation); room.designLayer = hasFoundation ? DesignLayer.Foundation : DesignLayer.Regular; int facadeWidth = Math.min(room.width, room.length); @@ -106,7 +106,7 @@ protected boolean adjustHeightForIntersection(GroundPlan groundPlan, Room room) groundPlan.forEachRoom(r -> { if (r.intersects(room) && !(r.y + r.height <= room.y || room.y + room.height <= r.y) - && (biggestRoom.getValue() == null + && (biggestRoom.getValue() == null || biggestRoom.getValue().width * biggestRoom.getValue().length < r.width * r.length)) { biggestRoom.setValue(r); } @@ -130,7 +130,7 @@ public static void increaseMatchingOthers(GroundPlan groundPlan, Stack stack) { if (r == added) return; if (r.intersects(added) && r.y <= added.y && r.y + r.height > added.y && (biggestRoom.getValue() == null - || biggestRoom.getValue().width * biggestRoom.getValue().length < r.width * r.length)) { + || biggestRoom.getValue().width * biggestRoom.getValue().length < r.width * r.length)) { biggestRoom.setValue(r); } }); @@ -146,13 +146,13 @@ public boolean handleMouseWheel(int scroll) { if (scroll > 0) { increaseMatchingOthers(ArchitectManager.getModel() - .getGroundPlan(), lastAddedStack); + .getGroundPlan(), lastAddedStack); } else { lastAddedStack.decrease(); if (lastAddedStack.floors() == 0) { ArchitectManager.getModel() - .getGroundPlan() - .remove(lastAddedStack); + .getGroundPlan() + .remove(lastAddedStack); lastAddedStack = null; } } @@ -213,7 +213,7 @@ public void tickToolOutlines() { return; BlockPos anchor = ArchitectManager.getModel() - .getAnchor(); + .getAnchor(); BlockPos cursorPos = (anchor != null) ? selectedPosition.offset(anchor) : selectedPosition; BlockPos previouslySelectedPos = (firstPosition != null) ? firstPosition.offset(anchor) : cursorPos; @@ -223,8 +223,9 @@ public void tickToolOutlines() { selection.length += 1; MightyClient.outliner.chaseAABB(outlineKey, selection.toAABB()) - .withFaceTexture(AllSpecialTextures.CHECKERED) - .colored(0); + .withFaceTexture(AllSpecialTextures.CHECKERED) + .withAlpha(0.75f) + .colored(0x0); if (firstPosition == null) return; @@ -243,10 +244,10 @@ protected void drawTextAroundBounds(Cuboid selection) { private void chaseText(Object key, float x, float y, float z, String text) { MightyClient.outliner.chaseText(key, new Vec3(x, y, z), text) - .colored(0) - .coloredFaces(0xffffff) - .disableNormals() - .withFaceTexture(AllSpecialTextures.BLANK); + .colored(0) + .coloredFaces(0xffffff) + .disableNormals() + .withFaceTexture(AllSpecialTextures.BLANK); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/WallDecorationToolBase.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/WallDecorationToolBase.java index f30b4ff..3e9e71e 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/WallDecorationToolBase.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/WallDecorationToolBase.java @@ -50,8 +50,12 @@ public void tickToolOutlines() { max = max.offset(0, selectedRoom.height, 0); } + //highlight room MightyClient.outliner.chaseAABB(toolOutlineKey, new AABB(min.getX() - 1 / 2d, - min.getY() + 1 / 4d, min.getZ() - 1 / 2d, max.getX() + 1 / 2d, max.getY(), max.getZ() + 1 / 2d)).lineWidth(1/8f); + min.getY() + 1 / 4d, min.getZ() - 1 / 2d, max.getX() + 1 / 2d, max.getY(), max.getZ() + 1 / 2d)) + .lineWidth(1/8f) + .colored(0xffffff) + .withAlpha(1); return; } @@ -84,8 +88,13 @@ public void tickToolOutlines() { BlockPos max = stack.getOrigin() .offset(stack.getSize()) .offset(model.getAnchor()); + + //highlight stack MightyClient.outliner.chaseAABB(toolOutlineKey, new AABB(min.getX() - 1 / 2d, min.getY() + 1 / 4d, - min.getZ() - 1 / 2d, max.getX() + 1 / 2d, max.getY(), max.getZ() + 1 / 2d)).lineWidth(1/8f); + min.getZ() - 1 / 2d, max.getX() + 1 / 2d, max.getY(), max.getZ() + 1 / 2d)) + .lineWidth(1/8f) + .colored(0xffffff) + .withAlpha(1); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/RenderTypes.java b/src/main/java/com/simibubi/mightyarchitect/foundation/RenderTypes.java index 2f9ceb2..5a7fa37 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/RenderTypes.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/RenderTypes.java @@ -16,17 +16,21 @@ public class RenderTypes extends RenderStateShard { protected static final RenderStateShard.CullStateShard DISABLE_CULLING = new NoCullState(); - private static final RenderType OUTLINE_SOLID = - RenderType.create(createLayerName("outline_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, - false, RenderType.CompositeState.builder() - .setShaderState(RENDERTYPE_ENTITY_SOLID_SHADER) - .setTextureState(new RenderStateShard.TextureStateShard(AllSpecialTextures.BLANK.getLocation(), false, false)) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); + public static RenderType getOutlineSolid(ResourceLocation texture) { + return RenderType.create(createLayerName("outline_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, + false, RenderType.CompositeState.builder() + .setShaderState(RenderStateShard.RENDERTYPE_ENTITY_CUTOUT_SHADER) + .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true)); + } + + private static final RenderType DEFAULT_OUTLINE_SOLID = + getOutlineSolid(AllSpecialTextures.BLANK.getLocation()); public static RenderType getOutlineSolid() { - return OUTLINE_SOLID; + return DEFAULT_OUTLINE_SOLID; } public static RenderType getOutlineTranslucent(ResourceLocation texture, boolean cull) { @@ -38,7 +42,7 @@ public static RenderType getOutlineTranslucent(ResourceLocation texture, boolean .setCullState(cull ? CULL : NO_CULL) .setLightmapState(LIGHTMAP) .setOverlayState(OVERLAY) - .setWriteMaskState(COLOR_WRITE) + .setWriteMaskState(RenderStateShard.COLOR_WRITE) .createCompositeState(true)); } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/AABBOutline.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/AABBOutline.java index 1aa8004..91f7a50 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/AABBOutline.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/AABBOutline.java @@ -2,16 +2,12 @@ import org.apache.logging.log4j.LogManager; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.simibubi.mightyarchitect.MightyClient; import com.simibubi.mightyarchitect.foundation.RenderTypes; -import com.simibubi.mightyarchitect.foundation.SuperRenderTypeBuffer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.resources.ResourceLocation; @@ -32,8 +28,7 @@ public void render(PoseStack ms, MultiBufferSource buffer) { } public void renderBB(PoseStack ms, MultiBufferSource buffer, AABB bb) { - Vec3 projectedView = Minecraft.getInstance().gameRenderer.getMainCamera() - .getPosition(); + Vec3 projectedView = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); boolean noCull = bb.contains(projectedView); bb = bb.inflate(noCull ? -1 / 128d : 1 / 128d); noCull |= params.disableCull; @@ -77,24 +72,25 @@ public void renderBB(PoseStack ms, MultiBufferSource buffer, AABB bb) { } protected void renderFace(PoseStack ms, MultiBufferSource buffer, Direction direction, Vec3 p1, Vec3 p2, - Vec3 p3, Vec3 p4, boolean noCull) { + Vec3 p3, Vec3 p4, boolean noCull) { if (!params.faceTexture.isPresent()) return; if (params.isFaceHidden(direction)) return; - if (noCull) { - LogManager.getLogger().info("noCulling!"); - } - ResourceLocation faceTexture = params.faceTexture.get() - .getLocation(); + .getLocation(); float alphaBefore = params.alpha; - params.alpha = - (direction == params.getHighlightedFace() && params.hightlightedFaceTexture.isPresent()) ? 1 : alphaBefore; + params.alpha = (direction == params.getHighlightedFace() && params.hightlightedFaceTexture.isPresent()) ? 1 : alphaBefore; + //0.5f; + + //LogManager.getLogger().info(faceTexture.getPath() + " " + params.alpha + " " + alphaBefore); - RenderType translucentType = RenderTypes.getOutlineTranslucent(faceTexture, !noCull); - VertexConsumer builder = buffer.getBuffer(translucentType); + VertexConsumer builder = buffer.getBuffer( + params.alpha == 1 ? + RenderTypes.getOutlineSolid(faceTexture) : + RenderTypes.getOutlineTranslucent(faceTexture, !noCull) + ); Axis axis = direction.getAxis(); Vec3 uDiff = p2.subtract(p1); @@ -102,14 +98,8 @@ protected void renderFace(PoseStack ms, MultiBufferSource buffer, Direction dire float maxU = (float) Math.abs(axis == Axis.X ? uDiff.z : uDiff.x); float maxV = (float) Math.abs(axis == Axis.Y ? vDiff.z : vDiff.y); - Vec3 tmp = params.rgb; - if (params.faceRgb != null) { - params.rgb = params.faceRgb; - putQuadUV(ms, builder, p1, p2, p3, p4, 0, 0, maxU, maxV, Direction.UP); - params.rgb = tmp; - } else { - putQuadUV(ms, builder, p1, p2, p3, p4, 0, 0, maxU, maxV, Direction.UP); - } + putQuadUV(ms, builder, p1, p2, p3, p4, 0, 0, maxU, maxV, Direction.UP, true); + params.alpha = alphaBefore; } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outline.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outline.java index e8aca88..11cf573 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outline.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outline.java @@ -4,6 +4,8 @@ import javax.annotation.Nullable; +import org.apache.logging.log4j.LogManager; + import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack.Pose; @@ -51,7 +53,7 @@ public void renderCuboidLine(PoseStack ms, MultiBufferSource buffer, Vec3 start, } public void renderAACuboidLine(PoseStack ms, MultiBufferSource buffer, Vec3 start, Vec3 end) { - VertexConsumer builder = buffer.getBuffer(RenderTypes.getOutlineSolid()); + VertexConsumer builder = buffer.getBuffer(RenderTypes.getOutlineSolid(AllSpecialTextures.BLANK.getLocation()));//todo simplify Vec3 diff = end.subtract(start); if (diff.x + diff.y + diff.z < 0) { @@ -113,18 +115,18 @@ public void renderAACuboidLine(PoseStack ms, MultiBufferSource buffer, Vec3 star public void putQuad(PoseStack ms, VertexConsumer builder, Vec3 v1, Vec3 v2, Vec3 v3, Vec3 v4, Direction normal) { - putQuadUV(ms, builder, v1, v2, v3, v4,0, 0, 1, 1, normal); + putQuadUV(ms, builder, v1, v2, v3, v4,0, 0, 1, 1, normal, false); } public void putQuadUV(PoseStack ms, VertexConsumer builder, Vec3 v1, Vec3 v2, Vec3 v3, Vec3 v4, float minU, - float minV, float maxU, float maxV, Direction normal) { - putVertex(ms, builder, v1, minU, minV, normal); - putVertex(ms, builder, v2, maxU, minV, normal); - putVertex(ms, builder, v3, maxU, maxV, normal); - putVertex(ms, builder, v4, minU, maxV, normal); + float minV, float maxU, float maxV, Direction normal, boolean useFaceColors) { + putVertex(ms, builder, v1, minU, minV, normal, useFaceColors); + putVertex(ms, builder, v2, maxU, minV, normal, useFaceColors); + putVertex(ms, builder, v3, maxU, maxV, normal, useFaceColors); + putVertex(ms, builder, v4, minU, maxV, normal, useFaceColors); } - protected void putVertex(PoseStack ms, VertexConsumer builder, Vec3 pos, float u, float v, Direction normal) { + protected void putVertex(PoseStack ms, VertexConsumer builder, Vec3 pos, float u, float v, Direction normal, boolean useFaceColor) { Pose peek = ms.last(); if (transformNormals == null) transformNormals = peek.normal(); @@ -139,11 +141,18 @@ protected void putVertex(PoseStack ms, VertexConsumer builder, Vec3 pos, float u zOffset = normal.getStepZ(); } + Vec3 color = params.rgb; + //LogManager.getLogger().info(color.toString()); + + if (useFaceColor && params.faceRgb != null) + color = params.faceRgb; + builder.vertex(peek.pose(), (float) pos.x, (float) pos.y, (float) pos.z) - .color((float) params.rgb.x, (float) params.rgb.y, (float) params.rgb.z, params.alpha) + .color((float) color.x, (float) color.y, (float) color.z, params.alpha) .uv(u, v) .overlayCoords(OverlayTexture.NO_OVERLAY) .uv2(params.lightMap) + //.uv2(LightTexture.FULL_BRIGHT) .normal(peek.normal(), xOffset, yOffset, zOffset) .endVertex(); @@ -200,6 +209,11 @@ public OutlineParams coloredFaces(int color) { return this; } + public OutlineParams withAlpha(float alpha) { + this.alpha = alpha; + return this; + } + public OutlineParams lineWidth(float width) { this.lineWidth = width; return this; diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/OutlinedText.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/OutlinedText.java index bf7231a..f35673f 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/OutlinedText.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/OutlinedText.java @@ -75,12 +75,9 @@ public void render(PoseStack ms, MultiBufferSource buffer) { ms.pushPose(); ms.scale(-scaleMod, 1, scaleMod); ms.translate(0, 0, .5f); - if (params.faceRgb != null) { - Vec3 tmp = params.rgb; - params.rgb = params.faceRgb; - putQuadUV(ms, buffer.getBuffer(RenderTypes.getOutlineSolid()), v1, v2, v3, v4,0, 0, 1, 1, null); - params.rgb = tmp; - } + + putQuadUV(ms, buffer.getBuffer(RenderTypes.getOutlineSolid()), v1, v2, v3, v4,0, 0, 1, 1, null, true); + ms.popPose(); ms.scale(scaleMod, 1, 1); diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outliner.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outliner.java index 236bf9f..28fa82c 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outliner.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outliner.java @@ -6,6 +6,7 @@ import java.util.Optional; import java.util.Set; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.foundation.utility.outliner.LineOutline.ChasingLineOutline; import com.simibubi.mightyarchitect.foundation.utility.outliner.LineOutline.EndChasingLineOutline; @@ -160,7 +161,7 @@ public void tickOutlines() { public void renderOutlines(PoseStack ms, MultiBufferSource buffer) { outlines.forEach((key, entry) -> { Outline outline = entry.getOutline(); - outline.params.alpha = 1; + //outline.params.alpha = 1; if (entry.ticksTillRemoval < 0) { int prevTicks = entry.ticksTillRemoval + 1; From 129882b9047f679caa6438704b38805978081dd2 Mon Sep 17 00:00:00 2001 From: zelophed Date: Tue, 7 Dec 2021 20:03:39 +0100 Subject: [PATCH 3/7] extended hotbar - allow hotbar-keys (1 - 9) to select tools when focused - move, reshape and height tools will now simulate N scrolls when the Nth hotbar-key is pressed - layerStyle and palettePainter tool will select the Nth style when the Nth hotbar-key is pressed --- .../control/compose/planner/HeightTool.java | 4 ++ .../compose/planner/IComposerTool.java | 48 +++++++++++++++---- .../compose/planner/LayerStyleTool.java | 33 +++++++++++++ .../compose/planner/MoveReshapeTool.java | 4 ++ .../compose/planner/PalettePainterTool.java | 41 +++++++++++++++- .../control/phase/PhaseComposing.java | 36 ++++++++++---- .../control/phase/PhasePreviewing.java | 35 ++++++++++---- .../gui/ToolSelectionScreen.java | 12 +++++ 8 files changed, 187 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/HeightTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/HeightTool.java index da585a9..df1471f 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/HeightTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/HeightTool.java @@ -65,4 +65,8 @@ public void updateSelection() { highlightRoom = Keyboard.isKeyDown(GLFW.GLFW_KEY_LEFT_CONTROL); } + @Override + public boolean numberInputSimulatesScrolls() { + return true; + } } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/IComposerTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/IComposerTool.java index 1b45385..92942bd 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/IComposerTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/IComposerTool.java @@ -1,18 +1,48 @@ package com.simibubi.mightyarchitect.control.compose.planner; +import java.util.Arrays; +import java.util.Optional; + +import org.apache.commons.lang3.ArrayUtils; +import org.lwjgl.glfw.GLFW; + import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.mightyarchitect.foundation.utility.Keyboard; + +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; public interface IComposerTool { - static Object toolOutlineKey = new Object(); + Object toolOutlineKey = new Object(); - public String handleRightClick(); - public boolean handleMouseWheel(int scroll); - - public void tickToolOutlines(); - public void tickGroundPlanOutlines(); + String handleRightClick(); + boolean handleMouseWheel(int scroll); + + default void handleKeyInput(int key) { + if (!numberInputSimulatesScrolls()) + return; + + Optional mapping = Arrays.stream(Minecraft.getInstance().options.keyHotbarSlots).filter(keyMapping -> keyMapping.getKey().getValue() == key).findFirst(); + if (mapping.isEmpty()) + return; + + int number = ArrayUtils.indexOf(Minecraft.getInstance().options.keyHotbarSlots, mapping.get()) + 1; + if (Keyboard.isKeyDown(GLFW.GLFW_KEY_LEFT_SHIFT) || Keyboard.isKeyDown(GLFW.GLFW_KEY_RIGHT_SHIFT)) { + number = number * -1; + } + + handleMouseWheel(number); + + } + default boolean numberInputSimulatesScrolls() { + return false; + } + + void tickToolOutlines(); + void tickGroundPlanOutlines(); - public void updateSelection(); - public void renderOverlay(PoseStack ms); - public void init(); + void updateSelection(); + void renderOverlay(PoseStack ms); + void init(); } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/LayerStyleTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/LayerStyleTool.java index 1d96e2e..655c043 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/LayerStyleTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/LayerStyleTool.java @@ -1,11 +1,17 @@ package com.simibubi.mightyarchitect.control.compose.planner; +import java.util.Arrays; import java.util.List; +import java.util.Optional; + +import org.apache.commons.lang3.ArrayUtils; import com.simibubi.mightyarchitect.control.ArchitectManager; import com.simibubi.mightyarchitect.control.design.DesignLayer; import net.minecraft.ChatFormatting; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; public class LayerStyleTool extends WallDecorationToolBase { @@ -34,4 +40,31 @@ public boolean handleMouseWheel(int amount) { return true; } + @Override + public void handleKeyInput(int key) { + if (selectedRoom == null) + return; + + Optional mapping = Arrays.stream(Minecraft.getInstance().options.keyHotbarSlots).filter(keyMapping -> keyMapping.getKey().getValue() == key).findFirst(); + if (mapping.isEmpty()) + return; + + DesignLayer currentLayer = selectedRoom.designLayer; + List layers = model.getTheme().getRoomLayers(); + + int index = ArrayUtils.indexOf(Minecraft.getInstance().options.keyHotbarSlots, mapping.get()); + if (index > layers.size()) + return; + + DesignLayer newLayer = layers.get(index); + + if (newLayer == currentLayer) + return; + + selectedRoom.designLayer = newLayer; + model.getTheme().getDesignPicker().rerollRoom(selectedRoom); + ArchitectManager.reAssemble(); + status("Style: " + ChatFormatting.AQUA + newLayer.getDisplayName()); + + } } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/MoveReshapeTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/MoveReshapeTool.java index ebc6f63..0a62fea 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/MoveReshapeTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/MoveReshapeTool.java @@ -95,4 +95,8 @@ public boolean handleMouseWheel(int scroll) { return super.handleMouseWheel(scroll); } + @Override + public boolean numberInputSimulatesScrolls() { + return true; + } } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/PalettePainterTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/PalettePainterTool.java index 8c584ac..4369ca5 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/PalettePainterTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/PalettePainterTool.java @@ -1,11 +1,17 @@ package com.simibubi.mightyarchitect.control.compose.planner; +import java.util.Arrays; +import java.util.Optional; + +import org.apache.commons.lang3.ArrayUtils; import org.lwjgl.glfw.GLFW; import com.simibubi.mightyarchitect.control.ArchitectManager; import com.simibubi.mightyarchitect.foundation.utility.Keyboard; import net.minecraft.ChatFormatting; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; public class PalettePainterTool extends WallDecorationToolBase { @@ -48,7 +54,40 @@ public boolean handleMouseWheel(int amount) { status(selectedRoom.secondaryPalette ? "Secondary Palette" : "Primary Palette"); return true; } - + + @Override + public void handleKeyInput(int key) { + Optional mapping = Arrays.stream(Minecraft.getInstance().options.keyHotbarSlots).filter(keyMapping -> keyMapping.getKey().getValue() == key).findFirst(); + if (mapping.isEmpty()) + return; + + int index = ArrayUtils.indexOf(Minecraft.getInstance().options.keyHotbarSlots, mapping.get()); + if (index > 1) + return; + + if (model.getPrimary().getName().equals(model.getSecondary().getName())) { + status(ChatFormatting.RED + "Choose a secondary Palette first [ G -> C ]"); + return; + } + + if (selectedRoom == null) { + status("Point at the Room to modify."); + return; + } + + if (Keyboard.isKeyDown(GLFW.GLFW_KEY_LEFT_CONTROL)) { + // Paint Room + selectedRoom.secondaryPalette = index == 1; + + } else { + // Paint Stack + selectedStack.forEach(room -> room.secondaryPalette = index == 1); + } + + ArchitectManager.reAssemble(); + status(selectedRoom.secondaryPalette ? "Secondary Palette" : "Primary Palette"); + } + @Override public void updateSelection() { super.updateSelection(); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseComposing.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseComposing.java index 5321422..6d7c8c4 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseComposing.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseComposing.java @@ -1,6 +1,10 @@ package com.simibubi.mightyarchitect.control.phase; +import java.util.Arrays; import java.util.List; +import java.util.Optional; + +import org.apache.commons.lang3.ArrayUtils; import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.vertex.PoseStack; @@ -10,7 +14,9 @@ import com.simibubi.mightyarchitect.foundation.utility.Shaders; import com.simibubi.mightyarchitect.gui.ToolSelectionScreen; +import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; +import net.minecraft.client.Options; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; @@ -64,18 +70,32 @@ public void onClick(int button) { @Override public void onKey(int key, boolean released) { - if (key != MightyClient.TOOL_MENU.getKey() - .getValue()) - return; + if (key == MightyClient.TOOL_MENU.getKey().getValue()) { + if (released && toolSelection.focused) { + toolSelection.focused = false; + toolSelection.onClose(); + } + + if (!released && !toolSelection.focused) + toolSelection.focused = true; - if (released && toolSelection.focused) { - toolSelection.focused = false; - toolSelection.onClose(); + return; } - if (!released && !toolSelection.focused) - toolSelection.focused = true; + if (released) + return; + + if (toolSelection.focused) { + Optional mapping = Arrays.stream(Minecraft.getInstance().options.keyHotbarSlots).filter(keyMapping -> keyMapping.getKey().getValue() == key).findFirst(); + if (mapping.isEmpty()) + return; + + toolSelection.select(ArrayUtils.indexOf(Minecraft.getInstance().options.keyHotbarSlots, mapping.get())); + + return; + } + activeTool.getTool().handleKeyInput(key); } @Override diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePreviewing.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePreviewing.java index c1bd9e9..644812e 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePreviewing.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePreviewing.java @@ -1,14 +1,19 @@ package com.simibubi.mightyarchitect.control.phase; +import java.util.Arrays; import java.util.List; +import java.util.Optional; import java.util.function.Consumer; +import org.apache.commons.lang3.ArrayUtils; + import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.MightyClient; import com.simibubi.mightyarchitect.control.compose.planner.Tools; import com.simibubi.mightyarchitect.gui.ToolSelectionScreen; +import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraftforge.client.event.RenderGameOverlayEvent; @@ -54,18 +59,32 @@ public void onClick(int button) { @Override public void onKey(int key, boolean released) { - if (key != MightyClient.TOOL_MENU.getKey() - .getValue()) - return; + if (key == MightyClient.TOOL_MENU.getKey().getValue()) { + if (released && toolSelection.focused) { + toolSelection.focused = false; + toolSelection.onClose(); + } - if (released && toolSelection.focused) { - toolSelection.focused = false; - toolSelection.onClose(); + if (!released && !toolSelection.focused) + toolSelection.focused = true; + + return; } - if (!released && !toolSelection.focused) - toolSelection.focused = true; + if (released) + return; + + if (toolSelection.focused) { + Optional mapping = Arrays.stream(Minecraft.getInstance().options.keyHotbarSlots).filter(keyMapping -> keyMapping.getKey().getValue() == key).findFirst(); + if (mapping.isEmpty()) + return; + + toolSelection.select(ArrayUtils.indexOf(Minecraft.getInstance().options.keyHotbarSlots, mapping.get())); + + return; + } + activeTool.getTool().handleKeyInput(key); } @Override diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/ToolSelectionScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/ToolSelectionScreen.java index a07fce8..c70a447 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/ToolSelectionScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/ToolSelectionScreen.java @@ -9,10 +9,13 @@ import com.simibubi.mightyarchitect.control.compose.planner.Tools; import com.mojang.blaze3d.platform.Window; + +import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.TextComponent; +import net.minecraft.util.Mth; public class ToolSelectionScreen extends Screen { @@ -43,6 +46,10 @@ public void cycle(int direction) { selection = (selection + tools.size()) % tools.size(); } + public void select(int index) { + selection = Mth.clamp(index, 0, tools.size() - 1); + } + private void draw(PoseStack ms, float partialTicks) { Window mainWindow = Minecraft.getInstance() .getWindow(); @@ -117,6 +124,11 @@ private void draw(PoseStack ms, float partialTicks) { .getIcon() .draw(ms, this, x + i * 50 + 16, y + 11); + if (focused && i != selection) { + KeyMapping keyMapping = minecraft.options.keyHotbarSlots[i]; + drawCenteredString(ms, minecraft.font, "[" + keyMapping.getTranslatedKeyMessage().getString() + "]", x + i * 50 + 24, y + 3, 0xCCDDFF); + } + ms.popPose(); } From c409788e17573d435796c5517ad49f3284030df2 Mon Sep 17 00:00:00 2001 From: zelophed Date: Wed, 8 Dec 2021 15:10:07 +0100 Subject: [PATCH 4/7] port to 1.18 --- build.gradle | 16 ++++++++++------ gradle/wrapper/gradle-wrapper.properties | 2 +- .../com/simibubi/mightyarchitect/AllPackets.java | 4 ++-- .../simibubi/mightyarchitect/MightyClient.java | 10 ++++------ .../control/SchematicRenderer.java | 4 ++-- .../control/TemplateBlockAccess.java | 12 ++++++------ .../mightyarchitect/foundation/WrappedWorld.java | 8 ++++---- .../mightyarchitect/gui/AbstractSimiScreen.java | 2 +- .../mightyarchitect/gui/ThemeSettingsScreen.java | 2 +- .../networking/InstantPrintPacket.java | 2 +- .../networking/PlaceSignPacket.java | 2 +- .../networking/SetHotbarItemPacket.java | 2 +- 12 files changed, 34 insertions(+), 32 deletions(-) diff --git a/build.gradle b/build.gradle index 73e5227..f5a5b3b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { repositories { - maven { url = 'https://files.minecraftforge.net/maven' } + maven { url = 'https://maven.minecraftforge.net/' } jcenter() mavenCentral() } @@ -12,14 +12,18 @@ apply plugin: 'net.minecraftforge.gradle' // Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. apply plugin: 'eclipse' apply plugin: 'maven-publish' -apply from: 'https://raw.githubusercontent.com/SizableShrimp/Forge-Class-Remapper/main/classremapper.gradle' -version = 'mc1.16.5_v0.5' +version = 'mc1.18_v0.6' group = 'com.simibubi.mightyarchitect' archivesBaseName = 'mightyarchitect' -sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '16' +//sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '17' +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} repositories { maven { @@ -30,7 +34,7 @@ repositories { } minecraft { - mappings channel: 'official', version: '1.17.1' + mappings channel: 'official', version: '1.18' accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') runs { @@ -69,7 +73,7 @@ minecraft { } dependencies { - minecraft 'net.minecraftforge:forge:1.17.1-37.1.0' + minecraft 'net.minecraftforge:forge:1.18-38.0.15' } jar { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ffed3a2..e750102 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/com/simibubi/mightyarchitect/AllPackets.java b/src/main/java/com/simibubi/mightyarchitect/AllPackets.java index e1fb7c4..7bd28f5 100644 --- a/src/main/java/com/simibubi/mightyarchitect/AllPackets.java +++ b/src/main/java/com/simibubi/mightyarchitect/AllPackets.java @@ -5,8 +5,8 @@ import com.simibubi.mightyarchitect.networking.SetHotbarItemPacket; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.fmllegacy.network.NetworkRegistry; -import net.minecraftforge.fmllegacy.network.simple.SimpleChannel; +import net.minecraftforge.network.NetworkRegistry; +import net.minecraftforge.network.simple.SimpleChannel; public class AllPackets { diff --git a/src/main/java/com/simibubi/mightyarchitect/MightyClient.java b/src/main/java/com/simibubi/mightyarchitect/MightyClient.java index a0fc752..eb1f5b9 100644 --- a/src/main/java/com/simibubi/mightyarchitect/MightyClient.java +++ b/src/main/java/com/simibubi/mightyarchitect/MightyClient.java @@ -1,7 +1,5 @@ package com.simibubi.mightyarchitect; -import java.util.Random; - import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.control.ArchitectManager; import com.simibubi.mightyarchitect.control.SchematicRenderer; @@ -16,12 +14,12 @@ import net.minecraft.client.KeyMapping; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RenderWorldLastEvent; +import net.minecraftforge.client.ClientRegistry; +import net.minecraftforge.client.event.RenderLevelLastEvent; import net.minecraftforge.event.TickEvent.ClientTickEvent; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import net.minecraftforge.fmlclient.registry.ClientRegistry; @EventBusSubscriber(value = Dist.CLIENT) public class MightyClient { @@ -57,8 +55,8 @@ public static void onTick(ClientTickEvent event) { } @SubscribeEvent - public static void onRenderWorld(RenderWorldLastEvent event) { - PoseStack ms = event.getMatrixStack(); + public static void onRenderWorld(RenderLevelLastEvent event) { + PoseStack ms = event.getPoseStack(); Camera info = Minecraft.getInstance().gameRenderer.getMainCamera(); Vec3 view = info.getPosition(); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/SchematicRenderer.java b/src/main/java/com/simibubi/mightyarchitect/control/SchematicRenderer.java index 7fa4b91..85594db 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/SchematicRenderer.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/SchematicRenderer.java @@ -104,7 +104,7 @@ private void redraw(Minecraft minecraft) { for (RenderType blockRenderLayer : RenderType.chunkBufferLayers()) { if (!ItemBlockRenderTypes.canRenderInLayer(state, blockRenderLayer)) continue; - ForgeHooksClient.setRenderLayer(blockRenderLayer); + ForgeHooksClient.setRenderType(blockRenderLayer); if (!buffers.containsKey(blockRenderLayer)) buffers.put(blockRenderLayer, new BufferBuilder(DefaultVertexFormat.BLOCK.getIntegerSize())); @@ -117,7 +117,7 @@ private void redraw(Minecraft minecraft) { } } - ForgeHooksClient.setRenderLayer(null); + ForgeHooksClient.setRenderType(null); ms.popPose(); }); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java b/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java index b39e12b..888bff8 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java @@ -25,12 +25,12 @@ import net.minecraft.world.phys.AABB; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; -import net.minecraft.world.level.EmptyTickList; -import net.minecraft.world.level.TickList; import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.ticks.BlackholeTickAccess; +import net.minecraft.world.ticks.LevelTickAccess; public class TemplateBlockAccess extends WrappedWorld { @@ -153,13 +153,13 @@ public boolean setBlock(BlockPos pos, BlockState state, int p_241211_3_, int p_2 } @Override - public TickList getBlockTicks() { - return EmptyTickList.empty(); + public LevelTickAccess getBlockTicks() { + return BlackholeTickAccess.emptyLevelList(); } @Override - public TickList getLiquidTicks() { - return EmptyTickList.empty(); + public LevelTickAccess getFluidTicks() { + return BlackholeTickAccess.emptyLevelList(); } @Override diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java b/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java index 2ab3058..dd7f587 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java @@ -26,12 +26,12 @@ import net.minecraft.sounds.SoundEvent; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; -import net.minecraft.world.level.TickList; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkSource; import net.minecraft.world.level.storage.WritableLevelData; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; +import net.minecraft.world.ticks.LevelTickAccess; public class WrappedWorld extends Level { @@ -108,13 +108,13 @@ public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newSt } @Override - public TickList getBlockTicks() { + public LevelTickAccess getBlockTicks() { return world.getBlockTicks(); } @Override - public TickList getLiquidTicks() { - return world.getLiquidTicks(); + public LevelTickAccess getFluidTicks() { + return world.getFluidTicks(); } @Override diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/AbstractSimiScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/AbstractSimiScreen.java index 4cd2ad6..e0bb227 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/AbstractSimiScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/AbstractSimiScreen.java @@ -92,7 +92,7 @@ public boolean isPauseScreen() { protected void renderWindowForeground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { for (AbstractWidget widget : widgets) { - if (!widget.isHovered()) + if (!widget.isHoveredOrFocused()) continue; if (widget instanceof AbstractSimiWidget && !((AbstractSimiWidget) widget).getToolTip() .isEmpty()) diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/ThemeSettingsScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/ThemeSettingsScreen.java index fe71b07..d7529d7 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/ThemeSettingsScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/ThemeSettingsScreen.java @@ -209,7 +209,7 @@ public boolean mouseClicked(double x, double y, int button) { if (button == 0) { for (IconButton button2 : toggleButtons) { - if (button2.isHovered()) { + if (button2.isHoveredOrFocused()) { buttonClicked(button2); return true; } diff --git a/src/main/java/com/simibubi/mightyarchitect/networking/InstantPrintPacket.java b/src/main/java/com/simibubi/mightyarchitect/networking/InstantPrintPacket.java index 8046c5d..fb70321 100644 --- a/src/main/java/com/simibubi/mightyarchitect/networking/InstantPrintPacket.java +++ b/src/main/java/com/simibubi/mightyarchitect/networking/InstantPrintPacket.java @@ -12,7 +12,7 @@ import net.minecraft.nbt.NbtUtils; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.fmllegacy.network.NetworkEvent; +import net.minecraftforge.network.NetworkEvent; public class InstantPrintPacket { diff --git a/src/main/java/com/simibubi/mightyarchitect/networking/PlaceSignPacket.java b/src/main/java/com/simibubi/mightyarchitect/networking/PlaceSignPacket.java index 5b23e4a..4b03319 100644 --- a/src/main/java/com/simibubi/mightyarchitect/networking/PlaceSignPacket.java +++ b/src/main/java/com/simibubi/mightyarchitect/networking/PlaceSignPacket.java @@ -8,7 +8,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.network.chat.TextComponent; import net.minecraft.world.level.Level; -import net.minecraftforge.fmllegacy.network.NetworkEvent; +import net.minecraftforge.network.NetworkEvent; public class PlaceSignPacket { diff --git a/src/main/java/com/simibubi/mightyarchitect/networking/SetHotbarItemPacket.java b/src/main/java/com/simibubi/mightyarchitect/networking/SetHotbarItemPacket.java index 1c57bb4..14655bf 100644 --- a/src/main/java/com/simibubi/mightyarchitect/networking/SetHotbarItemPacket.java +++ b/src/main/java/com/simibubi/mightyarchitect/networking/SetHotbarItemPacket.java @@ -5,7 +5,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.fmllegacy.network.NetworkEvent; +import net.minecraftforge.network.NetworkEvent; public class SetHotbarItemPacket { From 90b32b696318c35a0c0e503e564ad30235f7087f Mon Sep 17 00:00:00 2001 From: glutzer Date: Thu, 5 May 2022 16:45:44 -0500 Subject: [PATCH 5/7] up --- build.gradle | 8 ++++---- .../simibubi/mightyarchitect/TheMightyArchitect.java | 2 +- .../mightyarchitect/control/TemplateBlockAccess.java | 6 +++--- .../mightyarchitect/foundation/WrappedWorld.java | 12 ++++-------- 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/build.gradle b/build.gradle index f5a5b3b..6ad970f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { repositories { - maven { url = 'https://maven.minecraftforge.net/' } + maven { url = 'https://maven.minecraftforge.net' } jcenter() mavenCentral() } @@ -13,7 +13,7 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' -version = 'mc1.18_v0.6' +version = 'mc1.18.2_v0.6' group = 'com.simibubi.mightyarchitect' archivesBaseName = 'mightyarchitect' @@ -34,7 +34,7 @@ repositories { } minecraft { - mappings channel: 'official', version: '1.18' + mappings channel: 'official', version: '1.18.2' accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') runs { @@ -73,7 +73,7 @@ minecraft { } dependencies { - minecraft 'net.minecraftforge:forge:1.18-38.0.15' + minecraft 'net.minecraftforge:forge:1.18.2-40.0.46' } jar { diff --git a/src/main/java/com/simibubi/mightyarchitect/TheMightyArchitect.java b/src/main/java/com/simibubi/mightyarchitect/TheMightyArchitect.java index 8cc7c01..4729186 100644 --- a/src/main/java/com/simibubi/mightyarchitect/TheMightyArchitect.java +++ b/src/main/java/com/simibubi/mightyarchitect/TheMightyArchitect.java @@ -23,7 +23,7 @@ public class TheMightyArchitect { public static final String ID = "mightyarchitect"; public static final String NAME = "The Mighty Architect"; - public static final String VERSION = "0.5"; + public static final String VERSION = "0.6"; public static TheMightyArchitect instance; public static Logger logger = LogManager.getLogger(); diff --git a/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java b/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java index 888bff8..95c6ba8 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java @@ -11,6 +11,7 @@ import com.simibubi.mightyarchitect.control.compose.Cuboid; import com.simibubi.mightyarchitect.foundation.WrappedWorld; +import net.minecraft.core.Holder; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; @@ -85,9 +86,8 @@ public Map getBlockMap() { } @Override - public Biome getBiome(BlockPos pos) { - return registryAccess().registryOrThrow(Registry.BIOME_REGISTRY) - .get(Biomes.THE_VOID); + public Holder getBiome(BlockPos pos) { + return Holder.direct(registryAccess().registryOrThrow(Registry.BIOME_REGISTRY).get(Biomes.THE_VOID)); } @Override diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java b/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java index dd7f587..7e1cb1c 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java @@ -8,6 +8,7 @@ import javax.annotation.Nullable; +import net.minecraft.core.Holder; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.entity.Entity; @@ -19,7 +20,6 @@ import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.phys.AABB; import net.minecraft.world.scores.Scoreboard; -import net.minecraft.tags.TagContainer; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.core.Direction; import net.minecraft.sounds.SoundSource; @@ -32,6 +32,7 @@ import net.minecraft.world.level.storage.WritableLevelData; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.minecraft.world.ticks.LevelTickAccess; +import net.minecraftforge.registries.tags.ITagManager; public class WrappedWorld extends Level { @@ -72,7 +73,7 @@ public void get(EntityTypeTest p_156932_, AABB p_1 }; public WrappedWorld(Level world) { - super((WritableLevelData) world.getLevelData(), world.dimension(), world.dimensionType(), + super((WritableLevelData) world.getLevelData(), world.dimension(), world.dimensionTypeRegistration(), () -> world.getProfiler(), world.isClientSide, false, 0); this.world = world; } @@ -181,7 +182,7 @@ public RecipeManager getRecipeManager() { } @Override - public Biome getUncachedNoiseBiome(int p_225604_1_, int p_225604_2_, int p_225604_3_) { + public Holder getUncachedNoiseBiome(int p_225604_1_, int p_225604_2_, int p_225604_3_) { return world.getUncachedNoiseBiome(p_225604_1_, p_225604_2_, p_225604_3_); } @@ -200,11 +201,6 @@ public float getShade(Direction p_230487_1_, boolean p_230487_2_) { return 1; } - @Override - public TagContainer getTagManager() { - return world.getTagManager(); - } - @Override protected LevelEntityGetter getEntities() { return entityGetter; From 602229d7f1e1c7582d8824ec55dfe5b64ccf5939 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 12 Jul 2022 20:04:23 +0200 Subject: [PATCH 6/7] Tidy up --- build.gradle | 33 ++-- gradle.properties | 19 ++ logs/debug.log | 0 logs/latest.log | 0 .../simibubi/mightyarchitect/AllBlocks.java | 4 +- .../mightyarchitect/AllSpecialTextures.java | 1 - .../mightyarchitect/MightyClient.java | 4 +- .../mightyarchitect/TheMightyArchitect.java | 4 +- .../block/DesignAnchorBlock.java | 8 +- .../block/SliceMarkerBlock.java | 22 ++- .../control/ArchitectKits.java | 8 +- .../control/ArchitectManager.java | 6 +- .../control/ArchitectMenu.java | 2 +- .../mightyarchitect/control/Schematic.java | 2 +- .../control/SchematicRenderer.java | 12 +- .../control/TemplateBlockAccess.java | 24 +-- .../control/compose/Cuboid.java | 4 +- .../mightyarchitect/control/compose/Room.java | 2 +- .../compose/planner/ComposerToolBase.java | 8 +- .../compose/planner/CopyDesignTool.java | 4 +- .../compose/planner/CylinderRoomTool.java | 2 +- .../planner/GroundPlanningToolBase.java | 4 +- .../compose/planner/MoveReshapeTool.java | 2 +- .../planner/WallDecorationToolBase.java | 2 +- .../control/design/DesignExporter.java | 8 +- .../control/design/DesignResourceLoader.java | 2 +- .../control/design/DesignSlice.java | 2 +- .../control/design/ThemeStorage.java | 2 +- .../control/design/ThemeValidator.java | 2 +- .../control/design/partials/Corner.java | 4 +- .../control/design/partials/Design.java | 2 +- .../control/design/partials/Facade.java | 2 - .../control/design/partials/FlatRoof.java | 4 +- .../control/design/partials/Roof.java | 4 +- .../control/design/partials/Tower.java | 4 +- .../control/design/partials/TowerRoof.java | 4 +- .../control/design/partials/Wall.java | 4 +- .../control/palette/BlockOrientation.java | 14 +- .../control/palette/PaletteDefinition.java | 12 +- .../control/phase/PhaseComposing.java | 15 +- .../control/phase/PhaseCreatingPalette.java | 42 +++-- .../control/phase/PhasePaused.java | 2 +- .../control/phase/PrintingToMultiplayer.java | 6 +- .../foundation/MatrixStacker.java | 4 +- .../foundation/RenderTypes.java | 7 +- .../foundation/SpriteShiftEntry.java | 2 +- .../foundation/SuperByteBuffer.java | 13 +- .../foundation/SuperByteBufferCache.java | 15 +- .../foundation/SuperRenderTypeBuffer.java | 9 +- .../foundation/WrappedWorld.java | 29 ++- .../foundation/utility/AngleHelper.java | 30 ++-- .../foundation/utility/ColorHelper.java | 15 -- .../foundation/utility/FilesHelper.java | 14 +- .../foundation/utility/Iterate.java | 2 +- .../foundation/utility/Keyboard.java | 3 +- .../foundation/utility/Lang.java | 85 +++++++++ .../foundation/utility/LangBuilder.java | 167 ++++++++++++++++++ .../foundation/utility/LangNumberFormat.java | 33 ++++ .../foundation/utility/LerpedFloat.java | 148 ++++++++++++++++ .../foundation/utility/RaycastHelper.java | 8 +- .../foundation/utility/VecHelper.java | 8 +- .../utility/outliner/AABBOutline.java | 24 ++- .../utility/outliner/BlockClusterOutline.java | 2 +- .../utility/outliner/ChasingAABBOutline.java | 2 +- .../foundation/utility/outliner/Outline.java | 5 +- .../utility/outliner/OutlinedText.java | 2 - .../foundation/utility/outliner/Outliner.java | 3 +- .../gui/AbstractSimiScreen.java | 2 +- .../gui/ArchitectMenuScreen.java | 56 +++--- .../gui/DesignExporterScreen.java | 13 +- .../mightyarchitect/gui/GuiGameElement.java | 63 ++----- .../gui/PalettePickerScreen.java | 13 +- .../mightyarchitect/gui/ScreenResources.java | 3 +- .../gui/TextInputPromptScreen.java | 2 +- .../gui/ToolSelectionScreen.java | 24 +-- .../gui/widgets/IconButton.java | 2 +- .../mightyarchitect/gui/widgets/Label.java | 5 +- .../gui/widgets/ScrollInput.java | 3 +- .../gui/widgets/SelectionScrollInput.java | 2 +- .../item/ArchitectWandItem.java | 42 ++--- .../networking/PlaceSignPacket.java | 6 +- .../networking/SetHotbarItemPacket.java | 2 +- .../textures/gui/background.png | Bin 179 -> 154 bytes 83 files changed, 773 insertions(+), 407 deletions(-) create mode 100644 gradle.properties delete mode 100644 logs/debug.log delete mode 100644 logs/latest.log create mode 100644 src/main/java/com/simibubi/mightyarchitect/foundation/utility/Lang.java create mode 100644 src/main/java/com/simibubi/mightyarchitect/foundation/utility/LangBuilder.java create mode 100644 src/main/java/com/simibubi/mightyarchitect/foundation/utility/LangNumberFormat.java create mode 100644 src/main/java/com/simibubi/mightyarchitect/foundation/utility/LerpedFloat.java diff --git a/build.gradle b/build.gradle index 6ad970f..2fa789e 100644 --- a/build.gradle +++ b/build.gradle @@ -3,27 +3,24 @@ buildscript { maven { url = 'https://maven.minecraftforge.net' } jcenter() mavenCentral() + maven { url = 'https://maven.parchmentmc.org' } } dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: "${forgegradle_version}", changing: true + classpath "org.parchmentmc:librarian:${librarian_version}" } } + apply plugin: 'net.minecraftforge.gradle' -// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. +apply plugin: 'org.parchmentmc.librarian.forgegradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' -version = 'mc1.18.2_v0.6' +version = "mc${minecraft_version}_v${mod_version}" group = 'com.simibubi.mightyarchitect' archivesBaseName = 'mightyarchitect' -//sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '17' - -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(17) repositories { maven { @@ -31,10 +28,16 @@ repositories { name = "tterrag maven" url = "https://maven.tterrag.com/" } + maven { + // Location of the maven that hosts JEI files (and TiC) + name 'Progwml6 maven' + url 'https://dvs1.progwml6.com/files/maven' + } } +println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) minecraft { - mappings channel: 'official', version: '1.18.2' + mappings channel: 'parchment', version: "${parchment_version}-${minecraft_version}" accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') runs { @@ -73,7 +76,8 @@ minecraft { } dependencies { - minecraft 'net.minecraftforge:forge:1.18.2-40.0.46' + minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" + runtimeOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}:${jei_version}") } jar { @@ -90,15 +94,12 @@ jar { } } -// Example configuration to allow publishing using the maven-publish task -// we define a custom artifact that is sourced from the reobfJar output task -// and then declare that to be published -// Note you'll need to add a repository here def reobfFile = file("$buildDir/reobfJar/output.jar") def reobfArtifact = artifacts.add('default', reobfFile) { type 'jar' builtBy 'reobfJar' } + publishing { publications { mavenJava(MavenPublication) { diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..05873fa --- /dev/null +++ b/gradle.properties @@ -0,0 +1,19 @@ +# Sets default memory used for gradle commands. Can be overridden by user or command line properties. +# This is required to provide enough memory for the Minecraft decompilation process. +org.gradle.jvmargs = -Xmx3G +org.gradle.daemon = false + +# mod version info +mod_version = 0.6 +minecraft_version = 1.18.2 +forge_version = 40.1.60 + +# build dependency versions +forgegradle_version = 5.1.+ +librarian_version = 1.+ +parchment_version = 2022.07.10 + +# dependency versions +jei_minecraft_version = 1.18.2 +jei_version = 9.5.3.143 + diff --git a/logs/debug.log b/logs/debug.log deleted file mode 100644 index e69de29..0000000 diff --git a/logs/latest.log b/logs/latest.log deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/simibubi/mightyarchitect/AllBlocks.java b/src/main/java/com/simibubi/mightyarchitect/AllBlocks.java index 0217f4a..2d8b344 100644 --- a/src/main/java/com/simibubi/mightyarchitect/AllBlocks.java +++ b/src/main/java/com/simibubi/mightyarchitect/AllBlocks.java @@ -4,10 +4,10 @@ import com.simibubi.mightyarchitect.block.IJustForRendering; import com.simibubi.mightyarchitect.block.SliceMarkerBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.registries.IForgeRegistry; public enum AllBlocks { diff --git a/src/main/java/com/simibubi/mightyarchitect/AllSpecialTextures.java b/src/main/java/com/simibubi/mightyarchitect/AllSpecialTextures.java index a5180e0..55fe80f 100644 --- a/src/main/java/com/simibubi/mightyarchitect/AllSpecialTextures.java +++ b/src/main/java/com/simibubi/mightyarchitect/AllSpecialTextures.java @@ -2,7 +2,6 @@ import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; public enum AllSpecialTextures { diff --git a/src/main/java/com/simibubi/mightyarchitect/MightyClient.java b/src/main/java/com/simibubi/mightyarchitect/MightyClient.java index eb1f5b9..5398b83 100644 --- a/src/main/java/com/simibubi/mightyarchitect/MightyClient.java +++ b/src/main/java/com/simibubi/mightyarchitect/MightyClient.java @@ -8,10 +8,10 @@ import com.simibubi.mightyarchitect.foundation.utility.Keyboard; import com.simibubi.mightyarchitect.foundation.utility.outliner.Outliner; -import net.minecraft.client.Minecraft; import net.minecraft.client.Camera; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.ClientRegistry; diff --git a/src/main/java/com/simibubi/mightyarchitect/TheMightyArchitect.java b/src/main/java/com/simibubi/mightyarchitect/TheMightyArchitect.java index 4729186..5791af0 100644 --- a/src/main/java/com/simibubi/mightyarchitect/TheMightyArchitect.java +++ b/src/main/java/com/simibubi/mightyarchitect/TheMightyArchitect.java @@ -3,8 +3,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import net.minecraft.world.level.block.Block; import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.IEventBus; @@ -36,7 +36,7 @@ public TheMightyArchitect() { } private void clientInit(FMLClientSetupEvent event) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> MightyClient::init); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> MightyClient::init); } private void init(final FMLCommonSetupEvent event) { diff --git a/src/main/java/com/simibubi/mightyarchitect/block/DesignAnchorBlock.java b/src/main/java/com/simibubi/mightyarchitect/block/DesignAnchorBlock.java index 883c26f..898c837 100644 --- a/src/main/java/com/simibubi/mightyarchitect/block/DesignAnchorBlock.java +++ b/src/main/java/com/simibubi/mightyarchitect/block/DesignAnchorBlock.java @@ -1,13 +1,11 @@ package com.simibubi.mightyarchitect.block; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.block.state.StateDefinition.Builder; - -import net.minecraft.world.level.block.state.BlockBehaviour.Properties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Material; public class DesignAnchorBlock extends Block { diff --git a/src/main/java/com/simibubi/mightyarchitect/block/SliceMarkerBlock.java b/src/main/java/com/simibubi/mightyarchitect/block/SliceMarkerBlock.java index 6f5ed60..3c6060c 100644 --- a/src/main/java/com/simibubi/mightyarchitect/block/SliceMarkerBlock.java +++ b/src/main/java/com/simibubi/mightyarchitect/block/SliceMarkerBlock.java @@ -3,23 +3,21 @@ import com.simibubi.mightyarchitect.AllItems; import com.simibubi.mightyarchitect.control.design.DesignSlice.DesignSliceTrait; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction.Axis; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; 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.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.block.state.properties.EnumProperty; -import net.minecraft.world.level.block.state.StateDefinition.Builder; -import net.minecraft.world.InteractionResult; -import net.minecraft.core.Direction.Axis; -import net.minecraft.world.InteractionHand; -import net.minecraft.core.BlockPos; +import net.minecraft.world.level.material.Material; import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.world.level.Level; - -import net.minecraft.world.level.block.state.BlockBehaviour.Properties; public class SliceMarkerBlock extends Block { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/ArchitectKits.java b/src/main/java/com/simibubi/mightyarchitect/control/ArchitectKits.java index 072f6f4..300149b 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/ArchitectKits.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/ArchitectKits.java @@ -7,12 +7,12 @@ import com.simibubi.mightyarchitect.control.palette.Palette; import com.simibubi.mightyarchitect.networking.SetHotbarItemPacket; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.TextComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.ChatFormatting; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; public class ArchitectKits { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/ArchitectManager.java b/src/main/java/com/simibubi/mightyarchitect/control/ArchitectManager.java index e4bebc0..8db8cbb 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/ArchitectManager.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/ArchitectManager.java @@ -9,8 +9,8 @@ import org.apache.commons.io.IOUtils; import org.lwjgl.glfw.GLFW; -import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.AllPackets; import com.simibubi.mightyarchitect.MightyClient; import com.simibubi.mightyarchitect.control.compose.GroundPlan; @@ -33,13 +33,13 @@ import com.simibubi.mightyarchitect.gui.ThemeSettingsScreen; import com.simibubi.mightyarchitect.networking.InstantPrintPacket; +import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; -import net.minecraft.core.BlockPos; import net.minecraft.network.chat.TextComponent; -import net.minecraft.ChatFormatting; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.InputEvent.KeyInputEvent; import net.minecraftforge.client.event.InputEvent.MouseInputEvent; diff --git a/src/main/java/com/simibubi/mightyarchitect/control/ArchitectMenu.java b/src/main/java/com/simibubi/mightyarchitect/control/ArchitectMenu.java index af3bc33..36fc75d 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/ArchitectMenu.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/ArchitectMenu.java @@ -16,8 +16,8 @@ import com.simibubi.mightyarchitect.gui.TextInputPromptScreen; import com.simibubi.mightyarchitect.gui.ThemeSettingsScreen; -import net.minecraft.client.Minecraft; import net.minecraft.Util; +import net.minecraft.client.Minecraft; public class ArchitectMenu { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/Schematic.java b/src/main/java/com/simibubi/mightyarchitect/control/Schematic.java index b56a409..66bae4e 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/Schematic.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/Schematic.java @@ -15,9 +15,9 @@ import com.simibubi.mightyarchitect.control.palette.PaletteDefinition; import com.simibubi.mightyarchitect.networking.InstantPrintPacket; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; public class Schematic { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/SchematicRenderer.java b/src/main/java/com/simibubi/mightyarchitect/control/SchematicRenderer.java index 85594db..7724884 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/SchematicRenderer.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/SchematicRenderer.java @@ -5,23 +5,21 @@ import java.util.Map; import java.util.Set; -import org.lwjgl.opengl.GL11; - +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexFormat; import com.simibubi.mightyarchitect.foundation.MatrixStacker; import com.simibubi.mightyarchitect.foundation.SuperByteBuffer; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.BlockRenderDispatcher; -import com.mojang.blaze3d.vertex.BufferBuilder; +import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.ItemBlockRenderTypes; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.model.data.EmptyModelData; diff --git a/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java b/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java index 95c6ba8..848e10b 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/TemplateBlockAccess.java @@ -11,25 +11,25 @@ import com.simibubi.mightyarchitect.control.compose.Cuboid; import com.simibubi.mightyarchitect.foundation.WrappedWorld; -import net.minecraft.core.Holder; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.client.Minecraft; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.sounds.SoundSource; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.phys.AABB; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; import net.minecraft.core.Registry; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biomes; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.phys.AABB; import net.minecraft.world.ticks.BlackholeTickAccess; import net.minecraft.world.ticks.LevelTickAccess; diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/Cuboid.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/Cuboid.java index a8721ce..517605b 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/Cuboid.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/Cuboid.java @@ -1,9 +1,9 @@ package com.simibubi.mightyarchitect.control.compose; -import net.minecraft.core.Direction; -import net.minecraft.world.phys.AABB; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.phys.AABB; public class Cuboid { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/Room.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/Room.java index b9e8031..da6386f 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/Room.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/Room.java @@ -3,8 +3,8 @@ import com.simibubi.mightyarchitect.control.design.DesignLayer; import com.simibubi.mightyarchitect.control.design.DesignType; -import net.minecraft.core.Direction.Axis; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction.Axis; public class Room extends Cuboid { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/ComposerToolBase.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/ComposerToolBase.java index 5fd7c2d..6761b29 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/ComposerToolBase.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/ComposerToolBase.java @@ -2,8 +2,9 @@ import org.lwjgl.glfw.GLFW; -import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.control.ArchitectManager; import com.simibubi.mightyarchitect.control.Schematic; import com.simibubi.mightyarchitect.control.compose.GroundPlan; @@ -13,13 +14,12 @@ import com.simibubi.mightyarchitect.foundation.utility.RaycastHelper; import com.simibubi.mightyarchitect.foundation.utility.RaycastHelper.PredicateTraceResult; -import com.mojang.blaze3d.platform.Window; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.core.Direction; import net.minecraft.core.BlockPos; -import net.minecraft.util.Mth; +import net.minecraft.core.Direction; import net.minecraft.network.chat.TextComponent; +import net.minecraft.util.Mth; public abstract class ComposerToolBase implements IComposerTool { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CopyDesignTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CopyDesignTool.java index 08e61d2..f682f2c 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CopyDesignTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CopyDesignTool.java @@ -14,11 +14,11 @@ import com.simibubi.mightyarchitect.control.design.partials.Design; import com.simibubi.mightyarchitect.foundation.utility.Keyboard; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.phys.AABB; -import net.minecraft.core.BlockPos; -import net.minecraft.ChatFormatting; public class CopyDesignTool extends WallDecorationToolBase { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CylinderRoomTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CylinderRoomTool.java index 8dc61e6..451a9a2 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CylinderRoomTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/CylinderRoomTool.java @@ -15,8 +15,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.world.phys.AABB; import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult.Type; diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/GroundPlanningToolBase.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/GroundPlanningToolBase.java index 09cccc5..aada8f7 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/GroundPlanningToolBase.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/GroundPlanningToolBase.java @@ -17,10 +17,10 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.InteractionHand; -import net.minecraft.core.BlockPos; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult.Type; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/MoveReshapeTool.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/MoveReshapeTool.java index 0a62fea..6788448 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/MoveReshapeTool.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/MoveReshapeTool.java @@ -9,8 +9,8 @@ import com.simibubi.mightyarchitect.control.design.ThemeStatistics; import com.simibubi.mightyarchitect.foundation.utility.Keyboard; -import net.minecraft.core.BlockPos; import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; public class MoveReshapeTool extends AbstractRoomFaceSelectionTool { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/WallDecorationToolBase.java b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/WallDecorationToolBase.java index 3e9e71e..05219bf 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/WallDecorationToolBase.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/compose/planner/WallDecorationToolBase.java @@ -4,9 +4,9 @@ import com.simibubi.mightyarchitect.control.compose.Cuboid; import com.simibubi.mightyarchitect.control.compose.Room; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.phys.AABB; -import net.minecraft.core.BlockPos; public abstract class WallDecorationToolBase extends ComposerToolBase { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/DesignExporter.java b/src/main/java/com/simibubi/mightyarchitect/control/design/DesignExporter.java index c57e2ad..7d99bb5 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/DesignExporter.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/DesignExporter.java @@ -18,16 +18,16 @@ import com.simibubi.mightyarchitect.foundation.utility.FilesHelper; import com.simibubi.mightyarchitect.networking.PlaceSignPacket; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtUtils; -import net.minecraft.world.level.block.entity.SignBlockEntity; -import net.minecraft.core.BlockPos; import net.minecraft.network.chat.TextComponent; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.world.level.block.state.BlockState; public class DesignExporter { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/DesignResourceLoader.java b/src/main/java/com/simibubi/mightyarchitect/control/design/DesignResourceLoader.java index 36a9a01..ea2dddc 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/DesignResourceLoader.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/DesignResourceLoader.java @@ -17,8 +17,8 @@ import com.simibubi.mightyarchitect.foundation.utility.FilesHelper; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtIo; public class DesignResourceLoader { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/DesignSlice.java b/src/main/java/com/simibubi/mightyarchitect/control/design/DesignSlice.java index a1dc7d4..0c91321 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/DesignSlice.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/DesignSlice.java @@ -9,9 +9,9 @@ import com.simibubi.mightyarchitect.control.palette.Palette; import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.nbt.CompoundTag; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.nbt.CompoundTag; import net.minecraft.util.StringRepresentable; public class DesignSlice { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeStorage.java b/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeStorage.java index 555a2f9..2371734 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeStorage.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeStorage.java @@ -19,8 +19,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtIo; public class ThemeStorage { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeValidator.java b/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeValidator.java index 44eb2d6..d2602ce 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeValidator.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/ThemeValidator.java @@ -7,11 +7,11 @@ import com.simibubi.mightyarchitect.foundation.utility.DesignHelper; +import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; -import net.minecraft.ChatFormatting; public class ThemeValidator { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Corner.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Corner.java index cc95865..318388e 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Corner.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Corner.java @@ -6,10 +6,8 @@ import com.simibubi.mightyarchitect.control.design.DesignSlice; import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.nbt.CompoundTag; import net.minecraft.core.BlockPos; - -import com.simibubi.mightyarchitect.control.design.partials.Design.DesignInstance; +import net.minecraft.nbt.CompoundTag; public class Corner extends Design { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Design.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Design.java index 714397a..ec60059 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Design.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Design.java @@ -10,10 +10,10 @@ import com.simibubi.mightyarchitect.control.design.DesignSlice.DesignSliceTrait; import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtUtils; -import net.minecraft.core.BlockPos; public abstract class Design { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Facade.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Facade.java index 76b3937..4fba748 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Facade.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Facade.java @@ -2,8 +2,6 @@ import net.minecraft.nbt.CompoundTag; -import com.simibubi.mightyarchitect.control.design.partials.Wall.ExpandBehaviour; - public class Facade extends Wall { @Override diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/FlatRoof.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/FlatRoof.java index 94e7248..fdbb73e 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/FlatRoof.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/FlatRoof.java @@ -6,10 +6,8 @@ import com.simibubi.mightyarchitect.control.design.DesignSlice; import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.nbt.CompoundTag; import net.minecraft.core.BlockPos; - -import com.simibubi.mightyarchitect.control.design.partials.Design.DesignInstance; +import net.minecraft.nbt.CompoundTag; public class FlatRoof extends Design { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Roof.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Roof.java index 979c66c..103fd50 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Roof.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Roof.java @@ -6,10 +6,8 @@ import com.simibubi.mightyarchitect.control.design.DesignSlice; import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.nbt.CompoundTag; import net.minecraft.core.BlockPos; - -import com.simibubi.mightyarchitect.control.design.partials.Design.DesignInstance; +import net.minecraft.nbt.CompoundTag; public class Roof extends Design { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Tower.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Tower.java index a9680da..47a203a 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Tower.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Tower.java @@ -4,10 +4,8 @@ import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.nbt.CompoundTag; import net.minecraft.core.BlockPos; - -import com.simibubi.mightyarchitect.control.design.partials.Design.DesignInstance; +import net.minecraft.nbt.CompoundTag; public class Tower extends Design { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/TowerRoof.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/TowerRoof.java index 34f2482..b2a6f58 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/TowerRoof.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/TowerRoof.java @@ -4,10 +4,8 @@ import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.nbt.CompoundTag; import net.minecraft.core.BlockPos; - -import com.simibubi.mightyarchitect.control.design.partials.Design.DesignInstance; +import net.minecraft.nbt.CompoundTag; public class TowerRoof extends Tower { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Wall.java b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Wall.java index 1a02ce1..ec8e501 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Wall.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/design/partials/Wall.java @@ -4,10 +4,8 @@ import com.simibubi.mightyarchitect.control.palette.PaletteBlockInfo; -import net.minecraft.nbt.CompoundTag; import net.minecraft.core.BlockPos; - -import com.simibubi.mightyarchitect.control.design.partials.Design.DesignInstance; +import net.minecraft.nbt.CompoundTag; public class Wall extends Design { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/palette/BlockOrientation.java b/src/main/java/com/simibubi/mightyarchitect/control/palette/BlockOrientation.java index a51c4d0..1279b94 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/palette/BlockOrientation.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/palette/BlockOrientation.java @@ -1,17 +1,17 @@ package com.simibubi.mightyarchitect.control.palette; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.SlabBlock; -import net.minecraft.world.level.block.TrapDoorBlock; import net.minecraft.client.Minecraft; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.Half; -import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; import net.minecraft.world.level.block.Rotation; -import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.TrapDoorBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.Half; +import net.minecraft.world.level.block.state.properties.SlabType; public enum BlockOrientation { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteDefinition.java b/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteDefinition.java index babf169..c640636 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteDefinition.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/palette/PaletteDefinition.java @@ -4,18 +4,18 @@ import java.util.HashMap; import java.util.Map; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.TrapDoorBlock; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.DirectionProperty; import net.minecraft.world.level.block.state.properties.Property; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; public class PaletteDefinition { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseComposing.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseComposing.java index 6d7c8c4..995cb17 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseComposing.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseComposing.java @@ -16,7 +16,6 @@ import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; -import net.minecraft.client.Options; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; @@ -70,7 +69,8 @@ public void onClick(int button) { @Override public void onKey(int key, boolean released) { - if (key == MightyClient.TOOL_MENU.getKey().getValue()) { + if (key == MightyClient.TOOL_MENU.getKey() + .getValue()) { if (released && toolSelection.focused) { toolSelection.focused = false; toolSelection.onClose(); @@ -86,7 +86,10 @@ public void onKey(int key, boolean released) { return; if (toolSelection.focused) { - Optional mapping = Arrays.stream(Minecraft.getInstance().options.keyHotbarSlots).filter(keyMapping -> keyMapping.getKey().getValue() == key).findFirst(); + Optional mapping = Arrays.stream(Minecraft.getInstance().options.keyHotbarSlots) + .filter(keyMapping -> keyMapping.getKey() + .getValue() == key) + .findFirst(); if (mapping.isEmpty()) return; @@ -95,7 +98,8 @@ public void onKey(int key, boolean released) { return; } - activeTool.getTool().handleKeyInput(key); + activeTool.getTool() + .handleKeyInput(key); } @Override @@ -123,7 +127,8 @@ public void renderGameOverlay(Pre event) { return; PoseStack ms = event.getMatrixStack(); - toolSelection.renderPassive(ms, event.getPartialTicks()); + toolSelection.renderPassive(ms, Minecraft.getInstance() + .getDeltaFrameTime()); activeTool.getTool() .renderOverlay(ms); } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseCreatingPalette.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseCreatingPalette.java index d451825..e79381c 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseCreatingPalette.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhaseCreatingPalette.java @@ -10,21 +10,18 @@ import com.simibubi.mightyarchitect.control.Schematic; import com.simibubi.mightyarchitect.control.palette.Palette; import com.simibubi.mightyarchitect.control.palette.PaletteDefinition; -import com.simibubi.mightyarchitect.foundation.utility.RaycastHelper; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.TrapDoorBlock; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.world.phys.AABB; import net.minecraft.core.BlockPos; -import net.minecraft.world.phys.HitResult; -import net.minecraft.world.phys.HitResult.Type; import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.level.block.TrapDoorBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.model.data.EmptyModelData; -import net.minecraftforge.common.ForgeMod; public class PhaseCreatingPalette extends PhaseBase implements IDrawBlockHighlights { @@ -127,26 +124,27 @@ protected void notifyChange() { @Override public void tickHighlightOutlines() { - BlockPos targetBlock = null; - - HitResult raytrace = RaycastHelper.rayTraceRange(minecraft.level, minecraft.player, - minecraft.player.getAttributeValue(ForgeMod.REACH_DISTANCE.get())); - if (raytrace != null && raytrace.getType() == Type.BLOCK) { - targetBlock = new BlockPos(raytrace.getLocation()); - if (grid.containsKey(targetBlock)) - sendStatusMessage(grid.get(targetBlock) - .getDisplayName()); - } + Vec3 from = minecraft.player.getEyePosition(); + Vec3 to = from.add(minecraft.player.getLookAngle() + .normalize() + .scale(10)); for (int i = 0; i < 16; i++) { BlockPos pos = positionFromIndex(i); + AABB bb = new AABB(pos); // Render Outline - boolean s = targetBlock != null && pos.equals(targetBlock); boolean b = changed[i]; - MightyClient.outliner.showAABB("pallete" + i, new AABB(pos)) - .lineWidth(b || s ? 1 / 16f : 1 / 32f) - .colored(s ? 0x8888ff : b ? 0x6666ff : 0xbbbbbb); + boolean s = bb.clip(from, to) + .isPresent(); + + if (s) + sendStatusMessage(grid.get(pos) + .getDisplayName()); + + MightyClient.outliner.showAABB("pallete" + i, bb) + .lineWidth(b || s ? 1 / 16f : 1 / 24f) + .colored(s ? 0x6677ee : b ? 0xccccdd : 0x666677); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePaused.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePaused.java index 22a04ae..d773007 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePaused.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/PhasePaused.java @@ -6,11 +6,11 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.MightyClient; +import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.network.chat.TextComponent; -import net.minecraft.ChatFormatting; public class PhasePaused extends PhaseBase { diff --git a/src/main/java/com/simibubi/mightyarchitect/control/phase/PrintingToMultiplayer.java b/src/main/java/com/simibubi/mightyarchitect/control/phase/PrintingToMultiplayer.java index 9fa5520..bb1978e 100644 --- a/src/main/java/com/simibubi/mightyarchitect/control/phase/PrintingToMultiplayer.java +++ b/src/main/java/com/simibubi/mightyarchitect/control/phase/PrintingToMultiplayer.java @@ -9,15 +9,15 @@ import com.simibubi.mightyarchitect.control.ArchitectManager; import com.simibubi.mightyarchitect.control.TemplateBlockAccess; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.BlockPos; -import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; -import net.minecraft.ChatFormatting; import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.ClientChatReceivedEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/MatrixStacker.java b/src/main/java/com/simibubi/mightyarchitect/foundation/MatrixStacker.java index c3e1cce..8e3f8f8 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/MatrixStacker.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/MatrixStacker.java @@ -1,13 +1,13 @@ package com.simibubi.mightyarchitect.foundation; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Vector3f; import com.simibubi.mightyarchitect.foundation.utility.AngleHelper; import com.simibubi.mightyarchitect.foundation.utility.VecHelper; import net.minecraft.core.BlockPos; -import net.minecraft.world.phys.Vec3; -import com.mojang.math.Vector3f; import net.minecraft.core.Vec3i; +import net.minecraft.world.phys.Vec3; public class MatrixStacker { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/RenderTypes.java b/src/main/java/com/simibubi/mightyarchitect/foundation/RenderTypes.java index 5a7fa37..79131ea 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/RenderTypes.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/RenderTypes.java @@ -1,16 +1,15 @@ package com.simibubi.mightyarchitect.foundation; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; import com.simibubi.mightyarchitect.AllSpecialTextures; +import com.simibubi.mightyarchitect.TheMightyArchitect; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.simibubi.mightyarchitect.TheMightyArchitect; - -import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.InventoryMenu; public class RenderTypes extends RenderStateShard { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/SpriteShiftEntry.java b/src/main/java/com/simibubi/mightyarchitect/foundation/SpriteShiftEntry.java index c722e65..ea856ff 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/SpriteShiftEntry.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/SpriteShiftEntry.java @@ -4,8 +4,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.InventoryMenu; public class SpriteShiftEntry { protected ResourceLocation originalTextureLocation; diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBuffer.java b/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBuffer.java index fceed05..99ab407 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBuffer.java @@ -3,21 +3,20 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferBuilder.DrawState; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.datafixers.util.Pair; +import com.mojang.math.Matrix4f; +import com.mojang.math.Vector4f; import net.minecraft.client.Minecraft; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.BufferBuilder.DrawState; -import com.mojang.blaze3d.platform.MemoryTracker; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.core.Direction; import net.minecraft.core.BlockPos; -import com.mojang.math.Matrix4f; -import com.mojang.math.Vector4f; -import net.minecraft.world.level.LightLayer; +import net.minecraft.core.Direction; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LightLayer; public class SuperByteBuffer { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBufferCache.java b/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBufferCache.java index 9370c10..8e4cf13 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBufferCache.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/SuperByteBufferCache.java @@ -7,23 +7,20 @@ import java.util.concurrent.TimeUnit; import java.util.function.Supplier; -import org.lwjgl.opengl.GL11; - import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexFormat; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.BlockRenderDispatcher; -import com.mojang.blaze3d.vertex.BufferBuilder; -import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.texture.OverlayTexture; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.VertexFormat; - +import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.client.model.data.EmptyModelData; public class SuperByteBufferCache { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/SuperRenderTypeBuffer.java b/src/main/java/com/simibubi/mightyarchitect/foundation/SuperRenderTypeBuffer.java index 8e43490..c01ef0f 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/SuperRenderTypeBuffer.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/SuperRenderTypeBuffer.java @@ -2,17 +2,16 @@ import java.util.SortedMap; -import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.VertexConsumer; import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; -import net.minecraft.client.renderer.Sheets; -import com.mojang.blaze3d.vertex.BufferBuilder; -import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.Util; import net.minecraft.client.renderer.ChunkBufferBuilderPack; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Sheets; import net.minecraft.client.resources.model.ModelBakery; -import net.minecraft.Util; public class SuperRenderTypeBuffer implements MultiBufferSource { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java b/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java index 7e1cb1c..07ddb68 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/WrappedWorld.java @@ -8,31 +8,30 @@ import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.core.Holder; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.RegistryAccess; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkSource; import net.minecraft.world.level.entity.EntityTypeTest; import net.minecraft.world.level.entity.LevelEntityGetter; import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; +import net.minecraft.world.level.storage.WritableLevelData; import net.minecraft.world.phys.AABB; import net.minecraft.world.scores.Scoreboard; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.core.Direction; -import net.minecraft.sounds.SoundSource; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.core.BlockPos; -import net.minecraft.core.RegistryAccess; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.chunk.ChunkSource; -import net.minecraft.world.level.storage.WritableLevelData; -import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.minecraft.world.ticks.LevelTickAccess; -import net.minecraftforge.registries.tags.ITagManager; public class WrappedWorld extends Level { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/AngleHelper.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/AngleHelper.java index c26d678..027a287 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/AngleHelper.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/AngleHelper.java @@ -1,22 +1,14 @@ package com.simibubi.mightyarchitect.foundation.utility; -import com.mojang.blaze3d.vertex.PoseStack; - import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; -import com.mojang.math.Vector3f; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraft.util.Mth; public class AngleHelper { - - @OnlyIn(Dist.CLIENT) - public static void applyRotation(Direction direction, PoseStack ms) { - ms.mulPose(Vector3f.YP.rotationDegrees(AngleHelper.horizontalAngle(direction))); - ms.mulPose(Vector3f.XP.rotationDegrees(AngleHelper.verticalAngle(direction))); - } public static float horizontalAngle(Direction facing) { + if (facing.getAxis().isVertical()) + return 0; float angle = facing.toYRot(); if (facing.getAxis() == Axis.X) angle = -angle; @@ -28,15 +20,19 @@ public static float verticalAngle(Direction facing) { } public static float rad(double angle) { + if (angle == 0) + return 0; return (float) (angle / 180 * Math.PI); } public static float deg(double angle) { + if (angle == 0) + return 0; return (float) (angle * 180 / Math.PI); } - public static float angleLerp(float pct, float current, float target) { - return current + getShortestAngleDiff(current, target) * pct; + public static float angleLerp(double pct, double current, double target) { + return (float) (current + getShortestAngleDiff(current, target) * pct); } public static float getShortestAngleDiff(double current, double target) { @@ -45,4 +41,12 @@ public static float getShortestAngleDiff(double current, double target) { return (float) (((((target - current) % 360) + 540) % 360) - 180); } + public static float getShortestAngleDiff(double current, double target, float hint) { + float diff = getShortestAngleDiff(current, target); + if (Mth.equal(Math.abs(diff), 180) && Math.signum(diff) != Math.signum(hint)) { + return diff + 360*Math.signum(hint); + } + return diff; + } + } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/ColorHelper.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/ColorHelper.java index 6406ce1..e074a23 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/ColorHelper.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/ColorHelper.java @@ -2,8 +2,6 @@ import java.util.UUID; -import com.mojang.blaze3d.systems.RenderSystem; - import net.minecraft.world.phys.Vec3; public class ColorHelper { @@ -43,19 +41,6 @@ public static int mixColors(int color1, int color2, float w) { return color; } - public static void glColor(int color) { - color = mixColors(color, 0xFFFFFF, .5f); - int r = (color >> 16); - int g = (color >> 8) & 0xFF; - int b = color & 0xFF; - - //RenderSystem.color4f(r / 256f, g / 256f, b / 256f, 1); - } - - public static void glResetColor() { - //RenderSystem.color4f(1, 1, 1, 1); - } - public static Vec3 getRGB(int color) { int r = (color >> 16); int g = (color >> 8) & 0xFF; diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/FilesHelper.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/FilesHelper.java index a863582..937b291 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/FilesHelper.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/FilesHelper.java @@ -44,7 +44,8 @@ public static String findFirstValidFilename(String name, String folderPath, Stri } public static String slug(String name) { - return name.toLowerCase().replace(' ', '_'); + return name.toLowerCase() + .replace(' ', '_'); } public static boolean saveTagCompoundAsJson(CompoundTag compound, String path) { @@ -52,7 +53,7 @@ public static boolean saveTagCompoundAsJson(CompoundTag compound, String path) { Files.deleteIfExists(Paths.get(path)); JsonWriter writer = new JsonWriter(Files.newBufferedWriter(Paths.get(path), StandardOpenOption.CREATE)); writer.setIndent(" "); - Streams.write(new JsonParser().parse(compound.toString()), writer); + Streams.write(JsonParser.parseString(compound.toString()), writer); writer.close(); return true; } catch (IOException e) { @@ -60,20 +61,19 @@ public static boolean saveTagCompoundAsJson(CompoundTag compound, String path) { } return false; } - public static boolean saveTagCompoundAsJsonCompact(CompoundTag compound, String path) { try { Files.deleteIfExists(Paths.get(path)); JsonWriter writer = new JsonWriter(Files.newBufferedWriter(Paths.get(path), StandardOpenOption.CREATE)); - Streams.write(new JsonParser().parse(compound.toString()), writer); + Streams.write(JsonParser.parseString(compound.toString()), writer); writer.close(); return true; } catch (IOException e) { e.printStackTrace(); } return false; - + } public static CompoundTag loadJsonNBT(InputStream inputStream) { @@ -93,7 +93,8 @@ public static CompoundTag loadJsonNBT(InputStream inputStream) { } public static CompoundTag loadJsonResourceAsNBT(String filepath) { - return loadJsonNBT(TheMightyArchitect.class.getClassLoader().getResourceAsStream(filepath)); + return loadJsonNBT(TheMightyArchitect.class.getClassLoader() + .getResourceAsStream(filepath)); } public static CompoundTag loadJsonAsNBT(String filepath) { @@ -105,5 +106,4 @@ public static CompoundTag loadJsonAsNBT(String filepath) { return null; } - } diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Iterate.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Iterate.java index 195cd12..90a5c75 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Iterate.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Iterate.java @@ -3,9 +3,9 @@ import java.util.Arrays; import java.util.List; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; -import net.minecraft.core.BlockPos; public class Iterate { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Keyboard.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Keyboard.java index 0f557e8..a6d9a83 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Keyboard.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Keyboard.java @@ -1,7 +1,8 @@ package com.simibubi.mightyarchitect.foundation.utility; -import net.minecraft.client.Minecraft; import com.mojang.blaze3d.platform.InputConstants; + +import net.minecraft.client.Minecraft; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Lang.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Lang.java new file mode 100644 index 0000000..307acdb --- /dev/null +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/Lang.java @@ -0,0 +1,85 @@ +package com.simibubi.mightyarchitect.foundation.utility; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import com.simibubi.mightyarchitect.TheMightyArchitect; + +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.fluids.FluidStack; + +public class Lang { + + public static String asId(String name) { + return name.toLowerCase(Locale.ROOT); + } + + public static String nonPluralId(String name) { + String asId = asId(name); + return asId.endsWith("s") ? asId.substring(0, asId.length() - 1) : asId; + } + + public static List translatedOptions(String prefix, String... keys) { + List result = new ArrayList<>(keys.length); + for (String key : keys) + result.add(translate((prefix != null ? prefix + "." : "") + key).component()); + return result; + } + + public static Component empty() { + return TextComponent.EMPTY; + } + + // + + public static LangBuilder builder() { + return new LangBuilder(TheMightyArchitect.ID); + } + + public static LangBuilder builder(String namespace) { + return new LangBuilder(namespace); + } + + // + + public static LangBuilder blockName(BlockState state) { + return builder().add(state.getBlock() + .getName()); + } + + public static LangBuilder itemName(ItemStack stack) { + return builder().add(stack.getHoverName() + .copy()); + } + + public static LangBuilder fluidName(FluidStack stack) { + return builder().add(stack.getDisplayName() + .copy()); + } + + public static LangBuilder number(double d) { + return builder().text(LangNumberFormat.format(d)); + } + + public static LangBuilder translate(String langKey, Object... args) { + return builder().translate(langKey, args); + } + + public static LangBuilder text(String text) { + return builder().text(text); + } + + // + + public static Object[] resolveBuilders(Object[] args) { + for (int i = 0; i < args.length; i++) + if (args[i]instanceof LangBuilder cb) + args[i] = cb.component(); + return args; + } + +} diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/LangBuilder.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/LangBuilder.java new file mode 100644 index 0000000..e32bf4f --- /dev/null +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/LangBuilder.java @@ -0,0 +1,167 @@ +package com.simibubi.mightyarchitect.foundation.utility; + +import java.util.List; + +import joptsimple.internal.Strings; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.entity.player.Player; + +public class LangBuilder { + + String namespace; + MutableComponent component; + + public LangBuilder(String namespace) { + this.namespace = namespace; + } + + public LangBuilder space() { + return text(" "); + } + + public LangBuilder newLine() { + return text("\n"); + } + + /** + * Appends a localised component
+ * To add an independently formatted localised component, use add() and a nested + * builder + * + * @param langKey + * @param args + * @return + */ + public LangBuilder translate(String langKey, Object... args) { + return add(new TranslatableComponent(namespace + "." + langKey, Lang.resolveBuilders(args))); + } + + /** + * Appends a text component + * + * @param literalText + * @return + */ + public LangBuilder text(String literalText) { + return add(new TextComponent(literalText)); + } + + /** + * Appends a colored text component + * + * @param format + * @param literalText + * @return + */ + public LangBuilder text(ChatFormatting format, String literalText) { + return add(new TextComponent(literalText).withStyle(format)); + } + + /** + * Appends a colored text component + * + * @param color + * @param literalText + * @return + */ + public LangBuilder text(int color, String literalText) { + return add(new TextComponent(literalText).withStyle(s -> s.withColor(color))); + } + + /** + * Appends the contents of another builder + * + * @param otherBuilder + * @return + */ + public LangBuilder add(LangBuilder otherBuilder) { + return add(otherBuilder.component()); + } + + /** + * Appends a component + * + * @param customComponent + * @return + */ + public LangBuilder add(MutableComponent customComponent) { + component = component == null ? customComponent : component.append(customComponent); + return this; + } + + // + + /** + * Applies the format to all added components + * + * @param format + * @return + */ + public LangBuilder style(ChatFormatting format) { + assertComponent(); + component = component.withStyle(format); + return this; + } + + /** + * Applies the color to all added components + * + * @param color + * @return + */ + public LangBuilder color(int color) { + assertComponent(); + component = component.withStyle(s -> s.withColor(color)); + return this; + } + + // + + public MutableComponent component() { + assertComponent(); + return component; + } + + public String string() { + return component().getString(); + } + + public String json() { + return Component.Serializer.toJson(component()); + } + + public void sendStatus(Player player) { + player.displayClientMessage(component(), true); + } + + public void sendChat(Player player) { + player.displayClientMessage(component(), false); + } + + public void addTo(List tooltip) { + tooltip.add(component()); + } + + public void forGoggles(List tooltip) { + forGoggles(tooltip, 0); + } + + public void forGoggles(List tooltip, int indents) { + tooltip.add(Lang.builder() + .text(Strings.repeat(' ', 4 + indents)) + .add(this) + .component()); + } + + // + + private void assertComponent() { + if (component == null) + throw new IllegalStateException("No components were added to builder"); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/LangNumberFormat.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/LangNumberFormat.java new file mode 100644 index 0000000..56976d7 --- /dev/null +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/LangNumberFormat.java @@ -0,0 +1,33 @@ +package com.simibubi.mightyarchitect.foundation.utility; + +import java.text.NumberFormat; +import java.util.Locale; + +import net.minecraft.client.Minecraft; + +public class LangNumberFormat { + + private NumberFormat format = NumberFormat.getNumberInstance(Locale.ROOT); + public static LangNumberFormat numberFormat = new LangNumberFormat(); + + public NumberFormat get() { + return format; + } + + public void update() { + format = NumberFormat.getInstance(Minecraft.getInstance() + .getLanguageManager() + .getSelected() + .getJavaLocale()); + format.setMaximumFractionDigits(2); + format.setMinimumFractionDigits(0); + format.setGroupingUsed(true); + } + + public static String format(double d) { + return numberFormat.get() + .format(d) + .replace("\u00A0", " "); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/LerpedFloat.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/LerpedFloat.java new file mode 100644 index 0000000..032c73c --- /dev/null +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/LerpedFloat.java @@ -0,0 +1,148 @@ +package com.simibubi.mightyarchitect.foundation.utility; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; + +public class LerpedFloat { + + protected Interpolator interpolator; + protected float previousValue; + protected float value; + + protected Chaser chaseFunction; + protected float chaseTarget; + protected float chaseSpeed; + protected boolean angularChase; + + protected boolean forcedSync; + + public LerpedFloat(Interpolator interpolator) { + this.interpolator = interpolator; + startWithValue(0); + forcedSync = true; + } + + public static LerpedFloat linear() { + return new LerpedFloat((p, c, t) -> (float) Mth.lerp(p, c, t)); + } + + public static LerpedFloat angular() { + LerpedFloat lerpedFloat = new LerpedFloat(AngleHelper::angleLerp); + lerpedFloat.angularChase = true; + return lerpedFloat; + } + + public LerpedFloat startWithValue(double value) { + float f = (float) value; + this.previousValue = f; + this.chaseTarget = f; + this.value = f; + return this; + } + + public LerpedFloat chase(double value, double speed, Chaser chaseFunction) { + updateChaseTarget((float) value); + this.chaseSpeed = (float) speed; + this.chaseFunction = chaseFunction; + return this; + } + + public LerpedFloat disableSmartAngleChasing() { + angularChase = false; + return this; + } + + public void updateChaseTarget(float target) { + if (angularChase) + target = value + AngleHelper.getShortestAngleDiff(value, target); + this.chaseTarget = target; + } + + public boolean updateChaseSpeed(double speed) { + float prevSpeed = this.chaseSpeed; + this.chaseSpeed = (float) speed; + return !Mth.equal(prevSpeed, speed); + } + + public void tickChaser() { + previousValue = value; + if (chaseFunction == null) + return; + if (Mth.equal((double) value, chaseTarget)) { + value = chaseTarget; + return; + } + value = chaseFunction.chase(value, chaseSpeed, chaseTarget); + } + + public void setValueNoUpdate(double value) { + this.value = (float) value; + } + + public void setValue(double value) { + this.previousValue = this.value; + this.value = (float) value; + } + + public float getValue() { + return getValue(1); + } + + public float getValue(float partialTicks) { + return interpolator.interpolate(partialTicks, previousValue, value); + } + + public boolean settled() { + return Mth.equal((double) previousValue, value); + } + + public float getChaseTarget() { + return chaseTarget; + } + + public void forceNextSync() { + forcedSync = true; + } + + public CompoundTag writeNBT() { + CompoundTag compoundNBT = new CompoundTag(); + compoundNBT.putFloat("Speed", chaseSpeed); + compoundNBT.putFloat("Target", chaseTarget); + compoundNBT.putFloat("Value", value); + if (forcedSync) + compoundNBT.putBoolean("Force", true); + forcedSync = false; + return compoundNBT; + } + + public void readNBT(CompoundTag compoundNBT, boolean clientPacket) { + if (!clientPacket || compoundNBT.contains("Force")) + startWithValue(compoundNBT.getFloat("Value")); + readChaser(compoundNBT); + } + + protected void readChaser(CompoundTag compoundNBT) { + chaseSpeed = compoundNBT.getFloat("Speed"); + chaseTarget = compoundNBT.getFloat("Target"); + } + + @FunctionalInterface + public interface Interpolator { + float interpolate(double progress, double current, double target); + } + + @FunctionalInterface + public interface Chaser { + + Chaser IDLE = (c, s, t) -> (float) c; + Chaser EXP = exp(Double.MAX_VALUE); + Chaser LINEAR = (c, s, t) -> (float) (c + Mth.clamp(t - c, -s, s)); + + static Chaser exp(double maxEffectiveSpeed) { + return (c, s, t) -> (float) (c + Mth.clamp((t - c) * s, -maxEffectiveSpeed, maxEffectiveSpeed)); + } + + float chase(double current, double speed, double target); + } + +} diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/RaycastHelper.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/RaycastHelper.java index 3182079..b7dd4c8 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/RaycastHelper.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/RaycastHelper.java @@ -2,16 +2,16 @@ import java.util.function.Predicate; -import net.minecraft.world.entity.player.Player; -import net.minecraft.core.Direction; import net.minecraft.core.BlockPos; -import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.core.Direction; import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.ClipContext.Block; import net.minecraft.world.level.ClipContext.Fluid; -import net.minecraft.world.phys.Vec3; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; public class RaycastHelper { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/VecHelper.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/VecHelper.java index 2ac0e2d..8bb42e8 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/VecHelper.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/VecHelper.java @@ -4,14 +4,14 @@ import javax.annotation.Nullable; -import net.minecraft.nbt.DoubleTag; -import net.minecraft.nbt.ListTag; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; -import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; +import net.minecraft.nbt.DoubleTag; +import net.minecraft.nbt.ListTag; import net.minecraft.util.Mth; import net.minecraft.world.phys.Vec3; -import net.minecraft.core.Vec3i; public class VecHelper { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/AABBOutline.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/AABBOutline.java index 91f7a50..59aa1ca 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/AABBOutline.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/AABBOutline.java @@ -1,7 +1,5 @@ package com.simibubi.mightyarchitect.foundation.utility.outliner; -import org.apache.logging.log4j.LogManager; - import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.mightyarchitect.foundation.RenderTypes; @@ -28,7 +26,8 @@ public void render(PoseStack ms, MultiBufferSource buffer) { } public void renderBB(PoseStack ms, MultiBufferSource buffer, AABB bb) { - Vec3 projectedView = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); + Vec3 projectedView = Minecraft.getInstance().gameRenderer.getMainCamera() + .getPosition(); boolean noCull = bb.contains(projectedView); bb = bb.inflate(noCull ? -1 / 128d : 1 / 128d); noCull |= params.disableCull; @@ -71,26 +70,23 @@ public void renderBB(PoseStack ms, MultiBufferSource buffer, AABB bb) { } - protected void renderFace(PoseStack ms, MultiBufferSource buffer, Direction direction, Vec3 p1, Vec3 p2, - Vec3 p3, Vec3 p4, boolean noCull) { + protected void renderFace(PoseStack ms, MultiBufferSource buffer, Direction direction, Vec3 p1, Vec3 p2, Vec3 p3, + Vec3 p4, boolean noCull) { if (!params.faceTexture.isPresent()) return; if (params.isFaceHidden(direction)) return; ResourceLocation faceTexture = params.faceTexture.get() - .getLocation(); + .getLocation(); float alphaBefore = params.alpha; - params.alpha = (direction == params.getHighlightedFace() && params.hightlightedFaceTexture.isPresent()) ? 1 : alphaBefore; - //0.5f; + params.alpha = + (direction == params.getHighlightedFace() && params.hightlightedFaceTexture.isPresent()) ? 1 : alphaBefore; - //LogManager.getLogger().info(faceTexture.getPath() + " " + params.alpha + " " + alphaBefore); + // LogManager.getLogger().info(faceTexture.getPath() + " " + params.alpha + " " + // + alphaBefore); - VertexConsumer builder = buffer.getBuffer( - params.alpha == 1 ? - RenderTypes.getOutlineSolid(faceTexture) : - RenderTypes.getOutlineTranslucent(faceTexture, !noCull) - ); + VertexConsumer builder = buffer.getBuffer(RenderTypes.getOutlineTranslucent(faceTexture, !noCull)); Axis axis = direction.getAxis(); Vec3 uDiff = p2.subtract(p1); diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/BlockClusterOutline.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/BlockClusterOutline.java index c622c00..04c670f 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/BlockClusterOutline.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/BlockClusterOutline.java @@ -14,10 +14,10 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; -import net.minecraft.core.BlockPos; import net.minecraft.world.phys.Vec3; public class BlockClusterOutline extends Outline { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/ChasingAABBOutline.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/ChasingAABBOutline.java index c06528b..c08cb88 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/ChasingAABBOutline.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/ChasingAABBOutline.java @@ -4,8 +4,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.world.phys.AABB; import net.minecraft.util.Mth; +import net.minecraft.world.phys.AABB; public class ChasingAABBOutline extends AABBOutline { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outline.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outline.java index 11cf573..1dd5145 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outline.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outline.java @@ -4,12 +4,10 @@ import javax.annotation.Nullable; -import org.apache.logging.log4j.LogManager; - -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack.Pose; import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix3f; import com.simibubi.mightyarchitect.AllSpecialTextures; import com.simibubi.mightyarchitect.foundation.MatrixStacker; import com.simibubi.mightyarchitect.foundation.RenderTypes; @@ -23,7 +21,6 @@ import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.util.Mth; -import com.mojang.math.Matrix3f; import net.minecraft.world.phys.Vec3; public abstract class Outline { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/OutlinedText.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/OutlinedText.java index f35673f..bfe735e 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/OutlinedText.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/OutlinedText.java @@ -1,6 +1,5 @@ package com.simibubi.mightyarchitect.foundation.utility.outliner; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.foundation.RenderTypes; import com.simibubi.mightyarchitect.foundation.utility.VecHelper; @@ -8,7 +7,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import com.mojang.math.Matrix4f; import net.minecraft.world.phys.Vec3; public class OutlinedText extends Outline { diff --git a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outliner.java b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outliner.java index 28fa82c..079fc19 100644 --- a/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outliner.java +++ b/src/main/java/com/simibubi/mightyarchitect/foundation/utility/outliner/Outliner.java @@ -6,7 +6,6 @@ import java.util.Optional; import java.util.Set; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.foundation.utility.outliner.LineOutline.ChasingLineOutline; import com.simibubi.mightyarchitect.foundation.utility.outliner.LineOutline.EndChasingLineOutline; @@ -14,9 +13,9 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.world.phys.AABB; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; public class Outliner { diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/AbstractSimiScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/AbstractSimiScreen.java index e0bb227..c151d43 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/AbstractSimiScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/AbstractSimiScreen.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.gui.widgets.AbstractSimiWidget; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.TextComponent; public abstract class AbstractSimiScreen extends Screen { diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/ArchitectMenuScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/ArchitectMenuScreen.java index 26cea32..2569644 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/ArchitectMenuScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/ArchitectMenuScreen.java @@ -5,20 +5,22 @@ import org.lwjgl.glfw.GLFW; -import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.MightyClient; import com.simibubi.mightyarchitect.control.ArchitectManager; import com.simibubi.mightyarchitect.control.ArchitectMenu; import com.simibubi.mightyarchitect.control.ArchitectMenu.KeyBindList; import com.simibubi.mightyarchitect.control.phase.ArchitectPhases; +import com.simibubi.mightyarchitect.foundation.utility.LerpedFloat; +import com.simibubi.mightyarchitect.foundation.utility.LerpedFloat.Chaser; -import com.mojang.blaze3d.platform.Window; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.util.FormattedCharSequence; import net.minecraft.network.chat.TextComponent; +import net.minecraft.util.FormattedCharSequence; public class ArchitectMenuScreen extends Screen { @@ -31,8 +33,7 @@ public class ArchitectMenuScreen extends Screen { private int menuWidth; private int menuHeight; - private int targetY; - private float movingY; + private LerpedFloat animation; public ArchitectMenuScreen() { super(new TextComponent("Architect Menu")); @@ -41,8 +42,9 @@ public ArchitectMenuScreen() { title = ""; focused = false; visible = false; - movingY = 0; - targetY = 0; + animation = LerpedFloat.linear() + .startWithValue(0) + .chase(0, 0.2f, Chaser.EXP); adjustTarget(); } @@ -130,13 +132,15 @@ public boolean charTyped(char p_charTyped_1_, int p_charTyped_2_) { } private void draw(PoseStack ms, float partialTicks) { - Window mainWindow = Minecraft.getInstance() - .getWindow(); + Minecraft mc = Minecraft.getInstance(); + Window mainWindow = mc.getWindow(); + partialTicks = mc.getFrameTime(); + int x = mainWindow.getGuiScaledWidth() - menuWidth - 10; int y = mainWindow.getGuiScaledHeight() - menuHeight; - int mouseX = (int) (Minecraft.getInstance().mouseHandler.xpos() / mainWindow.getGuiScale()); - int mouseY = (int) (Minecraft.getInstance().mouseHandler.ypos() / mainWindow.getGuiScale()); + int mouseX = (int) (mc.mouseHandler.xpos() / mainWindow.getGuiScale()); + int mouseY = (int) (mc.mouseHandler.ypos() / mainWindow.getGuiScale()); boolean sideways = false; if ((mainWindow.getGuiScaledWidth() - 182) / 2 < menuWidth + 20) { @@ -145,7 +149,7 @@ private void draw(PoseStack ms, float partialTicks) { } ms.pushPose(); - float shift = yShift(partialTicks); + float shift = animation.getValue(partialTicks); float sidewaysShift = shift * ((float) menuWidth / (float) menuHeight) + (!focused ? 40 + menuHeight / 4f : 0) + 8; ms.translate(sideways ? sidewaysShift : 0, sideways ? 0 : shift, 0); @@ -164,7 +168,7 @@ private void draw(PoseStack ms, float partialTicks) { int yPos = y + 4; int xPos = x + 4; - Font textRenderer = Minecraft.getInstance().font; + Font textRenderer = mc.font; String compose = MightyClient.COMPOSE.getTranslatedKeyMessage() .getString() .toUpperCase(); @@ -173,19 +177,17 @@ private void draw(PoseStack ms, float partialTicks) { if (visible) { String string = "Press " + compose.toUpperCase() + " for Menu"; textRenderer.drawShadow(ms, string, - mainWindow.getGuiScaledWidth() - textRenderer.width(string) - 15 - sidewaysShift, - yPos - 14, 0xEEEEEE); + mainWindow.getGuiScaledWidth() - textRenderer.width(string) - 15 - sidewaysShift, yPos - 14, + 0xEEEEEE); } } else { - textRenderer.drawShadow(ms, "Press " + compose.toUpperCase() + " to focus", xPos, yPos - 14, - 0xEEEEEE); + textRenderer.drawShadow(ms, "Press " + compose.toUpperCase() + " to focus", xPos, yPos - 14, 0xEEEEEE); } } else { String string = "Press " + compose + " to close"; textRenderer.drawShadow(ms, string, sideways - ? Math.min(xPos, - mainWindow.getGuiScaledWidth() - textRenderer.width(string) - 15 - sidewaysShift) + ? Math.min(xPos, mainWindow.getGuiScaledWidth() - textRenderer.width(string) - 15 - sidewaysShift) : xPos, yPos - 14, 0xDDDDDD); } @@ -210,10 +212,10 @@ private void draw(PoseStack ms, float partialTicks) { yPos += 4; yPos += textRenderer.lineHeight; for (String text : tooltip) { - int height = Minecraft.getInstance().font.wordWrapHeight(text, menuWidth - 8); + int height = mc.font.wordWrapHeight(text, menuWidth - 8); int lineY = yPos; for (FormattedCharSequence iro : textRenderer.split(new TextComponent(text), menuWidth - 8)) { - textRenderer.draw(ms, iro, xPos, lineY, 0xEEEEEE); + textRenderer.draw(ms, iro, xPos, lineY, 0xEEEEEE); lineY += textRenderer.lineHeight; } yPos += height + 2; @@ -238,7 +240,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { mouseY += 24; } - float shift = yShift(0); + float shift = animation.getValue(); mouseX -= sideways ? shift * 2 : 0; mouseY -= sideways ? 0 : shift; @@ -277,7 +279,7 @@ public void setFocused(boolean focused) { } protected void adjustTarget() { - targetY = visible ? (focused ? 0 : menuHeight - 14) : menuHeight + 20; + animation.updateChaseTarget(visible ? (focused ? 0 : menuHeight - 14) : menuHeight + 20); } public void setVisible(boolean visible) { @@ -291,14 +293,8 @@ public void removed() { setFocused(false); } - private float yShift(float partialTicks) { - return (movingY + (targetY - movingY) * 0.2f * partialTicks); - } - public void onClientTick() { - if (movingY != targetY) { - movingY += (targetY - movingY) * 0.2; - } + animation.tickChaser(); } } diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/DesignExporterScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/DesignExporterScreen.java index e8b3849..81bff38 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/DesignExporterScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/DesignExporterScreen.java @@ -3,8 +3,8 @@ import java.util.ArrayList; import java.util.List; +import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.math.Vector3f; import com.simibubi.mightyarchitect.control.design.DesignExporter; import com.simibubi.mightyarchitect.control.design.DesignLayer; @@ -237,14 +237,11 @@ protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialT ScreenResources.EXPORTER.draw(ms, this, topLeftX, topLeftY); ms.pushPose(); - ms.translate((this.width - this.sWidth) / 2 + 250, 220, 100); - //RenderSystem.rotatef(-30, .4f, 0, -.2f); - ms.mulPose(Vector3f.XP.rotationDegrees(-30 * 0.4f)); - ms.mulPose(Vector3f.ZN.rotationDegrees(-30 * 0.2f)); - //RenderSystem.rotatef(90 + 0.2f * animationProgress, 0, 1, 0); - ms.mulPose(Vector3f.YP.rotationDegrees(90 + 0.2f * animationProgress)); - ms.scale(100, -100, 100); + ms.translate(0, 0, -200); + ms.translate((this.width - this.sWidth) / 2 + 150, 120, 0); + ms.scale(10, 10, 10); GuiGameElement.of(minecraft.player.getMainHandItem()) + .rotate(-1, 0, 20) .render(ms); ms.popPose(); diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/GuiGameElement.java b/src/main/java/com/simibubi/mightyarchitect/gui/GuiGameElement.java index d3dd1fc..397a356 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/GuiGameElement.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/GuiGameElement.java @@ -1,52 +1,42 @@ package com.simibubi.mightyarchitect.gui; -import javax.annotation.Nonnull; import javax.annotation.Nullable; -import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager.DestFactor; import com.mojang.blaze3d.platform.GlStateManager.SourceFactor; +import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.simibubi.mightyarchitect.foundation.WrappedWorld; -import com.simibubi.mightyarchitect.foundation.utility.AngleHelper; +import com.mojang.math.Vector3f; import com.simibubi.mightyarchitect.foundation.utility.ColorHelper; -import com.simibubi.mightyarchitect.foundation.utility.Iterate; import com.simibubi.mightyarchitect.foundation.utility.VecHelper; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.FireBlock; -import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.Sheets; -import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.ItemBlockRenderTypes; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.entity.ItemRenderer; -import com.mojang.blaze3d.platform.Lighting; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.world.level.material.Fluid; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.BlockPos; import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.item.ItemStack; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.AxisDirection; import net.minecraft.world.level.ItemLike; -import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FireBlock; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; import net.minecraft.world.phys.Vec3; -import com.mojang.math.Vector3f; -import net.minecraft.world.level.LightLayer; -import net.minecraft.world.level.Level; import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.data.ModelProperty; -import net.minecraftforge.fluids.FluidStack; public class GuiGameElement { @@ -204,10 +194,12 @@ public void render(PoseStack matrixStack) { protected void renderModel(BlockRenderDispatcher blockRenderer, MultiBufferSource.BufferSource buffer, RenderType renderType, VertexConsumer vb, PoseStack ms) { Vec3 rgb = ColorHelper.getRGB(color); + Lighting.setupForFlatItems(); blockRenderer.getModelRenderer() .renderModel(ms.last(), vb, blockState, blockmodel, (float) rgb.x, (float) rgb.y, (float) rgb.z, 0xF000F0, OverlayTexture.NO_OVERLAY, EmptyModelData.INSTANCE); buffer.endBatch(); + Lighting.setupFor3DItems(); } } @@ -296,27 +288,6 @@ public static void renderItemIntoGUI(PoseStack matrixStack, ItemStack stack, boo } - private static FluidRenderWorld renderWorld; - - private static class FluidRenderWorld extends WrappedWorld { - - public FluidRenderWorld(Level world) { - super(world); - } - - @Override - public int getBrightness(@Nullable LightLayer p_226658_1_, @Nullable BlockPos p_226658_2_) { - return 15; - } - - @Override - @Nonnull - public BlockState getBlockState(BlockPos pos) { - return Blocks.AIR.defaultBlockState(); - } - - } - public enum VirtualEmptyModelData implements IModelData { INSTANCE; diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/PalettePickerScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/PalettePickerScreen.java index 9298dc2..bf95130 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/PalettePickerScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/PalettePickerScreen.java @@ -2,8 +2,8 @@ import java.nio.file.Paths; -import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; import com.simibubi.mightyarchitect.MightyClient; import com.simibubi.mightyarchitect.control.ArchitectManager; @@ -14,13 +14,13 @@ import com.simibubi.mightyarchitect.foundation.utility.FilesHelper; import com.simibubi.mightyarchitect.gui.widgets.IconButton; +import net.minecraft.ChatFormatting; +import net.minecraft.Util; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.Util; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.TextComponent; -import net.minecraft.ChatFormatting; public class PalettePickerScreen extends AbstractSimiScreen { @@ -242,9 +242,8 @@ public PaletteButton(PaletteDefinition palette, Screen parent, int buttonId, int private void preview(PoseStack ms, Minecraft mc) { ms.pushPose(); - ms.translate(x + 5, y + 9, 100); - //RenderSystem.rotatef(-35, 0, 1, 0); - ms.mulPose(Vector3f.YP.rotationDegrees(-35)); + ms.translate(x + 1, y + 9, 100); + ms.scale(1 + 1/64f, 1 + 1/64f, 1); renderBlock(ms, mc, new BlockPos(0, 1, 0), Palette.INNER_PRIMARY); renderBlock(ms, mc, new BlockPos(1, 1, 0), Palette.INNER_DETAIL); renderBlock(ms, mc, new BlockPos(0, 0, 0), Palette.HEAVY_PRIMARY); diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/ScreenResources.java b/src/main/java/com/simibubi/mightyarchitect/gui/ScreenResources.java index c67028f..b01d902 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/ScreenResources.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/ScreenResources.java @@ -4,7 +4,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.TheMightyArchitect; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiComponent; import net.minecraft.resources.ResourceLocation; @@ -70,7 +69,7 @@ public enum ScreenResources { ICON_FOLDER("icons.png", 0, 96, 16, 16), ICON_REFRESH("icons.png", 16, 96, 16, 16); - public static final int FONT_COLOR = 0x575F7A; + public static final int FONT_COLOR = 0x373F5A; public final ResourceLocation location; public int width, height; diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/TextInputPromptScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/TextInputPromptScreen.java index a3ddaed..f3c6f3b 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/TextInputPromptScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/TextInputPromptScreen.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.EditBox; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/ToolSelectionScreen.java b/src/main/java/com/simibubi/mightyarchitect/gui/ToolSelectionScreen.java index c70a447..0df9459 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/ToolSelectionScreen.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/ToolSelectionScreen.java @@ -3,12 +3,13 @@ import java.util.List; import java.util.function.Consumer; -import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.MightyClient; import com.simibubi.mightyarchitect.control.compose.planner.Tools; - -import com.mojang.blaze3d.platform.Window; +import com.simibubi.mightyarchitect.foundation.utility.LerpedFloat; +import com.simibubi.mightyarchitect.foundation.utility.LerpedFloat.Chaser; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; @@ -22,7 +23,7 @@ public class ToolSelectionScreen extends Screen { protected List tools; protected Consumer callback; public boolean focused; - private float yOffset; + private LerpedFloat yOffset; protected int selection; protected int w; @@ -34,7 +35,9 @@ public ToolSelectionScreen(List tools, Consumer callback) { this.tools = tools; this.callback = callback; focused = false; - yOffset = 0; + yOffset = LerpedFloat.linear() + .startWithValue(0) + .chase(0, .1f, Chaser.EXP); selection = 0; w = tools.size() * 50 + 30; @@ -67,7 +70,7 @@ private void draw(PoseStack ms, float partialTicks) { RenderSystem.enableTexture(); RenderSystem.setShaderColor(1, 1, 1, focused ? 7 / 8f : 1 / 2f); RenderSystem.setShaderTexture(0, gray.location); - float toolTipAlpha = yOffset / 10; + float toolTipAlpha = yOffset.getValue(partialTicks) / 10; // render main box blit(ms, x - 15, y, gray.startX, gray.startY, w, h, gray.width, gray.height); @@ -126,7 +129,8 @@ private void draw(PoseStack ms, float partialTicks) { if (focused && i != selection) { KeyMapping keyMapping = minecraft.options.keyHotbarSlots[i]; - drawCenteredString(ms, minecraft.font, "[" + keyMapping.getTranslatedKeyMessage().getString() + "]", x + i * 50 + 24, y + 3, 0xCCDDFF); + drawCenteredString(ms, minecraft.font, "[" + keyMapping.getTranslatedKeyMessage() + .getString() + "]", x + i * 50 + 24, y + 3, 0xCCDDFF); } ms.popPose(); @@ -136,10 +140,8 @@ private void draw(PoseStack ms, float partialTicks) { } public void update() { - if (focused) - yOffset += (10 - yOffset) * .1f; - else - yOffset *= .9f; + yOffset.updateChaseTarget(focused ? 10 : 0); + yOffset.tickChaser(); } public void renderPassive(PoseStack ms, float partialTicks) { diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/IconButton.java b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/IconButton.java index 397e6b3..99db879 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/IconButton.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/IconButton.java @@ -1,7 +1,7 @@ package com.simibubi.mightyarchitect.gui.widgets; -import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.mightyarchitect.gui.ScreenResources; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/Label.java b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/Label.java index b105203..fa41e49 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/Label.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/Label.java @@ -1,13 +1,12 @@ package com.simibubi.mightyarchitect.gui.widgets; -import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.TextComponent; public class Label extends AbstractSimiWidget { diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/ScrollInput.java b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/ScrollInput.java index 269969c..9d23103 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/ScrollInput.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/ScrollInput.java @@ -2,11 +2,10 @@ import java.util.function.Consumer; -import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.ChatFormatting; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; -import net.minecraft.ChatFormatting; public class ScrollInput extends AbstractSimiWidget { diff --git a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/SelectionScrollInput.java b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/SelectionScrollInput.java index 5f5a635..dca8798 100644 --- a/src/main/java/com/simibubi/mightyarchitect/gui/widgets/SelectionScrollInput.java +++ b/src/main/java/com/simibubi/mightyarchitect/gui/widgets/SelectionScrollInput.java @@ -3,9 +3,9 @@ import java.util.ArrayList; import java.util.List; +import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; -import net.minecraft.ChatFormatting; public class SelectionScrollInput extends ScrollInput { diff --git a/src/main/java/com/simibubi/mightyarchitect/item/ArchitectWandItem.java b/src/main/java/com/simibubi/mightyarchitect/item/ArchitectWandItem.java index 61da882..364faca 100644 --- a/src/main/java/com/simibubi/mightyarchitect/item/ArchitectWandItem.java +++ b/src/main/java/com/simibubi/mightyarchitect/item/ArchitectWandItem.java @@ -8,28 +8,27 @@ import com.simibubi.mightyarchitect.gui.DesignExporterScreen; import com.simibubi.mightyarchitect.gui.ScreenHelper; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.item.Rarity; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.InteractionHand; -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; -import net.minecraft.world.item.Item.Properties; - public class ArchitectWandItem extends Item { public ArchitectWandItem(Properties properties) { - super(properties.stacksTo(1).rarity(Rarity.RARE)); + super(properties.stacksTo(1) + .rarity(Rarity.RARE)); } @Override @@ -41,20 +40,18 @@ public InteractionResult useOn(UseOnContext context) { return InteractionResult.SUCCESS; if (player.isShiftKeyDown()) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { - openGui(); - }); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> openGui()); return InteractionResult.SUCCESS; } BlockPos anchor = context.getClickedPos(); BlockState blockState = world.getBlockState(anchor); - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { - handleUseOnDesignAnchor(player, world, anchor, blockState); - }); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, + () -> () -> handleUseOnDesignAnchor(player, world, anchor, blockState)); - player.getCooldowns().addCooldown(this, 5); + player.getCooldowns() + .addCooldown(this, 5); return InteractionResult.SUCCESS; } @@ -77,17 +74,16 @@ protected void handleUseOnDesignAnchor(Player player, Level world, BlockPos anch } else { if (!ArchitectManager.inPhase(ArchitectPhases.EditingThemes)) return; - DistExecutor.runWhenOn(Dist.CLIENT, () -> this::resetVisualization); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::resetVisualization); } } @Override public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { if (worldIn.isClientSide) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { - handleRightClick(worldIn, playerIn, handIn); - }); - playerIn.getCooldowns().addCooldown(this, 5); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> handleRightClick(worldIn, playerIn, handIn)); + playerIn.getCooldowns() + .addCooldown(this, 5); } return super.use(worldIn, playerIn, handIn); } @@ -104,7 +100,7 @@ protected void handleRightClick(Level worldIn, Player playerIn, InteractionHand resetVisualization(); } } - + @OnlyIn(value = Dist.CLIENT) private void openGui() { if (!ArchitectManager.inPhase(ArchitectPhases.EditingThemes)) diff --git a/src/main/java/com/simibubi/mightyarchitect/networking/PlaceSignPacket.java b/src/main/java/com/simibubi/mightyarchitect/networking/PlaceSignPacket.java index 4b03319..3b87573 100644 --- a/src/main/java/com/simibubi/mightyarchitect/networking/PlaceSignPacket.java +++ b/src/main/java/com/simibubi/mightyarchitect/networking/PlaceSignPacket.java @@ -2,12 +2,12 @@ import java.util.function.Supplier; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.level.block.entity.SignBlockEntity; import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.TextComponent; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.SignBlockEntity; import net.minecraftforge.network.NetworkEvent; public class PlaceSignPacket { diff --git a/src/main/java/com/simibubi/mightyarchitect/networking/SetHotbarItemPacket.java b/src/main/java/com/simibubi/mightyarchitect/networking/SetHotbarItemPacket.java index 14655bf..8be2315 100644 --- a/src/main/java/com/simibubi/mightyarchitect/networking/SetHotbarItemPacket.java +++ b/src/main/java/com/simibubi/mightyarchitect/networking/SetHotbarItemPacket.java @@ -2,9 +2,9 @@ import java.util.function.Supplier; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; -import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; public class SetHotbarItemPacket { diff --git a/src/main/resources/assets/mightyarchitect/textures/gui/background.png b/src/main/resources/assets/mightyarchitect/textures/gui/background.png index de5cde99c1d332042bf2e8cd04f2526ee8a06e32..a87c6d824426757f6414e918f723d76c436d5913 100644 GIT binary patch delta 122 zcmdnYIE!(Dgcu7m0|Ud`yN`l^6k~CayA#8@b22X{Dhfxk1^9%x%9)poYsKXDI!y)2 za~60+7BevL?FM1S<3FyL0R?3}T^vIsE+;3nFtIUe98fxRKtY4!;10 Date: Tue, 12 Jul 2022 20:11:02 +0200 Subject: [PATCH 7/7] Update and rename README.txt to README.md --- README.md | 9 +++++++++ README.txt | 2 -- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 README.md delete mode 100644 README.txt diff --git a/README.md b/README.md new file mode 100644 index 0000000..1c82626 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +

Logo

+

The Mighty Architect
+
Patreon + Supported Versions + License + Discord + CF + +

diff --git a/README.txt b/README.txt deleted file mode 100644 index 86b16fb..0000000 --- a/README.txt +++ /dev/null @@ -1,2 +0,0 @@ -## The Mighty Architect for 1.14.2 -Check out the Wiki to learn about the Tool \ No newline at end of file