Skip to content

Commit d57d5f4

Browse files
authored
Merge pull request #186 from Kawi16/main
feat: takeall & dropall api events
2 parents 2dfffe7 + 8e60d5f commit d57d5f4

4 files changed

Lines changed: 167 additions & 17 deletions

File tree

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package github.nighter.smartspawner.api.events;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
import org.bukkit.Location;
6+
import org.bukkit.entity.Player;
7+
import org.bukkit.event.Cancellable;
8+
import org.bukkit.event.Event;
9+
import org.bukkit.event.HandlerList;
10+
import org.bukkit.inventory.ItemStack;
11+
import org.jetbrains.annotations.NotNull;
12+
13+
import java.util.List;
14+
import java.util.Map;
15+
16+
/**
17+
* Called when all items are dropped from a spawner's storage.
18+
*/
19+
@Getter
20+
@Setter
21+
public class SpawnerDropAllEvent extends Event implements Cancellable {
22+
private final Player player;
23+
private final Location location;
24+
private final List<ItemStack> items;
25+
private boolean cancelled = false;
26+
27+
private static final HandlerList handlers = new HandlerList();
28+
29+
/**
30+
* Creates a new spawner drop all event.
31+
*
32+
* @param player the player dropping the items
33+
* @param location the location of the spawner
34+
* @param items the items being dropped
35+
*/
36+
public SpawnerDropAllEvent(Player player, Location location, List<ItemStack> items) {
37+
this.player = player;
38+
this.location = location;
39+
this.items = items;
40+
}
41+
42+
@Override
43+
public @NotNull HandlerList getHandlers() {
44+
return handlers;
45+
}
46+
47+
public static @NotNull HandlerList getHandlerList() {
48+
return handlers;
49+
}
50+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package github.nighter.smartspawner.api.events;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
import org.bukkit.Location;
6+
import org.bukkit.entity.Player;
7+
import org.bukkit.event.Cancellable;
8+
import org.bukkit.event.Event;
9+
import org.bukkit.event.HandlerList;
10+
import org.bukkit.inventory.ItemStack;
11+
import org.jetbrains.annotations.NotNull;
12+
13+
import java.util.Map;
14+
15+
/**
16+
* Called when all items are taken from a spawner's storage.
17+
*/
18+
@Getter
19+
@Setter
20+
public class SpawnerTakeAllEvent extends Event implements Cancellable {
21+
private final Player player;
22+
private final Location location;
23+
private final Map<Integer, ItemStack> items;
24+
private boolean cancelled = false;
25+
26+
private static final HandlerList handlers = new HandlerList();
27+
28+
/**
29+
* Creates a new spawner take all event.
30+
*
31+
* @param player the player taking the items
32+
* @param location the location of the spawner
33+
* @param items the items being taken
34+
*/
35+
public SpawnerTakeAllEvent(Player player, Location location, Map<Integer, ItemStack> items) {
36+
this.player = player;
37+
this.location = location;
38+
this.items = items;
39+
}
40+
41+
@Override
42+
public @NotNull HandlerList getHandlers() {
43+
return handlers;
44+
}
45+
46+
public static @NotNull HandlerList getHandlerList() {
47+
return handlers;
48+
}
49+
}

core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/SpawnerStorageAction.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package github.nighter.smartspawner.spawner.gui.storage;
22

33
import github.nighter.smartspawner.SmartSpawner;
4+
import github.nighter.smartspawner.api.events.SpawnerDropAllEvent;
5+
import github.nighter.smartspawner.api.events.SpawnerTakeAllEvent;
46
import github.nighter.smartspawner.language.MessageService;
57
import github.nighter.smartspawner.spawner.gui.layout.GuiLayoutConfig;
68
import github.nighter.smartspawner.spawner.gui.storage.filter.FilterConfigUI;
@@ -12,9 +14,7 @@
1214
import github.nighter.smartspawner.spawner.properties.VirtualInventory;
1315
import github.nighter.smartspawner.language.LanguageManager;
1416
import github.nighter.smartspawner.spawner.properties.SpawnerData;
15-
import org.bukkit.Location;
16-
import org.bukkit.Material;
17-
import org.bukkit.Sound;
17+
import org.bukkit.*;
1818
import org.bukkit.entity.Player;
1919
import org.bukkit.event.EventHandler;
2020
import org.bukkit.event.EventPriority;
@@ -28,7 +28,6 @@
2828
import org.bukkit.inventory.ItemStack;
2929
import org.bukkit.inventory.PlayerInventory;
3030
import org.bukkit.util.Vector;
31-
import org.bukkit.World;
3231
import org.bukkit.entity.Item;
3332

3433
import java.util.*;
@@ -409,6 +408,13 @@ private void handleDropPageItems(Player player, SpawnerData spawner, Inventory i
409408
return;
410409
}
411410

411+
if (SpawnerDropAllEvent.getHandlerList().getRegisteredListeners().length != 0) {
412+
SpawnerDropAllEvent event = new SpawnerDropAllEvent(player, spawner.getSpawnerLocation(), pageItems);
413+
Bukkit.getPluginManager().callEvent(event);
414+
if (event.isCancelled()) return;
415+
pageItems = event.getItems();
416+
}
417+
412418
final int itemsFound = itemsFoundCount;
413419

414420
// Remove from VirtualInventory
@@ -743,6 +749,13 @@ public void handleTakeAllItems(Player player, Inventory sourceInventory) {
743749
return;
744750
}
745751

752+
if (SpawnerTakeAllEvent.getHandlerList().getRegisteredListeners().length != 0) {
753+
SpawnerTakeAllEvent event = new SpawnerTakeAllEvent(player, spawner.getSpawnerLocation(), sourceItems);
754+
Bukkit.getPluginManager().callEvent(event);
755+
if (event.isCancelled()) return;
756+
sourceItems = event.getItems();
757+
}
758+
746759
// Transfer items and update VirtualInventory
747760
TransferResult result = transferItems(player, sourceInventory, sourceItems, virtualInv);
748761
sendTransferMessage(player, result);

docs/src/content/docs/developer-api/api-events.md

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,20 @@ description: Event handlers for spawner-related actions and interactions.
66

77
SmartSpawner provides various events to hook into spawner-related actions:
88

9-
| Event | Description | Cancellable |
10-
|-------|-------------|:-----------:|
11-
| `SpawnerBreakEvent` | Spawner broken by a player or an explosion ||
12-
| `SpawnerPlaceEvent` | Spawner placed by player ||
13-
| `SpawnerPlayerBreakEvent` | Spawner broken by player ||
14-
| `SpawnerStackEvent` | Spawners stacking by hand ||
15-
| `SpawnerSellEvent` | Selling item from spawner storage ||
16-
| `SpawnerExpClaimEvent` | Experience claimed from spawner ||
17-
| `SpawnerEggChangeEvent` | Spawner type changed with egg ||
18-
| `SpawnerExplodeEvent` | Spawners destroyed by explosion ||
19-
| `SpawnerRemoveEvent` | Unstack spawners from the stacker GUI ||
20-
| `SpawnerOpenGUIEvent` | GUI opened by player ||
9+
| Event | Description | Cancellable |
10+
|---------------------------|--------------------------------------------------|:----------:|
11+
| `SpawnerBreakEvent` | Spawner broken by a player or an explosion ||
12+
| `SpawnerPlaceEvent` | Spawner placed by player ||
13+
| `SpawnerPlayerBreakEvent` | Spawner broken by player ||
14+
| `SpawnerStackEvent` | Spawners stacking by hand ||
15+
| `SpawnerSellEvent` | Selling item from spawner storage ||
16+
| `SpawnerExpClaimEvent` | Experience claimed from spawner ||
17+
| `SpawnerEggChangeEvent` | Spawner type changed with egg ||
18+
| `SpawnerExplodeEvent` | Spawners destroyed by explosion ||
19+
| `SpawnerRemoveEvent` | Unstack spawners from the stacker GUI ||
20+
| `SpawnerOpenGUIEvent` | GUI opened by player ||
21+
| `SpawnerDropAllEvent` | Dropping all item from a page of spawner storage ||
22+
| `SpawnerTakeAllEvent` | Taking all item from a page of spawner storage ||
2123

2224
### SpawnerBreakEvent
2325
Triggered when a spawner is broken by a player or explosion.
@@ -189,9 +191,45 @@ public void onSpawnerOpenGUI(SpawnerOpenGUIEvent event) {
189191
}
190192
```
191193

194+
### SpawnerDropAllEvent
195+
Triggered when a player drop all items from a page of spawner storage.
196+
197+
```java
198+
import github.nighter.smartspawner.api.events.SpawnerDropAllEvent;
199+
200+
@EventHandler
201+
public void onSpawnerDropAll(SpawnerDropAllEvent event) {
202+
Player player = event.getPlayer();
203+
204+
// Handle drop all
205+
if (!player.hasPermission("spawner.gui.dropall")) {
206+
event.setCancelled(true);
207+
player.sendMessage("No permission to drop all items from spawner!");
208+
}
209+
}
210+
```
211+
212+
### SpawnerTakeAllEvent
213+
Triggered when a player take all items from a page of spawner storage.
214+
215+
```java
216+
import github.nighter.smartspawner.api.events.SpawnerTakeAllEvent;
217+
218+
@EventHandler
219+
public void onSpawnerTakeAll(SpawnerTakeAllEvent event) {
220+
Player player = event.getPlayer();
221+
222+
// Handle take all
223+
if (!player.hasPermission("spawner.gui.takeall")) {
224+
event.setCancelled(true);
225+
player.sendMessage("No permission to take all items from spawner!");
226+
}
227+
}
228+
```
229+
192230
<br>
193231
<br>
194232

195233
---
196234

197-
*Last update: November 17, 2025 11:38:36*
235+
*Last update: March 19, 2026 17:08*

0 commit comments

Comments
 (0)