diff options
| author | Moritz <59416038+Morazzer@users.noreply.github.com> | 2025-01-25 18:57:09 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-26 01:57:09 +0800 |
| commit | f73a04e4eb009cb15066c20f233fd6f11c87511e (patch) | |
| tree | 611af864dac553465f2d8732f107cac97e925cf0 /src | |
| parent | 76f0b6ea632cdef87e1791c8d96a2fbf586ef81f (diff) | |
| download | Skyblocker-f73a04e4eb009cb15066c20f233fd6f11c87511e.tar.gz Skyblocker-f73a04e4eb009cb15066c20f233fd6f11c87511e.tar.bz2 Skyblocker-f73a04e4eb009cb15066c20f233fd6f11c87511e.zip | |
add enchantment abbreviations as slot text (#1056)
* add enchantment abbreviations as slot text
* Refactor and clean up
* Move verification to unit test
* Refactor, now this is clean code
---------
Co-authored-by: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>
Diffstat (limited to 'src')
2 files changed, 220 insertions, 7 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/EnchantmentLevelAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/EnchantmentLevelAdder.java index 6755370a..2a355a57 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/EnchantmentLevelAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/EnchantmentLevelAdder.java @@ -1,25 +1,198 @@ package de.hysky.skyblocker.skyblock.item.slottext.adders; -import de.hysky.skyblocker.skyblock.item.slottext.SlotText; import de.hysky.skyblocker.skyblock.item.slottext.SimpleSlotTextAdder; +import de.hysky.skyblocker.skyblock.item.slottext.SlotText; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.RomanNumerals; +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.VisibleForTesting; import java.util.List; +import java.util.Map; +import java.util.Optional; public class EnchantmentLevelAdder extends SimpleSlotTextAdder { private static final ConfigInformation CONFIG_INFORMATION = new ConfigInformation( "enchantment_level", "skyblocker.config.uiAndVisuals.slotText.enchantmentLevel"); + @VisibleForTesting + static final Object2ObjectMap<String, String> ENCHANTMENT_ABBREVIATIONS = new Object2ObjectOpenHashMap<>(); + @VisibleForTesting + static final Map<String, String> ULTIMATE_ENCHANTMENT_ABBREVIATIONS = new Object2ObjectOpenHashMap<>(); + + static { + // Normal enchants (A - Z) + ENCHANTMENT_ABBREVIATIONS.put("angler", "AN"); + ENCHANTMENT_ABBREVIATIONS.put("aqua_affinity", "AA"); + ENCHANTMENT_ABBREVIATIONS.put("aiming", "DT"); // Dragon tracer + + ENCHANTMENT_ABBREVIATIONS.put("bane_of_arthropods", "BA"); + ENCHANTMENT_ABBREVIATIONS.put("big_brain", "BB"); + ENCHANTMENT_ABBREVIATIONS.put("blast_protection", "BP"); + ENCHANTMENT_ABBREVIATIONS.put("blessing", "BL"); + + ENCHANTMENT_ABBREVIATIONS.put("caster", "CA"); + ENCHANTMENT_ABBREVIATIONS.put("cayenne", "CY"); + ENCHANTMENT_ABBREVIATIONS.put("champion", "CH"); + ENCHANTMENT_ABBREVIATIONS.put("chance", "CN"); + ENCHANTMENT_ABBREVIATIONS.put("charm", "CM"); + ENCHANTMENT_ABBREVIATIONS.put("cleave", "CL"); + ENCHANTMENT_ABBREVIATIONS.put("compact", "CO"); + ENCHANTMENT_ABBREVIATIONS.put("corruption", "CP"); + ENCHANTMENT_ABBREVIATIONS.put("counter_strike", "CS"); + ENCHANTMENT_ABBREVIATIONS.put("critical", "CR"); + ENCHANTMENT_ABBREVIATIONS.put("cubism", "CU"); + + ENCHANTMENT_ABBREVIATIONS.put("cultivating", "CT"); + ENCHANTMENT_ABBREVIATIONS.put("dedication", "DD"); + ENCHANTMENT_ABBREVIATIONS.put("delicate", "DE"); + + ENCHANTMENT_ABBREVIATIONS.put("depth_strider", "DS"); + ENCHANTMENT_ABBREVIATIONS.put("divine_gift", "DG"); + ENCHANTMENT_ABBREVIATIONS.put("dragon_hunter", "DH"); + + ENCHANTMENT_ABBREVIATIONS.put("efficiency", "EF"); + ENCHANTMENT_ABBREVIATIONS.put("ender_slayer", "ES"); + ENCHANTMENT_ABBREVIATIONS.put("execute", "EX"); + ENCHANTMENT_ABBREVIATIONS.put("experience", "XP"); + ENCHANTMENT_ABBREVIATIONS.put("expertise", "EP"); + + ENCHANTMENT_ABBREVIATIONS.put("feather_falling", "FF"); + ENCHANTMENT_ABBREVIATIONS.put("ferocious_mana", "FM"); + ENCHANTMENT_ABBREVIATIONS.put("fire_aspect", "FA"); + ENCHANTMENT_ABBREVIATIONS.put("fire_protection", "FP"); + ENCHANTMENT_ABBREVIATIONS.put("first_strike", "FS"); + ENCHANTMENT_ABBREVIATIONS.put("flame", "FL"); + ENCHANTMENT_ABBREVIATIONS.put("fortune", "FO"); + ENCHANTMENT_ABBREVIATIONS.put("frail", "FR"); + ENCHANTMENT_ABBREVIATIONS.put("frost_walker", "FW"); + + ENCHANTMENT_ABBREVIATIONS.put("giant_killer", "GK"); + ENCHANTMENT_ABBREVIATIONS.put("great_spook", "GS"); + ENCHANTMENT_ABBREVIATIONS.put("green_thumb", "GT"); + ENCHANTMENT_ABBREVIATIONS.put("growth", "GR"); + + ENCHANTMENT_ABBREVIATIONS.put("hardened_mana", "HM"); + ENCHANTMENT_ABBREVIATIONS.put("harvesting", "HV"); + ENCHANTMENT_ABBREVIATIONS.put("hecatomb", "HE"); + + ENCHANTMENT_ABBREVIATIONS.put("ice_cold", "IC"); + ENCHANTMENT_ABBREVIATIONS.put("impaling", "IM"); + ENCHANTMENT_ABBREVIATIONS.put("infinite_quiver", "IQ"); + + ENCHANTMENT_ABBREVIATIONS.put("knockback", "KB"); + + ENCHANTMENT_ABBREVIATIONS.put("lapidary", "LP"); + ENCHANTMENT_ABBREVIATIONS.put("lethality", "LE"); + ENCHANTMENT_ABBREVIATIONS.put("life_steal", "LS"); + ENCHANTMENT_ABBREVIATIONS.put("looting", "LO"); + ENCHANTMENT_ABBREVIATIONS.put("luck", "LU"); + ENCHANTMENT_ABBREVIATIONS.put("luck_of_the_sea", "LA"); + ENCHANTMENT_ABBREVIATIONS.put("lure", "LR"); + + ENCHANTMENT_ABBREVIATIONS.put("magnet", "MG"); + ENCHANTMENT_ABBREVIATIONS.put("mana_steal", "MS"); + ENCHANTMENT_ABBREVIATIONS.put("mana_vampire", "MV"); + + ENCHANTMENT_ABBREVIATIONS.put("overload", "OV"); + + ENCHANTMENT_ABBREVIATIONS.put("paleontologist", "PA"); + ENCHANTMENT_ABBREVIATIONS.put("pesterminator", "PS"); + ENCHANTMENT_ABBREVIATIONS.put("piercing", "PI"); + ENCHANTMENT_ABBREVIATIONS.put("piscary", "PC"); + ENCHANTMENT_ABBREVIATIONS.put("power", "PW"); + ENCHANTMENT_ABBREVIATIONS.put("pristine", "PM"); // Prismatic + ENCHANTMENT_ABBREVIATIONS.put("projectile_protection", "PP"); + ENCHANTMENT_ABBREVIATIONS.put("prosecute", "PO"); + ENCHANTMENT_ABBREVIATIONS.put("prosperity", "PE"); + ENCHANTMENT_ABBREVIATIONS.put("protection", "PR"); + ENCHANTMENT_ABBREVIATIONS.put("punch", "PU"); + + ENCHANTMENT_ABBREVIATIONS.put("quantum", "QU"); + + ENCHANTMENT_ABBREVIATIONS.put("rainbow", "RA"); + ENCHANTMENT_ABBREVIATIONS.put("reflection", "RF"); + ENCHANTMENT_ABBREVIATIONS.put("rejuvenate", "RJ"); + ENCHANTMENT_ABBREVIATIONS.put("replenish", "RP"); + ENCHANTMENT_ABBREVIATIONS.put("respiration", "RE"); + ENCHANTMENT_ABBREVIATIONS.put("respite", "RS"); + + ENCHANTMENT_ABBREVIATIONS.put("scavenger", "SC"); + ENCHANTMENT_ABBREVIATIONS.put("sharpness", "SH"); + ENCHANTMENT_ABBREVIATIONS.put("silk_touch", "ST"); + ENCHANTMENT_ABBREVIATIONS.put("smarty_pants", "SP"); + ENCHANTMENT_ABBREVIATIONS.put("smelting_touch", "SE"); + ENCHANTMENT_ABBREVIATIONS.put("smite", "SI"); + ENCHANTMENT_ABBREVIATIONS.put("smoldering", "SL"); + ENCHANTMENT_ABBREVIATIONS.put("snipe", "SN"); + ENCHANTMENT_ABBREVIATIONS.put("spiked_hook", "SK"); + ENCHANTMENT_ABBREVIATIONS.put("strong_mana", "SM"); + ENCHANTMENT_ABBREVIATIONS.put("sugar_rush", "SR"); + ENCHANTMENT_ABBREVIATIONS.put("sunder", "SU"); + ENCHANTMENT_ABBREVIATIONS.put("syphon", "SY"); + + ENCHANTMENT_ABBREVIATIONS.put("tabasco", "TA"); + ENCHANTMENT_ABBREVIATIONS.put("thorns", "TN"); + ENCHANTMENT_ABBREVIATIONS.put("thunderbolt", "TB"); + ENCHANTMENT_ABBREVIATIONS.put("thunderlord", "TL"); + ENCHANTMENT_ABBREVIATIONS.put("titan_killer", "TK"); + ENCHANTMENT_ABBREVIATIONS.put("toxophilite", "TX"); + ENCHANTMENT_ABBREVIATIONS.put("transylvanian", "TY"); + ENCHANTMENT_ABBREVIATIONS.put("triple_strike", "TS"); + ENCHANTMENT_ABBREVIATIONS.put("true_protection", "TP"); + + // Turbo books + ENCHANTMENT_ABBREVIATIONS.put("turbo_cacti", "TI"); + ENCHANTMENT_ABBREVIATIONS.put("turbo_cane", "TC"); + ENCHANTMENT_ABBREVIATIONS.put("turbo_carrot", "TR"); + ENCHANTMENT_ABBREVIATIONS.put("turbo_coco", "TO"); + ENCHANTMENT_ABBREVIATIONS.put("turbo_melon", "TE"); + ENCHANTMENT_ABBREVIATIONS.put("turbo_mushrooms", "TM"); + ENCHANTMENT_ABBREVIATIONS.put("turbo_potato", "TT"); + ENCHANTMENT_ABBREVIATIONS.put("turbo_pumpkin", "TU"); + ENCHANTMENT_ABBREVIATIONS.put("turbo_warts", "TW"); + ENCHANTMENT_ABBREVIATIONS.put("turbo_wheat", "TH"); + + ENCHANTMENT_ABBREVIATIONS.put("vampirism", "VP"); + ENCHANTMENT_ABBREVIATIONS.put("venomous", "VE"); + ENCHANTMENT_ABBREVIATIONS.put("vicious", "VI"); + + // Ultimate enchants - Added after check since some of these are duplicated, tho due to color difference this is fine + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_bank", "B"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_bobbin_time", "BT"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_chimera", "CH"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_combo", "CO"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_reiterate", "D"); // Duplex + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_fatal_tempo", "FT"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_flash", "F"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_flowstate", "FL"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_habanero_tactics", "HT"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_inferno", "I"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_last_stand", "LS"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_legion", "L"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_no_pain_no_gain", "NP"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_one_for_all", "O"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_refrigerate", "RF"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_rend", "R"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_soul_eater", "SE"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_swarm", "SW"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("the_one", "TO"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_jerry", "UJ"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_wise", "UW"); + ULTIMATE_ENCHANTMENT_ABBREVIATIONS.put("ultimate_wisdom", "W"); + } + public EnchantmentLevelAdder() { super(CONFIG_INFORMATION); } @@ -33,17 +206,29 @@ public class EnchantmentLevelAdder extends SimpleSlotTextAdder { if (nbt.isEmpty() || !nbt.contains("enchantments", NbtElement.COMPOUND_TYPE)) return List.of(); NbtCompound enchantments = nbt.getCompound("enchantments"); if (enchantments.getSize() != 1) return List.of(); //Only makes sense to display the level when there's one enchant. - int level = enchantments.getInt(enchantments.getKeys().iterator().next()); - return SlotText.bottomLeftList(Text.literal(String.valueOf(level)).withColor(0xFFDDC1)); + final String enchantmentId = enchantments.getKeys().iterator().next(); + int level = enchantments.getInt(enchantmentId); + final SlotText enchantmentLevel = SlotText.bottomLeft(Text.literal(String.valueOf(level)).withColor(0xFFDDC1)); + + return getAbbreviation(enchantmentId) + .map(text -> List.of(SlotText.topRight(text), enchantmentLevel)) + .orElseGet(() -> List.of(enchantmentLevel)); } else { //In bazaar, the books have the enchantment level in the name int level = getEnchantLevelFromString(name); - if (level == 0) return List.of(); - return SlotText.bottomLeftList(Text.literal(String.valueOf(level)).withColor(0xFFDDC1)); + return level != 0 ? SlotText.bottomLeftList(Text.literal(String.valueOf(level)).withColor(0xFFDDC1)) : List.of(); + } + } + + private Optional<Text> getAbbreviation(String enchantmentId) { + if (ENCHANTMENT_ABBREVIATIONS.containsKey(enchantmentId)) { + return Optional.of(Text.literal(ENCHANTMENT_ABBREVIATIONS.get(enchantmentId)).withColor(Formatting.BLUE.getColorValue())); + } else if (ULTIMATE_ENCHANTMENT_ABBREVIATIONS.containsKey(enchantmentId)) { + return Optional.of(Text.literal(ULTIMATE_ENCHANTMENT_ABBREVIATIONS.get(enchantmentId)).withColor(Formatting.LIGHT_PURPLE.getColorValue())); } + return Optional.empty(); } private static int getEnchantLevelFromString(String str) { - String romanNumeral = str.substring(str.lastIndexOf(' ') + 1); //+1 because we don't need the space itself - return RomanNumerals.romanToDecimal(romanNumeral); //Temporary line. The method will be moved out later. + return RomanNumerals.romanToDecimal(str.substring(str.lastIndexOf(' ') + 1)); //+1 because we don't need the space itself } } diff --git a/src/test/java/de/hysky/skyblocker/skyblock/item/slottext/adders/EnchantmentLevelAdderTest.java b/src/test/java/de/hysky/skyblocker/skyblock/item/slottext/adders/EnchantmentLevelAdderTest.java new file mode 100644 index 00000000..90d6191f --- /dev/null +++ b/src/test/java/de/hysky/skyblocker/skyblock/item/slottext/adders/EnchantmentLevelAdderTest.java @@ -0,0 +1,28 @@ +package de.hysky.skyblocker.skyblock.item.slottext.adders; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimaps; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +public class EnchantmentLevelAdderTest { + @Test + void testEnchantmentAbbreviations() { + checkForDuplicates(EnchantmentLevelAdder.ENCHANTMENT_ABBREVIATIONS); + } + + @Test + void testUltimateEnchantmentAbbreviations() { + checkForDuplicates(EnchantmentLevelAdder.ULTIMATE_ENCHANTMENT_ABBREVIATIONS); + } + + private void checkForDuplicates(Map<String, String> abbreviations) { + if (abbreviations.size() == abbreviations.values().stream().distinct().count()) return; + abbreviations.entrySet().stream().collect(Multimaps.toMultimap(Map.Entry::getValue, Map.Entry::getKey, ArrayListMultimap::create)) + .asMap().entrySet().stream().filter(e -> e.getValue().size() > 1) + .map(e -> "Duplicate abbreviations: %s for %s".formatted(e.getKey(), e.getValue())) + .forEach(Assertions::fail); + } +} |
