From be8fbcbc025edfd5069ef4eeb5a4600773aaa09f Mon Sep 17 00:00:00 2001
From: iTruth <58349472+iTruth@users.noreply.github.com>
Date: Thu, 20 Oct 2022 17:52:10 +0800
Subject: [PATCH] Fix StackOverFlow when execute /give all (#1878)

* Fix StackOverFlow when execute /give all

* Use more proper code
---
 .../java/emu/grasscutter/game/inventory/Inventory.java   | 9 ++++++++-
 .../game/props/ItemUseAction/ItemUseGainCostume.java     | 6 +++++-
 .../game/props/ItemUseAction/ItemUseGainFlycloak.java    | 6 +++++-
 3 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/main/java/emu/grasscutter/game/inventory/Inventory.java b/src/main/java/emu/grasscutter/game/inventory/Inventory.java
index 38fb268e..cb5ac633 100644
--- a/src/main/java/emu/grasscutter/game/inventory/Inventory.java
+++ b/src/main/java/emu/grasscutter/game/inventory/Inventory.java
@@ -140,7 +140,14 @@ public class Inventory extends BasePlayerManager implements Iterable<GameItem> {
         List<GameItem> changedItems = new ArrayList<>();
         for (var item : items) {
             if (item.getItemId() == 0) continue;
-            GameItem result = putItem(item);
+            GameItem result = null;
+            try {
+                // putItem might throws exception
+                // ignore that exception and continue
+                result = putItem(item);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
             if (result != null) {
                 getPlayer().getBattlePassManager().triggerMission(WatcherTriggerType.TRIGGER_OBTAIN_MATERIAL_NUM, result.getItemId(), result.getCount());
                 changedItems.add(result);
diff --git a/src/main/java/emu/grasscutter/game/props/ItemUseAction/ItemUseGainCostume.java b/src/main/java/emu/grasscutter/game/props/ItemUseAction/ItemUseGainCostume.java
index a712f60b..67212354 100644
--- a/src/main/java/emu/grasscutter/game/props/ItemUseAction/ItemUseGainCostume.java
+++ b/src/main/java/emu/grasscutter/game/props/ItemUseAction/ItemUseGainCostume.java
@@ -2,6 +2,8 @@ package emu.grasscutter.game.props.ItemUseAction;
 
 import emu.grasscutter.game.props.ItemUseOp;
 
+import emu.grasscutter.data.GameData;
+
 public class ItemUseGainCostume extends ItemUseInt {
     @Override
     public ItemUseOp getItemUseOp() {
@@ -14,7 +16,9 @@ public class ItemUseGainCostume extends ItemUseInt {
 
     @Override
     public boolean useItem(UseItemParams params) {
-        params.player.getInventory().addItem(this.i);  // TODO: Currently this returns false for all virtual items - need to have a proper success/fail
+        if (GameData.getAvatarCostumeDataMap().containsKey(this.i)) {
+            params.player.addCostume(this.i);
+        }
         return true;
     }
 }
diff --git a/src/main/java/emu/grasscutter/game/props/ItemUseAction/ItemUseGainFlycloak.java b/src/main/java/emu/grasscutter/game/props/ItemUseAction/ItemUseGainFlycloak.java
index 4077b678..15c904c5 100644
--- a/src/main/java/emu/grasscutter/game/props/ItemUseAction/ItemUseGainFlycloak.java
+++ b/src/main/java/emu/grasscutter/game/props/ItemUseAction/ItemUseGainFlycloak.java
@@ -2,6 +2,8 @@ package emu.grasscutter.game.props.ItemUseAction;
 
 import emu.grasscutter.game.props.ItemUseOp;
 
+import emu.grasscutter.data.GameData;
+
 public class ItemUseGainFlycloak extends ItemUseInt {
     @Override
     public ItemUseOp getItemUseOp() {
@@ -14,7 +16,9 @@ public class ItemUseGainFlycloak extends ItemUseInt {
 
     @Override
     public boolean useItem(UseItemParams params) {
-        params.player.getInventory().addItem(this.i);  // TODO: Currently this returns false for all virtual items - need to have a proper success/fail
+		if (GameData.getAvatarFlycloakDataMap().containsKey(this.i)) {
+            params.player.addFlycloak(this.i);
+        }
         return true;
     }
 }
-- 
GitLab