Skip to content
Open
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
316dc72
initial commit (testing completed)
AnOwlBe Jul 9, 2026
eedf1fd
requested changes
AnOwlBe Jul 16, 2026
120b3e7
Update src/main/java/org/skriptlang/skript/bukkit/inventory/Inventory…
AnOwlBe Jul 16, 2026
610133f
Merge branch 'dev/feature' into InventoryEvents
AnOwlBe Jul 16, 2026
1b5fbfa
unused imports
AnOwlBe Jul 16, 2026
935b15f
Update src/main/java/org/skriptlang/skript/bukkit/inventory/elements/…
AnOwlBe Jul 19, 2026
00ee893
Attempt at fixing gradlew.bat
AnOwlBe Jul 27, 2026
1abeb98
Merge branch 'InventoryEvents' of https://github.com/AnOwlBe/Skript i…
AnOwlBe Jul 27, 2026
fa725c1
Merge branch 'dev/feature' into InventoryEvents
AnOwlBe Jul 27, 2026
f38b9c0
AnvilDamagedEvent + split `addSince`'s
AnOwlBe Jul 28, 2026
51fe425
Merge remote-tracking branch 'origin/InventoryEvents' into InventoryE…
AnOwlBe Jul 28, 2026
7722624
requested changes
AnOwlBe Jul 29, 2026
e9890c7
Update src/main/java/org/skriptlang/skript/bukkit/inventory/elements/…
AnOwlBe Jul 29, 2026
f791f0c
updates 'since' to be more detailed + adds
AnOwlBe Jul 29, 2026
e28c3b4
removes [player] in on inventory open/close
AnOwlBe Jul 29, 2026
afde079
-
AnOwlBe Jul 30, 2026
da0e323
whoops forgot these
AnOwlBe Jul 30, 2026
2365693
Merge branch 'dev/feature' into InventoryEvents
AnOwlBe Sep 30, 2026
2709156
Some requested changes
AnOwlBe Oct 4, 2026
5f5a968
Update src/main/java/org/skriptlang/skript/bukkit/inventory/elements/…
AnOwlBe Oct 4, 2026
aa48303
Merge branch 'dev/feature' into InventoryEvents
AnOwlBe Oct 4, 2026
b21d653
modified
AnOwlBe Oct 4, 2026
9d84386
Merge remote-tracking branch 'origin/InventoryEvents' into InventoryE…
AnOwlBe Oct 4, 2026
b407b6c
fixes null being treated as air
AnOwlBe Oct 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -440,64 +440,6 @@ else if (hand == EquipmentSlot.OFF_HAND)
// Server stop event
registry.register(EventValue.simple(SkriptStopEvent.class, CommandSender.class, event -> Bukkit.getConsoleSender()));

