diff --git a/src/main/java/net/silentclient/client/Client.java b/src/main/java/net/silentclient/client/Client.java index 6b6fc36..1b39d41 100644 --- a/src/main/java/net/silentclient/client/Client.java +++ b/src/main/java/net/silentclient/client/Client.java @@ -6,6 +6,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.multiplayer.ServerData; +import net.minecraft.client.multiplayer.ServerList; import net.minecraft.client.resources.data.IMetadataSerializer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Session; @@ -223,17 +224,18 @@ public class Client { content.append(inputLine); } - globalSettings.setConfig(new JSONObject(content.toString()).getString("config")); - globalSettings.setLite(new JSONObject(content.toString()).getBoolean("lite")); - globalSettings.setDisplayedTutorial(new JSONObject(content.toString()).getBoolean("displayedTutorial")); - globalSettings.setConfigsMigrated(new JSONObject(content.toString()).getBoolean("configsMigrated")); - globalSettings.setPacksPanoramaEnabled(new JSONObject(content.toString()).getBoolean("packsPanoramaEnabled")); + globalSettings = gson.fromJson(content.toString(), GlobalSettings.class); + Client.getInstance().updateWindowTitle(); in.close(); } catch (Exception err) { Client.logger.catching(err); } + if(globalSettings == null) { + globalSettings = new GlobalSettings(); + } + globalSettings.save(); Client.getInstance().updateWindowTitle(); if(!globalSettings.configsMigrated && new File(Minecraft.getMinecraft().mcDataDir, "SilentClient").exists() && new File(Minecraft.getMinecraft().mcDataDir, "SilentClient").isDirectory()) { @@ -295,6 +297,20 @@ public class Client { featuredServers.add(new ServerDataFeature(server.getName(), server.getIp())); }); } + ServerList savedServerList = new ServerList(Minecraft.getMinecraft()); + savedServerList.loadServerList(); + ArrayList newSavedFeaturedServers = new ArrayList<>(globalSettings.getSavedFeaturedServers()); + globalSettings.getSavedFeaturedServers().forEach((savedServer) -> { + if(FeaturedServers.findByIPServerDataFeature(savedServer.getIp(), featuredServers) == null) { + Client.logger.info("adding saved featured server to server list: " + savedServer.getIp()); + savedServerList.addServerData(new ServerData(savedServer.getName(), savedServer.getIp(), false)); + newSavedFeaturedServers.remove(savedServer); + } + }); + globalSettings.setSavedFeaturedServers(newSavedFeaturedServers); + globalSettings.save(); + + savedServerList.saveServerList(); logger.info("STARTING > friends"); this.updateFriendsList(); @@ -356,7 +372,7 @@ public class Client { Client.logger.info("STARTING > config-manager-post-init"); configManager.postInit(); - if(!globalSettings.displayedTutorial) { + if(!globalSettings.isDisplayedTutorial()) { Minecraft.getMinecraft().displayGuiScreen(new UserTutorial()); } } catch(Exception err) { diff --git a/src/main/java/net/silentclient/client/gui/multiplayer/components/ServerComponent.java b/src/main/java/net/silentclient/client/gui/multiplayer/components/ServerComponent.java index cbd52ef..ec69cd1 100644 --- a/src/main/java/net/silentclient/client/gui/multiplayer/components/ServerComponent.java +++ b/src/main/java/net/silentclient/client/gui/multiplayer/components/ServerComponent.java @@ -22,6 +22,7 @@ import net.silentclient.client.gui.lite.clickgui.utils.MouseUtils; import net.silentclient.client.gui.multiplayer.SilentMultiplayerGui; import net.silentclient.client.gui.theme.Theme; import net.silentclient.client.gui.util.RenderUtil; +import net.silentclient.client.utils.FeaturedServers; import net.silentclient.client.utils.MouseCursorHandler; import org.apache.commons.lang3.Validate; @@ -56,6 +57,7 @@ public class ServerComponent { public MouseCursorHandler.CursorType draw(int serverIndex, int mouseX, int mouseY, float x, float y, boolean isSelected) { MouseCursorHandler.CursorType cursorType = null; boolean featured = this.server instanceof ServerDataFeature; + boolean unsaved = featured && FeaturedServers.findByIPFeaturedServerInfo(this.server.serverIP, Client.getInstance().getGlobalSettings().getSavedFeaturedServers()) == null; if (!this.server.field_78841_f) { this.server.field_78841_f = true; @@ -122,7 +124,7 @@ public class ServerComponent { boolean flag2 = flag || flag1; String s2 = flag2 ? EnumChatFormatting.DARK_RED + this.server.gameVersion : this.server.populationInfo; int j = this.mc.fontRendererObj.getStringWidth(s2); - this.mc.fontRendererObj.drawString(s2, (int) x + 240 - j - 15 - 2 - (featured ? 10 : 0), (int) y + 3, -1); + this.mc.fontRendererObj.drawString(s2, (int) x + 240 - j - 15 - 2 - (featured ? 10 : 0) - (unsaved ? 10 : 0), (int) y + 3, -1); int k = 0; String s = null; int l; @@ -186,12 +188,17 @@ public class ServerComponent { GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(Gui.icons); - Gui.drawModalRectWithCustomSizedTexture((int) x + 240 - 15 - (featured ? 10 : 0), (int) y + 2, (float)(k * 10), (float)(176 + l * 8), 10, 8, 256.0F, 256.0F); - Tooltip.render(mouseX, mouseY, x + 240 - 15 - (featured ? 10 : 0), y + 2, 10, 8, s1); + Gui.drawModalRectWithCustomSizedTexture((int) x + 240 - 15 - (featured ? 10 : 0) - (unsaved ? 10 : 0), (int) y + 2, (float)(k * 10), (float)(176 + l * 8), 10, 8, 256.0F, 256.0F); + Tooltip.render(mouseX, mouseY, x + 240 - 15 - (featured ? 10 : 0) - (unsaved ? 10 : 0), y + 2, 10, 8, s1); - if(this.server instanceof ServerDataFeature) { - RenderUtil.drawImage(new ResourceLocation("silentclient/icons/star.png"), x + 240 - 13, y + 2, 8, 8); - Tooltip.render(mouseX, mouseY, x + 240 - 13, y + 2, 8, 8, "Featured Server"); + if(featured) { + RenderUtil.drawImage(new ResourceLocation("silentclient/icons/star.png"), x + 240 - 13 - (unsaved ? 10 : 0), y + 2, 8, 8); + Tooltip.render(mouseX, mouseY, x + 240 - 13 - (unsaved ? 10 : 0), y + 2, 8, 8, "Featured Server"); + + if(unsaved) { + RenderUtil.drawImage(new ResourceLocation("silentclient/icons/save-icon.png"), x + 240 - 13, y + 2, 8, 8); + Tooltip.render(mouseX, mouseY, x + 240 - 13, y + 2, 8, 8, "Save Server"); + } } return cursorType; @@ -213,6 +220,13 @@ public class ServerComponent { return isHovered; } } + if(this.server instanceof ServerDataFeature) { + if(FeaturedServers.findByIPFeaturedServerInfo(this.server.serverIP, Client.getInstance().getGlobalSettings().getSavedFeaturedServers()) == null && MouseUtils.isInside(mouseX, mouseY, x + 240 - 13, y + 2, 8, 8)) { + Client.getInstance().getGlobalSettings().getSavedFeaturedServers().add(new FeaturedServers.FeaturedServerInfo(this.server.serverName, this.server.serverIP)); + Client.getInstance().getGlobalSettings().save(); + return isHovered; + } + } if(!isSelected) { this.owner.selectServer(serverIndex); } else { diff --git a/src/main/java/net/silentclient/client/utils/FeaturedServers.java b/src/main/java/net/silentclient/client/utils/FeaturedServers.java index d800bdd..07d02c6 100644 --- a/src/main/java/net/silentclient/client/utils/FeaturedServers.java +++ b/src/main/java/net/silentclient/client/utils/FeaturedServers.java @@ -3,6 +3,7 @@ package net.silentclient.client.utils; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import net.silentclient.client.ServerDataFeature; import java.lang.reflect.Type; import java.util.ArrayList; @@ -22,10 +23,15 @@ public class FeaturedServers { } } - public class FeaturedServerInfo { + public static class FeaturedServerInfo { public String name; public String ip; + public FeaturedServerInfo(String name, String ip) { + this.name = name; + this.ip = ip; + } + public String getName() { return name; } @@ -34,4 +40,22 @@ public class FeaturedServers { return ip; } } + + public static ServerDataFeature findByIPServerDataFeature(String ip, ArrayList servers) { + for (ServerDataFeature server : servers) { + if (server.serverIP.equals(ip)) { + return server; + } + } + return null; + } + + public static FeaturedServerInfo findByIPFeaturedServerInfo(String ip, ArrayList servers) { + for (FeaturedServerInfo server : servers) { + if (server.getIp().equals(ip)) { + return server; + } + } + return null; + } } \ No newline at end of file diff --git a/src/main/java/net/silentclient/client/utils/types/GlobalSettings.java b/src/main/java/net/silentclient/client/utils/types/GlobalSettings.java index d8dbe15..85a2ffa 100644 --- a/src/main/java/net/silentclient/client/utils/types/GlobalSettings.java +++ b/src/main/java/net/silentclient/client/utils/types/GlobalSettings.java @@ -1,8 +1,10 @@ package net.silentclient.client.utils.types; import net.silentclient.client.Client; +import net.silentclient.client.utils.FeaturedServers; import java.io.FileOutputStream; +import java.util.ArrayList; public class GlobalSettings { public String config; @@ -10,15 +12,20 @@ public class GlobalSettings { public boolean displayedTutorial; public boolean configsMigrated; public boolean packsPanoramaEnabled; + public ArrayList savedFeaturedServers; public GlobalSettings() { this.config = "Default.txt"; this.lite = false; this.displayedTutorial = false; this.packsPanoramaEnabled = true; + this.savedFeaturedServers = new ArrayList<>(); } public String getConfig() { + if(config == null) { + config = "Default.txt"; + } return config; } @@ -55,6 +62,17 @@ public class GlobalSettings { this.packsPanoramaEnabled = packsPanoramaEnabled; } + public ArrayList getSavedFeaturedServers() { + if(savedFeaturedServers == null) { + this.savedFeaturedServers = new ArrayList<>(); + } + return savedFeaturedServers; + } + + public void setSavedFeaturedServers(ArrayList savedFeaturedServers) { + this.savedFeaturedServers = savedFeaturedServers; + } + public void save() { try { FileOutputStream outputStream = new FileOutputStream(Client.getInstance().getGlobalSettingsFile()); diff --git a/src/main/resources/assets/minecraft/silentclient/icons/save-icon.png b/src/main/resources/assets/minecraft/silentclient/icons/save-icon.png new file mode 100755 index 0000000..0526dd1 Binary files /dev/null and b/src/main/resources/assets/minecraft/silentclient/icons/save-icon.png differ