Refactored cache

This commit is contained in:
Auxilor 2020-10-29 13:51:12 +00:00
parent 548a6fe01d
commit 076a4e0940
7 changed files with 258 additions and 109 deletions

View File

@ -4,7 +4,7 @@ import com.willfp.ecoenchants.command.AbstractCommand;
import com.willfp.ecoenchants.command.AbstractTabCompleter;
import com.willfp.ecoenchants.command.tabcompleters.TabCompleterEnchantinfo;
import com.willfp.ecoenchants.config.ConfigManager;
import com.willfp.ecoenchants.display.EnchantDisplay;
import com.willfp.ecoenchants.display.EnchantmentCache;
import com.willfp.ecoenchants.enchantments.EcoEnchant;
import com.willfp.ecoenchants.enchantments.EcoEnchants;
import org.apache.commons.lang.WordUtils;
@ -115,19 +115,8 @@ public final class CommandEnchantinfo extends AbstractCommand {
String maxLevel = String.valueOf(enchantment.getMaxLevel());
StringBuilder descriptionBuilder = new StringBuilder();
EnchantDisplay.CACHE.get(enchantment).getValue().forEach(s -> {
descriptionBuilder.append(s);
descriptionBuilder.append(" ");
});
String description = descriptionBuilder.toString();
description = description.replaceAll("§w", "");
description = description.replaceAll(EnchantDisplay.descriptionColor, "");
final String finalName = EnchantDisplay.CACHE.get(enchantment).getKey();
final String finalDescription = description;
final String finalName = EnchantmentCache.getEntry(enchantment).getName();
final String finalDescription = EnchantmentCache.getEntry(enchantment).getStringDescription();
final String finalTargets = allTargets;
final String finalConflicts = allConflicts;
final String finalMaxLevel = maxLevel;

View File

@ -5,12 +5,8 @@ import com.willfp.ecoenchants.EcoEnchantsPlugin;
import com.willfp.ecoenchants.config.ConfigManager;
import com.willfp.ecoenchants.enchantments.EcoEnchant;
import com.willfp.ecoenchants.enchantments.EcoEnchants;
import com.willfp.ecoenchants.enchantments.meta.EnchantmentRarity;
import com.willfp.ecoenchants.enchantments.meta.EnchantmentTarget;
import com.willfp.ecoenchants.util.Logger;
import com.willfp.ecoenchants.util.NumberUtils;
import com.willfp.ecoenchants.util.Pair;
import org.apache.commons.lang.WordUtils;
import org.bukkit.ChatColor;
import org.bukkit.NamespacedKey;
import org.bukkit.enchantments.Enchantment;
@ -20,7 +16,10 @@ import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataType;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
/**
* All methods and fields pertaining to showing players the enchantments on their items.
@ -52,28 +51,23 @@ public final class EnchantDisplay {
*/
public static final NamespacedKey KEY_V = new NamespacedKey(EcoEnchantsPlugin.getInstance(), "ecoenchantlore-v");
/**
* Cached enchantment descriptions and names
*/
public static final Map<Enchantment, Pair<String, List<String>>> CACHE = new HashMap<>();
public static final String PREFIX = "§w";
private static final String prefix = "§w";
static String normalColor;
static String curseColor;
static String specialColor;
static String artifactColor;
static String descriptionColor;
private static String normalColor;
private static String curseColor;
private static String specialColor;
private static String artifactColor;
public static String descriptionColor;
static int numbersThreshold;
static boolean useNumerals;
private static int numbersThreshold;
private static boolean useNumerals;
static int describeThreshold;
static boolean useDescribe;
private static int describeThreshold;
private static boolean useDescribe;
private static int shrinkThreshold;
private static int shrinkPerLine;
private static boolean useShrink;
static int shrinkThreshold;
static int shrinkPerLine;
static boolean useShrink;
/**
* Update config values
@ -85,60 +79,6 @@ public final class EnchantDisplay {
artifactColor = ChatColor.translateAlternateColorCodes('&', ConfigManager.getLang().getString("artifact-color"));
normalColor = ChatColor.translateAlternateColorCodes('&', ConfigManager.getLang().getString("not-curse-color"));
CACHE.clear();
Arrays.asList(Enchantment.values()).parallelStream().forEach(enchantment -> {
String name;
String color;
EcoEnchant.EnchantmentType type;
List<String> description;
if(EcoEnchants.getFromEnchantment(enchantment) != null) {
EcoEnchant ecoEnchant = EcoEnchants.getFromEnchantment(enchantment);
description = ecoEnchant.getDescription();
name = ecoEnchant.getName();
type = ecoEnchant.getType();
} else {
description = Arrays.asList(
WordUtils.wrap(
String.valueOf(ConfigManager.getLang().getString("enchantments." + enchantment.getKey().getKey().toLowerCase() + ".description")),
ConfigManager.getConfig().getInt("lore.describe.wrap"),
"\n", false
).split("\\r?\\n")
);
name = String.valueOf(ConfigManager.getLang().getString("enchantments." + enchantment.getKey().getKey().toLowerCase() + ".name"));
type = enchantment.isCursed() ? EcoEnchant.EnchantmentType.CURSE : EcoEnchant.EnchantmentType.NORMAL;
}
switch(type) {
case ARTIFACT:
color = artifactColor;
break;
case SPECIAL:
color = specialColor;
break;
case CURSE:
color = curseColor;
break;
default:
color = normalColor;
break;
}
if(EcoEnchants.getFromEnchantment(enchantment) != null) {
EnchantmentRarity rarity = EcoEnchants.getFromEnchantment(enchantment).getRarity();
if(rarity != null) {
if (rarity.hasCustomColor() && type != EcoEnchant.EnchantmentType.CURSE) {
color = rarity.getCustomColor();
}
} else {
Logger.warn("Enchantment " + enchantment.getKey().getKey() + " has an invalid rarity");
}
}
name = color + name;
description.replaceAll(line -> prefix + descriptionColor + line);
CACHE.put(enchantment, new Pair<>(name, description));
});
useNumerals = ConfigManager.getConfig().getBool("lore.use-numerals");
numbersThreshold = ConfigManager.getConfig().getInt("lore.use-numbers-above-threshold");
@ -194,7 +134,7 @@ public final class EnchantDisplay {
} catch(NullPointerException ignored) { }
meta.getPersistentDataContainer().remove(KEY);
itemLore.removeIf((s) -> s.startsWith(prefix));
itemLore.removeIf((s) -> s.startsWith(PREFIX));
if(!meta.getPersistentDataContainer().has(KEY_SKIP, PersistentDataType.INTEGER)) {
if (meta instanceof EnchantmentStorageMeta)
@ -247,15 +187,47 @@ public final class EnchantDisplay {
List<String> lore = new ArrayList<>();
Map<Enchantment, Integer> enchantments;
LinkedHashMap<Enchantment, Integer> enchantments = new LinkedHashMap<>();
List<Enchantment> forRemoval = new ArrayList<>();
if(meta instanceof EnchantmentStorageMeta) {
enchantments = ((EnchantmentStorageMeta) meta).getStoredEnchants();
enchantments.putAll(((EnchantmentStorageMeta) meta).getStoredEnchants());
} else {
enchantments = meta.getEnchants();
enchantments.putAll(meta.getEnchants());
}
List<Enchantment> unsorted = new ArrayList<>();
enchantments.forEach((enchantment, integer) -> {
unsorted.add(enchantment);
});
HashMap<Enchantment, Integer> tempEnchantments = new HashMap<>(enchantments);
unsorted.sort(((enchantment1, enchantment2) -> {
String name1;
String name2;
if(EcoEnchants.getFromEnchantment(enchantment1) != null) {
EcoEnchant ecoEnchant = EcoEnchants.getFromEnchantment(enchantment1);
name1 = ecoEnchant.getName();
} else {
name1 = String.valueOf(ConfigManager.getLang().getString("enchantments." + enchantment1.getKey().getKey().toLowerCase() + ".name"));
}
if(EcoEnchants.getFromEnchantment(enchantment2) != null) {
EcoEnchant ecoEnchant = EcoEnchants.getFromEnchantment(enchantment2);
name2 = ecoEnchant.getName();
} else {
name2 = String.valueOf(ConfigManager.getLang().getString("enchantments." + enchantment2.getKey().getKey().toLowerCase() + ".name"));
}
return name1.compareToIgnoreCase(name2);
}));
enchantments.clear();
unsorted.forEach(enchantment -> {
enchantments.put(enchantment, tempEnchantments.get(enchantment));
});
enchantments.forEach((enchantment, level) -> {
if(EcoEnchants.getFromEnchantment(enchantment) == null) return;
@ -265,18 +237,18 @@ public final class EnchantDisplay {
forRemoval.add(enchantment);
});
forRemoval.forEach(enchantments::remove);
forRemoval.forEach(enchantment -> {
enchantments.remove(enchantment);
if(meta instanceof EnchantmentStorageMeta) {
forRemoval.forEach(((EnchantmentStorageMeta) meta)::removeStoredEnchant);
((EnchantmentStorageMeta) meta).removeStoredEnchant(enchantment);
} else {
forRemoval.forEach(meta::removeEnchant);
meta.removeEnchant(enchantment);
}
});
final ItemStack finalItem = item;
enchantments.forEach((enchantment, level) -> {
if(CACHE.get(enchantment) == null) return;
String name = CACHE.get(enchantment).getKey();
String name = EnchantmentCache.getEntry(enchantment).getName();
if(!(enchantment.getMaxLevel() == 1 && level == 1)) {
if(useNumerals && finalItem.getEnchantmentLevel(enchantment) < numbersThreshold) {
@ -286,9 +258,9 @@ public final class EnchantDisplay {
}
}
lore.add(prefix + name);
lore.add(PREFIX + name);
if(enchantments.size() <= describeThreshold && useDescribe)
lore.addAll(CACHE.get(enchantment).getValue());
lore.addAll(EnchantmentCache.getEntry(enchantment).getDescription());
});
if (useShrink && (enchantments.size() > shrinkThreshold)) {

View File

@ -0,0 +1,139 @@
package com.willfp.ecoenchants.display;
import com.willfp.ecoenchants.config.ConfigManager;
import com.willfp.ecoenchants.enchantments.EcoEnchant;
import com.willfp.ecoenchants.enchantments.EcoEnchants;
import com.willfp.ecoenchants.enchantments.meta.EnchantmentRarity;
import com.willfp.ecoenchants.util.Logger;
import org.apache.commons.lang.WordUtils;
import org.bukkit.enchantments.Enchantment;
import java.util.*;
public class EnchantmentCache {
private static final Set<CacheEntry> CACHE = new HashSet<>();
static {
update();
}
public static CacheEntry getEntry(Enchantment enchantment) {
Optional<CacheEntry> matching = CACHE.stream().filter(enchant -> enchant.getEnchantment().getKey().equals(enchantment.getKey())).findFirst();
return matching.orElse(new CacheEntry(enchantment, enchantment.getKey().getKey(), enchantment.getKey().getKey(), Collections.singletonList("No Description Found")));
}
public static void update() {
CACHE.clear();
Arrays.asList(Enchantment.values()).parallelStream().forEach(enchantment -> {
String name;
String color;
EcoEnchant.EnchantmentType type;
List<String> description;
if(EcoEnchants.getFromEnchantment(enchantment) != null) {
EcoEnchant ecoEnchant = EcoEnchants.getFromEnchantment(enchantment);
description = ecoEnchant.getDescription();
name = ecoEnchant.getName();
type = ecoEnchant.getType();
} else {
description = Arrays.asList(
WordUtils.wrap(
String.valueOf(ConfigManager.getLang().getString("enchantments." + enchantment.getKey().getKey().toLowerCase() + ".description")),
ConfigManager.getConfig().getInt("lore.describe.wrap"),
"\n", false
).split("\\r?\\n")
);
name = String.valueOf(ConfigManager.getLang().getString("enchantments." + enchantment.getKey().getKey().toLowerCase() + ".name"));
type = enchantment.isCursed() ? EcoEnchant.EnchantmentType.CURSE : EcoEnchant.EnchantmentType.NORMAL;
}
switch(type) {
case ARTIFACT:
color = EnchantDisplay.artifactColor;
break;
case SPECIAL:
color = EnchantDisplay.specialColor;
break;
case CURSE:
color = EnchantDisplay.curseColor;
break;
default:
color = EnchantDisplay.normalColor;
break;
}
if(EcoEnchants.getFromEnchantment(enchantment) != null) {
EnchantmentRarity rarity = EcoEnchants.getFromEnchantment(enchantment).getRarity();
if(rarity != null) {
if (rarity.hasCustomColor() && type != EcoEnchant.EnchantmentType.CURSE) {
color = rarity.getCustomColor();
}
} else {
Logger.warn("Enchantment " + enchantment.getKey().getKey() + " has an invalid rarity");
}
}
String rawName = name;
name = color + name;
description.replaceAll(line -> EnchantDisplay.PREFIX + EnchantDisplay.descriptionColor + line);
CACHE.add(new CacheEntry(enchantment, name, rawName, description));
});
}
public static class CacheEntry {
private final Enchantment enchantment;
private String name;
private String rawName;
private List<String> description;
public CacheEntry(Enchantment enchantment, String name, String rawName, List<String> description) {
this.enchantment = enchantment;
this.name = name;
this.rawName = rawName;
this.description = description;
}
public Enchantment getEnchantment() {
return enchantment;
}
public String getName() {
return name;
}
public String getRawName() {
return rawName;
}
public List<String> getDescription() {
return description;
}
public String getStringDescription() {
StringBuilder descriptionBuilder = new StringBuilder();
EnchantmentCache.getEntry(enchantment).getDescription().forEach(s -> {
descriptionBuilder.append(s);
descriptionBuilder.append(" ");
});
String description = descriptionBuilder.toString();
description = description.replaceAll("§w", "");
description = description.replaceAll(EnchantDisplay.descriptionColor, "");
return description;
}
public void setName(String name) {
this.name = name;
}
public void setRawName(String rawName) {
this.rawName = rawName;
}
public void setDescription(List<String> description) {
this.description = description;
}
}
}

View File

@ -1,7 +1,7 @@
package com.willfp.ecoenchants.enchantments.support.merging.anvil;
import com.willfp.ecoenchants.EcoEnchantsPlugin;
import com.willfp.ecoenchants.util.Pair;
import com.willfp.ecoenchants.util.tuplets.Pair;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;

View File

@ -4,7 +4,7 @@ import com.willfp.ecoenchants.config.ConfigManager;
import com.willfp.ecoenchants.enchantments.EcoEnchant;
import com.willfp.ecoenchants.enchantments.EcoEnchants;
import com.willfp.ecoenchants.enchantments.meta.EnchantmentTarget;
import com.willfp.ecoenchants.util.Pair;
import com.willfp.ecoenchants.util.tuplets.Pair;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

View File

@ -1,4 +1,4 @@
package com.willfp.ecoenchants.util;
package com.willfp.ecoenchants.util.tuplets;
import java.util.Map;

View File

@ -0,0 +1,49 @@
package com.willfp.ecoenchants.util.tuplets;
/**
* Spigot doesn't include javafx
*/
public class Triplet<A, B, C> {
private A first;
private B second;
private C third;
public Triplet(A first, B second, C third) {
this.first = first;
this.second = second;
this.third = third;
}
public A getFirst() {
return first;
}
public B getSecond() {
return second;
}
public C getThird() {
return third;
}
public void setFirst(A first) {
this.first = first;
}
public void setSecond(B second) {
this.second = second;
}
public void setThird(C third) {
this.third = third;
}
@Override
public String toString() {
return "Triplet{" +
"first=" + first +
", second=" + second +
", third=" + third +
'}';
}
}