// === InventoryEvents ===
// InventoryClickEvent
registry.register(EventValue.simple(InventoryClickEvent.class, Player.class, event -> event.getWhoClicked() instanceof Player player ? player : null));
registry.register(EventValue.simple(InventoryClickEvent.class, World.class, event -> event.getWhoClicked().getWorld()));
registry.register(EventValue.simple(InventoryClickEvent.class, ItemStack.class, InventoryClickEvent::getCurrentItem));
registry.register(EventValue.simple(InventoryClickEvent.class, Slot.class, event -> {
Inventory invi = event.getClickedInventory(); // getInventory is WRONG and dangerous
if (invi == null)
return null;
int slotIndex = event.getSlot();

// Not all indices point to inventory slots. Equipment, for example
if (invi instanceof PlayerInventory itemStacks && slotIndex >= 36) {
return new ch.njol.skript.util.slot.EquipmentSlot(itemStacks.getHolder(), slotIndex);
} else {
return new InventorySlot(invi, slotIndex, event.getRawSlot());
}
}));
registry.register(EventValue.simple(InventoryClickEvent.class, InventoryAction.class, InventoryClickEvent::getAction));
registry.register(EventValue.simple(InventoryClickEvent.class, ClickType.class, InventoryClickEvent::getClick));
registry.register(EventValue.simple(InventoryClickEvent.class, Inventory.class, InventoryClickEvent::getClickedInventory));
// InventoryDragEvent
registry.register(EventValue.simple(InventoryDragEvent.class, Player.class, event -> event.getWhoClicked() instanceof Player player ? player : null));
registry.register(EventValue.simple(InventoryDragEvent.class, World.class, event -> event.getWhoClicked().getWorld()));
registry.register(EventValue.builder(InventoryDragEvent.class, ItemStack.class)
.getter(InventoryDragEvent::getOldCursor)
.time(Time.PAST)
.build());
registry.register(EventValue.simple(InventoryDragEvent.class, ItemStack.class, InventoryDragEvent::getCursor));
registry.register(EventValue.simple(InventoryDragEvent.class, ItemStack[].class, event -> event.getNewItems().values().toArray(new ItemStack[0])));
registry.register(EventValue.simple(InventoryDragEvent.class, Slot[].class, event -> {
List<Slot> slots = new ArrayList<>(event.getRawSlots().size());
InventoryView view = event.getView();
for (Integer rawSlot : event.getRawSlots()) {
Inventory inventory = InventoryUtils.getInventory(view, rawSlot);
Integer slot = InventoryUtils.convertSlot(view, rawSlot);
if (inventory == null || slot == null)
continue;
// Not all indices point to inventory slots. Equipment, for example
if (inventory instanceof PlayerInventory && slot >= 36) {
slots.add(new ch.njol.skript.util.slot.EquipmentSlot(((PlayerInventory) view.getBottomInventory()).getHolder(), slot));
} else {
slots.add(new InventorySlot(inventory, slot));
}
}
return slots.toArray(new Slot[0]);
}));
registry.register(EventValue.simple(InventoryDragEvent.class, ClickType.class, event -> event.getType() == DragType.EVEN ? ClickType.LEFT : ClickType.RIGHT));
registry.register(EventValue.simple(InventoryDragEvent.class, Inventory[].class, event -> {
Set<Inventory> inventories = new HashSet<>();
InventoryView view = event.getView();
for (Integer rawSlot : event.getRawSlots()) {
Inventory inventory = InventoryUtils.getInventory(view, rawSlot);
if (inventory != null)
inventories.add(inventory);
}
return inventories.toArray(new Inventory[0]);
}));
// PrepareAnvilEvent
if (Skript.classExists("com.destroystokyo.paper.event.inventory.PrepareResultEvent"))
registry.register(EventValue.simple(PrepareAnvilEvent.class, ItemStack.class, PrepareResultEvent::getResult));
Expand Down Expand Up @@ -541,18 +483,7 @@ else if (hand == EquipmentSlot.OFF_HAND)
return event.getCurrentItem();
return recipe.getResult();
}));
//InventoryEvent
registry.register(EventValue.simple(InventoryEvent.class, Inventory.class, InventoryEvent::getInventory));
//InventoryOpenEvent
registry.register(EventValue.simple(InventoryOpenEvent.class, Player.class, event -> (Player) event.getPlayer()));
//InventoryCloseEvent
registry.register(EventValue.simple(InventoryCloseEvent.class, Player.class, event -> (Player) event.getPlayer()));
if (Skript.classExists("org.bukkit.event.inventory.InventoryCloseEvent$Reason"))
registry.register(EventValue.simple(InventoryCloseEvent.class, InventoryCloseEvent.Reason.class, InventoryCloseEvent::getReason));
//InventoryPickupItemEvent
registry.register(EventValue.simple(InventoryPickupItemEvent.class, Inventory.class, InventoryPickupItemEvent::getInventory));
registry.register(EventValue.simple(InventoryPickupItemEvent.class, Item.class, InventoryPickupItemEvent::getItem));
registry.register(EventValue.simple(InventoryPickupItemEvent.class, ItemStack.class, event -> event.getItem().getItemStack()));

