diff options
author | Cow <cow@volloeko.de> | 2022-10-03 17:23:45 +0200 |
---|---|---|
committer | Cow <cow@volloeko.de> | 2022-10-03 22:14:06 +0200 |
commit | 8184833d01e3db0d2e386bc449e965f0f05b2a1b (patch) | |
tree | 76a9b0547a484a5cc0745f8bcfaeb6d1fbc174e2 | |
parent | 5ff6bdf6c27b7d27dbb501b52b5a8f7eb7f87cbd (diff) | |
download | Cowlection-8184833d01e3db0d2e386bc449e965f0f05b2a1b.tar.gz Cowlection-8184833d01e3db0d2e386bc449e965f0f05b2a1b.tar.bz2 Cowlection-8184833d01e3db0d2e386bc449e965f0f05b2a1b.zip |
Added newly released content
- new minions (from Crimson Island)
- new slayers (enderman + blaze)
- new areas (Crimson Island + Wool Wars)
- new game modes (Bingo + Stranded)
- new skill avg calculation
- added chest and hopper counters to `/moo analyzeIsland`
7 files changed, 261 insertions, 104 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index c7349d0..cce468a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,29 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [1.8.9-0.15.0] - unreleased + +### Added + +- Added data for new content since the last release of Cowlection: + - `/moo stalkskyblock`: + - added stranded and bingo mode + - added Social skill (exp wasn't available on the API before) + - updated skill average calculation (carpentry is no longer a 'cosmetic' skill) + - added new slayers (enderman + blaze) + - `/moo analyzeIsland`: added new minions (mainly Crimson Isle related) +- `/moo analyzeIsland`: Added chests and hopper counters + +### Changed + +- `/moo stalkskyblock`: replaced "last played" with "last time *someone* played on the selected profile" + +### Fixed + +- Fixed various API related issues caused by updates since the last release of Cowlection: + - determining the active/selected profile + - Minecraft username lookup by uuid changed since username history API got removed + ## [1.8.9-0.14.0] - 14.08.2021 ### Added - New command: `/commandslist` to list all client-side commands added by all installed mods @@ -359,6 +382,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). *Note:* The 'best friends' list is currently available via <kbd>ESC</kbd> > Mod Options > Cowlection > Config > bestFriends. +[1.8.9-0.15.0]: https://github.com/cow-mc/Cowlection/compare/v1.8.9-0.14.0...master [1.8.9-0.14.0]: https://github.com/cow-mc/Cowlection/compare/v1.8.9-0.13.0...v1.8.9-0.14.0 [1.8.9-0.13.0]: https://github.com/cow-mc/Cowlection/compare/v1.8.9-0.12.0...v1.8.9-0.13.0 [1.8.9-0.12.0]: https://github.com/cow-mc/Cowlection/compare/v1.8.9-0.11.0...v1.8.9-0.12.0 diff --git a/src/main/java/de/cowtipper/cowlection/command/MooCommand.java b/src/main/java/de/cowtipper/cowlection/command/MooCommand.java index 8d6b3e7..908f90b 100644 --- a/src/main/java/de/cowtipper/cowlection/command/MooCommand.java +++ b/src/main/java/de/cowtipper/cowlection/command/MooCommand.java @@ -36,10 +36,7 @@ import net.minecraft.item.ItemMap; import net.minecraft.item.ItemSkull; import net.minecraft.item.ItemStack; import net.minecraft.nbt.*; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityBanner; -import net.minecraft.tileentity.TileEntitySign; -import net.minecraft.tileentity.TileEntitySkull; +import net.minecraft.tileentity.*; import net.minecraft.util.*; import net.minecraft.world.storage.MapData; import net.minecraftforge.common.util.Constants; @@ -402,7 +399,7 @@ public class MooCommand extends CommandBase { highestSkill = skill; highestLevel = level; } - if (!skill.equals("Carpentry") && !skill.equals("Runecrafting")) { + if (!skill.equals("Runecrafting") && !skill.equals("Social")) { skillLevelsSum += level; } } @@ -435,7 +432,7 @@ public class MooCommand extends CommandBase { } double skillAverage = XpTables.Skill.getSkillAverage(skillLevelsSum); sbStats.appendFreshSibling(new MooChatComponent.KeyValueChatComponent("Skill average", String.format("%.1f", skillAverage)) - .setHover(new MooChatComponent("Average skill level over all non-cosmetic skills\n(all except Carpentry and Runecrafting)").gray())); + .setHover(new MooChatComponent("Average skill level over all non-cosmetic skills\n(all except Runecrafting and Social)").gray())); } else { sbStats.appendFreshSibling(new MooChatComponent.KeyValueChatComponent("Highest Skill", "API access disabled")); } @@ -729,7 +726,7 @@ public class MooCommand extends CommandBase { } StringBuilder analysisResults = new StringBuilder("Found ").append(EnumChatFormatting.GOLD).append(detectedMinionCount).append(EnumChatFormatting.YELLOW).append(" minions"); if (minionsWithSkinCount > 0) { - analysisResults.append(" + ").append(EnumChatFormatting.GOLD).append(minionsWithSkinCount).append(EnumChatFormatting.YELLOW).append(" unknown minions with skins"); + analysisResults.append(" + ").append(EnumChatFormatting.GOLD).append(minionsWithSkinCount).append(EnumChatFormatting.YELLOW).append(" unknown minions"); } analysisResults.append(" on this island"); detectedMinions.entrySet().stream() @@ -755,6 +752,20 @@ public class MooCommand extends CommandBase { analysisResults.append("\n ").append(EnumChatFormatting.GOLD).append(minionWithSkin.getValue()).append(minionWithSkin.getValue() > 1 ? "✕ " : "⨉ ") .append(EnumChatFormatting.RED).append("Unknown minion ").append(EnumChatFormatting.YELLOW).append("(new or with minion skin) ").append(tierColor).append(minionTier); }); + // Tile entities (chests/hoppers) + int chestCount = 0; + int hopperCount = 0; + for (TileEntity tileEntity : sender.getEntityWorld().loadedTileEntityList) { + if (tileEntity instanceof TileEntityChest) { + ++chestCount; + } else if (tileEntity instanceof TileEntityHopper) { + ++hopperCount; + } + } + analysisResults.append("\n").append(EnumChatFormatting.YELLOW).append("Found ") + .append(EnumChatFormatting.GOLD).append(chestCount).append(EnumChatFormatting.YELLOW).append(" chests and ") + .append(EnumChatFormatting.GOLD).append(hopperCount).append(EnumChatFormatting.YELLOW).append(" hoppers nearby."); + main.getChatHelper().sendMessage(EnumChatFormatting.YELLOW, analysisResults.toString()); } diff --git a/src/main/java/de/cowtipper/cowlection/data/DataHelper.java b/src/main/java/de/cowtipper/cowlection/data/DataHelper.java index 1be3f6f..8520493 100644 --- a/src/main/java/de/cowtipper/cowlection/data/DataHelper.java +++ b/src/main/java/de/cowtipper/cowlection/data/DataHelper.java @@ -81,7 +81,8 @@ public final class DataHelper { SKYBLOCK("SkyBlock"), PIT("Pit"), REPLAY("Replay"), - SMP("SMP"); + SMP("SMP"), + WOOL_GAMES("Wool Wars"); private final String cleanName; @@ -181,7 +182,7 @@ public final class DataHelper { public static Map<String, String> getMinions() { // key = skin id, value = minion type and tier Map<String, String> minions = new HashMap<>(); - // TODO currently Fishing VI + VII and Revenant I + XII use the same skull texture (server-side) - thus can't be distinguished + // TODO currently Fishing VI + VII and Revenant I + XII and Flower XI + XII + Magma Cube XI + XII use the same skull texture (server-side) - thus can't be distinguished minions.put("2f93289a82bd2a06cbbe61b733cfdc1f1bd93c4340f7a90abd9bdda774109071", "Cobblestone I"); minions.put("3fd87486dc94cb8cd04a3d7d06f191f027f38dad7b4ed34c6681fb4d08834c06", "Cobblestone II"); minions.put("cc088ed6bb8763af4eb7d006e00fda7dc11d7681e97c983b7011c3e872f6aab9", "Cobblestone III"); @@ -219,6 +220,7 @@ public final class DataHelper { minions.put("b30d071e8c97a9c065b307d8a845ef8be6f6db85b71a2299f1bea0be062873e7", "Glowstone IX"); minions.put("8eeb870670e9408a78b386db6c2106e93f7c8cf03344b2cb3128ae0a4ea19674", "Glowstone X"); minions.put("8bc66c5eb7a197d959fcc5d45a7aff938e07ddcd42e3f3993bde00f56fe58dd1", "Glowstone XI"); + minions.put("91701aa68a2d141fe0a85ba4825b67462de4d2cbccd8b52ef018d39e37296ee2", "Glowstone XII"); minions.put("7458507ed31cf9a38986ac8795173c609637f03da653f30483a721d3fbe602d", "Gravel I"); minions.put("fb48c89157ae36038bbd9c88054ef8797f5b6f38631c1b57e58dcb8d701fa61d", "Gravel II"); @@ -244,6 +246,32 @@ public final class DataHelper { minions.put("fdceae5bc34dee02b31a68b0015d0ca808844e491cf926c6763d52b26191993f", "Sand X"); minions.put("c0e9118bcebf481394132a5111fcbcd9981b9a99504923b04794912660e22cea", "Sand XI"); + minions.put("9d24991435e4e7fb1a9ad23db75c80aec300d003ec0c5963e0ed658634027889", "Red Sand I"); + minions.put("d61dbdb2056dc998126d6c289d9a6023602be5dad5083f10e3c58d10fae3339f", "Red Sand II"); + minions.put("cb8b223ba4a85a598f58d825c3b58ef1a2e1c0995880e291002730aa9cbd3e10", "Red Sand III"); + minions.put("f3cfa0a6d31d0de2badf94a6934188159289e7ac8b75b1df4e82d3dcf35993c7", "Red Sand IV"); + minions.put("26af8bef4d12cc45cc5ff927dbe7d72ca025bbf3f7ae71c3d6c4aaf062bb3cd9", "Red Sand V"); + minions.put("24a9cb73ca09e5838feccae3cd2fa719327d743f1891305b6c0a8538c4fe9c41", "Red Sand VI"); + minions.put("56cafdedeb9b7b708b99c675be6d3e32dd48a628c9aa0222458fa0d71e187813", "Red Sand VII"); + minions.put("5537801c120720625746608e2fceaf04af16aead34296f7c9f790c56872abbda", "Red Sand VIII"); + minions.put("15f9be6eaea4c6c43329ab512b17f5bfbcc453e11b5351ddb572df35f597dd9a", "Red Sand IX"); + minions.put("dbf7060ca6f41076ffbb869b7c05b386f296820ef7aecd0f908f120b8317a077", "Red Sand X"); + minions.put("859fb3c281dffba855fcf58b837749fb6142d785d6d8875d86ffb1920f103d20", "Red Sand XI"); + minions.put("99fd71cefb5ad4ec2a239f04e6fef0d8838f3100fa775006b8d7bed4c20b7cc7", "Red Sand XII"); + + minions.put("fc8ebad72b77df3990e07bc869a99a8f8962d3c19c76e39d99553cae4131cc8", "Mycelium I"); + minions.put("7a41cf5a575f98d2686d35471d164afd76e907387362435af5175dcf8af9fbb0", "Mycelium II"); + minions.put("5e857bddca9f14d66ae4c3a909447d5978f443db97e32efb6fde29b4a41d4d40", "Mycelium III"); + minions.put("583d7d5e52342091add5b0ae4992c65d599ad56f9d979f73b10d68f09d20ddbc", "Mycelium IV"); + minions.put("4b8778057129a9d56632f07800854d5982b9132bd193a6f1517c288dd85d9ff3", "Mycelium V"); + minions.put("341e6f7533482d8c4b46ca5b9747819ab61f34d7d1442e638b65cd706e225bd9", "Mycelium VI"); + minions.put("2472a4d11bc93f2246250116b46900def5c4731182b374f4444c49b33928e2e", "Mycelium VII"); + minions.put("3160fc6b6ca8a735a62c4918596f1f6a10f81933f5e83586ad46158aaeca8fe", "Mycelium VIII"); + minions.put("e0124bfa3865dd94e09a8637db591c2caa1ab51fa06946f04b261e9a6c63ff68", "Mycelium IX"); + minions.put("5dd19195d650240187b5874a0080a7734c28e31bb7e1aedd347ae9c634640e54", "Mycelium X"); + minions.put("f379623e4f66deca3f5365986c39a6183c851cb20efb5d6121ef4206c9e8d11c", "Mycelium XI"); + minions.put("d2290d9564a5a5702260128fe8f56532cdee1f15ef99f18b1528e2ec17719946", "Mycelium XII"); + minions.put("af9b312c8f53da289060e6452855072e07971458abbf338ddec351e16c171ff8", "Clay I"); minions.put("7411bd08421fccfea5077320a5cd2e4eecd285c86fc9d2687abb795ef119097f", "Clay II"); minions.put("fd4ffcb5df4ef82fc07bc7585474c97fc0f2bf59022ffd6c2606b4675f8aaa42", "Clay III"); @@ -382,6 +410,7 @@ public final class DataHelper { minions.put("2974bc0b9771a4af994ea571638adf1e98cd896acf95cc27b890915669bcedfd", "Quartz IX"); minions.put("3ae41345d675f4ed4dc5145662303123cb828b6e1a3e72d8278174488562dfa9", "Quartz X"); minions.put("7aeec9ef192e733bfcb723afd489cbf4735e7cfdd2ec45cae924009a8f093708", "Quartz XI"); + minions.put("cb2903b51e16da7d778b7d0352c3ff08a21245bc476b73cdb82417ba4ff8a139", "Quartz XII"); minions.put("7994be3dcfbb4ed0a5a7495b7335af1a3ced0b5888b5007286a790767c3b57e6", "End Stone I"); minions.put("eb0f8a2752e733e8d9152b1cf0a385961fa1ba77daed8d2e4e02348691610529", "End Stone II"); @@ -562,6 +591,7 @@ public final class DataHelper { minions.put("4beed0b166465261f07399fe97304b9913f522e0d42e78d86849ec72be3d7fa9", "Flower IX"); minions.put("d719f6041aaaf6c7b55042a550d51e17af727f6b8e41af09a1aded49c9ff9e31", "Flower X"); minions.put("1142fe535855dd6b06f4f0817dbc8bf98da31265ae918b854cd11fcacd6fab4c", "Flower XI"); + minions.put("1142fe535855dd6b06f4f0817dbc8bf98da31265ae918b854cd11fcacd6fab4c", "Flower XII"); minions.put("53ea0fd89524db3d7a3544904933830b4fc8899ef60c113d948bb3c4fe7aabb1", "Fishing I"); minions.put("8798c0d7b65bfa5f56b084c1f51767a4276ad9f2c60bcb284dc6eccb7281e2ab", "Fishing II"); @@ -599,6 +629,7 @@ public final class DataHelper { minions.put("e7eb574b6ab8b394c6b4a112ae18d5a672ffa414ec4dff3d65c9950523c19e0a", "Revenant IX"); minions.put("d0197c8a4eaca2e5cc1b287ac84c62ef8c9f63068218105292dd89c3f7e64596", "Revenant X"); minions.put("9cf6f95308bedb182b434aa73058aa8d69818b48900396cebc127c1bf7df6790", "Revenant XI"); + minions.put("a3dce8555923558d8d74c2a2b261b2b2d630559db54ef97ed3f9c30e9a20aba", "Revenant XII"); minions.put("3a851ed2ce5c2c0523af772d206d9555e2e1383ec87946e6ff4c51186e29ef7f", "Voidling I"); minions.put("bc494af6b45980cb2b035007c25e1b4e169371c410fe5d2708daa4f695668fd2", "Voidling II"); @@ -612,6 +643,18 @@ public final class DataHelper { minions.put("7d63d05501d38fac8b0969deb78b68a58fe03c3e0d78cdb84ef1a9a7513ee326", "Voidling X"); minions.put("7334fc47a50b46ac9df7bf2ed712309ff0b029981368b22db0d539c88f83144f", "Voidling XI"); + minions.put("665c54366f88fb3280b1c3fc500ce2b799c8dd327ab6d41c9bc959488f5cfd92", "Inferno I"); + minions.put("22104034909623d6094a5060e05af6da5cbf752a18580911368fa36d69492af3", "Inferno II"); + minions.put("2c01ba652a23b19dbb1d59ebab0b308eb72861d5bcd7d42630316c3e6542e01a", "Inferno III"); + minions.put("83abec14acbc4938952fb5986cb14583484ccb7de62d1b9c2b41196a9876c3ce", "Inferno IV"); + minions.put("2a6e8184c3299b293af75774918c48722afaf3309da5290e0f258048f2aadf66", "Inferno V"); + minions.put("1b6665f5be583328d1021f0ae6f973c7d9e728b1ac465c40c87a779af06587bf", "Inferno VI"); + minions.put("6bda967f41e0ea42289abfb661c7c71b28045d488a0f10e13d78b653c25f8f0d", "Inferno VII"); + minions.put("513f8ed44fb2f82ade92bb56a606be3b595cd716b1bbf0950f0866cc6393d25b", "Inferno VIII"); + minions.put("86d467092efb156707c254f168ff03b0b763a74fe9f8ac15616ea4c97adfaf69", "Inferno IX"); + minions.put("65c70f90a11c2d47feed7d1317b1c1b7fe93706a192a983af9a81a5170dbe71b", "Inferno X"); + minions.put("ec7cc5d8dea1eac6aa307b9ad32b79da0af7d16bad0fd8e34cc5735739db9753", "Inferno XI"); + minions.put("2fe009c5cfa44c05c88e5df070ae2533bd682a728e0b33bfc93fd92a6e5f3f64", "Skeleton I"); minions.put("3ab6f9c3c911879181dbf2468783348abc671346d5e8c34d118b2b7ece7c47c2", "Skeleton II"); minions.put("ccd9559dc31e4700aaf001e0e2f0bd3517f238af25decd8395f4621404ca4568", "Skeleton III"); @@ -683,6 +726,7 @@ public final class DataHelper { minions.put("a2a246dbcc45be4a936a19b44fcb61725c0fe2372a0ce0676fb08fd54d4d899b", "Blaze IX"); minions.put("ea357aeaf75a8cfed2b3c1c8f3ccf54f907ae2b64fa871cf201baeef53528e19", "Blaze X"); minions.put("e791eb26b39f162f552d539a4d22c4bee8aa9c571d9acf82a012593bb945c360", "Blaze XI"); + minions.put("c64b157a9dffd66a8fe832f8564c2c7822279cdda344dfbef23f84c65ef625d1", "Blaze XII"); minions.put("18c9a7a24da7e3182e4f62fa62762e21e1680962197c7424144ae1d2c42174f7", "Magma Cube I"); minions.put("212ff47f5c8b38e96e940b9957958e37d610918df9b664b0c11bd6246799f4af", "Magma Cube II"); @@ -695,6 +739,7 @@ public final class DataHelper { minions.put("76101f4bb000518bbedc4b1147a920a99f141b8a679f2984fb94741a33eed69f", "Magma Cube IX"); minions.put("e9e67c3860cc1d36cb4930e0ae0488c64abc4e910b4224dc9160d273c3af0bba", "Magma Cube X"); minions.put("6ab2af6b08c3acedd2328e152ef7177f6bbb617dc985dfbfecdc982e04939b04", "Magma Cube XI"); + minions.put("6ab2af6b08c3acedd2328e152ef7177f6bbb617dc985dfbfecdc982e04939b04", "Magma Cube XII"); minions.put("e460d20ba1e9cd1d4cfd6d5fb0179ff41597ac6d2461bd7ccdb58b20291ec46e", "Enderman I"); minions.put("e38b1bacbce1c6fa1928a89d443868a40a98da7b4507801993b1ab9bb9115458", "Enderman II"); @@ -719,6 +764,7 @@ public final class DataHelper { minions.put("af4d8d82f4d86569c70d265f5cf62e46ee8dc0a5a6d97ef1901c793d0b127545", "Ghast IX"); minions.put("4013d128e7116812388b789ec641d31d48bf10aa862f7d63d2b4fc0a03d147a2", "Ghast X"); minions.put("5840896c78884ebb35103b31ffd7276c941ea862b8b6b0e0810a66b4ed66cbc2", "Ghast XI"); + minions.put("e34cefdd0239b6d37fd74318e283181c4819f05c56352e6216c2d047c74f7007", "Ghast XII"); minions.put("c95eced85db62c922724efca804ea0060c4a87fcdedf2fd5c4f9ac1130a6eb26", "Slime I"); minions.put("4a3ea6b0c297c5156249353ff7fcf57b1175e1b90b56a815aa039009ff0ea04f", "Slime II"); diff --git a/src/main/java/de/cowtipper/cowlection/data/HySkyBlockStats.java b/src/main/java/de/cowtipper/cowlection/data/HySkyBlockStats.java index fb38fe7..23bcfc5 100644 --- a/src/main/java/de/cowtipper/cowlection/data/HySkyBlockStats.java +++ b/src/main/java/de/cowtipper/cowlection/data/HySkyBlockStats.java @@ -83,8 +83,16 @@ public class HySkyBlockStats { public String getGameModeIcon() { if (StringUtils.isNullOrEmpty(game_mode)) { return ""; - } else if ("ironman".equals(game_mode)) { - return EnumChatFormatting.GRAY + "♲"; + } + switch (game_mode) { + case "bingo": + return EnumChatFormatting.DARK_PURPLE + "Ⓑ"; + case "ironman": + return EnumChatFormatting.GRAY + "♲"; + case "island": // stranded + return EnumChatFormatting.GREEN + "☀"; + default: + return EnumChatFormatting.ITALIC + Utils.fancyCase(game_mode); } } @@ -143,6 +151,7 @@ public class HySkyBlockStats { private double experience_skill_alchemy = -1; private double experience_skill_carpentry = -1; private double experience_skill_runecrafting = -1; + private double experience_skill_social2 = -1; private double experience_skill_taming = -1; private Map<String, SlayerBossDetails> slayer_bosses; private List<Pet> pets; @@ -196,6 +205,9 @@ public class HySkyBlockStats { if (experience_skill_runecrafting >= 0) { skills.put(XpTables.Skill.RUNECRAFTING, XpTables.Skill.RUNECRAFTING.getLevel(experience_skill_runecrafting)); } + if (experience_skill_social2 >= 0) { + skills.put(XpTables.Skill.SOCIAL, XpTables.Skill.SOCIAL.getLevel(experience_skill_social2)); + } if (experience_skill_taming >= 0) { skills.put(XpTables.Skill.TAMING, XpTables.Skill.TAMING.getLevel(experience_skill_taming)); } @@ -263,7 +275,7 @@ public class HySkyBlockStats { String itemName = nbtDisplay.getString("Name"); armorList.add(0, itemName); } else { - armorList.add(0, "" + EnumChatFormatting.GRAY + EnumChatFormatting.ITALIC + "(empty)"); + armorList.add(0, "" + EnumChatFormatting.GRAY + EnumChatFormatting.ITALIC + "(empty slot)"); } } } diff --git a/src/main/java/de/cowtipper/cowlection/data/HyStalkingData.java b/src/main/java/de/cowtipper/cowlection/data/HyStalkingData.java index fb9f704..d6d7fb2 100644 --- a/src/main/java/de/cowtipper/cowlection/data/HyStalkingData.java +++ b/src/main/java/de/cowtipper/cowlection/data/HyStalkingData.java @@ -94,7 +94,7 @@ public class HyStalkingData { case "combat_1": return "Spider's Den"; case "combat_2": - return "Blazing Fortress"; + return "Crimson Isle"; case "combat_3": return "The End"; case "dungeon": diff --git a/src/main/java/de/cowtipper/cowlection/data/XpTables.java b/src/main/java/de/cowtipper/cowlection/data/XpTables.java index 7123387..ea89c78 100644 --- a/src/main/java/de/cowtipper/cowlection/data/XpTables.java +++ b/src/main/java/de/cowtipper/cowlection/data/XpTables.java @@ -4,10 +4,44 @@ import java.util.*; public class XpTables { public enum Skill { - FARMING, MINING, COMBAT, FORAGING, FISHING, ENCHANTING, ALCHEMY, CARPENTRY, RUNECRAFTING(true), TAMING; - private final boolean alternativeXpFormula; + FARMING, MINING, COMBAT, FORAGING, FISHING, ENCHANTING, ALCHEMY, CARPENTRY, RUNECRAFTING(SkillXpTable.RC), SOCIAL(SkillXpTable.SOCIAL), TAMING; + private final SkillXpTable skillXpTable; + + Skill() { + this(SkillXpTable.DEFAULT); + } + + Skill(SkillXpTable skillXpTable) { + this.skillXpTable = skillXpTable; + } + + public int getLevel(double exp) { + return getLevel(exp, skillXpTable == SkillXpTable.DEFAULT ? 50 : 25); + } + + public int getLevel(double exp, int maxLevel) { + return Math.min(skillXpTable.getLevel(exp), maxLevel); + } + + public static double getSkillAverage(int skillLevelsSum) { + return skillLevelsSum / (getSkillCount() * 1d); + } + + /** + * Amount of skills without cosmetic skills (Runecrafting, Social) + * + * @return amount of existing skills + */ + private static int getSkillCount() { + return values().length - 2; + } + } + + private enum SkillXpTable { + DEFAULT, RC, SOCIAL; private static final TreeMap<Integer, Integer> XP_TO_LEVEL = new TreeMap<>(); - private static final TreeMap<Integer, Integer> XP_TO_LEVEL_ALTERNATIVE = new TreeMap<>(); + private static final TreeMap<Integer, Integer> XP_TO_LEVEL_RC = new TreeMap<>(); + private static final TreeMap<Integer, Integer> XP_TO_LEVEL_SOCIAL = new TreeMap<>(); static { // exp data taken from https://api.hypixel.net/resources/skyblock/skills @@ -73,122 +107,145 @@ public class XpTables { XP_TO_LEVEL.put(104672425, 59); XP_TO_LEVEL.put(111672425, 60); - XP_TO_LEVEL_ALTERNATIVE.put(0, 0); - XP_TO_LEVEL_ALTERNATIVE.put(50, 1); - XP_TO_LEVEL_ALTERNATIVE.put(150, 2); - XP_TO_LEVEL_ALTERNATIVE.put(275, 3); - XP_TO_LEVEL_ALTERNATIVE.put(435, 4); - XP_TO_LEVEL_ALTERNATIVE.put(635, 5); - XP_TO_LEVEL_ALTERNATIVE.put(885, 6); - XP_TO_LEVEL_ALTERNATIVE.put(1200, 7); - XP_TO_LEVEL_ALTERNATIVE.put(1600, 8); - XP_TO_LEVEL_ALTERNATIVE.put(2100, 9); - XP_TO_LEVEL_ALTERNATIVE.put(2725, 10); - XP_TO_LEVEL_ALTERNATIVE.put(3510, 11); - XP_TO_LEVEL_ALTERNATIVE.put(4510, 12); - XP_TO_LEVEL_ALTERNATIVE.put(5760, 13); - XP_TO_LEVEL_ALTERNATIVE.put(7325, 14); - XP_TO_LEVEL_ALTERNATIVE.put(9325, 15); - XP_TO_LEVEL_ALTERNATIVE.put(11825, 16); - XP_TO_LEVEL_ALTERNATIVE.put(14950, 17); - XP_TO_LEVEL_ALTERNATIVE.put(18950, 18); - XP_TO_LEVEL_ALTERNATIVE.put(23950, 19); - XP_TO_LEVEL_ALTERNATIVE.put(30200, 20); - XP_TO_LEVEL_ALTERNATIVE.put(38050, 21); - XP_TO_LEVEL_ALTERNATIVE.put(47850, 22); - XP_TO_LEVEL_ALTERNATIVE.put(60100, 23); - XP_TO_LEVEL_ALTERNATIVE.put(75400, 24); - XP_TO_LEVEL_ALTERNATIVE.put(94450, 25); - } - - Skill() { - this(false); - } + XP_TO_LEVEL_RC.put(0, 0); + XP_TO_LEVEL_RC.put(50, 1); + XP_TO_LEVEL_RC.put(150, 2); + XP_TO_LEVEL_RC.put(275, 3); + XP_TO_LEVEL_RC.put(435, 4); + XP_TO_LEVEL_RC.put(635, 5); + XP_TO_LEVEL_RC.put(885, 6); + XP_TO_LEVEL_RC.put(1200, 7); + XP_TO_LEVEL_RC.put(1600, 8); + XP_TO_LEVEL_RC.put(2100, 9); + XP_TO_LEVEL_RC.put(2725, 10); + XP_TO_LEVEL_RC.put(3510, 11); + XP_TO_LEVEL_RC.put(4510, 12); + XP_TO_LEVEL_RC.put(5760, 13); + XP_TO_LEVEL_RC.put(7325, 14); + XP_TO_LEVEL_RC.put(9325, 15); + XP_TO_LEVEL_RC.put(11825, 16); + XP_TO_LEVEL_RC.put(14950, 17); + XP_TO_LEVEL_RC.put(18950, 18); + XP_TO_LEVEL_RC.put(23950, 19); + XP_TO_LEVEL_RC.put(30200, 20); + XP_TO_LEVEL_RC.put(38050, 21); + XP_TO_LEVEL_RC.put(47850, 22); + XP_TO_LEVEL_RC.put(60100, 23); + XP_TO_LEVEL_RC.put(75400, 24); + XP_TO_LEVEL_RC.put(94450, 25); - Skill(boolean alternativeXpFormula) { - this.alternativeXpFormula = alternativeXpFormula; + XP_TO_LEVEL_SOCIAL.put(0, 0); + XP_TO_LEVEL_SOCIAL.put(50, 1); + XP_TO_LEVEL_SOCIAL.put(150, 2); + XP_TO_LEVEL_SOCIAL.put(300, 3); + XP_TO_LEVEL_SOCIAL.put(550, 4); + XP_TO_LEVEL_SOCIAL.put(1050, 5); + XP_TO_LEVEL_SOCIAL.put(1800, 6); + XP_TO_LEVEL_SOCIAL.put(2800, 7); + XP_TO_LEVEL_SOCIAL.put(4050, 8); + XP_TO_LEVEL_SOCIAL.put(5550, 9); + XP_TO_LEVEL_SOCIAL.put(7550, 10); + XP_TO_LEVEL_SOCIAL.put(10050, 11); + XP_TO_LEVEL_SOCIAL.put(13050, 12); + XP_TO_LEVEL_SOCIAL.put(16800, 13); + XP_TO_LEVEL_SOCIAL.put(21300, 14); + XP_TO_LEVEL_SOCIAL.put(27300, 15); + XP_TO_LEVEL_SOCIAL.put(35300, 16); + XP_TO_LEVEL_SOCIAL.put(45300, 17); + XP_TO_LEVEL_SOCIAL.put(57800, 18); + XP_TO_LEVEL_SOCIAL.put(72800, 19); + XP_TO_LEVEL_SOCIAL.put(92800, 20); + XP_TO_LEVEL_SOCIAL.put(117800, 21); + XP_TO_LEVEL_SOCIAL.put(147800, 22); + XP_TO_LEVEL_SOCIAL.put(182800, 23); + XP_TO_LEVEL_SOCIAL.put(222800, 24); + XP_TO_LEVEL_SOCIAL.put(272800, 25); } public int getLevel(double exp) { - if (alternativeXpFormula) { - return getLevel(exp, 25); - } else { - return getLevel(exp, 50); + TreeMap<Integer, Integer> currentXpTable = XP_TO_LEVEL; + if (this == RC) { + currentXpTable = XP_TO_LEVEL_RC; + } else if (this == SOCIAL) { + currentXpTable = XP_TO_LEVEL_SOCIAL; } + + return currentXpTable.floorEntry((int) exp).getValue(); } + } - public int getLevel(double exp, int maxLevel) { - if (alternativeXpFormula) { - return Math.min(XP_TO_LEVEL_ALTERNATIVE.floorEntry((int) exp).getValue(), maxLevel); - } else { - return Math.min(XP_TO_LEVEL.floorEntry((int) exp).getValue(), maxLevel); - } + public enum Slayer { + ZOMBIE(SlayerXpTable.ZOMBIE), SPIDER(SlayerXpTable.SPIDER), WOLF, ENDERMAN, BLAZE; + private final SlayerXpTable slayerXpTable; + + Slayer() { + this(SlayerXpTable.DEFAULT); } - public static double getSkillAverage(int skillLevelsSum) { - return skillLevelsSum / (getSkillCount() * 1d); + Slayer(SlayerXpTable slayerXpTable) { + this.slayerXpTable = slayerXpTable; } - /** - * Amount of skills without cosmetic skills (Carpentry, Runecrafting) - * - * @return amount of existing skills - */ - private static int getSkillCount() { - return values().length - 2; + public int getLevel(double exp) { + return this.slayerXpTable.getLevel(exp); } } - public enum Slayer { - ZOMBIE, SPIDER, WOLF(true), ENDERMAN(true); - private final boolean alternativeXpFormula; + private enum SlayerXpTable { + DEFAULT, ZOMBIE, SPIDER; + /** - * Valid for Zombie + Spider + * Valid for Wolf + Enderman + Blaze */ private static final TreeMap<Integer, Integer> XP_TO_LEVEL = new TreeMap<>(); - /** - * Valid for Wolf - */ - private static final TreeMap<Integer, Integer> XP_TO_LEVEL_ALTERNATIVE = new TreeMap<>(); + private static final TreeMap<Integer, Integer> XP_TO_LEVEL_ZOMBIE = new TreeMap<>(); + private static final TreeMap<Integer, Integer> XP_TO_LEVEL_SPIDER = new TreeMap<>(); static { + // exp data taken from https://wiki.hypixel.net/Slayer XP_TO_LEVEL.put(0, 0); - XP_TO_LEVEL.put(5, 1); - XP_TO_LEVEL.put(15, 2); - XP_TO_LEVEL.put(200, 3); - XP_TO_LEVEL.put(1000, 4); + XP_TO_LEVEL.put(10, 1); + XP_TO_LEVEL.put(30, 2); + XP_TO_LEVEL.put(250, 3); + XP_TO_LEVEL.put(1500, 4); XP_TO_LEVEL.put(5000, 5); XP_TO_LEVEL.put(20000, 6); XP_TO_LEVEL.put(100000, 7); XP_TO_LEVEL.put(400000, 8); XP_TO_LEVEL.put(1000000, 9); - XP_TO_LEVEL_ALTERNATIVE.put(0, 0); - XP_TO_LEVEL_ALTERNATIVE.put(5, 1); - XP_TO_LEVEL_ALTERNATIVE.put(15, 2); - XP_TO_LEVEL_ALTERNATIVE.put(200, 3); - XP_TO_LEVEL_ALTERNATIVE.put(1500, 4); - XP_TO_LEVEL_ALTERNATIVE.put(5000, 5); - XP_TO_LEVEL_ALTERNATIVE.put(20000, 6); - XP_TO_LEVEL_ALTERNATIVE.put(100000, 7); - XP_TO_LEVEL_ALTERNATIVE.put(400000, 8); - XP_TO_LEVEL_ALTERNATIVE.put(1000000, 9); - } + XP_TO_LEVEL_ZOMBIE.put(0, 0); + XP_TO_LEVEL_ZOMBIE.put(5, 1); + XP_TO_LEVEL_ZOMBIE.put(15, 2); + XP_TO_LEVEL_ZOMBIE.put(200, 3); + XP_TO_LEVEL_ZOMBIE.put(1000, 4); + XP_TO_LEVEL_ZOMBIE.put(5000, 5); + XP_TO_LEVEL_ZOMBIE.put(20000, 6); + XP_TO_LEVEL_ZOMBIE.put(100000, 7); + XP_TO_LEVEL_ZOMBIE.put(400000, 8); + XP_TO_LEVEL_ZOMBIE.put(1000000, 9); - Slayer() { - this(false); - } - - Slayer(boolean alternativeXpFormula) { - this.alternativeXpFormula = alternativeXpFormula; + XP_TO_LEVEL_SPIDER.put(0, 0); + XP_TO_LEVEL_SPIDER.put(5, 1); + XP_TO_LEVEL_SPIDER.put(25, 2); + XP_TO_LEVEL_SPIDER.put(200, 3); + XP_TO_LEVEL_SPIDER.put(1000, 4); + XP_TO_LEVEL_SPIDER.put(5000, 5); + XP_TO_LEVEL_SPIDER.put(20000, 6); + XP_TO_LEVEL_SPIDER.put(100000, 7); + XP_TO_LEVEL_SPIDER.put(400000, 8); + XP_TO_LEVEL_SPIDER.put(1000000, 9); } public int getLevel(double exp) { - if (alternativeXpFormula) { - return XP_TO_LEVEL_ALTERNATIVE.floorEntry((int) exp).getValue(); - } else { - return XP_TO_LEVEL.floorEntry((int) exp).getValue(); + TreeMap<Integer, Integer> currentXpTable = XP_TO_LEVEL; + if (this == ZOMBIE) { + currentXpTable = XP_TO_LEVEL_ZOMBIE; + } else if (this == SPIDER) { + currentXpTable = XP_TO_LEVEL_SPIDER; } + + return currentXpTable.floorEntry((int) exp).getValue(); } } diff --git a/src/main/java/de/cowtipper/cowlection/listener/skyblock/SkyBlockListener.java b/src/main/java/de/cowtipper/cowlection/listener/skyblock/SkyBlockListener.java index 4f38872..8f152a2 100644 --- a/src/main/java/de/cowtipper/cowlection/listener/skyblock/SkyBlockListener.java +++ b/src/main/java/de/cowtipper/cowlection/listener/skyblock/SkyBlockListener.java @@ -74,7 +74,7 @@ public class SkyBlockListener { // example: " §a42§7x §fLeather §7for §6436.8 coins" private static final Pattern BAZAAR_SELL_ALL_PATTERN = Pattern.compile("^(?:§[0-9a-fl-or])* (?:§[0-9a-fl-or])+([0-9,]+)(?:§[0-9a-fl-or])+x (?:§[0-9a-fl-or])+.+ (?:§[0-9a-fl-or])+for (?:§[0-9a-fl-or])+([0-9,.]+) coins$"); private static final Pattern BAZAAR_TARGET_AMOUNT_PATTERN = Pattern.compile("^O(?:ff|rd)er amount: ([\\d,]+)x$"); - private static final Pattern BAZAAR_FILLED_PATTERN = Pattern.compile("^Filled: ([\\d,.k]+)/(?:[\\d,.k]+) \\(?([\\d.]+)%[)!]$"); + private static final Pattern BAZAAR_FILLED_PATTERN = Pattern.compile("^Filled: ([\\d,.k]+)/[\\d,.k]+ \\(?([\\d.]+)%[)!]$"); List<BestiaryEntry> bestiaryOverview = null; private final NumberFormat numberFormatter; private final Cowlection main; @@ -306,9 +306,16 @@ public class SkyBlockListener { if (!MooConfig.isTooltipToggleKeyBindingPressed()) { break; } - case ALWAYS: - e.toolTip.add(index, "Item age: " + EnumChatFormatting.DARK_GRAY + ((MooConfig.tooltipItemAgeShortened) ? Utils.getDurationAsWord(dateTime.toEpochSecond() * 1000) : Utils.getDurationAsWords(dateTime.toEpochSecond() * 1000).first())); + case ALWAYS: { + long itemCreationTimestamp = dateTime.toEpochSecond() * 1000; + long itemAgeInMs = System.currentTimeMillis() - itemCreationTimestamp; + + String itemAge = itemAgeInMs >= 60_000 + ? (MooConfig.tooltipItemAgeShortened ? Utils.getDurationAsWord(itemCreationTimestamp) : Utils.getDurationAsWords(itemCreationTimestamp).first()) + : "<1 minute"; + e.toolTip.add(index, "Item age: " + EnumChatFormatting.DARK_GRAY + itemAge); break; + } default: // do nothing break; |