From 135099f4dffb79f1b61fe6c04c4ef0067df058db Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 13 Oct 2025 03:34:14 +0000 Subject: [PATCH 1/4] Initial plan From 98d8e15484edba6bf9e50df81ad02646e8b06095 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 13 Oct 2025 03:39:31 +0000 Subject: [PATCH 2/4] Fix compilation errors and add missing logging Co-authored-by: ptthanh02 <73684260+ptthanh02@users.noreply.github.com> --- .../nighter/smartspawner/SmartSpawner.java | 1 + .../gui/storage/SpawnerStorageAction.java | 22 ++++++++++++++----- .../gui/storage/filter/FilterConfigUI.java | 11 ++++++++++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/github/nighter/smartspawner/SmartSpawner.java b/core/src/main/java/github/nighter/smartspawner/SmartSpawner.java index 1bfba650..2cb67958 100644 --- a/core/src/main/java/github/nighter/smartspawner/SmartSpawner.java +++ b/core/src/main/java/github/nighter/smartspawner/SmartSpawner.java @@ -60,6 +60,7 @@ import lombok.Getter; import lombok.experimental.Accessors; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/SpawnerStorageAction.java b/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/SpawnerStorageAction.java index 66c3eceb..9ee6ea9a 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/SpawnerStorageAction.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/SpawnerStorageAction.java @@ -238,9 +238,9 @@ private void handleItemDrop(Player player, SpawnerData spawner, Inventory invent }); Vector velocity = new Vector( - sinYaw * cosPitch * 0.3, - sinPitch * 0.3, - cosYaw * cosPitch * 0.3 + sinYaw * cosPitch * 0.3 + (random.nextDouble() - 0.5) * 0.1, + sinPitch * 0.3 + 0.1 + (random.nextDouble() - 0.5) * 0.1, + cosYaw * cosPitch * 0.3 + (random.nextDouble() - 0.5) * 0.1 ); droppedItemWorld.setVelocity(velocity); @@ -321,6 +321,17 @@ private void handleDropPageItems(Player player, SpawnerData spawner, Inventory i spawner.markInteracted(); } + // Log drop page items action + if (plugin.getSpawnerActionLogger() != null) { + plugin.getSpawnerActionLogger().log(github.nighter.smartspawner.logging.SpawnerEventType.SPAWNER_DROP_PAGE_ITEMS, builder -> + builder.player(player.getName(), player.getUniqueId()) + .location(spawner.getSpawnerLocation()) + .entityType(spawner.getEntityType()) + .metadata("items_dropped", itemsFound) + .metadata("page_number", holder.getCurrentPage()) + ); + } + updatePageContent(player, spawner, holder.getCurrentPage(), inventory, false); player.playSound(player.getLocation(), Sound.ENTITY_ITEM_PICKUP, 0.8f, 0.8f); } @@ -684,12 +695,13 @@ public void handleTakeAllItems(Player player, Inventory sourceInventory) { // Log take all items action if (plugin.getSpawnerActionLogger() != null) { + int itemsLeft = spawner.getVirtualInventory().getUsedSlots(); plugin.getSpawnerActionLogger().log(github.nighter.smartspawner.logging.SpawnerEventType.SPAWNER_ITEM_TAKE_ALL, builder -> builder.player(player.getName(), player.getUniqueId()) .location(spawner.getSpawnerLocation()) .entityType(spawner.getEntityType()) - .metadata("items_taken", result.movedCount) - .metadata("items_left", result.remainingCount) + .metadata("items_taken", result.totalMoved) + .metadata("items_left", itemsLeft) ); } } diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/filter/FilterConfigUI.java b/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/filter/FilterConfigUI.java index 6a069035..7a539a88 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/filter/FilterConfigUI.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/filter/FilterConfigUI.java @@ -280,6 +280,17 @@ private boolean toggleItemFilter(Player player, SpawnerData spawner, ItemStack c Sound sound = wasFiltered ? Sound.BLOCK_NOTE_BLOCK_PLING : Sound.UI_BUTTON_CLICK; player.playSound(player.getLocation(), sound, 0.5f, 1.0f); + // Log item filter action + if (plugin.getSpawnerActionLogger() != null) { + plugin.getSpawnerActionLogger().log(github.nighter.smartspawner.logging.SpawnerEventType.SPAWNER_ITEM_FILTER, builder -> + builder.player(player.getName(), player.getUniqueId()) + .location(spawner.getSpawnerLocation()) + .entityType(spawner.getEntityType()) + .metadata("item_type", itemType.name()) + .metadata("is_filtered", wasFiltered) + ); + } + return true; } } From e7da8f9c03e08aeabcc0738f3f8c0478fa13c27e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 13 Oct 2025 03:40:09 +0000 Subject: [PATCH 3/4] Add new SpawnerEventType entries for filter and drop page actions Co-authored-by: ptthanh02 <73684260+ptthanh02@users.noreply.github.com> --- .../github/nighter/smartspawner/logging/SpawnerEventType.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/main/java/github/nighter/smartspawner/logging/SpawnerEventType.java b/core/src/main/java/github/nighter/smartspawner/logging/SpawnerEventType.java index 19d1e45b..e253ce03 100644 --- a/core/src/main/java/github/nighter/smartspawner/logging/SpawnerEventType.java +++ b/core/src/main/java/github/nighter/smartspawner/logging/SpawnerEventType.java @@ -29,6 +29,8 @@ public enum SpawnerEventType { SPAWNER_ITEM_TAKE_ALL("All items taken from storage"), SPAWNER_ITEM_DROP("Item dropped from storage"), SPAWNER_ITEMS_SORT("Items sorted in storage"), + SPAWNER_ITEM_FILTER("Item filter toggled"), + SPAWNER_DROP_PAGE_ITEMS("Page items dropped"), // Command events // Note: These events capture ALL command executions including admin actions like /ss give From 5af92381e3826a21373c1fd75625a0613991fe97 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 13 Oct 2025 03:49:11 +0000 Subject: [PATCH 4/4] Fix lambda capture issue - make itemsFound effectively final Co-authored-by: ptthanh02 <73684260+ptthanh02@users.noreply.github.com> --- .../spawner/gui/storage/SpawnerStorageAction.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/SpawnerStorageAction.java b/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/SpawnerStorageAction.java index 9ee6ea9a..1a3e84ed 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/SpawnerStorageAction.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/SpawnerStorageAction.java @@ -283,13 +283,13 @@ private void handleDropPageItems(Player player, SpawnerData spawner, Inventory i } List pageItems = new ArrayList<>(); - int itemsFound = 0; + int itemsFoundCount = 0; for (int i = 0; i < STORAGE_SLOTS; i++) { ItemStack item = inventory.getItem(i); if (item != null && item.getType() != Material.AIR) { pageItems.add(item.clone()); - itemsFound += item.getAmount(); + itemsFoundCount += item.getAmount(); inventory.setItem(i, null); } } @@ -299,6 +299,8 @@ private void handleDropPageItems(Player player, SpawnerData spawner, Inventory i return; } + final int itemsFound = itemsFoundCount; + VirtualInventory virtualInv = spawner.getVirtualInventory(); spawner.removeItemsAndUpdateSellValue(pageItems);