|
39 | 39 |
|
40 | 40 | import java.util.*; |
41 | 41 | import java.util.concurrent.ConcurrentHashMap; |
| 42 | +import java.util.stream.Collectors; |
42 | 43 |
|
43 | 44 | public class SpawnerStorageAction implements Listener { |
44 | 45 | private final SmartSpawner plugin; |
@@ -162,8 +163,8 @@ private void handleControlSlotClick(Player player, int slot, StoragePageHolder h |
162 | 163 | } |
163 | 164 |
|
164 | 165 | switch (action) { |
165 | | - case "discard_all": |
166 | | - handleDiscardAllItems(player, spawner, inventory); |
| 166 | + case "sort_items": |
| 167 | + handleSortItemsClick(player, spawner, inventory); |
167 | 168 | break; |
168 | 169 | case "item_filter": |
169 | 170 | openFilterConfig(player, spawner); |
@@ -217,8 +218,8 @@ private void handleLegacyButtonType(Player player, int slot, StoragePageHolder h |
217 | 218 | String buttonType = buttonTypeOpt.get(); |
218 | 219 |
|
219 | 220 | switch (buttonType) { |
220 | | - case "discard_all": |
221 | | - handleDiscardAllItems(player, spawner, inventory); |
| 221 | + case "sort_items": |
| 222 | + handleSortItemsClick(player, spawner, inventory); |
222 | 223 | break; |
223 | 224 | case "item_filter": |
224 | 225 | openFilterConfig(player, spawner); |
@@ -587,6 +588,84 @@ private void handleDiscardAllItems(Player player, SpawnerData spawner, Inventory |
587 | 588 | } |
588 | 589 | } |
589 | 590 |
|
| 591 | + private void handleSortItemsClick(Player player, SpawnerData spawner, Inventory inventory) { |
| 592 | + // Use same permission as storage access |
| 593 | + if (!player.hasPermission("smartspawner.storage")) { |
| 594 | + messageService.sendMessage(player, "no_permission"); |
| 595 | + return; |
| 596 | + } |
| 597 | + |
| 598 | + // Get available loot items |
| 599 | + if (spawner.getLootConfig() == null || spawner.getLootConfig().getLootItems() == null) { |
| 600 | + return; // No items to sort by |
| 601 | + } |
| 602 | + |
| 603 | + var lootItems = spawner.getLootConfig().getLootItems(); |
| 604 | + if (lootItems.isEmpty()) { |
| 605 | + return; // No items to sort by |
| 606 | + } |
| 607 | + |
| 608 | + // Get current sort item |
| 609 | + Material currentSort = spawner.getPreferredSortItem(); |
| 610 | + |
| 611 | + // Find next sort item in the list |
| 612 | + Material nextSort = null; |
| 613 | + boolean foundCurrent = false; |
| 614 | + |
| 615 | + // Sort items for consistent ordering |
| 616 | + var sortedLoot = lootItems.stream() |
| 617 | + .map(item -> item.getMaterial()) |
| 618 | + .sorted(Comparator.comparing(Material::name)) |
| 619 | + .collect(Collectors.toList()); |
| 620 | + |
| 621 | + if (currentSort == null) { |
| 622 | + // No current sort, select first item |
| 623 | + nextSort = sortedLoot.get(0); |
| 624 | + } else { |
| 625 | + // Find current item and select next one |
| 626 | + for (int i = 0; i < sortedLoot.size(); i++) { |
| 627 | + if (sortedLoot.get(i) == currentSort) { |
| 628 | + // Found current, get next (or wrap to first) |
| 629 | + nextSort = sortedLoot.get((i + 1) % sortedLoot.size()); |
| 630 | + foundCurrent = true; |
| 631 | + break; |
| 632 | + } |
| 633 | + } |
| 634 | + |
| 635 | + // If current sort item is not in the loot list anymore, reset to first |
| 636 | + if (!foundCurrent) { |
| 637 | + nextSort = sortedLoot.get(0); |
| 638 | + } |
| 639 | + } |
| 640 | + |
| 641 | + // Set new sort preference |
| 642 | + spawner.setPreferredSortItem(nextSort); |
| 643 | + |
| 644 | + // Mark spawner as modified to save the preference |
| 645 | + spawnerManager.queueSpawnerForSaving(spawner.getSpawnerId()); |
| 646 | + |
| 647 | + // Re-sort the virtual inventory |
| 648 | + spawner.getVirtualInventory().sortItems(nextSort); |
| 649 | + |
| 650 | + // Update the display |
| 651 | + StoragePageHolder holder = (StoragePageHolder) inventory.getHolder(false); |
| 652 | + if (holder != null) { |
| 653 | + updatePageContent(player, spawner, holder.getCurrentPage(), inventory, false); |
| 654 | + } |
| 655 | + |
| 656 | + // Play sound and show feedback |
| 657 | + player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1.0f, 1.2f); |
| 658 | + |
| 659 | + String itemName = languageManager.getVanillaItemName(nextSort); |
| 660 | + Map<String, String> placeholders = new HashMap<>(); |
| 661 | + placeholders.put("item", itemName); |
| 662 | + messageService.sendMessage(player, "sort_changed", placeholders); |
| 663 | + |
| 664 | + if (!spawner.isInteracted()) { |
| 665 | + spawner.markInteracted(); |
| 666 | + } |
| 667 | + } |
| 668 | + |
590 | 669 | private void openLootPage(Player player, SpawnerData spawner, int page, boolean refresh) { |
591 | 670 | SpawnerStorageUI lootManager = plugin.getSpawnerStorageUI(); |
592 | 671 | String title = languageManager.getGuiTitle("gui_title_storage"); |
|
0 commit comments