package emu.grasscutter.game.home; import dev.morphia.annotations.Entity; import dev.morphia.annotations.Id; import dev.morphia.annotations.IndexOptions; import dev.morphia.annotations.Indexed; import dev.morphia.annotations.Transient; import emu.grasscutter.Grasscutter; import emu.grasscutter.data.GameData; import emu.grasscutter.data.excels.HomeWorldLevelData; import emu.grasscutter.database.DatabaseHelper; import emu.grasscutter.game.player.Player; import emu.grasscutter.server.packet.send.*; import lombok.AccessLevel; import lombok.Builder; import lombok.Data; import lombok.experimental.FieldDefaults; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @Entity(value = "homes", useDiscriminator = false) @Data @FieldDefaults(level = AccessLevel.PRIVATE) @Builder(builderMethodName = "of") public class GameHome { @Id String id; @Indexed(options = @IndexOptions(unique = true)) long ownerUid; @Transient Player player; int level; int exp; List furnitureMakeSlotItemList; ConcurrentHashMap sceneMap; Set unlockedHomeBgmList; public void save() { DatabaseHelper.saveHome(this); } public static GameHome getByUid(Integer uid) { var home = DatabaseHelper.getHomeByUid(uid); if (home == null) { home = GameHome.create(uid); } return home; } public static GameHome create(Integer uid) { return GameHome.of() .ownerUid(uid) .level(1) .sceneMap(new ConcurrentHashMap<>()) .build(); } public HomeSceneItem getHomeSceneItem(int sceneId) { return sceneMap.computeIfAbsent(sceneId, e -> { var defaultItem = GameData.getHomeworldDefaultSaveData().get(sceneId); if (defaultItem != null) { Grasscutter.getLogger().info("Set player {} home {} to initial setting", ownerUid, sceneId); return HomeSceneItem.parseFrom(defaultItem, sceneId); } return null; }); } public void onOwnerLogin(Player player) { if (this.player == null) this.player = player; player.getSession().send(new PacketHomeBasicInfoNotify(player, false)); player.getSession().send(new PacketPlayerHomeCompInfoNotify(player)); player.getSession().send(new PacketHomeComfortInfoNotify(player)); player.getSession().send(new PacketFurnitureCurModuleArrangeCountNotify()); player.getSession().send(new PacketHomeMarkPointNotify(player)); player.getSession().send(new PacketUnlockedHomeBgmNotify(player)); } public Player getPlayer() { if (this.player == null) this.player = Grasscutter.getGameServer().getPlayerByUid((int) this.ownerUid, true); return this.player; } public HomeWorldLevelData getLevelData() { return GameData.getHomeWorldLevelDataMap().get(level); } public boolean addUnlockedHomeBgm(int homeBgmId) { if (getUnlockedHomeBgmList().add(homeBgmId)) return false; var player = this.getPlayer(); player.sendPacket(new PacketUnlockHomeBgmNotify(homeBgmId)); player.sendPacket(new PacketUnlockedHomeBgmNotify(player)); save(); return true; } public Set getUnlockedHomeBgmListInfo() { if (this.unlockedHomeBgmList == null) { this.unlockedHomeBgmList = new HashSet<>(); addAllDefaultUnlockedBgmIds(this.unlockedHomeBgmList); save(); } return this.unlockedHomeBgmList; } private void addAllDefaultUnlockedBgmIds(Set list) { GameData.getHomeWorldBgmDataMap().forEach((id, data) -> { if (data.isDefaultUnlock()) list.add(id); }); } }