Support generating automatically missing player stats.

This commit is contained in:
MobiusDev 2019-03-01 06:27:49 +00:00
parent b611ebca75
commit c1767487e8
11 changed files with 308 additions and 44 deletions

View File

@ -45,6 +45,7 @@ public final class PlayerTemplateData implements IGameXmlReader
private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>(); private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>();
private int _dataCount = 0; private int _dataCount = 0;
private int _autoGeneratedCount = 0;
protected PlayerTemplateData() protected PlayerTemplateData()
{ {
@ -58,6 +59,10 @@ public final class PlayerTemplateData implements IGameXmlReader
parseDatapackDirectory("data/stats/chars/baseStats", false); parseDatapackDirectory("data/stats/chars/baseStats", false);
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates.");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records.");
if (_autoGeneratedCount > 0)
{
LOGGER.info(getClass().getSimpleName() + ": Generated " + _autoGeneratedCount + " level up gain records.");
}
} }
@Override @Override
@ -146,17 +151,16 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName())) else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName()))
{ {
int level = 0;
for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling()) for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling())
{ {
if ("level".equalsIgnoreCase(lvlNode.getNodeName())) if ("level".equalsIgnoreCase(lvlNode.getNodeName()))
{ {
attrs = lvlNode.getAttributes(); attrs = lvlNode.getAttributes();
final int level = parseInteger(attrs, "val"); level = parseInteger(attrs, "val");
for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling()) for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling())
{ {
final String nodeName = valNode.getNodeName(); final String nodeName = valNode.getNodeName();
if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId))) if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId)))
{ {
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent())); _playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent()));
@ -165,7 +169,27 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
} }
} }
// TODO: Generate stats automatically. // Generate missing stats automatically.
while (level < (Config.PLAYER_MAXIMUM_LEVEL - 1))
{
level++;
_autoGeneratedCount++;
final double hpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hp", level, (((((hpM1 * level) / (level - 1)) + ((hpM1 * (level + 1)) / (level - 1))) / 2) + 1.45));
final double mpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mp", level, (((((mpM1 * level) / (level - 1)) + ((mpM1 * (level + 1)) / (level - 1))) / 2) + 1.6));
final double cpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cp", level, (((((cpM1 * level) / (level - 1)) + ((cpM1 * (level + 1)) / (level - 1))) / 2) + 0.8));
final double hpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 1);
final double hpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hpRegen", level, (hpRegM1 * 2) - hpRegM2);
final double mpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 1);
final double mpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mpRegen", level, (mpRegM1 * 2) - mpRegM2);
final double cpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 1);
final double cpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cpRegen", level, (cpRegM1 * 2) - cpRegM2);
}
} }
} }
} }

View File

@ -45,6 +45,7 @@ public final class PlayerTemplateData implements IGameXmlReader
private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>(); private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>();
private int _dataCount = 0; private int _dataCount = 0;
private int _autoGeneratedCount = 0;
protected PlayerTemplateData() protected PlayerTemplateData()
{ {
@ -58,6 +59,10 @@ public final class PlayerTemplateData implements IGameXmlReader
parseDatapackDirectory("data/stats/chars/baseStats", false); parseDatapackDirectory("data/stats/chars/baseStats", false);
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates.");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records.");
if (_autoGeneratedCount > 0)
{
LOGGER.info(getClass().getSimpleName() + ": Generated " + _autoGeneratedCount + " level up gain records.");
}
} }
@Override @Override
@ -146,17 +151,16 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName())) else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName()))
{ {
int level = 0;
for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling()) for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling())
{ {
if ("level".equalsIgnoreCase(lvlNode.getNodeName())) if ("level".equalsIgnoreCase(lvlNode.getNodeName()))
{ {
attrs = lvlNode.getAttributes(); attrs = lvlNode.getAttributes();
final int level = parseInteger(attrs, "val"); level = parseInteger(attrs, "val");
for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling()) for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling())
{ {
final String nodeName = valNode.getNodeName(); final String nodeName = valNode.getNodeName();
if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId))) if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId)))
{ {
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent())); _playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent()));
@ -165,7 +169,27 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
} }
} }
// TODO: Generate stats automatically. // Generate missing stats automatically.
while (level < (Config.PLAYER_MAXIMUM_LEVEL - 1))
{
level++;
_autoGeneratedCount++;
final double hpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hp", level, (((((hpM1 * level) / (level - 1)) + ((hpM1 * (level + 1)) / (level - 1))) / 2) + 1.45));
final double mpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mp", level, (((((mpM1 * level) / (level - 1)) + ((mpM1 * (level + 1)) / (level - 1))) / 2) + 1.6));
final double cpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cp", level, (((((cpM1 * level) / (level - 1)) + ((cpM1 * (level + 1)) / (level - 1))) / 2) + 0.8));
final double hpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 1);
final double hpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hpRegen", level, (hpRegM1 * 2) - hpRegM2);
final double mpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 1);
final double mpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mpRegen", level, (mpRegM1 * 2) - mpRegM2);
final double cpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 1);
final double cpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cpRegen", level, (cpRegM1 * 2) - cpRegM2);
}
} }
} }
} }

