mirror of
https://gitlab.com/2009scape/2009scape.git
synced 2025-12-10 10:20:41 -07:00
Fixed saving of prayer points & hitpoints, dynamic level is now tracked separately to current hit/prayer points
This commit is contained in:
parent
9c202aa47a
commit
0a89439c80
3 changed files with 70 additions and 38 deletions
|
|
@ -566,12 +566,12 @@ class PlayerSaver (val player: Player){
|
||||||
val skill = JSONObject()
|
val skill = JSONObject()
|
||||||
skill.put("id",i.toString())
|
skill.put("id",i.toString())
|
||||||
skill.put("static",player.skills.staticLevels[i].toString())
|
skill.put("static",player.skills.staticLevels[i].toString())
|
||||||
if(i == Skills.HITPOINTS){
|
skill.put("dynamic",player.skills.dynamicLevels[i].toString())
|
||||||
skill.put("dynamic",player.skills.lifepoints.toString())
|
if (i == Skills.HITPOINTS) {
|
||||||
} else if (i == Skills.PRAYER){
|
skill.put("lifepoints",player.skills.lifepoints.toString())
|
||||||
skill.put("dynamic",ceil(player.skills.prayerPoints).toInt().toString())
|
}
|
||||||
} else {
|
if (i == Skills.PRAYER) {
|
||||||
skill.put("dynamic",player.skills.dynamicLevels[i].toString())
|
skill.put("prayerPoints",player.skills.prayerPoints.toString())
|
||||||
}
|
}
|
||||||
skill.put("experience",player.skills.getExperience(i).toString())
|
skill.put("experience",player.skills.getExperience(i).toString())
|
||||||
skills.add(skill)
|
skills.add(skill)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package core.game.node.entity.skill;
|
package core.game.node.entity.skill;
|
||||||
|
|
||||||
import content.global.skill.skillcapeperks.SkillcapePerks;
|
import content.global.skill.skillcapeperks.SkillcapePerks;
|
||||||
|
import core.ServerConstants;
|
||||||
import core.game.event.DynamicSkillLevelChangeEvent;
|
import core.game.event.DynamicSkillLevelChangeEvent;
|
||||||
import core.game.event.XPGainEvent;
|
import core.game.event.XPGainEvent;
|
||||||
import content.global.handlers.item.equipment.brawling_gloves.BrawlingGloves;
|
import content.global.handlers.item.equipment.brawling_gloves.BrawlingGloves;
|
||||||
|
|
@ -369,36 +370,30 @@ public final class Skills {
|
||||||
rechargePrayerPoints();
|
rechargePrayerPoints();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses the skill data from the buffer.
|
|
||||||
* @param buffer The byte buffer.
|
|
||||||
*/
|
|
||||||
public void parse(ByteBuffer buffer) {
|
|
||||||
for (int i = 0; i < 24; i++) {
|
|
||||||
experience[i] = ((double) buffer.getInt() / 10D);
|
|
||||||
dynamicLevels[i] = buffer.get() & 0xFF;
|
|
||||||
if (i == HITPOINTS) {
|
|
||||||
lifepoints = dynamicLevels[i];
|
|
||||||
} else if (i == PRAYER) {
|
|
||||||
prayerPoints = dynamicLevels[i];
|
|
||||||
}
|
|
||||||
staticLevels[i] = buffer.get() & 0xFF;
|
|
||||||
}
|
|
||||||
experienceGained = buffer.getInt();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void parse(JSONArray skillData){
|
public void parse(JSONArray skillData){
|
||||||
for(int i = 0; i < skillData.size(); i++){
|
for(int i = 0; i < skillData.size(); i++){
|
||||||
JSONObject skill = (JSONObject) skillData.get(i);
|
JSONObject skill = (JSONObject) skillData.get(i);
|
||||||
int id = Integer.parseInt( skill.get("id").toString());
|
int id = Integer.parseInt( skill.get("id").toString());
|
||||||
dynamicLevels[id] = Integer.parseInt( skill.get("dynamic").toString());
|
dynamicLevels[id] = Integer.parseInt(skill.get("dynamic").toString());
|
||||||
if (id == HITPOINTS) {
|
staticLevels[id] = Integer.parseInt(skill.get("static").toString());
|
||||||
lifepoints = dynamicLevels[i];
|
|
||||||
} else if (id == PRAYER) {
|
|
||||||
prayerPoints = dynamicLevels[i];
|
|
||||||
}
|
|
||||||
staticLevels[id] = Integer.parseInt( skill.get("static").toString());
|
|
||||||
experience[id] = Double.parseDouble(skill.get("experience").toString());
|
experience[id] = Double.parseDouble(skill.get("experience").toString());
|
||||||
|
int version = entity instanceof Player ? entity.asPlayer().version : ServerConstants.CURRENT_SAVEFILE_VERSION;
|
||||||
|
if (i == HITPOINTS) {
|
||||||
|
if (version < 3 && !skill.containsKey("lifepoints")) { //!1881
|
||||||
|
lifepoints = dynamicLevels[id];
|
||||||
|
dynamicLevels[id] = staticLevels[id];
|
||||||
|
} else {
|
||||||
|
lifepoints = Integer.parseInt(skill.get("lifepoints").toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i == PRAYER) {
|
||||||
|
if (version < 3 && !skill.containsKey("prayerPoints")) { //!1881
|
||||||
|
prayerPoints = dynamicLevels[id];
|
||||||
|
dynamicLevels[id] = staticLevels[id];
|
||||||
|
} else {
|
||||||
|
prayerPoints = Double.parseDouble(skill.get("prayerPoints").toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -432,13 +427,7 @@ public final class Skills {
|
||||||
public void save(ByteBuffer buffer) {
|
public void save(ByteBuffer buffer) {
|
||||||
for (int i = 0; i < 24; i++) {
|
for (int i = 0; i < 24; i++) {
|
||||||
buffer.putInt((int) (experience[i] * 10));
|
buffer.putInt((int) (experience[i] * 10));
|
||||||
if (i == HITPOINTS) {
|
buffer.put((byte) dynamicLevels[i]);
|
||||||
buffer.put((byte) lifepoints);
|
|
||||||
} else if (i == PRAYER) {
|
|
||||||
buffer.put((byte) Math.ceil(prayerPoints));
|
|
||||||
} else {
|
|
||||||
buffer.put((byte) dynamicLevels[i]);
|
|
||||||
}
|
|
||||||
buffer.put((byte) staticLevels[i]);
|
buffer.put((byte) staticLevels[i]);
|
||||||
}
|
}
|
||||||
buffer.putInt((int) experienceGained);
|
buffer.putInt((int) experienceGained);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
package core.game.node.entity.skill
|
||||||
|
|
||||||
|
import TestUtils.getMockPlayer
|
||||||
|
import core.game.node.entity.player.info.login.PlayerSaveParser
|
||||||
|
import core.game.node.entity.player.info.login.PlayerSaver
|
||||||
|
import org.json.simple.JSONArray
|
||||||
|
import org.json.simple.JSONObject
|
||||||
|
import org.json.simple.parser.JSONParser
|
||||||
|
import org.junit.jupiter.api.Assertions
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
|
class SkillsTests {
|
||||||
|
init {
|
||||||
|
TestUtils.preTestSetup()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveDynamicLevelsTest() {
|
||||||
|
val player = getMockPlayer("")
|
||||||
|
|
||||||
|
// Test migration of old save versions with incorrectly-saved dynamic levels
|
||||||
|
val jsonparser = JSONParser()
|
||||||
|
val json = jsonparser.parse("[{\"static\":\"55\",\"dynamic\":\"55\",\"id\":\"0\",\"experience\":\"177895.0\"},{\"static\":\"21\",\"dynamic\":\"21\",\"id\":\"1\",\"experience\":\"5120.0\"},{\"static\":\"23\",\"dynamic\":\"23\",\"id\":\"2\",\"experience\":\"6682.799999999999\"},{\"static\":\"26\",\"dynamic\":\"20\",\"id\":\"3\",\"experience\":\"9001.000000000002\"},{\"static\":\"1\",\"dynamic\":\"1\",\"id\":\"4\",\"experience\":\"0.0\"},{\"static\":\"23\",\"dynamic\":\"20\",\"id\":\"5\",\"experience\":\"6772.5\"},{\"static\":\"37\",\"dynamic\":\"37\",\"id\":\"6\",\"experience\":\"28180.0\"},{\"static\":\"54\",\"dynamic\":\"54\",\"id\":\"7\",\"experience\":\"164425.0\"},{\"static\":\"40\",\"dynamic\":\"40\",\"id\":\"8\",\"experience\":\"40975.5\"},{\"static\":\"24\",\"dynamic\":\"24\",\"id\":\"9\",\"experience\":\"7260.0\"},{\"static\":\"40\",\"dynamic\":\"40\",\"id\":\"10\",\"experience\":\"40200.0\"},{\"static\":\"35\",\"dynamic\":\"35\",\"id\":\"11\",\"experience\":\"23750.0\"},{\"static\":\"60\",\"dynamic\":\"60\",\"id\":\"12\",\"experience\":\"292409.0\"},{\"static\":\"11\",\"dynamic\":\"11\",\"id\":\"13\",\"experience\":\"1371.5\"},{\"static\":\"75\",\"dynamic\":\"75\",\"id\":\"14\",\"experience\":\"1254300.0\"},{\"static\":\"1\",\"dynamic\":\"1\",\"id\":\"15\",\"experience\":\"0.0\"},{\"static\":\"42\",\"dynamic\":\"42\",\"id\":\"16\",\"experience\":\"47742.5\"},{\"static\":\"10\",\"dynamic\":\"10\",\"id\":\"17\",\"experience\":\"1160.0\"},{\"static\":\"1\",\"dynamic\":\"1\",\"id\":\"18\",\"experience\":\"0.0\"},{\"static\":\"1\",\"dynamic\":\"1\",\"id\":\"19\",\"experience\":\"0.0\"},{\"static\":\"5\",\"dynamic\":\"5\",\"id\":\"20\",\"experience\":\"500.0\"},{\"static\":\"1\",\"dynamic\":\"1\",\"id\":\"21\",\"experience\":\"0.0\"},{\"static\":\"1\",\"dynamic\":\"1\",\"id\":\"22\",\"experience\":\"0.0\"},{\"static\":\"11\",\"dynamic\":\"11\",\"id\":\"23\",\"experience\":\"1429.0\"}]") as JSONArray
|
||||||
|
player.version = 1
|
||||||
|
player.skills.parse(json)
|
||||||
|
Assertions.assertTrue(player.skills.prayerPoints == 20.0)
|
||||||
|
Assertions.assertTrue(player.skills.lifepoints == 20)
|
||||||
|
Assertions.assertTrue(player.skills.dynamicLevels[Skills.PRAYER] == 23)
|
||||||
|
Assertions.assertTrue(player.skills.dynamicLevels[Skills.HITPOINTS] == 26)
|
||||||
|
|
||||||
|
// Test that serializing and parsing them again correctly updates the dynamic levels and keeps the hp/prayer points
|
||||||
|
player.version = 2
|
||||||
|
val root = JSONObject()
|
||||||
|
PlayerSaver(player).saveSkills(root)
|
||||||
|
val saveparser = PlayerSaveParser(player)
|
||||||
|
saveparser.saveFile = root
|
||||||
|
saveparser.parseSkills()
|
||||||
|
Assertions.assertTrue(player.skills.prayerPoints == 20.0)
|
||||||
|
Assertions.assertTrue(player.skills.lifepoints == 20)
|
||||||
|
Assertions.assertTrue(player.skills.dynamicLevels[Skills.PRAYER] == 23)
|
||||||
|
Assertions.assertTrue(player.skills.dynamicLevels[Skills.HITPOINTS] == 26)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue