94 private static final Logger logger = LogManager.getLogger(
PlayerPersistFile.class);
96 private static final Path FILE_DIR = Paths.get(
"data",
"profile",
"save");
98 private static Gson gson() {
99 return JSON_PRETTY_ALLOW_NULL.get();
103 public void save(
Player player) {
109 final Gson gson = gson();
111 JsonObject properties =
new JsonObject();
113 for (PlayerJSONProperty property : PROPERTIES) {
114 properties.add(property.label, gson.toJsonTree(property.write(player)));
117 final Path path = FILE_DIR.resolve(player.getName() +
".json");
118 Path parent = path.getParent();
119 if (parent ==
null) {
120 throw new UnsupportedOperationException(
"Path must have a parent " + path);
122 if (!Files.exists(parent)) {
123 parent = Files.createDirectories(parent);
126 final Path tempFile = Files.createTempFile(parent, path.getFileName().toString(),
".tmp");
127 Files.write(tempFile, gson.toJson(properties).getBytes());
129 Files.move(tempFile, path, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING);
130 }
catch (Exception ex) {
131 logger.error(String.format(
"Error while saving player=%s", player.getName()), ex);
134 player.saved.set(
true);
140 final Path path = FILE_DIR.resolve(player.getName() +
".json");
142 if (!Files.exists(path)) {
143 player.newPlayer =
true;
144 player.needsStarter =
true;
148 final JsonElement jsonElement;
149 try (
final Reader reader =
new FileReader(path.toFile())) {
150 jsonElement = JsonParser.parseReader(reader);
152 final JsonObject jsonObject = jsonElement.getAsJsonObject();
154 for (PlayerJSONProperty property : PROPERTIES) {
155 final String label =
property.label;
156 final JsonElement propertyElement = jsonObject.get(label);
157 if (propertyElement ==
null || propertyElement.isJsonNull())
continue;
158 property.read(player, propertyElement);
161 final String password = player.getPassword();
162 if (expectedPassword.equals(password)) {
166 final Argon2Types type = Argon2.argon2Type(password);
171 final var argon2 = Argon2.forType(type);
172 if (!argon2.verify(password, expectedPassword)) {
177 }
catch (
final Exception ex) {
178 ex.printStackTrace();
184 private static final PlayerJSONProperty[] PROPERTIES = {
186 new PlayerJSONProperty(
"username") {
188 void read(
Player player, JsonElement property) {
189 player.setUsername(property.getAsString());
193 Object write(
Player player) {
194 return player.getUsername();
198 new PlayerJSONProperty(
"password") {
200 void read(
Player player, JsonElement property) {
201 player.setPassword(property.getAsString());
205 Object write(
Player player) {
206 return player.getPassword();
209 new PlayerJSONProperty(
"weapon-styles") {
211 void read(
Player player, JsonElement property) {
212 HashMap<WeaponInterface, FightType> styles = gson().fromJson(property,
new TypeToken<HashMap<WeaponInterface, FightType>>() {
214 styles.forEach((key, val) -> player.fightStyles.put(key, val));
218 Object write(
Player player) {
219 return gson().toJsonTree(player.fightStyles,
new TypeToken<HashMap<WeaponInterface, FightType>>() {
223 new PlayerJSONProperty(
"player-rights") {
225 void read(
Player player, JsonElement property) {
226 player.right = gson().fromJson(property,
PlayerRight.class);
230 Object write(
Player player) {
235 new PlayerJSONProperty(
"last-host") {
237 void read(
Player player, JsonElement property) {
238 player.lastHost =
property.getAsString();
242 Object write(
Player player) {
243 return player.lastHost;
247 new PlayerJSONProperty(
"host-list") {
249 void read(
Player player, JsonElement property) {
250 player.hostList.addAll(gson().fromJson(property,
new TypeToken<Set<String>>() {
255 Object write(
Player player) {
256 return player.hostList;
260 new PlayerJSONProperty(
"position") {
262 void read(
Player player, JsonElement property) {
264 final int height = position.
getHeight() < 0 ? 0 : position.getHeight() % 4;
265 player.setPosition(
Position.
create(position.getX(), position.getY(), height));
269 Object write(
Player player) {
270 return player.getPosition();
274 new PlayerJSONProperty(
"created") {
276 void read(
Player player, JsonElement property) {
277 player.created =
property.getAsString();
281 Object write(
Player player) {
282 if (player.created ==
null)
284 return player.created;
288 new PlayerJSONProperty(
"play-time") {
290 void read(
Player player, JsonElement property) {
291 player.playTime =
property.getAsInt();
295 Object write(
Player player) {
296 return player.playTime;
300 new PlayerJSONProperty(
"money-spent") {
302 void read(
Player player, JsonElement property) {
303 player.donation.setSpent(property.getAsInt());
307 Object write(
Player player) {
308 return player.donation.getSpent();
312 new PlayerJSONProperty(
"donation-credits") {
314 void read(
Player player, JsonElement property) {
315 player.donation.setCredits(property.getAsInt());
319 Object write(
Player player) {
320 return player.donation.getCredits();
324 new PlayerJSONProperty(
"skilling-points") {
326 void read(
Player player, JsonElement property) {
327 player.skillingPoints =
property.getAsInt();
331 Object write(
Player player) {
332 return player.skillingPoints;
336 new PlayerJSONProperty(
"lms-kills") {
338 void read(
Player player, JsonElement property) {
339 player.lmsTotalKills =
property.getAsInt();
343 Object write(
Player player) {
344 return player.lmsTotalKills;
348 new PlayerJSONProperty(
"lms-deaths") {
350 void read(
Player player, JsonElement property) {
351 player.lmsTotalDeaths =
property.getAsInt();
355 Object write(
Player player) {
356 return player.lmsTotalDeaths;
360 new PlayerJSONProperty(
"lms-points") {
362 void read(
Player player, JsonElement property) {
363 player.lmsPoints =
property.getAsInt();
367 Object write(
Player player) {
368 return player.lmsPoints;
372 new PlayerJSONProperty(
"pest-points") {
374 void read(
Player player, JsonElement property) {
375 player.pestPoints =
property.getAsInt();
379 Object write(
Player player) {
380 return player.pestPoints;
384 new PlayerJSONProperty(
"mute-start") {
386 void read(
Player player, JsonElement property) {
387 player.punishment.muteStart =
property.getAsLong();
391 Object write(
Player player) {
392 return player.punishment.muteStart;
396 new PlayerJSONProperty(
"mute-duration") {
398 void read(
Player player, JsonElement property) {
399 player.punishment.muteDuration =
property.getAsLong();
403 Object write(
Player player) {
404 return player.punishment.muteDuration;
408 new PlayerJSONProperty(
"jail-start") {
410 void read(
Player player, JsonElement property) {
411 player.punishment.jailStart =
property.getAsLong();
415 Object write(
Player player) {
416 return player.punishment.jailStart;
420 new PlayerJSONProperty(
"jail-duration") {
422 void read(
Player player, JsonElement property) {
423 player.punishment.jailDuration =
property.getAsLong();
427 Object write(
Player player) {
428 return player.punishment.jailDuration;
432 new PlayerJSONProperty(
"player-title") {
434 void read(
Player player, JsonElement property) {
435 player.playerTitle = gson().fromJson(property,
PlayerTitle.class);
439 Object write(
Player player) {
440 return player.playerTitle;
444 new PlayerJSONProperty(
"clan") {
446 void read(
Player player, JsonElement property) {
448 if (channel !=
null) {
449 player.clanChannel = channel;
454 Object write(
Player player) {
455 return player.clanChannel ==
null ?
"" : player.clanChannel.getOwner();
459 new PlayerJSONProperty(
"last-clan") {
461 void read(
Player player, JsonElement property) {
462 player.lastClan =
property.getAsString();
466 Object write(
Player player) {
467 return player.lastClan;
471 new PlayerJSONProperty(
"clan-tag") {
473 void read(
Player player, JsonElement property) {
474 player.clanTag =
property.getAsString();
478 Object write(
Player player) {
479 return player.clanTag;
483 new PlayerJSONProperty(
"clan-tag-color") {
485 void read(
Player player, JsonElement property) {
486 player.clanTagColor =
property.getAsString();
490 Object write(
Player player) {
491 return player.clanTagColor;
495 new PlayerJSONProperty(
"clan-sort-type") {
497 void read(
Player player, JsonElement property) {
502 Object write(
Player player) {
503 return player.settings.clanMemberComporator.name();
507 new PlayerJSONProperty(
"bank-placeholder") {
509 void read(
Player player, JsonElement property) {
510 player.bank.placeHolder =
property.getAsBoolean();
514 Object write(
Player player) {
515 return player.bank.placeHolder;
519 new PlayerJSONProperty(
"bank-pin") {
521 void read(
Player player, JsonElement property) {
522 player.bankPin.pin =
property.getAsString();
526 Object write(
Player player) {
527 return player.bankPin.pin;
531 new PlayerJSONProperty(
"bank-vault") {
533 void read(
Player player, JsonElement property) {
534 player.bankVault.coinsContainer =
property.getAsLong();
538 Object write(
Player player) {
539 return player.bankVault.coinsContainer;
543 new PlayerJSONProperty(
"bank-vault-blood-money") {
545 void read(
Player player, JsonElement property) {
546 player.bankVault.bloodMoneyContainer =
property.getAsLong();
550 Object write(
Player player) {
551 return player.bankVault.bloodMoneyContainer;
555 new PlayerJSONProperty(
"pet") {
557 void read(
Player player, JsonElement property) {
558 int pet =
property.getAsInt();
560 player.pet =
new Npc(pet, player.getPosition());
565 Object write(
Player player) {
566 return player.pet ==
null ? -1 : player.pet.id;
570 new PlayerJSONProperty(
"pet-insurnce") {
572 void read(
Player player, JsonElement property) {
573 player.petInsurance = gson().fromJson(property,
new TypeToken<HashSet<PetData>>() {
578 Object write(
Player player) {
579 return player.petInsurance;
583 new PlayerJSONProperty(
"lost-pets") {
585 void read(
Player player, JsonElement property) {
586 player.lostPets = gson().fromJson(property,
new TypeToken<HashSet<PetData>>() {
591 Object write(
Player player) {
592 return player.lostPets;
596 new PlayerJSONProperty(
"new-player") {
598 void read(
Player player, JsonElement property) {
599 player.newPlayer =
property.getAsBoolean();
603 Object write(
Player player) {
604 return player.newPlayer;
608 new PlayerJSONProperty(
"needs-starter") {
610 void read(
Player player, JsonElement property) {
611 player.needsStarter =
property.getAsBoolean();
615 Object write(
Player player) {
616 return player.needsStarter;
620 new PlayerJSONProperty(
"kills") {
622 void read(
Player player, JsonElement property) {
623 player.kill =
property.getAsInt();
627 Object write(
Player player) {
632 new PlayerJSONProperty(
"deaths") {
634 void read(
Player player, JsonElement property) {
635 player.death =
property.getAsInt();
639 Object write(
Player player) {
644 new PlayerJSONProperty(
"kill-streak") {
646 void read(
Player player, JsonElement property) {
647 player.killstreak.streak =
property.getAsInt();
651 Object write(
Player player) {
652 return player.killstreak.streak;
655 new PlayerJSONProperty(
"answered-trivias") {
657 void read(
Player player, JsonElement property) {
658 player.answeredTrivias =
property.getAsInt();
662 Object write(
Player player) {
663 return player.answeredTrivias;
666 new PlayerJSONProperty(
"small-pouch") {
668 void read(
Player player, JsonElement property) {
669 player.smallPouch =
property.getAsInt();
673 Object write(
Player player) {
674 return player.smallPouch;
678 new PlayerJSONProperty(
"medium-pouch") {
680 void read(
Player player, JsonElement property) {
681 player.mediumPouch =
property.getAsInt();
685 Object write(
Player player) {
686 return player.mediumPouch;
690 new PlayerJSONProperty(
"large-pouch") {
692 void read(
Player player, JsonElement property) {
693 player.largePouch =
property.getAsInt();
697 Object write(
Player player) {
698 return player.largePouch;
702 new PlayerJSONProperty(
"giant-pouch") {
704 void read(
Player player, JsonElement property) {
705 player.giantPouch =
property.getAsInt();
709 Object write(
Player player) {
710 return player.giantPouch;
714 new PlayerJSONProperty(
"rune-pouch") {
716 void read(
Player player, JsonElement property) {
717 player.runePouch.runes = gson().fromJson(property,
new TypeToken<LinkedList<Item>>() {
722 Object write(
Player player) {
723 return player.runePouch.runes;
727 new PlayerJSONProperty(
"rune-pouch-copy") {
729 void read(
Player player, JsonElement property) {
730 player.runePouch_copy.runes = gson().fromJson(property,
new TypeToken<LinkedList<Item>>() {
735 Object write(
Player player) {
736 return player.runePouch_copy.runes;
740 new PlayerJSONProperty(
"run-toggled") {
742 void read(
Player player, JsonElement property) {
743 player.movement.setRunningToggled(property.getAsBoolean());
747 Object write(
Player player) {
748 return player.movement.isRunningToggled();
752 new PlayerJSONProperty(
"run-energy") {
754 void read(
Player player, JsonElement property) {
755 player.runEnergy =
property.getAsInt();
759 Object write(
Player player) {
760 return player.runEnergy;
764 new PlayerJSONProperty(
"energy-rate") {
766 void read(
Player player, JsonElement property) {
767 player.energyRate =
property.getAsInt();
771 Object write(
Player player) {
772 return player.energyRate;
776 new PlayerJSONProperty(
"special-amount") {
778 void read(
Player player, JsonElement property) {
779 player.getSpecialPercentage().set(property.getAsInt());
783 Object write(
Player player) {
784 return player.getSpecialPercentage().get();
788 new PlayerJSONProperty(
"recoil-charge") {
790 void read(
Player player, JsonElement property) {
791 player.ringOfRecoil =
property.getAsInt();
795 Object write(
Player player) {
796 return player.ringOfRecoil;
800 new PlayerJSONProperty(
"whip-charge") {
802 void read(
Player player, JsonElement property) {
803 player.whipCharges =
property.getAsInt();
807 Object write(
Player player) {
808 return player.whipCharges;
811 new PlayerJSONProperty(
"ags-charge") {
813 void read(
Player player, JsonElement property) {
814 player.agsCharges =
property.getAsInt();
818 Object write(
Player player) {
819 return player.agsCharges;
823 new PlayerJSONProperty(
"dragonfire-shield-charge") {
825 void read(
Player player, JsonElement property) {
826 player.dragonfireCharges =
property.getAsInt();
830 Object write(
Player player) {
831 return player.dragonfireCharges;
835 new PlayerJSONProperty(
"dragonfire-shield-cooldown") {
837 void read(
Player player, JsonElement property) {
838 player.dragonfireUsed =
property.getAsLong();
842 Object write(
Player player) {
843 return player.dragonfireUsed;
847 new PlayerJSONProperty(
"blowpipe-darts") {
849 void read(
Player player, JsonElement property) {
850 player.blowpipeDarts = gson().fromJson(property, Item.class);
854 Object write(
Player player) {
855 return player.blowpipeDarts;
859 new PlayerJSONProperty(
"blowpipe-scales") {
861 void read(
Player player, JsonElement property) {
862 player.blowpipeScales =
property.getAsFloat();
866 Object write(
Player player) {
867 return player.blowpipeScales;
871 new PlayerJSONProperty(
"serpentine-helm") {
873 void read(
Player player, JsonElement property) {
874 player.serpentineHelmCharges =
property.getAsInt();
878 Object write(
Player player) {
879 return player.serpentineHelmCharges;
883 new PlayerJSONProperty(
"tanzanite-helm") {
885 void read(
Player player, JsonElement property) {
886 player.tanzaniteHelmCharges =
property.getAsInt();
890 Object write(
Player player) {
891 return player.tanzaniteHelmCharges;
895 new PlayerJSONProperty(
"magma-helm") {
897 void read(
Player player, JsonElement property) {
898 player.magmaHelmCharges =
property.getAsInt();
902 Object write(
Player player) {
903 return player.magmaHelmCharges;
908 new PlayerJSONProperty(
"craws-bow-charges") {
910 void read(
Player player, JsonElement property) {
911 player.crawsBowCharges =
property.getAsInt();
915 Object write(
Player player) {
916 return player.crawsBowCharges;
919 new PlayerJSONProperty(
"viggoras-chainmace-charges") {
921 void read(
Player player, JsonElement property) {
922 player.viggorasChainmaceCharges =
property.getAsInt();
926 Object write(
Player player) {
927 return player.viggorasChainmaceCharges;
930 new PlayerJSONProperty(
"thammaron-sceptre-charges") {
932 void read(
Player player, JsonElement property) {
933 player.thammoranSceptreCharges =
property.getAsInt();
937 Object write(
Player player) {
938 return player.thammoranSceptreCharges;
941 new PlayerJSONProperty(
"trident-seas-charges") {
943 void read(
Player player, JsonElement property) {
944 player.tridentSeasCharges =
property.getAsInt();
948 Object write(
Player player) {
949 return player.tridentSeasCharges;
953 new PlayerJSONProperty(
"trident-swamp-charges") {
955 void read(
Player player, JsonElement property) {
956 player.tridentSwampCharges =
property.getAsInt();
960 Object write(
Player player) {
961 return player.tridentSwampCharges;
965 new PlayerJSONProperty(
"celestial-ring-charges") {
967 void read(
Player player, JsonElement property) {
968 player.celestialRingCharges =
property.getAsInt();
972 Object write(
Player player) {
973 return player.celestialRingCharges;
977 new PlayerJSONProperty(
"fight-type") {
979 void read(
Player player, JsonElement property) {
980 player.getCombat().setFightType(gson().fromJson(property,
FightType.class));
984 Object write(
Player player) {
985 return player.getCombat().getFightType();
989 new PlayerJSONProperty(
"client-width") {
991 void read(
Player player, JsonElement property) {
992 player.settings.clientWidth =
property.getAsInt();
996 Object write(
Player player) {
997 return player.settings.clientWidth;
1001 new PlayerJSONProperty(
"client-height") {
1003 void read(
Player player, JsonElement property) {
1004 player.settings.clientHeight =
property.getAsInt();
1008 Object write(
Player player) {
1009 return player.settings.clientHeight;
1013 new PlayerJSONProperty(
"spell-book") {
1015 void read(
Player player, JsonElement property) {
1016 player.spellbook = gson().fromJson(property,
Spellbook.class);
1020 Object write(
Player player) {
1021 return player.spellbook;
1025 new PlayerJSONProperty(
"spell-book-copy") {
1027 void read(
Player player, JsonElement property) {
1028 player.spellbook_copy = gson().fromJson(property,
Spellbook.class);
1032 Object write(
Player player) {
1033 return player.spellbook_copy;
1037 new PlayerJSONProperty(
"auto-cast") {
1039 void read(
Player player, JsonElement property) {
1040 player.setAutocast(gson().fromJson(property,
CombatSpell.class));
1044 Object write(
Player player) {
1045 return player.autocast;
1049 new PlayerJSONProperty(
"brightness") {
1051 void read(
Player player, JsonElement property) {
1052 player.settings.setBrightness(property.getAsInt());
1056 Object write(
Player player) {
1057 return player.settings.brightness;
1061 new PlayerJSONProperty(
"zoom") {
1063 void read(
Player player, JsonElement property) {
1064 player.settings.setZoom(property.getAsInt(),
true);
1068 Object write(
Player player) {
1069 return player.settings.zoom;
1073 new PlayerJSONProperty(
"private-chat") {
1075 void read(
Player player, JsonElement property) {
1076 player.settings.privateChat =
property.getAsBoolean();
1080 Object write(
Player player) {
1081 return player.settings.privateChat;
1085 new PlayerJSONProperty(
"chat-effects") {
1087 void read(
Player player, JsonElement property) {
1088 player.settings.chatEffects =
property.getAsBoolean();
1092 Object write(
Player player) {
1093 return player.settings.chatEffects;
1097 new PlayerJSONProperty(
"accept-aid") {
1099 void read(
Player player, JsonElement property) {
1100 player.settings.acceptAid =
property.getAsBoolean();
1104 Object write(
Player player) {
1105 return player.settings.acceptAid;
1109 new PlayerJSONProperty(
"mouse-clicks") {
1111 void read(
Player player, JsonElement property) {
1112 player.settings.mouse =
property.getAsBoolean();
1116 Object write(
Player player) {
1117 return player.settings.mouse;
1121 new PlayerJSONProperty(
"auto-retaliate") {
1123 void read(
Player player, JsonElement property) {
1124 player.settings.autoRetaliate =
property.getAsBoolean();
1128 Object write(
Player player) {
1129 return player.settings.autoRetaliate;
1133 new PlayerJSONProperty(
"profanity-filter") {
1135 void read(
Player player, JsonElement property) {
1136 player.settings.profanityFilter =
property.getAsBoolean();
1140 Object write(
Player player) {
1141 return player.settings.profanityFilter;
1145 new PlayerJSONProperty(
"camera-movement") {
1147 void read(
Player player, JsonElement property) {
1148 player.settings.cameraMovement =
property.getAsBoolean();
1152 Object write(
Player player) {
1153 return player.settings.cameraMovement;
1157 new PlayerJSONProperty(
"experience-lock") {
1159 void read(
Player player, JsonElement property) {
1160 player.settings.lockExperience =
property.getAsBoolean();
1164 Object write(
Player player) {
1165 return player.settings.lockExperience;
1169 new PlayerJSONProperty(
"welcome-screen") {
1171 void read(
Player player, JsonElement property) {
1172 player.settings.welcomeScreen =
property.getAsBoolean();
1176 Object write(
Player player) {
1177 return player.settings.welcomeScreen;
1181 new PlayerJSONProperty(
"screenshot-kill") {
1183 void read(
Player player, JsonElement property) {
1184 player.settings.screenshotKill =
property.getAsBoolean();
1188 Object write(
Player player) {
1189 return player.settings.screenshotKill;
1193 new PlayerJSONProperty(
"trivia-bot") {
1195 void read(
Player player, JsonElement property) {
1196 player.settings.triviaBot =
property.getAsBoolean();
1200 Object write(
Player player) {
1201 return player.settings.triviaBot;
1205 new PlayerJSONProperty(
"drop-notification") {
1207 void read(
Player player, JsonElement property) {
1208 player.settings.dropNotification =
property.getAsBoolean();
1212 Object write(
Player player) {
1213 return player.settings.dropNotification;
1217 new PlayerJSONProperty(
"yell-notification") {
1219 void read(
Player player, JsonElement property) {
1220 player.settings.yell =
property.getAsBoolean();
1224 Object write(
Player player) {
1225 return player.settings.yell;
1229 new PlayerJSONProperty(
"untradeable-notification") {
1231 void read(
Player player, JsonElement property) {
1232 player.settings.untradeableNotification =
property.getAsBoolean();
1236 Object write(
Player player) {
1237 return player.settings.untradeableNotification;
1241 new PlayerJSONProperty(
"esc-close") {
1243 void read(
Player player, JsonElement property) {
1244 player.settings.ESC_CLOSE =
property.getAsBoolean();
1248 Object write(
Player player) {
1249 return player.settings.ESC_CLOSE;
1253 new PlayerJSONProperty(
"gloves-tier") {
1255 void read(
Player player, JsonElement property) {
1256 player.glovesTier =
property.getAsInt();
1260 Object write(
Player player) {
1261 return player.glovesTier;
1265 new PlayerJSONProperty(
"experience-rate") {
1267 void read(
Player player, JsonElement property) {
1268 player.experienceRate =
property.getAsDouble();
1272 Object write(
Player player) {
1273 return player.experienceRate;
1277 new PlayerJSONProperty(
"experience-counter") {
1279 void read(
Player player, JsonElement property) {
1280 player.skills.experienceCounter =
property.getAsDouble();
1284 Object write(
Player player) {
1285 return player.skills.experienceCounter;
1289 new PlayerJSONProperty(
"experience-counter-copy") {
1291 void read(
Player player, JsonElement property) {
1292 player.skills_copy.experienceCounter =
property.getAsDouble();
1296 Object write(
Player player) {
1297 return player.skills_copy.experienceCounter;
1301 new PlayerJSONProperty(
"preset-death-open") {
1303 void read(
Player player, JsonElement property) {
1304 player.presetManager.deathOpen =
property.getAsBoolean();
1308 Object write(
Player player) {
1309 return player.presetManager.deathOpen;
1313 new PlayerJSONProperty(
"preset-death-open") {
1315 void read(
Player player, JsonElement property) {
1316 player.presetManager.deathOpen =
property.getAsBoolean();
1320 Object write(
Player player) {
1321 return player.presetManager.deathOpen;
1325 new PlayerJSONProperty(
"preset-automatic-deposit") {
1327 void read(
Player player, JsonElement property) {
1328 player.presetManager.autoDeposit =
property.getAsBoolean();
1332 Object write(
Player player) {
1333 return player.presetManager.autoDeposit;
1337 new PlayerJSONProperty(
"hidden-brother") {
1339 void read(
Player player, JsonElement property) {
1340 player.hiddenBrother = gson().fromJson(property,
BrotherData.class);
1344 Object write(
Player player) {
1345 return player.hiddenBrother;
1349 new PlayerJSONProperty(
"brothers-kill-count") {
1351 void read(
Player player, JsonElement property) {
1352 player.barrowsKillCount =
property.getAsInt();
1356 Object write(
Player player) {
1357 return player.barrowsKillCount;
1361 new PlayerJSONProperty(
"brothers-dead") {
1363 void read(
Player player, JsonElement property) {
1364 player.barrowKills = gson().fromJson(property,
boolean[].
class);
1368 Object write(
Player player) {
1369 return player.barrowKills;
1373 new PlayerJSONProperty(
"vote-points") {
1375 void read(
Player player, JsonElement property) {
1376 player.votePoints =
property.getAsInt();
1380 Object write(
Player player) {
1381 return player.votePoints;
1385 new PlayerJSONProperty(
"total-votes") {
1387 void read(
Player player, JsonElement property) {
1388 player.totalVotes =
property.getAsInt();
1392 Object write(
Player player) {
1393 return player.totalVotes;
1397 new PlayerJSONProperty(
"completed-magearena") {
1399 void read(
Player player, JsonElement property) {
1400 player.completedMageArena =
property.getAsBoolean();
1404 Object write(
Player player) {
1405 return player.completedMageArena;
1409 new PlayerJSONProperty(
"magearena-points") {
1411 void read(
Player player, JsonElement property) {
1412 player.mageArenaPoints =
property.getAsInt();
1416 Object write(
Player player) {
1417 return player.mageArenaPoints;
1421 new PlayerJSONProperty(
"poison-immunity") {
1423 void read(
Player player, JsonElement property) {
1424 player.getPoisonImmunity().set(property.getAsInt());
1428 Object write(
Player player) {
1429 return player.getPoisonImmunity().get();
1433 new PlayerJSONProperty(
"venom-immunity") {
1435 void read(
Player player, JsonElement property) {
1436 player.getVenomImmunity().set(property.getAsInt());
1440 Object write(
Player player) {
1441 return player.getVenomImmunity().get();
1445 new PlayerJSONProperty(
"skull-timer") {
1447 void read(
Player player, JsonElement property) {
1448 player.skulling.getSkullRemoveTask().setSkullTime(property.getAsInt());
1452 Object write(
Player player) {
1453 return player.skulling.getSkullRemoveTask().getSkullTime();
1457 new PlayerJSONProperty(
"teleblock-timer") {
1459 void read(
Player player, JsonElement property) {
1460 player.teleblockTimer.set(property.getAsInt());
1464 Object write(
Player player) {
1465 return player.teleblockTimer.get();
1469 new PlayerJSONProperty(
"prestige-points") {
1471 void read(
Player player, JsonElement property) {
1472 player.prestige.setPrestigePoint(property.getAsInt());
1476 Object write(
Player player) {
1477 return player.prestige.getPrestigePoint();
1481 new PlayerJSONProperty(
"prestige-total") {
1483 void read(
Player player, JsonElement property) {
1484 player.prestige.totalPrestige =
property.getAsInt();
1488 Object write(
Player player) {
1489 return player.prestige.totalPrestige;
1493 new PlayerJSONProperty(
"prestige-color") {
1495 void read(
Player player, JsonElement property) {
1496 player.settings.prestigeColors =
property.getAsBoolean();
1500 Object write(
Player player) {
1501 return player.settings.prestigeColors;
1505 new PlayerJSONProperty(
"prestiges") {
1507 void read(
Player player, JsonElement property) {
1508 player.prestige.prestige = gson().fromJson(property,
int[].
class);
1512 Object write(
Player player) {
1513 return player.prestige.prestige;
1517 new PlayerJSONProperty(
"active-perks") {
1519 void read(
Player player, JsonElement property) {
1520 player.prestige.activePerks = gson().fromJson(property,
new TypeToken<Set<PrestigePerk>>() {
1525 Object write(
Player player) {
1526 return player.prestige.activePerks;
1530 new PlayerJSONProperty(
"achievements") {
1532 void read(
Player player, JsonElement property) {
1533 HashMap<AchievementKey, Integer> achievements = gson().fromJson(property,
new TypeToken<HashMap<AchievementKey, Integer>>() {
1535 achievements.forEach((key, val) -> player.playerAchievements.put(key, val));
1539 Object write(
Player player) {
1540 return gson().toJsonTree(player.playerAchievements,
new TypeToken<HashMap<AchievementKey, Integer>>() {
1545 new PlayerJSONProperty(
"last-killed") {
1547 void read(
Player player, JsonElement property) {
1548 player.lastKilled = gson().fromJson(property,
new TypeToken<Deque<String>>() {
1553 Object write(
Player player) {
1554 return player.lastKilled;
1558 new PlayerJSONProperty(
"favorite-teleport") {
1560 void read(
Player player, JsonElement property) {
1561 player.favoriteTeleport = gson().fromJson(property,
new TypeToken<List<Teleport>>() {
1566 Object write(
Player player) {
1567 return player.favoriteTeleport;
1571 new PlayerJSONProperty(
"unlocked-emotes") {
1573 void read(
Player player, JsonElement property) {
1574 player.emoteUnlockable = gson().fromJson(property,
new TypeToken<List<EmoteUnlockable>>() {
1579 Object write(
Player player) {
1580 return player.emoteUnlockable;
1584 new PlayerJSONProperty(
"public-chat-mode") {
1586 void read(
Player player, JsonElement property) {
1587 player.relations.setPublicChatMode(
PrivacyChatMode.valueOf(gson().fromJson(property, String.class).toUpperCase()),
false);
1591 Object write(
Player player) {
1592 return player.relations.getPublicChatMode().name();
1596 new PlayerJSONProperty(
"private-chat-mode") {
1598 void read(
Player player, JsonElement property) {
1599 player.relations.setPrivateChatMode(
PrivacyChatMode.valueOf(gson().fromJson(property, String.class).toUpperCase()),
true);
1603 Object write(
Player player) {
1604 return player.relations.getPrivateChatMode().name();
1608 new PlayerJSONProperty(
"clan-chat-mode") {
1610 void read(
Player player, JsonElement property) {
1611 player.relations.setClanChatMode(
PrivacyChatMode.valueOf(gson().fromJson(property, String.class).toUpperCase()),
false);
1615 Object write(
Player player) {
1616 return player.relations.getClanChatMode().name();
1620 new PlayerJSONProperty(
"trade-chat-mode") {
1622 void read(
Player player, JsonElement property) {
1623 player.relations.setTradeChatMode(
PrivacyChatMode.valueOf(gson().fromJson(property, String.class).toUpperCase()),
false);
1627 Object write(
Player player) {
1628 return player.relations.getTradeChatMode().name();
1632 new PlayerJSONProperty(
"friend-list") {
1634 void read(
Player player, JsonElement property) {
1635 player.relations.getFriendList().addAll(gson().fromJson(property,
new TypeToken<List<Long>>() {
1640 Object write(
Player player) {
1641 return player.relations.getFriendList();
1645 new PlayerJSONProperty(
"ignore-list") {
1647 void read(
Player player, JsonElement property) {
1648 player.relations.getIgnoreList().addAll(gson().fromJson(property,
new TypeToken<List<Long>>() {
1653 Object write(
Player player) {
1654 return player.relations.getIgnoreList();
1658 new PlayerJSONProperty(
"appearance") {
1660 void read(
Player player, JsonElement property) {
1661 player.appearance = gson().fromJson(property,
Appearance.class);
1665 Object write(
Player player) {
1666 return player.appearance;
1670 new PlayerJSONProperty(
"preset") {
1672 void read(
Player player, JsonElement property) {
1673 Preset[] loaded = gson().fromJson(property,
Preset[].
class);
1674 System.arraycopy(loaded, 0, player.presetManager.preset, 0, loaded.length);
1678 Object write(
Player player) {
1679 return player.presetManager.preset;
1683 new PlayerJSONProperty(
"activity-logger") {
1685 void read(
Player player, JsonElement property) {
1686 player.loggedActivities = gson().fromJson(property,
new TypeToken<HashMap<ActivityLog, Integer>>() {
1691 Object write(
Player player) {
1692 return gson().toJsonTree(player.loggedActivities,
new TypeToken<HashMap<ActivityLog, Integer>>() {
1697 new PlayerJSONProperty(
"quick-prayers") {
1699 void read(
Player player, JsonElement property) {
1700 player.quickPrayers = gson().fromJson(property,
PrayerBook.class);
1704 Object write(
Player player) {
1705 return player.quickPrayers;
1709 new PlayerJSONProperty(
"locked-prayers") {
1711 void read(
Player player, JsonElement property) {
1712 player.unlockedPrayers = gson().fromJson(property,
new TypeToken<Set<Prayer>>() {
1717 Object write(
Player player) {
1718 return player.unlockedPrayers;
1722 new PlayerJSONProperty(
"slayer-points") {
1724 void read(
Player player, JsonElement property) {
1725 player.slayer.setPoints(property.getAsInt());
1729 Object write(
Player player) {
1730 return player.slayer.getPoints();
1734 new PlayerJSONProperty(
"slayer-task") {
1736 void read(
Player player, JsonElement property) {
1737 player.slayer.setTask(gson().fromJson(property,
SlayerTask.class));
1741 Object write(
Player player) {
1742 return player.slayer.getTask();
1746 new PlayerJSONProperty(
"slayer-assigned") {
1748 void read(
Player player, JsonElement property) {
1749 player.slayer.setAssigned(property.getAsInt());
1753 Object write(
Player player) {
1754 return player.slayer.getAssigned();
1758 new PlayerJSONProperty(
"slayer-amount") {
1760 void read(
Player player, JsonElement property) {
1761 player.slayer.setAmount(property.getAsInt());
1765 Object write(
Player player) {
1766 return player.slayer.getAmount();
1770 new PlayerJSONProperty(
"slayer-total-assigned") {
1772 void read(
Player player, JsonElement property) {
1773 player.slayer.setTotalAssigned(property.getAsInt());
1777 Object write(
Player player) {
1778 return player.slayer.getTotalAssigned();
1782 new PlayerJSONProperty(
"slayer-total-completed") {
1784 void read(
Player player, JsonElement property) {
1785 player.slayer.setTotalCompleted(property.getAsInt());
1789 Object write(
Player player) {
1790 return player.slayer.getTotalCompleted();
1794 new PlayerJSONProperty(
"slayer-total-cancelled") {
1796 void read(
Player player, JsonElement property) {
1797 player.slayer.setTotalCancelled(property.getAsInt());
1801 Object write(
Player player) {
1802 return player.slayer.getTotalCancelled();
1806 new PlayerJSONProperty(
"slayer-total-points") {
1808 void read(
Player player, JsonElement property) {
1809 player.slayer.setTotalPoints(property.getAsInt());
1813 Object write(
Player player) {
1814 return player.slayer.getTotalPoints();
1818 new PlayerJSONProperty(
"slayer-blocked") {
1820 void read(
Player player, JsonElement property) {
1821 player.slayer.setBlocked(gson().fromJson(property,
new TypeToken<List<SlayerTask>>() {
1826 Object write(
Player player) {
1827 return player.slayer.getBlocked();
1831 new PlayerJSONProperty(
"slayer-unlocked") {
1833 void read(
Player player, JsonElement property) {
1834 player.slayer.setUnlocked(gson().fromJson(property,
new TypeToken<Set<SlayerUnlockable>>() {
1839 Object write(
Player player) {
1840 return player.slayer.getUnlocked();
1843 new PlayerJSONProperty(
"waypoints") {
1845 void read(
Player player, JsonElement property) {
1846 player.waypoints = gson().fromJson(property,
new TypeToken<HashMap<String, Position>>() {}.getType());
1850 Object write(
Player player) {
1851 return player.waypoints;
1854 new PlayerJSONProperty(
"presetOverrides") {
1856 void read(
Player player, JsonElement property) {
1857 player.overrides.presets = gson().fromJson(property,
new TypeToken<HashMap<String, Overrides.OverridePreset>>() {}.getType());
1861 Object write(
Player player) {
1862 return player.overrides.presets;
1865 new PlayerJSONProperty(
"currentOverrides") {
1867 void read(
Player player, JsonElement property) {
1868 player.overrides.currentOverrides = gson().fromJson(property,
new TypeToken<HashMap<Integer, Item>>() {}.getType());
1872 Object write(
Player player) {
1873 return player.overrides.currentOverrides;
1876 new PlayerJSONProperty(
"allOverrides") {
1878 void read(
Player player, JsonElement property) {
1879 player.overrides.allOverrides = gson().fromJson(property,
new TypeToken<List<Integer>>() {}.getType());
1883 Object write(
Player player) {
1884 return player.overrides.allOverrides;
1887 new PlayerJSONProperty(
"skills") {
1889 void read(
Player player, JsonElement property) {
1890 player.skills.setSkills(gson().fromJson(property,
Skill[].
class));
1894 Object write(
Player player) {
1895 return player.skills.getSkills();
1899 new PlayerJSONProperty(
"skills-copy") {
1901 void read(
Player player, JsonElement property) {
1902 player.skills_copy.setSkills(gson().fromJson(property,
Skill[].
class));
1906 Object write(
Player player) {
1907 return player.skills_copy.getSkills();
1911 new PlayerJSONProperty(
"inventory") {
1913 void read(
Player player, JsonElement property) {
1914 player.inventory.set(gson().fromJson(property, Item[].
class));
1918 Object write(
Player player) {
1919 return player.inventory.getItems();
1923 new PlayerJSONProperty(
"equipment") {
1925 void read(
Player player, JsonElement property) {
1926 player.equipment.set(gson().fromJson(property, Item[].
class));
1930 Object write(
Player player) {
1931 return player.equipment.getItems();
1935 new PlayerJSONProperty(
"inventory-copy") {
1937 void read(
Player player, JsonElement property) {
1938 player.inventory_copy.set(gson().fromJson(property, Item[].
class));
1942 Object write(
Player player) {
1943 return player.inventory_copy.getItems();
1947 new PlayerJSONProperty(
"equipment-copy") {
1949 void read(
Player player, JsonElement property) {
1950 player.equipment_copy.set(gson().fromJson(property, Item[].
class));
1954 Object write(
Player player) {
1955 return player.equipment_copy.getItems();
1959 new PlayerJSONProperty(
"tab-amounts") {
1961 void read(
Player player, JsonElement property) {
1962 player.bank.tabAmounts = gson().fromJson(property,
int[].
class);
1966 Object write(
Player player) {
1967 return player.bank.tabAmounts;
1971 new PlayerJSONProperty(
"bank") {
1973 void read(
Player player, JsonElement property) {
1974 player.bank.set(gson().fromJson(property, Item[].
class));
1978 Object write(
Player player) {
1979 return player.bank.getItems();
1983 new PlayerJSONProperty(
"looting-bag") {
1985 void read(
Player player, JsonElement property) {
1986 player.lootingBag.set(gson().fromJson(property, Item[].
class));
1990 Object write(
Player player) {
1991 return player.lootingBag.getItems();
1995 new PlayerJSONProperty(
"lost-items") {
1997 void read(
Player player, JsonElement property) {
1998 player.lostItems = (gson().fromJson(property,
new TypeToken<LinkedList<Item>>() {
2003 Object write(
Player player) {
2004 return player.lostItems;
2008 new PlayerJSONProperty(
"lost-untradables") {
2010 void read(
Player player, JsonElement property) {
2011 player.lostUntradeables.set(gson().fromJson(property, Item[].
class));
2015 Object write(
Player player) {
2016 return player.lostUntradeables.getItems();
2020 new PlayerJSONProperty(
"duel-rules") {
2022 void read(
Player player, JsonElement property) {
2023 if (property.isJsonNull()) {
2026 Type ruleSet =
new TypeToken<EnumSet<DuelRule>>() {
2030 player.attributes.put(
"duel_rules", gson().fromJson(property, ruleSet));
2034 Object write(
Player player) {
2035 if (player.attributes.has(
"duel_rules")) {
2036 return player.attributes.<String, EnumSet<DuelRule>>
get(
"duel_rules");
2042 new PlayerJSONProperty(
"farming-patches") {
2044 void read(
Player player, JsonElement property) {
2045 player.farming.fromJson(property.getAsJsonObject());
2049 Object write(
Player player) {
2050 return player.farming.toJson();
2054 new PlayerJSONProperty(
"daily-spell-book-swap") {
2056 void read(
Player player, JsonElement property) {
2061 Object write(
Player player) {
2062 return player.dailySpellBookSwap;
2066 new PlayerJSONProperty(
"daily-slayer-task-skip") {
2068 void read(
Player player, JsonElement property) {
2073 Object write(
Player player) {
2074 return player.dailySlayerTaskSkip;
2078 new PlayerJSONProperty(
"daily-slayer-task-teleport") {
2080 void read(
Player player, JsonElement property) {
2085 Object write(
Player player) {
2086 return player.dailySlayerTaskTeleport;
2090 new PlayerJSONProperty(
"gem-bag") {
2092 void read(
Player player, JsonElement property) {
2093 player.gemBag.container.set(gson().fromJson(property, Item[].
class));
2097 Object write(
Player player) {
2098 return player.gemBag.container.getItems();
2102 new PlayerJSONProperty(
"coal-bag") {
2104 void read(
Player player, JsonElement property) {
2105 player.coalBag.container.set(gson().fromJson(property, Item[].
class));
2109 Object write(
Player player) {
2110 return player.coalBag.container.getItems();
2114 new PlayerJSONProperty(
"birdhouse-data") {
2116 void read(
Player player, JsonElement property) {
2117 player.birdHouseData = gson().fromJson(property,
new TypeToken<List<PlayerBirdHouseData>>() {}.getType());
2121 Object write(
Player player) {
2122 return player.birdHouseData;
2126 new PlayerJSONProperty(
"player-trading-post-history") {
2128 void read(
Player player, JsonElement property) {
2129 Type type =
new TypeToken<List<ItemHistory>>() {
2131 player.tradingPost.getPlayersItemHistory().addAll(gson().fromJson(property, type));
2135 Object write(
Player player) {
2136 return player.tradingPost.getPlayersItemHistory();