View File

@ -45,6 +45,7 @@ public final class PlayerTemplateData implements IGameXmlReader
private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>(); private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>();
private int _dataCount = 0; private int _dataCount = 0;
private int _autoGeneratedCount = 0;
protected PlayerTemplateData() protected PlayerTemplateData()
{ {
@ -58,6 +59,10 @@ public final class PlayerTemplateData implements IGameXmlReader
parseDatapackDirectory("data/stats/chars/baseStats", false); parseDatapackDirectory("data/stats/chars/baseStats", false);
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates.");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records.");
if (_autoGeneratedCount > 0)
{
LOGGER.info(getClass().getSimpleName() + ": Generated " + _autoGeneratedCount + " level up gain records.");
}
} }
@Override @Override
@ -146,17 +151,16 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName())) else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName()))
{ {
int level = 0;
for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling()) for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling())
{ {
if ("level".equalsIgnoreCase(lvlNode.getNodeName())) if ("level".equalsIgnoreCase(lvlNode.getNodeName()))
{ {
attrs = lvlNode.getAttributes(); attrs = lvlNode.getAttributes();
final int level = parseInteger(attrs, "val"); level = parseInteger(attrs, "val");
for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling()) for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling())
{ {
final String nodeName = valNode.getNodeName(); final String nodeName = valNode.getNodeName();
if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId))) if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId)))
{ {
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent())); _playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent()));
@ -165,7 +169,27 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
} }
} }
// TODO: Generate stats automatically. // Generate missing stats automatically.
while (level < (Config.PLAYER_MAXIMUM_LEVEL - 1))
{
level++;
_autoGeneratedCount++;
final double hpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hp", level, (((((hpM1 * level) / (level - 1)) + ((hpM1 * (level + 1)) / (level - 1))) / 2) + 1.45));
final double mpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mp", level, (((((mpM1 * level) / (level - 1)) + ((mpM1 * (level + 1)) / (level - 1))) / 2) + 1.6));
final double cpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cp", level, (((((cpM1 * level) / (level - 1)) + ((cpM1 * (level + 1)) / (level - 1))) / 2) + 0.8));
final double hpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 1);
final double hpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hpRegen", level, (hpRegM1 * 2) - hpRegM2);
final double mpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 1);
final double mpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mpRegen", level, (mpRegM1 * 2) - mpRegM2);
final double cpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 1);
final double cpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cpRegen", level, (cpRegM1 * 2) - cpRegM2);
}
} }
} }
} }

View File

