89 private static final Logger logger = LogManager.getLogger(
PlayerPersistDB.class);
91 private static Gson gson() {
92 return JSON_PRETTY_ALLOW_NULL.get();
95 private static final PlayerJSONProperty[] PROPERTIES = {
97 new PlayerJSONProperty(
"username") {
99 void read(
Player player, JsonElement property) {
100 player.setUsername(property.getAsString());
104 Object write(
Player player) {
105 return player.getUsername();
109 new PlayerJSONProperty(
"password") {
111 void read(
Player player, JsonElement property) {
112 player.setPassword(property.getAsString());
116 Object write(
Player player) {
117 return player.getPassword();
121 new PlayerJSONProperty(
"player-rights") {
123 void read(
Player player, JsonElement property) {
124 player.right = gson().fromJson(property,
PlayerRight.class);
128 Object write(
Player player) {
133 new PlayerJSONProperty(
"position") {
135 void read(
Player player, JsonElement property) {
137 final int height = position.
getHeight() < 0 ? 0 : position.getHeight() % 4;
138 player.setPosition(
Position.
create(position.getX(), position.getY(), height));
142 Object write(
Player player) {
143 return player.getPosition();
147 new PlayerJSONProperty(
"created") {
149 void read(
Player player, JsonElement property) {
150 player.created =
property.getAsString();
154 Object write(
Player player) {
155 if (player.created ==
null)
157 return player.created;
161 new PlayerJSONProperty(
"play-time") {
163 void read(
Player player, JsonElement property) {
164 player.playTime =
property.getAsInt();
168 Object write(
Player player) {
169 return player.playTime;
173 new PlayerJSONProperty(
"money-spent") {
175 void read(
Player player, JsonElement property) {
176 player.donation.setSpent(property.getAsInt());
180 Object write(
Player player) {
181 return player.donation.getSpent();
185 new PlayerJSONProperty(
"donation-credits") {
187 void read(
Player player, JsonElement property) {
188 player.donation.setCredits(property.getAsInt());
192 Object write(
Player player) {
193 return player.donation.getCredits();
197 new PlayerJSONProperty(
"skilling-points") {
199 void read(
Player player, JsonElement property) {
200 player.skillingPoints =
property.getAsInt();
204 Object write(
Player player) {
205 return player.skillingPoints;
210 new PlayerJSONProperty(
"pest-points") {
212 void read(
Player player, JsonElement property) {
213 player.pestPoints =
property.getAsInt();
217 Object write(
Player player) {
218 return player.pestPoints;
222 new PlayerJSONProperty(
"mute-start") {
224 void read(
Player player, JsonElement property) {
225 player.punishment.muteStart =
property.getAsLong();
229 Object write(
Player player) {
230 return player.punishment.muteStart;
234 new PlayerJSONProperty(
"mute-duration") {
236 void read(
Player player, JsonElement property) {
237 player.punishment.muteDuration =
property.getAsLong();
241 Object write(
Player player) {
242 return player.punishment.muteDuration;
246 new PlayerJSONProperty(
"jail-start") {
248 void read(
Player player, JsonElement property) {
249 player.punishment.jailStart =
property.getAsLong();
253 Object write(
Player player) {
254 return player.punishment.jailStart;
258 new PlayerJSONProperty(
"jail-duration") {
260 void read(
Player player, JsonElement property) {
261 player.punishment.jailDuration =
property.getAsLong();
265 Object write(
Player player) {
266 return player.punishment.jailDuration;
270 new PlayerJSONProperty(
"player-title") {
272 void read(
Player player, JsonElement property) {
273 player.playerTitle = gson().fromJson(property,
PlayerTitle.class);
277 Object write(
Player player) {
278 return player.playerTitle;
282 new PlayerJSONProperty(
"clan") {
284 void read(
Player player, JsonElement property) {
286 if (channel !=
null) {
287 player.clanChannel = channel;
292 Object write(
Player player) {
293 return player.clanChannel ==
null ?
"" : player.clanChannel.getOwner();
297 new PlayerJSONProperty(
"last-clan") {
299 void read(
Player player, JsonElement property) {
300 player.lastClan =
property.getAsString();
304 Object write(
Player player) {
305 return player.lastClan;
309 new PlayerJSONProperty(
"clan-tag") {
311 void read(
Player player, JsonElement property) {
312 player.clanTag =
property.getAsString();
316 Object write(
Player player) {
317 return player.clanTag;
321 new PlayerJSONProperty(
"clan-tag-color") {
323 void read(
Player player, JsonElement property) {
324 player.clanTagColor =
property.getAsString();
328 Object write(
Player player) {
329 return player.clanTagColor;
333 new PlayerJSONProperty(
"clan-sort-type") {
335 void read(
Player player, JsonElement property) {
340 Object write(
Player player) {
341 return player.settings.clanMemberComporator.name();
345 new PlayerJSONProperty(
"bank-placeholder") {
347 void read(
Player player, JsonElement property) {
348 player.bank.placeHolder =
property.getAsBoolean();
352 Object write(
Player player) {
353 return player.bank.placeHolder;
357 new PlayerJSONProperty(
"bank-pin") {
359 void read(
Player player, JsonElement property) {
360 player.bankPin.pin =
property.getAsString();
364 Object write(
Player player) {
365 return player.bankPin.pin;
369 new PlayerJSONProperty(
"bank-vault") {
371 void read(
Player player, JsonElement property) {
372 player.bankVault.coinsContainer =
property.getAsLong();
376 Object write(
Player player) {
377 return player.bankVault.coinsContainer;
381 new PlayerJSONProperty(
"bank-vault-blood-money") {
383 void read(
Player player, JsonElement property) {
384 player.bankVault.bloodMoneyContainer =
property.getAsLong();
388 Object write(
Player player) {
389 return player.bankVault.bloodMoneyContainer;
393 new PlayerJSONProperty(
"pet") {
395 void read(
Player player, JsonElement property) {
396 int pet =
property.getAsInt();
398 player.pet =
new Npc(pet, player.getPosition());
403 Object write(
Player player) {
404 return player.pet ==
null ? -1 : player.pet.id;
408 new PlayerJSONProperty(
"pet-insurnce") {
410 void read(
Player player, JsonElement property) {
411 JsonArray array =
property.getAsJsonArray();
415 player.petInsurance.add(pet);
416 }
catch (IllegalArgumentException ignored) {}
421 Object write(
Player player) {
422 JsonArray array =
new JsonArray();
423 player.petInsurance.forEach(pet -> array.add(pet.name()));
428 new PlayerJSONProperty(
"lost-pets") {
430 void read(
Player player, JsonElement property) {
431 JsonArray array =
property.getAsJsonArray();
435 player.lostPets.add(pet);
436 }
catch (IllegalArgumentException ignored) {}
441 Object write(
Player player) {
442 JsonArray array =
new JsonArray();
443 player.lostPets.forEach(pet -> array.add(pet.name()));
448 new PlayerJSONProperty(
"new-player") {
450 void read(
Player player, JsonElement property) {
451 player.newPlayer =
property.getAsBoolean();
455 Object write(
Player player) {
456 return player.newPlayer;
460 new PlayerJSONProperty(
"needs-starter") {
462 void read(
Player player, JsonElement property) {
463 player.needsStarter =
property.getAsBoolean();
467 Object write(
Player player) {
468 return player.needsStarter;
472 new PlayerJSONProperty(
"kills") {
474 void read(
Player player, JsonElement property) {
475 player.kill =
property.getAsInt();
479 Object write(
Player player) {
484 new PlayerJSONProperty(
"deaths") {
486 void read(
Player player, JsonElement property) {
487 player.death =
property.getAsInt();
491 Object write(
Player player) {
496 new PlayerJSONProperty(
"kill-streak") {
498 void read(
Player player, JsonElement property) {
499 player.killstreak.streak =
property.getAsInt();
503 Object write(
Player player) {
504 return player.killstreak.streak;
507 new PlayerJSONProperty(
"answered-trivias") {
509 void read(
Player player, JsonElement property) {
510 player.answeredTrivias =
property.getAsInt();
514 Object write(
Player player) {
515 return player.answeredTrivias;
519 new PlayerJSONProperty(
"small-pouch") {
521 void read(
Player player, JsonElement property) {
522 player.smallPouch =
property.getAsInt();
526 Object write(
Player player) {
527 return player.smallPouch;
531 new PlayerJSONProperty(
"medium-pouch") {
533 void read(
Player player, JsonElement property) {
534 player.mediumPouch =
property.getAsInt();
538 Object write(
Player player) {
539 return player.mediumPouch;
543 new PlayerJSONProperty(
"large-pouch") {
545 void read(
Player player, JsonElement property) {
546 player.largePouch =
property.getAsInt();
550 Object write(
Player player) {
551 return player.largePouch;
555 new PlayerJSONProperty(
"giant-pouch") {
557 void read(
Player player, JsonElement property) {
558 player.giantPouch =
property.getAsInt();
562 Object write(
Player player) {
563 return player.giantPouch;
567 new PlayerJSONProperty(
"rune-pouch") {
569 void read(
Player player, JsonElement property) {
570 JsonArray array =
property.getAsJsonArray();
573 JsonObject
object = e.getAsJsonObject();
574 int id =
object.get(
"id").getAsInt();
575 int amount =
object.get(
"amount").getAsInt();
577 if (
id != -1 && amount != -1) {
578 player.runePouch.runes.add(
new Item(
id, amount));
584 Object write(
Player player) {
585 JsonArray array =
new JsonArray();
586 player.runePouch.runes.forEach(rune -> {
587 JsonObject
object =
new JsonObject();
588 object.addProperty(
"id", rune.getId());
589 object.addProperty(
"amount", rune.getAmount());
596 new PlayerJSONProperty(
"run-toggled") {
598 void read(
Player player, JsonElement property) {
599 player.movement.setRunningToggled(property.getAsBoolean());
603 Object write(
Player player) {
604 return player.movement.isRunningToggled();
608 new PlayerJSONProperty(
"run-energy") {
610 void read(
Player player, JsonElement property) {
611 player.runEnergy =
property.getAsInt();
615 Object write(
Player player) {
616 return player.runEnergy;
620 new PlayerJSONProperty(
"energy-rate") {
622 void read(
Player player, JsonElement property) {
623 player.energyRate =
property.getAsInt();
627 Object write(
Player player) {
628 return player.energyRate;
632 new PlayerJSONProperty(
"special-amount") {
634 void read(
Player player, JsonElement property) {
635 player.getSpecialPercentage().set(property.getAsInt());
639 Object write(
Player player) {
640 return player.getSpecialPercentage().get();
644 new PlayerJSONProperty(
"recoil-charge") {
646 void read(
Player player, JsonElement property) {
647 player.ringOfRecoil =
property.getAsInt();
651 Object write(
Player player) {
652 return player.ringOfRecoil;
656 new PlayerJSONProperty(
"whip-charge") {
658 void read(
Player player, JsonElement property) {
659 player.whipCharges =
property.getAsInt();
663 Object write(
Player player) {
664 return player.whipCharges;
667 new PlayerJSONProperty(
"ags-charge") {
669 void read(
Player player, JsonElement property) {
670 player.agsCharges =
property.getAsInt();
674 Object write(
Player player) {
675 return player.agsCharges;
679 new PlayerJSONProperty(
"dragonfire-shield-charge") {
681 void read(
Player player, JsonElement property) {
682 player.dragonfireCharges =
property.getAsInt();
686 Object write(
Player player) {
687 return player.dragonfireCharges;
691 new PlayerJSONProperty(
"dragonfire-shield-cooldown") {
693 void read(
Player player, JsonElement property) {
694 player.dragonfireUsed =
property.getAsLong();
698 Object write(
Player player) {
699 return player.dragonfireUsed;
703 new PlayerJSONProperty(
"blowpipe-darts") {
705 void read(
Player player, JsonElement property) {
706 player.blowpipeDarts = gson().fromJson(property, Item.class);
710 Object write(
Player player) {
711 return player.blowpipeDarts;
715 new PlayerJSONProperty(
"blowpipe-scales") {
717 void read(
Player player, JsonElement property) {
718 player.blowpipeScales =
property.getAsFloat();
722 Object write(
Player player) {
723 return player.blowpipeScales;
727 new PlayerJSONProperty(
"serpentine-helm") {
729 void read(
Player player, JsonElement property) {
730 player.serpentineHelmCharges =
property.getAsInt();
734 Object write(
Player player) {
735 return player.serpentineHelmCharges;
739 new PlayerJSONProperty(
"tanzanite-helm") {
741 void read(
Player player, JsonElement property) {
742 player.tanzaniteHelmCharges =
property.getAsInt();
746 Object write(
Player player) {
747 return player.tanzaniteHelmCharges;
751 new PlayerJSONProperty(
"magma-helm") {
753 void read(
Player player, JsonElement property) {
754 player.magmaHelmCharges =
property.getAsInt();
758 Object write(
Player player) {
759 return player.magmaHelmCharges;
763 new PlayerJSONProperty(
"trident-seas-charges") {
765 void read(
Player player, JsonElement property) {
766 player.tridentSeasCharges =
property.getAsInt();
770 Object write(
Player player) {
771 return player.tridentSeasCharges;
775 new PlayerJSONProperty(
"trident-swamp-charges") {
777 void read(
Player player, JsonElement property) {
778 player.tridentSwampCharges =
property.getAsInt();
782 Object write(
Player player) {
783 return player.tridentSwampCharges;
787 new PlayerJSONProperty(
"fight-type") {
789 void read(
Player player, JsonElement property) {
790 player.getCombat().setFightType(gson().fromJson(property,
FightType.class));
794 Object write(
Player player) {
795 return player.getCombat().getFightType();
799 new PlayerJSONProperty(
"client-width") {
801 void read(
Player player, JsonElement property) {
802 player.settings.clientWidth =
property.getAsInt();
806 Object write(
Player player) {
807 return player.settings.clientWidth;
811 new PlayerJSONProperty(
"client-height") {
813 void read(
Player player, JsonElement property) {
814 player.settings.clientHeight =
property.getAsInt();
818 Object write(
Player player) {
819 return player.settings.clientHeight;
823 new PlayerJSONProperty(
"spell-book") {
825 void read(
Player player, JsonElement property) {
826 player.spellbook = gson().fromJson(property,
Spellbook.class);
830 Object write(
Player player) {
831 return player.spellbook;
835 new PlayerJSONProperty(
"auto-cast") {
837 void read(
Player player, JsonElement property) {
838 player.setAutocast(gson().fromJson(property,
CombatSpell.class));
842 Object write(
Player player) {
843 return player.autocast;
847 new PlayerJSONProperty(
"brightness") {
849 void read(
Player player, JsonElement property) {
850 player.settings.setBrightness(property.getAsInt());
854 Object write(
Player player) {
855 return player.settings.brightness;
859 new PlayerJSONProperty(
"zoom") {
861 void read(
Player player, JsonElement property) {
862 player.settings.setZoom(property.getAsInt(),
true);
866 Object write(
Player player) {
867 return player.settings.zoom;
871 new PlayerJSONProperty(
"private-chat") {
873 void read(
Player player, JsonElement property) {
874 player.settings.privateChat =
property.getAsBoolean();
878 Object write(
Player player) {
879 return player.settings.privateChat;
883 new PlayerJSONProperty(
"chat-effects") {
885 void read(
Player player, JsonElement property) {
886 player.settings.chatEffects =
property.getAsBoolean();
890 Object write(
Player player) {
891 return player.settings.chatEffects;
895 new PlayerJSONProperty(
"accept-aid") {
897 void read(
Player player, JsonElement property) {
898 player.settings.acceptAid =
property.getAsBoolean();
902 Object write(
Player player) {
903 return player.settings.acceptAid;
907 new PlayerJSONProperty(
"mouse-clicks") {
909 void read(
Player player, JsonElement property) {
910 player.settings.mouse =
property.getAsBoolean();
914 Object write(
Player player) {
915 return player.settings.mouse;
919 new PlayerJSONProperty(
"auto-retaliate") {
921 void read(
Player player, JsonElement property) {
922 player.settings.autoRetaliate =
property.getAsBoolean();
926 Object write(
Player player) {
927 return player.settings.autoRetaliate;
931 new PlayerJSONProperty(
"profanity-filter") {
933 void read(
Player player, JsonElement property) {
934 player.settings.profanityFilter =
property.getAsBoolean();
938 Object write(
Player player) {
939 return player.settings.profanityFilter;
943 new PlayerJSONProperty(
"camera-movement") {
945 void read(
Player player, JsonElement property) {
946 player.settings.cameraMovement =
property.getAsBoolean();
950 Object write(
Player player) {
951 return player.settings.cameraMovement;
955 new PlayerJSONProperty(
"experience-lock") {
957 void read(
Player player, JsonElement property) {
958 player.settings.lockExperience =
property.getAsBoolean();
962 Object write(
Player player) {
963 return player.settings.lockExperience;
967 new PlayerJSONProperty(
"welcome-screen") {
969 void read(
Player player, JsonElement property) {
970 player.settings.welcomeScreen =
property.getAsBoolean();
974 Object write(
Player player) {
975 return player.settings.welcomeScreen;
979 new PlayerJSONProperty(
"screenshot-kill") {
981 void read(
Player player, JsonElement property) {
982 player.settings.screenshotKill =
property.getAsBoolean();
986 Object write(
Player player) {
987 return player.settings.screenshotKill;
991 new PlayerJSONProperty(
"trivia-bot") {
993 void read(
Player player, JsonElement property) {
994 player.settings.triviaBot =
property.getAsBoolean();
998 Object write(
Player player) {
999 return player.settings.triviaBot;
1003 new PlayerJSONProperty(
"drop-notification") {
1005 void read(
Player player, JsonElement property) {
1006 player.settings.dropNotification =
property.getAsBoolean();
1010 Object write(
Player player) {
1011 return player.settings.dropNotification;
1015 new PlayerJSONProperty(
"yell-notification") {
1017 void read(
Player player, JsonElement property) {
1018 player.settings.yell =
property.getAsBoolean();
1022 Object write(
Player player) {
1023 return player.settings.yell;
1027 new PlayerJSONProperty(
"untradeable-notification") {
1029 void read(
Player player, JsonElement property) {
1030 player.settings.untradeableNotification =
property.getAsBoolean();
1034 Object write(
Player player) {
1035 return player.settings.untradeableNotification;
1039 new PlayerJSONProperty(
"esc-close") {
1041 void read(
Player player, JsonElement property) {
1042 player.settings.ESC_CLOSE =
property.getAsBoolean();
1046 Object write(
Player player) {
1047 return player.settings.ESC_CLOSE;
1051 new PlayerJSONProperty(
"gloves-tier") {
1053 void read(
Player player, JsonElement property) {
1054 player.glovesTier =
property.getAsInt();
1058 Object write(
Player player) {
1059 return player.glovesTier;
1063 new PlayerJSONProperty(
"experience-rate") {
1065 void read(
Player player, JsonElement property) {
1066 player.experienceRate =
property.getAsDouble();
1070 Object write(
Player player) {
1071 return player.experienceRate;
1075 new PlayerJSONProperty(
"experience-counter") {
1077 void read(
Player player, JsonElement property) {
1078 player.skills.experienceCounter =
property.getAsDouble();
1082 Object write(
Player player) {
1083 return player.skills.experienceCounter;
1087 new PlayerJSONProperty(
"preset-death-open") {
1089 void read(
Player player, JsonElement property) {
1090 player.presetManager.deathOpen =
property.getAsBoolean();
1094 Object write(
Player player) {
1095 return player.presetManager.deathOpen;
1099 new PlayerJSONProperty(
"preset-death-open") {
1101 void read(
Player player, JsonElement property) {
1102 player.presetManager.deathOpen =
property.getAsBoolean();
1106 Object write(
Player player) {
1107 return player.presetManager.deathOpen;
1111 new PlayerJSONProperty(
"preset-automatic-deposit") {
1113 void read(
Player player, JsonElement property) {
1114 player.presetManager.autoDeposit =
property.getAsBoolean();
1118 Object write(
Player player) {
1119 return player.presetManager.autoDeposit;
1123 new PlayerJSONProperty(
"hidden-brother") {
1125 void read(
Player player, JsonElement property) {
1126 player.hiddenBrother = gson().fromJson(property,
BrotherData.class);
1130 Object write(
Player player) {
1131 return player.hiddenBrother;
1135 new PlayerJSONProperty(
"brothers-kill-count") {
1137 void read(
Player player, JsonElement property) {
1138 player.barrowsKillCount =
property.getAsInt();
1142 Object write(
Player player) {
1143 return player.barrowsKillCount;
1147 new PlayerJSONProperty(
"brothers-dead") {
1149 void read(
Player player, JsonElement property) {
1150 player.barrowKills = gson().fromJson(property,
boolean[].
class);
1154 Object write(
Player player) {
1155 return player.barrowKills;
1159 new PlayerJSONProperty(
"vote-points") {
1161 void read(
Player player, JsonElement property) {
1162 player.votePoints =
property.getAsInt();
1166 Object write(
Player player) {
1167 return player.votePoints;
1171 new PlayerJSONProperty(
"total-votes") {
1173 void read(
Player player, JsonElement property) {
1174 player.totalVotes =
property.getAsInt();
1178 Object write(
Player player) {
1179 return player.totalVotes;
1183 new PlayerJSONProperty(
"completed-magearena") {
1185 void read(
Player player, JsonElement property) {
1186 player.completedMageArena =
property.getAsBoolean();
1190 Object write(
Player player) {
1191 return player.completedMageArena;
1195 new PlayerJSONProperty(
"magearena-points") {
1197 void read(
Player player, JsonElement property) {
1198 player.mageArenaPoints =
property.getAsInt();
1202 Object write(
Player player) {
1203 return player.mageArenaPoints;
1207 new PlayerJSONProperty(
"poison-immunity") {
1209 void read(
Player player, JsonElement property) {
1210 player.getPoisonImmunity().set(property.getAsInt());
1214 Object write(
Player player) {
1215 return player.getPoisonImmunity().get();
1219 new PlayerJSONProperty(
"venom-immunity") {
1221 void read(
Player player, JsonElement property) {
1222 player.getVenomImmunity().set(property.getAsInt());
1226 Object write(
Player player) {
1227 return player.getVenomImmunity().get();
1231 new PlayerJSONProperty(
"skull-timer") {
1233 void read(
Player player, JsonElement property) {
1234 player.skulling.getSkullRemoveTask().setSkullTime(property.getAsInt());
1238 Object write(
Player player) {
1239 return player.skulling.getSkullRemoveTask().getSkullTime();
1243 new PlayerJSONProperty(
"teleblock-timer") {
1245 void read(
Player player, JsonElement property) {
1246 player.teleblockTimer.set(property.getAsInt());
1250 Object write(
Player player) {
1251 return player.teleblockTimer.get();
1255 new PlayerJSONProperty(
"prestige-points") {
1257 void read(
Player player, JsonElement property) {
1258 player.prestige.setPrestigePoint(property.getAsInt());
1262 Object write(
Player player) {
1263 return player.prestige.getPrestigePoint();
1267 new PlayerJSONProperty(
"prestige-total") {
1269 void read(
Player player, JsonElement property) {
1270 player.prestige.totalPrestige =
property.getAsInt();
1274 Object write(
Player player) {
1275 return player.prestige.totalPrestige;
1279 new PlayerJSONProperty(
"prestige-color") {
1281 void read(
Player player, JsonElement property) {
1282 player.settings.prestigeColors =
property.getAsBoolean();
1286 Object write(
Player player) {
1287 return player.settings.prestigeColors;
1291 new PlayerJSONProperty(
"prestiges") {
1293 void read(
Player player, JsonElement property) {
1294 player.prestige.prestige = gson().fromJson(property,
int[].
class);
1298 Object write(
Player player) {
1299 return player.prestige.prestige;
1303 new PlayerJSONProperty(
"active-perks") {
1305 void read(
Player player, JsonElement property) {
1306 JsonArray array =
property.getAsJsonArray();
1307 array.forEach(e -> {
1310 player.prestige.activePerks.add(perk);
1311 }
catch (IllegalArgumentException ignored) {}
1316 Object write(
Player player) {
1317 JsonArray array =
new JsonArray();
1318 player.prestige.activePerks.forEach(key -> array.add(key.name));
1323 new PlayerJSONProperty(
"achievements") {
1325 void read(
Player player, JsonElement property) {
1326 JsonObject obj =
property.getAsJsonObject();
1327 for (Entry<String, JsonElement> entry : obj.entrySet()) {
1328 final String prop = entry.getKey();
1331 int val = obj.get(prop).getAsInt();
1332 player.playerAchievements.put(key, val);
1333 }
catch (IllegalArgumentException ignored) {}
1338 Object write(
Player player) {
1339 JsonObject array =
new JsonObject();
1340 player.playerAchievements.forEach((key, val) -> array.addProperty(key.name(), val));
1345 new PlayerJSONProperty(
"last-killed") {
1347 void read(
Player player, JsonElement property) {
1348 JsonArray array =
property.getAsJsonArray();
1349 array.forEach(e -> player.lastKilled.add(e.getAsString()));
1353 Object write(
Player player) {
1354 JsonArray achievements =
new JsonArray();
1355 player.lastKilled.forEach(achievements::add);
1356 return achievements;
1360 new PlayerJSONProperty(
"favorite-teleport") {
1362 void read(
Player player, JsonElement property) {
1363 JsonArray array =
property.getAsJsonArray();
1364 array.forEach(e -> {
1367 player.favoriteTeleport.add(key);
1368 }
catch (IllegalArgumentException ignored) {}
1373 Object write(
Player player) {
1374 JsonArray array =
new JsonArray();
1375 player.favoriteTeleport.forEach(t -> array.add(t.name()));
1380 new PlayerJSONProperty(
"unlocked-emotes") {
1382 void read(
Player player, JsonElement property) {
1383 JsonArray array =
property.getAsJsonArray();
1384 array.forEach(e -> {
1387 player.emoteUnlockable.add(key);
1388 }
catch (IllegalArgumentException ignored) {}
1393 Object write(
Player player) {
1394 JsonArray array =
new JsonArray();
1395 player.emoteUnlockable.forEach(e -> array.add(e.name()));
1400 new PlayerJSONProperty(
"public-chat-mode") {
1402 void read(
Player player, JsonElement property) {
1403 player.relations.setPublicChatMode(
PrivacyChatMode.valueOf(gson().fromJson(property, String.class).toUpperCase()),
false);
1407 Object write(
Player player) {
1408 return player.relations.getPublicChatMode().name();
1412 new PlayerJSONProperty(
"private-chat-mode") {
1414 void read(
Player player, JsonElement property) {
1415 player.relations.setPrivateChatMode(
PrivacyChatMode.valueOf(gson().fromJson(property, String.class).toUpperCase()),
true);
1419 Object write(
Player player) {
1420 return player.relations.getPrivateChatMode().name();
1424 new PlayerJSONProperty(
"clan-chat-mode") {
1426 void read(
Player player, JsonElement property) {
1427 player.relations.setClanChatMode(
PrivacyChatMode.valueOf(gson().fromJson(property, String.class).toUpperCase()),
false);
1431 Object write(
Player player) {
1432 return player.relations.getClanChatMode().name();
1436 new PlayerJSONProperty(
"trade-chat-mode") {
1438 void read(
Player player, JsonElement property) {
1439 player.relations.setTradeChatMode(
PrivacyChatMode.valueOf(gson().fromJson(property, String.class).toUpperCase()),
false);
1443 Object write(
Player player) {
1444 return player.relations.getTradeChatMode().name();
1448 new PlayerJSONProperty(
"friend-list") {
1450 void read(
Player player, JsonElement property) {
1451 player.relations.getFriendList().addAll(gson().fromJson(property,
new TypeToken<List<Long>>() {
1456 Object write(
Player player) {
1457 return player.relations.getFriendList();
1461 new PlayerJSONProperty(
"ignore-list") {
1463 void read(
Player player, JsonElement property) {
1464 player.relations.getIgnoreList().addAll(gson().fromJson(property,
new TypeToken<List<Long>>() {
1469 Object write(
Player player) {
1470 return player.relations.getIgnoreList();
1474 new PlayerJSONProperty(
"appearance") {
1476 void read(
Player player, JsonElement property) {
1477 player.appearance = gson().fromJson(property,
Appearance.class);
1481 Object write(
Player player) {
1482 return player.appearance;
1486 new PlayerJSONProperty(
"preset") {
1488 void read(
Player player, JsonElement property) {
1489 Preset[] loaded = gson().fromJson(property,
Preset[].
class);
1490 for (
int idx = 0; idx < loaded.length; idx++) {
1491 player.presetManager.preset[idx] = loaded[idx];
1496 Object write(
Player player) {
1497 return player.presetManager.preset;
1501 new PlayerJSONProperty(
"activity-logger") {
1503 void read(
Player player, JsonElement property) {
1504 JsonObject obj =
property.getAsJsonObject();
1505 for (Entry<String, JsonElement> entry : obj.entrySet()) {
1506 final String prop = entry.getKey();
1509 int val = obj.get(prop).getAsInt();
1510 player.loggedActivities.put(key, val);
1511 }
catch (IllegalArgumentException ignored) {}
1516 Object write(
Player player) {
1517 JsonObject
object =
new JsonObject();
1518 player.loggedActivities.forEach((key, val) ->
object.addProperty(key.name(), val));
1523 new PlayerJSONProperty(
"quick-prayers") {
1525 void read(
Player player, JsonElement property) {
1526 player.quickPrayers = gson().fromJson(property,
PrayerBook.class);
1530 Object write(
Player player) {
1531 return player.quickPrayers;
1535 new PlayerJSONProperty(
"locked-prayers") {
1537 void read(
Player player, JsonElement property) {
1538 JsonArray array =
property.getAsJsonArray();
1539 array.forEach(e -> {
1542 player.unlockedPrayers.add(prayer);
1543 }
catch (IllegalArgumentException ignored) {}
1548 Object write(
Player player) {
1549 JsonArray array =
new JsonArray();
1550 player.unlockedPrayers.forEach(e -> array.add(e.name()));
1555 new PlayerJSONProperty(
"slayer-points") {
1557 void read(
Player player, JsonElement property) {
1558 player.slayer.setPoints(property.getAsInt());
1562 Object write(
Player player) {
1563 return player.slayer.getPoints();
1567 new PlayerJSONProperty(
"slayer-task") {
1569 void read(
Player player, JsonElement property) {
1570 player.slayer.setTask(gson().fromJson(property,
SlayerTask.class));
1574 Object write(
Player player) {
1575 return player.slayer.getTask();
1579 new PlayerJSONProperty(
"slayer-assigned") {
1581 void read(
Player player, JsonElement property) {
1582 player.slayer.setAssigned(property.getAsInt());
1586 Object write(
Player player) {
1587 return player.slayer.getAssigned();
1591 new PlayerJSONProperty(
"slayer-amount") {
1593 void read(
Player player, JsonElement property) {
1594 player.slayer.setAmount(property.getAsInt());
1598 Object write(
Player player) {
1599 return player.slayer.getAmount();
1603 new PlayerJSONProperty(
"slayer-total-assigned") {
1605 void read(
Player player, JsonElement property) {
1606 player.slayer.setTotalAssigned(property.getAsInt());
1610 Object write(
Player player) {
1611 return player.slayer.getTotalAssigned();
1615 new PlayerJSONProperty(
"slayer-total-completed") {
1617 void read(
Player player, JsonElement property) {
1618 player.slayer.setTotalCompleted(property.getAsInt());
1622 Object write(
Player player) {
1623 return player.slayer.getTotalCompleted();
1627 new PlayerJSONProperty(
"slayer-total-cancelled") {
1629 void read(
Player player, JsonElement property) {
1630 player.slayer.setTotalCancelled(property.getAsInt());
1634 Object write(
Player player) {
1635 return player.slayer.getTotalCancelled();
1639 new PlayerJSONProperty(
"slayer-total-points") {
1641 void read(
Player player, JsonElement property) {
1642 player.slayer.setTotalPoints(property.getAsInt());
1646 Object write(
Player player) {
1647 return player.slayer.getTotalPoints();
1651 new PlayerJSONProperty(
"slayer-blocked") {
1653 void read(
Player player, JsonElement property) {
1654 JsonArray array =
property.getAsJsonArray();
1655 array.forEach(e -> {
1658 player.slayer.getBlocked().add(key);
1659 }
catch (IllegalArgumentException ignored) {}
1664 Object write(
Player player) {
1665 JsonArray array =
new JsonArray();
1666 player.slayer.getBlocked().forEach(e -> array.add(e.name()));
1671 new PlayerJSONProperty(
"slayer-unlocked") {
1673 void read(
Player player, JsonElement property) {
1674 JsonArray array =
property.getAsJsonArray();
1675 array.forEach(e -> {
1678 player.slayer.getUnlocked().add(key);
1679 }
catch (IllegalArgumentException ignored) {}
1684 Object write(
Player player) {
1685 JsonArray array =
new JsonArray();
1686 player.slayer.getUnlocked().forEach(e -> array.add(e.name()));
1691 new PlayerJSONProperty(
"tab-amounts") {
1693 void read(
Player player, JsonElement property) {
1694 player.bank.tabAmounts = gson().fromJson(property,
int[].
class);
1698 Object write(
Player player) {
1699 return player.bank.tabAmounts;
1703 new PlayerJSONProperty(
"looting-bag") {
1705 void read(
Player player, JsonElement property) {
1706 player.lootingBag.set(gson().fromJson(property, Item[].
class));
1710 Object write(
Player player) {
1711 return player.lootingBag.getItems();
1715 new PlayerJSONProperty(
"lost-items") {
1717 void read(
Player player, JsonElement property) {
1718 player.lostItems = (gson().fromJson(property,
new TypeToken<LinkedList<Item>>() {
1723 Object write(
Player player) {
1724 return player.lostItems;
1728 new PlayerJSONProperty(
"lost-untradables") {
1730 void read(
Player player, JsonElement property) {
1731 player.lostUntradeables.set(gson().fromJson(property, Item[].
class));
1735 Object write(
Player player) {
1736 return player.lostUntradeables.getItems();
1740 new PlayerJSONProperty(
"duel-rules") {
1742 void read(
Player player, JsonElement property) {
1743 if (property.isJsonNull()) {
1746 Type ruleSet =
new TypeToken<EnumSet<DuelRule>>() {
1750 player.attributes.put(
"duel_rules", gson().fromJson(property, ruleSet));
1754 Object write(
Player player) {
1755 if (player.attributes.has(
"duel_rules")) {
1756 return player.attributes.<String, EnumSet<DuelRule>>
get(
"duel_rules");
1762 new PlayerJSONProperty(
"daily-spell-book-swap") {
1764 void read(
Player player, JsonElement property) {
1769 Object write(
Player player) {
1770 return player.dailySpellBookSwap;
1774 new PlayerJSONProperty(
"daily-slayer-task-skip") {
1776 void read(
Player player, JsonElement property) {
1781 Object write(
Player player) {
1782 return player.dailySlayerTaskSkip;
1786 new PlayerJSONProperty(
"daily-slayer-task-teleport") {
1788 void read(
Player player, JsonElement property) {
1793 Object write(
Player player) {
1794 return player.dailySlayerTaskTeleport;
1802 void read(
Player player, JdbcSession session)
throws SQLException {
1803 session.sql(
"SELECT member_id, data FROM player.player WHERE member_id = ?")
1804 .set(player.getMemberId())
1805 .select((rset, stmt) -> {
1807 player.setMemberId(rset.getInt(
"member_id"));
1809 final JsonParser parser =
new JsonParser();
1811 final JsonObject obj = parser.parse(rset.getString(
"data")).getAsJsonObject();
1813 for (PlayerJSONProperty property : PROPERTIES) {
1814 if (obj.has(property.label)) {
1815 if (obj.get(property.label).isJsonNull()) {
1818 property.read(player, obj.get(property.label));
1830 void write(
Player player, JdbcSession session)
throws SQLException {
1831 final JsonObject properties =
new JsonObject();
1833 for (PlayerJSONProperty property : PROPERTIES) {
1834 properties.add(property.label, gson().toJsonTree(property.write(player)));
1838 .sql(
"INSERT INTO player.player(member_id, data) VALUES (?, ?::json) ON CONFLICT (member_id) DO UPDATE SET data = excluded.data, last_save = DEFAULT")
1839 .set(player.getMemberId())
1840 .set(gson().toJson(properties))
1847 void read(
Player player, JdbcSession session)
throws SQLException {
1848 session.sql(
"SELECT host, time FROM player.host where player_id = ? ORDER BY time LIMIT 1")
1849 .set(player.getMemberId())
1850 .select((rset, stmt) -> {
1852 player.lastHost = rset.getString(
"host");
1859 void write(
Player player, JdbcSession session)
throws SQLException {
1860 if (!player.getSession().isPresent()) {
1863 session.sql(
"INSERT INTO player.host(host, player_id) VALUES (?, ?)")
1864 .set(player.getSession().get().getHost())
1865 .set(player.getMemberId())
1872 void read(
Player player, JdbcSession session)
throws SQLException {
1873 session.sql(
"SELECT id, current_level, xp, player_id FROM player.skill WHERE player_id = ?")
1874 .set(player.getMemberId())
1875 .select((rset, stmt) -> {
1879 while (rset.next()) {
1880 final int skillId = rset.getInt(
"id");
1881 skills[skillId] =
new Skill(skillId, rset.getInt(
"current_level"), rset.getDouble(
"xp"));
1884 player.skills.setSkills(skills);
1890 void write(
Player player, JdbcSession session)
throws SQLException {
1891 for (
Skill skill : player.skills.getSkills()) {
1892 session.sql(
"INSERT INTO player.skill(id, current_level, xp, player_id) VALUES (?, ?, ?::double precision, ?) ON CONFLICT (id, player_id) DO UPDATE SET current_level = excluded.current_level, xp = excluded.xp")
1893 .set(skill.getSkill())
1894 .set(skill.getLevel())
1895 .set(skill.getExperience())
1896 .set(player.getMemberId())
1904 void read(
Player player, JdbcSession session)
throws SQLException {
1907 session.sql(
"SELECT item_id, amount, slot FROM player.bank WHERE player_id = ? AND item_id IS NOT NULL ORDER BY slot")
1908 .set(player.getMemberId())
1909 .select((rset, stmt) -> {
1910 while (rset.next()) {
1911 Item item =
new Item(rset.getInt(
"item_id"), rset.getInt(
"amount"));
1912 player.bank.add(item, rset.getInt(
"slot"));
1918 session.sql(
"SELECT item_id, amount, slot FROM player.equipment WHERE player_id = ?")
1919 .set(player.getMemberId())
1920 .select((rset, stmt) -> {
1921 while (rset.next()) {
1922 player.equipment.set(rset.getInt(
"slot"),
new Item(rset.getInt(
"item_id"), rset.getInt(
"amount")),
false);
1924 player.equipment.refresh();
1929 session.sql(
"SELECT item_id, amount, slot FROM player.inventory WHERE player_id = ?")
1930 .set(player.getMemberId())
1931 .select((rset, stmt) -> {
1932 while (rset.next()) {
1933 Item item =
new Item(rset.getInt(
"item_id"), rset.getInt(
"amount"));
1934 player.inventory.add(item, rset.getInt(
"slot"));
1942 void write(
Player player, JdbcSession session)
throws SQLException {
1944 session.sql(
"DELETE FROM player.bank WHERE player_id = ?")
1945 .set(player.getMemberId())
1948 for (
int slot = 0; slot < player.bank.getItems().length; slot++) {
1949 final Item item = player.bank.getItems()[slot];
1955 session.sql(
"INSERT INTO player.bank(item_id, amount, slot, player_id) VALUES (?, ?, ?, ?) ON CONFLICT (slot, player_id) DO UPDATE SET item_id = excluded.item_id, amount = excluded.amount")
1957 .set(item.getAmount())
1959 .set(player.getMemberId())
1965 session.sql(
"DELETE FROM player.equipment WHERE player_id = ?")
1966 .set(player.getMemberId())
1969 for (
int slot = 0; slot < player.equipment.getItems().length; slot++) {
1970 Item item = player.equipment.get(slot);
1976 session.sql(
"INSERT INTO player.equipment(item_id, amount, slot, player_id) VALUES (?, ?, ?, ?) ON CONFLICT (slot, player_id) DO UPDATE SET item_id = excluded.item_id, amount = excluded.amount")
1978 .set(item.getAmount())
1980 .set(player.getMemberId())
1986 session.sql(
"DELETE FROM player.inventory WHERE player_id = ?")
1987 .set(player.getMemberId())
1990 for (
int slot = 0; slot < player.inventory.getItems().length; slot++) {
1991 Item item = player.inventory.getItems()[slot];
1997 session.sql(
"INSERT INTO player.inventory(item_id, amount, slot, player_id) VALUES (?, ?, ?, ?)")
1999 .set(item.getAmount())
2001 .set(player.getMemberId())
2010 public void save(
Player player) {
2019 JdbcSession session =
new JdbcSession(
PostgreService.getConnectionPool())
2021 property.write(player, session);
2023 }
catch (SQLException ex) {
2024 logger.error(String.format(
"Failed to save property=%s for player=%s", property.getName(), player.getName()), ex);
2029 player.saved.set(
true);
2035 final JdbcSession session =
new JdbcSession(
PostgreService.getConnectionPool());
2037 boolean exists = session.sql(
"SELECT EXISTS(SELECT 1 FROM player.player WHERE member_id = ?)")
2038 .set(player.getMemberId())
2039 .select(
new SingleOutcome<>(Boolean.class));
2042 player.newPlayer =
true;
2043 player.needsStarter =
true;
2047 }
catch (SQLException ex) {
2048 logger.error(String.format(
"Failed to login new player=%s", player.getName()), ex);
2053 final JdbcSession session =
new JdbcSession(
PostgreService.getConnectionPool())
2057 property.read(player, session);
2061 }
catch (SQLException ex) {
2062 logger.error(String.format(
"Error loading player=%s", player.getName()), ex);