From a580caffc32440139082217859bcebf3a0008af7 Mon Sep 17 00:00:00 2001
From: DelayedGaming <72163224+DelayedGaming@users.noreply.github.com>
Date: Tue, 1 Aug 2023 17:17:17 +0800
Subject: [PATCH] Adds InventoryMoveItemEvent (#5462)
---
.../classes/data/BukkitEventValues.java | 46 ++++++-------
.../java/ch/njol/skript/events/EvtItem.java | 19 ++++-
.../skript/expressions/ExprEvtInitiator.java | 69 +++++++++++++++++++
3 files changed, 108 insertions(+), 26 deletions(-)
create mode 100644 src/main/java/ch/njol/skript/expressions/ExprEvtInitiator.java
diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java
index 79072ed5454..ac6159e14b5 100644
--- a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java
+++ b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java
@@ -23,6 +23,28 @@
import java.util.List;
import java.util.Set;
+import ch.njol.skript.Skript;
+import ch.njol.skript.aliases.Aliases;
+import ch.njol.skript.aliases.ItemType;
+import ch.njol.skript.command.CommandEvent;
+import ch.njol.skript.events.bukkit.ScriptEvent;
+import ch.njol.skript.events.bukkit.SkriptStartEvent;
+import ch.njol.skript.events.bukkit.SkriptStopEvent;
+import ch.njol.skript.registrations.EventValues;
+import ch.njol.skript.util.BlockStateBlock;
+import ch.njol.skript.util.BlockUtils;
+import ch.njol.skript.util.DelayedChangeBlock;
+import ch.njol.skript.util.Direction;
+import ch.njol.skript.util.EnchantmentType;
+import ch.njol.skript.util.Getter;
+import ch.njol.skript.util.slot.InventorySlot;
+import ch.njol.skript.util.slot.Slot;
+import com.destroystokyo.paper.event.block.AnvilDamagedEvent;
+import com.destroystokyo.paper.event.entity.ProjectileCollideEvent;
+import com.destroystokyo.paper.event.player.PlayerArmorChangeEvent;
+import io.papermc.paper.event.entity.EntityMoveEvent;
+import io.papermc.paper.event.player.PlayerInventorySlotChangeEvent;
+import io.papermc.paper.event.player.PlayerTradeEvent;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.FireworkEffect;
@@ -143,30 +165,6 @@
import org.bukkit.potion.PotionEffectType;
import org.eclipse.jdt.annotation.Nullable;
-import com.destroystokyo.paper.event.block.AnvilDamagedEvent;
-import com.destroystokyo.paper.event.entity.ProjectileCollideEvent;
-import com.destroystokyo.paper.event.player.PlayerArmorChangeEvent;
-
-import ch.njol.skript.Skript;
-import ch.njol.skript.aliases.Aliases;
-import ch.njol.skript.aliases.ItemType;
-import ch.njol.skript.command.CommandEvent;
-import ch.njol.skript.events.bukkit.ScriptEvent;
-import ch.njol.skript.events.bukkit.SkriptStartEvent;
-import ch.njol.skript.events.bukkit.SkriptStopEvent;
-import ch.njol.skript.registrations.EventValues;
-import ch.njol.skript.util.BlockStateBlock;
-import ch.njol.skript.util.BlockUtils;
-import ch.njol.skript.util.DelayedChangeBlock;
-import ch.njol.skript.util.Direction;
-import ch.njol.skript.util.EnchantmentType;
-import ch.njol.skript.util.Getter;
-import ch.njol.skript.util.slot.InventorySlot;
-import ch.njol.skript.util.slot.Slot;
-import io.papermc.paper.event.entity.EntityMoveEvent;
-import io.papermc.paper.event.player.PlayerInventorySlotChangeEvent;
-import io.papermc.paper.event.player.PlayerTradeEvent;
-
/**
* @author Peter Güttinger
*/
diff --git a/src/main/java/ch/njol/skript/events/EvtItem.java b/src/main/java/ch/njol/skript/events/EvtItem.java
index 4d5e31cb10e..b8c891f7cc2 100644
--- a/src/main/java/ch/njol/skript/events/EvtItem.java
+++ b/src/main/java/ch/njol/skript/events/EvtItem.java
@@ -18,6 +18,7 @@
*/
package ch.njol.skript.events;
+import ch.njol.skript.lang.util.SimpleEvent;
import ch.njol.skript.sections.EffSecSpawn;
import org.bukkit.event.Event;
import org.bukkit.event.block.BlockDispenseEvent;
@@ -28,6 +29,7 @@
import org.bukkit.event.entity.ItemSpawnEvent;
import org.bukkit.event.inventory.CraftItemEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.inventory.PrepareItemCraftEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerItemConsumeEvent;
@@ -127,6 +129,17 @@ 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)")
+ .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("INSERT VERSION");
}
@Nullable
@@ -184,6 +197,8 @@ public boolean check(final Event event) {
is = ((ItemDespawnEvent) event).getEntity().getItemStack();
} else if (event instanceof ItemMergeEvent) {
is = ((ItemMergeEvent) event).getTarget().getItemStack();
+ } else if (event instanceof InventoryMoveItemEvent) {
+ is = ((InventoryMoveItemEvent) event).getItem();
} else {
assert false;
return false;
@@ -201,8 +216,8 @@ public boolean check(final ItemType t) {
}
@Override
- public String toString(final @Nullable Event e, final boolean debug) {
- return "dispense/spawn/drop/craft/pickup/consume/break/despawn/merge" + (types == null ? "" : " of " + types);
+ public String toString(@Nullable Event event, boolean debug) {
+ return "dispense/spawn/drop/craft/pickup/consume/break/despawn/merge/move" + (types == null ? "" : " of " + types);
}
}
diff --git a/src/main/java/ch/njol/skript/expressions/ExprEvtInitiator.java b/src/main/java/ch/njol/skript/expressions/ExprEvtInitiator.java
new file mode 100644
index 00000000000..678c53037d2
--- /dev/null
+++ b/src/main/java/ch/njol/skript/expressions/ExprEvtInitiator.java
@@ -0,0 +1,69 @@
+/**
+ * This file is part of Skript.
+ *
+ * Skript is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Skript is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Skript. If not, see .
+ *
+ * Copyright Peter Güttinger, SkriptLang team and contributors
+ */
+package ch.njol.skript.expressions;
+
+import ch.njol.skript.Skript;
+import ch.njol.skript.doc.Description;
+import ch.njol.skript.doc.Events;
+import ch.njol.skript.doc.Examples;
+import ch.njol.skript.doc.Name;
+import ch.njol.skript.doc.Since;
+import ch.njol.skript.expressions.base.EventValueExpression;
+import ch.njol.skript.lang.Expression;
+import ch.njol.skript.lang.ExpressionType;
+import ch.njol.skript.lang.SkriptParser.ParseResult;
+import ch.njol.util.Kleenean;
+
+import org.bukkit.event.inventory.InventoryMoveItemEvent;
+import org.bukkit.inventory.Inventory;
+
+@Name("Initiator Inventory")
+@Description("Returns the initiator inventory in an on inventory item move event.")
+@Examples({
+ "on inventory item move:",
+ "\tif holder of event-initiator-inventory is a chest:",
+ "broadcast \"Item transport requested at %location at holder of event-initiator-inventory%...\""
+})
+@Events("Inventory Item Move")
+@Since("INSERT VERSION")
+public class ExprEvtInitiator extends EventValueExpression {
+
+ static {
+ Skript.registerExpression(ExprEvtInitiator.class, Inventory.class, ExpressionType.SIMPLE, "[the] [event-]initiator[( |-)inventory]");
+ }
+
+ public ExprEvtInitiator() {
+ super(Inventory.class);
+ }
+
+ @Override
+ public boolean init(Expression>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
+ if (!getParser().isCurrentEvent(InventoryMoveItemEvent.class)) {
+ Skript.error("'event-initiator' can only be used in an 'inventory item move' event.");
+ return false;
+ }
+ return super.init(exprs, matchedPattern, isDelayed, parseResult);
+ }
+
+ @Override
+ public String toString() {
+ return "event-initiator-inventory";
+ }
+
+}