@ -45,6 +45,7 @@ public final class PlayerTemplateData implements IGameXmlReader
private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>(); private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>();
private int _dataCount = 0; private int _dataCount = 0;
private int _autoGeneratedCount = 0;
protected PlayerTemplateData() protected PlayerTemplateData()
{ {
@ -58,6 +59,10 @@ public final class PlayerTemplateData implements IGameXmlReader
parseDatapackDirectory("data/stats/chars/baseStats", false); parseDatapackDirectory("data/stats/chars/baseStats", false);
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates.");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records.");
if (_autoGeneratedCount > 0)
{
LOGGER.info(getClass().getSimpleName() + ": Generated " + _autoGeneratedCount + " level up gain records.");
}
} }
@Override @Override
@ -146,17 +151,16 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName())) else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName()))
{ {
int level = 0;
for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling()) for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling())
{ {
if ("level".equalsIgnoreCase(lvlNode.getNodeName())) if ("level".equalsIgnoreCase(lvlNode.getNodeName()))
{ {
attrs = lvlNode.getAttributes(); attrs = lvlNode.getAttributes();
final int level = parseInteger(attrs, "val"); level = parseInteger(attrs, "val");
for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling()) for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling())
{ {
final String nodeName = valNode.getNodeName(); final String nodeName = valNode.getNodeName();
if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId))) if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId)))
{ {
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent())); _playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent()));
@ -165,7 +169,27 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
} }
} }
// TODO: Generate stats automatically. // Generate missing stats automatically.
while (level < (Config.PLAYER_MAXIMUM_LEVEL - 1))
{
level++;
_autoGeneratedCount++;
final double hpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hp", level, (((((hpM1 * level) / (level - 1)) + ((hpM1 * (level + 1)) / (level - 1))) / 2) + 1.45));
final double mpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mp", level, (((((mpM1 * level) / (level - 1)) + ((mpM1 * (level + 1)) / (level - 1))) / 2) + 1.6));
final double cpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cp", level, (((((cpM1 * level) / (level - 1)) + ((cpM1 * (level + 1)) / (level - 1))) / 2) + 0.8));
final double hpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 1);
final double hpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hpRegen", level, (hpRegM1 * 2) - hpRegM2);
final double mpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 1);
final double mpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mpRegen", level, (mpRegM1 * 2) - mpRegM2);
final double cpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 1);
final double cpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cpRegen", level, (cpRegM1 * 2) - cpRegM2);
}
} }
} }
} }

View File

@ -45,6 +45,7 @@ public final class PlayerTemplateData implements IGameXmlReader
private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>(); private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>();
private int _dataCount = 0; private int _dataCount = 0;
private int _autoGeneratedCount = 0;
protected PlayerTemplateData() protected PlayerTemplateData()
{ {
@ -58,6 +59,10 @@ public final class PlayerTemplateData implements IGameXmlReader
parseDatapackDirectory("data/stats/chars/baseStats", false); parseDatapackDirectory("data/stats/chars/baseStats", false);
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates.");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records.");
if (_autoGeneratedCount > 0)
{
LOGGER.info(getClass().getSimpleName() + ": Generated " + _autoGeneratedCount + " level up gain records.");
}
} }
@Override @Override
@ -146,17 +151,16 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName())) else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName()))
{ {
int level = 0;
for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling()) for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling())
{ {
if ("level".equalsIgnoreCase(lvlNode.getNodeName())) if ("level".equalsIgnoreCase(lvlNode.getNodeName()))
{ {
attrs = lvlNode.getAttributes(); attrs = lvlNode.getAttributes();
final int level = parseInteger(attrs, "val"); level = parseInteger(attrs, "val");
for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling()) for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling())
{ {
final String nodeName = valNode.getNodeName(); final String nodeName = valNode.getNodeName();
if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId))) if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId)))
{ {
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent())); _playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent()));
@ -165,7 +169,27 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
} }
} }
// TODO: Generate stats automatically. // Generate missing stats automatically.
while (level < (Config.PLAYER_MAXIMUM_LEVEL - 1))
{
level++;
_autoGeneratedCount++;
final double hpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hp", level, (((((hpM1 * level) / (level - 1)) + ((hpM1 * (level + 1)) / (level - 1))) / 2) + 1.45));
final double mpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mp", level, (((((mpM1 * level) / (level - 1)) + ((mpM1 * (level + 1)) / (level - 1))) / 2) + 1.6));
final double cpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cp", level, (((((cpM1 * level) / (level - 1)) + ((cpM1 * (level + 1)) / (level - 1))) / 2) + 0.8));
final double hpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 1);
final double hpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hpRegen", level, (hpRegM1 * 2) - hpRegM2);
final double mpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 1);
final double mpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mpRegen", level, (mpRegM1 * 2) - mpRegM2);
final double cpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 1);
final double cpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cpRegen", level, (cpRegM1 * 2) - cpRegM2);
}
} }
} }
} }

