Use same connection for skilltree iteration and cleanups.

This commit is contained in:
MobiusDevelopment
2020-02-04 12:21:32 +00:00
parent 407ff24524
commit 4dd37dd106

View File

@@ -48,34 +48,45 @@ public class SkillTreeTable
{ {
private static final Logger LOGGER = Logger.getLogger(SkillTreeTable.class.getName()); private static final Logger LOGGER = Logger.getLogger(SkillTreeTable.class.getName());
private Map<ClassId, Map<Integer, SkillLearn>> _skillTrees; private final Map<ClassId, Map<Integer, SkillLearn>> _skillTrees = new EnumMap<>(ClassId.class);
private List<SkillLearn> _fishingSkillTrees; private final List<SkillLearn> _fishingSkillTrees = new ArrayList<>();
private List<SkillLearn> _expandDwarfCraftSkillTrees; private final List<SkillLearn> _expandDwarfCraftSkillTrees = new ArrayList<>();
private List<PledgeSkillLearn> _pledgeSkillTrees; private final List<PledgeSkillLearn> _pledgeSkillTrees = new ArrayList<>();
private List<EnchantSkillLearn> _enchantSkillTrees; private final List<EnchantSkillLearn> _enchantSkillTrees = new ArrayList<>();
private SkillTreeTable() private SkillTreeTable()
{ {
int count = 0; load();
}
public void load()
{
_skillTrees.clear();
_fishingSkillTrees.clear();
_expandDwarfCraftSkillTrees.clear();
_pledgeSkillTrees.clear();
_enchantSkillTrees.clear();
ClassId classId = null; ClassId classId = null;
ClassId parentClassId; ClassId parentClassId;
Map<Integer, SkillLearn> map;
for (PlayerTemplate playerTemplate : PlayerTemplateData.getInstance().getAllTemplates()) int count = 0;
{
try (Connection con = DatabaseFactory.getConnection()) try (Connection con = DatabaseFactory.getConnection())
{ {
map = new HashMap<>(); for (PlayerTemplate playerTemplate : PlayerTemplateData.getInstance().getAllTemplates())
{
final Map<Integer, SkillLearn> map = new HashMap<>();
classId = playerTemplate.getClassId(); classId = playerTemplate.getClassId();
parentClassId = classId.getParent(); parentClassId = classId.getParent();
final PreparedStatement statement = con.prepareStatement("SELECT class_id, skill_id, level, name, sp, min_level FROM skill_trees where class_id=? ORDER BY skill_id, level"); final PreparedStatement statement = con.prepareStatement("SELECT * FROM skill_trees where class_id=? ORDER BY skill_id, level");
statement.setInt(1, classId.getId()); statement.setInt(1, classId.getId());
final ResultSet skilltree = statement.executeQuery(); final ResultSet skilltree = statement.executeQuery();
if (parentClassId != null) if (parentClassId != null)
{ {
map.putAll(getSkillTrees().get(parentClassId)); map.putAll(_skillTrees.get(parentClassId));
count -= map.size();
} }
int prevSkillId = -1; int prevSkillId = -1;
@@ -95,12 +106,13 @@ public class SkillTreeTable
map.put(SkillTable.getSkillHashCode(id, lvl), new SkillLearn(id, lvl, minLvl, name, cost, 0, 0)); map.put(SkillTable.getSkillHashCode(id, lvl), new SkillLearn(id, lvl, minLvl, name, cost, 0, 0));
} }
getSkillTrees().put(classId, map); _skillTrees.put(classId, map);
count += map.size(); count += map.size();
skilltree.close(); skilltree.close();
statement.close(); statement.close();
} }
}
catch (Exception e) catch (Exception e)
{ {
if (classId != null) if (classId != null)
@@ -108,34 +120,25 @@ public class SkillTreeTable
LOGGER.warning("Error while creating skill tree (Class ID " + classId.getId() + "): " + e); LOGGER.warning("Error while creating skill tree (Class ID " + classId.getId() + "): " + e);
} }
} }
}
LOGGER.info("SkillTreeTable: Loaded " + count + " skills."); LOGGER.info("SkillTreeTable: Loaded " + count + " skills.");
// Skill tree for fishing skill (from Fisherman)
int count2 = 0;
int count3 = 0;
try (Connection con = DatabaseFactory.getConnection()) try (Connection con = DatabaseFactory.getConnection())
{ {
_fishingSkillTrees = new ArrayList<>(); final PreparedStatement statement = con.prepareStatement("SELECT * FROM fishing_skill_trees ORDER BY skill_id, level");
_expandDwarfCraftSkillTrees = new ArrayList<>(); final ResultSet skilltree = statement.executeQuery();
final PreparedStatement statement = con.prepareStatement("SELECT skill_id, level, name, sp, min_level, costid, cost, isfordwarf FROM fishing_skill_trees ORDER BY skill_id, level");
final ResultSet skilltree2 = statement.executeQuery();
int prevSkillId = -1; int prevSkillId = -1;
while (skilltree2.next()) while (skilltree.next())
{ {
final int id = skilltree2.getInt("skill_id"); final int id = skilltree.getInt("skill_id");
final int lvl = skilltree2.getInt("level"); final int lvl = skilltree.getInt("level");
final String name = skilltree2.getString("name"); final String name = skilltree.getString("name");
final int minLvl = skilltree2.getInt("min_level"); final int minLvl = skilltree.getInt("min_level");
final int cost = skilltree2.getInt("sp"); final int cost = skilltree.getInt("sp");
final int costId = skilltree2.getInt("costid"); final int costId = skilltree.getInt("costid");
final int costCount = skilltree2.getInt("cost"); final int costCount = skilltree.getInt("cost");
final int isDwarven = skilltree2.getInt("isfordwarf"); final int isDwarven = skilltree.getInt("isfordwarf");
if (prevSkillId != id) if (prevSkillId != id)
{ {
@@ -154,41 +157,35 @@ public class SkillTreeTable
} }
} }
skilltree2.close(); skilltree.close();
statement.close(); statement.close();
count2 = _fishingSkillTrees.size();
count3 = _expandDwarfCraftSkillTrees.size();
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("Error while creating fishing skill table " + e); LOGGER.warning("Error while creating fishing skill table " + e);
} }
int count4 = 0;
try (Connection con = DatabaseFactory.getConnection()) try (Connection con = DatabaseFactory.getConnection())
{ {
_enchantSkillTrees = new ArrayList<>(); final PreparedStatement statement = con.prepareStatement("SELECT * FROM enchant_skill_trees ORDER BY skill_id, level");
final ResultSet skilltree = statement.executeQuery();
final PreparedStatement statement = con.prepareStatement("SELECT skill_id, level, name, base_lvl, sp, min_skill_lvl, exp, success_rate76, success_rate77, success_rate78,success_rate79,success_rate80 FROM enchant_skill_trees ORDER BY skill_id, level");
final ResultSet skilltree3 = statement.executeQuery();
int prevSkillId = -1; int prevSkillId = -1;
while (skilltree3.next()) while (skilltree.next())
{ {
final int id = skilltree3.getInt("skill_id"); final int id = skilltree.getInt("skill_id");
final int lvl = skilltree3.getInt("level"); final int lvl = skilltree.getInt("level");
final String name = skilltree3.getString("name"); final String name = skilltree.getString("name");
final int baseLvl = skilltree3.getInt("base_lvl"); final int baseLvl = skilltree.getInt("base_lvl");
final int minSkillLvl = skilltree3.getInt("min_skill_lvl"); final int minSkillLvl = skilltree.getInt("min_skill_lvl");
final int sp = skilltree3.getInt("sp"); final int sp = skilltree.getInt("sp");
final int exp = skilltree3.getInt("exp"); final int exp = skilltree.getInt("exp");
final byte rate76 = skilltree3.getByte("success_rate76"); final byte rate76 = skilltree.getByte("success_rate76");
final byte rate77 = skilltree3.getByte("success_rate77"); final byte rate77 = skilltree.getByte("success_rate77");
final byte rate78 = skilltree3.getByte("success_rate78"); final byte rate78 = skilltree.getByte("success_rate78");
final byte rate79 = skilltree3.getByte("success_rate79"); final byte rate79 = skilltree.getByte("success_rate79");
final byte rate80 = skilltree3.getByte("success_rate80"); final byte rate80 = skilltree.getByte("success_rate80");
if (prevSkillId != id) if (prevSkillId != id)
{ {
@@ -198,34 +195,29 @@ public class SkillTreeTable
_enchantSkillTrees.add(new EnchantSkillLearn(id, lvl, minSkillLvl, baseLvl, name, sp, exp, rate76, rate77, rate78, rate79, rate80)); _enchantSkillTrees.add(new EnchantSkillLearn(id, lvl, minSkillLvl, baseLvl, name, sp, exp, rate76, rate77, rate78, rate79, rate80));
} }
skilltree3.close(); skilltree.close();
statement.close(); statement.close();
count4 = _enchantSkillTrees.size();
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("Error while creating enchant skill table " + e); LOGGER.warning("Error while creating enchant skill table " + e);
} }
int count5 = 0;
try (Connection con = DatabaseFactory.getConnection()) try (Connection con = DatabaseFactory.getConnection())
{ {
_pledgeSkillTrees = new ArrayList<>(); final PreparedStatement statement = con.prepareStatement("SELECT * FROM pledge_skill_trees ORDER BY skill_id, level");
final ResultSet skilltree = statement.executeQuery();
final PreparedStatement statement = con.prepareStatement("SELECT skill_id, level, name, clan_lvl, repCost, itemId FROM pledge_skill_trees ORDER BY skill_id, level");
final ResultSet skilltree4 = statement.executeQuery();
int prevSkillId = -1; int prevSkillId = -1;
while (skilltree4.next()) while (skilltree.next())
{ {
final int id = skilltree4.getInt("skill_id"); final int id = skilltree.getInt("skill_id");
final int lvl = skilltree4.getInt("level"); final int lvl = skilltree.getInt("level");
final String name = skilltree4.getString("name"); final String name = skilltree.getString("name");
final int baseLvl = skilltree4.getInt("clan_lvl"); final int baseLvl = skilltree.getInt("clan_lvl");
final int sp = skilltree4.getInt("repCost"); final int sp = skilltree.getInt("repCost");
final int itemId = skilltree4.getInt("itemId"); final int itemId = skilltree.getInt("itemId");
if (prevSkillId != id) if (prevSkillId != id)
{ {
@@ -235,20 +227,18 @@ public class SkillTreeTable
_pledgeSkillTrees.add(new PledgeSkillLearn(id, lvl, baseLvl, name, sp, itemId)); _pledgeSkillTrees.add(new PledgeSkillLearn(id, lvl, baseLvl, name, sp, itemId));
} }
skilltree4.close(); skilltree.close();
statement.close(); statement.close();
count5 = _pledgeSkillTrees.size();
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("Error while creating fishing skill table " + e); LOGGER.warning("Error while creating fishing skill table " + e);
} }
LOGGER.info("FishingSkillTreeTable: Loaded " + count2 + " general skills."); LOGGER.info("FishingSkillTreeTable: Loaded " + _fishingSkillTrees.size() + " general skills.");
LOGGER.info("FishingSkillTreeTable: Loaded " + count3 + " dwarven skills."); LOGGER.info("FishingSkillTreeTable: Loaded " + _expandDwarfCraftSkillTrees.size() + " dwarven skills.");
LOGGER.info("EnchantSkillTreeTable: Loaded " + count4 + " enchant skills."); LOGGER.info("EnchantSkillTreeTable: Loaded " + _enchantSkillTrees.size() + " enchant skills.");
LOGGER.info("PledgeSkillTreeTable: Loaded " + count5 + " pledge skills."); LOGGER.info("PledgeSkillTreeTable: Loaded " + _pledgeSkillTrees.size() + " pledge skills.");
} }
/** /**
@@ -265,7 +255,7 @@ public class SkillTreeTable
} }
// since expertise comes at same level for all classes we use paladin for now // since expertise comes at same level for all classes we use paladin for now
final Map<Integer, SkillLearn> learnMap = getSkillTrees().get(ClassId.PALADIN); final Map<Integer, SkillLearn> learnMap = _skillTrees.get(ClassId.PALADIN);
final int skillHashCode = SkillTable.getSkillHashCode(239, grade); final int skillHashCode = SkillTable.getSkillHashCode(239, grade);
@@ -286,7 +276,7 @@ public class SkillTreeTable
*/ */
public int getMinSkillLevel(int skillId, ClassId classId, int skillLvl) public int getMinSkillLevel(int skillId, ClassId classId, int skillLvl)
{ {
final Map<Integer, SkillLearn> map = getSkillTrees().get(classId); final Map<Integer, SkillLearn> map = _skillTrees.get(classId);
final int skillHashCode = SkillTable.getSkillHashCode(skillId, skillLvl); final int skillHashCode = SkillTable.getSkillHashCode(skillId, skillLvl);
@@ -303,7 +293,7 @@ public class SkillTreeTable
final int skillHashCode = SkillTable.getSkillHashCode(skillId, skillLvl); final int skillHashCode = SkillTable.getSkillHashCode(skillId, skillLvl);
// Look on all classes for this skill (takes the first one found) // Look on all classes for this skill (takes the first one found)
for (Map<Integer, SkillLearn> map : getSkillTrees().values()) for (Map<Integer, SkillLearn> map : _skillTrees.values())
{ {
// checks if the current class has this skill // checks if the current class has this skill
if (map.containsKey(skillHashCode)) if (map.containsKey(skillHashCode))
@@ -315,15 +305,6 @@ public class SkillTreeTable
return 0; return 0;
} }
private Map<ClassId, Map<Integer, SkillLearn>> getSkillTrees()
{
if (_skillTrees == null)
{
_skillTrees = new EnumMap<>(ClassId.class);
}
return _skillTrees;
}
public SkillLearn[] getAvailableSkills(PlayerInstance player, ClassId classId) public SkillLearn[] getAvailableSkills(PlayerInstance player, ClassId classId)
{ {
final List<SkillLearn> result = getAvailableSkills(player, classId, player); final List<SkillLearn> result = getAvailableSkills(player, classId, player);
@@ -340,7 +321,7 @@ public class SkillTreeTable
private List<SkillLearn> getAvailableSkills(PlayerInstance player, ClassId classId, ISkillsHolder holder) private List<SkillLearn> getAvailableSkills(PlayerInstance player, ClassId classId, ISkillsHolder holder)
{ {
final List<SkillLearn> result = new ArrayList<>(); final List<SkillLearn> result = new ArrayList<>();
final Collection<SkillLearn> skills = getSkillTrees().get(classId).values(); final Collection<SkillLearn> skills = _skillTrees.get(classId).values();
if (skills.isEmpty()) if (skills.isEmpty())
{ {
@@ -503,13 +484,13 @@ public class SkillTreeTable
*/ */
public Collection<SkillLearn> getAllowedSkills(ClassId classId) public Collection<SkillLearn> getAllowedSkills(ClassId classId)
{ {
return getSkillTrees().get(classId).values(); return _skillTrees.get(classId).values();
} }
public int getMinLevelForNewSkill(PlayerInstance player, ClassId classId) public int getMinLevelForNewSkill(PlayerInstance player, ClassId classId)
{ {
int minLevel = 0; int minLevel = 0;
final Collection<SkillLearn> skills = getSkillTrees().get(classId).values(); final Collection<SkillLearn> skills = _skillTrees.get(classId).values();
for (SkillLearn temp : skills) for (SkillLearn temp : skills)
{ {
@@ -551,9 +532,9 @@ public class SkillTreeTable
final ClassId classId = player.getSkillLearningClassId(); final ClassId classId = player.getSkillLearningClassId();
final int skillHashCode = SkillTable.getSkillHashCode(skill); final int skillHashCode = SkillTable.getSkillHashCode(skill);
if (getSkillTrees().get(classId).containsKey(skillHashCode)) if (_skillTrees.get(classId).containsKey(skillHashCode))
{ {
final SkillLearn skillLearn = getSkillTrees().get(classId).get(skillHashCode); final SkillLearn skillLearn = _skillTrees.get(classId).get(skillHashCode);
if (skillLearn.getMinLevel() <= player.getLevel()) if (skillLearn.getMinLevel() <= player.getLevel())
{ {
skillCost = skillLearn.getSpCost(); skillCost = skillLearn.getSpCost();