Implement ItemDbProviders, pt 5

This commit is contained in:
md678685 2018-08-19 19:23:20 +01:00
parent 9b39509e88
commit 1029305382

View File

@ -7,13 +7,12 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionType; import org.bukkit.potion.PotionType;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
public class FlatItemDbProvider extends ItemDbProvider { public class FlatItemDbProvider extends ItemDbProvider {
private static Gson gson = new Gson(); private static Gson gson = new Gson();
private final transient Map<String, ItemData> items = new HashMap<>(); private final transient Map<String, ItemData> primaryNames = new HashMap<>();
private final transient Map<ItemData, Set<String>> aliases = new HashMap<>(); private final transient Map<String, List<String>> names = new HashMap<>();
@Override @Override
public Material resolve(String name) { public Material resolve(String name) {
@ -37,11 +36,26 @@ public class FlatItemDbProvider extends ItemDbProvider {
@Override @Override
public String getPrimaryName(ItemStack item) { public String getPrimaryName(ItemStack item) {
ItemData itemData = new ItemData(null, item.getType(), null);
for (Map.Entry<String, ItemData> entry : primaryNames.entrySet()) {
if (entry.getValue().equals(itemData)) {
return entry.getKey();
}
}
return null; return null;
} }
@Override @Override
public List<String> getNames(ItemStack item) { public List<String> getNames(ItemStack item) {
String primaryName = getPrimaryName(item);
for (Map.Entry<String, List<String>> entry : names.entrySet()) {
if (entry.getKey().equals(primaryName)) {
return Collections.unmodifiableList(entry.getValue());
}
}
return null; return null;
} }
@ -56,15 +70,11 @@ public class FlatItemDbProvider extends ItemDbProvider {
if (element.isJsonObject()) { if (element.isJsonObject()) {
ItemData data = gson.fromJson(element, ItemData.class); ItemData data = gson.fromJson(element, ItemData.class);
items.put(key, data); primaryNames.put(key, data);
addAlias(data, key);
} else { } else {
try { try {
// TODO: finalise this - how do we handle aliases loading before actual materials?
// Temporary Map<String, List<String>> that we copy over from once json parsed?
String target = element.getAsString(); String target = element.getAsString();
ItemData data = items.get(target); addAlias(target, key);
addAlias(data, target);
} catch (Exception e) { } catch (Exception e) {
// TODO: log invalid entry // TODO: log invalid entry
} }
@ -72,14 +82,14 @@ public class FlatItemDbProvider extends ItemDbProvider {
} }
} }
private void addAlias(ItemData data, String alias) { private void addAlias(String primaryName, String alias) {
Set<String> aliasList; List<String> aliasList;
if (aliases.containsKey(data)) { if (names.containsKey(primaryName)) {
aliasList = aliases.get(data); aliasList = names.get(primaryName);
} else { } else {
aliasList = new HashSet<>(); aliasList = new ArrayList<>();
aliases.put(data, aliasList); names.put(primaryName, aliasList);
} }
aliasList.add(alias); aliasList.add(alias);
@ -96,10 +106,4 @@ public class FlatItemDbProvider extends ItemDbProvider {
public String getHumanName() { public String getHumanName() {
return "Post-1.13 item database provider"; return "Post-1.13 item database provider";
} }
private class MaterialData {
private Material material;
private PotionType potionEnum;
private String potionModifier;
}
} }