diff --git a/src/main/java/emu/grasscutter/database/DatabaseHelper.java b/src/main/java/emu/grasscutter/database/DatabaseHelper.java index 252b7a7fd..cb0731afb 100644 --- a/src/main/java/emu/grasscutter/database/DatabaseHelper.java +++ b/src/main/java/emu/grasscutter/database/DatabaseHelper.java @@ -11,6 +11,7 @@ import emu.grasscutter.GameConstants; import emu.grasscutter.Grasscutter; import emu.grasscutter.game.Account; import emu.grasscutter.game.avatar.Avatar; +import emu.grasscutter.game.battlepass.BattlePassManager; import emu.grasscutter.game.friends.Friendship; import emu.grasscutter.game.gacha.GachaRecord; import emu.grasscutter.game.home.GameHome; @@ -296,10 +297,27 @@ public final class DatabaseHelper { public static boolean deleteQuest(GameMainQuest quest) { return DatabaseManager.getGameDatastore().delete(quest).wasAcknowledged(); } + public static GameHome getHomeByUid(int id) { return DatabaseManager.getGameDatastore().find(GameHome.class).filter(Filters.eq("ownerUid", id)).first(); } + public static void saveHome(GameHome gameHome) { DatabaseManager.getGameDatastore().save(gameHome); } + + public static BattlePassManager loadBattlePass(Player player) { + BattlePassManager manager = DatabaseManager.getGameDatastore().find(BattlePassManager.class).filter(Filters.eq("ownerUid", player.getUid())).first(); + if (manager == null) { + manager = new BattlePassManager(player); + manager.save(); + } else { + manager.setPlayer(player); + } + return manager; + } + + public static void saveBattlePass(BattlePassManager manager) { + DatabaseManager.getGameDatastore().save(manager); + } } diff --git a/src/main/java/emu/grasscutter/database/DatabaseManager.java b/src/main/java/emu/grasscutter/database/DatabaseManager.java index b721e860e..565d76815 100644 --- a/src/main/java/emu/grasscutter/database/DatabaseManager.java +++ b/src/main/java/emu/grasscutter/database/DatabaseManager.java @@ -14,6 +14,7 @@ import emu.grasscutter.Grasscutter; import emu.grasscutter.Grasscutter.ServerRunMode; import emu.grasscutter.game.Account; import emu.grasscutter.game.avatar.Avatar; +import emu.grasscutter.game.battlepass.BattlePassManager; import emu.grasscutter.game.friends.Friendship; import emu.grasscutter.game.gacha.GachaRecord; import emu.grasscutter.game.home.GameHome; @@ -31,7 +32,7 @@ public final class DatabaseManager { private static final Class[] mappedClasses = new Class[] { DatabaseCounter.class, Account.class, Player.class, Avatar.class, GameItem.class, Friendship.class, - GachaRecord.class, Mail.class, GameMainQuest.class, GameHome.class + GachaRecord.class, Mail.class, GameMainQuest.class, GameHome.class, BattlePassManager.class }; public static Datastore getGameDatastore() { diff --git a/src/main/java/emu/grasscutter/game/Account.java b/src/main/java/emu/grasscutter/game/Account.java index cdb118af8..8685a16e3 100644 --- a/src/main/java/emu/grasscutter/game/Account.java +++ b/src/main/java/emu/grasscutter/game/Account.java @@ -29,9 +29,6 @@ public class Account { private List permissions; private Locale locale; - private int point; - private int awardTakenLevel; - private String banReason; private int banEndTime; private int banStartTime; @@ -212,22 +209,6 @@ public class Account { return this.permissions.remove(permission); } - public void setPoint(int point) { - this.point = point; - } - - public int getPoint() { - return point; - } - - public void setAwardTakenLevel(int level) { - this.awardTakenLevel = level; - } - - public int getAwardTakenLevel() { - return awardTakenLevel; - } - // TODO make unique public String generateLoginToken() { this.token = Utils.bytesToHex(Crypto.createSessionKey(32)); diff --git a/src/main/java/emu/grasscutter/game/battlepass/BattlePassManager.java b/src/main/java/emu/grasscutter/game/battlepass/BattlePassManager.java index c4aa84f71..0bc22a71b 100644 --- a/src/main/java/emu/grasscutter/game/battlepass/BattlePassManager.java +++ b/src/main/java/emu/grasscutter/game/battlepass/BattlePassManager.java @@ -1,35 +1,44 @@ package emu.grasscutter.game.battlepass; +import org.bson.types.ObjectId; + +import dev.morphia.annotations.Entity; +import dev.morphia.annotations.Id; +import dev.morphia.annotations.Indexed; +import dev.morphia.annotations.Transient; +import emu.grasscutter.database.DatabaseHelper; import emu.grasscutter.game.player.Player; import emu.grasscutter.server.packet.send.PacketBattlePassCurScheduleUpdateNotify; +@Entity(value = "battlepass", useDiscriminator = false) public class BattlePassManager { - - private final Player player; + @Id private ObjectId id; + @Transient private Player player; + + @Indexed private int ownerUid; private int point; private int awardTakenLevel; + + @Deprecated // Morphia only + public BattlePassManager() {} - public BattlePassManager(Player player){ - this.player = player; - point = player.getAccount().getPoint(); - awardTakenLevel = player.getAccount().getAwardTakenLevel(); + public BattlePassManager(Player player) { + this.setPlayer(player); } + + public ObjectId getId() { + return id; + } - public void addPoint(int point){ - this.point += point; - player.getAccount().setPoint(point); - player.getSession().send(new PacketBattlePassCurScheduleUpdateNotify(player.getSession().getPlayer())); - //save the point data - player.getAccount().save(); + public Player getPlayer() { + return this.player; } - - public void updateAwardTakenLevel(int level){ - this.awardTakenLevel = level; - player.getAccount().setAwardTakenLevel(awardTakenLevel); - player.getSession().send(new PacketBattlePassCurScheduleUpdateNotify(player.getSession().getPlayer())); - player.getAccount().save(); + + public void setPlayer(Player player) { + this.player = player; + this.ownerUid = player.getUid(); } - + public int getPoint() { return point; } @@ -37,4 +46,20 @@ public class BattlePassManager { public int getAwardTakenLevel() { return awardTakenLevel; } + + public void addPoint(int point){ + this.point += point; + player.getSession().send(new PacketBattlePassCurScheduleUpdateNotify(player.getSession().getPlayer())); + this.save(); + } + + public void updateAwardTakenLevel(int level){ + this.awardTakenLevel = level; + player.getSession().send(new PacketBattlePassCurScheduleUpdateNotify(player.getSession().getPlayer())); + this.save(); + } + + public void save() { + DatabaseHelper.saveBattlePass(this); + } } diff --git a/src/main/java/emu/grasscutter/game/player/Player.java b/src/main/java/emu/grasscutter/game/player/Player.java index ef32f1624..c154cefd8 100644 --- a/src/main/java/emu/grasscutter/game/player/Player.java +++ b/src/main/java/emu/grasscutter/game/player/Player.java @@ -292,10 +292,6 @@ public class Player { this.account = account; } - public void setBattlePassManager(Player player){ - this.battlePassManager = new BattlePassManager(player); - } - public GameSession getSession() { return session; } @@ -1215,6 +1211,11 @@ public class Player { public BattlePassManager getBattlePassManager(){ return battlePassManager; } + + public void loadBattlePassManager() { + if (this.battlePassManager != null) return; + this.battlePassManager = DatabaseHelper.loadBattlePass(this); + } public AbilityManager getAbilityManager() { return abilityManager; @@ -1318,15 +1319,17 @@ public class Player { } //Make sure towerManager's player is online player this.getTowerManager().setPlayer(this); + // Load from db this.getAvatars().loadFromDatabase(); this.getInventory().loadFromDatabase(); - this.getAvatars().postLoad(); + this.getAvatars().postLoad(); // Needs to be called after inventory is handled this.getFriendsList().loadFromDatabase(); this.getMailHandler().loadFromDatabase(); this.getQuestManager().loadFromDatabase(); - + + this.loadBattlePassManager(); } public void onLogin() { diff --git a/src/main/java/emu/grasscutter/server/game/GameSession.java b/src/main/java/emu/grasscutter/server/game/GameSession.java index effaea4a0..fdec9d2ca 100644 --- a/src/main/java/emu/grasscutter/server/game/GameSession.java +++ b/src/main/java/emu/grasscutter/server/game/GameSession.java @@ -76,7 +76,6 @@ public class GameSession implements GameSessionManager.KcpChannel { this.player = player; this.player.setSession(this); this.player.setAccount(this.getAccount()); - this.player.setBattlePassManager(this.player);; } public SessionState getState() { diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassAllDataNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassAllDataNotify.java index a986a220c..dc0ce294c 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassAllDataNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassAllDataNotify.java @@ -21,7 +21,7 @@ public class PacketBattlePassAllDataNotify extends BasePacket { List rewardTags = new ArrayList<>(); - for (int id = 1; id <= player.getAccount().getAwardTakenLevel(); id++) + for (int id = 1; id <= player.getBattlePassManager().getAwardTakenLevel(); id++) rewardTags.add(BattlePassRewardTagOuterClass.BattlePassRewardTag.newBuilder() .setLevel(id) .setUnlockStatus(BattlePassUnlockStatusOuterClass.BattlePassUnlockStatus.BATTLE_PASS_UNLOCK_STATUS_FREE) diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassCurScheduleUpdateNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassCurScheduleUpdateNotify.java index 0137e3e42..78e22a05d 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassCurScheduleUpdateNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassCurScheduleUpdateNotify.java @@ -18,7 +18,7 @@ public class PacketBattlePassCurScheduleUpdateNotify extends BasePacket { List rewardTags = new ArrayList<>(); - for (int id = 1; id <= player.getAccount().getAwardTakenLevel(); id++) + for (int id = 1; id <= player.getBattlePassManager().getAwardTakenLevel(); id++) rewardTags.add(BattlePassRewardTagOuterClass.BattlePassRewardTag.newBuilder() .setLevel(id) .setUnlockStatus(BattlePassUnlockStatusOuterClass.BattlePassUnlockStatus.BATTLE_PASS_UNLOCK_STATUS_FREE) @@ -31,8 +31,7 @@ public class PacketBattlePassCurScheduleUpdateNotify extends BasePacket { .setIsViewed(true).setUnlockStatus(BattlePassUnlockStatusOuterClass.BattlePassUnlockStatus.BATTLE_PASS_UNLOCK_STATUS_FREE).setCurCyclePoints(0) .setCurCycle(BattlePassCycleOuterClass.BattlePassCycle.newBuilder().setBeginTime(1653940800).setEndTime(2059483200).setCycleIdx(3).build()); - var proto - = BattlePassCurScheduleUpdateNotifyOuterClass.BattlePassCurScheduleUpdateNotify.newBuilder(); + var proto = BattlePassCurScheduleUpdateNotifyOuterClass.BattlePassCurScheduleUpdateNotify.newBuilder(); proto.setHaveCurSchedule(true).setCurSchedule(curSchedule).build();