From a707e49b8c7cbd054bcbf91f24d3ae7af50d7bc6 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Tue, 18 Jul 2023 01:55:17 +0700 Subject: [PATCH] Exopack coloring and toggle exopack glowing --- .../mc/otm/datagen/lang/English.kt | 11 +- .../mc/otm/datagen/lang/Russian.kt | 13 ++- .../mc/otm/client/model/ExosuitModel.java | 41 +++++-- .../otm/capability/MatteryPlayerCapability.kt | 14 ++- .../mc/otm/client/render/Widgets8.kt | 5 +- .../screen/panels/EntityRendererPanel.kt | 109 +++++++++++++++--- .../network/MatteryPlayerNetworkChannel.kt | 61 +++++++++- .../textures/gui/widgets_8.png | Bin 915 -> 964 bytes .../textures/gui/widgets_8.xcf | Bin 6564 -> 7074 bytes 9 files changed, 215 insertions(+), 39 deletions(-) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index 5c97f4607..6cb9a002e 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -136,11 +136,16 @@ private fun misc(provider: MatteryLanguageProvider) { gui("recipe.ticks", "%s Ticks") gui("exopack", "Exopack Inventory") + + gui("exopack.customize", "Customize Exopack appearance") + gui("exopack.customization", "Exopack appearance settings") + gui("exopack.go_back", "Open vanilla inventory") gui("exopack.go_in", "Open Exopack inventory") - gui("exopack.toggle_visibility", "Toggle Exopack visibility") - gui("exopack.change_color", "Customize Exopack color") - gui("exopack.change_color2", "Press Middle Mouse Button to remove color") + gui("exopack.toggle_visibility", "Visibile on player") + gui("exopack.toggle_glow", "Glows in dark") + gui("exopack.change_color", "Customize color") + gui("exopack.change_color2", "Remove color") gui("exopack.probe1", "This little device feels unnatural to touch, it is almost certainly resilient to any possible attempt to break it open.") gui("exopack.probe2", "There is fingerprint reader built into one of sides which gently glow when touched.") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt index 34b334622..6fbffacf8 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt @@ -144,11 +144,16 @@ private fun misc(provider: MatteryLanguageProvider) { gui("recipe.ticks", "%s Тиков") gui("exopack", "Инвентарь Экзопака") + + gui("exopack.customize", "Изменить внешний вид Экзопака") + gui("exopack.customization", "Внешний вид Экзопака") + gui("exopack.go_back", "Открыть обычный инвентарь") - gui("exopack.go_in", "Открыть инвентарь экзопака") - gui("exopack.toggle_visibility", "Переключить отображение Экзопака") - gui("exopack.change_color", "Изменить окраску Экзопака") - gui("exopack.change_color2", "Нажмите среднюю кнопку мыши для сброса окраски") + gui("exopack.go_in", "Открыть инвентарь Экзопака") + gui("exopack.toggle_visibility", "Отображать на игроке") + gui("exopack.toggle_glow", "Свечение в темноте") + gui("exopack.change_color", "Изменить окраску") + gui("exopack.change_color2", "Убрать окраску") gui("exopack.probe1", "Данное маленькое устройство необычно на ощупь, а так же неприступно для любых попыток вскрыть.") gui("exopack.probe2", "На одной из сторон данного устройства находится сканер отпечатка, который тускло загорается при касании.") diff --git a/src/main/java/ru/dbotthepony/mc/otm/client/model/ExosuitModel.java b/src/main/java/ru/dbotthepony/mc/otm/client/model/ExosuitModel.java index 12c4f44e7..fa3b2878a 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/client/model/ExosuitModel.java +++ b/src/main/java/ru/dbotthepony/mc/otm/client/model/ExosuitModel.java @@ -32,6 +32,7 @@ public final class ExosuitModel { public static final HumanoidModel modelGlow; public static final ResourceLocation texture = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/models/armor/exosuit.png"); + public static final ResourceLocation textureColor = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/models/armor/exosuit_color.png"); static { MeshDefinition meshdefinition = new MeshDefinition(); @@ -138,14 +139,38 @@ public final class ExosuitModel { 1f, 1f, 1f, 1f ); - modelGlow.renderToBuffer( - poseStack, - bufferSource.getBuffer(RenderType.entityTranslucentEmissive(texture)), - packedLight, - overlayCoords, - // rgba - 1f, 1f, 1f, 1f - ); + var color = cap.resolve().get().getExopackColor(); + + if (color != null) { + modelNormal.renderToBuffer( + poseStack, + bufferSource.getBuffer(RenderType.entityCutoutNoCull(textureColor)), + packedLight, + overlayCoords, + // rgba + color.getRed(), color.getGreen(), color.getBlue(), 1f + ); + } + + if (cap.resolve().get().getExopackGlows()) { + modelGlow.renderToBuffer( + poseStack, + bufferSource.getBuffer(RenderType.entityTranslucentEmissive(texture)), + packedLight, + overlayCoords, + // rgba + 1f, 1f, 1f, 1f + ); + } else { + modelGlow.renderToBuffer( + poseStack, + bufferSource.getBuffer(RenderType.entityCutoutNoCull(texture)), + packedLight, + overlayCoords, + // rgba + 1f, 1f, 1f, 1f + ); + } } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt index b85fbebc7..1896bbc82 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -32,7 +32,6 @@ import net.minecraft.world.item.Items import net.minecraft.world.item.ProjectileWeaponItem import net.minecraft.world.item.crafting.RecipeManager import net.minecraft.world.item.crafting.RecipeType -import net.minecraft.world.item.enchantment.EnchantmentHelper.hasVanishingCurse import net.minecraft.world.level.GameRules import net.minecraft.world.level.Level import net.minecraft.world.phys.Vec3 @@ -83,15 +82,16 @@ import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.core.collect.UUIDIntModifiersMap import ru.dbotthepony.mc.otm.core.collect.filter import ru.dbotthepony.mc.otm.core.math.Decimal +import ru.dbotthepony.mc.otm.core.math.RGBAColor import ru.dbotthepony.mc.otm.core.math.minus import ru.dbotthepony.mc.otm.core.nbt.getByteList import ru.dbotthepony.mc.otm.core.nbt.getCompoundList import ru.dbotthepony.mc.otm.core.nbt.getIntList import ru.dbotthepony.mc.otm.core.nbt.getStringList import ru.dbotthepony.mc.otm.core.nbt.set -import ru.dbotthepony.mc.otm.core.util.BooleanValueCodec import ru.dbotthepony.mc.otm.core.util.IntValueCodec import ru.dbotthepony.mc.otm.core.util.ItemValueCodec +import ru.dbotthepony.mc.otm.core.util.RGBCodec import ru.dbotthepony.mc.otm.core.util.Savetables import ru.dbotthepony.mc.otm.core.util.TickList import ru.dbotthepony.mc.otm.core.util.UUIDValueCodec @@ -211,6 +211,13 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial */ var displayExoPack by publicSynchronizer.bool(true).property + /** + * Whenever to render Exopack glow in dark + */ + var exopackGlows by publicSynchronizer.bool(true).property + + var exopackColor by publicSynchronizer.Field(null, RGBCodec.nullable) + /** * Tick event schedulers */ @@ -499,6 +506,9 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial savetables.stateful(::exoPackChargeSlots) savetables.float(::exoPackSmelterExperience) savetables.bool(::isExoPackSmeltingInstalled) + + savetables.codecNullable(::exopackColor, RGBAColor.CODECRGB) + savetables.bool(::exopackGlows) } fun invalidateNetworkState() { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets8.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets8.kt index 3a8f5ba75..3cf7bbf71 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets8.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets8.kt @@ -21,6 +21,7 @@ object Widgets8 { val ARROW_PAINTED_UP = GRID[1, 2] val MINUS = GRID[1, 3] - val EXOSUIT_SHOWN = GRID[2, 1] - val EXOSUIT_HIDDEN = GRID[3, 1] + val EXOPACK_SHOWN = GRID[2, 1] + val EXOPACK_HIDDEN = GRID[3, 1] + val EXOPACK_COLOR = GRID[4, 1] } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EntityRendererPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EntityRendererPanel.kt index def0e809d..a4c1608cf 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EntityRendererPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EntityRendererPanel.kt @@ -1,24 +1,39 @@ package ru.dbotthepony.mc.otm.client.screen.panels -import com.mojang.blaze3d.vertex.PoseStack +import com.mojang.blaze3d.platform.InputConstants +import it.unimi.dsi.fastutil.booleans.BooleanConsumer +import net.minecraft.ChatFormatting import net.minecraft.client.gui.GuiGraphics import net.minecraft.client.gui.screens.Screen import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen import net.minecraft.client.gui.screens.inventory.InventoryScreen import net.minecraft.world.entity.LivingEntity import net.minecraft.world.entity.player.Player +import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.capability.matteryPlayer import ru.dbotthepony.mc.otm.client.render.Widgets8 import ru.dbotthepony.mc.otm.client.render.sprite import ru.dbotthepony.mc.otm.client.screen.ExoPackInventoryScreen +import ru.dbotthepony.mc.otm.client.screen.MatteryScreen +import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel +import ru.dbotthepony.mc.otm.client.screen.panels.button.CheckBoxLabelPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.SmallBooleanRectangleButtonPanel +import ru.dbotthepony.mc.otm.client.screen.panels.button.SmallRectangleButtonPanel import ru.dbotthepony.mc.otm.compat.cos.CosmeticToggleRenderButton import ru.dbotthepony.mc.otm.compat.cos.isCosmeticArmorLoaded +import ru.dbotthepony.mc.otm.core.GetterSetter +import ru.dbotthepony.mc.otm.core.TextComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.asGetterOnly -import ru.dbotthepony.mc.otm.network.DisplayExosuitPacket -import ru.dbotthepony.mc.otm.network.HideExosuitPacket +import ru.dbotthepony.mc.otm.core.math.RGBAColor +import ru.dbotthepony.mc.otm.network.DisableExopackGlowPacket +import ru.dbotthepony.mc.otm.network.DisplayExopackPacket +import ru.dbotthepony.mc.otm.network.EnableExopackGlowPacket +import ru.dbotthepony.mc.otm.network.HideExopackPacket import ru.dbotthepony.mc.otm.network.MatteryPlayerNetworkChannel +import ru.dbotthepony.mc.otm.network.ResetExopackColorPacket +import ru.dbotthepony.mc.otm.network.SetExopackColorPacket +import java.util.function.IntConsumer private fun calculateScale(width: Float, height: Float): Int { val aspectRatio = width / height @@ -34,6 +49,76 @@ private fun calculateScale(width: Float, height: Float): Int { } } +private fun createExopackAppearanceWindow(screen: MatteryScreen<*>, matteryPlayer: MatteryPlayerCapability): FramePanel<*> { + val frame = FramePanel.padded(screen, width = 200f, height = 90f, title = TranslatableComponent("otm.gui.exopack.customization")) + + screen.addPanel(frame) + + frame.toScreenCenter() + frame.behaveAsWindow() + frame.requestFocus() + + CheckBoxLabelPanel( + screen, + frame, + text = TranslatableComponent("otm.gui.exopack.toggle_visibility"), + isChecked = GetterSetter.of( + { + matteryPlayer.displayExoPack + }, + { + if (it) { + MatteryPlayerNetworkChannel.sendToServer(DisplayExopackPacket) + } else { + MatteryPlayerNetworkChannel.sendToServer(HideExopackPacket) + } + } + ) + ).also { + it.dock = Dock.TOP + it.dockTop = 2f + } + + CheckBoxLabelPanel( + screen, + frame, + text = TranslatableComponent("otm.gui.exopack.toggle_glow"), + isChecked = GetterSetter.of( + { + matteryPlayer.exopackGlows + }, + { + if (it) { + MatteryPlayerNetworkChannel.sendToServer(EnableExopackGlowPacket) + } else { + MatteryPlayerNetworkChannel.sendToServer(DisableExopackGlowPacket) + } + } + ) + ).also { + it.dock = Dock.TOP + it.dockTop = 2f + } + + ButtonPanel(screen, frame, label = TranslatableComponent("otm.gui.exopack.change_color"), onPress = IntConsumer { + frame.blockingWindow = ColorPickerPanel.frame( + screen, + callback = { MatteryPlayerNetworkChannel.sendToServer(SetExopackColorPacket(it)) }, + color = matteryPlayer.exopackColor ?: RGBAColor.WHITE, + title = TranslatableComponent("otm.gui.exopack.change_color")) + }).also { + it.dock = Dock.TOP + it.dockTop = 2f + } + + ButtonPanel(screen, frame, label = TranslatableComponent("otm.gui.exopack.change_color2"), onPress = IntConsumer { MatteryPlayerNetworkChannel.sendToServer(ResetExopackColorPacket) }).also { + it.dock = Dock.TOP + it.dockTop = 2f + } + + return frame +} + class EntityRendererPanel @JvmOverloads constructor( screen: S, parent: EditablePanel<*>?, @@ -67,21 +152,15 @@ class EntityRendererPanel @JvmOverloads constructor( if (entity is Player) { val matteryPlayer = entity.matteryPlayer - if (matteryPlayer != null && matteryPlayer.hasExoPack) { - exosuitButton = SmallBooleanRectangleButtonPanel(screen, this, this.width - 2f - SmallBooleanRectangleButtonPanel.SIZE, 2f, - prop = matteryPlayer::displayExoPack.asGetterOnly(), - skinElementActive = Widgets8.EXOSUIT_SHOWN, - skinElementInactive = Widgets8.EXOSUIT_HIDDEN, - onChange = { - if (it) { - MatteryPlayerNetworkChannel.sendToServer(DisplayExosuitPacket) - } else { - MatteryPlayerNetworkChannel.sendToServer(HideExosuitPacket) - } + if (matteryPlayer != null && matteryPlayer.hasExoPack && screen is MatteryScreen<*>) { + exosuitButton = SmallRectangleButtonPanel(screen, this, this.width - 2f - SmallBooleanRectangleButtonPanel.SIZE, 2f, + skinElement = Widgets8.EXOPACK_SHOWN, + onPress = { + blockingWindow = createExopackAppearanceWindow(screen, matteryPlayer) } ) - exosuitButton.tooltips.add(TranslatableComponent("otm.gui.exopack.toggle_visibility")) + exosuitButton.tooltips.add(TranslatableComponent("otm.gui.exopack.customize")) } else { exosuitButton = null } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerNetworkChannel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerNetworkChannel.kt index a1364a351..d2a766275 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerNetworkChannel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerNetworkChannel.kt @@ -28,6 +28,7 @@ import ru.dbotthepony.mc.otm.client.render.GlitchRenderer import ru.dbotthepony.mc.otm.client.render.ShockwaveRenderer import ru.dbotthepony.mc.otm.container.get import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.math.RGBAColor import ru.dbotthepony.mc.otm.core.math.Vector import ru.dbotthepony.mc.otm.core.readItemType import ru.dbotthepony.mc.otm.core.writeItemType @@ -496,7 +497,7 @@ class ShockwaveEffectPacket(val pos: Vector) : MatteryPacket { } } -object DisplayExosuitPacket : MatteryPacket { +object DisplayExopackPacket : MatteryPacket { override fun write(buff: FriendlyByteBuf) {} override fun play(context: Supplier) { @@ -505,7 +506,7 @@ object DisplayExosuitPacket : MatteryPacket { } } -object HideExosuitPacket : MatteryPacket { +object HideExopackPacket : MatteryPacket { override fun write(buff: FriendlyByteBuf) {} override fun play(context: Supplier) { @@ -514,6 +515,52 @@ object HideExosuitPacket : MatteryPacket { } } +object EnableExopackGlowPacket : MatteryPacket { + override fun write(buff: FriendlyByteBuf) {} + + override fun play(context: Supplier) { + context.packetHandled = true + context.sender?.matteryPlayer?.exopackGlows = true + } +} + +object DisableExopackGlowPacket : MatteryPacket { + override fun write(buff: FriendlyByteBuf) {} + + override fun play(context: Supplier) { + context.packetHandled = true + context.sender?.matteryPlayer?.exopackGlows = false + } +} + +object ResetExopackColorPacket : MatteryPacket { + override fun write(buff: FriendlyByteBuf) {} + + override fun play(context: Supplier) { + context.packetHandled = true + context.sender?.matteryPlayer?.exopackColor = null + } +} + +data class SetExopackColorPacket(val color: RGBAColor) : MatteryPacket { + override fun write(buff: FriendlyByteBuf) { + buff.writeFloat(color.red) + buff.writeFloat(color.green) + buff.writeFloat(color.blue) + } + + override fun play(context: Supplier) { + context.packetHandled = true + context.sender?.matteryPlayer?.exopackColor = color + } + + companion object { + fun read(buff: FriendlyByteBuf): SetExopackColorPacket { + return SetExopackColorPacket(RGBAColor(buff.readFloat(), buff.readFloat(), buff.readFloat())) + } + } +} + class SetInventoryFilterPacket(val type: Type, val slot: Int, val item: Item?) : MatteryPacket { enum class Type { INVENTORY, @@ -559,7 +606,7 @@ class SetInventoryFilterPacket(val type: Type, val slot: Int, val item: Item?) : } object MatteryPlayerNetworkChannel : MatteryNetworkChannel( - version = "3", + version = "4", name = "player" ) { fun register() { @@ -590,8 +637,12 @@ object MatteryPlayerNetworkChannel : MatteryNetworkChannel( add(GlitchPacket::class, GlitchPacket.Companion::read, PLAY_TO_CLIENT) add(ShockwaveEffectPacket::class, ShockwaveEffectPacket.Companion::read, PLAY_TO_CLIENT) - add(DisplayExosuitPacket::class, { DisplayExosuitPacket }, PLAY_TO_SERVER) - add(HideExosuitPacket::class, { HideExosuitPacket }, PLAY_TO_SERVER) + add(DisplayExopackPacket::class, { DisplayExopackPacket }, PLAY_TO_SERVER) + add(HideExopackPacket::class, { HideExopackPacket }, PLAY_TO_SERVER) + add(EnableExopackGlowPacket::class, { EnableExopackGlowPacket }, PLAY_TO_SERVER) + add(DisableExopackGlowPacket::class, { DisableExopackGlowPacket }, PLAY_TO_SERVER) + add(ResetExopackColorPacket::class, { ResetExopackColorPacket }, PLAY_TO_SERVER) + add(SetExopackColorPacket::class, SetExopackColorPacket.Companion::read, PLAY_TO_SERVER) add(SetInventoryFilterPacket::class, SetInventoryFilterPacket.Companion::read, PLAY_TO_SERVER) } diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets_8.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets_8.png index 8144a8fa67cf6621d891b5f0236cc3d7723a3318..e39800d868cd69d71ef872f6020ac8129475247a 100644 GIT binary patch delta 913 zcmV;C18)422gC=EL4VUqRVpHO5OK&*o$R6_j-`r4uu$3xtvZ-o`UOoIk`xz5!L{Jv z$70pN#aUMeS3wZ`0C9D3Qgo3L|Cbb6#CUMrk9YSTckck9S!Jpjhyki*8RK2h-P^xs+Wq|iHMDY$BSn|v00006VoOIv000000Dl1aL%V+f000SaNLh0L01FcU z01FcV0GgZ_00007bV*G`2j>S51r{5<;PVUs00F^CL_t(&-tAbsPQx%1J+4a2))`TS zj%+YhrOcW5fG%`GLdrycfQcXIR*AJN{Qy3J5@iY-BSawPZqUU{u3X2C9h%UGeYWV> z(Y?pV_kZ4mc%Da*fh0)?b{JIv=yW<#G7Q6|XG$pr078gVlq{Zc4B{Fc&#zN)e-@w! z@PVm<)CI2NMUjd?#WXpS6E$%NLteh%>!W+ujDXcKxrDSnCz&^?!O&ax$4LJrC!U-t47CnNFut5xd(9AHbeSK$}IECyyH?wOAO015yANkvXXu0mjf6d3G6miHt ztRyMK=fvX%U6A;Z>$1yloQn<%JTq)$QuD-NVzJo4atE`Lp%PCMM-)|~d?D+y!g-6c zTB)(tJ^2fRd2J=lb($lHV+jc)AwotCWmI4xN~=bSi4^U}Jp99sKS?f`TxBqFET9S% zlH&*egWuhng@36@Hz^ncx?gPjV-)Dw1)6o+{yw(t<_X|`2ClTWzuEw1KS{5*wa5|B zw+&oew>5bWxZDATo^;8O9LY~pC=`JAGy0|+(0>aA*4*A&`#607GSt=b4RCM>j1?(+ z-Q(T8oxS~grq$mMkhyZRVnLd700006VoOIv0RI600Du3Wy{D4^000SaNLh0L01FcU z01FcV0GgZ_00007bV*G`2j&VD4=Xf%CZo~-00EFmL_t(&-tAa1QiL!Rec4%8J8DM< zE$!?Wq^I%#G}79-7qIdITias80lWe-oWN2UJpi3<6RXSwNJv;=6_VF6FT?!*{>%R# zi0ir(9e*gxl3>PI0)X%PLNd?u+B2n;0stXIC`uR4IELmK70;iOaXSkz1o*&YL8<~* z@lBD2z(O}Uor>x>grP4#bmeAgOUDf#8*9V*&odEzozuxh9aX+0VC`!IL?)Zc+aol>x ze@S>}2dr0wFd;;JW7ZB>uhe_M>>Z$*46NbF8e_BJ$r_^_gL}pThGPi;p63b4qA0ZX z09Yd&z>mTyee4V(fNT#i$^rZ+H0}!M>;ZNP*w5jKj=?Yt?H*87m5_8CXZ8ZvO;G1h p*Kcs^023TA=Sg54U`n@_;Rg%5=0fI#A$R})002ovPDHLkV1oT5iunKl diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets_8.xcf b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets_8.xcf index 7b7a7bc10ffdb6d1a67e7de848cd7e0b4f6e6e32..cc53a4fea8b84e4f73d2e477b05756f54b1b4e1b 100644 GIT binary patch delta 691 zcmZvZ!Al!a5QleWvvIS@x^7%IW&;u;7IW&s7DWpA2gFJ#rNu4|W>lcngMy#jZFKhtaBNMm2FLn#HKz!e^4=D5^y-qqpLVXtDs`Ly^@J6?eYmC)ljG_{*-sa!5~WUtHrXX}kd zy(3Gd-KuZG?45C&pXoYa@(1mhjA=*g%5m4&0W|kXnkQ14zxa7_0nmC%(pr?#+Td&E zbHMaJk{MUZOqs2j18mwFW6!LBF)K#<1NH3#*|$&lxAY32GqL3qU`{$`l`q+^0No@7 z-4e-^JAVDG*nOvuPdPSVc9#0tnjFgRaMsh>)4M~`o08I-<1^UtkWYG5 xz}zXx+yzOiKh^#ftl|gs@QObMn6FYO|4~lnId9}%02T&F7RIG4JYW;~$5#N(v#|gG delta 448 zcmY+c6W7m#X1{YED=Ew+l^^-!LST$s@YKexMgU0hoM~zg`FG zAXm*0^_bk$F`#kFYSdYc4{C@tK(WXwHdw`>%-db^(Hy6S=>WEU@ziW@O(Phjyj=mb zP8qESzGBts$=L*SrdgdbtFuk(?k=D!SlwP(aw90vaAp9|TW0ij_^5Y6HNW*ff0Wgq zW%bKc3hn`e9@b!jHJGQVunL%cWzBxFh897t^_OUiH9BLB?&vCB0gSs@;{t0uCnr0L Ee{=(6DF6Tf