diff --git a/src/main/java/com/mineblock11/skinshuffle/client/gui/GeneratedScreens.java b/src/main/java/com/mineblock11/skinshuffle/client/gui/GeneratedScreens.java new file mode 100644 index 0000000..400435b --- /dev/null +++ b/src/main/java/com/mineblock11/skinshuffle/client/gui/GeneratedScreens.java @@ -0,0 +1,59 @@ +/* + * + * Copyright (C) 2023 Calum (mineblock11), enjarai + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + */ + +package com.mineblock11.skinshuffle.client.gui; + +import com.mineblock11.skinshuffle.client.config.SkinShuffleConfig; +import com.mineblock11.skinshuffle.networking.ClientSkinHandling; +import com.mineblock11.skinshuffle.util.NetworkingUtil; +import com.mineblock11.skinshuffle.util.ToastHelper; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.ConfirmScreen; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +public class GeneratedScreens { + public static Screen getConfigScreen(Screen parent) { + return SkinShuffleConfig.getInstance().generateScreen(parent); + } + + public static Screen getReconnectScreen(Screen target) { + MinecraftClient client = MinecraftClient.getInstance(); + return new ConfirmScreen((boolean result) -> { + if(result) { + NetworkingUtil.handleReconnect(client); + } else { + if (!ClientSkinHandling.isInstalledOnServer()) { + ToastHelper.showRefusedReconnectToast(); + ClientSkinHandling.setReconnectRequired(true); + } + + client.setScreen(target); + } + }, Text.translatable("skinshuffle.reconnect.title", + client.isInSingleplayer() ? I18n.translate("skinshuffle.reconnect.c_region") : I18n.translate("skinshuffle.reconnect.c_reconnect")).formatted(Formatting.RED, Formatting.BOLD), + Text.translatable("skinshuffle.reconnect.message", + client.isInSingleplayer() ? I18n.translate("skinshuffle.reconnect.rejoin") : I18n.translate("skinshuffle.reconnect.reconnect_to"), + client.isInSingleplayer() ? I18n.translate("skinshuffle.reconnect.world") : client.isConnectedToRealms() ? I18n.translate("skinshuffle.reconnect.realm") : I18n.translate("skinshuffle.reconnect.server"), + client.isInSingleplayer() ? I18n.translate("skinshuffle.reconnect.rejoin") : I18n.translate("skinshuffle.reconnect.reconnect"))); + } +} diff --git a/src/main/java/com/mineblock11/skinshuffle/client/gui/SkinCarouselScreen.java b/src/main/java/com/mineblock11/skinshuffle/client/gui/SkinCarouselScreen.java index a3daf53..ee22963 100644 --- a/src/main/java/com/mineblock11/skinshuffle/client/gui/SkinCarouselScreen.java +++ b/src/main/java/com/mineblock11/skinshuffle/client/gui/SkinCarouselScreen.java @@ -115,7 +115,7 @@ protected void init() { this.close(); })); - this.addDrawableChild(new SpruceIconButtonWidget(Position.of(2, 2), 20, 20, Text.empty(), (btn) -> this.client.setScreenAndRender(SkinShuffleConfigScreen.get(this))) { + this.addDrawableChild(new SpruceIconButtonWidget(Position.of(2, 2), 20, 20, Text.empty(), (btn) -> this.client.setScreenAndRender(GeneratedScreens.getConfigScreen(this))) { @Override protected int renderIcon(DrawContext graphics, int mouseX, int mouseY, float delta) { graphics.drawTexture(SkinShuffle.id("textures/gui/config-button-icon.png"), this.getX() + this.getWidth() / 2 - (14 / 2), this.getY() + this.getHeight() / 2 - (14 / 2), 14, 14, 0, 0, 15, 15, 15, 15); @@ -137,22 +137,7 @@ protected int renderIcon(DrawContext graphics, int mouseX, int mouseY, float del SkinPresetManager.setChosenPreset(presetWidget.getPreset(), this.hasEditedPreset); if(this.client.world != null && !ClientSkinHandling.isInstalledOnServer()) { - this.client.setScreen(new ConfirmScreen((boolean result) -> { - if(result) { - NetworkingUtil.handleReconnect(client); - } else { - if (!ClientSkinHandling.isInstalledOnServer()) { - ToastHelper.showRefusedReconnectToast(); - } - - client.setScreen(this.parent); - } - }, Text.translatable("skinshuffle.reconnect.title", - client.isInSingleplayer() ? I18n.translate("skinshuffle.reconnect.c_region") : I18n.translate("skinshuffle.reconnect.c_reconnect")).formatted(Formatting.RED, Formatting.BOLD), - Text.translatable("skinshuffle.reconnect.message", - client.isInSingleplayer() ? I18n.translate("skinshuffle.reconnect.rejoin") : I18n.translate("skinshuffle.reconnect.reconnect_to"), - client.isInSingleplayer() ? I18n.translate("skinshuffle.reconnect.world") : client.isConnectedToRealms() ? I18n.translate("skinshuffle.reconnect.realm") : I18n.translate("skinshuffle.reconnect.server"), - client.isInSingleplayer() ? I18n.translate("skinshuffle.reconnect.rejoin") : I18n.translate("skinshuffle.reconnect.reconnect")))); + this.client.setScreen(GeneratedScreens.getReconnectScreen(this.parent)); } else { this.close(); } diff --git a/src/main/java/com/mineblock11/skinshuffle/client/gui/SkinShuffleConfigScreen.java b/src/main/java/com/mineblock11/skinshuffle/client/gui/SkinShuffleConfigScreen.java deleted file mode 100644 index 5a06e6c..0000000 --- a/src/main/java/com/mineblock11/skinshuffle/client/gui/SkinShuffleConfigScreen.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * - * Copyright (C) 2023 Calum (mineblock11), enjarai - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 - * USA - */ - -package com.mineblock11.skinshuffle.client.gui; - -import com.mineblock11.skinshuffle.client.config.SkinShuffleConfig; -import net.minecraft.client.gui.screen.Screen; - -public class SkinShuffleConfigScreen { - public static Screen get(Screen parent) { - return SkinShuffleConfig.getInstance().generateScreen(parent); - } -} diff --git a/src/main/java/com/mineblock11/skinshuffle/client/gui/widgets/OpenCarouselWidget.java b/src/main/java/com/mineblock11/skinshuffle/client/gui/widgets/OpenCarouselWidget.java index b6b2a88..836a7f6 100644 --- a/src/main/java/com/mineblock11/skinshuffle/client/gui/widgets/OpenCarouselWidget.java +++ b/src/main/java/com/mineblock11/skinshuffle/client/gui/widgets/OpenCarouselWidget.java @@ -20,30 +20,40 @@ package com.mineblock11.skinshuffle.client.gui.widgets; +import com.mineblock11.skinshuffle.SkinShuffle; import com.mineblock11.skinshuffle.client.config.SkinPresetManager; import com.mineblock11.skinshuffle.client.config.SkinShuffleConfig; +import com.mineblock11.skinshuffle.client.gui.GeneratedScreens; import com.mineblock11.skinshuffle.client.gui.SkinCarouselScreen; import com.mineblock11.skinshuffle.client.gui.cursed.DummyClientPlayerEntity; import com.mineblock11.skinshuffle.client.gui.cursed.GuiEntityRenderer; import com.mineblock11.skinshuffle.client.preset.SkinPreset; import com.mineblock11.skinshuffle.mixin.accessor.GameMenuScreenAccessor; +import com.mineblock11.skinshuffle.networking.ClientSkinHandling; import com.terraformersmc.modmenu.config.ModMenuConfig; import dev.lambdaurora.spruceui.Position; +import dev.lambdaurora.spruceui.Tooltip; import dev.lambdaurora.spruceui.widget.SpruceButtonWidget; +import dev.lambdaurora.spruceui.widget.SpruceTexturedButtonWidget; import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.GameMenuScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.TitleScreen; +import net.minecraft.client.resource.language.I18n; import net.minecraft.client.util.GlfwUtil; +import net.minecraft.text.MutableText; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import java.util.UUID; import java.util.function.Consumer; public class OpenCarouselWidget extends SpruceContainerWidget { private final Screen parent; + private final MutableText warningTooltip; + private SpruceTexturedButtonWidget warningIcon; private SkinPreset selectedPreset; private DummyClientPlayerEntity entity; private double currentTime = 0; @@ -55,10 +65,29 @@ private OpenCarouselWidget(Position position, int width, int height, Screen scre currentTime = GlfwUtil.getTime(); - this.addChild(new SpruceButtonWidget(Position.of(0, 0), width, 20, Text.translatable("skinshuffle.button"), button -> { + this.addChild(new SpruceButtonWidget(Position.of(0, 0), width - 18, 20, Text.translatable("skinshuffle.button"), button -> { this.client.setScreen(new SkinCarouselScreen(parent)); })); + this.warningTooltip = Text.literal(I18n.translate("skinshuffle.reconnect.warning", + client.isInSingleplayer() ? I18n.translate("skinshuffle.reconnect.rejoin") : I18n.translate("skinshuffle.reconnect.reconnect"))).formatted(Formatting.RED, Formatting.BOLD); + + if(screen instanceof GameMenuScreen) { + this.warningIcon = new SpruceTexturedButtonWidget(Position.of(width - 16, 2), 16, 16, Text.empty(), true, btn -> { + this.client.setScreen(GeneratedScreens.getReconnectScreen(screen)); + }, 0, 0, 16, SkinShuffle.id("textures/gui/warning-icon.png"), 16, 32) { + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!this.isActive() || !this.isVisible() || !this.isMouseHovered()) + return false; + + return this.onMouseClick(mouseX, mouseY, button); + } + }; + + this.addChild(warningIcon); + } + setSelectedPreset(SkinPresetManager.getChosenPreset()); } @@ -81,7 +110,7 @@ public static void safelyCreateWidget(Screen screen, Consumer { handshakeTakenPlace = false; + setReconnectRequired(false); }); ClientPlayNetworking.registerGlobalReceiver(SkinShuffle.id("handshake"), (client1, handler1, buf, responseSender) -> { diff --git a/src/main/resources/assets/skinshuffle/lang/en_us.yml b/src/main/resources/assets/skinshuffle/lang/en_us.yml index c7e0bee..afd1801 100644 --- a/src/main/resources/assets/skinshuffle/lang/en_us.yml +++ b/src/main/resources/assets/skinshuffle/lang/en_us.yml @@ -1,5 +1,6 @@ skinshuffle: reconnect: + warning: "You must %s to allow other players, including yourself, to see your skin." reconnecting: Reconnecting... rejoining: Rejoining... rejoin: rejoin diff --git a/src/main/resources/assets/skinshuffle/textures/gui/warning-icon.png b/src/main/resources/assets/skinshuffle/textures/gui/warning-icon.png new file mode 100644 index 0000000..262a5d4 Binary files /dev/null and b/src/main/resources/assets/skinshuffle/textures/gui/warning-icon.png differ