Skip to content

Commit 91059e0

Browse files
authored
Fix InventoryItemMoveEvent Implementations (#5462) (#6233)
1 parent 20b8981 commit 91059e0

File tree

5 files changed

+126
-14
lines changed

5 files changed

+126
-14
lines changed

src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@
118118
import org.bukkit.event.inventory.InventoryClickEvent;
119119
import org.bukkit.event.inventory.InventoryCloseEvent;
120120
import org.bukkit.event.inventory.InventoryDragEvent;
121+
import org.bukkit.event.inventory.InventoryMoveItemEvent;
121122
import org.bukkit.event.inventory.InventoryOpenEvent;
122123
import org.bukkit.event.inventory.InventoryPickupItemEvent;
123124
import org.bukkit.event.inventory.PrepareAnvilEvent;
@@ -1797,6 +1798,39 @@ public TransformReason get(EntityTransformEvent event) {
17971798
return event.getTransformReason();
17981799
}
17991800
}, EventValues.TIME_NOW);
1801+
1802+
// InventoryMoveItemEvent
1803+
EventValues.registerEventValue(InventoryMoveItemEvent.class, Inventory.class, new Getter<Inventory, InventoryMoveItemEvent>() {
1804+
@Override
1805+
public Inventory get(InventoryMoveItemEvent event) {
1806+
return event.getSource();
1807+
}
1808+
}, EventValues.TIME_NOW);
1809+
EventValues.registerEventValue(InventoryMoveItemEvent.class, Inventory.class, new Getter<Inventory, InventoryMoveItemEvent>() {
1810+
@Override
1811+
public Inventory get(InventoryMoveItemEvent event) {
1812+
return event.getDestination();
1813+
}
1814+
}, EventValues.TIME_FUTURE);
1815+
EventValues.registerEventValue(InventoryMoveItemEvent.class, Block.class, new Getter<Block, InventoryMoveItemEvent>() {
1816+
@Override
1817+
public Block get(InventoryMoveItemEvent event) {
1818+
return event.getSource().getLocation().getBlock();
1819+
}
1820+
}, EventValues.TIME_NOW);
1821+
EventValues.registerEventValue(InventoryMoveItemEvent.class, Block.class, new Getter<Block, InventoryMoveItemEvent>() {
1822+
@Override
1823+
public Block get(InventoryMoveItemEvent event) {
1824+
return event.getDestination().getLocation().getBlock();
1825+
}
1826+
}, EventValues.TIME_FUTURE);
1827+
EventValues.registerEventValue(InventoryMoveItemEvent.class, ItemStack.class, new Getter<ItemStack, InventoryMoveItemEvent>() {
1828+
@Override
1829+
public ItemStack get(InventoryMoveItemEvent event) {
1830+
return event.getItem();
1831+
}
1832+
}, EventValues.TIME_NOW);
1833+
18001834
}
18011835

18021836
}