View File

@ -45,6 +45,7 @@ public final class PlayerTemplateData implements IGameXmlReader
private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>(); private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>();
private int _dataCount = 0; private int _dataCount = 0;
private int _autoGeneratedCount = 0;
protected PlayerTemplateData() protected PlayerTemplateData()
{ {
@ -58,6 +59,10 @@ public final class PlayerTemplateData implements IGameXmlReader
parseDatapackDirectory("data/stats/chars/baseStats", false); parseDatapackDirectory("data/stats/chars/baseStats", false);
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates.");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records.");
if (_autoGeneratedCount > 0)
{
LOGGER.info(getClass().getSimpleName() + ": Generated " + _autoGeneratedCount + " level up gain records.");
}
} }
@Override @Override
@ -146,17 +151,16 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName())) else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName()))
{ {
int level = 0;
for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling()) for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling())
{ {
if ("level".equalsIgnoreCase(lvlNode.getNodeName())) if ("level".equalsIgnoreCase(lvlNode.getNodeName()))
{ {
attrs = lvlNode.getAttributes(); attrs = lvlNode.getAttributes();
final int level = parseInteger(attrs, "val"); level = parseInteger(attrs, "val");
for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling()) for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling())
{ {
final String nodeName = valNode.getNodeName(); final String nodeName = valNode.getNodeName();
if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId))) if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId)))
{ {
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent())); _playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent()));
@ -165,7 +169,27 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
} }
} }
// TODO: Generate stats automatically. // Generate missing stats automatically.
while (level < (Config.PLAYER_MAXIMUM_LEVEL - 1))
{
level++;
_autoGeneratedCount++;
final double hpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hp", level, (((((hpM1 * level) / (level - 1)) + ((hpM1 * (level + 1)) / (level - 1))) / 2) + 1.45));
final double mpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mp", level, (((((mpM1 * level) / (level - 1)) + ((mpM1 * (level + 1)) / (level - 1))) / 2) + 1.6));
final double cpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cp", level, (((((cpM1 * level) / (level - 1)) + ((cpM1 * (level + 1)) / (level - 1))) / 2) + 0.8));
final double hpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 1);
final double hpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hpRegen", level, (hpRegM1 * 2) - hpRegM2);
final double mpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 1);
final double mpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mpRegen", level, (mpRegM1 * 2) - mpRegM2);
final double cpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 1);
final double cpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cpRegen", level, (cpRegM1 * 2) - cpRegM2);
}
} }
} }
} }

View File