//PortalCreateEvent
registry.register(EventValue.simple(PortalCreateEvent.class, World.class, WorldEvent::getWorld));
registry.register(EventValue.simple(PortalCreateEvent.class, Block[].class, event -> event.getBlocks().stream()
Expand Down Expand Up @@ -742,20 +673,6 @@ else if (hand == EquipmentSlot.OFF_HAND)
if (Skript.classExists("org.bukkit.event.block.BellResonateEvent")) {
registry.register(EventValue.simple(BellResonateEvent.class, Entity[].class, event -> event.getResonatedEntities().toArray(new LivingEntity[0])));
}

// InventoryMoveItemEvent
registry.register(EventValue.simple(InventoryMoveItemEvent.class, Inventory.class, InventoryMoveItemEvent::getSource));
registry.register(EventValue.builder(InventoryMoveItemEvent.class, Inventory.class)
.getter(InventoryMoveItemEvent::getDestination)
.time(Time.FUTURE)
.build());
registry.register(EventValue.simple(InventoryMoveItemEvent.class, Block.class, event -> event.getSource().getLocation().getBlock()));
registry.register(EventValue.builder(InventoryMoveItemEvent.class, Block.class)
.getter(event -> event.getDestination().getLocation().getBlock())
.time(Time.FUTURE)
.build());
registry.register(EventValue.simple(InventoryMoveItemEvent.class, ItemStack.class, InventoryMoveItemEvent::getItem));

// EntityRegainHealthEvent
registry.register(EventValue.simple(EntityRegainHealthEvent.class, RegainReason.class, EntityRegainHealthEvent::getRegainReason));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import org.jetbrains.annotations.Nullable;
import org.skriptlang.skript.bukkit.types.BlockClassInfo;
import org.skriptlang.skript.bukkit.types.EntityClassInfo;
import org.skriptlang.skript.bukkit.types.InventoryClassInfo;
import org.skriptlang.skript.bukkit.inventory.InventoryClassInfo;
import org.skriptlang.skript.bukkit.types.PlayerClassInfo;

/**
Expand Down Expand Up @@ -66,8 +66,6 @@ public void change(final Item[] what, final @Nullable Object[] delta, final Chan
}
};

public final static Changer<Inventory> inventoryChanger = new InventoryClassInfo.InventoryChanger();

public final static Changer<Block> blockChanger = new BlockClassInfo.BlockChanger();

}
24 changes: 0 additions & 24 deletions src/main/java/ch/njol/skript/events/EvtItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,13 +77,6 @@ public class EvtItem extends SkriptEvent {
.description("Called when a player is done eating/drinking something, e.g. an apple, bread, meat, milk or a potion.")
.examples("on consume:")
.since("2.0");
Skript.registerEvent("Inventory Click", EvtItem.class, InventoryClickEvent.class, "[player] inventory(-| )click[ing] [[at] %-itemtypes%]")
.description("Called when clicking on inventory slot.")
.examples("on inventory click:",
"\tif event-item is stone:",
"\t\tgive player 1 stone",
"\t\tremove 20$ from player's balance")
.since("2.2-Fixes-V10");
Skript.registerEvent("Item Despawn", EvtItem.class, ItemDespawnEvent.class, "(item[ ][stack]|[item] %-itemtypes%) despawn[ing]", "[item[ ][stack]] despawn[ing] [[of] %-itemtypes%]")
.description("Called when an item is about to be despawned from the world, usually 5 minutes after it was dropped.")
.examples("on item despawn of diamond:",
Expand All @@ -96,19 +89,6 @@ public class EvtItem extends SkriptEvent {
.examples("on item merge of gold blocks:",
" cancel event")
.since("2.2-dev35");
Skript.registerEvent("Inventory Item Move", SimpleEvent.class, InventoryMoveItemEvent.class,
"inventory item (move|transport)",
"inventory (mov(e|ing)|transport[ing]) [an] item")
.description(
"Called when an entity or block (e.g. hopper) tries to move items directly from one inventory to another.",
"When this event is called, the initiator may have already removed the item from the source inventory and is ready to move it into the destination inventory.",
"If this event is cancelled, the items will be returned to the source inventory."
)
.examples(
"on inventory item move:",
"\tbroadcast \"%holder of past event-inventory% is transporting %event-item% to %holder of event-inventory%!\""
)
.since("2.8.0");
if (HAS_PLAYER_STONECUTTER_RECIPE_SELECT_EVENT) {
Skript.registerEvent("Stonecutter Recipe Select", EvtItem.class, PlayerStonecutterRecipeSelectEvent.class, "stonecutting [[of] %-itemtypes%]")
.description("Called when a player selects a recipe in a stonecutter.")
Expand Down Expand Up @@ -178,14 +158,10 @@ public boolean check(final Event event) {
itemStack = playerPickupItemEvent.getItem().getItemStack();
} else if (event instanceof PlayerItemConsumeEvent playerItemConsumeEvent) {
itemStack = playerItemConsumeEvent.getItem();
} else if (event instanceof InventoryClickEvent inventoryClickEvent) {
itemStack = inventoryClickEvent.getCurrentItem();
} else if (event instanceof ItemDespawnEvent itemDespawnEvent) {
itemStack = itemDespawnEvent.getEntity().getItemStack();
} else if (event instanceof ItemMergeEvent itemMergeEvent) {
itemStack = itemMergeEvent.getTarget().getItemStack();
} else if (event instanceof InventoryMoveItemEvent inventoryMoveItemEvent) {
itemStack = inventoryMoveItemEvent.getItem();
} else {
assert false;
return false;
Expand Down
34 changes: 0 additions & 34 deletions src/main/java/ch/njol/skript/events/SimpleEvents.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import ch.njol.skript.Skript;
import ch.njol.skript.lang.SkriptEvent.ListeningBehavior;
import ch.njol.skript.lang.util.SimpleEvent;
import com.destroystokyo.paper.event.block.AnvilDamagedEvent;
import com.destroystokyo.paper.event.entity.EntityJumpEvent;
import com.destroystokyo.paper.event.entity.ProjectileCollideEvent;
import com.destroystokyo.paper.event.player.PlayerElytraBoostEvent;
Expand Down Expand Up @@ -319,17 +318,6 @@ public class SimpleEvents {
.examples("on sheep grow wool:",
"\tcancel event")
.since("2.2-dev21");
Skript.registerEvent("Inventory Open", SimpleEvent.class, InventoryOpenEvent.class, "inventory open[ed]")
.description("Called when an inventory is opened for player.")
.examples("on inventory open:",
"\tclose player's inventory")
.since("2.2-dev21");
Skript.registerEvent("Inventory Close", SimpleEvent.class, InventoryCloseEvent.class, "inventory clos(ing|e[d])")
.description("Called when player's currently viewed inventory is closed.")
.examples("on inventory close:",
"\tif player's location is {location}:",
"\t\tsend \"You exited the shop!\"")
.since("2.2-dev21");
Skript.registerEvent("Slime Split", SimpleEvent.class, SlimeSplitEvent.class, "slime split[ting]")
.description("Called when a slime splits. Usually this happens when a big slime dies.")
.examples("on slime split:")
Expand Down Expand Up @@ -435,10 +423,6 @@ public class SimpleEvents {
"\tif the clicked button is 1: # offer 1",
"\t\tset the applied enchantments to sharpness 10 and unbreaking 10")
.since("2.5");
Skript.registerEvent("Inventory Pickup", SimpleEvent.class, InventoryPickupItemEvent.class, "inventory pick[ ]up")
.description("Called when an inventory (a hopper, a hopper minecart, etc.) picks up an item")
.examples("on inventory pickup:")
.since("2.5.1");
Skript.registerEvent("Horse Jump", SimpleEvent.class, HorseJumpEvent.class, "horse jump")
.description("Called when a horse jumps.")
.examples("on horse jump:", "\tpush event-entity upwards at speed 2")
Expand Down Expand Up @@ -488,14 +472,6 @@ public class SimpleEvents {
"\t\tcancel event")
.since("2.7");
}
if (Skript.classExists("com.destroystokyo.paper.event.block.AnvilDamagedEvent")) {
Skript.registerEvent("Anvil Damage", SimpleEvent.class, AnvilDamagedEvent.class, "anvil damag(e|ing)")
.description("Called when an anvil is damaged/broken from being used to repair/rename items.",
"Note: this does not include anvil damage from falling.")
.examples("on anvil damage:",
"\tcancel the event")
.since("2.7");
}

if (Skript.classExists("io.papermc.paper.event.player.PlayerStopUsingItemEvent")) {
Skript.registerEvent("Stop Using Item", SimpleEvent.class, PlayerStopUsingItemEvent.class,
Expand Down Expand Up @@ -555,16 +531,6 @@ public class SimpleEvents {
"\tteleport event-projectile to block 5 above event-projectile"
)
.since("2.8.0");

Skript.registerEvent("Inventory Drag", SimpleEvent.class, InventoryDragEvent.class, "inventory drag[ging]")
.description("Called when a player drags an item in their cursor across the inventory.")
.examples(
"on inventory drag:",
"\tif player's current inventory is {_gui}:",
"\t\tsend \"You can't drag your items here!\" to player",
"\t\tcancel event"
)
.since("2.7");
Skript.registerEvent("Piglin Barter", SimpleEvent.class, PiglinBarterEvent.class, "piglin (barter[ing]|trad(e|ing))")
.description(
"Called when a piglin finishes bartering. A piglin may start bartering after picking up an item on its bartering list.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import org.skriptlang.skript.bukkit.entity.EntityModule;
import org.skriptlang.skript.bukkit.fishing.FishingModule;
import org.skriptlang.skript.bukkit.input.InputModule;
import org.skriptlang.skript.bukkit.inventory.InventoryClassInfo;
import org.skriptlang.skript.bukkit.inventory.InventoryModule;
import org.skriptlang.skript.bukkit.item.ItemModule;
import org.skriptlang.skript.bukkit.itemcomponents.ItemComponentModule;
import org.skriptlang.skript.bukkit.loottables.LootTableModule;
Expand Down Expand Up @@ -47,6 +49,7 @@ public Iterable<AddonModule> children() {
new EntityModule(this),
new FishingModule(this),
new InputModule(this),
new InventoryModule(this),
new ItemModule(this),
new ItemComponentModule(this),
new LootTableModule(this),
Expand All @@ -65,7 +68,6 @@ protected void initSelf(SkriptAddon addon) {
Classes.registerClass(new BlockClassInfo());
Classes.registerClass(new ChunkClassInfo());
Classes.registerClass(new EntityClassInfo());
Classes.registerClass(new InventoryClassInfo());
Classes.registerClass(new ItemStackClassInfo());
Classes.registerClass(new ItemTypeClassInfo());
Classes.registerClass(new LocationClassInfo());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.skriptlang.skript.bukkit.types;
package org.skriptlang.skript.bukkit.inventory;

import ch.njol.skript.Skript;
import ch.njol.skript.aliases.ItemType;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package org.skriptlang.skript.bukkit.inventory;

import ch.njol.skript.registrations.Classes;
import org.skriptlang.skript.addon.AddonModule;
import org.skriptlang.skript.addon.HierarchicalAddonModule;
import org.skriptlang.skript.addon.SkriptAddon;
import org.skriptlang.skript.bukkit.inventory.elements.InventoryEvents;
import org.skriptlang.skript.bukkit.inventory.elements.events.EvtInventoryClick;
import org.skriptlang.skript.bukkit.lang.eventvalue.EventValueRegistry;
import org.skriptlang.skript.registration.SyntaxRegistry;

public class InventoryModule extends HierarchicalAddonModule {

public InventoryModule(AddonModule parentModule) {
super(parentModule);
}

@Override
protected void initSelf(SkriptAddon addon) {
Classes.registerClass(new InventoryClassInfo());
}

@Override
protected void loadSelf(SkriptAddon addon) {
SyntaxRegistry syntaxRegistry = moduleRegistry(addon);
EventValueRegistry eventValueRegistry = addon.registry(EventValueRegistry.class);

InventoryEvents.register(syntaxRegistry, eventValueRegistry);
EvtInventoryClick.register(syntaxRegistry, eventValueRegistry);
}

@Override
public String name() {
return "inventory";
}

}
Loading
Loading