HomeSceneItem.java 3.55 KB
Newer Older
1
2
3
4
package emu.grasscutter.game.home;

import dev.morphia.annotations.Entity;
import dev.morphia.annotations.Id;
5
import emu.grasscutter.Grasscutter;
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import emu.grasscutter.data.binout.HomeworldDefaultSaveData;
import emu.grasscutter.net.proto.HomeSceneArrangementInfoOuterClass.HomeSceneArrangementInfo;
import emu.grasscutter.utils.Position;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.FieldDefaults;

import java.util.Map;
import java.util.stream.Collectors;

@Entity
@Data
@Builder(builderMethodName = "of")
@FieldDefaults(level = AccessLevel.PRIVATE)
public class HomeSceneItem {
    @Id
    int sceneId;
    Map<Integer, HomeBlockItem> blockItems;
    Position bornPos;
    Position bornRot;
    Position djinnPos;
28
    int homeBgmId;
29
    HomeFurnitureItem mainHouse;
Akka's avatar
Akka committed
30
    int tmpVersion;
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    public static HomeSceneItem parseFrom(HomeworldDefaultSaveData defaultItem, int sceneId) {
        return HomeSceneItem.of()
                .sceneId(sceneId)
                .blockItems(defaultItem.getHomeBlockLists().stream()
                        .map(HomeBlockItem::parseFrom)
                        .collect(Collectors.toMap(HomeBlockItem::getBlockId, y -> y)))
                .bornPos(defaultItem.getBornPos())
                .bornRot(defaultItem.getBornRot() == null ? new Position() : defaultItem.getBornRot())
                .djinnPos(defaultItem.getDjinPos() == null ? new Position() : defaultItem.getDjinPos())
                .mainHouse(defaultItem.getMainhouse() == null ? null :
                        HomeFurnitureItem.parseFrom(defaultItem.getMainhouse()))
                .build();
    }

github-actions's avatar
github-actions committed
45
46
    public void update(HomeSceneArrangementInfo arrangementInfo) {
        for (var blockItem : arrangementInfo.getBlockArrangementInfoListList()) {
47
            var block = this.blockItems.get(blockItem.getBlockId());
github-actions's avatar
github-actions committed
48
            if (block == null) {
49
                Grasscutter.getLogger().warn("Could not found the Home Block {}", blockItem.getBlockId());
50
51
52
53
54
55
56
57
58
                continue;
            }
            block.update(blockItem);
            this.blockItems.put(blockItem.getBlockId(), block);
        }

        this.bornPos = new Position(arrangementInfo.getBornPos());
        this.bornRot = new Position(arrangementInfo.getBornRot());
        this.djinnPos = new Position(arrangementInfo.getDjinnPos());
59
        this.homeBgmId = arrangementInfo.getUnk2700BJHAMKKECEI();
60
        this.mainHouse = HomeFurnitureItem.parseFrom(arrangementInfo.getMainHouse());
Akka's avatar
Akka committed
61
        this.tmpVersion = arrangementInfo.getTmpVersion();
62
63
    }

github-actions's avatar
github-actions committed
64
65
    public int getRoomSceneId() {
        if (mainHouse == null || mainHouse.getAsItem() == null) {
66
67
68
69
70
            return 0;
        }
        return mainHouse.getAsItem().getRoomSceneId();
    }

github-actions's avatar
github-actions committed
71
    public int calComfort() {
72
73
74
75
76
        return this.blockItems.values().stream()
                .mapToInt(HomeBlockItem::calComfort)
                .sum();
    }

github-actions's avatar
github-actions committed
77
    public HomeSceneArrangementInfo toProto() {
78
79
80
81
82
83
84
        var proto = HomeSceneArrangementInfo.newBuilder();
        blockItems.values().forEach(b -> proto.addBlockArrangementInfoList(b.toProto()));

        proto.setComfortValue(calComfort())
                .setBornPos(bornPos.toProto())
                .setBornRot(bornRot.toProto())
                .setDjinnPos(djinnPos.toProto())
85
                .setIsSetBornPos(true)
86
                .setSceneId(sceneId)
87
                .setUnk2700BJHAMKKECEI(homeBgmId)
Akka's avatar
Akka committed
88
                .setTmpVersion(tmpVersion);
89

github-actions's avatar
github-actions committed
90
        if (mainHouse != null) {
91
92
93
94
95
96
            proto.setMainHouse(mainHouse.toProto());
        }
        return proto.build();
    }

}