@ -45,6 +45,7 @@ public final class PlayerTemplateData implements IGameXmlReader
private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>(); private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>();
private int _dataCount = 0; private int _dataCount = 0;
private int _autoGeneratedCount = 0;
protected PlayerTemplateData() protected PlayerTemplateData()
{ {
@ -58,6 +59,10 @@ public final class PlayerTemplateData implements IGameXmlReader
parseDatapackDirectory("data/stats/chars/baseStats", false); parseDatapackDirectory("data/stats/chars/baseStats", false);
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates.");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records.");
if (_autoGeneratedCount > 0)
{
LOGGER.info(getClass().getSimpleName() + ": Generated " + _autoGeneratedCount + " level up gain records.");
}
} }
@Override @Override
@ -146,17 +151,16 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName())) else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName()))
{ {
int level = 0;
for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling()) for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling())
{ {
if ("level".equalsIgnoreCase(lvlNode.getNodeName())) if ("level".equalsIgnoreCase(lvlNode.getNodeName()))
{ {
attrs = lvlNode.getAttributes(); attrs = lvlNode.getAttributes();
final int level = parseInteger(attrs, "val"); level = parseInteger(attrs, "val");
for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling()) for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling())
{ {
final String nodeName = valNode.getNodeName(); final String nodeName = valNode.getNodeName();
if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId))) if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId)))
{ {
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent())); _playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent()));
@ -165,7 +169,27 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
} }
} }
// TODO: Generate stats automatically. // Generate missing stats automatically.
while (level < (Config.PLAYER_MAXIMUM_LEVEL - 1))
{
level++;
_autoGeneratedCount++;
final double hpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hp", level, (((((hpM1 * level) / (level - 1)) + ((hpM1 * (level + 1)) / (level - 1))) / 2) + 1.45));
final double mpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mp", level, (((((mpM1 * level) / (level - 1)) + ((mpM1 * (level + 1)) / (level - 1))) / 2) + 1.6));
final double cpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cp", level, (((((cpM1 * level) / (level - 1)) + ((cpM1 * (level + 1)) / (level - 1))) / 2) + 0.8));
final double hpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 1);
final double hpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hpRegen", level, (hpRegM1 * 2) - hpRegM2);
final double mpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 1);
final double mpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mpRegen", level, (mpRegM1 * 2) - mpRegM2);
final double cpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 1);
final double cpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cpRegen", level, (cpRegM1 * 2) - cpRegM2);
}
} }
} }
} }

View File

@ -45,6 +45,7 @@ public final class PlayerTemplateData implements IGameXmlReader
private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>(); private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>();
private int _dataCount = 0; private int _dataCount = 0;
private int _autoGeneratedCount = 0;
protected PlayerTemplateData() protected PlayerTemplateData()
{ {
@ -58,6 +59,10 @@ public final class PlayerTemplateData implements IGameXmlReader
parseDatapackDirectory("data/stats/chars/baseStats", false); parseDatapackDirectory("data/stats/chars/baseStats", false);
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates.");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records.");
if (_autoGeneratedCount > 0)
{
LOGGER.info(getClass().getSimpleName() + ": Generated " + _autoGeneratedCount + " level up gain records.");
}
} }
@Override @Override
@ -146,17 +151,16 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName())) else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName()))
{ {
int level = 0;
for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling()) for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling())
{ {
if ("level".equalsIgnoreCase(lvlNode.getNodeName())) if ("level".equalsIgnoreCase(lvlNode.getNodeName()))
{ {
attrs = lvlNode.getAttributes(); attrs = lvlNode.getAttributes();
final int level = parseInteger(attrs, "val"); level = parseInteger(attrs, "val");
for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling()) for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling())
{ {
final String nodeName = valNode.getNodeName(); final String nodeName = valNode.getNodeName();
if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId))) if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId)))
{ {
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent())); _playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent()));
@ -165,7 +169,27 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
} }
} }
// TODO: Generate stats automatically. // Generate missing stats automatically.
while (level < (Config.PLAYER_MAXIMUM_LEVEL - 1))
{
level++;
_autoGeneratedCount++;
final double hpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hp", level, (((((hpM1 * level) / (level - 1)) + ((hpM1 * (level + 1)) / (level - 1))) / 2) + 1.45));
final double mpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mp", level, (((((mpM1 * level) / (level - 1)) + ((mpM1 * (level + 1)) / (level - 1))) / 2) + 1.6));
final double cpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cp", level, (((((cpM1 * level) / (level - 1)) + ((cpM1 * (level + 1)) / (level - 1))) / 2) + 0.8));
final double hpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 1);
final double hpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hpRegen", level, (hpRegM1 * 2) - hpRegM2);
final double mpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 1);
final double mpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mpRegen", level, (mpRegM1 * 2) - mpRegM2);
final double cpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 1);
final double cpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cpRegen", level, (cpRegM1 * 2) - cpRegM2);
}
} }
} }
} }

View File