src/main/java/ch/njol/skript/events/EvtItem.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,9 @@ public class EvtItem extends SkriptEvent {
130130
.examples("on item merge of gold blocks:",
131131
" cancel event")
132132
.since("2.2-dev35");
133-
Skript.registerEvent("Inventory Item Move", SimpleEvent.class, InventoryMoveItemEvent.class, "inventory item (move|transport)")
133+
Skript.registerEvent("Inventory Item Move", SimpleEvent.class, InventoryMoveItemEvent.class,
134+
"inventory item (move|transport)",
135+
"inventory (mov(e|ing)|transport[ing]) [an] item")
134136
.description(
135137
"Called when an entity or block (e.g. hopper) tries to move items directly from one inventory to another.",
136138
"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.",

src/main/java/ch/njol/skript/expressions/ExprEvtInitiator.java

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,37 +18,36 @@
1818
*/
1919
package ch.njol.skript.expressions;
2020

21-
import org.bukkit.event.inventory.InventoryMoveItemEvent;
22-
import org.bukkit.inventory.Inventory;
23-
2421
import ch.njol.skript.Skript;
2522
import ch.njol.skript.doc.Description;
2623
import ch.njol.skript.doc.Events;
2724
import ch.njol.skript.doc.Examples;
2825
import ch.njol.skript.doc.Name;
2926
import ch.njol.skript.doc.Since;
30-
import ch.njol.skript.expressions.base.EventValueExpression;
3127
import ch.njol.skript.lang.Expression;
28+
import ch.njol.skript.lang.ExpressionType;
3229
import ch.njol.skript.lang.SkriptParser.ParseResult;
30+
import ch.njol.skript.lang.util.SimpleExpression;
3331
import ch.njol.util.Kleenean;
32+
import ch.njol.util.coll.CollectionUtils;
33+
import org.bukkit.event.Event;
34+
import org.bukkit.event.inventory.InventoryMoveItemEvent;
35+
import org.bukkit.inventory.Inventory;
36+
import org.eclipse.jdt.annotation.Nullable;
3437

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

4649
static {
47-
register(ExprEvtInitiator.class, Inventory.class, "[event-]initiator[( |-)inventory]");
48-
}
49-
50-
public ExprEvtInitiator() {
51-
super(Inventory.class);
50+
Skript.registerExpression(ExprEvtInitiator.class, Inventory.class, ExpressionType.SIMPLE, "[the] [event-]initiator[( |-)inventory]");
5251
}
5352

5453
@Override
@@ -57,11 +56,28 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelaye
5756
Skript.error("'event-initiator' can only be used in an 'inventory item move' event.");
5857
return false;
5958
}
60-
return super.init(exprs, matchedPattern, isDelayed, parseResult);
59+
return true;
60+
}
61+
62+
@Override
63+
protected Inventory[] get(Event event) {
64+
if (!(event instanceof InventoryMoveItemEvent))
65+
return new Inventory[0];
66+
return CollectionUtils.array(((InventoryMoveItemEvent) event).getInitiator());
67+
}
68+
69+
@Override
70+
public boolean isSingle() {
71+
return true;
72+
}
73+
74+
@Override
75+
public Class<? extends Inventory> getReturnType() {
76+
return Inventory.class;
6177
}
6278

6379
@Override
64-
public String toString() {
80+
public String toString(@Nullable Event event, boolean debug) {
6581
return "event-initiator-inventory";
6682
}
6783

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/**
2+
* This file is part of Skript.
3+
*
4+
* Skript is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* Skript is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with Skript. If not, see <http://www.gnu.org/licenses/>.
16+
*
17+
* Copyright Peter Güttinger, SkriptLang team and contributors
18+
*/
19+
package org.skriptlang.skript.test.tests.syntaxes;
20+
21+
import ch.njol.skript.test.runner.SkriptJUnitTest;
22+
import org.bukkit.Bukkit;
23+
import org.bukkit.Material;
24+
import org.bukkit.event.inventory.InventoryMoveItemEvent;
25+
import org.bukkit.event.inventory.InventoryType;
26+
import org.bukkit.inventory.Inventory;
27+
import org.bukkit.inventory.ItemStack;
28+
import org.junit.Test;
29+
30+
// TODO properly add test after merge of https://github.com/SkriptLang/Skript/pull/6261
31+
public class InventoryMoveItemEventTest extends SkriptJUnitTest {
32+
33+
static {
34+
setShutdownDelay(1);
35+
}
36+
37+
@Test
38+
public void test() {
39+
Inventory chestInventory = Bukkit.createInventory(null, InventoryType.CHEST);
40+
ItemStack itemStack = new ItemStack(Material.STONE);
41+
Inventory hopperInventory = Bukkit.createInventory(null, InventoryType.HOPPER);
42+
Bukkit.getPluginManager().callEvent(new InventoryMoveItemEvent(chestInventory, itemStack, hopperInventory, false));
43+
}
44+
45+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
# TODO properly add test after merge of https://github.com/SkriptLang/Skript/pull/6261
3+
options:
4+
junit: org.skriptlang.skript.test.tests.syntaxes.InventoryMoveItemEventTest
5+
objective: inventory move item event success
6+
7+
on script load:
8+
ensure junit test "{@junit}" completes "{@objective}"
9+
10+
on inventory item move:
11+
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%"
12+
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%"
13+
assert type of future event-inventory is a hopper inventory with "event-inventory should be a hopper inventory, but got %type of event-inventory%"
14+
assert type of event-item is a stone with "event-item should be a stone, but got %type of event-item%"
15+
complete objective "{@objective}" for junit test "{@junit}"

0 commit comments

Comments
 (0)