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