@ -45,6 +45,7 @@ public final class PlayerTemplateData implements IGameXmlReader
private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>(); private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>();
private int _dataCount = 0; private int _dataCount = 0;
private int _autoGeneratedCount = 0;
protected PlayerTemplateData() protected PlayerTemplateData()
{ {
@ -58,6 +59,10 @@ public final class PlayerTemplateData implements IGameXmlReader
parseDatapackDirectory("data/stats/chars/baseStats", false); parseDatapackDirectory("data/stats/chars/baseStats", false);
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates.");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records.");
if (_autoGeneratedCount > 0)
{
LOGGER.info(getClass().getSimpleName() + ": Generated " + _autoGeneratedCount + " level up gain records.");
}
} }
@Override @Override
@ -146,17 +151,16 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName())) else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName()))
{ {
int level = 0;
for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling()) for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling())
{ {
if ("level".equalsIgnoreCase(lvlNode.getNodeName())) if ("level".equalsIgnoreCase(lvlNode.getNodeName()))
{ {
attrs = lvlNode.getAttributes(); attrs = lvlNode.getAttributes();
final int level = parseInteger(attrs, "val"); level = parseInteger(attrs, "val");
for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling()) for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling())
{ {
final String nodeName = valNode.getNodeName(); final String nodeName = valNode.getNodeName();
if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId))) if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId)))
{ {
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent())); _playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent()));
@ -165,7 +169,27 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
} }
} }
// TODO: Generate stats automatically. // Generate missing stats automatically.
while (level < (Config.PLAYER_MAXIMUM_LEVEL - 1))
{
level++;
_autoGeneratedCount++;
final double hpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hp", level, (((((hpM1 * level) / (level - 1)) + ((hpM1 * (level + 1)) / (level - 1))) / 2) + 1.45));
final double mpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mp", level, (((((mpM1 * level) / (level - 1)) + ((mpM1 * (level + 1)) / (level - 1))) / 2) + 1.6));
final double cpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cp", level, (((((cpM1 * level) / (level - 1)) + ((cpM1 * (level + 1)) / (level - 1))) / 2) + 0.8));
final double hpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 1);
final double hpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hpRegen", level, (hpRegM1 * 2) - hpRegM2);
final double mpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 1);
final double mpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mpRegen", level, (mpRegM1 * 2) - mpRegM2);
final double cpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 1);
final double cpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cpRegen", level, (cpRegM1 * 2) - cpRegM2);
}
} }
} }
} }

View File

@ -45,6 +45,7 @@ public final class PlayerTemplateData implements IGameXmlReader
private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>(); private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>();
private int _dataCount = 0; private int _dataCount = 0;
private int _autoGeneratedCount = 0;
protected PlayerTemplateData() protected PlayerTemplateData()
{ {
@ -58,6 +59,10 @@ public final class PlayerTemplateData implements IGameXmlReader
parseDatapackDirectory("data/stats/chars/baseStats", false); parseDatapackDirectory("data/stats/chars/baseStats", false);
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates.");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records.");
if (_autoGeneratedCount > 0)
{
LOGGER.info(getClass().getSimpleName() + ": Generated " + _autoGeneratedCount + " level up gain records.");
}
} }
@Override @Override
@ -146,17 +151,16 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName())) else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName()))
{ {
int level = 0;
for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling()) for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling())
{ {
if ("level".equalsIgnoreCase(lvlNode.getNodeName())) if ("level".equalsIgnoreCase(lvlNode.getNodeName()))
{ {
attrs = lvlNode.getAttributes(); attrs = lvlNode.getAttributes();
final int level = parseInteger(attrs, "val"); level = parseInteger(attrs, "val");
for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling()) for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling())
{ {
final String nodeName = valNode.getNodeName(); final String nodeName = valNode.getNodeName();
if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId))) if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId)))
{ {
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent())); _playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent()));
@ -165,7 +169,27 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
} }
} }
// TODO: Generate stats automatically. // Generate missing stats automatically.
while (level < (Config.PLAYER_MAXIMUM_LEVEL - 1))
{
level++;
_autoGeneratedCount++;
final double hpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hp", level, (((((hpM1 * level) / (level - 1)) + ((hpM1 * (level + 1)) / (level - 1))) / 2) + 1.45));
final double mpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mp", level, (((((mpM1 * level) / (level - 1)) + ((mpM1 * (level + 1)) / (level - 1))) / 2) + 1.6));
final double cpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cp", level, (((((cpM1 * level) / (level - 1)) + ((cpM1 * (level + 1)) / (level - 1))) / 2) + 0.8));
final double hpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 1);
final double hpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hpRegen", level, (hpRegM1 * 2) - hpRegM2);
final double mpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 1);
final double mpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mpRegen", level, (mpRegM1 * 2) - mpRegM2);
final double cpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 1);
final double cpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cpRegen", level, (cpRegM1 * 2) - cpRegM2);
}
} }
} }
} }

