diff --git a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java index 6e4879c6..80b788a4 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java +++ b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java @@ -1,12 +1,14 @@ package com.minelittlepony.unicopia.client; import java.util.Optional; + +import com.minelittlepony.common.client.gui.element.Button; import com.minelittlepony.common.event.ScreenInitCallback; import com.minelittlepony.common.event.ScreenInitCallback.ButtonList; import com.minelittlepony.unicopia.InteractionManager; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Unicopia; -import com.minelittlepony.unicopia.client.gui.SettingsScreen; +import com.minelittlepony.unicopia.client.gui.LanSettingsScreen; import com.minelittlepony.unicopia.client.gui.UHud; import com.minelittlepony.unicopia.client.minelittlepony.MineLPConnector; import com.minelittlepony.unicopia.entity.player.PlayerCamera; @@ -15,9 +17,11 @@ import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.OpenToLanScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.world.CreateWorldScreen; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.text.TranslatableText; public class UnicopiaClient implements ClientModInitializer { @@ -69,7 +73,12 @@ public class UnicopiaClient implements ClientModInitializer { private void onScreenInit(Screen screen, ButtonList buttons) { if (screen instanceof CreateWorldScreen) { - buttons.addButton(SettingsScreen.createRaceSelector(screen)); + buttons.addButton(LanSettingsScreen.createRaceSelector(screen)); + } + if (screen instanceof OpenToLanScreen) { + buttons.addButton(new Button(screen.width / 2 - 155, 130, 150, 20)) + .onClick(b -> MinecraftClient.getInstance().openScreen(new LanSettingsScreen(screen))) + .getStyle().setText(new TranslatableText("unicopia.options.title")); } } diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/LanSettingsScreen.java b/src/main/java/com/minelittlepony/unicopia/client/gui/LanSettingsScreen.java new file mode 100644 index 00000000..b4605b03 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/LanSettingsScreen.java @@ -0,0 +1,169 @@ +package com.minelittlepony.unicopia.client.gui; + +import java.util.Set; + +import com.minelittlepony.common.client.gui.GameGui; +import com.minelittlepony.common.client.gui.ScrollContainer; +import com.minelittlepony.common.client.gui.dimension.Bounds; +import com.minelittlepony.common.client.gui.element.Button; +import com.minelittlepony.common.client.gui.element.Cycler; +import com.minelittlepony.common.client.gui.element.Label; +import com.minelittlepony.common.client.gui.element.Toggle; +import com.minelittlepony.common.client.gui.packing.GridPacker; +import com.minelittlepony.common.client.gui.sprite.TextureSprite; +import com.minelittlepony.unicopia.Config; +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.Unicopia; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.server.integrated.IntegratedServer; +import net.minecraft.text.TranslatableText; +import net.minecraft.util.Formatting; +import net.minecraft.util.math.MathHelper; + +public class LanSettingsScreen extends GameGui { + + private static final GridPacker WHITELIST_GRID_PACKER = new GridPacker() + .setItemSpacing(25) + .setListWidth(200) + .setItemWidth(30) + .setItemHeight(0); + + private final Config config = Unicopia.getConfig(); + + private final ScrollContainer content = new ScrollContainer(); + + private boolean forceShowWhitelist; + private boolean forceHideWhitelist; + + public LanSettingsScreen(Screen parent) { + super(new TranslatableText("unicopia.options.title"), parent); + + content.margin.setVertical(30); + content.getContentPadding().setHorizontal(10); + content.getContentPadding().top = 10; + content.getContentPadding().bottom = 20; + } + + @Override + public void init() { + content.init(this::rebuildContent); + } + + private void rebuildContent() { + + int LEFT = content.width / 2 - 100; + + IntegratedServer server = client.getServer(); + + // In game + // Singleplayer server != null && !server.isRemote(); + // Lan (hosting) server != null && server.isRemote(); + // Multiplayer server == null + // Out of game + // server == null + + final boolean canEditWhitelist = client.world == null || server != null; + + getChildElements().add(content); + + addButton(new Label(width / 2, 5).setCentered()).getStyle().setText(getTitle().getString()); + addButton(new Button(width / 2 - 100, height - 25)) + .onClick(sender -> finish()) + .getStyle() + .setText("gui.done"); + + int row = 0; + + content.addButton(new Label(LEFT, row += 20)).getStyle().setText("unicopia.options.lan"); + + Set whitelist = config.speciesWhiteList.get(); + boolean whitelistEnabled = (forceShowWhitelist || !whitelist.isEmpty()) && !forceHideWhitelist; + + if (whitelist.isEmpty() && forceShowWhitelist) { + for (Race r : Race.all()) { + if (!r.isDefault()) { + whitelist.add(r); + } + } + } + + content.addButton(new Toggle(LEFT, row += 20, whitelistEnabled)) + .onChange(v -> { + forceShowWhitelist = v; + forceHideWhitelist = !v; + init(); + return v; + }) + .setEnabled(canEditWhitelist) + .getStyle().setText("unicopia.options.whitelist"); + + if (whitelistEnabled) { + + content.addButton(new Label(LEFT, row += 20)).getStyle().setText(new TranslatableText("unicopia.options.whitelist.details").formatted(Formatting.DARK_GREEN)); + + row += 20; + WHITELIST_GRID_PACKER.start(); + + for (Race race : Race.all()) { + if (!race.isDefault()) { + Bounds bound = WHITELIST_GRID_PACKER.next(); + + Button button = content.addButton(new Toggle(LEFT + bound.left + 10, row + bound.top, whitelist.contains(race))) + .onChange(v -> { + if (v) { + whitelist.add(race); + } else { + whitelist.remove(race); + } + return v; + }) + .setEnabled(canEditWhitelist) + .setStyle(race.createStyle()); + + ((TextureSprite)button.getStyle().getIcon()).setPosition(-20, 0); + } + } + } + } + + @Override + public void render(MatrixStack matrices, int mouseX, int mouseY, float tickDelta) { + renderBackground(matrices); + super.render(matrices, mouseX, mouseY, tickDelta); + content.render(matrices, mouseX, mouseY, tickDelta); + } + + @Override + public void removed() { + if (forceHideWhitelist) { + config.speciesWhiteList.get().clear(); + } + config.save(); + } + + public static Cycler createRaceSelector(Screen screen) { + return new Cycler(screen.width / 2 + 110, 60, 20, 20) { + @Override + protected void renderForground(MatrixStack matrices, MinecraftClient mc, int mouseX, int mouseY, int foreColor) { + super.renderForground(matrices, mc, mouseX, mouseY, foreColor); + if (isMouseOver(mouseX, mouseY)) { + renderToolTip(matrices, screen, mouseX, mouseY); + } + } + }.setStyles( + Race.EARTH.createStyle(), + Race.UNICORN.createStyle(), + Race.PEGASUS.createStyle(), + Race.BAT.createStyle(), + Race.ALICORN.createStyle(), + Race.CHANGELING.createStyle() + ).onChange(i -> { + Unicopia.getConfig().preferredRace.set(Race.fromId(i + 1)); + Unicopia.getConfig().save(); + + return i; + }).setValue(MathHelper.clamp(Unicopia.getConfig().preferredRace.get().ordinal() - 1, 0, 5)); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/SettingsScreen.java b/src/main/java/com/minelittlepony/unicopia/client/gui/SettingsScreen.java index 799c15e2..098e27be 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/SettingsScreen.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/SettingsScreen.java @@ -1,22 +1,15 @@ package com.minelittlepony.unicopia.client.gui; -import java.util.Set; - import org.jetbrains.annotations.Nullable; import com.minelittlepony.common.client.gui.GameGui; import com.minelittlepony.common.client.gui.ScrollContainer; -import com.minelittlepony.common.client.gui.dimension.Bounds; import com.minelittlepony.common.client.gui.element.Button; -import com.minelittlepony.common.client.gui.element.Cycler; import com.minelittlepony.common.client.gui.element.EnumSlider; import com.minelittlepony.common.client.gui.element.Label; import com.minelittlepony.common.client.gui.element.Toggle; -import com.minelittlepony.common.client.gui.packing.GridPacker; -import com.minelittlepony.common.client.gui.sprite.TextureSprite; import com.minelittlepony.common.client.gui.style.Style; import com.minelittlepony.unicopia.Config; -import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.WorldTribeManager; import com.minelittlepony.unicopia.client.minelittlepony.MineLPConnector; @@ -30,16 +23,8 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; -import net.minecraft.util.math.MathHelper; public class SettingsScreen extends GameGui { - - private static final GridPacker WHITELIST_GRID_PACKER = new GridPacker() - .setItemSpacing(25) - .setListWidth(200) - .setItemWidth(30) - .setItemHeight(0); - private final Config config = Unicopia.getConfig(); private final ScrollContainer content = new ScrollContainer(); @@ -47,9 +32,6 @@ public class SettingsScreen extends GameGui { @Nullable private Style mineLpStatus; - private boolean forceShowWhitelist; - private boolean forceHideWhitelist; - public SettingsScreen(Screen parent) { super(new TranslatableText("unicopia.options.title"), parent); @@ -66,28 +48,7 @@ public class SettingsScreen extends GameGui { private void rebuildContent() { - int LEFT = content.width / 2 - 210; - int RIGHT = content.width / 2 + 10; - - IntegratedServer server = client.getServer(); - - // In game - // Singleplayer server != null && !server.isRemote(); - // Lan (hosting) server != null && server.isRemote(); - // Multiplayer server == null - // Out of game - // server == null - - final boolean showLanOptions = server == null || server.isRemote(); - - final boolean canEditWhitelist = client.world == null || server != null && server.isRemote(); - - boolean singleColumn = LEFT < 0 || !showLanOptions; - - if (singleColumn) { - LEFT = content.width / 2 - 100; - RIGHT = LEFT; - } + int LEFT = content.width / 2 - 100; getChildElements().add(content); @@ -117,6 +78,7 @@ public class SettingsScreen extends GameGui { .onChange(config.preferredRace::set) .setTextFormat(v -> new TranslatableText("unicopia.options.preferred_race", v.getValue().getDisplayName())); + IntegratedServer server = client.getServer(); if (server != null) { row += 20; content.addButton(new Label(LEFT, row)).getStyle().setText("unicopia.options.world"); @@ -128,57 +90,6 @@ public class SettingsScreen extends GameGui { .setTextFormat(v -> new TranslatableText("unicopia.options.world.default_race", v.getValue().getDisplayName())) .setEnabled(client.isInSingleplayer()); } - - if (showLanOptions) { - if (RIGHT != LEFT) { - row = 0; - } else { - row += 20; - } - - content.addButton(new Label(RIGHT, row)).getStyle().setText("unicopia.options.lan"); - - Set whitelist = config.speciesWhiteList.get(); - boolean whitelistEnabled = (forceShowWhitelist || !whitelist.isEmpty()) && !forceHideWhitelist; - - content.addButton(new Toggle(RIGHT, row += 20, whitelistEnabled)) - .onChange(v -> { - forceShowWhitelist = v; - forceHideWhitelist = !v; - init(); - return v; - }) - .setEnabled(canEditWhitelist) - .getStyle().setText("unicopia.options.whitelist"); - - if (whitelistEnabled) { - - content.addButton(new Label(RIGHT, row += 20)).getStyle().setText(new TranslatableText("unicopia.options.whitelist.details").formatted(Formatting.DARK_GREEN)); - - row += 20; - WHITELIST_GRID_PACKER.start(); - - for (Race race : Race.values()) { - if (!race.isDefault()) { - Bounds bound = WHITELIST_GRID_PACKER.next(); - - Button button = content.addButton(new Toggle(RIGHT + bound.left + 10, row + bound.top, whitelist.contains(race))) - .onChange(v -> { - if (v) { - whitelist.add(race); - } else { - whitelist.remove(race); - } - return v; - }) - .setEnabled(canEditWhitelist) - .setStyle(race.createStyle()); - - ((TextureSprite)button.getStyle().getIcon()).setPosition(-20, 0); - } - } - } - } } private Text getMineLPStatus() { @@ -204,33 +115,6 @@ public class SettingsScreen extends GameGui { @Override public void removed() { - if (forceHideWhitelist) { - config.speciesWhiteList.get().clear(); - } config.save(); } - - public static Cycler createRaceSelector(Screen screen) { - return new Cycler(screen.width / 2 + 110, 60, 20, 20) { - @Override - protected void renderForground(MatrixStack matrices, MinecraftClient mc, int mouseX, int mouseY, int foreColor) { - super.renderForground(matrices, mc, mouseX, mouseY, foreColor); - if (isMouseOver(mouseX, mouseY)) { - renderToolTip(matrices, screen, mouseX, mouseY); - } - } - }.setStyles( - Race.EARTH.createStyle(), - Race.UNICORN.createStyle(), - Race.PEGASUS.createStyle(), - Race.BAT.createStyle(), - Race.ALICORN.createStyle(), - Race.CHANGELING.createStyle() - ).onChange(i -> { - Unicopia.getConfig().preferredRace.set(Race.fromId(i + 1)); - Unicopia.getConfig().save(); - - return i; - }).setValue(MathHelper.clamp(Unicopia.getConfig().preferredRace.get().ordinal() - 1, 0, 5)); - } }