HomeSceneItem.java 3.54 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
45
46
47
48
    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();
    }

    public void update(HomeSceneArrangementInfo arrangementInfo){
        for(var blockItem : arrangementInfo.getBlockArrangementInfoListList()){
            var block = this.blockItems.get(blockItem.getBlockId());
            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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
    }

    public int getRoomSceneId(){
        if(mainHouse == null || mainHouse.getAsItem() == null){
            return 0;
        }
        return mainHouse.getAsItem().getRoomSceneId();
    }

    public int calComfort(){
        return this.blockItems.values().stream()
                .mapToInt(HomeBlockItem::calComfort)
                .sum();
    }

    public HomeSceneArrangementInfo toProto(){
        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
90
91
92
93
94
95
96

        if(mainHouse != null){
            proto.setMainHouse(mainHouse.toProto());
        }
        return proto.build();
    }

}