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"; + } + +}