RuneHive-Game
Loading...
Searching...
No Matches
PlayerPersistDB.java
Go to the documentation of this file.
1package com.runehive.game.world.entity.mob.player.persist;
2
3import com.google.gson.*;
4import com.google.gson.reflect.TypeToken;
5import com.jcabi.jdbc.JdbcSession;
6import com.jcabi.jdbc.SingleOutcome;
7import com.runehive.Config;
8import com.runehive.content.ActivityLog;
9import com.runehive.content.achievement.AchievementKey;
10import com.runehive.content.activity.impl.barrows.BrotherData;
11import com.runehive.content.activity.impl.duelarena.DuelRule;
12import com.runehive.content.clanchannel.ClanRepository;
13import com.runehive.content.clanchannel.channel.ClanChannel;
14import com.runehive.content.clanchannel.content.ClanMemberComporator;
15import com.runehive.content.dailyeffect.impl.DailySlayerTaskSkip;
16import com.runehive.content.dailyeffect.impl.DailySlayerTaskTeleport;
17import com.runehive.content.dailyeffect.impl.DailySpellBookSwap;
18import com.runehive.content.emote.EmoteUnlockable;
19import com.runehive.content.pet.PetData;
20import com.runehive.content.preset.Preset;
21import com.runehive.content.prestige.PrestigePerk;
22import com.runehive.content.skill.impl.magic.Spellbook;
23import com.runehive.content.skill.impl.slayer.SlayerTask;
24import com.runehive.content.skill.impl.slayer.SlayerUnlockable;
25import com.runehive.content.teleport.Teleport;
26import com.runehive.content.tittle.PlayerTitle;
27import com.runehive.game.service.HighscoreService;
28import com.runehive.game.service.PostgreService;
29import com.runehive.game.world.entity.combat.attack.FightType;
30import com.runehive.game.world.entity.combat.magic.CombatSpell;
31import com.runehive.game.world.entity.mob.npc.Npc;
32import com.runehive.game.world.entity.mob.player.Player;
33import com.runehive.game.world.entity.mob.player.PlayerRight;
34import com.runehive.game.world.entity.mob.player.appearance.Appearance;
35import com.runehive.game.world.entity.mob.player.relations.PrivacyChatMode;
36import com.runehive.game.world.entity.mob.prayer.Prayer;
37import com.runehive.game.world.entity.mob.prayer.PrayerBook;
38import com.runehive.game.world.entity.skill.Skill;
39import com.runehive.game.world.items.Item;
40import com.runehive.game.world.position.Position;
41import com.runehive.net.codec.login.LoginResponse;
42import com.runehive.util.Utility;
43import org.apache.logging.log4j.LogManager;
44import org.apache.logging.log4j.Logger;
45
46import java.lang.reflect.Type;
47import java.sql.SQLException;
48import java.util.EnumSet;
49import java.util.LinkedList;
50import java.util.List;
51import java.util.Map.Entry;
52
53import static com.runehive.util.GsonUtils.JSON_PRETTY_ALLOW_NULL;
54
55public final class PlayerPersistDB implements PlayerPersistable {
56
57 private static final Logger logger = LogManager.getLogger(PlayerPersistDB.class);
58
59 private static Gson gson() {
60 return JSON_PRETTY_ALLOW_NULL.get();
61 }
62
63 private static final PlayerJSONProperty[] PROPERTIES = {
64
65 new PlayerJSONProperty("username") {
66 @Override
67 void read(Player player, JsonElement property) {
68 player.setUsername(property.getAsString());
69 }
70
71 @Override
72 Object write(Player player) {
73 return player.getUsername();
74 }
75 },
76
77 new PlayerJSONProperty("password") {
78 @Override
79 void read(Player player, JsonElement property) {
80 player.setPassword(property.getAsString());
81 }
82
83 @Override
84 Object write(Player player) {
85 return player.getPassword();
86 }
87 },
88
89 new PlayerJSONProperty("player-rights") {
90 @Override
91 void read(Player player, JsonElement property) {
92 player.right = gson().fromJson(property, PlayerRight.class);
93 }
94
95 @Override
96 Object write(Player player) {
97 return player.right;
98 }
99 },
100
101 new PlayerJSONProperty("position") {
102 @Override
103 void read(Player player, JsonElement property) {
104 final Position position = gson().fromJson(property, Position.class);
105 final int height = position.getHeight() < 0 ? 0 : position.getHeight() % 4;
106 player.setPosition(Position.create(position.getX(), position.getY(), height));
107 }
108
109 @Override
110 Object write(Player player) {
111 return player.getPosition();
112 }
113 },
114
115 new PlayerJSONProperty("created") {
116 @Override
117 void read(Player player, JsonElement property) {
118 player.created = property.getAsString();
119 }
120
121 @Override
122 Object write(Player player) {
123 if (player.created == null)
124 return Utility.getDate();
125 return player.created;
126 }
127 },
128
129 new PlayerJSONProperty("play-time") {
130 @Override
131 void read(Player player, JsonElement property) {
132 player.playTime = property.getAsInt();
133 }
134
135 @Override
136 Object write(Player player) {
137 return player.playTime;
138 }
139 },
140
141 new PlayerJSONProperty("money-spent") {
142 @Override
143 void read(Player player, JsonElement property) {
144 player.donation.setSpent(property.getAsInt());
145 }
146
147 @Override
148 Object write(Player player) {
149 return player.donation.getSpent();
150 }
151 },
152
153 new PlayerJSONProperty("donation-credits") {
154 @Override
155 void read(Player player, JsonElement property) {
156 player.donation.setCredits(property.getAsInt());
157 }
158
159 @Override
160 Object write(Player player) {
161 return player.donation.getCredits();
162 }
163 },
164
165 new PlayerJSONProperty("skilling-points") {
166 @Override
167 void read(Player player, JsonElement property) {
168 player.skillingPoints = property.getAsInt();
169 }
170
171 @Override
172 Object write(Player player) {
173 return player.skillingPoints;
174 }
175 },
176
177
178 new PlayerJSONProperty("pest-points") {
179 @Override
180 void read(Player player, JsonElement property) {
181 player.pestPoints = property.getAsInt();
182 }
183
184 @Override
185 Object write(Player player) {
186 return player.pestPoints;
187 }
188 },
189
190 new PlayerJSONProperty("mute-start") {
191 @Override
192 void read(Player player, JsonElement property) {
193 player.punishment.muteStart = property.getAsLong();
194 }
195
196 @Override
197 Object write(Player player) {
198 return player.punishment.muteStart;
199 }
200 },
201
202 new PlayerJSONProperty("mute-duration") {
203 @Override
204 void read(Player player, JsonElement property) {
205 player.punishment.muteDuration = property.getAsLong();
206 }
207
208 @Override
209 Object write(Player player) {
210 return player.punishment.muteDuration;
211 }
212 },
213
214 new PlayerJSONProperty("jail-start") {
215 @Override
216 void read(Player player, JsonElement property) {
217 player.punishment.jailStart = property.getAsLong();
218 }
219
220 @Override
221 Object write(Player player) {
222 return player.punishment.jailStart;
223 }
224 },
225
226 new PlayerJSONProperty("jail-duration") {
227 @Override
228 void read(Player player, JsonElement property) {
229 player.punishment.jailDuration = property.getAsLong();
230 }
231
232 @Override
233 Object write(Player player) {
234 return player.punishment.jailDuration;
235 }
236 },
237
238 new PlayerJSONProperty("player-title") {
239 @Override
240 void read(Player player, JsonElement property) {
241 player.playerTitle = gson().fromJson(property, PlayerTitle.class);
242 }
243
244 @Override
245 Object write(Player player) {
246 return player.playerTitle;
247 }
248 },
249
250 new PlayerJSONProperty("clan") {
251 @Override
252 void read(Player player, JsonElement property) {
253 ClanChannel channel = ClanRepository.getChannel(property.getAsString());
254 if (channel != null) {
255 player.clanChannel = channel;
256 }
257 }
258
259 @Override
260 Object write(Player player) {
261 return player.clanChannel == null ? "" : player.clanChannel.getOwner();
262 }
263 },
264
265 new PlayerJSONProperty("last-clan") {
266 @Override
267 void read(Player player, JsonElement property) {
268 player.lastClan = property.getAsString();
269 }
270
271 @Override
272 Object write(Player player) {
273 return player.lastClan;
274 }
275 },
276
277 new PlayerJSONProperty("clan-tag") {
278 @Override
279 void read(Player player, JsonElement property) {
280 player.clanTag = property.getAsString();
281 }
282
283 @Override
284 Object write(Player player) {
285 return player.clanTag;
286 }
287 },
288
289 new PlayerJSONProperty("clan-tag-color") {
290 @Override
291 void read(Player player, JsonElement property) {
292 player.clanTagColor = property.getAsString();
293 }
294
295 @Override
296 Object write(Player player) {
297 return player.clanTagColor;
298 }
299 },
300
301 new PlayerJSONProperty("clan-sort-type") {
302 @Override
303 void read(Player player, JsonElement property) {
304 player.settings.clanMemberComporator = ClanMemberComporator.valueOf(property.getAsString());
305 }
306
307 @Override
308 Object write(Player player) {
309 return player.settings.clanMemberComporator.name();
310 }
311 },
312
313 new PlayerJSONProperty("bank-placeholder") {
314 @Override
315 void read(Player player, JsonElement property) {
316 player.bank.placeHolder = property.getAsBoolean();
317 }
318
319 @Override
320 Object write(Player player) {
321 return player.bank.placeHolder;
322 }
323 },
324
325 new PlayerJSONProperty("bank-pin") {
326 @Override
327 void read(Player player, JsonElement property) {
328 player.bankPin.pin = property.getAsString();
329 }
330
331 @Override
332 Object write(Player player) {
333 return player.bankPin.pin;
334 }
335 },
336
337 new PlayerJSONProperty("bank-vault") {
338 @Override
339 void read(Player player, JsonElement property) {
340 player.bankVault.coinsContainer = property.getAsLong();
341 }
342
343 @Override
344 Object write(Player player) {
345 return player.bankVault.coinsContainer;
346 }
347 },
348
349 new PlayerJSONProperty("bank-vault-blood-money") {
350 @Override
351 void read(Player player, JsonElement property) {
352 player.bankVault.bloodMoneyContainer = property.getAsLong();
353 }
354
355 @Override
356 Object write(Player player) {
357 return player.bankVault.bloodMoneyContainer;
358 }
359 },
360
361 new PlayerJSONProperty("pet") {
362 @Override
363 void read(Player player, JsonElement property) {
364 int pet = property.getAsInt();
365 if (pet != -1) {
366 player.pet = new Npc(pet, player.getPosition());
367 }
368 }
369
370 @Override
371 Object write(Player player) {
372 return player.pet == null ? -1 : player.pet.id;
373 }
374 },
375
376 new PlayerJSONProperty("pet-insurnce") {
377 @Override
378 void read(Player player, JsonElement property) {
379 JsonArray array = property.getAsJsonArray();
380 array.forEach(e -> {
381 try {
382 PetData pet = PetData.valueOf(e.getAsString());
383 player.petInsurance.add(pet);
384 } catch (IllegalArgumentException ignored) {}
385 });
386 }
387
388 @Override
389 Object write(Player player) {
390 JsonArray array = new JsonArray();
391 player.petInsurance.forEach(pet -> array.add(pet.name()));
392 return array;
393 }
394 },
395
396 new PlayerJSONProperty("lost-pets") {
397 @Override
398 void read(Player player, JsonElement property) {
399 JsonArray array = property.getAsJsonArray();
400 array.forEach(e -> {
401 try {
402 PetData pet = PetData.valueOf(e.getAsString());
403 player.lostPets.add(pet);
404 } catch (IllegalArgumentException ignored) {}
405 });
406 }
407
408 @Override
409 Object write(Player player) {
410 JsonArray array = new JsonArray();
411 player.lostPets.forEach(pet -> array.add(pet.name()));
412 return array;
413 }
414 },
415
416 new PlayerJSONProperty("new-player") {
417 @Override
418 void read(Player player, JsonElement property) {
419 player.newPlayer = property.getAsBoolean();
420 }
421
422 @Override
423 Object write(Player player) {
424 return player.newPlayer;
425 }
426 },
427
428 new PlayerJSONProperty("needs-starter") {
429 @Override
430 void read(Player player, JsonElement property) {
431 player.needsStarter = property.getAsBoolean();
432 }
433
434 @Override
435 Object write(Player player) {
436 return player.needsStarter;
437 }
438 },
439
440 new PlayerJSONProperty("kills") {
441 @Override
442 void read(Player player, JsonElement property) {
443 player.kill = property.getAsInt();
444 }
445
446 @Override
447 Object write(Player player) {
448 return player.kill;
449 }
450 },
451
452 new PlayerJSONProperty("deaths") {
453 @Override
454 void read(Player player, JsonElement property) {
455 player.death = property.getAsInt();
456 }
457
458 @Override
459 Object write(Player player) {
460 return player.death;
461 }
462 },
463
464 new PlayerJSONProperty("kill-streak") {
465 @Override
466 void read(Player player, JsonElement property) {
467 player.killstreak.streak = property.getAsInt();
468 }
469
470 @Override
471 Object write(Player player) {
472 return player.killstreak.streak;
473 }
474 },
475 new PlayerJSONProperty("answered-trivias") {
476 @Override
477 void read(Player player, JsonElement property) {
478 player.answeredTrivias = property.getAsInt();
479 }
480
481 @Override
482 Object write(Player player) {
483 return player.answeredTrivias;
484 }
485 },
486
487 new PlayerJSONProperty("small-pouch") {
488 @Override
489 void read(Player player, JsonElement property) {
490 player.smallPouch = property.getAsInt();
491 }
492
493 @Override
494 Object write(Player player) {
495 return player.smallPouch;
496 }
497 },
498
499 new PlayerJSONProperty("medium-pouch") {
500 @Override
501 void read(Player player, JsonElement property) {
502 player.mediumPouch = property.getAsInt();
503 }
504
505 @Override
506 Object write(Player player) {
507 return player.mediumPouch;
508 }
509 },
510
511 new PlayerJSONProperty("large-pouch") {
512 @Override
513 void read(Player player, JsonElement property) {
514 player.largePouch = property.getAsInt();
515 }
516
517 @Override
518 Object write(Player player) {
519 return player.largePouch;
520 }
521 },
522
523 new PlayerJSONProperty("giant-pouch") {
524 @Override
525 void read(Player player, JsonElement property) {
526 player.giantPouch = property.getAsInt();
527 }
528
529 @Override
530 Object write(Player player) {
531 return player.giantPouch;
532 }
533 },
534
535 new PlayerJSONProperty("rune-pouch") {
536 @Override
537 void read(Player player, JsonElement property) {
538 JsonArray array = property.getAsJsonArray();
539
540 array.forEach(e -> {
541 JsonObject object = e.getAsJsonObject();
542 int id = object.get("id").getAsInt();
543 int amount = object.get("amount").getAsInt();
544
545 if (id != -1 && amount != -1) {
546 player.runePouch.runes.add(new Item(id, amount));
547 }
548 });
549 }
550
551 @Override
552 Object write(Player player) {
553 JsonArray array = new JsonArray();
554 player.runePouch.runes.forEach(rune -> {
555 JsonObject object = new JsonObject();
556 object.addProperty("id", rune.getId());
557 object.addProperty("amount", rune.getAmount());
558 array.add(object);
559 });
560 return array;
561 }
562 },
563
564 new PlayerJSONProperty("run-toggled") {
565 @Override
566 void read(Player player, JsonElement property) {
567 player.movement.setRunningToggled(property.getAsBoolean());
568 }
569
570 @Override
571 Object write(Player player) {
572 return player.movement.isRunningToggled();
573 }
574 },
575
576 new PlayerJSONProperty("run-energy") {
577 @Override
578 void read(Player player, JsonElement property) {
579 player.runEnergy = property.getAsInt();
580 }
581
582 @Override
583 Object write(Player player) {
584 return player.runEnergy;
585 }
586 },
587
588 new PlayerJSONProperty("energy-rate") {
589 @Override
590 void read(Player player, JsonElement property) {
591 player.energyRate = property.getAsInt();
592 }
593
594 @Override
595 Object write(Player player) {
596 return player.energyRate;
597 }
598 },
599
600 new PlayerJSONProperty("special-amount") {
601 @Override
602 void read(Player player, JsonElement property) {
603 player.getSpecialPercentage().set(property.getAsInt());
604 }
605
606 @Override
607 Object write(Player player) {
608 return player.getSpecialPercentage().get();
609 }
610 },
611
612 new PlayerJSONProperty("recoil-charge") {
613 @Override
614 void read(Player player, JsonElement property) {
615 player.ringOfRecoil = property.getAsInt();
616 }
617
618 @Override
619 Object write(Player player) {
620 return player.ringOfRecoil;
621 }
622 },
623
624 new PlayerJSONProperty("whip-charge") {
625 @Override
626 void read(Player player, JsonElement property) {
627 player.whipCharges = property.getAsInt();
628 }
629
630 @Override
631 Object write(Player player) {
632 return player.whipCharges;
633 }
634 },
635 new PlayerJSONProperty("ags-charge") {
636 @Override
637 void read(Player player, JsonElement property) {
638 player.agsCharges = property.getAsInt();
639 }
640
641 @Override
642 Object write(Player player) {
643 return player.agsCharges;
644 }
645 },
646
647 new PlayerJSONProperty("dragonfire-shield-charge") {
648 @Override
649 void read(Player player, JsonElement property) {
650 player.dragonfireCharges = property.getAsInt();
651 }
652
653 @Override
654 Object write(Player player) {
655 return player.dragonfireCharges;
656 }
657 },
658
659 new PlayerJSONProperty("dragonfire-shield-cooldown") {
660 @Override
661 void read(Player player, JsonElement property) {
662 player.dragonfireUsed = property.getAsLong();
663 }
664
665 @Override
666 Object write(Player player) {
667 return player.dragonfireUsed;
668 }
669 },
670
671 new PlayerJSONProperty("blowpipe-darts") {
672 @Override
673 void read(Player player, JsonElement property) {
674 player.blowpipeDarts = gson().fromJson(property, Item.class);
675 }
676
677 @Override
678 Object write(Player player) {
679 return player.blowpipeDarts;
680 }
681 },
682
683 new PlayerJSONProperty("blowpipe-scales") {
684 @Override
685 void read(Player player, JsonElement property) {
686 player.blowpipeScales = property.getAsFloat();
687 }
688
689 @Override
690 Object write(Player player) {
691 return player.blowpipeScales;
692 }
693 },
694
695 new PlayerJSONProperty("serpentine-helm") {
696 @Override
697 void read(Player player, JsonElement property) {
698 player.serpentineHelmCharges = property.getAsInt();
699 }
700
701 @Override
702 Object write(Player player) {
703 return player.serpentineHelmCharges;
704 }
705 },
706
707 new PlayerJSONProperty("tanzanite-helm") {
708 @Override
709 void read(Player player, JsonElement property) {
710 player.tanzaniteHelmCharges = property.getAsInt();
711 }
712
713 @Override
714 Object write(Player player) {
715 return player.tanzaniteHelmCharges;
716 }
717 },
718
719 new PlayerJSONProperty("magma-helm") {
720 @Override
721 void read(Player player, JsonElement property) {
722 player.magmaHelmCharges = property.getAsInt();
723 }
724
725 @Override
726 Object write(Player player) {
727 return player.magmaHelmCharges;
728 }
729 },
730
731 new PlayerJSONProperty("trident-seas-charges") {
732 @Override
733 void read(Player player, JsonElement property) {
734 player.tridentSeasCharges = property.getAsInt();
735 }
736
737 @Override
738 Object write(Player player) {
739 return player.tridentSeasCharges;
740 }
741 },
742
743 new PlayerJSONProperty("trident-swamp-charges") {
744 @Override
745 void read(Player player, JsonElement property) {
746 player.tridentSwampCharges = property.getAsInt();
747 }
748
749 @Override
750 Object write(Player player) {
751 return player.tridentSwampCharges;
752 }
753 },
754
755 new PlayerJSONProperty("fight-type") {
756 @Override
757 void read(Player player, JsonElement property) {
758 player.getCombat().setFightType(gson().fromJson(property, FightType.class));
759 }
760
761 @Override
762 Object write(Player player) {
763 return player.getCombat().getFightType();
764 }
765 },
766
767 new PlayerJSONProperty("client-width") {
768 @Override
769 void read(Player player, JsonElement property) {
770 player.settings.clientWidth = property.getAsInt();
771 }
772
773 @Override
774 Object write(Player player) {
775 return player.settings.clientWidth;
776 }
777 },
778
779 new PlayerJSONProperty("client-height") {
780 @Override
781 void read(Player player, JsonElement property) {
782 player.settings.clientHeight = property.getAsInt();
783 }
784
785 @Override
786 Object write(Player player) {
787 return player.settings.clientHeight;
788 }
789 },
790
791 new PlayerJSONProperty("spell-book") {
792 @Override
793 void read(Player player, JsonElement property) {
794 player.spellbook = gson().fromJson(property, Spellbook.class);
795 }
796
797 @Override
798 Object write(Player player) {
799 return player.spellbook;
800 }
801 },
802
803 new PlayerJSONProperty("auto-cast") {
804 @Override
805 void read(Player player, JsonElement property) {
806 player.setAutocast(gson().fromJson(property, CombatSpell.class));
807 }
808
809 @Override
810 Object write(Player player) {
811 return player.autocast;
812 }
813 },
814
815 new PlayerJSONProperty("brightness") {
816 @Override
817 void read(Player player, JsonElement property) {
818 player.settings.setBrightness(property.getAsInt());
819 }
820
821 @Override
822 Object write(Player player) {
823 return player.settings.brightness;
824 }
825 },
826
827 new PlayerJSONProperty("zoom") {
828 @Override
829 void read(Player player, JsonElement property) {
830 player.settings.setZoom(property.getAsInt(), true);
831 }
832
833 @Override
834 Object write(Player player) {
835 return player.settings.zoom;
836 }
837 },
838
839 new PlayerJSONProperty("private-chat") {
840 @Override
841 void read(Player player, JsonElement property) {
842 player.settings.privateChat = property.getAsBoolean();
843 }
844
845 @Override
846 Object write(Player player) {
847 return player.settings.privateChat;
848 }
849 },
850
851 new PlayerJSONProperty("chat-effects") {
852 @Override
853 void read(Player player, JsonElement property) {
854 player.settings.chatEffects = property.getAsBoolean();
855 }
856
857 @Override
858 Object write(Player player) {
859 return player.settings.chatEffects;
860 }
861 },
862
863 new PlayerJSONProperty("accept-aid") {
864 @Override
865 void read(Player player, JsonElement property) {
866 player.settings.acceptAid = property.getAsBoolean();
867 }
868
869 @Override
870 Object write(Player player) {
871 return player.settings.acceptAid;
872 }
873 },
874
875 new PlayerJSONProperty("mouse-clicks") {
876 @Override
877 void read(Player player, JsonElement property) {
878 player.settings.mouse = property.getAsBoolean();
879 }
880
881 @Override
882 Object write(Player player) {
883 return player.settings.mouse;
884 }
885 },
886
887 new PlayerJSONProperty("auto-retaliate") {
888 @Override
889 void read(Player player, JsonElement property) {
890 player.settings.autoRetaliate = property.getAsBoolean();
891 }
892
893 @Override
894 Object write(Player player) {
895 return player.settings.autoRetaliate;
896 }
897 },
898
899 new PlayerJSONProperty("profanity-filter") {
900 @Override
901 void read(Player player, JsonElement property) {
902 player.settings.profanityFilter = property.getAsBoolean();
903 }
904
905 @Override
906 Object write(Player player) {
907 return player.settings.profanityFilter;
908 }
909 },
910
911 new PlayerJSONProperty("camera-movement") {
912 @Override
913 void read(Player player, JsonElement property) {
914 player.settings.cameraMovement = property.getAsBoolean();
915 }
916
917 @Override
918 Object write(Player player) {
919 return player.settings.cameraMovement;
920 }
921 },
922
923 new PlayerJSONProperty("experience-lock") {
924 @Override
925 void read(Player player, JsonElement property) {
926 player.settings.lockExperience = property.getAsBoolean();
927 }
928
929 @Override
930 Object write(Player player) {
931 return player.settings.lockExperience;
932 }
933 },
934
935 new PlayerJSONProperty("welcome-screen") {
936 @Override
937 void read(Player player, JsonElement property) {
938 player.settings.welcomeScreen = property.getAsBoolean();
939 }
940
941 @Override
942 Object write(Player player) {
943 return player.settings.welcomeScreen;
944 }
945 },
946
947 new PlayerJSONProperty("screenshot-kill") {
948 @Override
949 void read(Player player, JsonElement property) {
950 player.settings.screenshotKill = property.getAsBoolean();
951 }
952
953 @Override
954 Object write(Player player) {
955 return player.settings.screenshotKill;
956 }
957 },
958
959 new PlayerJSONProperty("trivia-bot") {
960 @Override
961 void read(Player player, JsonElement property) {
962 player.settings.triviaBot = property.getAsBoolean();
963 }
964
965 @Override
966 Object write(Player player) {
967 return player.settings.triviaBot;
968 }
969 },
970
971 new PlayerJSONProperty("drop-notification") {
972 @Override
973 void read(Player player, JsonElement property) {
974 player.settings.dropNotification = property.getAsBoolean();
975 }
976
977 @Override
978 Object write(Player player) {
979 return player.settings.dropNotification;
980 }
981 },
982
983 new PlayerJSONProperty("yell-notification") {
984 @Override
985 void read(Player player, JsonElement property) {
986 player.settings.yell = property.getAsBoolean();
987 }
988
989 @Override
990 Object write(Player player) {
991 return player.settings.yell;
992 }
993 },
994
995 new PlayerJSONProperty("untradeable-notification") {
996 @Override
997 void read(Player player, JsonElement property) {
998 player.settings.untradeableNotification = property.getAsBoolean();
999 }
1000
1001 @Override
1002 Object write(Player player) {
1003 return player.settings.untradeableNotification;
1004 }
1005 },
1006
1007 new PlayerJSONProperty("esc-close") {
1008 @Override
1009 void read(Player player, JsonElement property) {
1010 player.settings.ESC_CLOSE = property.getAsBoolean();
1011 }
1012
1013 @Override
1014 Object write(Player player) {
1015 return player.settings.ESC_CLOSE;
1016 }
1017 },
1018
1019 new PlayerJSONProperty("gloves-tier") {
1020 @Override
1021 void read(Player player, JsonElement property) {
1022 player.glovesTier = property.getAsInt();
1023 }
1024
1025 @Override
1026 Object write(Player player) {
1027 return player.glovesTier;
1028 }
1029 },
1030
1031 new PlayerJSONProperty("experience-rate") {
1032 @Override
1033 void read(Player player, JsonElement property) {
1034 player.experienceRate = property.getAsDouble();
1035 }
1036
1037 @Override
1038 Object write(Player player) {
1039 return player.experienceRate;
1040 }
1041 },
1042
1043 new PlayerJSONProperty("experience-counter") {
1044 @Override
1045 void read(Player player, JsonElement property) {
1046 player.skills.experienceCounter = property.getAsDouble();
1047 }
1048
1049 @Override
1050 Object write(Player player) {
1051 return player.skills.experienceCounter;
1052 }
1053 },
1054
1055 new PlayerJSONProperty("preset-death-open") {
1056 @Override
1057 void read(Player player, JsonElement property) {
1058 player.presetManager.deathOpen = property.getAsBoolean();
1059 }
1060
1061 @Override
1062 Object write(Player player) {
1063 return player.presetManager.deathOpen;
1064 }
1065 },
1066
1067 new PlayerJSONProperty("preset-death-open") {
1068 @Override
1069 void read(Player player, JsonElement property) {
1070 player.presetManager.deathOpen = property.getAsBoolean();
1071 }
1072
1073 @Override
1074 Object write(Player player) {
1075 return player.presetManager.deathOpen;
1076 }
1077 },
1078
1079 new PlayerJSONProperty("preset-automatic-deposit") {
1080 @Override
1081 void read(Player player, JsonElement property) {
1082 player.presetManager.autoDeposit = property.getAsBoolean();
1083 }
1084
1085 @Override
1086 Object write(Player player) {
1087 return player.presetManager.autoDeposit;
1088 }
1089 },
1090
1091 new PlayerJSONProperty("hidden-brother") {
1092 @Override
1093 void read(Player player, JsonElement property) {
1094 player.hiddenBrother = gson().fromJson(property, BrotherData.class);
1095 }
1096
1097 @Override
1098 Object write(Player player) {
1099 return player.hiddenBrother;
1100 }
1101 },
1102
1103 new PlayerJSONProperty("brothers-kill-count") {
1104 @Override
1105 void read(Player player, JsonElement property) {
1106 player.barrowsKillCount = property.getAsInt();
1107 }
1108
1109 @Override
1110 Object write(Player player) {
1111 return player.barrowsKillCount;
1112 }
1113 },
1114
1115 new PlayerJSONProperty("brothers-dead") {
1116 @Override
1117 void read(Player player, JsonElement property) {
1118 player.barrowKills = gson().fromJson(property, boolean[].class);
1119 }
1120
1121 @Override
1122 Object write(Player player) {
1123 return player.barrowKills;
1124 }
1125 },
1126
1127 new PlayerJSONProperty("vote-points") {
1128 @Override
1129 void read(Player player, JsonElement property) {
1130 player.votePoints = property.getAsInt();
1131 }
1132
1133 @Override
1134 Object write(Player player) {
1135 return player.votePoints;
1136 }
1137 },
1138
1139 new PlayerJSONProperty("total-votes") {
1140 @Override
1141 void read(Player player, JsonElement property) {
1142 player.totalVotes = property.getAsInt();
1143 }
1144
1145 @Override
1146 Object write(Player player) {
1147 return player.totalVotes;
1148 }
1149 },
1150
1151 new PlayerJSONProperty("completed-magearena") {
1152 @Override
1153 void read(Player player, JsonElement property) {
1154 player.completedMageArena = property.getAsBoolean();
1155 }
1156
1157 @Override
1158 Object write(Player player) {
1159 return player.completedMageArena;
1160 }
1161 },
1162
1163 new PlayerJSONProperty("magearena-points") {
1164 @Override
1165 void read(Player player, JsonElement property) {
1166 player.mageArenaPoints = property.getAsInt();
1167 }
1168
1169 @Override
1170 Object write(Player player) {
1171 return player.mageArenaPoints;
1172 }
1173 },
1174
1175 new PlayerJSONProperty("poison-immunity") {
1176 @Override
1177 void read(Player player, JsonElement property) {
1178 player.getPoisonImmunity().set(property.getAsInt());
1179 }
1180
1181 @Override
1182 Object write(Player player) {
1183 return player.getPoisonImmunity().get();
1184 }
1185 },
1186
1187 new PlayerJSONProperty("venom-immunity") {
1188 @Override
1189 void read(Player player, JsonElement property) {
1190 player.getVenomImmunity().set(property.getAsInt());
1191 }
1192
1193 @Override
1194 Object write(Player player) {
1195 return player.getVenomImmunity().get();
1196 }
1197 },
1198
1199 new PlayerJSONProperty("skull-timer") {
1200 @Override
1201 void read(Player player, JsonElement property) {
1202 player.skulling.getSkullRemoveTask().setSkullTime(property.getAsInt());
1203 }
1204
1205 @Override
1206 Object write(Player player) {
1207 return player.skulling.getSkullRemoveTask().getSkullTime();
1208 }
1209 },
1210
1211 new PlayerJSONProperty("teleblock-timer") {
1212 @Override
1213 void read(Player player, JsonElement property) {
1214 player.teleblockTimer.set(property.getAsInt());
1215 }
1216
1217 @Override
1218 Object write(Player player) {
1219 return player.teleblockTimer.get();
1220 }
1221 },
1222
1223 new PlayerJSONProperty("prestige-points") {
1224 @Override
1225 void read(Player player, JsonElement property) {
1226 player.prestige.setPrestigePoint(property.getAsInt());
1227 }
1228
1229 @Override
1230 Object write(Player player) {
1231 return player.prestige.getPrestigePoint();
1232 }
1233 },
1234
1235 new PlayerJSONProperty("prestige-total") {
1236 @Override
1237 void read(Player player, JsonElement property) {
1238 player.prestige.totalPrestige = property.getAsInt();
1239 }
1240
1241 @Override
1242 Object write(Player player) {
1243 return player.prestige.totalPrestige;
1244 }
1245 },
1246
1247 new PlayerJSONProperty("prestige-color") {
1248 @Override
1249 void read(Player player, JsonElement property) {
1250 player.settings.prestigeColors = property.getAsBoolean();
1251 }
1252
1253 @Override
1254 Object write(Player player) {
1255 return player.settings.prestigeColors;
1256 }
1257 },
1258
1259 new PlayerJSONProperty("prestiges") {
1260 @Override
1261 void read(Player player, JsonElement property) {
1262 player.prestige.prestige = gson().fromJson(property, int[].class);
1263 }
1264
1265 @Override
1266 Object write(Player player) {
1267 return player.prestige.prestige;
1268 }
1269 },
1270
1271 new PlayerJSONProperty("active-perks") {
1272 @Override
1273 void read(Player player, JsonElement property) {
1274 JsonArray array = property.getAsJsonArray();
1275 array.forEach(e -> {
1276 try {
1277 PrestigePerk perk = PrestigePerk.valueOf(e.getAsString());
1278 player.prestige.activePerks.add(perk);
1279 } catch (IllegalArgumentException ignored) {}
1280 });
1281 }
1282
1283 @Override
1284 Object write(Player player) {
1285 JsonArray array = new JsonArray();
1286 player.prestige.activePerks.forEach(key -> array.add(key.name));
1287 return array;
1288 }
1289 },
1290
1291 new PlayerJSONProperty("achievements") {
1292 @Override
1293 void read(Player player, JsonElement property) {
1294 JsonObject obj = property.getAsJsonObject();
1295 for (Entry<String, JsonElement> entry : obj.entrySet()) {
1296 final String prop = entry.getKey();
1297 try {
1298 AchievementKey key = AchievementKey.valueOf(prop);
1299 int val = obj.get(prop).getAsInt();
1300 player.playerAchievements.put(key, val);
1301 } catch (IllegalArgumentException ignored) {}
1302 }
1303 }
1304
1305 @Override
1306 Object write(Player player) {
1307 JsonObject array = new JsonObject();
1308 player.playerAchievements.forEach((key, val) -> array.addProperty(key.name(), val));
1309 return array;
1310 }
1311 },
1312
1313 new PlayerJSONProperty("last-killed") {
1314 @Override
1315 void read(Player player, JsonElement property) {
1316 JsonArray array = property.getAsJsonArray();
1317 array.forEach(e -> player.lastKilled.add(e.getAsString()));
1318 }
1319
1320 @Override
1321 Object write(Player player) {
1322 JsonArray achievements = new JsonArray();
1323 player.lastKilled.forEach(achievements::add);
1324 return achievements;
1325 }
1326 },
1327
1328 new PlayerJSONProperty("favorite-teleport") {
1329 @Override
1330 void read(Player player, JsonElement property) {
1331 JsonArray array = property.getAsJsonArray();
1332 array.forEach(e -> {
1333 try {
1334 Teleport key = Teleport.valueOf(e.getAsString());
1335 player.favoriteTeleport.add(key);
1336 } catch (IllegalArgumentException ignored) {}
1337 });
1338 }
1339
1340 @Override
1341 Object write(Player player) {
1342 JsonArray array = new JsonArray();
1343 player.favoriteTeleport.forEach(t -> array.add(t.name()));
1344 return array;
1345 }
1346 },
1347
1348 new PlayerJSONProperty("unlocked-emotes") {
1349 @Override
1350 void read(Player player, JsonElement property) {
1351 JsonArray array = property.getAsJsonArray();
1352 array.forEach(e -> {
1353 try {
1354 EmoteUnlockable key = EmoteUnlockable.valueOf(e.getAsString());
1355 player.emoteUnlockable.add(key);
1356 } catch (IllegalArgumentException ignored) {}
1357 });
1358 }
1359
1360 @Override
1361 Object write(Player player) {
1362 JsonArray array = new JsonArray();
1363 player.emoteUnlockable.forEach(e -> array.add(e.name()));
1364 return array;
1365 }
1366 },
1367
1368 new PlayerJSONProperty("public-chat-mode") {
1369 @Override
1370 void read(Player player, JsonElement property) {
1371 player.relations.setPublicChatMode(PrivacyChatMode.valueOf(gson().fromJson(property, String.class).toUpperCase()), false);
1372 }
1373
1374 @Override
1375 Object write(Player player) {
1376 return player.relations.getPublicChatMode().name();
1377 }
1378 },
1379
1380 new PlayerJSONProperty("private-chat-mode") {
1381 @Override
1382 void read(Player player, JsonElement property) {
1383 player.relations.setPrivateChatMode(PrivacyChatMode.valueOf(gson().fromJson(property, String.class).toUpperCase()), true);
1384 }
1385
1386 @Override
1387 Object write(Player player) {
1388 return player.relations.getPrivateChatMode().name();
1389 }
1390 },
1391
1392 new PlayerJSONProperty("clan-chat-mode") {
1393 @Override
1394 void read(Player player, JsonElement property) {
1395 player.relations.setClanChatMode(PrivacyChatMode.valueOf(gson().fromJson(property, String.class).toUpperCase()), false);
1396 }
1397
1398 @Override
1399 Object write(Player player) {
1400 return player.relations.getClanChatMode().name();
1401 }
1402 },
1403
1404 new PlayerJSONProperty("trade-chat-mode") {
1405 @Override
1406 void read(Player player, JsonElement property) {
1407 player.relations.setTradeChatMode(PrivacyChatMode.valueOf(gson().fromJson(property, String.class).toUpperCase()), false);
1408 }
1409
1410 @Override
1411 Object write(Player player) {
1412 return player.relations.getTradeChatMode().name();
1413 }
1414 },
1415
1416 new PlayerJSONProperty("friend-list") {
1417 @Override
1418 void read(Player player, JsonElement property) {
1419 player.relations.getFriendList().addAll(gson().fromJson(property, new TypeToken<List<Long>>() {
1420 }.getType()));
1421 }
1422
1423 @Override
1424 Object write(Player player) {
1425 return player.relations.getFriendList();
1426 }
1427 },
1428
1429 new PlayerJSONProperty("ignore-list") {
1430 @Override
1431 void read(Player player, JsonElement property) {
1432 player.relations.getIgnoreList().addAll(gson().fromJson(property, new TypeToken<List<Long>>() {
1433 }.getType()));
1434 }
1435
1436 @Override
1437 Object write(Player player) {
1438 return player.relations.getIgnoreList();
1439 }
1440 },
1441
1442 new PlayerJSONProperty("appearance") {
1443 @Override
1444 void read(Player player, JsonElement property) {
1445 player.appearance = gson().fromJson(property, Appearance.class);
1446 }
1447
1448 @Override
1449 Object write(Player player) {
1450 return player.appearance;
1451 }
1452 },
1453
1454 new PlayerJSONProperty("preset") {
1455 @Override
1456 void read(Player player, JsonElement property) {
1457 Preset[] loaded = gson().fromJson(property, Preset[].class);
1458 for (int idx = 0; idx < loaded.length; idx++) {
1459 player.presetManager.preset[idx] = loaded[idx];
1460 }
1461 }
1462
1463 @Override
1464 Object write(Player player) {
1465 return player.presetManager.preset;
1466 }
1467 },
1468
1469 new PlayerJSONProperty("activity-logger") {
1470 @Override
1471 void read(Player player, JsonElement property) {
1472 JsonObject obj = property.getAsJsonObject();
1473 for (Entry<String, JsonElement> entry : obj.entrySet()) {
1474 final String prop = entry.getKey();
1475 try {
1476 ActivityLog key = ActivityLog.valueOf(prop);
1477 int val = obj.get(prop).getAsInt();
1478 player.loggedActivities.put(key, val);
1479 } catch (IllegalArgumentException ignored) {}
1480 }
1481 }
1482
1483 @Override
1484 Object write(Player player) {
1485 JsonObject object = new JsonObject();
1486 player.loggedActivities.forEach((key, val) -> object.addProperty(key.name(), val));
1487 return object;
1488 }
1489 },
1490
1491 new PlayerJSONProperty("quick-prayers") {
1492 @Override
1493 void read(Player player, JsonElement property) {
1494 player.quickPrayers = gson().fromJson(property, PrayerBook.class);
1495 }
1496
1497 @Override
1498 Object write(Player player) {
1499 return player.quickPrayers;
1500 }
1501 },
1502
1503 new PlayerJSONProperty("locked-prayers") {
1504 @Override
1505 void read(Player player, JsonElement property) {
1506 JsonArray array = property.getAsJsonArray();
1507 array.forEach(e -> {
1508 try {
1509 Prayer prayer = Prayer.valueOf(e.getAsString());
1510 player.unlockedPrayers.add(prayer);
1511 } catch (IllegalArgumentException ignored) {}
1512 });
1513 }
1514
1515 @Override
1516 Object write(Player player) {
1517 JsonArray array = new JsonArray();
1518 player.unlockedPrayers.forEach(e -> array.add(e.name()));
1519 return array;
1520 }
1521 },
1522
1523 new PlayerJSONProperty("slayer-points") {
1524 @Override
1525 void read(Player player, JsonElement property) {
1526 player.slayer.setPoints(property.getAsInt());
1527 }
1528
1529 @Override
1530 Object write(Player player) {
1531 return player.slayer.getPoints();
1532 }
1533 },
1534
1535 new PlayerJSONProperty("slayer-task") {
1536 @Override
1537 void read(Player player, JsonElement property) {
1538 player.slayer.setTask(gson().fromJson(property, SlayerTask.class));
1539 }
1540
1541 @Override
1542 Object write(Player player) {
1543 return player.slayer.getTask();
1544 }
1545 },
1546
1547 new PlayerJSONProperty("slayer-assigned") {
1548 @Override
1549 void read(Player player, JsonElement property) {
1550 player.slayer.setAssigned(property.getAsInt());
1551 }
1552
1553 @Override
1554 Object write(Player player) {
1555 return player.slayer.getAssigned();
1556 }
1557 },
1558
1559 new PlayerJSONProperty("slayer-amount") {
1560 @Override
1561 void read(Player player, JsonElement property) {
1562 player.slayer.setAmount(property.getAsInt());
1563 }
1564
1565 @Override
1566 Object write(Player player) {
1567 return player.slayer.getAmount();
1568 }
1569 },
1570
1571 new PlayerJSONProperty("slayer-total-assigned") {
1572 @Override
1573 void read(Player player, JsonElement property) {
1574 player.slayer.setTotalAssigned(property.getAsInt());
1575 }
1576
1577 @Override
1578 Object write(Player player) {
1579 return player.slayer.getTotalAssigned();
1580 }
1581 },
1582
1583 new PlayerJSONProperty("slayer-total-completed") {
1584 @Override
1585 void read(Player player, JsonElement property) {
1586 player.slayer.setTotalCompleted(property.getAsInt());
1587 }
1588
1589 @Override
1590 Object write(Player player) {
1591 return player.slayer.getTotalCompleted();
1592 }
1593 },
1594
1595 new PlayerJSONProperty("slayer-total-cancelled") {
1596 @Override
1597 void read(Player player, JsonElement property) {
1598 player.slayer.setTotalCancelled(property.getAsInt());
1599 }
1600
1601 @Override
1602 Object write(Player player) {
1603 return player.slayer.getTotalCancelled();
1604 }
1605 },
1606
1607 new PlayerJSONProperty("slayer-total-points") {
1608 @Override
1609 void read(Player player, JsonElement property) {
1610 player.slayer.setTotalPoints(property.getAsInt());
1611 }
1612
1613 @Override
1614 Object write(Player player) {
1615 return player.slayer.getTotalPoints();
1616 }
1617 },
1618
1619 new PlayerJSONProperty("slayer-blocked") {
1620 @Override
1621 void read(Player player, JsonElement property) {
1622 JsonArray array = property.getAsJsonArray();
1623 array.forEach(e -> {
1624 try {
1625 SlayerTask key = SlayerTask.valueOf(e.getAsString());
1626 player.slayer.getBlocked().add(key);
1627 } catch (IllegalArgumentException ignored) {}
1628 });
1629 }
1630
1631 @Override
1632 Object write(Player player) {
1633 JsonArray array = new JsonArray();
1634 player.slayer.getBlocked().forEach(e -> array.add(e.name()));
1635 return array;
1636 }
1637 },
1638
1639 new PlayerJSONProperty("slayer-unlocked") {
1640 @Override
1641 void read(Player player, JsonElement property) {
1642 JsonArray array = property.getAsJsonArray();
1643 array.forEach(e -> {
1644 try {
1645 SlayerUnlockable key = SlayerUnlockable.valueOf(e.getAsString());
1646 player.slayer.getUnlocked().add(key);
1647 } catch (IllegalArgumentException ignored) {}
1648 });
1649 }
1650
1651 @Override
1652 Object write(Player player) {
1653 JsonArray array = new JsonArray();
1654 player.slayer.getUnlocked().forEach(e -> array.add(e.name()));
1655 return array;
1656 }
1657 },
1658
1659 new PlayerJSONProperty("tab-amounts") {
1660 @Override
1661 void read(Player player, JsonElement property) {
1662 player.bank.tabAmounts = gson().fromJson(property, int[].class);
1663 }
1664
1665 @Override
1666 Object write(Player player) {
1667 return player.bank.tabAmounts;
1668 }
1669 },
1670
1671 new PlayerJSONProperty("looting-bag") {
1672 @Override
1673 void read(Player player, JsonElement property) {
1674 player.lootingBag.set(gson().fromJson(property, Item[].class));
1675 }
1676
1677 @Override
1678 Object write(Player player) {
1679 return player.lootingBag.getItems();
1680 }
1681 },
1682
1683 new PlayerJSONProperty("lost-items") {
1684 @Override
1685 void read(Player player, JsonElement property) {
1686 player.lostItems = (gson().fromJson(property, new TypeToken<LinkedList<Item>>() {
1687 }.getType()));
1688 }
1689
1690 @Override
1691 Object write(Player player) {
1692 return player.lostItems;
1693 }
1694 },
1695
1696 new PlayerJSONProperty("lost-untradables") {
1697 @Override
1698 void read(Player player, JsonElement property) {
1699 player.lostUntradeables.set(gson().fromJson(property, Item[].class));
1700 }
1701
1702 @Override
1703 Object write(Player player) {
1704 return player.lostUntradeables.getItems();
1705 }
1706 },
1707
1708 new PlayerJSONProperty("duel-rules") {
1709 @Override
1710 void read(Player player, JsonElement property) {
1711 if (property.isJsonNull()) {
1712 return;
1713 }
1714 Type ruleSet = new TypeToken<EnumSet<DuelRule>>() {
1715 }.getType();
1716
1717
1718 player.attributes.put("duel_rules", gson().fromJson(property, ruleSet));
1719 }
1720
1721 @Override
1722 Object write(Player player) {
1723 if (player.attributes.has("duel_rules")) {
1724 return player.attributes.<String, EnumSet<DuelRule>>get("duel_rules");
1725 }
1726 return null;
1727 }
1728 },
1729
1730 new PlayerJSONProperty("daily-spell-book-swap") {
1731 @Override
1732 void read(Player player, JsonElement property) {
1733 player.dailySpellBookSwap = gson().fromJson(property, DailySpellBookSwap.class);
1734 }
1735
1736 @Override
1737 Object write(Player player) {
1738 return player.dailySpellBookSwap;
1739 }
1740 },
1741
1742 new PlayerJSONProperty("daily-slayer-task-skip") {
1743 @Override
1744 void read(Player player, JsonElement property) {
1745 player.dailySlayerTaskSkip = gson().fromJson(property, DailySlayerTaskSkip.class);
1746 }
1747
1748 @Override
1749 Object write(Player player) {
1750 return player.dailySlayerTaskSkip;
1751 }
1752 },
1753
1754 new PlayerJSONProperty("daily-slayer-task-teleport") {
1755 @Override
1756 void read(Player player, JsonElement property) {
1757 player.dailySlayerTaskTeleport = gson().fromJson(property, DailySlayerTaskTeleport.class);
1758 }
1759
1760 @Override
1761 Object write(Player player) {
1762 return player.dailySlayerTaskTeleport;
1763 }
1764 },
1765 };
1766 private static final PlayerDBProperty[] DB_PROPERTIES = {
1767
1768 new PlayerDBProperty("json_properties") {
1769 @Override
1770 void read(Player player, JdbcSession session) throws SQLException {
1771 session.sql("SELECT member_id, data FROM player.player WHERE member_id = ?")
1772 .set(player.getMemberId())
1773 .select((rset, stmt) -> {
1774 if (rset.next()) {
1775 player.setMemberId(rset.getInt("member_id"));
1776
1777 final JsonParser parser = new JsonParser();
1778
1779 final JsonObject obj = parser.parse(rset.getString("data")).getAsJsonObject();
1780
1781 for (PlayerJSONProperty property : PROPERTIES) {
1782 if (obj.has(property.label)) {
1783 if (obj.get(property.label).isJsonNull()) {
1784 continue;
1785 }
1786 property.read(player, obj.get(property.label));
1787 }
1788 }
1789
1790 }
1791
1792 return null;
1793
1794 });
1795 }
1796
1797 @Override
1798 void write(Player player, JdbcSession session) throws SQLException {
1799 final JsonObject properties = new JsonObject();
1800
1801 for (PlayerJSONProperty property : PROPERTIES) {
1802 properties.add(property.label, gson().toJsonTree(property.write(player)));
1803 }
1804
1805 session
1806 .sql("INSERT INTO player.player(member_id, data) VALUES (?, ?::json) ON CONFLICT (member_id) DO UPDATE SET data = excluded.data, last_save = DEFAULT")
1807 .set(player.getMemberId())
1808 .set(gson().toJson(properties))
1809 .execute();
1810 }
1811 },
1812
1813 new PlayerDBProperty("host") {
1814 @Override
1815 void read(Player player, JdbcSession session) throws SQLException {
1816 session.sql("SELECT host, time FROM player.host where player_id = ? ORDER BY time LIMIT 1")
1817 .set(player.getMemberId())
1818 .select((rset, stmt) -> {
1819 if (rset.next()) {
1820 player.lastHost = rset.getString("host");
1821 }
1822 return null;
1823 });
1824 }
1825
1826 @Override
1827 void write(Player player, JdbcSession session) throws SQLException {
1828 if (!player.getSession().isPresent()) {
1829 return;
1830 }
1831 session.sql("INSERT INTO player.host(host, player_id) VALUES (?, ?)")
1832 .set(player.getSession().get().getHost())
1833 .set(player.getMemberId())
1834 .execute();
1835 }
1836 },
1837
1838 new PlayerDBProperty("skills") {
1839 @Override
1840 void read(Player player, JdbcSession session) throws SQLException {
1841 session.sql("SELECT id, current_level, xp, player_id FROM player.skill WHERE player_id = ?")
1842 .set(player.getMemberId())
1843 .select((rset, stmt) -> {
1844
1845 final Skill[] skills = new Skill[Skill.SKILL_COUNT];
1846
1847 while (rset.next()) {
1848 final int skillId = rset.getInt("id");
1849 skills[skillId] = new Skill(skillId, rset.getInt("current_level"), rset.getDouble("xp"));
1850 }
1851
1852 player.skills.setSkills(skills);
1853 return null;
1854 });
1855 }
1856
1857 @Override
1858 void write(Player player, JdbcSession session) throws SQLException {
1859 for (Skill skill : player.skills.getSkills()) {
1860 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")
1861 .set(skill.getSkill())
1862 .set(skill.getLevel())
1863 .set(skill.getExperience())
1864 .set(player.getMemberId())
1865 .execute();
1866 }
1867 }
1868 },
1869
1870 new PlayerDBProperty("items") {
1871 @Override
1872 void read(Player player, JdbcSession session) throws SQLException {
1873
1874 // bank
1875 session.sql("SELECT item_id, amount, slot FROM player.bank WHERE player_id = ? AND item_id IS NOT NULL ORDER BY slot")
1876 .set(player.getMemberId())
1877 .select((rset, stmt) -> {
1878 while (rset.next()) {
1879 Item item = new Item(rset.getInt("item_id"), rset.getInt("amount"));
1880 player.bank.add(item, rset.getInt("slot"));
1881 }
1882 return null;
1883 });
1884
1885 // equipment
1886 session.sql("SELECT item_id, amount, slot FROM player.equipment WHERE player_id = ?")
1887 .set(player.getMemberId())
1888 .select((rset, stmt) -> {
1889 while (rset.next()) {
1890 player.equipment.set(rset.getInt("slot"), new Item(rset.getInt("item_id"), rset.getInt("amount")), false);
1891 }
1892 player.equipment.refresh();
1893 return null;
1894 });
1895
1896 // inventory
1897 session.sql("SELECT item_id, amount, slot FROM player.inventory WHERE player_id = ?")
1898 .set(player.getMemberId())
1899 .select((rset, stmt) -> {
1900 while (rset.next()) {
1901 Item item = new Item(rset.getInt("item_id"), rset.getInt("amount"));
1902 player.inventory.add(item, rset.getInt("slot"));
1903 }
1904 return null;
1905 });
1906
1907 }
1908
1909 @Override
1910 void write(Player player, JdbcSession session) throws SQLException {
1911 // bank
1912 session.sql("DELETE FROM player.bank WHERE player_id = ?")
1913 .set(player.getMemberId())
1914 .execute();
1915
1916 for (int slot = 0; slot < player.bank.getItems().length; slot++) {
1917 final Item item = player.bank.getItems()[slot];
1918
1919 if (item == null) {
1920 continue;
1921 }
1922
1923 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")
1924 .set(item.getId())
1925 .set(item.getAmount())
1926 .set(slot)
1927 .set(player.getMemberId())
1928 .execute();
1929
1930 }
1931
1932 // equipment
1933 session.sql("DELETE FROM player.equipment WHERE player_id = ?")
1934 .set(player.getMemberId())
1935 .execute();
1936
1937 for (int slot = 0; slot < player.equipment.getItems().length; slot++) {
1938 Item item = player.equipment.get(slot);
1939
1940 if (item == null) {
1941 continue;
1942 }
1943
1944 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")
1945 .set(item.getId())
1946 .set(item.getAmount())
1947 .set(slot)
1948 .set(player.getMemberId())
1949 .execute();
1950
1951 }
1952
1953 // inventory
1954 session.sql("DELETE FROM player.inventory WHERE player_id = ?")
1955 .set(player.getMemberId())
1956 .execute();
1957
1958 for (int slot = 0; slot < player.inventory.getItems().length; slot++) {
1959 Item item = player.inventory.getItems()[slot];
1960
1961 if (item == null) {
1962 continue;
1963 }
1964
1965 session.sql("INSERT INTO player.inventory(item_id, amount, slot, player_id) VALUES (?, ?, ?, ?)")
1966 .set(item.getId())
1967 .set(item.getAmount())
1968 .set(slot)
1969 .set(player.getMemberId())
1970 .execute();
1971 }
1972
1973 }
1974 }
1975 };
1976
1977 @Override
1978 public void save(Player player) {
1980 return;
1981 }
1982
1984
1985 for (PlayerDBProperty property : DB_PROPERTIES) {
1986 try {
1987 JdbcSession session = new JdbcSession(PostgreService.getConnectionPool())
1988 .autocommit(false);
1989 property.write(player, session);
1990 session.commit();
1991 } catch (SQLException ex) {
1992 logger.error(String.format("Failed to save property=%s for player=%s", property.getName(), player.getName()), ex);
1993 }
1994 }
1995
1996 // extremely important do not remove
1997 player.saved.set(true);
1998 }
1999
2000 @Override
2001 public LoginResponse load(Player player, String expectedPassword) {
2002 try {
2003 final JdbcSession session = new JdbcSession(PostgreService.getConnectionPool());
2004
2005 boolean exists = session.sql("SELECT EXISTS(SELECT 1 FROM player.player WHERE member_id = ?)")
2006 .set(player.getMemberId())
2007 .select(new SingleOutcome<>(Boolean.class));
2008
2009 if (!exists) {
2010 player.newPlayer = true;
2011 player.needsStarter = true;
2012 return LoginResponse.NORMAL;
2013 }
2014
2015 } catch (SQLException ex) {
2016 logger.error(String.format("Failed to login new player=%s", player.getName()), ex);
2018 }
2019
2020 try {
2021 final JdbcSession session = new JdbcSession(PostgreService.getConnectionPool())
2022 .autocommit(false);
2023
2024 for (PlayerDBProperty property : DB_PROPERTIES) {
2025 property.read(player, session);
2026 }
2027
2028 session.commit();
2029 } catch (SQLException ex) {
2030 logger.error(String.format("Error loading player=%s", player.getName()), ex);
2032 }
2033
2034 return LoginResponse.NORMAL;
2035
2036 }
2037
2038}
The class that contains setting-related constants for the server.
Definition Config.java:24
static final boolean FORUM_INTEGRATION
If forum integration is true, users can only login if they enter the same username and password that'...
Definition Config.java:117
The repository containing all the clans and their corresponding data.
static ClanChannel getChannel(String channel)
Returns the channel.
static HikariDataSource getConnectionPool()
Represents a non-player character in the in-game world.
Definition Npc.java:29
This class represents a character controlled by a player.
Definition Player.java:125
LoginResponse load(Player player, String expectedPassword)
Represents a trainable and usable skill.
Definition Skill.java:18
static final int SKILL_COUNT
The amount of available skills.
Definition Skill.java:90
The container class that represents an item that can be interacted with.
Definition Item.java:21
final int getId()
Gets the identification of this item.
Definition Item.java:324
final int getAmount()
Gets the quantity of this item.
Definition Item.java:342
Represents a single tile on the game world.
Definition Position.java:14
static Position create(int x, int y, int z)
Creates a location.
Handles miscellaneous methods.
Definition Utility.java:27
static String getDate()
Gets the date of server.
Definition Utility.java:126
The activity log class.
Holds the data for pets.
Definition PetData.java:14
Handles the perk rewards from prestiging.
The in-game spellbooks for players.
Definition Spellbook.java:8
Holds all the unlockable slayer rewards and tasks.
The enumerated type whose elements represent the fighting types.
Represents the enumerated login response codes.