From a3c471d2bf0a87575003c8d64e7e476b6bdf5581 Mon Sep 17 00:00:00 2001 From: CattoFace Date: Mon, 5 Sep 2022 08:11:45 +0300 Subject: [PATCH 1/5] Renamed feature to "Player Symbols" as it also displays the players nether faction. Improved symbol finding by checking the tab list as well. Added symbol to guild chat As part of checking the tab list, fixed player name stripping issue that prevented heads from being displayed. --- .../biscuit/skyblockaddons/core/Feature.java | 2 +- .../features/tablist/TabListRenderer.java | 2 +- .../features/tablist/TabStringType.java | 3 +- .../listeners/PlayerListener.java | 61 ++++++++++++------- .../skyblockaddons/utils/EnumUtils.java | 2 +- .../skyblockaddons/utils/TextUtils.java | 19 ++++++ src/main/resources/lang/en_US.json | 2 +- 7 files changed, 64 insertions(+), 27 deletions(-) diff --git a/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java b/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java index 1c921a5c5b..eec98e6515 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java +++ b/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java @@ -216,7 +216,7 @@ public enum Feature { SHOW_SKYBLOCK_ITEM_ID(213, "settings.showSkyblockItemId", null, true), RESET_SALVAGED_ESSENCES_AFTER_LEAVING_MENU(214, "settings.resetSalvagedEssencesAfterLeavingMenu", null, false), CHANGE_DUNGEON_MAP_ZOOM_WITH_KEYBOARD(215, "settings.changeDungeonMapZoomWithKeyboard", null, false), - PROFILE_TYPE_IN_CHAT(216, "settings.showProfileTypeInChat", null, true), + PLAYER_SYMBOLS_IN_CHAT(216, "settings.addPlayerSymbolsToChat", null, true), WARNING_TIME(-1, "settings.warningDuration", null, false), WARP_ADVANCED_MODE(-1, "settings.advancedMode", null, true), diff --git a/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabListRenderer.java b/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabListRenderer.java index 17b49b7ce8..7cf5b6143d 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabListRenderer.java +++ b/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabListRenderer.java @@ -90,7 +90,7 @@ public static void render() { int savedX = middleX; if (tabLine.getType() == TabStringType.PLAYER) { - NetworkPlayerInfo networkPlayerInfo = mc.getNetHandler().getPlayerInfo(TextUtils.stripColor(tabLine.getText())); + NetworkPlayerInfo networkPlayerInfo = mc.getNetHandler().getPlayerInfo(TextUtils.stripUsername(tabLine.getText())); if (networkPlayerInfo != null) { EntityPlayer entityPlayer = mc.theWorld.getPlayerEntityByUUID(networkPlayerInfo.getGameProfile().getId()); diff --git a/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabStringType.java b/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabStringType.java index 832228720a..289c74a1d6 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabStringType.java +++ b/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabStringType.java @@ -10,8 +10,7 @@ public enum TabStringType { PLAYER; public static TabStringType fromLine(String line) { - String strippedLine = TextUtils.stripColor(line); - + String strippedLine = TextUtils.stripUsername(line); if (strippedLine.startsWith(" ")) { return TEXT; } diff --git a/src/main/java/codes/biscuit/skyblockaddons/listeners/PlayerListener.java b/src/main/java/codes/biscuit/skyblockaddons/listeners/PlayerListener.java index f98466e3c1..3626b15a95 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/listeners/PlayerListener.java +++ b/src/main/java/codes/biscuit/skyblockaddons/listeners/PlayerListener.java @@ -43,7 +43,10 @@ import net.minecraft.client.audio.SoundCategory; import net.minecraft.client.entity.EntityOtherPlayerMP; import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.gui.GuiPlayerTabOverlay; import net.minecraft.client.gui.inventory.GuiChest; +import net.minecraft.client.network.NetHandlerPlayClient; +import net.minecraft.client.network.NetworkPlayerInfo; import net.minecraft.client.settings.KeyBinding; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityArmorStand; @@ -61,7 +64,9 @@ import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.scoreboard.ScorePlayerTeam; import net.minecraft.util.*; +import net.minecraft.world.WorldSettings; import net.minecraftforge.client.event.ClientChatReceivedEvent; import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.sound.PlaySoundEvent; @@ -412,13 +417,17 @@ public void onChatReceive(ClientChatReceivedEvent e) { !fetchur.hasFetchedToday() && unformattedText.contains(fetchur.getFetchurAlreadyDidTaskPhrase())) { FetchurManager.getInstance().saveLastTimeFetched(); } - // Tries to check if a message is from a player to add the player profile icon - } else if (main.getConfigValues().isEnabled(Feature.PROFILE_TYPE_IN_CHAT) && + // Tries to check if a message is from a player to add the player profile icon + } else if (main.getConfigValues().isEnabled(Feature.PLAYER_SYMBOLS_IN_CHAT) && unformattedText.contains(":")) { - String username = unformattedText.split(":")[0].replaceAll("§.",""); - // Remove rank prefix if exists - if (username.contains("]")) - username = username.split("] ")[1]; + // For some reason guild chat messages still contain color codes in the unformatted text + String username = TextUtils.stripColor(unformattedText.split(":")[0]); + // Remove rank prefix and guild rank suffix if exists + String[] splitted = username.split("\\[[^\\[\\]]*\\]"); + if (splitted.length>1) { + username = TextUtils.trimWhitespaceAndResets(splitted[1]); + logger.info(username); + } // Check if stripped username is a real username or the player if (TextUtils.isUsername(username) || username.equals("**MINECRAFTUSERNAME**")) { EntityPlayer chattingPlayer = Minecraft.getMinecraft().theWorld.getPlayerEntityByName(username); @@ -426,6 +435,16 @@ public void onChatReceive(ClientChatReceivedEvent e) { if(chattingPlayer != null) { namesWithType.put(username, chattingPlayer.getDisplayName().getSiblings().get(0).getUnformattedText()); } + // Otherwise search in tablist + else { + Collection networkPlayerInfos = Minecraft.getMinecraft().thePlayer.sendQueue.getPlayerInfoMap(); + String finalUsername = username; + Optional result = networkPlayerInfos.stream().filter(npi -> npi.getDisplayName() != null).map(npi -> npi.getDisplayName().getUnformattedText()).filter(name -> TextUtils.stripUsername(name).equals(finalUsername)).findAny(); + // Put in cache if found + if(result.isPresent()){ + namesWithType.put(username, result.get()); + } + } // Check cache regardless if found nearby if(namesWithType.containsKey(username)){ IChatComponent oldMessage = e.message; @@ -933,26 +952,26 @@ public void onEntitySpawn(EntityEvent.EnteringChunk e) { } } if (main.getUtils().isOnSkyblock()) { - Minecraft mc = Minecraft.getMinecraft(); - for (Entity cubes : mc.theWorld.loadedEntityList) { - if (main.getConfigValues().isEnabled(Feature.BAL_BOSS_ALERT) && main.getUtils().isOnSkyblock() && LocationUtils.isInCrystalHollows(main.getUtils().getLocation().getScoreboardName())) { - if (cubes instanceof EntityMagmaCube) { - EntitySlime magma = (EntitySlime) cubes; - if (magma.getSlimeSize() > 10) { // Find a big bal boss - if ((lastBal == -1 || System.currentTimeMillis() - lastBal > 240000)) { - lastBal = System.currentTimeMillis(); - main.getRenderListener().setTitleFeature(Feature.BAL_BOSS_ALERT); // Enable warning and disable again in four seconds. - balTick = 16; // so the sound plays instantly - main.getScheduler().schedule(Scheduler.CommandType.RESET_TITLE_FEATURE, main.getConfigValues().getWarningSeconds()); - } - if (main.getRenderListener().getTitleFeature() == Feature.BAL_BOSS_ALERT && balTick % 4 == 0) { // Play sound every 4 ticks or 1/5 second. - main.getUtils().playLoudSound("random.orb", 0.5); + Minecraft mc = Minecraft.getMinecraft(); + for (Entity cubes : mc.theWorld.loadedEntityList) { + if (main.getConfigValues().isEnabled(Feature.BAL_BOSS_ALERT) && main.getUtils().isOnSkyblock() && LocationUtils.isInCrystalHollows(main.getUtils().getLocation().getScoreboardName())) { + if (cubes instanceof EntityMagmaCube) { + EntitySlime magma = (EntitySlime) cubes; + if (magma.getSlimeSize() > 10) { // Find a big bal boss + if ((lastBal == -1 || System.currentTimeMillis() - lastBal > 240000)) { + lastBal = System.currentTimeMillis(); + main.getRenderListener().setTitleFeature(Feature.BAL_BOSS_ALERT); // Enable warning and disable again in four seconds. + balTick = 16; // so the sound plays instantly + main.getScheduler().schedule(Scheduler.CommandType.RESET_TITLE_FEATURE, main.getConfigValues().getWarningSeconds()); + } + if (main.getRenderListener().getTitleFeature() == Feature.BAL_BOSS_ALERT && balTick % 4 == 0) { // Play sound every 4 ticks or 1/5 second. + main.getUtils().playLoudSound("random.orb", 0.5); + } } } } } } - } if (main.getUtils().isOnSkyblock() && main.getConfigValues().isEnabled(Feature.ZEALOT_COUNTER_EXPLOSIVE_BOW_SUPPORT) && entity instanceof EntityArrow) { EntityArrow arrow = (EntityArrow) entity; diff --git a/src/main/java/codes/biscuit/skyblockaddons/utils/EnumUtils.java b/src/main/java/codes/biscuit/skyblockaddons/utils/EnumUtils.java index 6ea8b63599..3047e59a7c 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/utils/EnumUtils.java +++ b/src/main/java/codes/biscuit/skyblockaddons/utils/EnumUtils.java @@ -330,7 +330,7 @@ public enum FeatureCredit { SKYCATMINEPOKIE("skycatminepokie", "github.com/skycatminepokie", Feature.OUTBID_ALERT_SOUND), TIMOLOB("TimoLob", "github.com/TimoLob", Feature.BROOD_MOTHER_ALERT), NOPOTHEGAMER("NopoTheGamer", "twitch.tv/nopothegamer", Feature.BAL_BOSS_ALERT), - CATFACE("CatFace","github.com/CattoFace",Feature.PROFILE_TYPE_IN_CHAT); + CATFACE("CatFace","github.com/CattoFace",Feature.PLAYER_SYMBOLS_IN_CHAT); private final Set features; private final String author; diff --git a/src/main/java/codes/biscuit/skyblockaddons/utils/TextUtils.java b/src/main/java/codes/biscuit/skyblockaddons/utils/TextUtils.java index 3c37de79ea..8599c0dd39 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/utils/TextUtils.java +++ b/src/main/java/codes/biscuit/skyblockaddons/utils/TextUtils.java @@ -20,6 +20,7 @@ public class TextUtils { public static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance(Locale.US); private static final Pattern STRIP_COLOR_PATTERN = Pattern.compile("(?i)§[0-9A-FK-ORZ]"); + private static final Pattern STRIP_ICONS_PATTERN = Pattern.compile("[♲Ⓑ⚒ቾ]+"); private static final Pattern REPEATED_COLOR_PATTERN = Pattern.compile("(?i)(§[0-9A-FK-ORZ])+"); private static final Pattern NUMBERS_SLASHES = Pattern.compile("[^0-9 /]"); private static final Pattern SCOREBOARD_CHARACTERS = Pattern.compile("[^a-z A-Z:0-9_/'.!§\\[\\]❤]"); @@ -59,6 +60,24 @@ public static String stripColor(final String input) { return STRIP_COLOR_PATTERN.matcher(input).replaceAll(""); } + /** + * Strips icons from player names + * @param input Text to strip icons from + * @return Text without icons + */ + public static String stripIcons(String input) { + return STRIP_ICONS_PATTERN.matcher(input).replaceAll(""); + } + + /** + * Strips icons and colors and trims spaces from a potential username + * @param input Text to strip from + * @return Stripped Text + */ + public static String stripUsername(String input) { + return trimWhitespaceAndResets(stripIcons(stripColor((input)))); + } + /** * Computationally efficient way to test if a given string has a rendered length of 0 * @param input string to test diff --git a/src/main/resources/lang/en_US.json b/src/main/resources/lang/en_US.json index cf6f33ef43..516eaf7483 100644 --- a/src/main/resources/lang/en_US.json +++ b/src/main/resources/lang/en_US.json @@ -220,7 +220,7 @@ "showFeatureNamesOnHover": "Show Feature Names on Hover", "resetSalvagedEssencesAfterLeavingMenu": "Reset Salvaged Essence Counter After Closing Menu", "changeDungeonMapZoomWithKeyboard": "Adjust zoom with +/- keys", - "showProfileTypeInChat": "Show Profile Type In Chat" + "addPlayerSymbolsToChat": "Add Player Symbols To Chat Messages" }, "messages": { "enchants": "Enchants", From cc5698f7d5120999581649c42d541e020ff28201 Mon Sep 17 00:00:00 2001 From: CattoFace Date: Mon, 5 Sep 2022 16:54:54 +0300 Subject: [PATCH 2/5] Fixed color issue --- .../biscuit/skyblockaddons/listeners/PlayerListener.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/codes/biscuit/skyblockaddons/listeners/PlayerListener.java b/src/main/java/codes/biscuit/skyblockaddons/listeners/PlayerListener.java index 3626b15a95..3eb63968a7 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/listeners/PlayerListener.java +++ b/src/main/java/codes/biscuit/skyblockaddons/listeners/PlayerListener.java @@ -439,10 +439,10 @@ public void onChatReceive(ClientChatReceivedEvent e) { else { Collection networkPlayerInfos = Minecraft.getMinecraft().thePlayer.sendQueue.getPlayerInfoMap(); String finalUsername = username; - Optional result = networkPlayerInfos.stream().filter(npi -> npi.getDisplayName() != null).map(npi -> npi.getDisplayName().getUnformattedText()).filter(name -> TextUtils.stripUsername(name).equals(finalUsername)).findAny(); + Optional result = networkPlayerInfos.stream().filter(npi -> npi.getDisplayName() != null).filter(npi -> TextUtils.stripUsername(npi.getDisplayName().getUnformattedText()).equals(finalUsername)).findAny(); // Put in cache if found if(result.isPresent()){ - namesWithType.put(username, result.get()); + namesWithType.put(username, result.get().getDisplayName().getFormattedText()); } } // Check cache regardless if found nearby From 0aa70f254dc1dd6e57b0d0ddb447bf21bb01b5fd Mon Sep 17 00:00:00 2001 From: CattoFace Date: Mon, 5 Sep 2022 17:04:00 +0300 Subject: [PATCH 3/5] Should be ready to be on by default now --- src/main/java/codes/biscuit/skyblockaddons/core/Feature.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java b/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java index eec98e6515..94e72cbe0c 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java +++ b/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java @@ -216,7 +216,7 @@ public enum Feature { SHOW_SKYBLOCK_ITEM_ID(213, "settings.showSkyblockItemId", null, true), RESET_SALVAGED_ESSENCES_AFTER_LEAVING_MENU(214, "settings.resetSalvagedEssencesAfterLeavingMenu", null, false), CHANGE_DUNGEON_MAP_ZOOM_WITH_KEYBOARD(215, "settings.changeDungeonMapZoomWithKeyboard", null, false), - PLAYER_SYMBOLS_IN_CHAT(216, "settings.addPlayerSymbolsToChat", null, true), + PLAYER_SYMBOLS_IN_CHAT(216, "settings.addPlayerSymbolsToChat", null, false), WARNING_TIME(-1, "settings.warningDuration", null, false), WARP_ADVANCED_MODE(-1, "settings.advancedMode", null, true), From dd11345e3f64d0d1bdaa5e46e446b2b38911d112 Mon Sep 17 00:00:00 2001 From: CattoFace Date: Mon, 5 Sep 2022 21:49:59 +0300 Subject: [PATCH 4/5] More accurate string --- src/main/java/codes/biscuit/skyblockaddons/core/Feature.java | 2 +- src/main/resources/lang/en_US.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java b/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java index 94e72cbe0c..faede8e285 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java +++ b/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java @@ -216,7 +216,7 @@ public enum Feature { SHOW_SKYBLOCK_ITEM_ID(213, "settings.showSkyblockItemId", null, true), RESET_SALVAGED_ESSENCES_AFTER_LEAVING_MENU(214, "settings.resetSalvagedEssencesAfterLeavingMenu", null, false), CHANGE_DUNGEON_MAP_ZOOM_WITH_KEYBOARD(215, "settings.changeDungeonMapZoomWithKeyboard", null, false), - PLAYER_SYMBOLS_IN_CHAT(216, "settings.addPlayerSymbolsToChat", null, false), + PLAYER_SYMBOLS_IN_CHAT(216, "settings.showPlayerSymbolsInChat", null, false), WARNING_TIME(-1, "settings.warningDuration", null, false), WARP_ADVANCED_MODE(-1, "settings.advancedMode", null, true), diff --git a/src/main/resources/lang/en_US.json b/src/main/resources/lang/en_US.json index 516eaf7483..dda57a13a3 100644 --- a/src/main/resources/lang/en_US.json +++ b/src/main/resources/lang/en_US.json @@ -220,7 +220,7 @@ "showFeatureNamesOnHover": "Show Feature Names on Hover", "resetSalvagedEssencesAfterLeavingMenu": "Reset Salvaged Essence Counter After Closing Menu", "changeDungeonMapZoomWithKeyboard": "Adjust zoom with +/- keys", - "addPlayerSymbolsToChat": "Add Player Symbols To Chat Messages" + "showPlayerSymbolsInChat": "Show Player Symbols In Chat Messages" }, "messages": { "enchants": "Enchants", From 7cddb76571414c02985b00cf61fb7b2ddc2aa484 Mon Sep 17 00:00:00 2001 From: Rodry <38259440+ImRodry@users.noreply.github.com> Date: Mon, 5 Sep 2022 20:00:24 +0100 Subject: [PATCH 5/5] Update src/main/resources/lang/en_US.json --- src/main/resources/lang/en_US.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/lang/en_US.json b/src/main/resources/lang/en_US.json index 067f6339d3..dd2cf2fcc4 100644 --- a/src/main/resources/lang/en_US.json +++ b/src/main/resources/lang/en_US.json @@ -220,7 +220,7 @@ "showFeatureNamesOnHover": "Show Feature Names on Hover", "resetSalvagedEssencesAfterLeavingMenu": "Reset Salvaged Essence Counter After Closing Menu", "changeDungeonMapZoomWithKeyboard": "Adjust zoom with +/- keys", - "showPlayerSymbolsInChat": "Show Player Symbols In Chat Messages", + "showPlayerSymbolsInChat": "Show Player Symbols In Chat", "crimsonArmorAbilityStacks": "Show Crimson Armor Stacks", "hideTrueDefense": "Hide True Defense" },