diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java index 9794bfc2e22..76092281e79 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java @@ -41,6 +41,7 @@ import org.bukkit.event.player.PlayerExpCooldownChangeEvent.ChangeReason; import org.bukkit.event.player.PlayerQuitEvent.QuitReason; import org.bukkit.event.player.PlayerResourcePackStatusEvent.Status; +import org.bukkit.event.player.PlayerRespawnEvent.RespawnReason; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.inventory.BlockInventoryHolder; import org.bukkit.inventory.EquipmentSlot; @@ -781,6 +782,12 @@ protected boolean canBeInstantiated() { .description("The spawn reason in a spawn event.") .since("2.3")); + Classes.registerClass(new EnumClassInfo<>(RespawnReason.class, "respawnreason", "respawn reasons") + .user("respawn(ing)? ?reasons?") + .name("Respawn Reason") + .description("The respawn reason in a respawn event.") + .since("INSERT VERSION")); + if (Skript.classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent")) { Classes.registerClass(new ClassInfo<>(CachedServerIcon.class, "cachedservericon") .user("server ?icons?") diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java index b0a81f8d8fd..4520a44acc5 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java @@ -50,6 +50,7 @@ import org.bukkit.event.player.*; import org.bukkit.event.player.PlayerExpCooldownChangeEvent.ChangeReason; import org.bukkit.event.player.PlayerQuitEvent.QuitReason; +import org.bukkit.event.player.PlayerRespawnEvent.RespawnReason; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.event.server.ServerCommandEvent; import org.bukkit.event.vehicle.*; @@ -63,6 +64,7 @@ import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.lang.converter.Converter; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -547,6 +549,21 @@ else if (hand == EquipmentSlot.OFF_HAND) } //CreatureSpawnEvent EventValues.registerEventValue(CreatureSpawnEvent.class, SpawnReason.class, CreatureSpawnEvent::getSpawnReason); + //PlayerRespawnEvent - 1.21.5+ added AbstractRespawnEvent as a base class, where prior to that, getRespawnReason was in PlayerRespawnEvent + if (Skript.classExists("org.bukkit.event.player.AbstractRespawnEvent")) { + EventValues.registerEventValue(PlayerRespawnEvent.class, RespawnReason.class, PlayerRespawnEvent::getRespawnReason); + } else { + try { + Method method = PlayerRespawnEvent.class.getMethod("getRespawnReason"); + EventValues.registerEventValue(PlayerRespawnEvent.class, RespawnReason.class, event -> { + try { + return (RespawnReason) method.invoke(event); + } catch (Exception e) { + return null; + } + }); + } catch (NoSuchMethodException ignored) {} + } //FireworkExplodeEvent EventValues.registerEventValue(FireworkExplodeEvent.class, Firework.class, FireworkExplodeEvent::getEntity); EventValues.registerEventValue(FireworkExplodeEvent.class, FireworkEffect.class, event -> { diff --git a/src/main/java/ch/njol/skript/events/SimpleEvents.java b/src/main/java/ch/njol/skript/events/SimpleEvents.java index 3dc2317ecff..ffae0c687f5 100644 --- a/src/main/java/ch/njol/skript/events/SimpleEvents.java +++ b/src/main/java/ch/njol/skript/events/SimpleEvents.java @@ -205,7 +205,7 @@ public class SimpleEvents { "on disconnect:") .since("1.0 (simple disconnection)"); Skript.registerEvent("Respawn", SimpleEvent.class, PlayerRespawnEvent.class, "[player] respawn[ing]") - .description("Called when a player respawns. You should prefer this event over the death event as the player is technically alive when this event is called.") + .description("Called when a player respawns via death or entering the end portal in the end. You should prefer this event over the death event as the player is technically alive when this event is called.") .examples("on respawn:") .since("1.0"); Skript.registerEvent("Sneak Toggle", SimpleEvent.class, PlayerToggleSneakEvent.class, "[player] toggl(e|ing) sneak", "[player] sneak toggl(e|ing)") diff --git a/src/main/java/ch/njol/skript/expressions/ExprRespawnReason.java b/src/main/java/ch/njol/skript/expressions/ExprRespawnReason.java new file mode 100644 index 00000000000..ab750a78a0a --- /dev/null +++ b/src/main/java/ch/njol/skript/expressions/ExprRespawnReason.java @@ -0,0 +1,29 @@ +package ch.njol.skript.expressions; + +import org.bukkit.event.player.PlayerRespawnEvent.RespawnReason; + +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.EventValueExpression; + +@Name("Respawn Reason") +@Description("The respawn reason in a respawn event.") +@Examples(""" + on respawn: + if respawn reason is end portal: + broadcast "%player% took the end portal to the overworld!" + """) +@Since("INSERT VERSION") +public class ExprRespawnReason extends EventValueExpression { + + static { + register(ExprRespawnReason.class, RespawnReason.class, "respawn[ing] reason"); + } + + public ExprRespawnReason() { + super(RespawnReason.class); + } + +} diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index e9853b2c01a..3b9606143fd 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -2535,6 +2535,12 @@ spawn reasons: rehydration: rehydration, rehydrated build_coppergolem: build copper golem, built copper golem +# -- Respawn Reasons -- +respawn reasons: + death: death + end_portal: end portal + plugin: plugin + # -- Difficulties -- difficulties: easy: easy @@ -3085,6 +3091,7 @@ types: inventorytype: inventory type¦s @an metadataholder: metadata holder¦s @a spawnreason: spawn reason¦s @a + respawnreason: respawn reason¦s @a cachedservericon: server icon¦s @a difficulty: difficult¦y¦ies @a fireworkeffect: firework effect¦s @a