From 975445f7c3a4f0b9f30d1d755460d51d9a22eb70 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Wed, 22 Jan 2025 22:30:43 -0800 Subject: [PATCH 1/7] EventValues - add an option to use changers --- .../classes/data/BukkitEventValues.java | 14 ++++++- .../base/EventValueExpression.java | 41 ++++++++++++++++--- .../skript/lang/converter/EventConverter.java | 22 ++++++++++ 3 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/skriptlang/skript/lang/converter/EventConverter.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 503baf87877..b9cbdee065c 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java @@ -55,7 +55,9 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionType; +import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.lang.converter.Converter; +import org.skriptlang.skript.lang.converter.EventConverter; import java.util.ArrayList; import java.util.HashSet; @@ -298,7 +300,17 @@ public PotionEffectType convert(AreaEffectCloudApplyEvent event) { EventValues.registerEventValue(EntityPickupItemEvent.class, Item.class, EntityPickupItemEvent::getItem); EventValues.registerEventValue(EntityPickupItemEvent.class, ItemType.class, event -> new ItemType(event.getItem().getItemStack())); // PlayerItemConsumeEvent - EventValues.registerEventValue(PlayerItemConsumeEvent.class, ItemStack.class, PlayerItemConsumeEvent::getItem); + EventValues.registerEventValue(PlayerItemConsumeEvent.class, ItemStack.class, new EventConverter<>() { + @Override + public void set(PlayerItemConsumeEvent event, @Nullable ItemStack itemStack) { + event.setItem(itemStack); + } + + @Override + public ItemStack convert(PlayerItemConsumeEvent from) { + return from.getItem(); + } + }); // PlayerItemBreakEvent EventValues.registerEventValue(PlayerItemBreakEvent.class, ItemStack.class, PlayerItemBreakEvent::getBrokenItem); // PlayerInteractEntityEvent diff --git a/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java b/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java index 49b1a307639..7293d209c3a 100644 --- a/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java +++ b/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java @@ -10,6 +10,7 @@ import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.lang.parser.ParserInstance; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.skript.localization.Noun; import ch.njol.skript.log.ParseLogHandler; @@ -18,6 +19,8 @@ import ch.njol.skript.registrations.EventValues; import ch.njol.skript.util.Utils; import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; +import org.skriptlang.skript.lang.converter.EventConverter; import org.skriptlang.skript.registration.SyntaxInfo; import org.skriptlang.skript.registration.SyntaxRegistry; import org.skriptlang.skript.util.Priority; @@ -95,6 +98,7 @@ public static void register(Class> express } private final Map, Converter> converters = new HashMap<>(); + private final Map, EventConverter> eventConverters = new HashMap<>(); private final Class componentType; private final Class type; @@ -103,6 +107,7 @@ public static void register(Class> express private Changer changer; private final boolean single; private final boolean exact; + private boolean isDelayed; public EventValueExpression(Class type) { this(type, null); @@ -140,10 +145,12 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is @Override public boolean init() { + ParserInstance parser = getParser(); + isDelayed = parser.getHasDelayBefore().isTrue(); ParseLogHandler log = SkriptLogger.startParseLogHandler(); try { boolean hasValue = false; - Class[] events = getParser().getCurrentEvents(); + Class[] events = parser.getCurrentEvents(); if (events == null) { assert false; return false; @@ -155,7 +162,7 @@ public boolean init() { } if (EventValues.hasMultipleConverters(event, type, getTime()) == Kleenean.TRUE) { Noun typeName = Classes.getExactClassInfo(componentType).getName(); - log.printError("There are multiple " + typeName.toString(true) + " in " + Utils.a(getParser().getCurrentEventName()) + " event. " + + log.printError("There are multiple " + typeName.toString(true) + " in " + Utils.a(parser.getCurrentEventName()) + " event. " + "You must define which " + typeName + " to use."); return false; } @@ -168,10 +175,13 @@ public boolean init() { if (converter != null) { converters.put(event, converter); hasValue = true; + if (converter instanceof EventConverter eventConverter) { + eventConverters.put(event, eventConverter); + } } } if (!hasValue) { - log.printError("There's no " + Classes.getSuperClassInfo(componentType).getName().toString(!single) + " in " + Utils.a(getParser().getCurrentEventName()) + " event"); + log.printError("There's no " + Classes.getSuperClassInfo(componentType).getName().toString(!single) + " in " + Utils.a(parser.getCurrentEventName()) + " event"); return false; } log.printLog(); @@ -223,6 +233,13 @@ private T getValue(E event) { @Nullable @SuppressWarnings("unchecked") public Class[] acceptChange(ChangeMode mode) { + if (mode == ChangeMode.SET && !eventConverters.isEmpty()) { + if (isDelayed) { + Skript.error("Event values cannot be changed after the event has already passed."); + return null; + } + return CollectionUtils.array(type); + } if (changer == null) changer = (Changer) Classes.getSuperClassInfo(componentType).getChanger(); return changer == null ? null : changer.acceptChange(mode); @@ -230,9 +247,21 @@ public Class[] acceptChange(ChangeMode mode) { @Override public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { - if (changer == null) - throw new SkriptAPIException("The changer cannot be null"); - ChangerUtils.change(changer, getArray(event), delta, mode); + if (mode == ChangeMode.SET) { + EventConverter converter = eventConverters.get(event.getClass()); + if (converter != null && delta != null) { + if (type.isArray()) { + converter.set(event, (T)delta); + } else { + converter.set(event, (T)delta[0]); + } + } + } +// if (changer == null) +// throw new SkriptAPIException("The changer cannot be null"); + if (changer != null) { + ChangerUtils.change(changer, getArray(event), delta, mode); + } } @Override diff --git a/src/main/java/org/skriptlang/skript/lang/converter/EventConverter.java b/src/main/java/org/skriptlang/skript/lang/converter/EventConverter.java new file mode 100644 index 00000000000..74ea759c037 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/lang/converter/EventConverter.java @@ -0,0 +1,22 @@ +package org.skriptlang.skript.lang.converter; + +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +/** + * Used as a converter in EventValue registration to allow for setting event-values + * + * @param Event class to change value + * @param Type of value to change + */ +public interface EventConverter extends Converter { + + /** + * Set the value of something in an event + * + * @param event Event to have value changed + * @param value Value to change in event + */ + void set(E event, @Nullable T value); + +} From dbb9bd184c25448d890e350e896589e310d2b130 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Wed, 22 Jan 2025 22:45:42 -0800 Subject: [PATCH 2/7] EventValueExpression - cleanup --- .../ch/njol/skript/expressions/base/EventValueExpression.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java b/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java index 7293d209c3a..51f759f6549 100644 --- a/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java +++ b/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java @@ -257,8 +257,6 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { } } } -// if (changer == null) -// throw new SkriptAPIException("The changer cannot be null"); if (changer != null) { ChangerUtils.change(changer, getArray(event), delta, mode); } From e305445b0555e5080ba37367a503daac4b6f4447 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Thu, 23 Jan 2025 10:38:04 -0800 Subject: [PATCH 3/7] EventConverter - repackage --- .../java/ch/njol/skript/classes/data/BukkitEventValues.java | 2 +- .../ch/njol/skript/expressions/base/EventValueExpression.java | 2 +- .../{lang/converter => bukkit/event}/EventConverter.java | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) rename src/main/java/org/skriptlang/skript/{lang/converter => bukkit/event}/EventConverter.java (83%) 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 b9cbdee065c..60379481c2d 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java @@ -57,7 +57,7 @@ import org.bukkit.potion.PotionType; import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.lang.converter.Converter; -import org.skriptlang.skript.lang.converter.EventConverter; +import org.skriptlang.skript.bukkit.event.EventConverter; import java.util.ArrayList; import java.util.HashSet; diff --git a/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java b/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java index 51f759f6549..402416f614a 100644 --- a/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java +++ b/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java @@ -20,7 +20,7 @@ import ch.njol.skript.util.Utils; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; -import org.skriptlang.skript.lang.converter.EventConverter; +import org.skriptlang.skript.bukkit.event.EventConverter; import org.skriptlang.skript.registration.SyntaxInfo; import org.skriptlang.skript.registration.SyntaxRegistry; import org.skriptlang.skript.util.Priority; diff --git a/src/main/java/org/skriptlang/skript/lang/converter/EventConverter.java b/src/main/java/org/skriptlang/skript/bukkit/event/EventConverter.java similarity index 83% rename from src/main/java/org/skriptlang/skript/lang/converter/EventConverter.java rename to src/main/java/org/skriptlang/skript/bukkit/event/EventConverter.java index 74ea759c037..da5d77d36e7 100644 --- a/src/main/java/org/skriptlang/skript/lang/converter/EventConverter.java +++ b/src/main/java/org/skriptlang/skript/bukkit/event/EventConverter.java @@ -1,7 +1,8 @@ -package org.skriptlang.skript.lang.converter; +package org.skriptlang.skript.bukkit.event; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.lang.converter.Converter; /** * Used as a converter in EventValue registration to allow for setting event-values From b0498e81a3fc6dced688382a470a0c920b5397c4 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Thu, 23 Jan 2025 11:08:13 -0800 Subject: [PATCH 4/7] EventValueExpression - strip out some null delta checks --- .../skript/expressions/base/EventValueExpression.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java b/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java index 402416f614a..50b11b1dc43 100644 --- a/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java +++ b/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java @@ -249,11 +249,11 @@ public Class[] acceptChange(ChangeMode mode) { public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { if (mode == ChangeMode.SET) { EventConverter converter = eventConverters.get(event.getClass()); - if (converter != null && delta != null) { - if (type.isArray()) { - converter.set(event, (T)delta); - } else { + if (converter != null) { + if (!type.isArray() && delta != null) { converter.set(event, (T)delta[0]); + } else { + converter.set(event, (T)delta); } } } From 30acdac4390b7bb7d69ab6035e3ab07e3da81499 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Thu, 23 Jan 2025 11:17:14 -0800 Subject: [PATCH 5/7] EventConverter - moved to group with EventValues - As per pickle's request --- .../java/ch/njol/skript/classes/data/BukkitEventValues.java | 2 +- .../ch/njol/skript/expressions/base/EventValueExpression.java | 2 +- .../event => ch/njol/skript/registrations}/EventConverter.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/main/java/{org/skriptlang/skript/bukkit/event => ch/njol/skript/registrations}/EventConverter.java (92%) 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 60379481c2d..b27c0aaa7a8 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java @@ -57,7 +57,7 @@ import org.bukkit.potion.PotionType; import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.lang.converter.Converter; -import org.skriptlang.skript.bukkit.event.EventConverter; +import ch.njol.skript.registrations.EventConverter; import java.util.ArrayList; import java.util.HashSet; diff --git a/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java b/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java index 50b11b1dc43..afba9f6bfa9 100644 --- a/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java +++ b/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java @@ -20,7 +20,7 @@ import ch.njol.skript.util.Utils; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; -import org.skriptlang.skript.bukkit.event.EventConverter; +import ch.njol.skript.registrations.EventConverter; import org.skriptlang.skript.registration.SyntaxInfo; import org.skriptlang.skript.registration.SyntaxRegistry; import org.skriptlang.skript.util.Priority; diff --git a/src/main/java/org/skriptlang/skript/bukkit/event/EventConverter.java b/src/main/java/ch/njol/skript/registrations/EventConverter.java similarity index 92% rename from src/main/java/org/skriptlang/skript/bukkit/event/EventConverter.java rename to src/main/java/ch/njol/skript/registrations/EventConverter.java index da5d77d36e7..95944db4b51 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/event/EventConverter.java +++ b/src/main/java/ch/njol/skript/registrations/EventConverter.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.event; +package ch.njol.skript.registrations; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; From 4e4ba758d6505ef8d0c75b235b5da9072c5771ca Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Thu, 23 Jan 2025 19:43:42 -0800 Subject: [PATCH 6/7] Add junit test --- .../expressions/EventValueExpressionTest.java | 34 +++++++++++++++++++ src/test/skript/junit/EventValueExpression.sk | 17 ++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/test/java/org/skriptlang/skript/test/tests/syntaxes/expressions/EventValueExpressionTest.java create mode 100644 src/test/skript/junit/EventValueExpression.sk diff --git a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/expressions/EventValueExpressionTest.java b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/expressions/EventValueExpressionTest.java new file mode 100644 index 00000000000..ca3302fcd31 --- /dev/null +++ b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/expressions/EventValueExpressionTest.java @@ -0,0 +1,34 @@ +package org.skriptlang.skript.test.tests.syntaxes.expressions; + +import ch.njol.skript.test.runner.SkriptJUnitTest; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerItemConsumeEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; +import org.easymock.EasyMock; +import org.junit.Before; +import org.junit.Test; + +public class EventValueExpressionTest extends SkriptJUnitTest { + + static { + setShutdownDelay(1); + } + + private Player player; + + @Before + public void before() { + player = EasyMock.niceMock(Player.class); + EasyMock.expect(player.getName()).andReturn("MrHungryPants"); + EasyMock.replay(player); + } + + @Test + public void test() { + Bukkit.getPluginManager().callEvent(new PlayerItemConsumeEvent(player, new ItemStack(Material.APPLE), EquipmentSlot.HAND)); + } + +} diff --git a/src/test/skript/junit/EventValueExpression.sk b/src/test/skript/junit/EventValueExpression.sk new file mode 100644 index 00000000000..1a74ce81ebd --- /dev/null +++ b/src/test/skript/junit/EventValueExpression.sk @@ -0,0 +1,17 @@ +test "EventValueExpression setters" when running JUnit: + set {_tests::1} to "correct starting item" + set {_tests::2} to "correct changed item" + + ensure junit test "org.skriptlang.skript.test.tests.syntaxes.expressions.EventValueExpressionTest" completes {_tests::*} + +on consume: + set {_test} to "org.skriptlang.skript.test.tests.syntaxes.expressions.EventValueExpressionTest" + junit test is {_test} + + if event-item is an apple: + complete objective "correct starting item" for {_test} + + set event-item to 1 of stick + + if event-item is a stick: + complete objective "correct changed item" for {_test} From 57c7d7ba30a523c805e07f6602bcefe2645185a4 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Sat, 25 Jan 2025 10:53:51 -0800 Subject: [PATCH 7/7] EventValueExpression - return after converter to prevent changer from also running --- .../ch/njol/skript/expressions/base/EventValueExpression.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java b/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java index afba9f6bfa9..3968d66f765 100644 --- a/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java +++ b/src/main/java/ch/njol/skript/expressions/base/EventValueExpression.java @@ -255,6 +255,7 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { } else { converter.set(event, (T)delta); } + return; } } if (changer != null) {