diff --git a/src/main/java/emu/grasscutter/data/GameData.java b/src/main/java/emu/grasscutter/data/GameData.java index ed5c469bb..823c0cc14 100644 --- a/src/main/java/emu/grasscutter/data/GameData.java +++ b/src/main/java/emu/grasscutter/data/GameData.java @@ -64,8 +64,16 @@ public class GameData { private static final Int2ObjectMap sceneDataMap = new Int2ObjectLinkedOpenHashMap<>(); private static final Int2ObjectMap fetterDataMap = new Int2ObjectOpenHashMap<>(); - private static final Int2ObjectMap codexQuestMap = new Int2ObjectOpenHashMap<>(); - private static final Int2ObjectMap codexQuestIdMap = new Int2ObjectOpenHashMap<>(); + private static final Int2ObjectMap codexQuestDataMap = new Int2ObjectOpenHashMap<>(); + private static final Int2ObjectMap codexQuestDataIdMap = new Int2ObjectOpenHashMap<>(); + private static final Int2ObjectMap codexAnimalDataMap = new Int2ObjectOpenHashMap<>(); + private static final Int2ObjectMap codexWeaponDataMap = new Int2ObjectOpenHashMap<>(); + private static final Int2ObjectMap codexWeaponDataIdMap = new Int2ObjectOpenHashMap<>(); + private static final Int2ObjectMap codexMaterialDataMap = new Int2ObjectOpenHashMap<>(); + private static final Int2ObjectMap codexMaterialDataIdMap = new Int2ObjectOpenHashMap<>(); + private static final Int2ObjectMap codexReliquaryDataMap = new Int2ObjectOpenHashMap<>(); + private static final Int2ObjectMap codexReliquaryDataIdMap = new Int2ObjectOpenHashMap<>(); + private static final ArrayList codexReliquaryArrayList = new ArrayList<>(); private static final Int2ObjectMap fetterCharacterCardDataMap = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap rewardDataMap = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap worldLevelDataMap = new Int2ObjectOpenHashMap<>(); @@ -294,9 +302,17 @@ public class GameData { return fetters; } - public static Int2ObjectMap getCodexQuestMap(){return codexQuestMap;} + public static Int2ObjectMap getCodexQuestDataIdMap(){return codexQuestDataIdMap;} - public static Int2ObjectMap getCodexQuestIdMap(){return codexQuestIdMap;} + public static Int2ObjectMap getCodexAnimalDataMap(){return codexAnimalDataMap;} + + public static Int2ObjectMap getCodexWeaponDataIdMap(){return codexWeaponDataIdMap;} + + public static Int2ObjectMap getCodexMaterialDataIdMap(){return codexMaterialDataIdMap;} + + public static Int2ObjectMap getcodexReliquaryIdMap(){return codexReliquaryDataIdMap;} + + public static ArrayList getcodexReliquaryArrayList(){return codexReliquaryArrayList;} public static Int2ObjectMap getWorldLevelDataMap() { return worldLevelDataMap; diff --git a/src/main/java/emu/grasscutter/data/def/CodexAnimalData.java b/src/main/java/emu/grasscutter/data/def/CodexAnimalData.java new file mode 100644 index 000000000..b50ac02d2 --- /dev/null +++ b/src/main/java/emu/grasscutter/data/def/CodexAnimalData.java @@ -0,0 +1,39 @@ +package emu.grasscutter.data.def; + +import emu.grasscutter.data.GameResource; +import emu.grasscutter.data.ResourceType; + +@ResourceType(name = {"AnimalCodexExcelConfigData.json"}) +public class CodexAnimalData extends GameResource { + private int Id; + private String Type; + private int DescribeId; + private int SortOrder; + private CodexAnimalUnlockCondition BAINKHIIMJE; + + @Override + public int getId() { + return Id; + } + + public String getType() { + return Type; + } + + public int getDescribeId() { + return DescribeId; + } + + public int getSortOrder() { + return SortOrder; + } + + public CodexAnimalUnlockCondition getUnlockCondition() { + return BAINKHIIMJE; + } + + public enum CodexAnimalUnlockCondition { + CODEX_COUNT_TYPE_KILL, + CODEX_COUNT_TYPE_CAPTURE + } +} diff --git a/src/main/java/emu/grasscutter/data/def/CodexMaterialData.java b/src/main/java/emu/grasscutter/data/def/CodexMaterialData.java new file mode 100644 index 000000000..a533afd09 --- /dev/null +++ b/src/main/java/emu/grasscutter/data/def/CodexMaterialData.java @@ -0,0 +1,29 @@ +package emu.grasscutter.data.def; + +import emu.grasscutter.data.GameData; +import emu.grasscutter.data.GameResource; +import emu.grasscutter.data.ResourceType; + +@ResourceType(name = {"MaterialCodexExcelConfigData.json"}) +public class CodexMaterialData extends GameResource { + private int Id; + private int MaterialId; + private int SortOrder; + + public int getSortOrder() { + return SortOrder; + } + + public int getMaterialId() { + return MaterialId; + } + + public int getId() { + return Id; + } + + @Override + public void onLoad() { + GameData.getCodexMaterialDataIdMap().put(this.getMaterialId(), this); + } +} diff --git a/src/main/java/emu/grasscutter/data/def/CodexQuest.java b/src/main/java/emu/grasscutter/data/def/CodexQuestData.java similarity index 72% rename from src/main/java/emu/grasscutter/data/def/CodexQuest.java rename to src/main/java/emu/grasscutter/data/def/CodexQuestData.java index 578837e04..fc02eeb6c 100644 --- a/src/main/java/emu/grasscutter/data/def/CodexQuest.java +++ b/src/main/java/emu/grasscutter/data/def/CodexQuestData.java @@ -1,12 +1,11 @@ package emu.grasscutter.data.def; -import emu.grasscutter.Grasscutter; import emu.grasscutter.data.GameData; import emu.grasscutter.data.GameResource; import emu.grasscutter.data.ResourceType; -@ResourceType(name = {"QuestCodexExcelConfigData.json"}, loadPriority = ResourceType.LoadPriority.HIGH) -public class CodexQuest extends GameResource { +@ResourceType(name = {"QuestCodexExcelConfigData.json"}) +public class CodexQuestData extends GameResource { private int Id; private int ParentQuestId; private int ChapterId; @@ -36,7 +35,7 @@ public class CodexQuest extends GameResource { @Override public void onLoad() { if(!this.getIsDisuse()) { - GameData.getCodexQuestIdMap().put(this.getParentQuestId(), this); + GameData.getCodexQuestDataIdMap().put(this.getParentQuestId(), this); } } } diff --git a/src/main/java/emu/grasscutter/data/def/CodexReliquaryData.java b/src/main/java/emu/grasscutter/data/def/CodexReliquaryData.java new file mode 100644 index 000000000..de177dab5 --- /dev/null +++ b/src/main/java/emu/grasscutter/data/def/CodexReliquaryData.java @@ -0,0 +1,60 @@ +package emu.grasscutter.data.def; + +import emu.grasscutter.data.GameData; +import emu.grasscutter.data.GameResource; +import emu.grasscutter.data.ResourceType; + +@ResourceType(name = {"ReliquaryCodexExcelConfigData.json"}) +public class CodexReliquaryData extends GameResource { + private int Id; + private int SuitId; + private int Level; + private int CupId; + private int LeatherId; + private int CapId; + private int FlowerId; + private int SandId; + private int SortOrder; + + public int getSortOrder() { + return SortOrder; + } + + public int getId() { + return Id; + } + + public int getSuitId() { + return SuitId; + } + + public int getLevel() { + return Level; + } + + public int getCupId() { + return CupId; + } + + public int getLeatherId() { + return LeatherId; + } + + public int getCapId() { + return CapId; + } + + public int getFlowerId() { + return FlowerId; + } + + public int getSandId() { + return SandId; + } + + @Override + public void onLoad() { + GameData.getcodexReliquaryArrayList().add(this); + GameData.getcodexReliquaryIdMap().put(getSuitId(), this); + } +} diff --git a/src/main/java/emu/grasscutter/data/def/CodexWeaponData.java b/src/main/java/emu/grasscutter/data/def/CodexWeaponData.java new file mode 100644 index 000000000..9dfcbc673 --- /dev/null +++ b/src/main/java/emu/grasscutter/data/def/CodexWeaponData.java @@ -0,0 +1,29 @@ +package emu.grasscutter.data.def; + +import emu.grasscutter.data.GameData; +import emu.grasscutter.data.GameResource; +import emu.grasscutter.data.ResourceType; + +@ResourceType(name = {"WeaponCodexExcelConfigData.json"}) +public class CodexWeaponData extends GameResource { + private int Id; + private int WeaponId; + private int SortOrder; + + public int getSortOrder() { + return SortOrder; + } + + public int getWeaponId() { + return WeaponId; + } + + public int getId() { + return Id; + } + + @Override + public void onLoad() { + GameData.getCodexWeaponDataIdMap().put(this.getWeaponId(), this); + } +} diff --git a/src/main/java/emu/grasscutter/game/inventory/Inventory.java b/src/main/java/emu/grasscutter/game/inventory/Inventory.java index a2e57cea6..38b3eb67c 100644 --- a/src/main/java/emu/grasscutter/game/inventory/Inventory.java +++ b/src/main/java/emu/grasscutter/game/inventory/Inventory.java @@ -240,6 +240,7 @@ public class Inventory implements Iterable { } private synchronized void putItem(GameItem item, InventoryTab tab) { + getPlayer().getCodex().checkAddedItem(item); // Set owner and guid FIRST! item.setOwner(getPlayer()); // Put in item store diff --git a/src/main/java/emu/grasscutter/game/player/Player.java b/src/main/java/emu/grasscutter/game/player/Player.java index 775d3a9a4..ef3abc7f7 100644 --- a/src/main/java/emu/grasscutter/game/player/Player.java +++ b/src/main/java/emu/grasscutter/game/player/Player.java @@ -2,7 +2,6 @@ package emu.grasscutter.game.player; import dev.morphia.annotations.*; import emu.grasscutter.GameConstants; -import emu.grasscutter.Grasscutter; import emu.grasscutter.data.GameData; import emu.grasscutter.data.def.PlayerLevelData; import emu.grasscutter.database.DatabaseHelper; @@ -30,8 +29,6 @@ import emu.grasscutter.game.props.ActionReason; import emu.grasscutter.game.props.EntityType; import emu.grasscutter.game.props.PlayerProperty; import emu.grasscutter.game.props.SceneType; -import emu.grasscutter.game.quest.GameMainQuest; -import emu.grasscutter.game.quest.GameQuest; import emu.grasscutter.game.quest.QuestManager; import emu.grasscutter.game.shop.ShopLimit; import emu.grasscutter.game.managers.MapMarkManager.*; @@ -80,6 +77,7 @@ public class Player { private Position pos; private Position rotation; private PlayerBirthday birthday; + private PlayerCodex codex; private Map properties; private Set nameCardList; @@ -189,6 +187,7 @@ public class Player { this.birthday = new PlayerBirthday(); this.rewardedLevels = new HashSet<>(); this.moonCardGetTimes = new HashSet<>(); + this.codex = new PlayerCodex(); this.shopLimit = new ArrayList<>(); this.expeditionInfo = new HashMap<>(); @@ -209,6 +208,7 @@ public class Player { this.signature = ""; this.teamManager = new TeamManager(this); this.birthday = new PlayerBirthday(); + this.codex = new PlayerCodex(); this.setProperty(PlayerProperty.PROP_PLAYER_LEVEL, 1); this.setProperty(PlayerProperty.PROP_IS_SPRING_AUTO_USE, 1); this.setProperty(PlayerProperty.PROP_SPRING_AUTO_USE_PERCENT, 50); @@ -758,7 +758,6 @@ public class Player { return expeditionInfo.get(avaterGuid); } - public List getShopLimit() { return shopLimit; } @@ -984,6 +983,8 @@ public class Player { return this.birthday.getDay() > 0; } + public PlayerCodex getCodex(){ return this.codex; } + public Set getRewardedLevels() { return rewardedLevels; } @@ -1159,6 +1160,7 @@ public class Player { @PostLoad private void onLoad() { + this.getCodex().setPlayer(this); this.getTeamManager().setPlayer(this); this.getTowerManager().setPlayer(this); } @@ -1229,7 +1231,6 @@ public class Player { session.send(new PacketFinishedParentQuestNotify(this)); session.send(new PacketQuestListNotify(this)); session.send(new PacketCodexDataFullNotify(this)); - session.send(new PacketServerCondMeetQuestListUpdateNotify(this)); session.send(new PacketAllWidgetDataNotify(this)); session.send(new PacketWidgetGadgetAllDataNotify()); session.send(new PacketPlayerHomeCompInfoNotify(this)); diff --git a/src/main/java/emu/grasscutter/game/player/PlayerCodex.java b/src/main/java/emu/grasscutter/game/player/PlayerCodex.java new file mode 100644 index 000000000..b054b2e95 --- /dev/null +++ b/src/main/java/emu/grasscutter/game/player/PlayerCodex.java @@ -0,0 +1,160 @@ +package emu.grasscutter.game.player; + +import dev.morphia.annotations.Entity; +import dev.morphia.annotations.Transient; +import emu.grasscutter.data.GameData; +import emu.grasscutter.data.def.CodexAnimalData; +import emu.grasscutter.data.def.CodexReliquaryData; +import emu.grasscutter.game.entity.GameEntity; +import emu.grasscutter.game.inventory.GameItem; +import emu.grasscutter.game.inventory.ItemType; +import emu.grasscutter.game.inventory.MaterialType; +import emu.grasscutter.server.packet.send.PacketCodexDataUpdateNotify; + +import java.util.*; + +@Entity +public class PlayerCodex { + @Transient private Player player; + + //itemId is not codexId! + private Set unlockedWeapon; + private Map unlockedAnimal; + private Set unlockedMaterial; + private Set unlockedBook; + private Set unlockedTip; + private Set unlockedView; + private Set unlockedReliquary; + private Set unlockedReliquarySuitCodex; + + public PlayerCodex(){ + this.unlockedWeapon = new HashSet<>(); + this.unlockedAnimal = new HashMap<>(); + this.unlockedMaterial = new HashSet<>(); + this.unlockedBook = new HashSet<>(); + this.unlockedTip = new HashSet<>(); + this.unlockedView = new HashSet<>(); + this.unlockedReliquary = new HashSet<>(); + this.unlockedReliquarySuitCodex = new HashSet<>(); + } + + public void setPlayer(Player player) { + this.player = player; + } + + public void checkAddedItem(GameItem item){ + ItemType type = item.getItemData().getItemType(); + if (type == ItemType.ITEM_WEAPON){ + if(!getUnlockedWeapon().contains(item.getItemId())){ + getUnlockedWeapon().add(item.getItemId()); + var codexItem = GameData.getCodexWeaponDataIdMap().get(item.getItemId()); + if(codexItem != null){ + player.save(); + this.player.sendPacket(new PacketCodexDataUpdateNotify(2, codexItem.getId())); + } + } + } + else if(type == ItemType.ITEM_MATERIAL){ + if( item.getItemData().getMaterialType() == MaterialType.MATERIAL_FOOD || + item.getItemData().getMaterialType() == MaterialType.MATERIAL_WIDGET|| + item.getItemData().getMaterialType() == MaterialType.MATERIAL_EXCHANGE|| + item.getItemData().getMaterialType() == MaterialType.MATERIAL_AVATAR_MATERIAL|| + item.getItemData().getMaterialType() == MaterialType.MATERIAL_NOTICE_ADD_HP){ + if (!getUnlockedMaterial().contains(item.getItemId())) { + var codexMaterial = GameData.getCodexMaterialDataIdMap().get(item.getItemId()); + if (codexMaterial != null) { + getUnlockedMaterial().add(item.getItemId()); + player.save(); + this.player.sendPacket(new PacketCodexDataUpdateNotify(4, codexMaterial.getId())); + } + } + } + } + else if(type == ItemType.ITEM_RELIQUARY) { + if(!getUnlockedReliquary().contains(item.getItemId())){ + getUnlockedReliquary().add(item.getItemId()); + checkUnlockedSuits(item); + } + } + } + + public void checkAnimal(GameEntity target, CodexAnimalData.CodexAnimalUnlockCondition condition){ + if(target.getEntityType() == 2){ + var monsterId = target.getSpawnEntry().getMonsterId(); + var codexAnimal = GameData.getCodexAnimalDataMap().get(monsterId); + + if(!getUnlockedAnimal().containsKey(monsterId)) { + if (codexAnimal != null) { + if(codexAnimal.getUnlockCondition() == condition){ + getUnlockedAnimal().put(monsterId, 1); + player.save(); + this.player.sendPacket(new PacketCodexDataUpdateNotify(3, monsterId)); + } + } + }else{ + getUnlockedAnimal().put(monsterId, getUnlockedAnimal().get(monsterId) + 1); + player.save(); + } + } + } + + public void checkUnlockedSuits(GameItem item){ + int reliquaryId = item.getItemId(); + Optional excelReliquarySuitList = GameData.getcodexReliquaryArrayList().stream().filter( + x -> x.getCupId() == reliquaryId + || x.getLeatherId() == reliquaryId + || x.getCapId() == reliquaryId + || x.getFlowerId() == reliquaryId + || x.getSandId() == reliquaryId + ).findFirst(); + if(excelReliquarySuitList.isPresent()) { + var excelReliquarySuit = excelReliquarySuitList.get(); + if(!getUnlockedReliquarySuitCodex().contains(excelReliquarySuit.getId())){ + if( + getUnlockedReliquary().contains(excelReliquarySuit.getCupId()) && + getUnlockedReliquary().contains(excelReliquarySuit.getLeatherId()) && + getUnlockedReliquary().contains(excelReliquarySuit.getCapId()) && + getUnlockedReliquary().contains(excelReliquarySuit.getFlowerId()) && + getUnlockedReliquary().contains(excelReliquarySuit.getSandId()) + ){ + getUnlockedReliquarySuitCodex().add(excelReliquarySuit.getId()); + player.save(); + this.player.sendPacket(new PacketCodexDataUpdateNotify(8, excelReliquarySuit.getId())); + } + } + } + } + + public Set getUnlockedWeapon() { + return unlockedWeapon; + } + + public Map getUnlockedAnimal() { + return unlockedAnimal; + } + + public Set getUnlockedMaterial() { + return unlockedMaterial; + } + + public Set getUnlockedBook() { + return unlockedBook; + } + + public Set getUnlockedTip() { + return unlockedTip; + } + + public Set getUnlockedView() { + return unlockedView; + } + + public Set getUnlockedReliquary() { + return unlockedReliquary; + } + + public Set getUnlockedReliquarySuitCodex() { + return unlockedReliquarySuitCodex; + } + +} \ No newline at end of file diff --git a/src/main/java/emu/grasscutter/game/quest/QuestManager.java b/src/main/java/emu/grasscutter/game/quest/QuestManager.java index 0d81834f0..14fc3054b 100644 --- a/src/main/java/emu/grasscutter/game/quest/QuestManager.java +++ b/src/main/java/emu/grasscutter/game/quest/QuestManager.java @@ -121,7 +121,6 @@ public class QuestManager { mainQuest.save(); // Send packet - getPlayer().sendPacket(new PacketServerCondMeetQuestListUpdateNotify(quest)); getPlayer().sendPacket(new PacketQuestListUpdateNotify(quest)); return quest; diff --git a/src/main/java/emu/grasscutter/game/world/Scene.java b/src/main/java/emu/grasscutter/game/world/Scene.java index daed26e3e..134b86fe7 100644 --- a/src/main/java/emu/grasscutter/game/world/Scene.java +++ b/src/main/java/emu/grasscutter/game/world/Scene.java @@ -2,10 +2,7 @@ package emu.grasscutter.game.world; import emu.grasscutter.data.GameData; import emu.grasscutter.data.GameDepot; -import emu.grasscutter.data.def.DungeonData; -import emu.grasscutter.data.def.MonsterData; -import emu.grasscutter.data.def.SceneData; -import emu.grasscutter.data.def.WorldLevelData; +import emu.grasscutter.data.def.*; import emu.grasscutter.game.dungeons.DungeonChallenge; import emu.grasscutter.game.dungeons.DungeonSettleListener; import emu.grasscutter.game.entity.*; @@ -389,6 +386,9 @@ public class Scene { } public void killEntity(GameEntity target, int attackerId) { + for (Player player : this.getPlayers()) { + player.getCodex().checkAnimal(target, CodexAnimalData.CodexAnimalUnlockCondition.CODEX_COUNT_TYPE_KILL); + } // Packet this.broadcastPacket(new PacketLifeStateChangeNotify(attackerId, target, LifeState.LIFE_DEAD)); diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerQueryCodexMonsterBeKilledNumReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerQueryCodexMonsterBeKilledNumReq.java new file mode 100644 index 000000000..dca38dcdb --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerQueryCodexMonsterBeKilledNumReq.java @@ -0,0 +1,20 @@ +package emu.grasscutter.server.packet.recv; + +import emu.grasscutter.net.packet.Opcodes; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.packet.PacketHandler; +import emu.grasscutter.net.proto.QueryCodexMonsterBeKilledNumReqOuterClass; +import emu.grasscutter.net.proto.QueryCodexMonsterBeKilledNumReqOuterClass.QueryCodexMonsterBeKilledNumReq; +import emu.grasscutter.server.game.GameSession; +import emu.grasscutter.server.packet.send.PacketQueryCodexMonsterBeKilledNumRsp; + +@Opcodes(PacketOpcodes.QueryCodexMonsterBeKilledNumReq) +public class HandlerQueryCodexMonsterBeKilledNumReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { + QueryCodexMonsterBeKilledNumReq req = QueryCodexMonsterBeKilledNumReq.parseFrom(payload); + session.send(new PacketQueryCodexMonsterBeKilledNumRsp(session.getPlayer(), req.getCodexIdListList())); + } + +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketCodexDataFullNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketCodexDataFullNotify.java index 760c3b3d2..771a0f581 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketCodexDataFullNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketCodexDataFullNotify.java @@ -1,17 +1,13 @@ package emu.grasscutter.server.packet.send; import java.util.Collections; -import java.util.List; -import emu.grasscutter.Grasscutter; 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; -import emu.grasscutter.net.proto.CodexTypeOuterClass; -import emu.grasscutter.server.game.GameSession; public class PacketCodexDataFullNotify extends BasePacket { public PacketCodexDataFullNotify(Player player) { @@ -21,6 +17,22 @@ public class PacketCodexDataFullNotify extends BasePacket { 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); @@ -29,25 +41,53 @@ public class PacketCodexDataFullNotify extends BasePacket { CodexTypeData.Builder viewTypeData = CodexTypeData.newBuilder() .setTypeValue(7); - //Weapons - CodexTypeData.Builder weaponTypeData = CodexTypeData.newBuilder() - .setTypeValue(2); - + //Reliquary + CodexTypeData.Builder reliquaryData = CodexTypeData.newBuilder() + .setTypeValue(8); player.getQuestManager().forEachMainQuest(mainQuest -> { if(mainQuest.isFinished()){ - var codexQuest = GameData.getCodexQuestIdMap().get(mainQuest.getParentQuestId()); + 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(weaponTypeData); + .addTypeDataList(reliquaryData); this.setData(proto); } diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketCodexDataUpdateNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketCodexDataUpdateNotify.java index c7318bd91..e2c0045f7 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketCodexDataUpdateNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketCodexDataUpdateNotify.java @@ -1,21 +1,15 @@ package emu.grasscutter.server.packet.send; -import java.util.Collections; -import java.util.List; - import emu.grasscutter.data.GameData; -import emu.grasscutter.game.player.Player; import emu.grasscutter.game.quest.GameMainQuest; -import emu.grasscutter.game.quest.GameQuest; import emu.grasscutter.net.packet.BasePacket; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.CodexDataUpdateNotifyOuterClass.CodexDataUpdateNotify; -import emu.grasscutter.server.game.GameSession; public class PacketCodexDataUpdateNotify extends BasePacket { public PacketCodexDataUpdateNotify(GameMainQuest quest) { super(PacketOpcodes.CodexDataUpdateNotify, true); - var codexQuest = GameData.getCodexQuestIdMap().get(quest.getParentQuestId()); + var codexQuest = GameData.getCodexQuestDataIdMap().get(quest.getParentQuestId()); if(codexQuest != null){ CodexDataUpdateNotify proto = CodexDataUpdateNotify.newBuilder() .setTypeValue(1) @@ -24,4 +18,13 @@ public class PacketCodexDataUpdateNotify extends BasePacket { this.setData(proto); } } + + public PacketCodexDataUpdateNotify(int typeValue, int codexId){ + super(PacketOpcodes.CodexDataUpdateNotify, true); + CodexDataUpdateNotify proto = CodexDataUpdateNotify.newBuilder() + .setTypeValue(typeValue) + .setId(codexId) + .build(); + this.setData(proto); + } } diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketQueryCodexMonsterBeKilledNumRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketQueryCodexMonsterBeKilledNumRsp.java new file mode 100644 index 000000000..7c347872d --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketQueryCodexMonsterBeKilledNumRsp.java @@ -0,0 +1,26 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.game.player.Player; +import emu.grasscutter.net.packet.BasePacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.QueryCodexMonsterBeKilledNumRspOuterClass.QueryCodexMonsterBeKilledNumRsp; + +import java.util.List; + +public class PacketQueryCodexMonsterBeKilledNumRsp extends BasePacket { + + public PacketQueryCodexMonsterBeKilledNumRsp(Player player, List codexList) { + super(PacketOpcodes.QueryCodexMonsterBeKilledNumRsp); + QueryCodexMonsterBeKilledNumRsp.Builder proto = QueryCodexMonsterBeKilledNumRsp.newBuilder(); + + codexList.forEach(animal -> { + if(player.getCodex().getUnlockedAnimal().containsKey(animal)){ + proto.addCodexIdList(animal) + .addBeKilledNumList(player.getCodex().getUnlockedAnimal().get(animal)) + .addBeKilledNumEmptyList(0); + } + }); + + this.setData(proto); + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketServerCondMeetQuestListUpdateNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketServerCondMeetQuestListUpdateNotify.java index fa2e8ab81..278d4b04b 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketServerCondMeetQuestListUpdateNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketServerCondMeetQuestListUpdateNotify.java @@ -12,13 +12,15 @@ public class PacketServerCondMeetQuestListUpdateNotify extends BasePacket { super(PacketOpcodes.ServerCondMeetQuestListUpdateNotify); ServerCondMeetQuestListUpdateNotify.Builder proto = ServerCondMeetQuestListUpdateNotify.newBuilder(); - + + /* player.getQuestManager().forEachQuest(quest -> { if (quest.getState().getValue() <= 2) { proto.addAddQuestIdList(quest.getQuestId()); } }); - + */ + this.setData(proto); } @@ -26,9 +28,9 @@ public class PacketServerCondMeetQuestListUpdateNotify extends BasePacket { super(PacketOpcodes.ServerCondMeetQuestListUpdateNotify); ServerCondMeetQuestListUpdateNotify proto = ServerCondMeetQuestListUpdateNotify.newBuilder() - .addAddQuestIdList(quest.getQuestId()) + //.addAddQuestIdList(quest.getQuestId()) .build(); - + this.setData(proto); } } diff --git a/src/main/resources/languages/en-US.json b/src/main/resources/languages/en-US.json index 4e5c7d8d3..5cc574e6f 100644 --- a/src/main/resources/languages/en-US.json +++ b/src/main/resources/languages/en-US.json @@ -159,7 +159,7 @@ "description": "Gives the player a specified artifact" }, "giveChar": { - "usage": "Usage: givechar [amount]", + "usage": "Usage: givechar [level]", "given": "Given %s with level %s to %s.", "invalid_avatar_id": "Invalid avatar ID.", "invalid_avatar_level": "Invalid avatar level.", diff --git a/src/main/resources/languages/zh-CN.json b/src/main/resources/languages/zh-CN.json index 759bab550..8c6be7e71 100644 --- a/src/main/resources/languages/zh-CN.json +++ b/src/main/resources/languages/zh-CN.json @@ -163,7 +163,7 @@ "description": "给予指定圣遗物" }, "giveChar": { - "usage": "用法:givechar <玩家> <角色ID|角色名> [数量]", + "usage": "用法:givechar <玩家> <角色ID|角色名> [等级]", "given": "已将角色 %s [等级 %s] 给与 %s。", "invalid_avatar_id": "无效的角色ID。", "invalid_avatar_level": "无效的角色等级。", diff --git a/src/main/resources/languages/zh-TW.json b/src/main/resources/languages/zh-TW.json index c3da1d8e3..d295225f5 100644 --- a/src/main/resources/languages/zh-TW.json +++ b/src/main/resources/languages/zh-TW.json @@ -159,7 +159,7 @@ "description": "給予指定聖遺物。" }, "giveChar": { - "usage": "用法:givechar [amount]", + "usage": "用法:givechar [level]", "given": "已將 %s 等級 %s 給予 %s。", "invalid_avatar_id": "無效的角色ID。", "invalid_avatar_level": "無效的角色等級。.",