content: package emu.grasscutter.server.packet.send;
  
  import java.util.Collections;
  
  import emu.grasscutter.data.GameData;
  import emu.grasscutter.game.player.Player;
  import emu.grasscutter.net.packet.BasePacket;
  import emu.grasscutter.net.packet.PacketOpcodes;
  import emu.grasscutter.net.proto.CodexDataFullNotifyOuterClass.CodexDataFullNotify;
  import emu.grasscutter.net.proto.CodexTypeDataOuterClass.CodexTypeData;
  
  public class PacketCodexDataFullNotify extends BasePacket {
      public PacketCodexDataFullNotify(Player player) {
          super(PacketOpcodes.CodexDataFullNotify, true);
  
          //Quests
          CodexTypeData.Builder questTypeData = CodexTypeData.newBuilder()
                  .setTypeValue(1);
  
          //Weapons
          CodexTypeData.Builder weaponTypeData = CodexTypeData.newBuilder()
                  .setTypeValue(2);
  
          //Animals
          CodexTypeData.Builder animalTypeData = CodexTypeData.newBuilder()
                  .setTypeValue(3);
  
          //Materials
          CodexTypeData.Builder materialTypeData = CodexTypeData.newBuilder()
                  .setTypeValue(4);
  
          //Books
          CodexTypeData.Builder bookTypeData = CodexTypeData.newBuilder()
                  .setTypeValue(5);
  
          //Tips
          CodexTypeData.Builder pushTipsTypeData = CodexTypeData.newBuilder()
                  .setTypeValue(6);
  
          //Views
          CodexTypeData.Builder viewTypeData = CodexTypeData.newBuilder()
                  .setTypeValue(7);
  
          //Reliquary
          CodexTypeData.Builder reliquaryData = CodexTypeData.newBuilder()
                  .setTypeValue(8);
  
          player.getQuestManager().forEachMainQuest(mainQuest -> {
              if(mainQuest.isFinished()){
                  var codexQuest = GameData.getCodexQuestDataIdMap().get(mainQuest.getParentQuestId());
                  if(codexQuest != null){
                      questTypeData.addCodexIdList(codexQuest.getId()).addAllHaveViewedList(Collections.singleton(true));
                  }
              }
          });
  
          player.getCodex().getUnlockedWeapon().forEach(weapon -> {
              var codexWeapon = GameData.getCodexWeaponDataIdMap().get(weapon);
              if(codexWeapon != null){
                  weaponTypeData.addCodexIdList(codexWeapon.getId()).addAllHaveViewedList(Collections.singleton(true));
              }
          });
  
          player.getCodex().getUnlockedAnimal().forEach((animal, amount) -> {
              var codexAnimal = GameData.getCodexAnimalDataMap().get(animal);
              if(codexAnimal != null){
                  animalTypeData.addCodexIdList(codexAnimal.getId()).addAllHaveViewedList(Collections.singleton(true));
              }
          });
  
          player.getCodex().getUnlockedMaterial().forEach(material -> {
              var codexMaterial = GameData.getCodexMaterialDataIdMap().get(material);
              if(codexMaterial != null){
                  materialTypeData.addCodexIdList(codexMaterial.getId()).addAllHaveViewedList(Collections.singleton(true));
              }
          });
  
          player.getCodex().getUnlockedReliquarySuitCodex().forEach(reliquarySuit -> {
              reliquaryData.addCodexIdList(reliquarySuit).addAllHaveViewedList(Collections.singleton(true));
          });
  
          CodexDataFullNotify.Builder proto = CodexDataFullNotify.newBuilder()
                  .addTypeDataList(questTypeData.build())
                  .addTypeDataList(weaponTypeData)
                  .addTypeDataList(animalTypeData)
                  .addTypeDataList(materialTypeData)
                  .addTypeDataList(bookTypeData)
                  .addTypeDataList(pushTipsTypeData.build())
                  .addTypeDataList(viewTypeData.build())
                  .addTypeDataList(reliquaryData);
  
          this.setData(proto);
      }
  }
  