From eb64b25f12d42b8bd92d11c52b3c15411735fa66 Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Sun, 15 May 2022 03:48:47 -0700 Subject: [PATCH] Implement quest rewards --- .../data/common/ItemParamData.java | 13 +++++++++++ .../data/common/RewardItemData.java | 22 ------------------- .../emu/grasscutter/data/def/RewardData.java | 8 +++---- .../grasscutter/game/inventory/Inventory.java | 8 +++++++ .../grasscutter/game/quest/GameMainQuest.java | 17 ++++++++++++++ .../recv/HandlerTakePlayerLevelRewardReq.java | 16 ++++---------- 6 files changed, 46 insertions(+), 38 deletions(-) delete mode 100644 src/main/java/emu/grasscutter/data/common/RewardItemData.java diff --git a/src/main/java/emu/grasscutter/data/common/ItemParamData.java b/src/main/java/emu/grasscutter/data/common/ItemParamData.java index a962c4618..db740e1e8 100644 --- a/src/main/java/emu/grasscutter/data/common/ItemParamData.java +++ b/src/main/java/emu/grasscutter/data/common/ItemParamData.java @@ -1,7 +1,12 @@ package emu.grasscutter.data.common; +import com.google.gson.annotations.SerializedName; + public class ItemParamData { + @SerializedName(value="Id", alternate={"ItemId"}) private int Id; + + @SerializedName(value="Count", alternate={"ItemCount"}) private int Count; public ItemParamData() {} @@ -14,7 +19,15 @@ public class ItemParamData { return Id; } + public int getItemId() { + return Id; + } + public int getCount() { return Count; } + + public int getItemCount() { + return Count; + } } diff --git a/src/main/java/emu/grasscutter/data/common/RewardItemData.java b/src/main/java/emu/grasscutter/data/common/RewardItemData.java deleted file mode 100644 index 024b89f7f..000000000 --- a/src/main/java/emu/grasscutter/data/common/RewardItemData.java +++ /dev/null @@ -1,22 +0,0 @@ -package emu.grasscutter.data.common; - -public class RewardItemData { - private int ItemId; - private int ItemCount; - - public int getItemId() { - return ItemId; - } - - public void setItemId(int itemId) { - ItemId = itemId; - } - - public int getItemCount() { - return ItemCount; - } - - public void setItemCount(int itemCount) { - ItemCount = itemCount; - } -} diff --git a/src/main/java/emu/grasscutter/data/def/RewardData.java b/src/main/java/emu/grasscutter/data/def/RewardData.java index d8ea58415..6946e9cba 100644 --- a/src/main/java/emu/grasscutter/data/def/RewardData.java +++ b/src/main/java/emu/grasscutter/data/def/RewardData.java @@ -4,24 +4,24 @@ import java.util.List; import emu.grasscutter.data.GameResource; import emu.grasscutter.data.ResourceType; -import emu.grasscutter.data.common.RewardItemData; +import emu.grasscutter.data.common.ItemParamData; @ResourceType(name = "RewardExcelConfigData.json") public class RewardData extends GameResource { public int RewardId; - public List RewardItemList; + public List RewardItemList; @Override public int getId() { return RewardId; } - public List getRewardItemList() { + public List getRewardItemList() { return RewardItemList; } @Override public void onLoad() { - + RewardItemList = RewardItemList.stream().filter(i -> i.getId() > 0).toList(); } } diff --git a/src/main/java/emu/grasscutter/game/inventory/Inventory.java b/src/main/java/emu/grasscutter/game/inventory/Inventory.java index 1af6038d9..fb26d5c8d 100644 --- a/src/main/java/emu/grasscutter/game/inventory/Inventory.java +++ b/src/main/java/emu/grasscutter/game/inventory/Inventory.java @@ -150,6 +150,14 @@ public class Inventory implements Iterable { addItems(items.stream().map(param -> new GameItem(param.getItemId(), param.getCount())).toList(), null); } + public void addItemParamDatas(Collection items) { + addItemParamDatas(items, null); + } + + public void addItemParamDatas(Collection items, ActionReason reason) { + addItems(items.stream().map(param -> new GameItem(param.getItemId(), param.getCount())).toList(), reason); + } + private synchronized GameItem putItem(GameItem item) { // Dont add items that dont have a valid item definition. if (item.getItemData() == null) { diff --git a/src/main/java/emu/grasscutter/game/quest/GameMainQuest.java b/src/main/java/emu/grasscutter/game/quest/GameMainQuest.java index c298913cc..6659cd583 100644 --- a/src/main/java/emu/grasscutter/game/quest/GameMainQuest.java +++ b/src/main/java/emu/grasscutter/game/quest/GameMainQuest.java @@ -11,8 +11,11 @@ import dev.morphia.annotations.Id; import dev.morphia.annotations.Indexed; import dev.morphia.annotations.Transient; import emu.grasscutter.data.GameData; +import emu.grasscutter.data.custom.MainQuestData; +import emu.grasscutter.data.def.RewardData; import emu.grasscutter.database.DatabaseHelper; import emu.grasscutter.game.player.Player; +import emu.grasscutter.game.props.ActionReason; import emu.grasscutter.game.quest.enums.ParentQuestState; import emu.grasscutter.game.quest.enums.QuestState; import emu.grasscutter.net.proto.ChildQuestOuterClass.ChildQuest; @@ -91,9 +94,23 @@ public class GameMainQuest { public void finish() { this.isFinished = true; this.state = ParentQuestState.PARENT_QUEST_STATE_FINISHED; + this.getOwner().getSession().send(new PacketFinishedParentQuestUpdateNotify(this)); this.getOwner().getSession().send(new PacketCodexDataUpdateNotify(this)); + this.save(); + + // Add rewards + MainQuestData mainQuestData = GameData.getMainQuestDataMap().get(this.getParentQuestId()); + for (int rewardId : mainQuestData.getRewardIdList()) { + RewardData rewardData = GameData.getRewardDataMap().get(rewardId); + + if (rewardData == null) { + continue; + } + + getOwner().getInventory().addItemParamDatas(rewardData.getRewardItemList(), ActionReason.QuestReward); + } } public void save() { diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerTakePlayerLevelRewardReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerTakePlayerLevelRewardReq.java index 8ee2d934b..c9e4d27b1 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerTakePlayerLevelRewardReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerTakePlayerLevelRewardReq.java @@ -6,7 +6,8 @@ import java.util.Set; import emu.grasscutter.Grasscutter; import emu.grasscutter.data.GameData; -import emu.grasscutter.data.common.RewardItemData; +import emu.grasscutter.data.common.ItemParamData; + import emu.grasscutter.game.inventory.GameItem; import emu.grasscutter.game.props.ActionReason; import emu.grasscutter.net.packet.Opcodes; @@ -27,17 +28,8 @@ public class HandlerTakePlayerLevelRewardReq extends PacketHandler { int rewardId = GameData.getPlayerLevelDataMap().get(level).getRewardId(); if (rewardId != 0) { - List rewardItems = GameData.getRewardDataMap().get(rewardId).getRewardItemList(); - List items = new LinkedList<>(); - for (RewardItemData rewardItem : rewardItems) { - if (rewardItem != null) { - if (rewardItem.getItemId() != 0) { - items.add(new GameItem(rewardItem.getItemId(), rewardItem.getItemCount())); - } - } - } - session.getPlayer().getInventory().addItems(items); - session.getPlayer().sendPacket(new PacketItemAddHintNotify(items, ActionReason.PlayerUpgradeReward)); + List rewardItems = GameData.getRewardDataMap().get(rewardId).getRewardItemList(); + session.getPlayer().getInventory().addItemParamDatas(rewardItems, ActionReason.PlayerUpgradeReward); Set rewardedLevels = session.getPlayer().getRewardedLevels(); rewardedLevels.add(level); session.getPlayer().setRewardedLevels(rewardedLevels);