Skip to content

Commit

Permalink
Fix InventoryItemMoveEvent Implementations (#5462) (#6233)
Browse files Browse the repository at this point in the history
  • Loading branch information
NotSoDelayed committed Mar 1, 2024
1 parent 20b8981 commit 91059e0
Show file tree
Hide file tree
Showing 5 changed files with 126 additions and 14 deletions.
34 changes: 34 additions & 0 deletions src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.inventory.InventoryPickupItemEvent;
import org.bukkit.event.inventory.PrepareAnvilEvent;
Expand Down Expand Up @@ -1797,6 +1798,39 @@ public TransformReason get(EntityTransformEvent event) {
return event.getTransformReason();
}
}, EventValues.TIME_NOW);

// InventoryMoveItemEvent
EventValues.registerEventValue(InventoryMoveItemEvent.class, Inventory.class, new Getter<Inventory, InventoryMoveItemEvent>() {
@Override
public Inventory get(InventoryMoveItemEvent event) {
return event.getSource();
}
}, EventValues.TIME_NOW);
EventValues.registerEventValue(InventoryMoveItemEvent.class, Inventory.class, new Getter<Inventory, InventoryMoveItemEvent>() {
@Override
public Inventory get(InventoryMoveItemEvent event) {
return event.getDestination();
}
}, EventValues.TIME_FUTURE);
EventValues.registerEventValue(InventoryMoveItemEvent.class, Block.class, new Getter<Block, InventoryMoveItemEvent>() {
@Override
public Block get(InventoryMoveItemEvent event) {
return event.getSource().getLocation().getBlock();
}
}, EventValues.TIME_NOW);
EventValues.registerEventValue(InventoryMoveItemEvent.class, Block.class, new Getter<Block, InventoryMoveItemEvent>() {
@Override
public Block get(InventoryMoveItemEvent event) {
return event.getDestination().getLocation().getBlock();
}
}, EventValues.TIME_FUTURE);
EventValues.registerEventValue(InventoryMoveItemEvent.class, ItemStack.class, new Getter<ItemStack, InventoryMoveItemEvent>() {
@Override
public ItemStack get(InventoryMoveItemEvent event) {
return event.getItem();
}
}, EventValues.TIME_NOW);

}

}
4 changes: 3 additions & 1 deletion src/main/java/ch/njol/skript/events/EvtItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,9 @@ 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)")
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.",
Expand Down
42 changes: 29 additions & 13 deletions src/main/java/ch/njol/skript/expressions/ExprEvtInitiator.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,37 +18,36 @@
*/
package ch.njol.skript.expressions;

import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.inventory.Inventory;

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.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;
import ch.njol.util.coll.CollectionUtils;
import org.bukkit.event.Event;
import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.inventory.Inventory;
import org.eclipse.jdt.annotation.Nullable;

@Name("Initiator Inventory")
@Description("Returns the initiator inventory in an on <a href=\"./events.html?search=#inventory_item_move\">inventory item move</a> event.")
@Examples({
"on inventory item move:",
"\tholder of event-initiator-inventory is a chest",
"\tbroadcast \"Item transport requested at %location at holder of event-initiator-inventory%...\""
"\tbroadcast \"Item transport happening at %location at holder of event-initiator-inventory%!\""
})
@Events("Inventory Item Move")
@Since("2.8.0")
public class ExprEvtInitiator extends EventValueExpression<Inventory> {
public class ExprEvtInitiator extends SimpleExpression<Inventory> {

static {
register(ExprEvtInitiator.class, Inventory.class, "[event-]initiator[( |-)inventory]");
}

public ExprEvtInitiator() {
super(Inventory.class);
Skript.registerExpression(ExprEvtInitiator.class, Inventory.class, ExpressionType.SIMPLE, "[the] [event-]initiator[( |-)inventory]");
}

@Override
Expand All @@ -57,11 +56,28 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelaye
Skript.error("'event-initiator' can only be used in an 'inventory item move' event.");
return false;
}
return super.init(exprs, matchedPattern, isDelayed, parseResult);
return true;
}

@Override
protected Inventory[] get(Event event) {
if (!(event instanceof InventoryMoveItemEvent))
return new Inventory[0];
return CollectionUtils.array(((InventoryMoveItemEvent) event).getInitiator());
}

@Override
public boolean isSingle() {
return true;
}

@Override
public Class<? extends Inventory> getReturnType() {
return Inventory.class;
}

@Override
public String toString() {
public String toString(@Nullable Event event, boolean debug) {
return "event-initiator-inventory";
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/**
* 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 <http://www.gnu.org/licenses/>.
*
* Copyright Peter Güttinger, SkriptLang team and contributors
*/
package org.skriptlang.skript.test.tests.syntaxes;

import ch.njol.skript.test.runner.SkriptJUnitTest;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.junit.Test;

// TODO properly add test after merge of https://github.com/SkriptLang/Skript/pull/6261
public class InventoryMoveItemEventTest extends SkriptJUnitTest {

static {
setShutdownDelay(1);
}

@Test
public void test() {
Inventory chestInventory = Bukkit.createInventory(null, InventoryType.CHEST);
ItemStack itemStack = new ItemStack(Material.STONE);
Inventory hopperInventory = Bukkit.createInventory(null, InventoryType.HOPPER);
Bukkit.getPluginManager().callEvent(new InventoryMoveItemEvent(chestInventory, itemStack, hopperInventory, false));
}

}
15 changes: 15 additions & 0 deletions src/test/skript/junit/InventoryMoveItemEvent.sk
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@

# TODO properly add test after merge of https://github.com/SkriptLang/Skript/pull/6261
options:
junit: org.skriptlang.skript.test.tests.syntaxes.InventoryMoveItemEventTest
objective: inventory move item event success

on script load:
ensure junit test "{@junit}" completes "{@objective}"

on inventory item move:
assert type of event-initiator-inventory is a hopper inventory with "event-initiator-inventory should be a hopper inventory, but got %type of event-initiator-inventory%"
assert type of event-inventory is a chest inventory with "past event-inventory should be a chest inventory, but got %type of past event-inventory%"
assert type of future event-inventory is a hopper inventory with "event-inventory should be a hopper inventory, but got %type of event-inventory%"
assert type of event-item is a stone with "event-item should be a stone, but got %type of event-item%"
complete objective "{@objective}" for junit test "{@junit}"

0 comments on commit 91059e0

Please sign in to comment.