From 6d8e1e5659f64a4f9ba86d6ab5bbc8e688faf22a Mon Sep 17 00:00:00 2001 From: ThatGravyBoat Date: Tue, 6 Jul 2021 15:10:29 -0230 Subject: Initial Commit --- .../skyblockhud/ComponentBuilder.java | 55 ++ .../skyblockhud/ComponentHandler.java | 124 +++++ .../com/thatgravyboat/skyblockhud/GuiTextures.java | 37 ++ .../com/thatgravyboat/skyblockhud/SkyblockHud.java | 195 +++++++ .../thatgravyboat/skyblockhud/SpecialColour.java | 95 ++++ .../java/com/thatgravyboat/skyblockhud/Utils.java | 247 +++++++++ .../skyblockhud/api/LeaderboardGetter.java | 65 +++ .../api/events/ProfileSwitchedEvent.java | 7 + .../api/events/SidebarLineUpdateEvent.java | 22 + .../skyblockhud/api/events/SidebarPostEvent.java | 22 + .../skyblockhud/api/events/SidebarPreGetEvent.java | 18 + .../skyblockhud/commands/Commands.java | 42 ++ .../skyblockhud/commands/SimpleCommand.java | 58 ++ .../skyblockhud/config/KeyBindings.java | 9 + .../skyblockhud/config/SBHConfig.java | 486 +++++++++++++++++ .../skyblockhud/config/SBHConfigEditor.java | 597 +++++++++++++++++++++ .../skyblockhud/core/BackgroundBlur.java | 231 ++++++++ .../skyblockhud/core/ChromaColour.java | 95 ++++ .../skyblockhud/core/GlScissorStack.java | 87 +++ .../thatgravyboat/skyblockhud/core/GuiElement.java | 8 + .../skyblockhud/core/GuiElementBoolean.java | 121 +++++ .../skyblockhud/core/GuiElementColour.java | 368 +++++++++++++ .../skyblockhud/core/GuiElementTextField.java | 534 ++++++++++++++++++ .../skyblockhud/core/GuiScreenElementWrapper.java | 35 ++ .../skyblockhud/core/config/Config.java | 8 + .../skyblockhud/core/config/Position.java | 196 +++++++ .../core/config/annotations/Category.java | 15 + .../core/config/annotations/ConfigAccordionId.java | 14 + .../config/annotations/ConfigEditorAccordion.java | 14 + .../config/annotations/ConfigEditorBoolean.java | 12 + .../config/annotations/ConfigEditorButton.java | 15 + .../config/annotations/ConfigEditorColour.java | 13 + .../annotations/ConfigEditorDraggableList.java | 14 + .../config/annotations/ConfigEditorDropdown.java | 16 + .../config/annotations/ConfigEditorSlider.java | 18 + .../core/config/annotations/ConfigEditorText.java | 13 + .../core/config/annotations/ConfigOption.java | 17 + .../core/config/gui/GuiOptionEditor.java | 62 +++ .../core/config/gui/GuiOptionEditorAccordion.java | 82 +++ .../core/config/gui/GuiOptionEditorBoolean.java | 38 ++ .../core/config/gui/GuiOptionEditorButton.java | 64 +++ .../core/config/gui/GuiOptionEditorColour.java | 71 +++ .../config/gui/GuiOptionEditorDraggableList.java | 284 ++++++++++ .../core/config/gui/GuiOptionEditorDropdown.java | 152 ++++++ .../core/config/gui/GuiOptionEditorSlider.java | 132 +++++ .../core/config/gui/GuiOptionEditorText.java | 84 +++ .../core/config/gui/GuiPositionEditor.java | 179 ++++++ .../core/config/struct/ConfigProcessor.java | 176 ++++++ .../skyblockhud/core/util/GuiElementSlider.java | 123 +++++ .../skyblockhud/core/util/MiscUtils.java | 104 ++++ .../skyblockhud/core/util/Splitters.java | 10 + .../skyblockhud/core/util/StringUtils.java | 39 ++ .../skyblockhud/core/util/lerp/LerpUtils.java | 26 + .../skyblockhud/core/util/lerp/LerpingFloat.java | 68 +++ .../skyblockhud/core/util/lerp/LerpingInteger.java | 76 +++ .../skyblockhud/core/util/render/RenderUtils.java | 165 ++++++ .../core/util/render/TextRenderUtils.java | 215 ++++++++ .../skyblockhud/dungeons/Classes.java | 50 ++ .../skyblockhud/dungeons/DungeonHandler.java | 167 ++++++ .../skyblockhud/dungeons/DungeonPlayer.java | 31 ++ .../skyblockhud/handlers/BossbarHandler.java | 37 ++ .../skyblockhud/handlers/CurrencyHandler.java | 81 +++ .../skyblockhud/handlers/HeldItemHandler.java | 58 ++ .../skyblockhud/handlers/MapHandler.java | 219 ++++++++ .../skyblockhud/handlers/SlayerHandler.java | 121 +++++ .../skyblockhud/handlers/TimeHandler.java | 29 + .../handlers/mapicons/DwarvenIcons.java | 96 ++++ .../skyblockhud/handlers/mapicons/HubIcons.java | 308 +++++++++++ .../handlers/sbentities/EntityTypeHelper.java | 21 + .../handlers/sbentities/EntityTypeRegistry.java | 25 + .../handlers/sbentities/SkyBlockEntity.java | 26 + .../skyblockhud/location/DwarvenMineHandler.java | 97 ++++ .../skyblockhud/location/EndIslandHandler.java | 46 ++ .../skyblockhud/location/FarmingIslandHandler.java | 29 + .../skyblockhud/location/IslandHandler.java | 62 +++ .../skyblockhud/location/LocationCategory.java | 46 ++ .../skyblockhud/location/LocationHandler.java | 54 ++ .../skyblockhud/location/Locations.java | 157 ++++++ .../skyblockhud/location/ParkIslandHandler.java | 31 ++ .../skyblockhud/mixins/MixinEndermanRenderer.java | 25 + .../skyblockhud/mixins/MixinEntityArrow.java | 25 + .../skyblockhud/mixins/MixinGuiIngameForge.java | 92 ++++ .../mixins/MixinNetHandlerPlayClient.java | 53 ++ .../skyblockhud/overlay/DungeonOverlay.java | 150 ++++++ .../skyblockhud/overlay/GenericOverlays.java | 44 ++ .../skyblockhud/overlay/OverlayHud.java | 286 ++++++++++ .../thatgravyboat/skyblockhud/overlay/RPGHud.java | 102 ++++ .../skyblockhud/playerstats/ActionBarParsing.java | 131 +++++ .../thatgravyboat/skyblockhud/seasons/Season.java | 50 ++ .../skyblockhud/seasons/SeasonDateHandler.java | 57 ++ .../skyblockhud/tracker/KillTrackerHandler.java | 76 +++ .../skyblockhud/tracker/TrackerFileLoader.java | 171 ++++++ .../skyblockhud/tracker/TrackerHandler.java | 124 +++++ 93 files changed, 9250 insertions(+) create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/ComponentBuilder.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/ComponentHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/GuiTextures.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/SkyblockHud.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/SpecialColour.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/Utils.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/LeaderboardGetter.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/events/ProfileSwitchedEvent.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarLineUpdateEvent.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPostEvent.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPreGetEvent.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/commands/Commands.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/commands/SimpleCommand.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/config/KeyBindings.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/config/SBHConfig.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/config/SBHConfigEditor.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/BackgroundBlur.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/ChromaColour.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/GlScissorStack.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/GuiElement.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/GuiElementBoolean.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/GuiElementColour.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/GuiElementTextField.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/GuiScreenElementWrapper.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/Config.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/Position.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/annotations/Category.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/annotations/ConfigAccordionId.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/annotations/ConfigEditorAccordion.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/annotations/ConfigEditorBoolean.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/annotations/ConfigEditorButton.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/annotations/ConfigEditorColour.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/annotations/ConfigEditorDraggableList.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/annotations/ConfigEditorDropdown.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/annotations/ConfigEditorSlider.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/annotations/ConfigEditorText.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/annotations/ConfigOption.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/gui/GuiOptionEditor.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/gui/GuiOptionEditorAccordion.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/gui/GuiOptionEditorBoolean.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/gui/GuiOptionEditorButton.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/gui/GuiOptionEditorColour.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/gui/GuiOptionEditorDraggableList.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/gui/GuiOptionEditorDropdown.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/gui/GuiOptionEditorSlider.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/gui/GuiOptionEditorText.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/gui/GuiPositionEditor.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/config/struct/ConfigProcessor.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/util/GuiElementSlider.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/util/MiscUtils.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/util/Splitters.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/util/StringUtils.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/util/lerp/LerpUtils.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/util/lerp/LerpingFloat.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/util/lerp/LerpingInteger.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/util/render/RenderUtils.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/core/util/render/TextRenderUtils.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/dungeons/Classes.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/dungeons/DungeonHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/dungeons/DungeonPlayer.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/handlers/BossbarHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/handlers/CurrencyHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/handlers/HeldItemHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/handlers/MapHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/handlers/SlayerHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/handlers/TimeHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/handlers/mapicons/DwarvenIcons.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/handlers/mapicons/HubIcons.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/handlers/sbentities/EntityTypeHelper.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/handlers/sbentities/EntityTypeRegistry.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/handlers/sbentities/SkyBlockEntity.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/location/DwarvenMineHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/location/EndIslandHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/location/FarmingIslandHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/location/IslandHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/location/LocationCategory.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/location/LocationHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/location/Locations.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/location/ParkIslandHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/mixins/MixinEndermanRenderer.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/mixins/MixinEntityArrow.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/mixins/MixinGuiIngameForge.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/mixins/MixinNetHandlerPlayClient.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/overlay/DungeonOverlay.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/overlay/GenericOverlays.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/overlay/OverlayHud.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/overlay/RPGHud.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/playerstats/ActionBarParsing.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/seasons/Season.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/seasons/SeasonDateHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/tracker/KillTrackerHandler.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/tracker/TrackerFileLoader.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/tracker/TrackerHandler.java (limited to 'src/main/java') diff --git a/src/main/java/com/thatgravyboat/skyblockhud/ComponentBuilder.java b/src/main/java/com/thatgravyboat/skyblockhud/ComponentBuilder.java new file mode 100644 index 0000000..e5299d5 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/ComponentBuilder.java @@ -0,0 +1,55 @@ +package com.thatgravyboat.skyblockhud; + +public class ComponentBuilder { + + public StringBuilder builder; + + public ComponentBuilder(){ + this.builder = new StringBuilder(); + } + + public ComponentBuilder apd(String text) { + return apd(text, '7'); + } + + public ComponentBuilder apd(String text, char[] colors) { + for (char color: colors) { + builder.append("\u00A7").append(color); + } + builder.append(text).append("\u00A7").append('r'); + return this; + } + + public ComponentBuilder apd(String text, char color) { + builder.append("\u00A7").append(color).append(text).append("\u00A7").append('r'); + return this; + } + + public ComponentBuilder nl(){ + builder.append("\n"); + return this; + } + + public ComponentBuilder nl(String text, char color){ + apd(text, color); + builder.append("\n"); + return this; + } + + public ComponentBuilder nl(String text, char[] colors){ + apd(text, colors); + builder.append("\n"); + return this; + } + + public ComponentBuilder nl(String text){ + apd(text); + builder.append("\n"); + return this; + } + + public String build() { + return builder.toString(); + } + +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/ComponentHandler.java b/src/main/java/com/thatgravyboat/skyblockhud/ComponentHandler.java new file mode 100644 index 0000000..3c671f0 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/ComponentHandler.java @@ -0,0 +1,124 @@ +package com.thatgravyboat.skyblockhud; + +import com.google.common.collect.ComparisonChain; +import com.google.common.collect.Ordering; +import com.thatgravyboat.skyblockhud.dungeons.DungeonHandler; +import com.thatgravyboat.skyblockhud.location.*; +import com.thatgravyboat.skyblockhud.seasons.SeasonDateHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.NetworkPlayerInfo; +import net.minecraft.scoreboard.ScorePlayerTeam; +import net.minecraft.world.WorldSettings; +import net.minecraftforge.client.GuiIngameForge; +import net.minecraftforge.client.event.ClientChatReceivedEvent; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import java.util.Comparator; +import java.util.List; +import java.util.regex.Pattern; + +public class ComponentHandler { + public static final Pattern SCOREBOARD_CHARACTERS = Pattern.compile("[^]\\[a-z A-Z:0-9/'.()+\\d-ยง?]"); + private static final Ordering sortingList = Ordering.from(new PlayerComparator()); + private static int ticksExisted = 0; + + @SubscribeEvent + public void onClientTick(TickEvent.ClientTickEvent event){ + Minecraft mc = Minecraft.getMinecraft(); + ticksExisted++; + boolean eventPass = false; + if (mc.theWorld != null) { + List players = sortingList.sortedCopy(mc.thePlayer.sendQueue.getPlayerInfoMap()); + GuiIngameForge.renderObjective = !SkyblockHud.hasSkyblockScoreboard() || !SkyblockHud.config.misc.hideScoreboard; + if (players != null && SkyblockHud.hasSkyblockScoreboard()){ + + if (ticksExisted % 60 == 0) { + for (NetworkPlayerInfo player : players) { + if (player.getDisplayName() != null) { + String formattedTabListPlayer = SCOREBOARD_CHARACTERS.matcher(Utils.removeColor(player.getDisplayName().getFormattedText())).replaceAll(""); + if (LocationHandler.getCurrentLocation().equals(Locations.CATACOMBS)) { + if (formattedTabListPlayer.toLowerCase().contains("secrets found:")) + DungeonHandler.parseTotalSecrets(formattedTabListPlayer); + if (formattedTabListPlayer.toLowerCase().contains("deaths:")) + DungeonHandler.parseDeaths(formattedTabListPlayer); + if (formattedTabListPlayer.toLowerCase().contains("crypts:")) + DungeonHandler.parseCrypts(formattedTabListPlayer); + }else if (LocationHandler.getCurrentLocation().getCategory().equals(LocationCategory.DWARVENMINES)){ + if (formattedTabListPlayer.toLowerCase().contains("mithril powder:")){ + DwarvenMineHandler.parseMithril(formattedTabListPlayer); + } + }else if (LocationHandler.getCurrentLocation().getCategory().equals(LocationCategory.MUSHROOMDESERT)){ + if (formattedTabListPlayer.toLowerCase().contains("pelts:")){ + try { + FarmingIslandHandler.pelts = Integer.parseInt(formattedTabListPlayer.toLowerCase().replace("pelts:","").trim()); + }catch (Exception ignored){} + } + } + } + } + if (players.size() > 80) { + for (int i = 61; i <= 80; i++) { + if (players.get(i).getDisplayName() != null) { + String formattedTabListPlayer = SCOREBOARD_CHARACTERS.matcher(Utils.removeColor(players.get(i).getDisplayName().getFormattedText())).replaceAll(""); + if (formattedTabListPlayer.toLowerCase().contains("event:")) { + if (i < 80) { + if (players.get(i + 1).getDisplayName() != null) { + String secondLine = SCOREBOARD_CHARACTERS.matcher(Utils.removeColor(players.get(i + 1).getDisplayName().getFormattedText())).replaceAll(""); + SeasonDateHandler.setCurrentEvent(formattedTabListPlayer.replace("Event:", ""), secondLine); + eventPass = true; + } + } + } + } + if (i == 80 && !eventPass) { + SeasonDateHandler.setCurrentEvent("", ""); + } + } + } + } + if (LocationHandler.getCurrentLocation().getCategory().equals(LocationCategory.PARK)) { + if (players.size() >= 80) { + for (int i = 41; i <= 60; i++) { + if (players.get(i).getDisplayName() != null) { + String formattedTabListPlayer = SCOREBOARD_CHARACTERS.matcher(Utils.removeColor(players.get(i).getDisplayName().getFormattedText())).replaceAll(""); + if (LocationHandler.getCurrentLocation().getCategory().equals(LocationCategory.PARK)) { + if (formattedTabListPlayer.toLowerCase().contains("rain:")) { + ParkIslandHandler.parseRain(formattedTabListPlayer.toLowerCase()); + } + } + } + } + } + }else if (ParkIslandHandler.isRaining()) { + ParkIslandHandler.parseRain(null); + } + } + } + } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onStatusBar(ClientChatReceivedEvent event){ + if (event.type == 2){ + if (LocationHandler.getCurrentLocation().equals(Locations.CATACOMBS)) DungeonHandler.parseSecrets(event.message.getFormattedText()); + } + } + + @SideOnly(Side.CLIENT) + static class PlayerComparator implements Comparator + { + private PlayerComparator() + { + } + + public int compare(NetworkPlayerInfo p_compare_1_, NetworkPlayerInfo p_compare_2_) + { + ScorePlayerTeam scoreplayerteam = p_compare_1_.getPlayerTeam(); + ScorePlayerTeam scoreplayerteam1 = p_compare_2_.getPlayerTeam(); + return ComparisonChain.start().compareTrueFirst(p_compare_1_.getGameType() != WorldSettings.GameType.SPECTATOR, p_compare_2_.getGameType() != WorldSettings.GameType.SPECTATOR).compare(scoreplayerteam != null ? scoreplayerteam.getRegisteredName() : "", scoreplayerteam1 != null ? scoreplayerteam1.getRegisteredName() : "").compare(p_compare_1_.getGameProfile().getName(), p_compare_2_.getGameProfile().getName()).result(); + } + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/GuiTextures.java b/src/main/java/com/thatgravyboat/skyblockhud/GuiTextures.java new file mode 100644 index 0000000..435c2a5 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/GuiTextures.java @@ -0,0 +1,37 @@ +package com.thatgravyboat.skyblockhud; + +import net.minecraft.util.ResourceLocation; + +public class GuiTextures { + + private GuiTextures() {} + + public static final ResourceLocation DISCORD = new ResourceLocation("skyblockhud:discord.png"); + public static final ResourceLocation TWITTER = new ResourceLocation("skyblockhud:twitter.png"); + + public static final ResourceLocation button_tex = new ResourceLocation("skyblockhud:button.png"); + + public static final ResourceLocation button_white = new ResourceLocation("skyblockhud:button_white.png"); + + public static final ResourceLocation BAR = new ResourceLocation("skyblockhud:core/bar.png"); + public static final ResourceLocation OFF = new ResourceLocation("skyblockhud:core/toggle_off.png"); + public static final ResourceLocation ONE = new ResourceLocation("skyblockhud:core/toggle_1.png"); + public static final ResourceLocation TWO = new ResourceLocation("skyblockhud:core/toggle_2.png"); + public static final ResourceLocation THREE = new ResourceLocation("skyblockhud:core/toggle_3.png"); + public static final ResourceLocation ON = new ResourceLocation("skyblockhud:core/toggle_on.png"); + + public static final ResourceLocation slider_off_cap = new ResourceLocation("skyblockhud:core/slider/slider_off_cap.png"); + public static final ResourceLocation slider_off_notch = new ResourceLocation("skyblockhud:core/slider/slider_off_notch.png"); + public static final ResourceLocation slider_off_segment = new ResourceLocation("skyblockhud:core/slider/slider_off_segment.png"); + public static final ResourceLocation slider_on_cap = new ResourceLocation("skyblockhud:core/slider/slider_on_cap.png"); + public static final ResourceLocation slider_on_notch = new ResourceLocation("skyblockhud:core/slider/slider_on_notch.png"); + public static final ResourceLocation slider_on_segment = new ResourceLocation("skyblockhud:core/slider/slider_on_segment.png"); + public static final ResourceLocation slider_button_new = new ResourceLocation("skyblockhud:core/slider/slider_button.png"); + + public static final ResourceLocation overlay = new ResourceLocation("skyblockhud","stats.png"); + public static final ResourceLocation dungeon = new ResourceLocation("skyblockhud","dungeon.png"); + public static final ResourceLocation playerStat = new ResourceLocation("skyblockhud","playerstats.png"); + public static final ResourceLocation bars = new ResourceLocation("skyblockhud","bars.png"); + public static final ResourceLocation mapOverlay = new ResourceLocation("skyblockhud","maps/map_overlay.png"); + +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/SkyblockHud.java b/src/main/java/com/thatgravyboat/skyblockhud/SkyblockHud.java new file mode 100644 index 0000000..a31889e --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/SkyblockHud.java @@ -0,0 +1,195 @@ +package com.thatgravyboat.skyblockhud; + +import com.google.common.collect.Sets; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.thatgravyboat.skyblockhud.api.LeaderboardGetter; +import com.thatgravyboat.skyblockhud.api.events.ProfileSwitchedEvent; +import com.thatgravyboat.skyblockhud.commands.Commands; +import com.thatgravyboat.skyblockhud.config.KeyBindings; +import com.thatgravyboat.skyblockhud.config.SBHConfig; +import com.thatgravyboat.skyblockhud.dungeons.DungeonHandler; +import com.thatgravyboat.skyblockhud.handlers.*; +import com.thatgravyboat.skyblockhud.location.DwarvenMineHandler; +import com.thatgravyboat.skyblockhud.location.FarmingIslandHandler; +import com.thatgravyboat.skyblockhud.location.IslandHandler; +import com.thatgravyboat.skyblockhud.location.LocationHandler; +import com.thatgravyboat.skyblockhud.overlay.DungeonOverlay; +import com.thatgravyboat.skyblockhud.overlay.OverlayHud; +import com.thatgravyboat.skyblockhud.overlay.RPGHud; +import com.thatgravyboat.skyblockhud.playerstats.ActionBarParsing; +import com.thatgravyboat.skyblockhud.seasons.SeasonDateHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.scoreboard.ScoreObjective; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraftforge.client.event.ClientChatReceivedEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.Mod.EventHandler; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import org.lwjgl.input.Keyboard; + +import java.awt.*; +import java.awt.datatransfer.StringSelection; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.Set; + +@Mod(modid = SkyblockHud.MODID, version = SkyblockHud.VERSION) +public class SkyblockHud +{ + public static final String MODID = "skyblockhud"; + public static final String VERSION = "1.12"; + + public static SBHConfig config; + + private File configFile; + + private static final Set SKYBLOCK_IN_ALL_LANGUAGES = Sets.newHashSet("SKYBLOCK","\u7A7A\u5C9B\u751F\u5B58"); + + private final Gson gson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create(); + + private static File configDirectory; + + @EventHandler + public void preInit(FMLPreInitializationEvent event){ + MinecraftForge.EVENT_BUS.register(this); + MinecraftForge.EVENT_BUS.register(new LeaderboardGetter()); + MinecraftForge.EVENT_BUS.register(new SeasonDateHandler()); + MinecraftForge.EVENT_BUS.register(new LocationHandler()); + MinecraftForge.EVENT_BUS.register(new IslandHandler()); + MinecraftForge.EVENT_BUS.register(new TimeHandler()); + MinecraftForge.EVENT_BUS.register(new CurrencyHandler()); + MinecraftForge.EVENT_BUS.register(new SlayerHandler()); + MinecraftForge.EVENT_BUS.register(new DungeonHandler()); + MinecraftForge.EVENT_BUS.register(new DwarvenMineHandler()); + MinecraftForge.EVENT_BUS.register(new FarmingIslandHandler()); + + /* DISABLE UNTIL NEW SYSTEM + MinecraftForge.EVENT_BUS.register(new TrackerHandler()); + MinecraftForge.EVENT_BUS.register(new KillTrackerHandler()); + */ + MinecraftForge.EVENT_BUS.register(new HeldItemHandler()); + + ClientRegistry.registerKeyBinding(KeyBindings.map); + + MinecraftForge.EVENT_BUS.register(new ComponentHandler()); + MinecraftForge.EVENT_BUS.register(new ActionBarParsing()); + Commands.init(); + + configFile = new File(event.getModConfigurationDirectory(), "sbh-config.json"); + + if(configFile.exists()) { + try(BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(configFile), StandardCharsets.UTF_8))) { + config = gson.fromJson(reader, SBHConfig.class); + } catch(Exception ignored) { } + } + + + if(config == null) { + config = new SBHConfig(); + saveConfig(); + } + + configDirectory = event.getModConfigurationDirectory(); + + Runtime.getRuntime().addShutdownHook(new Thread(this::saveConfig)); + //Runtime.getRuntime().addShutdownHook(new Thread(() -> TrackerFileLoader.saveTrackerStatsFile(event.getModConfigurationDirectory()))); + } + + public void saveConfig() { + try { + configFile.createNewFile(); + + try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(configFile), StandardCharsets.UTF_8))) { + writer.write(gson.toJson(config)); + } + } catch(IOException ignored) {} + } + + @EventHandler + public void postInit(FMLPostInitializationEvent event){ + MinecraftForge.EVENT_BUS.register(new OverlayHud()); + MinecraftForge.EVENT_BUS.register(new RPGHud()); + MinecraftForge.EVENT_BUS.register(new DungeonOverlay()); + MinecraftForge.EVENT_BUS.register(new BossbarHandler()); + MinecraftForge.EVENT_BUS.register(new MapHandler()); + } + + /* DISABLE UNTIL NEW SYSTEM + + @EventHandler + public void loadComplete(FMLLoadCompleteEvent event){ + TrackerFileLoader.loadTrackersFile(); + + if (TrackerFileLoader.loadTrackerStatsFile(configDirectory)){ + TrackerFileLoader.saveTrackerStatsFile(configDirectory); + } + } + + @SubscribeEvent + public void onLeaveServer(FMLNetworkEvent.ClientDisconnectionFromServerEvent event){ + TrackerFileLoader.saveTrackerStatsFile(configDirectory); + } + + */ + + public static boolean hasSkyblockScoreboard() { + Minecraft mc = Minecraft.getMinecraft(); + + if (mc != null && mc.theWorld != null) { + Scoreboard scoreboard = mc.theWorld.getScoreboard(); + ScoreObjective sidebarObjective = scoreboard.getObjectiveInDisplaySlot(1); + if (sidebarObjective != null) { + String objectiveName = sidebarObjective.getDisplayName().replaceAll("(?i)\\u00A7.", ""); + for (String skyblock : SKYBLOCK_IN_ALL_LANGUAGES) { + if (objectiveName.startsWith(skyblock)) { + return true; + } + } + } + } + + return false; + } + + @SubscribeEvent + public void onTooltip(ItemTooltipEvent event){ + if (event.itemStack != null && Keyboard.isKeyDown(Keyboard.KEY_BACKSLASH)) { + try { + StringSelection clipboard = new StringSelection(event.itemStack.serializeNBT().toString()); + Toolkit.getDefaultToolkit().getSystemClipboard().setContents(clipboard, clipboard); + } catch (Exception ignored) { + } + } + } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onStatusBar(ClientChatReceivedEvent event){ + if (Utils.removeColor(event.message.getUnformattedText()).toLowerCase().trim().startsWith("your profile was changed to:")){ + MinecraftForge.EVENT_BUS.post(new ProfileSwitchedEvent()); + } + } + + public static GuiScreen screenToOpen = null; + private static int screenTicks = 0; + + @SubscribeEvent + public void onClientTick(TickEvent.ClientTickEvent event){ + if (screenToOpen != null){ + screenTicks++; + if (screenTicks == 5){ + Minecraft.getMinecraft().displayGuiScreen(screenToOpen); + screenTicks = 0; + screenToOpen = null; + } + } + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/SpecialColour.java b/src/main/java/com/thatgravyboat/skyblockhud/SpecialColour.java new file mode 100644 index 0000000..8501c9d --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/SpecialColour.java @@ -0,0 +1,95 @@ +package com.thatgravyboat.skyblockhud; + +import java.awt.*; + +public class SpecialColour { + + public static String special(int chromaSpeed, int alpha, int rgb) { + return special(chromaSpeed, alpha, (rgb & 0xFF0000) >> 16, (rgb & 0x00FF00) >> 8, (rgb & 0x0000FF)); + } + + private static final int RADIX = 10; + + public static String special(int chromaSpeed, int alpha, int r, int g, int b) { + StringBuilder sb = new StringBuilder(); + sb.append(Integer.toString(chromaSpeed, RADIX)).append(":"); + sb.append(Integer.toString(alpha, RADIX)).append(":"); + sb.append(Integer.toString(r, RADIX)).append(":"); + sb.append(Integer.toString(g, RADIX)).append(":"); + sb.append(Integer.toString(b, RADIX)); + return sb.toString(); + } + + private static int[] decompose(String csv) { + String[] split = csv.split(":"); + + int[] arr = new int[split.length]; + + + for(int i=0; i 0) { + float seconds = getSecondsForSpeed(chr); + hsv[0] += (System.currentTimeMillis()-startTime)/1000f/seconds; + hsv[0] %= 1; + if(hsv[0] < 0) hsv[0] += 1; + } + + return (a & 0xFF) << 24 | (Color.HSBtoRGB(hsv[0], hsv[1], hsv[2]) & 0x00FFFFFF); + } + + public static int rotateHue(int argb, int degrees) { + int a = (argb >> 24) & 0xFF; + int r = (argb >> 16) & 0xFF; + int g = (argb >> 8) & 0xFF; + int b = (argb) & 0xFF; + + float[] hsv = Color.RGBtoHSB(r, g, b, null); + + hsv[0] += degrees/360f; + hsv[0] %= 1; + + return (a & 0xFF) << 24 | (Color.HSBtoRGB(hsv[0], hsv[1], hsv[2]) & 0x00FFFFFF); + } + + +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/Utils.java b/src/main/java/com/thatgravyboat/skyblockhud/Utils.java new file mode 100644 index 0000000..31f6aa8 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/Utils.java @@ -0,0 +1,247 @@ +package com.thatgravyboat.skyblockhud; + + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.fml.common.Loader; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL14; + +import java.nio.FloatBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; + +public class Utils { + + private static LinkedList guiScales = new LinkedList<>(); + private static ScaledResolution lastScale = new ScaledResolution(Minecraft.getMinecraft()); + //Labymod compatibility + private static FloatBuffer projectionMatrixOld = BufferUtils.createFloatBuffer(16); + private static FloatBuffer modelviewMatrixOld = BufferUtils.createFloatBuffer(16); + + + public static String removeColor(String input) { + return input.replaceAll("(?i)\\u00A7.", ""); + } + + public static String removeWhiteSpaceAndRemoveWord(String input, String replace) {return input.toLowerCase().replace( " ", "").replace(replace, ""); } + + public static boolean isPlayerHoldingRedstone(EntityPlayerSP player) { + if (!SkyblockHud.config.main.requireRedstone) return true; + ArrayList redstoneItems = new ArrayList<>(Arrays.asList(Items.redstone, Items.repeater, Items.comparator, Item.getByNameOrId("minecraft:redstone_torch"))); + if (player.getHeldItem()!=null) + return redstoneItems.contains(player.getHeldItem().getItem()); + return false; + } + + public static boolean inRangeInclusive(int value, int min, int max) { + return value <= max && value >= min; + } + + public static int whatRomanNumeral(String roman){ + switch (roman.toLowerCase()) { + case "i": return 1; + case "ii": return 2; + case "iii": return 3; + case "iv": return 4; + case "v": return 5; + case "vi": return 6; + case "vii": return 7; + case "viii": return 8; + case "ix": return 9; + case "x": return 10; + default: return 0; + } + } + + public static String intToRomanNumeral(int i){ + switch (i) { + case 1: return "I"; + case 2: return "II"; + case 3: return "III"; + case 4: return "IV"; + case 5: return "V"; + case 6: return "VI"; + case 7: return "VII"; + case 8: return "VIII"; + case 9: return "IX"; + case 10: return "X"; + default: return ""; + } + } + + public static boolean overlayShouldRender(RenderGameOverlayEvent.ElementType type, boolean... booleans){ + return overlayShouldRender(false, type, RenderGameOverlayEvent.ElementType.HOTBAR, booleans); + } + + public static boolean overlayShouldRender(boolean hideOnf3, RenderGameOverlayEvent.ElementType type, RenderGameOverlayEvent.ElementType checkType, boolean... booleans){ + Minecraft mc = Minecraft.getMinecraft(); + boolean shouldRender; + if (booleans.length > 1){ + for (boolean aBoolean : booleans) if (!aBoolean) return false; + shouldRender = true; + }else shouldRender = booleans.length != 1 || booleans[0]; + if (hideOnf3) { + if (mc.gameSettings.showDebugInfo || (mc.gameSettings.keyBindPlayerList.isKeyDown() && (!mc.isIntegratedServerRunning() || mc.thePlayer.sendQueue.getPlayerInfoMap().size() > 1))) { + return false; + } + } + return shouldRender && ((type == null && Loader.isModLoaded("labymod")) || type == checkType); + } + + public static void drawStringScaledMaxWidth(String str, FontRenderer fr, float x, float y, boolean shadow, int len, int colour) { + int strLen = fr.getStringWidth(str); + float factor = len/(float)strLen; + factor = Math.min(1, factor); + + drawStringScaled(str, fr, x, y, shadow, colour, factor); + } + + public static void drawStringScaled(String str, FontRenderer fr, float x, float y, boolean shadow, int colour, float factor) { + GlStateManager.scale(factor, factor, 1); + fr.drawString(str, x/factor, y/factor, colour, shadow); + GlStateManager.scale(1/factor, 1/factor, 1); + } + + public static void drawStringCenteredScaled(String str, FontRenderer fr, float x, float y, boolean shadow, int len, int colour) { + int strLen = fr.getStringWidth(str); + float factor = len/(float)strLen; + float fontHeight = 8*factor; + + drawStringScaled(str, fr, x-len/2f, y-fontHeight/2f, shadow, colour, factor); + } + + public static void drawTexturedRect(float x, float y, float width, float height, float uMin, float uMax, float vMin, float vMax, int filter) { + GlStateManager.enableTexture2D(); + GlStateManager.enableBlend(); + GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); + + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter); + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, filter); + + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldrenderer = tessellator.getWorldRenderer(); + worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX); + worldrenderer + .pos(x, y+height, 0.0D) + .tex(uMin, vMax).endVertex(); + worldrenderer + .pos(x+width, y+height, 0.0D) + .tex(uMax, vMax).endVertex(); + worldrenderer + .pos(x+width, y, 0.0D) + .tex(uMax, vMin).endVertex(); + worldrenderer + .pos(x, y, 0.0D) + .tex(uMin, vMin).endVertex(); + tessellator.draw(); + + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + + GlStateManager.disableBlend(); + } + + public static void drawTexturedRect(float x, float y, float width, float height) { + drawTexturedRect(x, y, width, height, 0, 1, 0 , 1); + } + + public static void drawTexturedRect(float x, float y, float width, float height, int filter) { + drawTexturedRect(x, y, width, height, 0, 1, 0 , 1, filter); + } + + public static void drawTexturedRect(float x, float y, float width, float height, float uMin, float uMax, float vMin, float vMax) { + drawTexturedRect(x, y, width, height, uMin, uMax, vMin , vMax, GL11.GL_LINEAR); + } + + public static void resetGuiScale() { + guiScales.clear(); + } + + public static ScaledResolution peekGuiScale() { + return lastScale; + } + + public static ScaledResolution pushGuiScale(int scale) { + if(guiScales.size() == 0) { + if(Loader.isModLoaded("labymod")) { + GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projectionMatrixOld); + GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, modelviewMatrixOld); + } + } + + if(scale < 0) { + if(guiScales.size() > 0) { + guiScales.pop(); + } + } else { + if(scale == 0) { + guiScales.push(Minecraft.getMinecraft().gameSettings.guiScale); + } else { + guiScales.push(scale); + } + } + + int newScale = guiScales.size() > 0 ? Math.max(0, Math.min(4, guiScales.peek())) : Minecraft.getMinecraft().gameSettings.guiScale; + if(newScale == 0) newScale = Minecraft.getMinecraft().gameSettings.guiScale; + + int oldScale = Minecraft.getMinecraft().gameSettings.guiScale; + Minecraft.getMinecraft().gameSettings.guiScale = newScale; + ScaledResolution scaledresolution = new ScaledResolution(Minecraft.getMinecraft()); + Minecraft.getMinecraft().gameSettings.guiScale = oldScale; + + if(guiScales.size() > 0) { + GlStateManager.viewport(0, 0, Minecraft.getMinecraft().displayWidth, Minecraft.getMinecraft().displayHeight); + GlStateManager.matrixMode(GL11.GL_PROJECTION); + GlStateManager.loadIdentity(); + GlStateManager.ortho(0.0D, + scaledresolution.getScaledWidth_double(), + scaledresolution.getScaledHeight_double(), 0.0D, 1000.0D, 3000.0D); + GlStateManager.matrixMode(GL11.GL_MODELVIEW); + GlStateManager.loadIdentity(); + GlStateManager.translate(0.0F, 0.0F, -2000.0F); + } else { + if(Loader.isModLoaded("labymod") && projectionMatrixOld.limit() > 0 && modelviewMatrixOld.limit() > 0) { + GlStateManager.matrixMode(GL11.GL_PROJECTION); + GL11.glLoadMatrix(projectionMatrixOld); + GlStateManager.matrixMode(GL11.GL_MODELVIEW); + GL11.glLoadMatrix(modelviewMatrixOld); + } else { + GlStateManager.matrixMode(GL11.GL_PROJECTION); + GlStateManager.loadIdentity(); + GlStateManager.ortho(0.0D, + scaledresolution.getScaledWidth_double(), + scaledresolution.getScaledHeight_double(), 0.0D, 1000.0D, 3000.0D); + GlStateManager.matrixMode(GL11.GL_MODELVIEW); + GlStateManager.loadIdentity(); + GlStateManager.translate(0.0F, 0.0F, -2000.0F); + } + } + + lastScale = scaledresolution; + return scaledresolution; + } + + public static void drawStringCentered(String str, FontRenderer fr, float x, float y, boolean shadow, int colour) { + int strLen = fr.getStringWidth(str); + + float x2 = x - strLen/2f; + float y2 = y - fr.FONT_HEIGHT/2f; + + GL11.glTranslatef(x2, y2, 0); + fr.drawString(str, 0, 0, colour, shadow); + GL11.glTranslatef(-x2, -y2, 0); + } + +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/LeaderboardGetter.java b/src/main/java/com/thatgravyboat/skyblockhud/api/LeaderboardGetter.java new file mode 100644 index 0000000..58cede8 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/LeaderboardGetter.java @@ -0,0 +1,65 @@ +package com.thatgravyboat.skyblockhud.api; + +import com.thatgravyboat.skyblockhud.Utils; +import com.thatgravyboat.skyblockhud.api.events.SidebarLineUpdateEvent; +import com.thatgravyboat.skyblockhud.api.events.SidebarPostEvent; +import com.thatgravyboat.skyblockhud.api.events.SidebarPreGetEvent; +import net.minecraft.client.Minecraft; +import net.minecraft.scoreboard.Score; +import net.minecraft.scoreboard.ScoreObjective; +import net.minecraft.scoreboard.ScorePlayerTeam; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; + +import java.util.*; +import java.util.stream.Collectors; + +import static com.thatgravyboat.skyblockhud.ComponentHandler.SCOREBOARD_CHARACTERS; + +public class LeaderboardGetter { + + private static Map cachedScores = new HashMap<>(); + private static List cachedScoresList = new ArrayList<>(); + + private static int ticks = 0; + + //This is really bad and should use the packet instead. + + @SubscribeEvent + public void onClientUpdate(TickEvent.ClientTickEvent event){ + if (event.phase.equals(TickEvent.Phase.START)) return; + ticks++; + if (ticks % 5 != 0) return; + + Minecraft mc = Minecraft.getMinecraft(); + if (mc.theWorld != null) { + Scoreboard scoreboard = mc.theWorld.getScoreboard(); + ScoreObjective sidebarObjective = scoreboard.getObjectiveInDisplaySlot(1); + + if (sidebarObjective != null && !MinecraftForge.EVENT_BUS.post(new SidebarPreGetEvent(scoreboard, sidebarObjective))) { + Collection scoreList = sidebarObjective.getScoreboard().getSortedScores(sidebarObjective); + Map scores = scoreList.stream().collect(Collectors.toMap(Score::getScorePoints, this::getLine)); + + if (!cachedScores.equals(scores)) { + scores.forEach((score, name) -> { + if (cachedScores.get(score) == null || !cachedScores.get(score).equals(name)) { + MinecraftForge.EVENT_BUS.post(new SidebarLineUpdateEvent(name, SCOREBOARD_CHARACTERS.matcher(name).replaceAll("").trim(), score, scores.size(), scoreboard, sidebarObjective)); + } + }); + cachedScores = scores; + cachedScoresList = scores.values().stream().map(name -> SCOREBOARD_CHARACTERS.matcher(name).replaceAll("").trim()).collect(Collectors.toList()); + } + MinecraftForge.EVENT_BUS.post(new SidebarPostEvent(scoreboard, sidebarObjective, cachedScoresList)); + } + } + } + + public String getLine(Score score) { + ScorePlayerTeam scorePlayerTeam = score.getScoreScoreboard().getPlayersTeam(score.getPlayerName()); + return Utils.removeColor(ScorePlayerTeam.formatPlayerName(scorePlayerTeam, score.getPlayerName())); + } + + +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/events/ProfileSwitchedEvent.java b/src/main/java/com/thatgravyboat/skyblockhud/api/events/ProfileSwitchedEvent.java new file mode 100644 index 0000000..015388a --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/events/ProfileSwitchedEvent.java @@ -0,0 +1,7 @@ +package com.thatgravyboat.skyblockhud.api.events; + +import net.minecraftforge.fml.common.eventhandler.Event; + +public class ProfileSwitchedEvent extends Event { + +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarLineUpdateEvent.java b/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarLineUpdateEvent.java new file mode 100644 index 0000000..2737ee9 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarLineUpdateEvent.java @@ -0,0 +1,22 @@ +package com.thatgravyboat.skyblockhud.api.events; + +import net.minecraft.scoreboard.ScoreObjective; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraftforge.fml.common.eventhandler.Event; + +public class SidebarLineUpdateEvent extends Event { + + public String rawLine; + public String formattedLine; + public int position; + public Scoreboard scoreboard; + public ScoreObjective objective; + + public SidebarLineUpdateEvent(String rawLine, String formattedLine, int score, int max, Scoreboard scoreboard, ScoreObjective objective) { + this.rawLine = rawLine; + this.formattedLine = formattedLine; + this.position = max - score; + this.scoreboard = scoreboard; + this.objective = objective; + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPostEvent.java b/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPostEvent.java new file mode 100644 index 0000000..b81859a --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPostEvent.java @@ -0,0 +1,22 @@ +package com.thatgravyboat.skyblockhud.api.events; + +import net.minecraft.scoreboard.ScoreObjective; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraftforge.fml.common.eventhandler.Event; + +import java.util.List; + +public class SidebarPostEvent extends Event { + + public Scoreboard scoreboard; + public ScoreObjective objective; + public List scores; + public String[] arrayScores; + + public SidebarPostEvent(Scoreboard scoreboard, ScoreObjective objective, List scores) { + this.scoreboard = scoreboard; + this.objective = objective; + this.scores = scores; + this.arrayScores = scores.toArray(new String[]{}); + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPreGetEvent.java b/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPreGetEvent.java new file mode 100644 index 0000000..0db1895 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPreGetEvent.java @@ -0,0 +1,18 @@ +package com.thatgravyboat.skyblockhud.api.events; + +import net.minecraft.scoreboard.ScoreObjective; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraftforge.fml.common.eventhandler.Cancelable; +import net.minecraftforge.fml.common.eventhandler.Event; + +@Cancelable +public class SidebarPreGetEvent extends Event { + + public Scoreboard scoreboard; + public ScoreObjective objective; + + public SidebarPreGetEvent(Scoreboard scoreboard, ScoreObjective objective) { + this.scoreboard = scoreboard; + this.objective = objective; + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/commands/Commands.java b/src/main/java/com/thatgravyboat/skyblockhud/commands/Commands.java new file mode 100644 index 0000000..3ca82e7 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/commands/Commands.java @@ -0,0 +1,42 @@ +package com.thatgravyboat.skyblockhud.commands; + +import com.thatgravyboat.skyblockhud.SkyblockHud; +import com.thatgravyboat.skyblockhud.config.SBHConfigEditor; +import com.thatgravyboat.skyblockhud.core.GuiScreenElementWrapper; +import com.thatgravyboat.skyblockhud.handlers.MapHandler; +import com.thatgravyboat.skyblockhud.location.LocationHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.command.ICommandSender; +import net.minecraftforge.client.ClientCommandHandler; +import org.apache.commons.lang3.StringUtils; + +public class Commands { + + private static final SimpleCommand.ProcessCommandRunnable settingsRunnable = new SimpleCommand.ProcessCommandRunnable() { + public void processCommand(ICommandSender sender, String[] args) { + if(args.length > 0) { + SkyblockHud.screenToOpen = new GuiScreenElementWrapper(new SBHConfigEditor(SkyblockHud.config, StringUtils.join(args, " "))); + } else { + SkyblockHud.screenToOpen = new GuiScreenElementWrapper(new SBHConfigEditor(SkyblockHud.config)); + } + } + }; + + private static final SimpleCommand settingsCommand = new SimpleCommand("sbh", settingsRunnable); + private static final SimpleCommand settingsCommand2 = new SimpleCommand("sbhsettings", settingsRunnable); + private static final SimpleCommand settingsCommand3 = new SimpleCommand("sbhud", settingsRunnable); + + private static final SimpleCommand mapCommand = new SimpleCommand("sbhmap", new SimpleCommand.ProcessCommandRunnable() { + public void processCommand(ICommandSender sender, String[] args) { + if (LocationHandler.getCurrentLocation().getCategory().getMap() != null) + SkyblockHud.screenToOpen = new MapHandler.MapScreen(); + } + }); + + public static void init(){ + ClientCommandHandler.instance.registerCommand(settingsCommand); + ClientCommandHandler.instance.registerCommand(settingsCommand2); + ClientCommandHandler.instance.registerCommand(settingsCommand3); + ClientCommandHandler.instance.registerCommand(mapCommand); + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/commands/SimpleCommand.java b/src/main/java/com/thatgravyboat/skyblockhud/commands/SimpleCommand.java new file mode 100644 index 0000000..7fc7920 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/commands/SimpleCommand.java @@ -0,0 +1,58 @@ +package com.thatgravyboat.skyblockhud.commands; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.util.BlockPos; + +import java.util.List; + +/** + @author Moulberry + **/ +public class SimpleCommand extends CommandBase { + + private String commandName; + private ProcessCommandRunnable runnable; + private TabCompleteRunnable tabRunnable; + + public SimpleCommand(String commandName, ProcessCommandRunnable runnable) { + this.commandName = commandName; + this.runnable = runnable; + } + + public SimpleCommand(String commandName, ProcessCommandRunnable runnable, TabCompleteRunnable tabRunnable) { + this.commandName = commandName; + this.runnable = runnable; + this.tabRunnable = tabRunnable; + } + + public abstract static class ProcessCommandRunnable { + public abstract void processCommand(ICommandSender sender, String[] args); + } + + public abstract static class TabCompleteRunnable { + public abstract List tabComplete(ICommandSender sender, String[] args, BlockPos pos); + } + + public boolean canCommandSenderUseCommand(ICommandSender sender) { + return true; + } + + public String getCommandName() { + return commandName; + } + + public String getCommandUsage(ICommandSender sender) { + return "/" + commandName; + } + + public void processCommand(ICommandSender sender, String[] args) throws CommandException { + runnable.processCommand(sender, args); + } + + public List addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) { + if(tabRunnable != null) return tabRunnable.tabComplete(sender, args, pos); + return null; + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/config/KeyBindings.java b/src/main/java/com/thatgravyboat/skyblockhud/config/KeyBindings.java new file mode 100644 index 0000000..805b906 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/config/KeyBindings.java @@ -0,0 +1,9 @@ +package com.thatgravyboat.skyblockhud.config; + +import net.minecraft.client.settings.KeyBinding; + +public class KeyBindings { + public static KeyBinding map = new KeyBinding("Opens the big map.", 50, "SkyblockHud"); + +} + diff --git a/src/main/java/com/thatgravyboat/skyblockhud/config/SBHConfig.java b/src/main/java/com/thatgravyboat/skyblockhud/config/SBHConfig.java new file mode 100644 index 0000000..1f6e581 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/config/SBHConfig.java @@ -0,0 +1,486 @@ +package com.thatgravyboat.skyblockhud.config; + +import com.google.gson.annotations.Expose; +import com.thatgravyboat.skyblockhud.SkyblockHud; +import com.thatgravyboat.skyblockhud.core.GuiScreenElementWrapper; +import com.thatgravyboat.skyblockhud.core.config.Config; +import com.thatgravyboat.skyblockhud.core.config.Position; +import com.thatgravyboat.skyblockhud.core.config.annotations.*; +import com.thatgravyboat.skyblockhud.core.config.gui.GuiPositionEditor; +import net.minecraft.client.Minecraft; + +public class SBHConfig extends Config { + + private void editOverlay(String activeConfig, int width, int height, Position position) { + Minecraft.getMinecraft().displayGuiScreen( + new GuiPositionEditor(position, width, height, + () -> {}, + () -> {}, + () -> SkyblockHud.screenToOpen = new GuiScreenElementWrapper(new SBHConfigEditor(SkyblockHud.config, activeConfig)) + ) + ); + } + + @Override + public void executeRunnable(String runnableId) { + String activeConfigCategory = null; + if(Minecraft.getMinecraft().currentScreen instanceof GuiScreenElementWrapper) { + GuiScreenElementWrapper wrapper = (GuiScreenElementWrapper) Minecraft.getMinecraft().currentScreen; + if(wrapper.element instanceof SBHConfigEditor) { + activeConfigCategory = ((SBHConfigEditor)wrapper.element).getSelectedCategoryName(); + } + } + + switch (runnableId) { + case "rpg": + editOverlay(activeConfigCategory, 120, 47, rpg.rpgHudPosition); + return; + case "d1": + editOverlay(activeConfigCategory, 120, 32, dungeon.dungeonPlayer1); + return; + case "d2": + editOverlay(activeConfigCategory, 120, 32, dungeon.dungeonPlayer2); + return; + case "d3": + editOverlay(activeConfigCategory, 120, 32, dungeon.dungeonPlayer3); + return; + case "d4": + editOverlay(activeConfigCategory, 120, 32, dungeon.dungeonPlayer4); + return; + case "main": + editOverlay(activeConfigCategory, 1000, 34, main.mainHudPos); + return; + case "ultimate": + editOverlay(activeConfigCategory, 182, 5, dungeon.barPosition); + return; + case "map": + editOverlay(activeConfigCategory, 72, 72, map.miniMapPosition); + return; + case "tracker": + editOverlay(activeConfigCategory, 120, 70, trackers.trackerPosition); + return; + } + } + + @Expose + @Category( + name = "Misc Options", + desc = "Just a bunch of random options." + ) + public Misc misc = new Misc(); + + @Expose + @Category( + name = "Main Hud", + desc = "All Options for the main hud." + ) + public MainHud main = new MainHud(); + + @Expose + @Category( + name = "RPG Hud", + desc = "All Options for the RPG hud." + ) + public RPGHud rpg = new RPGHud(); + + @Expose + @Category( + name = "Dungeon Hud", + desc = "All Options for the Dungeon hud." + ) + public DungeonHud dungeon = new DungeonHud(); + + @Expose + @Category( + name = "Renderer", + desc = "All Options for rendering." + ) + public Renderer renderer = new Renderer(); + + @Expose + @Category( + name = "Map", + desc = "All Options for the Map." + ) + public Map map = new Map(); + + @Expose + @Category( + name = "Tracker", + desc = "All Options for the Trackers." + ) + public Trackers trackers = new Trackers(); + + public static class Misc { + @Expose + @ConfigOption( + name = "Hide Scoreboard", + desc = "Hides the scoreboard when in skyblock." + ) + @ConfigEditorBoolean + public boolean hideScoreboard = false; + } + + public static class MainHud { + @Expose + @ConfigOption( + name = "Ma