View File

@ -45,6 +45,7 @@ public final class PlayerTemplateData implements IGameXmlReader
private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>(); private final Map<ClassId, L2PcTemplate> _playerTemplates = new HashMap<>();
private int _dataCount = 0; private int _dataCount = 0;
private int _autoGeneratedCount = 0;
protected PlayerTemplateData() protected PlayerTemplateData()
{ {
@ -58,6 +59,10 @@ public final class PlayerTemplateData implements IGameXmlReader
parseDatapackDirectory("data/stats/chars/baseStats", false); parseDatapackDirectory("data/stats/chars/baseStats", false);
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates.");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records.");
if (_autoGeneratedCount > 0)
{
LOGGER.info(getClass().getSimpleName() + ": Generated " + _autoGeneratedCount + " level up gain records.");
}
} }
@Override @Override
@ -146,17 +151,16 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName())) else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName()))
{ {
int level = 0;
for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling()) for (Node lvlNode = d.getFirstChild(); lvlNode != null; lvlNode = lvlNode.getNextSibling())
{ {
if ("level".equalsIgnoreCase(lvlNode.getNodeName())) if ("level".equalsIgnoreCase(lvlNode.getNodeName()))
{ {
attrs = lvlNode.getAttributes(); attrs = lvlNode.getAttributes();
final int level = parseInteger(attrs, "val"); level = parseInteger(attrs, "val");
for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling()) for (Node valNode = lvlNode.getFirstChild(); valNode != null; valNode = valNode.getNextSibling())
{ {
final String nodeName = valNode.getNodeName(); final String nodeName = valNode.getNodeName();
if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId))) if ((level < Config.PLAYER_MAXIMUM_LEVEL) && (nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId)))
{ {
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent())); _playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent()));
@ -165,7 +169,27 @@ public final class PlayerTemplateData implements IGameXmlReader
} }
} }
} }
// TODO: Generate stats automatically. // Generate missing stats automatically.
while (level < (Config.PLAYER_MAXIMUM_LEVEL - 1))
{
level++;
_autoGeneratedCount++;
final double hpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hp", level, (((((hpM1 * level) / (level - 1)) + ((hpM1 * (level + 1)) / (level - 1))) / 2) + 1.45));
final double mpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mp", level, (((((mpM1 * level) / (level - 1)) + ((mpM1 * (level + 1)) / (level - 1))) / 2) + 1.6));
final double cpM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpMax(level - 1);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cp", level, (((((cpM1 * level) / (level - 1)) + ((cpM1 * (level + 1)) / (level - 1))) / 2) + 0.8));
final double hpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 1);
final double hpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseHpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("hpRegen", level, (hpRegM1 * 2) - hpRegM2);
final double mpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 1);
final double mpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseMpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("mpRegen", level, (mpRegM1 * 2) - mpRegM2);
final double cpRegM1 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 1);
final double cpRegM2 = _playerTemplates.get(ClassId.getClassId(classId)).getBaseCpRegen(level - 2);
_playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue("cpRegen", level, (cpRegM1 * 2) - cpRegM2);
}
} }
} }
} }