GameHome.java 2.52 KB
Newer Older
1
2
3
4
5
6
7
8
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 emu.grasscutter.Grasscutter;
import emu.grasscutter.data.GameData;
Akka's avatar
Akka committed
9
import emu.grasscutter.data.excels.HomeWorldLevelData;
10
11
12
13
14
15
16
17
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;

Akka's avatar
Akka committed
18
import java.util.List;
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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;

Akka's avatar
Akka committed
33
34
35
    int level;
    int exp;
    List<FurnitureMakeSlotItem> furnitureMakeSlotItemList;
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
    ConcurrentHashMap<Integer, HomeSceneItem> sceneMap;

    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)
Akka's avatar
Akka committed
53
                .level(1)
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
                .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) {
        player.getSession().send(new PacketHomeBasicInfoNotify(player, false));
        player.getSession().send(new PacketPlayerHomeCompInfoNotify(player));
        player.getSession().send(new PacketHomeComfortInfoNotify(player));
        player.getSession().send(new PacketFurnitureCurModuleArrangeCountNotify());
Akka's avatar
Akka committed
74
75
76
77
78
        player.getSession().send(new PacketHomeMarkPointNotify(player));
    }

    public HomeWorldLevelData getLevelData(){
        return GameData.getHomeWorldLevelDataMap().get(level);
79
80
    }
}