package emu.grasscutter.game.home; import dev.morphia.annotations.Entity; import dev.morphia.annotations.Id; import emu.grasscutter.data.binout.HomeworldDefaultSaveData; import emu.grasscutter.net.proto.HomeBlockArrangementInfoOuterClass.HomeBlockArrangementInfo; import emu.grasscutter.utils.Position; import lombok.AccessLevel; import lombok.Builder; import lombok.Data; import lombok.experimental.FieldDefaults; import java.util.List; @Entity @Data @Builder(builderMethodName = "of") @FieldDefaults(level = AccessLevel.PRIVATE) public class HomeBlockItem { @Id int blockId; boolean unlocked; List deployFurnitureList; List persistentFurnitureList; List deployAnimalList; List deployNPCList; public void update(HomeBlockArrangementInfo homeBlockArrangementInfo) { this.blockId = homeBlockArrangementInfo.getBlockId(); this.deployFurnitureList = homeBlockArrangementInfo.getDeployFurniureListList().stream() .map(HomeFurnitureItem::parseFrom) .toList(); this.persistentFurnitureList = homeBlockArrangementInfo.getPersistentFurnitureListList().stream() .map(HomeFurnitureItem::parseFrom) .toList(); this.deployAnimalList = homeBlockArrangementInfo.getDeployAnimalListList().stream() .map(HomeAnimalItem::parseFrom) .toList(); this.deployNPCList = homeBlockArrangementInfo.getDeployNpcListList().stream() .map(HomeNPCItem::parseFrom) .toList(); } public int calComfort() { return this.deployFurnitureList.stream() .mapToInt(HomeFurnitureItem::getComfort) .sum(); } public HomeBlockArrangementInfo toProto() { var proto = HomeBlockArrangementInfo.newBuilder() .setBlockId(blockId) .setIsUnlocked(unlocked) .setComfortValue(calComfort()); this.deployFurnitureList.forEach(f -> proto.addDeployFurniureList(f.toProto())); this.persistentFurnitureList.forEach(f -> proto.addPersistentFurnitureList(f.toProto())); this.deployAnimalList.forEach(f -> proto.addDeployAnimalList(f.toProto())); this.deployNPCList.forEach(f -> proto.addDeployNpcList(f.toProto())); return proto.build(); } public static HomeBlockItem parseFrom(HomeworldDefaultSaveData.HomeBlock homeBlock) { // create from default setting return HomeBlockItem.of() .blockId(homeBlock.getBlockId()) .unlocked(homeBlock.getFurnitures() != null) .deployFurnitureList( homeBlock.getFurnitures() == null ? List.of() : homeBlock.getFurnitures().stream() .map(HomeFurnitureItem::parseFrom) .toList()) .persistentFurnitureList( homeBlock.getPersistentFurnitures() == null ? List.of() : homeBlock.getPersistentFurnitures().stream() .map(HomeFurnitureItem::parseFrom) .toList()) .deployAnimalList(List.of()) .deployNPCList(List.of()) .build(); } }