From 84da57719dd253f08081389db1bb51d1ab895070 Mon Sep 17 00:00:00 2001 From: YuRaNnNzZZ Date: Wed, 23 Oct 2024 20:50:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BA=D0=B5=D0=B9=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=D0=B0=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0?= =?UTF-8?q?=20=D0=B2=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=87=D0=BA=D0=B5=20?= =?UTF-8?q?(=D0=B8=20=D0=B2=D1=81=D1=80=D0=B0=D1=82=D0=B0=D1=8F=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D1=82=D1=80=D0=B0=20=D0=BD=D0=B0=20=D0=B8?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D0=BA=D1=83=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80?= =?UTF-8?q?=D0=B0=20=D1=86=D0=B2=D0=B5=D1=82=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/decorative/HoloSignBlockEntity.kt | 7 +++++++ .../mc/otm/client/render/Widgets18.kt | 4 ++++ .../render/blockentity/HoloSignRenderer.kt | 10 ++++++---- .../screen/decorative/HoloSignScreen.kt | 15 +++++++++++---- .../mc/otm/menu/decorative/HoloSignMenu.kt | 4 ++++ .../textures/gui/widgets/side_controls.png | Bin 2925 -> 2675 bytes .../textures/gui/widgets/side_controls.xcf | Bin 74976 -> 78060 bytes 7 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/HoloSignBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/HoloSignBlockEntity.kt index 34a356892..5ab2a9764 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/HoloSignBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/HoloSignBlockEntity.kt @@ -56,6 +56,11 @@ class HoloSignBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryB var textBlue by syncher.float(85f / 255f, setter = ::colorSetter).delegate var textAlpha by syncher.float(1f).delegate + var textAutoScale by syncher.boolean(true, setter = { access, value -> + setChanged() + access.accept(value) + }).delegate + var isLocked = false init { @@ -67,6 +72,8 @@ class HoloSignBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryB savetables.float(::textGreen) savetables.float(::textBlue) savetables.float(::textAlpha) + + savetables.bool(::textAutoScale) } override fun createMenu(p_39954_: Int, p_39955_: Inventory, p_39956_: Player): AbstractContainerMenu { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt index 4454efe37..d8ef39b0a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt @@ -176,4 +176,8 @@ object Widgets18 { } val UPGRADES = controlsGrid.next() + + val COLOR_PALETTE = controlsGrid.next() + val TEXT_SCALE_DISABLED = controlsGrid.next() + val TEXT_SCALE_ENABLED = controlsGrid.next() } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt index ed719fb84..45ca54dd4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt @@ -35,10 +35,12 @@ class HoloSignRenderer(private val context: BlockEntityRendererProvider.Context) val totalHeight = lines.size * font.lineHeight + (lines.size - 1) * 2f var y = -totalHeight / 2f - val totalWidth = lines.maxOf { font.width(it) }.toFloat() - val highest = totalWidth.coerceAtLeast(totalHeight) - val mul = if (highest > 64f) 1f / (highest / 64f) else 64f / highest - poseStack.scale(mul, mul, mul) + if (tile.textAutoScale) { + val totalWidth = lines.maxOf { font.width(it) }.toFloat() + val highest = totalWidth.coerceAtLeast(totalHeight) + val mul = if (highest > 64f) 1f / (highest / 64f) else 64f / highest + poseStack.scale(mul, mul, mul) + } for (line in lines) { font.draw(poseStack = poseStack, buffer = bufferSource, text = line, gravity = RenderGravity.TOP_CENTER, y = y, color = RGBAColor(tile.textRed, tile.textGreen, tile.textBlue, tile.textAlpha)) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/HoloSignScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/HoloSignScreen.kt index f291876b3..20524cf57 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/HoloSignScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/HoloSignScreen.kt @@ -2,8 +2,6 @@ package ru.dbotthepony.mc.otm.client.screen.decorative import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory -import net.minecraft.world.item.ItemStack -import ru.dbotthepony.mc.otm.client.render.ItemStackIcon import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.panels.ColorPickerPanel import ru.dbotthepony.mc.otm.client.screen.panels.Dock @@ -15,8 +13,9 @@ import ru.dbotthepony.mc.otm.client.screen.panels.button.makeDeviceControls import ru.dbotthepony.mc.otm.client.screen.panels.input.NetworkedStringInputPanel import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.kommons.math.RGBAColor +import ru.dbotthepony.mc.otm.client.render.Widgets18 +import ru.dbotthepony.mc.otm.client.screen.panels.button.LargeBooleanRectangleButtonPanel import ru.dbotthepony.mc.otm.menu.decorative.HoloSignMenu -import ru.dbotthepony.mc.otm.registry.MItems class HoloSignScreen(menu: HoloSignMenu, inventory: Inventory, title: Component) : MatteryScreen(menu, title) { override fun makeMainFrame(): FramePanel> { @@ -51,10 +50,18 @@ class HoloSignScreen(menu: HoloSignMenu, inventory: Inventory, title: Component) }) { init { tooltips.add(TranslatableComponent("otm.gui.change_color")) - icon = ItemStackIcon(ItemStack(MItems.PAINTER)).fixed() + icon = Widgets18.COLOR_PALETTE } }) + controls.addButton(LargeBooleanRectangleButtonPanel( + this@HoloSignScreen, + frame, + prop = menu.textAutoScale, + iconActive = Widgets18.TEXT_SCALE_ENABLED, + iconInactive = Widgets18.TEXT_SCALE_DISABLED, + )) + return frame } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/decorative/HoloSignMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/decorative/HoloSignMenu.kt index 87c55378e..2dd7ffa7c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/decorative/HoloSignMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/decorative/HoloSignMenu.kt @@ -24,6 +24,7 @@ class HoloSignMenu( val textGreen = FloatInputWithFeedback(this) val textBlue = FloatInputWithFeedback(this) val textAlpha = FloatInputWithFeedback(this) + val textAutoScale = BooleanInputWithFeedback(this) init { text.filter { it.isCreative || !locked.value } @@ -35,6 +36,8 @@ class HoloSignMenu( textBlue.filter { it.isCreative || !locked.value } textAlpha.filter { it.isCreative || !locked.value } + textAutoScale.filter { it.isCreative || !locked.value } + if (tile != null) { text.withConsumer { if (tile.isLocked) tile.signText = it else tile.signText = HoloSignBlockEntity.truncate(it) }.withSupplier(tile::signText) textRed.withConsumer { tile.textRed = it.coerceIn(0f, 1f) }.withSupplier(tile::textRed) @@ -43,6 +46,7 @@ class HoloSignMenu( textAlpha.withConsumer { tile.textAlpha = it.coerceIn(0f, 1f) }.withSupplier(tile::textAlpha) locked.with(tile::isLocked) redstone.with(tile.redstoneControl::redstoneSetting) + textAutoScale.with(tile::textAutoScale) } } } diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/side_controls.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/side_controls.png index 41171ed83cf8384efae821239c5e56b039904b5e..9806ad55a39af3b1f167772a5192e540ff6ed437 100644 GIT binary patch delta 2624 zcmXw*dpy(MAIEk1=8{`;$zngub@o@CHKnh<63;}hnVX&mvS$B zF(O}7Zc#$WOyyfbX&YLylJ#4c-}&SHIOlQB`<(N7zRx-D!RSH#ZQIi%A4q^e_7sVHjjID}HutC5WnF5by&U0;S%H$j zE^th%GXoNZm)5k)SD4dq6iS&)SY2Pwo$;;}7Ve*1@+0=1!os-jVgxpWPu5%Q2@6tQv!;gV zL7#)IZLMwdUJ-5On*L6i-sfVqSI$bCZAeN-p3q%gE&J3vb|vnfh#@Xnnu&Op~n%LansqhL5g^O?<~ov*Eb7Jz6qM@C{<^THFe? z-KC}VP}Z@}2b*UBI``GB{v{Bk_`N*tQwiUSGFEfrpPNZTC72Twx#t#I5vLlN@qhL9_8ew zb-qLpH$kIjMKMDM$1m%33P7QMG)V>ghDHGh8&JAHctJq|JOdoNd@e6U)S;Ag^z>$Ul7lTeU(d1_g9ld5)6q%d52Pcko(9Ak4)eMi}L$qr1 z(fyOt{ORX{{UD5vreE=q<`#L*-p8o1BJ;LeMQj=#zT;JGl3Huy8#M zBmwGy?bhZqV$S4Bt5ZwUP~u|*v5*%Erp>(Re{(v~id%r`xGr+$)huaMq4=MRg@gcN zz|h2#O@G<+4srxstMi3VP1O&`6x18BkYncq&u-L@DgWMR7=Fl0CV~sMlKs%e<*}aL zFHzWL9TUWtn%S}zm+(1(7uAaD^mXt=Ac4+}jf65q<#XMgd>$+9n<&S0I|b_$;0&AC0sNPJBc_)nqHHL`b@PBB!UZ#DC};{-v($^9X+RjV$#p-c zn3a6*wrhlq5&|$#C`QB%ZwWJ%6jGOQ`pWkcIxllTeJ_?MrsYpG9*Rr)FpE6BGvD@ql)>%|M#fE=w7?Vyryu0E_LCs)$>0cGNgd&NUA= zSW8FUE>`V;nfQLPl2@&f;}j>)0>O9^Daa`i0@I|9Oi{_vtcQiWKNq9I5^$xC>n|H^ta6 zxyS9Wa)I^)=E>||QF5&GO8qgk4a}f^x7Av52w~^7?)iOq^upwr$S^sePhcJqw-=o? z$1RWqw%8o3X=13Y{V~t@u7A)$*MP-2rr)=c#kTe=7=0s{ZNz`FImdiU(u9dVcKXJQ zRH^=`?5(=w@YJ|2C_Bfc8y!8RF9cg?VW=;0I zX?x?&a8oN)BZKTAK16r+h`+dg{gZfze#C5_dJ2w)wezm+;7u=&XOnO=@~wc9BGhlW z|58cAnr~&D^vDeEUk;)g9a0Z^E+~UxfLMrji$LrV4YSM)*(GDYNkuG6Akrxlq5-w~ zLd8Cm1)a#WXpUK8isp^Hu*J;rQ$cZOH(-?mn&StE>7r#tBBbO(96I=WK}+OR$M?Ll zpHId!zB=lpqVHa?;Ar@i7-)*7oNE6LmYHxghffp#bDcK|}Y8V;V5atHd| z0uH-Yi_2}%`Sg063C>mbZ3`sU>}(*7w0?ti_$#4-YOU+Cd4u zIo#97<=O5u;F2#nh<0x-c)<9-ns@o^(KmvRfNIKS0*YEzrc+IR)|Wims;Z@XW<_{W ztN73ANA6jWiWE|v;0IFVZLnM+aeckl``P92ujPOU(48OZ1|4EU9qR_ zd+gvxOh){BCC5~oA#gYR$Hc2zDE|Sa@Jh?5=!~vUAj*6_(Ug@)CY);$D?Ge5T>(_t z7UQ6T$wlTSZ14m(6HFbzBDqIo%X{?h+OIQqtqGf7AUF2fz1~*GRWD$C&uv3eX~Ez6 z`%Dv!8djdo2TZdE7&ng?7(<5&V{7VMV7_}r1z9xd{RYG#mgpC6FPHIyzpWMCvI%`Y F<$sWZ;0*u( delta 2874 zcmXX|c{~&DAD{FUatF6>9k9>-A6zvo+k0Ta^t_9QS+}wzOh32Q zyzIN!%t(5ZA@*J71$>d}F-fYUuBg26-eRWA?(@E87_v)n7~;Rrny~^^Lf6;Q>-T~* z)X>@%ao-SYqvgjR&|}h(P7mkXY7p($KEb%>hE`TNk+trCA12YP*e$g~{wwLrXS}KV zL_SA;`tr1_>q_&4jNxLT^X;#Wadc$8)HBB0BTCmlpYV?!;FnjX^zG7e_d7HS*p<+H z=~e~L>f@;V*zj;uh~?H6AcaP#xOK&PSz@Ow#IgW1eG>qX2zRpk8+&Pp@28!j z=Aigsbgx*#U%6OCO>yy(VE;XY!lKTHm>++K1A$O2X^JADwFf~_^v5X^KxbP}xI$5p ztb9kYfX^+S++=w6-0Q|8OGM(J(1x(GArO2VeiJp>bG5-s5+Hdr_N+*4WLd*qgFRHT zWQ@6%&W2lzW}TfO!%eHJ&o{2K{tJ*0{L~qulvVeTYsDGg{LhzFf=K0ROb<&7t33ZFXxTB z_n8jKapPRTRMKM47!28(ni$may@TBI_i)WW93Lzxe)^SPXYcFsbE};Jh&$|j;LFBk zbnh0juJr^gODQ9{EGMUwnmkz@0)cF-pUc9&H7DZ9XDhzG_}|Q@gc;?Hk6T4btJU1Z z(Q~yw#Gd<}hA>D5>S%|=4EVn?6S4&=W*WS&5lQyHf%l&-Z*6x zOe;?AXI@TII)4y2wA6&g&FZqOqbj>zlqcK3=PtmYu5o_k+aodeJ=El_3aA(Kb0e&yX_Nb+LFH}iWZ*N*noW`k9r4N?>tocTC)uA|^zHzr# zAmJfxNoSpi(kexA-!98#ehnO@jZwPPM)sk=GBYO}k-imC*($&@;z z+7TbRR~%|-*PmD|A>)1ugiZ5fiZhia#O3i6Z|1w9`Fy1W(MIMylP`j-A-E440SbPGV@lGJ}o6x)J=+Fd_Tg2RbnMk;u*pm5##tp6EM31dk^yH)(w9udCYkjifRfOWc0 z%YT1T%ItdKT&a3m8vX#He(O3?jjXo=9V$AZATJr|AESd*-@Q#ks$A!t?BRv=%us@U zrn9Hb>S)`wf21GN5UjS0@S+;`|IORa1?l~iBmleWQ}Nx5cVAG|ePvt?PY#~GSg+44 zxp>8K;a8e=Dh+{usSYQ)uDe?PB;L7O=1=iFX~vO5H=A*Sjb@ydEI-9P+v>Z(u}!HW z-H&|(ir+n@aGOG_c{?Y4Qeg0SpN#2>g^3)T6Y zR8Kn&I?!DoVL^LuvvZY9Cj}SkRWVz8$KUkR-h*^7v^TV4QF@$hz{kKu19@ooln<~y zRU9=Nw#`1oasL&F_L)uD?c)R_0hnXuFdN|#-DKx4-j4?cZW^TI1q}2QA zNV1Ws^1-y_qUo}DQkr3L^-FX6>XjmD{fdM?N!Sksk#}B$S=EyYPR3cBex6XywZUc> zV@JlfYYFyNz0_AVd~Sz;DO541E1E)sHbs9UQMVYJsSY3Z+8!c!GiJaYQnxjcAbh#k zrc8(p<44@gVENSiSd+uxwX231+*Ne|$YZlKpcu2GS#LlNC*OHeel&?^dMBJNhLb0& zDB`>aJW(ZWfgWbA1uz4HY78om!SH@HvDm=7XLD4t63uFO_N+grr(Mo%xYh45FTC=D z*3D}I?%B);7qghRrag_oA!j&1%S)a#z*Ya@rRt${Jz$FRpg!RAfiYr3ISsS-!ZH7E z7WpTnhie9IhYkjnt03~k0J9c4fNL6*Uy$@zLXo`@X1=|h+|HjDPRHEr*hv2y{|8p! BXsiGL diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/side_controls.xcf b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/side_controls.xcf index cbd6a7acfa19b0844f877af057c6f252946495eb..928c66053ec01045c3af6587d5a8c8ece6a40f94 100644 GIT binary patch delta 6053 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 delta 3817 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