From 09e9a1585702e535021c08ac8813f7426119c90f Mon Sep 17 00:00:00 2001 From: ShaneBee Date: Sun, 9 May 2021 10:14:33 -0700 Subject: [PATCH 1/6] EvtMove - start work on move event --- .../java/ch/njol/skript/events/EvtMove.java | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 src/main/java/ch/njol/skript/events/EvtMove.java diff --git a/src/main/java/ch/njol/skript/events/EvtMove.java b/src/main/java/ch/njol/skript/events/EvtMove.java new file mode 100644 index 00000000000..3e4bf7f4a89 --- /dev/null +++ b/src/main/java/ch/njol/skript/events/EvtMove.java @@ -0,0 +1,92 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package ch.njol.skript.events; + +import ch.njol.skript.Skript; +import ch.njol.skript.entity.EntityData; +import ch.njol.skript.lang.Literal; +import ch.njol.skript.lang.SkriptEvent; +import ch.njol.skript.lang.SkriptParser; +import ch.njol.util.coll.CollectionUtils; +import io.papermc.paper.event.entity.EntityMoveEvent; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.Event; +import org.bukkit.event.player.PlayerMoveEvent; +import org.eclipse.jdt.annotation.Nullable; + +public class EvtMove extends SkriptEvent { + + private static final boolean HAS_ENTITY_MOVE = Skript.classExists("io.papermc.paper.event.entity.EntityMoveEvent"); + + static { + Class[] events; + if (HAS_ENTITY_MOVE) + events = CollectionUtils.array(PlayerMoveEvent.class, EntityMoveEvent.class); + else + events = CollectionUtils.array(PlayerMoveEvent.class); + + Skript.registerEvent("Move", EvtMove.class, events, + "(0¦player|1¦%entitydatas%) move") + .description("Called when a player or entity moves.", + "NOTE: Entity move event will only be called when the entity moves position, not orientation (ie: looking around).", + "NOTE: This event can be performance heavy as it is called quite often.", + "If you use this event, and later remove it, a server restart is recommend to clear registered events from Skript.") + .examples("on player move:", + "\tif player does not have permission \"player.can.move\":", + "\t\tcancel event", + "on skeleton move:", + "\tif event-entity is not in world \"world\":", + "\t\tkill event-entity") + .since("INSERT VERSION"); + } + + @Nullable + private EntityData[] types = null; + + @Override + public boolean init(Literal[] args, int matchedPattern, SkriptParser.ParseResult parseResult) { + if (HAS_ENTITY_MOVE && parseResult.mark == 1) { + types = ((Literal>) args[0]).getAll(); + } + return true; + } + + @Override + public boolean check(Event event) { + if (types == null && event instanceof PlayerMoveEvent) { + return true; + } else if (types != null && HAS_ENTITY_MOVE && event instanceof EntityMoveEvent) { + EntityMoveEvent entityEvent = (EntityMoveEvent) event; + LivingEntity entity = entityEvent.getEntity(); + for (EntityData type : types) { + if (type.isInstance(entity)) { + if (((EntityMoveEvent) event).hasChangedOrientation()) { + return true; + } + } + } + } + return false; + } + + @Override + public String toString(@Nullable Event e, boolean debug) { + return "null"; + } +} From 7cbc52900f3a1cc4f0d40d87c9acc007f6cac2aa Mon Sep 17 00:00:00 2001 From: ShaneBee Date: Sun, 9 May 2021 11:04:49 -0700 Subject: [PATCH 2/6] EvtMove - minor cleanup and doc fix --- .../java/ch/njol/skript/events/EvtMove.java | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/ch/njol/skript/events/EvtMove.java b/src/main/java/ch/njol/skript/events/EvtMove.java index 3e4bf7f4a89..acc12d4f12b 100644 --- a/src/main/java/ch/njol/skript/events/EvtMove.java +++ b/src/main/java/ch/njol/skript/events/EvtMove.java @@ -34,6 +34,10 @@ public class EvtMove extends SkriptEvent { private static final boolean HAS_ENTITY_MOVE = Skript.classExists("io.papermc.paper.event.entity.EntityMoveEvent"); + // There was a point the event existed but this method did not + private static final boolean HAS_POS_METHOD = HAS_ENTITY_MOVE && + Skript.methodExists(EntityMoveEvent.class, "hasChangedPosition", boolean.class); + static { Class[] events; if (HAS_ENTITY_MOVE) @@ -45,15 +49,16 @@ public class EvtMove extends SkriptEvent { "(0¦player|1¦%entitydatas%) move") .description("Called when a player or entity moves.", "NOTE: Entity move event will only be called when the entity moves position, not orientation (ie: looking around).", - "NOTE: This event can be performance heavy as it is called quite often.", - "If you use this event, and later remove it, a server restart is recommend to clear registered events from Skript.") - .examples("on player move:", - "\tif player does not have permission \"player.can.move\":", - "\t\tcancel event", - "on skeleton move:", - "\tif event-entity is not in world \"world\":", - "\t\tkill event-entity") - .since("INSERT VERSION"); + "NOTE: These events can be performance heavy as they are called quite often.", + "If you use these events, and later remove them, a server restart is recommended to clear registered events from Skript.") + .examples("on player move:", + "\tif player does not have permission \"player.can.move\":", + "\t\tcancel event", + "on skeleton move:", + "\tif event-entity is not in world \"world\":", + "\t\tkill event-entity") + .requiredPlugins("Paper 1.16.5+ (for entity move)") + .since("INSERT VERSION"); } @Nullable @@ -76,7 +81,9 @@ public boolean check(Event event) { LivingEntity entity = entityEvent.getEntity(); for (EntityData type : types) { if (type.isInstance(entity)) { - if (((EntityMoveEvent) event).hasChangedOrientation()) { + if (!HAS_POS_METHOD) { + return true; + } else if (((EntityMoveEvent) event).hasChangedPosition()) { return true; } } @@ -87,6 +94,6 @@ public boolean check(Event event) { @Override public String toString(@Nullable Event e, boolean debug) { - return "null"; + return (HAS_ENTITY_MOVE && types != null ? types.toString() : "player") + " move"; } } From fdfa6f5ce9fcd1657780f23fa794070cfb856ad5 Mon Sep 17 00:00:00 2001 From: ShaneBee Date: Sun, 9 May 2021 11:26:31 -0700 Subject: [PATCH 3/6] EvtMove - minor cleanup and code change --- src/main/java/ch/njol/skript/events/EvtMove.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/ch/njol/skript/events/EvtMove.java b/src/main/java/ch/njol/skript/events/EvtMove.java index acc12d4f12b..f4b161b4ba5 100644 --- a/src/main/java/ch/njol/skript/events/EvtMove.java +++ b/src/main/java/ch/njol/skript/events/EvtMove.java @@ -23,6 +23,7 @@ import ch.njol.skript.lang.Literal; import ch.njol.skript.lang.SkriptEvent; import ch.njol.skript.lang.SkriptParser; +import ch.njol.skript.log.ErrorQuality; import ch.njol.util.coll.CollectionUtils; import io.papermc.paper.event.entity.EntityMoveEvent; import org.bukkit.entity.LivingEntity; @@ -66,8 +67,13 @@ public class EvtMove extends SkriptEvent { @Override public boolean init(Literal[] args, int matchedPattern, SkriptParser.ParseResult parseResult) { - if (HAS_ENTITY_MOVE && parseResult.mark == 1) { - types = ((Literal>) args[0]).getAll(); + if (parseResult.mark == 1) { + if (HAS_ENTITY_MOVE) + types = ((Literal>) args[0]).getAll(); + else { + Skript.error("Entity move event requires Paper 1.16.5+", ErrorQuality.SEMANTIC_ERROR); + return false; + } } return true; } @@ -81,9 +87,7 @@ public boolean check(Event event) { LivingEntity entity = entityEvent.getEntity(); for (EntityData type : types) { if (type.isInstance(entity)) { - if (!HAS_POS_METHOD) { - return true; - } else if (((EntityMoveEvent) event).hasChangedPosition()) { + if (!HAS_POS_METHOD || entityEvent.hasChangedPosition()) { return true; } } @@ -96,4 +100,5 @@ public boolean check(Event event) { public String toString(@Nullable Event e, boolean debug) { return (HAS_ENTITY_MOVE && types != null ? types.toString() : "player") + " move"; } + } From 549a74e5073922f144c96e422dcf1a8f9f8a4cfe Mon Sep 17 00:00:00 2001 From: ShaneBee Date: Sun, 9 May 2021 12:15:21 -0700 Subject: [PATCH 4/6] EvtMove - minor changes suggested by Pickle --- src/main/java/ch/njol/skript/events/EvtMove.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ch/njol/skript/events/EvtMove.java b/src/main/java/ch/njol/skript/events/EvtMove.java index f4b161b4ba5..0924f171ae4 100644 --- a/src/main/java/ch/njol/skript/events/EvtMove.java +++ b/src/main/java/ch/njol/skript/events/EvtMove.java @@ -22,7 +22,7 @@ import ch.njol.skript.entity.EntityData; import ch.njol.skript.lang.Literal; import ch.njol.skript.lang.SkriptEvent; -import ch.njol.skript.lang.SkriptParser; +import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.log.ErrorQuality; import ch.njol.util.coll.CollectionUtils; import io.papermc.paper.event.entity.EntityMoveEvent; @@ -66,7 +66,7 @@ public class EvtMove extends SkriptEvent { private EntityData[] types = null; @Override - public boolean init(Literal[] args, int matchedPattern, SkriptParser.ParseResult parseResult) { + public boolean init(Literal[] args, int matchedPattern, ParseResult parseResult) { if (parseResult.mark == 1) { if (HAS_ENTITY_MOVE) types = ((Literal>) args[0]).getAll(); @@ -82,7 +82,7 @@ public boolean init(Literal[] args, int matchedPattern, SkriptParser.ParseRes public boolean check(Event event) { if (types == null && event instanceof PlayerMoveEvent) { return true; - } else if (types != null && HAS_ENTITY_MOVE && event instanceof EntityMoveEvent) { + } else if (HAS_ENTITY_MOVE && types != null && event instanceof EntityMoveEvent) { EntityMoveEvent entityEvent = (EntityMoveEvent) event; LivingEntity entity = entityEvent.getEntity(); for (EntityData type : types) { From acf730332eb8c899ab83342e8d99f83cef6a98ac Mon Sep 17 00:00:00 2001 From: ShaneBee Date: Sun, 9 May 2021 13:17:27 -0700 Subject: [PATCH 5/6] EvtMove - major changes --- .../java/ch/njol/skript/events/EvtMove.java | 54 +++++++++---------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/src/main/java/ch/njol/skript/events/EvtMove.java b/src/main/java/ch/njol/skript/events/EvtMove.java index 0924f171ae4..c8b92908f44 100644 --- a/src/main/java/ch/njol/skript/events/EvtMove.java +++ b/src/main/java/ch/njol/skript/events/EvtMove.java @@ -26,7 +26,8 @@ import ch.njol.skript.log.ErrorQuality; import ch.njol.util.coll.CollectionUtils; import io.papermc.paper.event.entity.EntityMoveEvent; -import org.bukkit.entity.LivingEntity; +import org.bukkit.Location; +import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.player.PlayerMoveEvent; import org.eclipse.jdt.annotation.Nullable; @@ -35,10 +36,6 @@ public class EvtMove extends SkriptEvent { private static final boolean HAS_ENTITY_MOVE = Skript.classExists("io.papermc.paper.event.entity.EntityMoveEvent"); - // There was a point the event existed but this method did not - private static final boolean HAS_POS_METHOD = HAS_ENTITY_MOVE && - Skript.methodExists(EntityMoveEvent.class, "hasChangedPosition", boolean.class); - static { Class[] events; if (HAS_ENTITY_MOVE) @@ -46,10 +43,9 @@ public class EvtMove extends SkriptEvent { else events = CollectionUtils.array(PlayerMoveEvent.class); - Skript.registerEvent("Move", EvtMove.class, events, - "(0¦player|1¦%entitydatas%) move") + Skript.registerEvent("Move", EvtMove.class, events, "%entitydata% move") .description("Called when a player or entity moves.", - "NOTE: Entity move event will only be called when the entity moves position, not orientation (ie: looking around).", + "NOTE: Move event will only be called when the entity/player moves position, not orientation (ie: looking around).", "NOTE: These events can be performance heavy as they are called quite often.", "If you use these events, and later remove them, a server restart is recommended to clear registered events from Skript.") .examples("on player move:", @@ -58,39 +54,35 @@ public class EvtMove extends SkriptEvent { "on skeleton move:", "\tif event-entity is not in world \"world\":", "\t\tkill event-entity") - .requiredPlugins("Paper 1.16.5+ (for entity move)") + .requiredPlugins("Paper 1.16.5+ (entity move)") .since("INSERT VERSION"); } - @Nullable - private EntityData[] types = null; + private EntityData type; + private boolean isPlayer; @Override public boolean init(Literal[] args, int matchedPattern, ParseResult parseResult) { - if (parseResult.mark == 1) { - if (HAS_ENTITY_MOVE) - types = ((Literal>) args[0]).getAll(); - else { - Skript.error("Entity move event requires Paper 1.16.5+", ErrorQuality.SEMANTIC_ERROR); - return false; - } + type = ((Literal>) args[0]).getSingle(); + isPlayer = Player.class.isAssignableFrom(type.getType()); + + if (!HAS_ENTITY_MOVE && !isPlayer) { + Skript.error("Entity move event requires Paper 1.16.5+", ErrorQuality.SEMANTIC_ERROR); + return false; } return true; } @Override public boolean check(Event event) { - if (types == null && event instanceof PlayerMoveEvent) { - return true; - } else if (HAS_ENTITY_MOVE && types != null && event instanceof EntityMoveEvent) { + if (isPlayer && event instanceof PlayerMoveEvent) { + PlayerMoveEvent playerEvent = (PlayerMoveEvent) event; + return moveCheck(playerEvent.getFrom(), playerEvent.getTo()); + + } else if (HAS_ENTITY_MOVE && event instanceof EntityMoveEvent) { EntityMoveEvent entityEvent = (EntityMoveEvent) event; - LivingEntity entity = entityEvent.getEntity(); - for (EntityData type : types) { - if (type.isInstance(entity)) { - if (!HAS_POS_METHOD || entityEvent.hasChangedPosition()) { - return true; - } - } + if (type.isInstance(entityEvent.getEntity())) { + return moveCheck(entityEvent.getFrom(), entityEvent.getTo()); } } return false; @@ -98,7 +90,11 @@ public boolean check(Event event) { @Override public String toString(@Nullable Event e, boolean debug) { - return (HAS_ENTITY_MOVE && types != null ? types.toString() : "player") + " move"; + return type + " move"; + } + + private static boolean moveCheck(Location from, Location to) { + return from.getX() != to.getX() || from.getY() != to.getY() || from.getZ() != to.getZ() || from.getWorld() != to.getWorld(); } } From 2b5cdc75f731a06e10f8e0a542080119795e3c2b Mon Sep 17 00:00:00 2001 From: ShaneBee Date: Sun, 9 May 2021 13:39:00 -0700 Subject: [PATCH 6/6] EvtMove - changes suggested from Pickle --- src/main/java/ch/njol/skript/events/EvtMove.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/ch/njol/skript/events/EvtMove.java b/src/main/java/ch/njol/skript/events/EvtMove.java index c8b92908f44..9f30d0d606d 100644 --- a/src/main/java/ch/njol/skript/events/EvtMove.java +++ b/src/main/java/ch/njol/skript/events/EvtMove.java @@ -43,7 +43,7 @@ public class EvtMove extends SkriptEvent { else events = CollectionUtils.array(PlayerMoveEvent.class); - Skript.registerEvent("Move", EvtMove.class, events, "%entitydata% move") + Skript.registerEvent("Move", EvtMove.class, events, "%entitydata% (move|walk|step)") .description("Called when a player or entity moves.", "NOTE: Move event will only be called when the entity/player moves position, not orientation (ie: looking around).", "NOTE: These events can be performance heavy as they are called quite often.", @@ -78,7 +78,6 @@ public boolean check(Event event) { if (isPlayer && event instanceof PlayerMoveEvent) { PlayerMoveEvent playerEvent = (PlayerMoveEvent) event; return moveCheck(playerEvent.getFrom(), playerEvent.getTo()); - } else if (HAS_ENTITY_MOVE && event instanceof EntityMoveEvent) { EntityMoveEvent entityEvent = (EntityMoveEvent) event; if (type.isInstance(entityEvent.getEntity())) {