From 4ebe6fbf6355cced7237bc07f3a6d7586aa41ef1 Mon Sep 17 00:00:00 2001 From: dragon <52032586+eternalcomet@users.noreply.github.com> Date: Sun, 18 Jun 2023 03:56:47 +0800 Subject: [PATCH] dungeon drop implementation (#2215) * dungeon drop implementation * Update src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com> --------- Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com> --- .../emu/grasscutter/data/excels/dungeon/DungeonData.java | 1 + src/main/java/emu/grasscutter/game/drop/DropSystem.java | 8 ++++++++ .../emu/grasscutter/game/dungeons/DungeonManager.java | 9 +++++++-- .../game/entity/gadget/GadgetRewardStatue.java | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/emu/grasscutter/data/excels/dungeon/DungeonData.java b/src/main/java/emu/grasscutter/data/excels/dungeon/DungeonData.java index 995c49700..8e30cc54c 100644 --- a/src/main/java/emu/grasscutter/data/excels/dungeon/DungeonData.java +++ b/src/main/java/emu/grasscutter/data/excels/dungeon/DungeonData.java @@ -32,6 +32,7 @@ public class DungeonData extends GameResource { @Getter private int passRewardPreviewID; @Getter private int statueCostID; @Getter private int statueCostCount; + @Getter private int statueDrop; // not part of DungeonExcelConfigData @Getter private RewardPreviewData rewardPreviewData; diff --git a/src/main/java/emu/grasscutter/game/drop/DropSystem.java b/src/main/java/emu/grasscutter/game/drop/DropSystem.java index eea63cb5d..88baa66fb 100644 --- a/src/main/java/emu/grasscutter/game/drop/DropSystem.java +++ b/src/main/java/emu/grasscutter/game/drop/DropSystem.java @@ -80,6 +80,14 @@ public final class DropSystem extends BaseGameSystem { return dropData.getDropId(); } + public List handleDungeonRewardDrop(int dropId, boolean doubleReward) { + if (!dropTable.containsKey(dropId)) return List.of(); + var dropData = dropTable.get(dropId); + List items = new ArrayList<>(); + processDrop(dropData, doubleReward ? 2 : 1, items); + return items; + } + public boolean handleMonsterDrop(EntityMonster monster) { int dropId; int level = monster.getLevel(); diff --git a/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java b/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java index 104d2f9c5..3b4d7e620 100644 --- a/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java +++ b/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java @@ -134,7 +134,12 @@ public final class DungeonManager { } // Get and roll rewards. - List rewards = new ArrayList<>(this.rollRewards(useCondensed)); + List rewards = player.getServer().getDropSystem().handleDungeonRewardDrop(dungeonData.getStatueDrop(), useCondensed); + if (rewards.isEmpty()) { + //fallback to legacy drop system + Grasscutter.getLogger().debug("dungeon drop failed for {}", dungeonData.getId()); + rewards = new ArrayList<>(this.rollRewards(useCondensed)); + } // Add rewards to player and send notification. player.getInventory().addItems(rewards, ActionReason.DungeonStatueDrop); player.sendPacket(new PacketGadgetAutoPickDropInfoNotify(rewards)); @@ -187,7 +192,7 @@ public final class DungeonManager { amount += Utils.drawRandomListElement(candidateAmounts, entry.getProbabilities()); } - // Double rewards in multiplay mode, if specified. + // Double rewards in multiply mode, if specified. if (entry.isMpDouble() && this.getScene().getPlayerCount() > 1) { amount *= 2; } diff --git a/src/main/java/emu/grasscutter/game/entity/gadget/GadgetRewardStatue.java b/src/main/java/emu/grasscutter/game/entity/gadget/GadgetRewardStatue.java index 742e79281..c3abc8f0e 100644 --- a/src/main/java/emu/grasscutter/game/entity/gadget/GadgetRewardStatue.java +++ b/src/main/java/emu/grasscutter/game/entity/gadget/GadgetRewardStatue.java @@ -1,5 +1,6 @@ package emu.grasscutter.game.entity.gadget; +import emu.grasscutter.Grasscutter; import emu.grasscutter.game.dungeons.challenge.DungeonChallenge; import emu.grasscutter.game.entity.EntityGadget; import emu.grasscutter.game.player.Player;