content: package emu.grasscutter.game.home;
  
  import dev.morphia.annotations.Entity;
  import emu.grasscutter.data.GameData;
  import emu.grasscutter.data.binout.HomeworldDefaultSaveData;
  import emu.grasscutter.data.excels.ItemData;
  import emu.grasscutter.net.proto.HomeFurnitureDataOuterClass;
  import emu.grasscutter.net.proto.HomeMarkPointFurnitureDataOuterClass;
  import emu.grasscutter.net.proto.VectorOuterClass;
  import emu.grasscutter.utils.Position;
  import lombok.AccessLevel;
  import lombok.Builder;
  import lombok.Data;
  import lombok.experimental.FieldDefaults;
  
  @Entity
  @Data
  @FieldDefaults(level = AccessLevel.PRIVATE)
  @Builder(builderMethodName = "of")
  public class HomeFurnitureItem {
      int furnitureId;
      int guid;
      int parentFurnitureIndex;
      Position spawnPos;
      Position spawnRot;
      int version;
      public HomeFurnitureDataOuterClass.HomeFurnitureData toProto(){
          return HomeFurnitureDataOuterClass.HomeFurnitureData.newBuilder()
                  .setFurnitureId(furnitureId)
                  .setGuid(guid)
                  .setParentFurnitureIndex(parentFurnitureIndex)
                  .setSpawnPos(spawnPos.toProto())
                  .setSpawnRot(spawnRot.toProto())
                  .setVersion(version)
                  .build();
      }
  
      public HomeMarkPointFurnitureDataOuterClass.HomeMarkPointFurnitureData toMarkPointProto(int type){
          return HomeMarkPointFurnitureDataOuterClass.HomeMarkPointFurnitureData.newBuilder()
                  .setFurnitureId(furnitureId)
                  .setGuid(guid)
                  .setFurnitureType(type)
                  .setPos(spawnPos.toProto())
                  // TODO NPC and farm
                  .build();
      }
  
      public static HomeFurnitureItem parseFrom(HomeFurnitureDataOuterClass.HomeFurnitureData homeFurnitureData) {
          return HomeFurnitureItem.of()
                  .furnitureId(homeFurnitureData.getFurnitureId())
                  .guid(homeFurnitureData.getGuid())
                  .parentFurnitureIndex(homeFurnitureData.getParentFurnitureIndex())
                  .spawnPos(new Position(homeFurnitureData.getSpawnPos()))
                  .spawnRot(new Position(homeFurnitureData.getSpawnRot()))
                  .version(homeFurnitureData.getVersion())
                  .build();
      }
  
      public static HomeFurnitureItem parseFrom(HomeworldDefaultSaveData.HomeFurniture homeFurniture) {
          return HomeFurnitureItem.of()
                  .furnitureId(homeFurniture.getId())
                  .parentFurnitureIndex(1)
                  .spawnPos(homeFurniture.getPos() == null ? new Position() : homeFurniture.getPos())
                  .spawnRot(homeFurniture.getRot() == null ? new Position() : homeFurniture.getRot())
                  .build();
      }
  
      public ItemData getAsItem() {
          return GameData.getItemDataMap().get(this.furnitureId);
      }
  
      public int getComfort() {
          var item = getAsItem();
  
          if (item == null){
              return 0;
          }
          return item.getComfort();
      }
  }
  