diff --git a/src/main/java/ch/njol/skript/conditions/CondElytraBoostConsume.java b/src/main/java/ch/njol/skript/conditions/CondElytraBoostConsume.java index fb3d079d0ac..e5ecfa662c4 100644 --- a/src/main/java/ch/njol/skript/conditions/CondElytraBoostConsume.java +++ b/src/main/java/ch/njol/skript/conditions/CondElytraBoostConsume.java @@ -3,9 +3,11 @@ import ch.njol.skript.Skript; import ch.njol.skript.doc.*; import ch.njol.skript.lang.Condition; +import ch.njol.skript.lang.EventRestrictedSyntax; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; import com.destroystokyo.paper.event.player.PlayerElytraBoostEvent; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; @@ -18,7 +20,7 @@ prevent the used firework from being consumed """) @Since("2.10") -public class CondElytraBoostConsume extends Condition { +public class CondElytraBoostConsume extends Condition implements EventRestrictedSyntax { static { if (Skript.classExists("com.destroystokyo.paper.event.player.PlayerElytraBoostEvent")) { @@ -32,14 +34,15 @@ public class CondElytraBoostConsume extends Condition { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(PlayerElytraBoostEvent.class)) { - Skript.error("This condition can only be used in an 'elytra boost' event."); - return false; - } checkConsume = matchedPattern == 0; return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PlayerElytraBoostEvent.class); + } + @Override public boolean check(Event event) { if (!(event instanceof PlayerElytraBoostEvent boostEvent)) diff --git a/src/main/java/ch/njol/skript/conditions/CondLeashWillDrop.java b/src/main/java/ch/njol/skript/conditions/CondLeashWillDrop.java index 05d7f640eb7..d9bf5a2c336 100644 --- a/src/main/java/ch/njol/skript/conditions/CondLeashWillDrop.java +++ b/src/main/java/ch/njol/skript/conditions/CondLeashWillDrop.java @@ -1,5 +1,7 @@ package ch.njol.skript.conditions; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; import org.bukkit.event.entity.EntityUnleashEvent; import org.jetbrains.annotations.Nullable; @@ -23,7 +25,7 @@ @Keywords("lead") @Events("Leash / Unleash") @Since("2.10") -public class CondLeashWillDrop extends Condition { +public class CondLeashWillDrop extends Condition implements EventRestrictedSyntax { static { // TODO - remove this when Spigot support is dropped @@ -33,14 +35,15 @@ public class CondLeashWillDrop extends Condition { @Override public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(EntityUnleashEvent.class)) { - Skript.error("The 'leash will drop' condition can only be used in an 'unleash' event"); - return false; - } setNegated(parseResult.hasTag("not")); return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(EntityUnleashEvent.class); + } + @Override public boolean check(Event event) { if (!(event instanceof EntityUnleashEvent unleashEvent)) diff --git a/src/main/java/ch/njol/skript/conditions/CondResourcePack.java b/src/main/java/ch/njol/skript/conditions/CondResourcePack.java index f0ee8e6c404..0e7893b0bd1 100644 --- a/src/main/java/ch/njol/skript/conditions/CondResourcePack.java +++ b/src/main/java/ch/njol/skript/conditions/CondResourcePack.java @@ -1,5 +1,7 @@ package ch.njol.skript.conditions; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; import org.bukkit.event.player.PlayerResourcePackStatusEvent; import org.bukkit.event.player.PlayerResourcePackStatusEvent.Status; @@ -25,7 +27,7 @@ """) @Since("2.4") @Events("resource pack request response") -public class CondResourcePack extends Condition { +public class CondResourcePack extends Condition implements EventRestrictedSyntax { static { Skript.registerCondition(CondResourcePack.class, @@ -39,14 +41,15 @@ public class CondResourcePack extends Condition { @SuppressWarnings({"unchecked", "null"}) @Override public boolean init(final Expression[] exprs, final int matchedPattern, final Kleenean isDelayed, final ParseResult parseResult) { - if (!getParser().isCurrentEvent(PlayerResourcePackStatusEvent.class)) { - Skript.error("The resource pack condition can't be used outside of a resource pack response event"); - return false; - } states = (Expression) exprs[0]; setNegated(matchedPattern == 1); return true; } + + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PlayerResourcePackStatusEvent.class); + } @Override public boolean check(Event e) { diff --git a/src/main/java/ch/njol/skript/conditions/CondRespawnLocation.java b/src/main/java/ch/njol/skript/conditions/CondRespawnLocation.java index 055b678cd81..210428ef1d7 100644 --- a/src/main/java/ch/njol/skript/conditions/CondRespawnLocation.java +++ b/src/main/java/ch/njol/skript/conditions/CondRespawnLocation.java @@ -8,9 +8,11 @@ import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Condition; +import ch.njol.skript.lang.EventRestrictedSyntax; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; import org.bukkit.event.player.PlayerRespawnEvent; import org.jetbrains.annotations.Nullable; @@ -25,7 +27,7 @@ @RequiredPlugins("Minecraft 1.16+") @Since("2.7") @Events("respawn") -public class CondRespawnLocation extends Condition { +public class CondRespawnLocation extends Condition implements EventRestrictedSyntax { static { Skript.registerCondition(CondRespawnLocation.class, "[the] respawn location (was|is)[1:(n'| no)t] [a] (:bed|respawn anchor)"); @@ -35,15 +37,16 @@ public class CondRespawnLocation extends Condition { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(PlayerRespawnEvent.class)) { - Skript.error("The 'respawn location' condition may only be used in a respawn event"); - return false; - } setNegated(parseResult.mark == 1); bedSpawn = parseResult.hasTag("bed"); return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PlayerRespawnEvent.class); + } + @Override public boolean check(Event event) { if (event instanceof PlayerRespawnEvent) { diff --git a/src/main/java/ch/njol/skript/conditions/CondWillHatch.java b/src/main/java/ch/njol/skript/conditions/CondWillHatch.java index f7370647ed6..8349215bc01 100644 --- a/src/main/java/ch/njol/skript/conditions/CondWillHatch.java +++ b/src/main/java/ch/njol/skript/conditions/CondWillHatch.java @@ -7,9 +7,11 @@ import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Condition; +import ch.njol.skript.lang.EventRestrictedSyntax; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; import org.bukkit.event.player.PlayerEggThrowEvent; import org.jetbrains.annotations.Nullable; @@ -23,7 +25,7 @@ """) @Events("Egg Throw") @Since("2.7") -public class CondWillHatch extends Condition { +public class CondWillHatch extends Condition implements EventRestrictedSyntax { static { Skript.registerCondition(CondWillHatch.class, @@ -33,14 +35,15 @@ public class CondWillHatch extends Condition { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(PlayerEggThrowEvent.class)) { - Skript.error("You can't use the 'egg will hatch' condition outside of a Player Egg Throw event."); - return false; - } setNegated(!parseResult.hasTag("will")); return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PlayerEggThrowEvent.class); + } + @Override public boolean check(Event event) { if (!(event instanceof PlayerEggThrowEvent)) diff --git a/src/main/java/ch/njol/skript/effects/EffCancelCooldown.java b/src/main/java/ch/njol/skript/effects/EffCancelCooldown.java index 076b9867fd9..eb84feae65a 100644 --- a/src/main/java/ch/njol/skript/effects/EffCancelCooldown.java +++ b/src/main/java/ch/njol/skript/effects/EffCancelCooldown.java @@ -1,5 +1,7 @@ package ch.njol.skript.effects; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; @@ -30,7 +32,7 @@ set the player's display name to arg-1 """) @Since("2.2-dev34") -public class EffCancelCooldown extends Effect { +public class EffCancelCooldown extends Effect implements EventRestrictedSyntax { static { Skript.registerEffect(EffCancelCooldown.class, @@ -42,14 +44,15 @@ public class EffCancelCooldown extends Effect { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { - if (!getParser().isCurrentEvent(ScriptCommandEvent.class)) { - Skript.error("The cancel cooldown effect may only be used in a command", ErrorQuality.SEMANTIC_ERROR); - return false; - } cancel = matchedPattern == 0; return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(ScriptCommandEvent.class); + } + @Override protected void execute(Event e) { if (!(e instanceof ScriptCommandEvent)) diff --git a/src/main/java/ch/njol/skript/effects/EffDropLeash.java b/src/main/java/ch/njol/skript/effects/EffDropLeash.java index 7ebe6294f6a..17d9b5447ac 100644 --- a/src/main/java/ch/njol/skript/effects/EffDropLeash.java +++ b/src/main/java/ch/njol/skript/effects/EffDropLeash.java @@ -1,5 +1,7 @@ package ch.njol.skript.effects; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; import org.bukkit.event.entity.EntityUnleashEvent; import org.jetbrains.annotations.Nullable; @@ -23,7 +25,7 @@ @Keywords("lead") @Events("Leash / Unleash") @Since("2.10") -public class EffDropLeash extends Effect { +public class EffDropLeash extends Effect implements EventRestrictedSyntax { static { Skript.registerEffect(EffDropLeash.class, @@ -36,14 +38,15 @@ public class EffDropLeash extends Effect { @Override public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { - if (!getParser().isCurrentEvent(EntityUnleashEvent.class)) { - Skript.error("The 'drop leash' effect can only be used in an 'unleash' event"); - return false; - } allowLeashDrop = matchedPattern == 0; return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(EntityUnleashEvent.class); + } + @Override protected void execute(Event event) { if (!(event instanceof EntityUnleashEvent unleashEvent)) diff --git a/src/main/java/ch/njol/skript/effects/EffElytraBoostConsume.java b/src/main/java/ch/njol/skript/effects/EffElytraBoostConsume.java index 2199efee982..1df5046bebe 100644 --- a/src/main/java/ch/njol/skript/effects/EffElytraBoostConsume.java +++ b/src/main/java/ch/njol/skript/effects/EffElytraBoostConsume.java @@ -3,9 +3,11 @@ import ch.njol.skript.Skript; import ch.njol.skript.doc.*; import ch.njol.skript.lang.Effect; +import ch.njol.skript.lang.EventRestrictedSyntax; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; import com.destroystokyo.paper.event.player.PlayerElytraBoostEvent; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; @@ -18,7 +20,7 @@ prevent the used firework from being consume """) @Since("2.10") -public class EffElytraBoostConsume extends Effect { +public class EffElytraBoostConsume extends Effect implements EventRestrictedSyntax { static { if (Skript.classExists("com.destroystokyo.paper.event.player.PlayerElytraBoostEvent")) { @@ -32,14 +34,15 @@ public class EffElytraBoostConsume extends Effect { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(PlayerElytraBoostEvent.class)) { - Skript.error("This effect can only be used in an 'elytra boost' event."); - return false; - } consume = matchedPattern == 1; return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PlayerElytraBoostEvent.class); + } + @Override protected void execute(Event event) { if (!(event instanceof PlayerElytraBoostEvent boostEvent)) diff --git a/src/main/java/ch/njol/skript/effects/EffHidePlayerFromServerList.java b/src/main/java/ch/njol/skript/effects/EffHidePlayerFromServerList.java index 2c267191685..0daa0b285ef 100644 --- a/src/main/java/ch/njol/skript/effects/EffHidePlayerFromServerList.java +++ b/src/main/java/ch/njol/skript/effects/EffHidePlayerFromServerList.java @@ -3,6 +3,8 @@ import java.util.Arrays; import java.util.Iterator; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.server.ServerListPingEvent; @@ -28,7 +30,7 @@ hide {vanished::*} from the server list """) @Since("2.3") -public class EffHidePlayerFromServerList extends Effect { +public class EffHidePlayerFromServerList extends Effect implements EventRestrictedSyntax { static { Skript.registerEffect(EffHidePlayerFromServerList.class, @@ -36,20 +38,13 @@ public class EffHidePlayerFromServerList extends Effect { "hide %players%'[s] info[rmation] (in|on|from) [the] server list"); } - private static final boolean PAPER_EVENT_EXISTS = Skript.classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent"); - @SuppressWarnings("null") private Expression players; @SuppressWarnings({"unchecked", "null"}) @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - boolean isServerPingEvent = getParser().isCurrentEvent(ServerListPingEvent.class) || - (PAPER_EVENT_EXISTS && getParser().isCurrentEvent(PaperServerListPingEvent.class)); - if (!isServerPingEvent) { - Skript.error("The hide player from server list effect can't be used outside of a server list ping event"); - return false; - } else if (isDelayed == Kleenean.TRUE) { + if (isDelayed == Kleenean.TRUE) { Skript.error("Can't hide players from the server list anymore after the server list ping event has already passed"); return false; } @@ -57,6 +52,11 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(ServerListPingEvent.class, PaperServerListPingEvent.class); + } + @Override @SuppressWarnings("removal") protected void execute(Event e) { diff --git a/src/main/java/ch/njol/skript/effects/EffKeepInventory.java b/src/main/java/ch/njol/skript/effects/EffKeepInventory.java index 1a9c43add6e..9f05beb95bc 100644 --- a/src/main/java/ch/njol/skript/effects/EffKeepInventory.java +++ b/src/main/java/ch/njol/skript/effects/EffKeepInventory.java @@ -1,5 +1,7 @@ package ch.njol.skript.effects; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.PlayerDeathEvent; @@ -25,7 +27,7 @@ """) @Since("2.4") @Events("death") -public class EffKeepInventory extends Effect { +public class EffKeepInventory extends Effect implements EventRestrictedSyntax { static { Skript.registerEffect(EffKeepInventory.class, @@ -39,10 +41,6 @@ public class EffKeepInventory extends Effect { public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { keepItems = matchedPattern == 0 || parseResult.mark == 1; keepExp = matchedPattern == 1 || parseResult.mark == 1; - if (!getParser().isCurrentEvent(EntityDeathEvent.class)) { - Skript.error("The keep inventory/experience effect can't be used outside of a death event"); - return false; - } if (isDelayed.isTrue()) { Skript.error("Can't keep the inventory/experience anymore after the event has already passed"); return false; @@ -50,6 +48,11 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(EntityDeathEvent.class); + } + @Override protected void execute(Event event) { if (event instanceof PlayerDeathEvent) { diff --git a/src/main/java/ch/njol/skript/effects/EffLoadServerIcon.java b/src/main/java/ch/njol/skript/effects/EffLoadServerIcon.java index ff87e2b0698..7f568089ec1 100644 --- a/src/main/java/ch/njol/skript/effects/EffLoadServerIcon.java +++ b/src/main/java/ch/njol/skript/effects/EffLoadServerIcon.java @@ -39,8 +39,6 @@ public class EffLoadServerIcon extends AsyncEffect { Skript.registerEffect(EffLoadServerIcon.class, "load [the] server icon (from|of) [the] [image] [file] %string%"); } - private static final boolean PAPER_EVENT_EXISTS = Skript.classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent"); - @SuppressWarnings("null") private Expression path; @@ -51,10 +49,6 @@ public class EffLoadServerIcon extends AsyncEffect { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { getParser().setHasDelayBefore(Kleenean.TRUE); - if (!PAPER_EVENT_EXISTS) { - Skript.error("The load server icon effect requires Paper 1.12.2 or newer"); - return false; - } path = (Expression) exprs[0]; return true; } diff --git a/src/main/java/ch/njol/skript/effects/EffMakeEggHatch.java b/src/main/java/ch/njol/skript/effects/EffMakeEggHatch.java index 83c62f64420..38303592c82 100644 --- a/src/main/java/ch/njol/skript/effects/EffMakeEggHatch.java +++ b/src/main/java/ch/njol/skript/effects/EffMakeEggHatch.java @@ -7,9 +7,11 @@ import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Effect; +import ch.njol.skript.lang.EventRestrictedSyntax; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; import org.bukkit.event.player.PlayerEggThrowEvent; import org.jetbrains.annotations.Nullable; @@ -23,7 +25,7 @@ """) @Events("Egg Throw") @Since("2.7") -public class EffMakeEggHatch extends Effect { +public class EffMakeEggHatch extends Effect implements EventRestrictedSyntax { static { Skript.registerEffect(EffMakeEggHatch.class, @@ -35,14 +37,15 @@ public class EffMakeEggHatch extends Effect { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(PlayerEggThrowEvent.class)) { - Skript.error("You can't use the 'make the egg hatch' effect outside of a Player Egg Throw event."); - return false; - } not = parseResult.hasTag("not"); return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PlayerEggThrowEvent.class); + } + @Override protected void execute(Event e) { if (e instanceof PlayerEggThrowEvent) { diff --git a/src/main/java/ch/njol/skript/effects/EffPlayerInfoVisibility.java b/src/main/java/ch/njol/skript/effects/EffPlayerInfoVisibility.java index ced4b44dc6f..50489423ead 100644 --- a/src/main/java/ch/njol/skript/effects/EffPlayerInfoVisibility.java +++ b/src/main/java/ch/njol/skript/effects/EffPlayerInfoVisibility.java @@ -3,9 +3,11 @@ import ch.njol.skript.Skript; import ch.njol.skript.doc.*; import ch.njol.skript.lang.Effect; +import ch.njol.skript.lang.EventRestrictedSyntax; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; import com.destroystokyo.paper.event.server.PaperServerListPingEvent; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; @@ -22,7 +24,7 @@ @Example("reveal all player related info") @Since("2.3") @Events("server list ping") -public class EffPlayerInfoVisibility extends Effect { +public class EffPlayerInfoVisibility extends Effect implements EventRestrictedSyntax { static { Skript.registerEffect(EffPlayerInfoVisibility.class, @@ -30,19 +32,11 @@ public class EffPlayerInfoVisibility extends Effect { "(show|reveal) [all] player [related] info[rmation] [(in|to|on|from) [the] server list]"); } - private static final boolean PAPER_EVENT_EXISTS = Skript.classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent"); - private boolean shouldHide; @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!PAPER_EVENT_EXISTS) { - Skript.error("The player info visibility effect requires Paper 1.12.2 or newer"); - return false; - } else if (!getParser().isCurrentEvent(PaperServerListPingEvent.class)) { - Skript.error("The player info visibility effect can't be used outside of a server list ping event"); - return false; - } else if (isDelayed == Kleenean.TRUE) { + if (isDelayed == Kleenean.TRUE) { Skript.error("Can't change the player info visibility anymore after the server list ping event has already passed"); return false; } @@ -50,6 +44,11 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PaperServerListPingEvent.class); + } + @Override protected void execute(Event e) { if (!(e instanceof PaperServerListPingEvent)) diff --git a/src/main/java/ch/njol/skript/expressions/ExprAbsorbedBlocks.java b/src/main/java/ch/njol/skript/expressions/ExprAbsorbedBlocks.java index d41a808dfcb..153a4048426 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprAbsorbedBlocks.java +++ b/src/main/java/ch/njol/skript/expressions/ExprAbsorbedBlocks.java @@ -3,6 +3,8 @@ import java.util.Iterator; import java.util.List; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.block.BlockState; import org.bukkit.event.Event; import org.bukkit.event.block.SpongeAbsorbEvent; @@ -27,7 +29,7 @@ @Events("sponge absorb") @Example("the absorbed blocks") @Since("2.5") -public class ExprAbsorbedBlocks extends SimpleExpression { +public class ExprAbsorbedBlocks extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprAbsorbedBlocks.class, BlockStateBlock.class, ExpressionType.SIMPLE, "[the] absorbed blocks"); @@ -35,12 +37,13 @@ public class ExprAbsorbedBlocks extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(SpongeAbsorbEvent.class)) { - Skript.error("The 'absorbed blocks' are only usable in sponge absorb events", ErrorQuality.SEMANTIC_ERROR); - return false; - } return true; } + + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(SpongeAbsorbEvent.class); + } @Override @Nullable diff --git a/src/main/java/ch/njol/skript/expressions/ExprAffectedEntities.java b/src/main/java/ch/njol/skript/expressions/ExprAffectedEntities.java index 56aaa587a4c..ee463e3ea8d 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprAffectedEntities.java +++ b/src/main/java/ch/njol/skript/expressions/ExprAffectedEntities.java @@ -4,6 +4,7 @@ import java.util.Objects; import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.lang.EventRestrictedSyntax; import ch.njol.util.coll.CollectionUtils; import org.bukkit.entity.LivingEntity; import org.bukkit.event.Event; @@ -30,7 +31,7 @@ send "WARNING: you've step on an area effect cloud!" to loop-value """) @Since("2.4") -public class ExprAffectedEntities extends SimpleExpression { +public class ExprAffectedEntities extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprAffectedEntities.class, LivingEntity.class, ExpressionType.SIMPLE, "[the] affected entities"); @@ -38,13 +39,14 @@ public class ExprAffectedEntities extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parser) { - if (!getParser().isCurrentEvent(AreaEffectCloudApplyEvent.class)) { - Skript.error("The 'affected entities' expression may only be used in an area cloud effect event."); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(AreaEffectCloudApplyEvent.class); + } + @Override protected LivingEntity @Nullable [] get(Event event) { if (event instanceof AreaEffectCloudApplyEvent areaEvent) diff --git a/src/main/java/ch/njol/skript/expressions/ExprAppliedEffect.java b/src/main/java/ch/njol/skript/expressions/ExprAppliedEffect.java index f02a191d845..3dee2c5b0d3 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprAppliedEffect.java +++ b/src/main/java/ch/njol/skript/expressions/ExprAppliedEffect.java @@ -2,11 +2,13 @@ import ch.njol.skript.Skript; import ch.njol.skript.doc.*; +import ch.njol.skript.lang.EventRestrictedSyntax; 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 com.destroystokyo.paper.event.block.BeaconEffectEvent; import org.bukkit.event.Event; import org.bukkit.potion.PotionEffectType; @@ -23,7 +25,7 @@ """) @Events("Beacon Effect") @Since("2.10") -public class ExprAppliedEffect extends SimpleExpression { +public class ExprAppliedEffect extends SimpleExpression implements EventRestrictedSyntax { static { if (Skript.classExists("com.destroystokyo.paper.event.block.BeaconEffectEvent")) { @@ -34,13 +36,14 @@ public class ExprAppliedEffect extends SimpleExpression { @Override public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(BeaconEffectEvent.class)) { - Skript.error("You can only use 'applied effect' in a beacon effect event."); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(BeaconEffectEvent.class); + } + @Override protected PotionEffectType @Nullable [] get(Event event) { if (!(event instanceof BeaconEffectEvent effectEvent)) diff --git a/src/main/java/ch/njol/skript/expressions/ExprAppliedEnchantments.java b/src/main/java/ch/njol/skript/expressions/ExprAppliedEnchantments.java index 4faa757cb48..85885ddcc9f 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprAppliedEnchantments.java +++ b/src/main/java/ch/njol/skript/expressions/ExprAppliedEnchantments.java @@ -1,5 +1,6 @@ package ch.njol.skript.expressions; +import ch.njol.skript.lang.EventRestrictedSyntax; import org.bukkit.enchantments.Enchantment; import org.bukkit.event.Event; import org.bukkit.event.enchantment.EnchantItemEvent; @@ -30,7 +31,7 @@ """) @Events("enchant") @Since("2.5") -public class ExprAppliedEnchantments extends SimpleExpression { +public class ExprAppliedEnchantments extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprAppliedEnchantments.class, EnchantmentType.class, ExpressionType.SIMPLE, "[the] applied enchant[ment]s"); @@ -38,13 +39,14 @@ public class ExprAppliedEnchantments extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(EnchantItemEvent.class)) { - Skript.error("The applied enchantments are only usable in an enchant event.", ErrorQuality.SEMANTIC_ERROR); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(EnchantItemEvent.class); + } + @SuppressWarnings("null") @Override @Nullable diff --git a/src/main/java/ch/njol/skript/expressions/ExprBarterDrops.java b/src/main/java/ch/njol/skript/expressions/ExprBarterDrops.java index 385daca4422..1486dc89f84 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprBarterDrops.java +++ b/src/main/java/ch/njol/skript/expressions/ExprBarterDrops.java @@ -7,6 +7,7 @@ import ch.njol.skript.doc.Example; import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.EventRestrictedSyntax; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; @@ -29,7 +30,7 @@ broadcast "it's not halloween yet!" """) @Since("2.10") -public class ExprBarterDrops extends SimpleExpression { +public class ExprBarterDrops extends SimpleExpression implements EventRestrictedSyntax { static { if (Skript.classExists("org.bukkit.event.entity.PiglinBarterEvent")) { @@ -42,15 +43,15 @@ public class ExprBarterDrops extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult result) { - if (!getParser().isCurrentEvent(PiglinBarterEvent.class)) { - Skript.error("The expression 'barter drops' can only be used in the piglin bartering event"); - return false; - } - delay = isDelayed; return true; } + + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PiglinBarterEvent.class); + } @Override @Nullable diff --git a/src/main/java/ch/njol/skript/expressions/ExprBarterInput.java b/src/main/java/ch/njol/skript/expressions/ExprBarterInput.java index f677e08143c..bd0f5adc648 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprBarterInput.java +++ b/src/main/java/ch/njol/skript/expressions/ExprBarterInput.java @@ -6,11 +6,13 @@ import ch.njol.skript.doc.Example; import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.EventRestrictedSyntax; 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.entity.PiglinBarterEvent; import org.jetbrains.annotations.Nullable; @@ -23,7 +25,7 @@ broadcast "my precious..." """) @Since("2.10") -public class ExprBarterInput extends SimpleExpression { +public class ExprBarterInput extends SimpleExpression implements EventRestrictedSyntax { static { if (Skript.classExists("org.bukkit.event.entity.PiglinBarterEvent")) { @@ -34,13 +36,14 @@ public class ExprBarterInput extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult result) { - if (!getParser().isCurrentEvent(PiglinBarterEvent.class)) { - Skript.error("The expression 'barter input' can only be used in the piglin bartering event"); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PiglinBarterEvent.class); + } + @Override @Nullable protected ItemType[] get(Event event) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprCmdCooldownInfo.java b/src/main/java/ch/njol/skript/expressions/ExprCmdCooldownInfo.java index 1afd010d11e..9cb0eaf7882 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprCmdCooldownInfo.java +++ b/src/main/java/ch/njol/skript/expressions/ExprCmdCooldownInfo.java @@ -2,6 +2,8 @@ import java.util.UUID; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.Event; @@ -35,7 +37,7 @@ teleport player to {home::%player%} """) @Since("2.2-dev33") -public class ExprCmdCooldownInfo extends SimpleExpression { +public class ExprCmdCooldownInfo extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprCmdCooldownInfo.class, Object.class, ExpressionType.SIMPLE, @@ -51,13 +53,14 @@ public class ExprCmdCooldownInfo extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { pattern = matchedPattern; - if (!getParser().isCurrentEvent(ScriptCommandEvent.class)) { - Skript.error("The " + getExpressionName() + " expression can only be used within a command", ErrorQuality.SEMANTIC_ERROR); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(ScriptCommandEvent.class); + } + @Override @Nullable protected Object[] get(Event e) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprDamage.java b/src/main/java/ch/njol/skript/expressions/ExprDamage.java index 77af9b89b35..de0c2f4a36b 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprDamage.java +++ b/src/main/java/ch/njol/skript/expressions/ExprDamage.java @@ -1,5 +1,6 @@ package ch.njol.skript.expressions; +import ch.njol.skript.lang.EventRestrictedSyntax; import org.bukkit.event.Event; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerItemDamageEvent; @@ -39,7 +40,7 @@ """) @Since("1.3.5, 2.8.0 (item damage event)") @Events({"Damage", "Vehicle Damage", "Item Damage"}) -public class ExprDamage extends SimpleExpression { +public class ExprDamage extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprDamage.class, Number.class, ExpressionType.SIMPLE, "[the] damage"); @@ -50,13 +51,14 @@ public class ExprDamage extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(EntityDamageEvent.class, VehicleDamageEvent.class, PlayerItemDamageEvent.class)) { - Skript.error("The 'damage' expression may only be used in damage events"); - return false; - } delay = isDelayed; return true; } + + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(EntityDamageEvent.class, VehicleDamageEvent.class, PlayerItemDamageEvent.class); + } @Override @Nullable diff --git a/src/main/java/ch/njol/skript/expressions/ExprEnchantItem.java b/src/main/java/ch/njol/skript/expressions/ExprEnchantItem.java index 59c31f6b364..b76aeccad44 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprEnchantItem.java +++ b/src/main/java/ch/njol/skript/expressions/ExprEnchantItem.java @@ -1,5 +1,6 @@ package ch.njol.skript.expressions; +import ch.njol.skript.lang.EventRestrictedSyntax; import org.bukkit.event.Event; import org.bukkit.event.enchantment.EnchantItemEvent; import org.bukkit.event.enchantment.PrepareItemEnchantEvent; @@ -34,7 +35,7 @@ """) @Events({"enchant prepare", "enchant"}) @Since("2.5") -public class ExprEnchantItem extends SimpleExpression { +public class ExprEnchantItem extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprEnchantItem.class, ItemType.class, ExpressionType.SIMPLE, "[the] enchant[ed] item"); @@ -42,13 +43,14 @@ public class ExprEnchantItem extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(EnchantItemEvent.class) && !getParser().isCurrentEvent(PrepareItemEnchantEvent.class)) { - Skript.error("The enchant item is only usable in an enchant prepare event or enchant event.", ErrorQuality.SEMANTIC_ERROR); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(EnchantItemEvent.class, PrepareItemEnchantEvent.class); + } + @Override @Nullable protected ItemType[] get(Event e) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprEnchantingExpCost.java b/src/main/java/ch/njol/skript/expressions/ExprEnchantingExpCost.java index e22595e946b..97d0d4f2f0e 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprEnchantingExpCost.java +++ b/src/main/java/ch/njol/skript/expressions/ExprEnchantingExpCost.java @@ -1,5 +1,6 @@ package ch.njol.skript.expressions; +import ch.njol.skript.lang.EventRestrictedSyntax; import org.bukkit.event.Event; import org.bukkit.event.enchantment.EnchantItemEvent; import org.jetbrains.annotations.Nullable; @@ -29,7 +30,7 @@ """) @Events("enchant") @Since("2.5") -public class ExprEnchantingExpCost extends SimpleExpression { +public class ExprEnchantingExpCost extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprEnchantingExpCost.class, Long.class, ExpressionType.SIMPLE, @@ -38,13 +39,14 @@ public class ExprEnchantingExpCost extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(EnchantItemEvent.class)) { - Skript.error("The experience cost of enchanting is only usable in an enchant event.", ErrorQuality.SEMANTIC_ERROR); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(EnchantItemEvent.class); + } + @Override @Nullable protected Long[] get(Event e) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprEnchantmentBonus.java b/src/main/java/ch/njol/skript/expressions/ExprEnchantmentBonus.java index fce4094a136..42b53e16623 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprEnchantmentBonus.java +++ b/src/main/java/ch/njol/skript/expressions/ExprEnchantmentBonus.java @@ -1,5 +1,7 @@ package ch.njol.skript.expressions; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; import org.bukkit.event.enchantment.PrepareItemEnchantEvent; import org.jetbrains.annotations.Nullable; @@ -25,7 +27,7 @@ """) @Events("enchant prepare") @Since("2.5") -public class ExprEnchantmentBonus extends SimpleExpression { +public class ExprEnchantmentBonus extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprEnchantmentBonus.class, Long.class, ExpressionType.SIMPLE, "[the] enchantment bonus"); @@ -33,13 +35,14 @@ public class ExprEnchantmentBonus extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(PrepareItemEnchantEvent.class)) { - Skript.error("The enchantment bonus is only usable in an enchant prepare event.", ErrorQuality.SEMANTIC_ERROR); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PrepareItemEnchantEvent.class); + } + @Override @Nullable protected Long[] get(Event e) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprEnchantmentOffer.java b/src/main/java/ch/njol/skript/expressions/ExprEnchantmentOffer.java index ffac6e92301..d574d0c8e31 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprEnchantmentOffer.java +++ b/src/main/java/ch/njol/skript/expressions/ExprEnchantmentOffer.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Random; +import ch.njol.skript.lang.EventRestrictedSyntax; import org.bukkit.enchantments.EnchantmentOffer; import org.bukkit.event.Event; import org.bukkit.event.enchantment.PrepareItemEnchantEvent; @@ -36,7 +37,7 @@ @Since("2.5") @Events("enchant prepare") @RequiredPlugins("1.11 or newer") -public class ExprEnchantmentOffer extends SimpleExpression { +public class ExprEnchantmentOffer extends SimpleExpression implements EventRestrictedSyntax { static { if (Skript.classExists("org.bukkit.enchantments.EnchantmentOffer")) { @@ -58,10 +59,6 @@ public class ExprEnchantmentOffer extends SimpleExpression { @SuppressWarnings({"null", "unchecked"}) @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(PrepareItemEnchantEvent.class)) { - Skript.error("Enchantment offers are only usable in enchant prepare events", ErrorQuality.SEMANTIC_ERROR); - return false; - } if (matchedPattern == 0) { all = true; } else { @@ -71,6 +68,11 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PrepareItemEnchantEvent.class); + } + @SuppressWarnings({"null", "unused"}) @Override @Nullable diff --git a/src/main/java/ch/njol/skript/expressions/ExprEvtInitiator.java b/src/main/java/ch/njol/skript/expressions/ExprEvtInitiator.java index 6ec2f503161..d25242e7f5c 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprEvtInitiator.java +++ b/src/main/java/ch/njol/skript/expressions/ExprEvtInitiator.java @@ -6,6 +6,7 @@ import ch.njol.skript.doc.Example; import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.EventRestrictedSyntax; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; @@ -26,7 +27,7 @@ """) @Events("Inventory Item Move") @Since("2.8.0") -public class ExprEvtInitiator extends SimpleExpression { +public class ExprEvtInitiator extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprEvtInitiator.class, Inventory.class, ExpressionType.SIMPLE, "[the] [event-]initiator[( |-)inventory]"); @@ -34,13 +35,14 @@ public class ExprEvtInitiator extends SimpleExpression { @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 true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(InventoryMoveItemEvent.class); + } + @Override protected Inventory[] get(Event event) { if (!(event instanceof InventoryMoveItemEvent)) diff --git a/src/main/java/ch/njol/skript/expressions/ExprExperience.java b/src/main/java/ch/njol/skript/expressions/ExprExperience.java index fd3785da2be..97a51e71a62 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprExperience.java +++ b/src/main/java/ch/njol/skript/expressions/ExprExperience.java @@ -4,6 +4,7 @@ import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.*; import ch.njol.skript.events.bukkit.ExperienceSpawnEvent; +import ch.njol.skript.lang.EventRestrictedSyntax; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; @@ -15,10 +16,7 @@ import org.bukkit.event.player.PlayerExpChangeEvent; import org.bukkit.event.player.PlayerFishEvent; import ch.njol.util.coll.CollectionUtils; -import org.bukkit.event.Event; -import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.entity.EntityBreedEvent; -import org.bukkit.event.player.PlayerExpChangeEvent; import org.jetbrains.annotations.Nullable; @Name("Experience") @@ -47,7 +45,7 @@ """) @Since("2.1, 2.5.3 (block break event), 2.7 (experience change event), 2.10 (breeding, fishing)") @Events({"experience spawn", "break / mine", "experience change", "entity breed"}) -public class ExprExperience extends SimpleExpression { +public class ExprExperience extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprExperience.class, Experience.class, ExpressionType.SIMPLE, @@ -56,17 +54,16 @@ public class ExprExperience extends SimpleExpression { @Override public boolean init(Expression[] expressions, int matchedPattern, - Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(ExperienceSpawnEvent.class, BlockBreakEvent.class, - PlayerExpChangeEvent.class, EntityBreedEvent.class, PlayerFishEvent.class)) { - Skript.error("The 'experience' expression can only be used in experience spawn, " + - "block break, player experience change, entity breed or fishing events"); - return false; - } - + Kleenean isDelayed, ParseResult parseResult) { return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(ExperienceSpawnEvent.class, BlockBreakEvent.class, + PlayerExpChangeEvent.class, EntityBreedEvent.class, PlayerFishEvent.class); + } + @Override protected Experience @Nullable [] get(Event event) { Experience[] exp; diff --git a/src/main/java/ch/njol/skript/expressions/ExprExplosionBlockYield.java b/src/main/java/ch/njol/skript/expressions/ExprExplosionBlockYield.java index b24b984bbc4..38b7b2040cf 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprExplosionBlockYield.java +++ b/src/main/java/ch/njol/skript/expressions/ExprExplosionBlockYield.java @@ -1,5 +1,6 @@ package ch.njol.skript.expressions; +import ch.njol.skript.lang.EventRestrictedSyntax; import org.bukkit.event.Event; import org.bukkit.event.entity.EntityExplodeEvent; import org.jetbrains.annotations.Nullable; @@ -29,7 +30,7 @@ """) @Events("explode") @Since("2.5") -public class ExprExplosionBlockYield extends SimpleExpression { +public class ExprExplosionBlockYield extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprExplosionBlockYield.class, Number.class, ExpressionType.PROPERTY, @@ -40,13 +41,14 @@ public class ExprExplosionBlockYield extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(EntityExplodeEvent.class)) { - Skript.error("The 'explosion block yield' is only usable in an explosion event", ErrorQuality.SEMANTIC_ERROR); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(EntityExplodeEvent.class); + } + @Override @Nullable protected Number[] get(Event e) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprExplosionYield.java b/src/main/java/ch/njol/skript/expressions/ExprExplosionYield.java index a1012d7f921..f982cbc10b9 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprExplosionYield.java +++ b/src/main/java/ch/njol/skript/expressions/ExprExplosionYield.java @@ -1,5 +1,6 @@ package ch.njol.skript.expressions; +import ch.njol.skript.lang.EventRestrictedSyntax; import org.bukkit.event.Event; import org.bukkit.event.entity.ExplosionPrimeEvent; import org.jetbrains.annotations.Nullable; @@ -29,7 +30,7 @@ """) @Events("explosion prime") @Since("2.5") -public class ExprExplosionYield extends SimpleExpression { +public class ExprExplosionYield extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprExplosionYield.class, Number.class, ExpressionType.SIMPLE, @@ -40,13 +41,14 @@ public class ExprExplosionYield extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(ExplosionPrimeEvent.class)) { - Skript.error("The explosion radius is only usable in explosion prime events", ErrorQuality.SEMANTIC_ERROR); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(ExplosionPrimeEvent.class); + } + @Override @Nullable protected Number[] get(Event e) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprFertilizedBlocks.java b/src/main/java/ch/njol/skript/expressions/ExprFertilizedBlocks.java index 750967d0bc0..3050ca08db4 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprFertilizedBlocks.java +++ b/src/main/java/ch/njol/skript/expressions/ExprFertilizedBlocks.java @@ -3,6 +3,8 @@ import java.util.Iterator; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; import org.bukkit.event.block.BlockFertilizeEvent; import org.jetbrains.annotations.Nullable; @@ -27,7 +29,7 @@ @Events("block fertilize") @Example("the fertilized blocks") @Since("2.5") -public class ExprFertilizedBlocks extends SimpleExpression { +public class ExprFertilizedBlocks extends SimpleExpression implements EventRestrictedSyntax { static { if (Skript.classExists("org.bukkit.event.block.BlockFertilizeEvent")) @@ -36,12 +38,13 @@ public class ExprFertilizedBlocks extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(BlockFertilizeEvent.class)) { - Skript.error("The 'fertilized blocks' are only usable in block fertilize events"); - return false; - } return true; } + + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(BlockFertilizeEvent.class); + } @Nullable @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprFinalDamage.java b/src/main/java/ch/njol/skript/expressions/ExprFinalDamage.java index d9c80c51825..ab2f526114b 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprFinalDamage.java +++ b/src/main/java/ch/njol/skript/expressions/ExprFinalDamage.java @@ -1,5 +1,7 @@ package ch.njol.skript.expressions; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; import org.bukkit.event.entity.EntityDamageEvent; import org.jetbrains.annotations.Nullable; @@ -24,7 +26,7 @@ @Example("send \"%final damage%\" to victim") @Since("2.2-dev19") @Events("damage") -public class ExprFinalDamage extends SimpleExpression { +public class ExprFinalDamage extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprFinalDamage.class, Number.class, ExpressionType.SIMPLE, "[the] final damage"); @@ -32,12 +34,13 @@ public class ExprFinalDamage extends SimpleExpression { @Override public boolean init(final Expression[] exprs, final int matchedPattern, final Kleenean isDelayed, final ParseResult parseResult) { - if (!getParser().isCurrentEvent(EntityDamageEvent.class)) { - Skript.error("The expression 'final damage' can only be used in damage events", ErrorQuality.SEMANTIC_ERROR); - return false; - } return true; } + + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(EntityDamageEvent.class); + } @Override @Nullable diff --git a/src/main/java/ch/njol/skript/expressions/ExprHanging.java b/src/main/java/ch/njol/skript/expressions/ExprHanging.java index 01395ec06c3..fec9a5ac729 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprHanging.java +++ b/src/main/java/ch/njol/skript/expressions/ExprHanging.java @@ -5,11 +5,13 @@ import ch.njol.skript.doc.Example; import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.EventRestrictedSyntax; 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.entity.Entity; import org.bukkit.event.Event; import org.bukkit.event.hanging.HangingBreakByEntityEvent; @@ -28,7 +30,7 @@ send "You can't break that item frame!" to hanging remover """) @Since("2.6.2") -public class ExprHanging extends SimpleExpression { +public class ExprHanging extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprHanging.class, Entity.class, ExpressionType.SIMPLE, "[the] hanging (entity|:remover)"); @@ -43,13 +45,15 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye if (isRemover && !getParser().isCurrentEvent(HangingBreakEvent.class)) { Skript.error("The expression 'hanging remover' can only be used in break event"); return false; - } else if (!getParser().isCurrentEvent(HangingBreakEvent.class, HangingPlaceEvent.class)) { - Skript.error("The expression 'hanging entity' can only be used in break and place events"); - return false; } return true; } - + + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(HangingBreakEvent.class, HangingPlaceEvent.class); + } + @Override @Nullable public Entity[] get(Event e) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprHatchingNumber.java b/src/main/java/ch/njol/skript/expressions/ExprHatchingNumber.java index 6004abae9e1..aeb93039e39 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprHatchingNumber.java +++ b/src/main/java/ch/njol/skript/expressions/ExprHatchingNumber.java @@ -7,6 +7,7 @@ import ch.njol.skript.doc.Example; import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.EventRestrictedSyntax; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; @@ -28,7 +29,7 @@ """) @Events("Egg Throw") @Since("2.7") -public class ExprHatchingNumber extends SimpleExpression { +public class ExprHatchingNumber extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprHatchingNumber.class, Byte.class, ExpressionType.SIMPLE, @@ -38,13 +39,14 @@ public class ExprHatchingNumber extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(PlayerEggThrowEvent.class)) { - Skript.error("You can't use 'the hatching number' outside of a Player Egg Throw event."); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PlayerEggThrowEvent.class); + } + @Override @Nullable protected Byte[] get(Event event) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprHatchingType.java b/src/main/java/ch/njol/skript/expressions/ExprHatchingType.java index 46dcec5479d..2ff1c118e69 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprHatchingType.java +++ b/src/main/java/ch/njol/skript/expressions/ExprHatchingType.java @@ -9,6 +9,7 @@ import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; import ch.njol.skript.entity.EntityData; +import ch.njol.skript.lang.EventRestrictedSyntax; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; @@ -28,7 +29,7 @@ """) @Events("Egg Throw") @Since("2.7") -public class ExprHatchingType extends SimpleExpression> { +public class ExprHatchingType extends SimpleExpression> implements EventRestrictedSyntax { static { //noinspection unchecked @@ -39,13 +40,14 @@ public class ExprHatchingType extends SimpleExpression> { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(PlayerEggThrowEvent.class)) { - Skript.error("You can't use 'the hatching entity type' outside of a Player Egg Throw event."); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PlayerEggThrowEvent.class); + } + @Override @Nullable protected EntityData[] get(Event event) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java b/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java index 433c514e326..ecc962a7841 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java +++ b/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java @@ -1,6 +1,7 @@ package ch.njol.skript.expressions; +import ch.njol.skript.lang.EventRestrictedSyntax; import org.bukkit.event.Event; import org.bukkit.event.entity.EntityRegainHealthEvent; import org.jetbrains.annotations.Nullable; @@ -29,7 +30,7 @@ """) @Events("heal") @Since("2.5.1") -public class ExprHealAmount extends SimpleExpression { +public class ExprHealAmount extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprHealAmount.class, Double.class, ExpressionType.SIMPLE, "[the] heal[ing] amount"); @@ -39,14 +40,15 @@ public class ExprHealAmount extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(EntityRegainHealthEvent.class)) { - Skript.error("The expression 'heal amount' may only be used in a healing event"); - return false; - } delay = isDelayed; return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(EntityRegainHealthEvent.class); + } + @Nullable @Override protected Double[] get(Event event) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprHostname.java b/src/main/java/ch/njol/skript/expressions/ExprHostname.java index 2ce724c0c6e..bc892d173ca 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprHostname.java +++ b/src/main/java/ch/njol/skript/expressions/ExprHostname.java @@ -1,5 +1,7 @@ package ch.njol.skript.expressions; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; import org.bukkit.event.player.PlayerLoginEvent; import org.jetbrains.annotations.Nullable; @@ -23,7 +25,7 @@ send "Welcome back tester!" """) @Since("2.6.1") -public class ExprHostname extends SimpleExpression { +public class ExprHostname extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprHostname.class, String.class, ExpressionType.SIMPLE, "[the] (host|domain)[ ][name]"); @@ -32,12 +34,13 @@ public class ExprHostname extends SimpleExpression { @Override @SuppressWarnings({"null"}) public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(PlayerLoginEvent.class)) { - Skript.error("The hostname expression must be used in a player connect event"); - return false; - } return true; } + + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PlayerLoginEvent.class); + } @Override @Nullable diff --git a/src/main/java/ch/njol/skript/expressions/ExprHotbarButton.java b/src/main/java/ch/njol/skript/expressions/ExprHotbarButton.java index cdad734b128..e82f5067538 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprHotbarButton.java +++ b/src/main/java/ch/njol/skript/expressions/ExprHotbarButton.java @@ -1,5 +1,7 @@ package ch.njol.skript.expressions; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; import org.bukkit.event.inventory.InventoryClickEvent; import org.jetbrains.annotations.Nullable; @@ -22,7 +24,7 @@ send "You clicked the hotbar button %hotbar button%!" """) @Since("2.5") -public class ExprHotbarButton extends SimpleExpression { +public class ExprHotbarButton extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprHotbarButton.class, Long.class, ExpressionType.SIMPLE, "[the] hotbar button"); @@ -30,12 +32,13 @@ public class ExprHotbarButton extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parser) { - if (!getParser().isCurrentEvent(InventoryClickEvent.class)) { - Skript.error("The 'hotbar button' expression may only be used in an inventory click event."); - return false; - } return true; } + + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(InventoryClickEvent.class); + } @Nullable @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprHoverList.java b/src/main/java/ch/njol/skript/expressions/ExprHoverList.java index 11d31f9d8e3..787c08db3db 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprHoverList.java +++ b/src/main/java/ch/njol/skript/expressions/ExprHoverList.java @@ -3,6 +3,7 @@ import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.*; +import ch.njol.skript.lang.EventRestrictedSyntax; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; @@ -10,9 +11,7 @@ import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; import com.destroystokyo.paper.event.server.PaperServerListPingEvent; -import com.destroystokyo.paper.profile.PlayerProfile; import net.kyori.adventure.text.Component; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; @@ -27,9 +26,9 @@ @Description({ "The list when you hover on the player counts of the server in the server list.", "This can be changed using texts or players in a server list ping event only. " + - "Adding players to the list means adding the name of the players.", + "Adding players to the list means adding the name of the players.", "And note that, for example if there are 5 online players (includes fake online count) " + - "in the server and the hover list is set to 3 values, Minecraft will show \"... and 2 more ...\" at end of the list." + "in the server and the hover list is set to 3 values, Minecraft will show \"... and 2 more ...\" at end of the list." }) @Example(""" on server list ping: @@ -40,54 +39,52 @@ """) @Since("2.3") @Events("server list ping") -public class ExprHoverList extends SimpleExpression { +public class ExprHoverList extends SimpleExpression implements EventRestrictedSyntax +{ - static { + static + { Skript.registerExpression(ExprHoverList.class, String.class, ExpressionType.SIMPLE, "[the] [custom] [player|server] (hover|sample) ([message] list|message)", "[the] [custom] player [hover|sample] list"); } - private static final boolean PAPER_EVENT_EXISTS = Skript.classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent"); - private static final boolean HAS_NEW_LISTED_PLAYER_INFO = Skript.classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent$ListedPlayerInfo"); - @Override - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!PAPER_EVENT_EXISTS) { - Skript.error("The hover list expression requires Paper 1.12.2 or newer"); - return false; - } else if (!getParser().isCurrentEvent(PaperServerListPingEvent.class)) { - Skript.error("The hover list expression can't be used outside of a server list ping event"); - return false; - } + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) + { return true; } @Override - @SuppressWarnings({"removal"}) - public String @Nullable [] get(Event event) { - if (!(event instanceof PaperServerListPingEvent)) - return null; + public Class[] supportedEvents() + { + return CollectionUtils.array(PaperServerListPingEvent.class); + } - if (HAS_NEW_LISTED_PLAYER_INFO) { - return ((PaperServerListPingEvent) event).getListedPlayers().stream() - .map(PaperServerListPingEvent.ListedPlayerInfo::name) - .toArray(String[]::new); - } else { - return ((PaperServerListPingEvent) event).getPlayerSample().stream() - .map(PlayerProfile::getName) - .toArray(String[]::new); + @Override + public String @Nullable [] get(Event event) + { + if (!(event instanceof PaperServerListPingEvent pingEvent)) + { + return null; } + + return pingEvent.getListedPlayers().stream() + .map(PaperServerListPingEvent.ListedPlayerInfo::name) + .toArray(String[]::new); } @Override @Nullable - public Class[] acceptChange(ChangeMode mode) { - if (getParser().getHasDelayBefore().isTrue()) { + public Class[] acceptChange(ChangeMode mode) + { + if (getParser().getHasDelayBefore().isTrue()) + { Skript.error("Can't change the hover list anymore after the server list ping event has already passed"); return null; } - switch (mode) { + switch (mode) + { case SET: case ADD: case REMOVE: @@ -100,65 +97,41 @@ public Class[] acceptChange(ChangeMode mode) { @Override @SuppressWarnings({"null", "removal"}) - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { - if (!(event instanceof PaperServerListPingEvent)) + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) + { + if (!(event instanceof PaperServerListPingEvent pingEvent)) + { return; + } // convert components to legacy strings - if (delta != null) { + if (delta != null) + { delta = Arrays.stream(delta) .map(obj -> obj instanceof Component component ? TextComponentParser.instance().toLegacyString(component) : obj) .toArray(); } - if (HAS_NEW_LISTED_PLAYER_INFO) { - List values = new ArrayList<>(); - if (mode != ChangeMode.DELETE && mode != ChangeMode.RESET && mode != ChangeMode.REMOVE) { - for (Object object : delta) { - if (object instanceof Player) { - Player player = (Player) object; - values.add(new PaperServerListPingEvent.ListedPlayerInfo(player.getName(), player.getUniqueId())); - } else { - values.add(new PaperServerListPingEvent.ListedPlayerInfo((String) object, UUID.randomUUID())); - } - } - } - - List sample = ((PaperServerListPingEvent) event).getListedPlayers(); - switch (mode) { - case SET: - sample.clear(); - // $FALL-THROUGH$ - case ADD: - sample.addAll(values); - break; - case REMOVE: - for (Object value : delta) { - sample.removeIf(profile -> profile.name().equals(value)); - } - break; - case DELETE: - case RESET: - sample.clear(); - break; - } - return; - } - - List values = new ArrayList<>(); - if (mode != ChangeMode.DELETE && mode != ChangeMode.RESET && mode != ChangeMode.REMOVE) { - for (Object object : delta) { - if (object instanceof Player) { + List values = new ArrayList<>(); + if (mode != ChangeMode.DELETE && mode != ChangeMode.RESET && mode != ChangeMode.REMOVE) + { + for (Object object : delta) + { + if (object instanceof Player) + { Player player = (Player) object; - values.add(Bukkit.createProfile(player.getUniqueId(), player.getName())); - } else { - values.add(Bukkit.createProfile(UUID.randomUUID(), (String) object)); + values.add(new PaperServerListPingEvent.ListedPlayerInfo(player.getName(), player.getUniqueId())); + } + else + { + values.add(new PaperServerListPingEvent.ListedPlayerInfo((String) object, UUID.randomUUID())); } } } - List sample = ((PaperServerListPingEvent) event).getPlayerSample(); - switch (mode) { + List sample = pingEvent.getListedPlayers(); + switch (mode) + { case SET: sample.clear(); // $FALL-THROUGH$ @@ -166,8 +139,9 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { sample.addAll(values); break; case REMOVE: - for (Object value : delta) { - sample.removeIf(profile -> profile.getName() != null && profile.getName().equals(value)); + for (Object value : delta) + { + sample.removeIf(profile -> profile.name().equals(value)); } break; case DELETE: @@ -178,17 +152,20 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { } @Override - public boolean isSingle() { + public boolean isSingle() + { return false; } @Override - public Class getReturnType() { + public Class getReturnType() + { return String.class; } @Override - public String toString(@Nullable Event e, boolean debug) { + public String toString(@Nullable Event e, boolean debug) + { return "the hover list"; } diff --git a/src/main/java/ch/njol/skript/expressions/ExprIP.java b/src/main/java/ch/njol/skript/expressions/ExprIP.java index c6da46554ea..c473b535909 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprIP.java +++ b/src/main/java/ch/njol/skript/expressions/ExprIP.java @@ -48,8 +48,6 @@ public class ExprIP extends SimpleExpression { "IP[( |-)address]"); } - private static final boolean PAPER_EVENT_EXISTS = Skript.classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent"); - @SuppressWarnings("null") private Expression players; @@ -61,7 +59,7 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye isProperty = matchedPattern < 2; boolean isConnectEvent = getParser().isCurrentEvent(PlayerLoginEvent.class); boolean isServerPingEvent = getParser().isCurrentEvent(ServerListPingEvent.class) || - (PAPER_EVENT_EXISTS && getParser().isCurrentEvent(PaperServerListPingEvent.class)); + getParser().isCurrentEvent(PaperServerListPingEvent.class); if (isProperty) { players = (Expression) exprs[0]; } else if (!isConnectEvent && !isServerPingEvent) { @@ -76,14 +74,15 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye protected String[] get(Event e) { if (!isProperty) { InetAddress address; - if (e instanceof PlayerLoginEvent) + if (e instanceof PlayerLoginEvent loginEvent) { // Return IP address of the connected player in connect event - address = ((PlayerLoginEvent) e).getAddress(); - else if (e instanceof ServerListPingEvent) + address = loginEvent.getAddress(); + } else if (e instanceof ServerListPingEvent pingEvent) // Return IP address of the pinger in server list ping event - address = ((ServerListPingEvent) e).getAddress(); - else + address = pingEvent.getAddress(); + else { return null; + } return CollectionUtils.array(address.getHostAddress()); } @@ -106,7 +105,7 @@ private String getIP(Player player, Event e) { assert sockAddr != null; // Not in connect event address = sockAddr.getAddress(); } - + String hostAddress = address == null ? "unknown" : address.getHostAddress(); assert hostAddress != null; return hostAddress; diff --git a/src/main/java/ch/njol/skript/expressions/ExprLastLoadedServerIcon.java b/src/main/java/ch/njol/skript/expressions/ExprLastLoadedServerIcon.java index c91ecb47ee3..6fa2aeafacc 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprLastLoadedServerIcon.java +++ b/src/main/java/ch/njol/skript/expressions/ExprLastLoadedServerIcon.java @@ -26,14 +26,8 @@ public class ExprLastLoadedServerIcon extends SimpleExpression Skript.registerExpression(ExprLastLoadedServerIcon.class, CachedServerIcon.class, ExpressionType.SIMPLE, "[the] [last[ly]] loaded server icon"); } - private static final boolean PAPER_EVENT_EXISTS = Skript.classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent"); - @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!PAPER_EVENT_EXISTS) { - Skript.error("The last loaded server icon expression requires Paper 1.12.2+"); - return false; - } return true; } diff --git a/src/main/java/ch/njol/skript/expressions/ExprMaxPlayers.java b/src/main/java/ch/njol/skript/expressions/ExprMaxPlayers.java index 95a4e6cb500..340e248fc6e 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprMaxPlayers.java +++ b/src/main/java/ch/njol/skript/expressions/ExprMaxPlayers.java @@ -36,16 +36,12 @@ public class ExprMaxPlayers extends SimpleExpression { ); } - // TODO - remove these fields when Spigot support is dropped - private static final boolean PAPER_EVENT_EXISTS = Skript.classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent"); - private static final boolean SET_MAX_PLAYERS_EXISTS = Skript.methodExists(Server.class, "setMaxPlayers", int.class); - private boolean isReal; @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { boolean isServerPingEvent = getParser().isCurrentEvent(ServerListPingEvent.class) || - (PAPER_EVENT_EXISTS && getParser().isCurrentEvent(PaperServerListPingEvent.class)); + getParser().isCurrentEvent(PaperServerListPingEvent.class); if (parseResult.mark == 2 && !isServerPingEvent) { Skript.error("The 'shown' max players count expression can't be used outside of a server list ping event"); @@ -77,11 +73,6 @@ public Class[] acceptChange(ChangeMode mode) { return null; } - if (isReal && !SET_MAX_PLAYERS_EXISTS) { - Skript.error("Modifying the 'real max player count' is only supported on Paper 1.16 and newer"); - return null; - } - switch (mode) { case SET: case ADD: diff --git a/src/main/java/ch/njol/skript/expressions/ExprMendingRepairAmount.java b/src/main/java/ch/njol/skript/expressions/ExprMendingRepairAmount.java index e562b75e35d..3892f3bc39c 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprMendingRepairAmount.java +++ b/src/main/java/ch/njol/skript/expressions/ExprMendingRepairAmount.java @@ -1,5 +1,6 @@ package ch.njol.skript.expressions; +import ch.njol.skript.lang.EventRestrictedSyntax; import org.bukkit.event.Event; import org.bukkit.event.player.PlayerItemMendEvent; import org.jetbrains.annotations.Nullable; @@ -27,7 +28,7 @@ set the mending repair amount to 100 """) @Since("2.5.1") -public class ExprMendingRepairAmount extends SimpleExpression { +public class ExprMendingRepairAmount extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprMendingRepairAmount.class, Long.class, ExpressionType.SIMPLE, "[the] [mending] repair amount"); @@ -35,13 +36,14 @@ public class ExprMendingRepairAmount extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(PlayerItemMendEvent.class)) { - Skript.error("The 'mending repair amount' is only usable in item mend events", ErrorQuality.SEMANTIC_ERROR); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PlayerItemMendEvent.class); + } + @Override protected Long[] get(final Event e) { if (!(e instanceof PlayerItemMendEvent)) diff --git a/src/main/java/ch/njol/skript/expressions/ExprOnlinePlayersCount.java b/src/main/java/ch/njol/skript/expressions/ExprOnlinePlayersCount.java index e0a8af841ff..bc52420da22 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprOnlinePlayersCount.java +++ b/src/main/java/ch/njol/skript/expressions/ExprOnlinePlayersCount.java @@ -38,23 +38,18 @@ public class ExprOnlinePlayersCount extends SimpleExpression { "[the] [(1:(real|default)|2:(fake|shown|displayed))] (count|amount|number|size) of online players"); } - private static final boolean PAPER_EVENT_EXISTS = Skript.classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent"); - private boolean isReal; @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - boolean isPaperEvent = PAPER_EVENT_EXISTS && getParser().isCurrentEvent(PaperServerListPingEvent.class); + boolean isListPingEvent = getParser().isCurrentEvent(PaperServerListPingEvent.class); if (parseResult.mark == 2) { - if (!PAPER_EVENT_EXISTS && getParser().isCurrentEvent(ServerListPingEvent.class)) { - Skript.error("The 'fake' online players count expression requires Paper 1.12.2 or newer"); - return false; - } else if (!isPaperEvent) { + if (!isListPingEvent) { Skript.error("The 'fake' online players count expression can't be used outside of a server list ping event"); return false; } } - isReal = (parseResult.mark == 0 && !isPaperEvent) || parseResult.mark == 1; + isReal = (parseResult.mark == 0 && !isListPingEvent) || parseResult.mark == 1; return true; } diff --git a/src/main/java/ch/njol/skript/expressions/ExprPortal.java b/src/main/java/ch/njol/skript/expressions/ExprPortal.java index 5bde4f7ce26..b8c911329fc 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprPortal.java +++ b/src/main/java/ch/njol/skript/expressions/ExprPortal.java @@ -3,6 +3,8 @@ import java.util.Iterator; import java.util.List; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.event.Event; @@ -30,7 +32,7 @@ """) @Since("2.4") @Events("portal_create") -public class ExprPortal extends SimpleExpression { +public class ExprPortal extends SimpleExpression implements EventRestrictedSyntax { // 1.14+ returns List, 1.13.2 and below returns ArrayList private static final boolean USING_BLOCKSTATE = Skript.isRunningMinecraft(1, 14); @@ -43,10 +45,12 @@ public class ExprPortal extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parser) { - if (getParser().isCurrentEvent(PortalCreateEvent.class)) - return true; - Skript.error("The 'portal' expression may only be used in a portal creation event."); - return false; + return true; + } + + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PortalCreateEvent.class); } @Nullable diff --git a/src/main/java/ch/njol/skript/expressions/ExprProtocolVersion.java b/src/main/java/ch/njol/skript/expressions/ExprProtocolVersion.java index 26505c24467..24e89444de5 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprProtocolVersion.java +++ b/src/main/java/ch/njol/skript/expressions/ExprProtocolVersion.java @@ -3,6 +3,7 @@ import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.*; +import ch.njol.skript.lang.EventRestrictedSyntax; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; @@ -33,26 +34,22 @@ """) @Since("2.3") @Events("server list ping") -public class ExprProtocolVersion extends SimpleExpression { +public class ExprProtocolVersion extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprProtocolVersion.class, Long.class, ExpressionType.SIMPLE, "[the] [server] [(sent|required|fake)] protocol version [number]"); } - private static final boolean PAPER_EVENT_EXISTS = Skript.classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent"); - @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!PAPER_EVENT_EXISTS) { - Skript.error("The protocol version expression requires Paper 1.12.2 or newer"); - return false; - } else if (!getParser().isCurrentEvent(PaperServerListPingEvent.class)) { - Skript.error("The protocol version expression can't be used outside of a server list ping event"); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PaperServerListPingEvent.class); + } + @Override @Nullable public Long[] get(Event e) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprRespawnLocation.java b/src/main/java/ch/njol/skript/expressions/ExprRespawnLocation.java index ba480d51225..9aede4a2bcd 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprRespawnLocation.java +++ b/src/main/java/ch/njol/skript/expressions/ExprRespawnLocation.java @@ -1,5 +1,6 @@ package ch.njol.skript.expressions; +import ch.njol.skript.lang.EventRestrictedSyntax; import org.bukkit.Location; import org.bukkit.event.Event; import org.bukkit.event.player.PlayerRespawnEvent; @@ -27,7 +28,7 @@ set respawn location to {example::spawn} """) @Since("2.2-dev35") -public class ExprRespawnLocation extends SimpleExpression { +public class ExprRespawnLocation extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprRespawnLocation.class, Location.class, ExpressionType.SIMPLE, "[the] respawn location"); @@ -35,12 +36,13 @@ public class ExprRespawnLocation extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(PlayerRespawnEvent.class)) { - Skript.error("The expression 'respawn location' may only be used in the respawn event", ErrorQuality.SEMANTIC_ERROR); - return false; - } return true; } + + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PlayerRespawnEvent.class); + } @Override @Nullable diff --git a/src/main/java/ch/njol/skript/expressions/ExprServerIcon.java b/src/main/java/ch/njol/skript/expressions/ExprServerIcon.java index 722008dc7a9..e90046abb6f 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprServerIcon.java +++ b/src/main/java/ch/njol/skript/expressions/ExprServerIcon.java @@ -35,16 +35,10 @@ public class ExprServerIcon extends SimpleExpression { "[the] [(1¦(default)|2¦(shown|sent))] [server] icon"); } - private static final boolean PAPER_EVENT_EXISTS = Skript.classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent"); - private boolean isServerPingEvent, isDefault; @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!PAPER_EVENT_EXISTS) { - Skript.error("The server icon expression requires Paper 1.12.2 or newer"); - return false; - } isServerPingEvent = getParser().isCurrentEvent(PaperServerListPingEvent.class); isDefault = (parseResult.mark == 0 && !isServerPingEvent) || parseResult.mark == 1; if (!isServerPingEvent && !isDefault) { @@ -57,8 +51,8 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Override @Nullable public CachedServerIcon[] get(Event e) { - CachedServerIcon icon = null; - if ((isServerPingEvent && !isDefault) && PAPER_EVENT_EXISTS) { + CachedServerIcon icon; + if ((isServerPingEvent && !isDefault)) { if (!(e instanceof PaperServerListPingEvent)) return null; icon = ((PaperServerListPingEvent) e).getServerIcon(); diff --git a/src/main/java/ch/njol/skript/expressions/ExprSourceBlock.java b/src/main/java/ch/njol/skript/expressions/ExprSourceBlock.java index ef2bc7aa5f7..0274e0c109c 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprSourceBlock.java +++ b/src/main/java/ch/njol/skript/expressions/ExprSourceBlock.java @@ -7,11 +7,13 @@ import ch.njol.skript.doc.Events; import ch.njol.skript.doc.Example; import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.EventRestrictedSyntax; 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.block.Block; import org.bukkit.event.Event; import org.bukkit.event.block.BlockSpreadEvent; @@ -26,7 +28,7 @@ set the source block to dirt """) @Since("2.7") -public class ExprSourceBlock extends SimpleExpression { +public class ExprSourceBlock extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprSourceBlock.class, Block.class, ExpressionType.SIMPLE, "[the] source block"); @@ -34,13 +36,14 @@ public class ExprSourceBlock extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(BlockSpreadEvent.class)) { - Skript.error("The 'source block' is only usable in a spread event"); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(BlockSpreadEvent.class); + } + @Override protected Block[] get(Event event) { if (!(event instanceof BlockSpreadEvent)) diff --git a/src/main/java/ch/njol/skript/expressions/ExprTamer.java b/src/main/java/ch/njol/skript/expressions/ExprTamer.java index 1f8d9a04242..4cb9419d85e 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprTamer.java +++ b/src/main/java/ch/njol/skript/expressions/ExprTamer.java @@ -1,5 +1,7 @@ package ch.njol.skript.expressions; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.entity.EntityTameEvent; @@ -24,7 +26,7 @@ send "someone tamed something!" to console """) @Since("2.2-dev25") -public class ExprTamer extends SimpleExpression { +public class ExprTamer extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprTamer.class, Player.class, ExpressionType.SIMPLE, "[the] tamer"); @@ -32,12 +34,13 @@ public class ExprTamer extends SimpleExpression { @Override public boolean init(final Expression[] exprs, final int matchedPattern, final Kleenean isDelayed, final ParseResult parser) { - if (!getParser().isCurrentEvent(EntityTameEvent.class)) { - Skript.error("the expression 'tamer' may only be used in the entity tame event."); - return false; - } return true; } + + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(EntityTameEvent.class); + } @Override protected Player[] get(final Event e) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprUnleashReason.java b/src/main/java/ch/njol/skript/expressions/ExprUnleashReason.java index 3242d51c154..aea0e3fa901 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprUnleashReason.java +++ b/src/main/java/ch/njol/skript/expressions/ExprUnleashReason.java @@ -1,5 +1,7 @@ package ch.njol.skript.expressions; +import ch.njol.skript.lang.EventRestrictedSyntax; +import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; import org.bukkit.event.entity.EntityUnleashEvent; import org.bukkit.event.entity.EntityUnleashEvent.UnleashReason; @@ -21,7 +23,7 @@ """) @Events("Leash / Unleash") @Since("2.10") -public class ExprUnleashReason extends EventValueExpression { +public class ExprUnleashReason extends EventValueExpression implements EventRestrictedSyntax { public ExprUnleashReason() { super(UnleashReason.class); @@ -33,13 +35,14 @@ public ExprUnleashReason() { @Override public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(EntityUnleashEvent.class)) { - Skript.error("The 'unleash reason' expression can only be used in an 'unleash' event"); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(EntityUnleashEvent.class); + } + @Override protected UnleashReason[] get(Event event) { if (!(event instanceof EntityUnleashEvent unleashEvent)) diff --git a/src/main/java/ch/njol/skript/expressions/ExprVersionString.java b/src/main/java/ch/njol/skript/expressions/ExprVersionString.java index 05b74bb0502..105cf51790b 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVersionString.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVersionString.java @@ -3,6 +3,7 @@ import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.*; +import ch.njol.skript.lang.EventRestrictedSyntax; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; @@ -26,9 +27,7 @@ """) @Since("2.3") @Events("Server List Ping") -public class ExprVersionString extends SimpleExpression { - - private static final boolean PAPER_EVENT_EXISTS = Skript.classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent"); +public class ExprVersionString extends SimpleExpression implements EventRestrictedSyntax { static { Skript.registerExpression(ExprVersionString.class, String.class, ExpressionType.SIMPLE, "[the] [shown|custom] version [string|text]"); @@ -36,16 +35,14 @@ public class ExprVersionString extends SimpleExpression { @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!PAPER_EVENT_EXISTS) { - Skript.error("The 'version string' expression requires Paper 1.12.2+"); - return false; - } else if (!getParser().isCurrentEvent(PaperServerListPingEvent.class)) { - Skript.error("The 'version string' expression can't be used outside of a 'server list ping' event"); - return false; - } return true; } + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PaperServerListPingEvent.class); + } + @Override @Nullable public String[] get(Event event) {