package net.scapeemulator.game.model.npc.drops; import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.TreeSet; import net.scapeemulator.cache.def.NPCDefinition; public class DropTables { private static final Map<String, TableDefinition> dropTables = new HashMap<>(); private static final Map<NPCDefinition, TableDefinition> npcMap = new HashMap<>(); public static TableDefinition newTable(String name) { if (dropTables.containsKey(name)) { throw new IllegalArgumentException("Table " + name + " already exists!"); } TableDefinition newTable = new TableDefinition(name); dropTables.put(name, newTable); return newTable; } public static TableDefinition getTable(String name) { return dropTables.get(name); } public static TableDefinition getTable(NPCDefinition npc) { return npcMap.get(npc); } public static Collection<TableDefinition> getTables() { return dropTables.values(); } public static void removeTable(String name) { TableDefinition removed = dropTables.remove(name); if (removed != null) { removed.clear(); } } public static void clear() { dropTables.clear(); npcMap.clear(); } public static class TableDefinition { private String name; private DropTable table; private Set<NPCDefinition> npcs; private TableDefinition(String name) { this.name = name; table = new DropTable(); npcs = new TreeSet<>(new Comparator<NPCDefinition>() { @Override public int compare(NPCDefinition def1, NPCDefinition def2) { if (def1.getId() == def2.getId()) { return 0; } return def1.getId() > def2.getId() ? 1 : -1; } }); } public void addNPCDefinitions(Collection<NPCDefinition> defs) { for (NPCDefinition def : defs) { addNPCDefinition(def); } } public void addNPCDefinition(NPCDefinition def) { TableDefinition oldDef = npcMap.get(def); if (oldDef != null) { oldDef.removeNPCDefinition(def); } npcs.add(def); npcMap.put(def, this); } public void removeNPCDefinitions(Collection<NPCDefinition> defs) { for (NPCDefinition def : defs) { removeNPCDefinition(def); } } public void removeNPCDefinition(NPCDefinition def) { npcs.remove(def); npcMap.remove(def); } public void clear() { for (NPCDefinition def : npcs) { npcMap.remove(def); } npcs.clear(); } public NPCDefinition[] getNPCDefinitions() { return npcs.toArray(new NPCDefinition[] {}); } public DropTable getTable() { return table; } public String getName() { return name; } } }