From 21eed8b1e15d1200ce4a43b7fcc5ccca6d9a2aab Mon Sep 17 00:00:00 2001 From: MrScopes Date: Wed, 17 Dec 2025 20:58:12 -0500 Subject: [PATCH 1/7] respawn reason --- .../skript/classes/data/BukkitClasses.java | 7 +++++ .../classes/data/BukkitEventValues.java | 3 ++ .../ch/njol/skript/events/SimpleEvents.java | 4 +-- .../skript/expressions/ExprRespawnReason.java | 29 +++++++++++++++++++ src/main/resources/lang/default.lang | 7 +++++ 5 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ch/njol/skript/expressions/ExprRespawnReason.java 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..46299c0832c 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.*; @@ -547,6 +548,8 @@ else if (hand == EquipmentSlot.OFF_HAND) } //CreatureSpawnEvent EventValues.registerEventValue(CreatureSpawnEvent.class, SpawnReason.class, CreatureSpawnEvent::getSpawnReason); + //PlayerRespawnEvent + EventValues.registerEventValue(PlayerRespawnEvent.class, RespawnReason.class, PlayerRespawnEvent::getRespawnReason); //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..af3766de6cc 100644 --- a/src/main/java/ch/njol/skript/events/SimpleEvents.java +++ b/src/main/java/ch/njol/skript/events/SimpleEvents.java @@ -205,9 +205,9 @@ 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. 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"); + .since("1.0, INSERT VERSION (respawn reason and flag)"); Skript.registerEvent("Sneak Toggle", SimpleEvent.class, PlayerToggleSneakEvent.class, "[player] toggl(e|ing) sneak", "[player] sneak toggl(e|ing)") .description("Called when a player starts or stops sneaking. Use is sneaking to get whether the player was sneaking before the event was called.") .examples("# make players that stop sneaking jump", 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..9d791a68cda --- /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:", + "\tif respawn reason is end portal:", + "\t\tbroadcast \"%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 From 3f851af17c4e3df582ee57367d5a2f203d19b34c Mon Sep 17 00:00:00 2001 From: MrScopes Date: Wed, 17 Dec 2025 21:02:49 -0500 Subject: [PATCH 2/7] fix typo --- src/main/java/ch/njol/skript/events/SimpleEvents.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/njol/skript/events/SimpleEvents.java b/src/main/java/ch/njol/skript/events/SimpleEvents.java index af3766de6cc..f50cef32a2b 100644 --- a/src/main/java/ch/njol/skript/events/SimpleEvents.java +++ b/src/main/java/ch/njol/skript/events/SimpleEvents.java @@ -205,9 +205,9 @@ 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 via death or entering the end portal. 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, INSERT VERSION (respawn reason and flag)"); + .since("1.0, INSERT VERSION (respawn reason)"); Skript.registerEvent("Sneak Toggle", SimpleEvent.class, PlayerToggleSneakEvent.class, "[player] toggl(e|ing) sneak", "[player] sneak toggl(e|ing)") .description("Called when a player starts or stops sneaking. Use is sneaking to get whether the player was sneaking before the event was called.") .examples("# make players that stop sneaking jump", From 1fa75994737ab801f1faeec806506783bcf0fa64 Mon Sep 17 00:00:00 2001 From: MrScopes Date: Wed, 17 Dec 2025 21:16:43 -0500 Subject: [PATCH 3/7] update example to proper multiline Co-authored-by: sovdee <10354869+sovdeeth@users.noreply.github.com> --- .../ch/njol/skript/expressions/ExprRespawnReason.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprRespawnReason.java b/src/main/java/ch/njol/skript/expressions/ExprRespawnReason.java index 9d791a68cda..fa69c36d5bb 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprRespawnReason.java +++ b/src/main/java/ch/njol/skript/expressions/ExprRespawnReason.java @@ -10,11 +10,11 @@ @Name("Respawn Reason") @Description("The respawn reason in a respawn event.") -@Examples({ - "on respawn:", - "\tif respawn reason is end portal:", - "\t\tbroadcast \"%player% took the end portal to the overworld!\"" -}) +@Example(""" + 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 { From 4344bd789c37350302d892085cf8f49a7d9c3cf6 Mon Sep 17 00:00:00 2001 From: MrScopes Date: Wed, 17 Dec 2025 21:19:31 -0500 Subject: [PATCH 4/7] no change necessary since the event wasn't changed. --- src/main/java/ch/njol/skript/events/SimpleEvents.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/events/SimpleEvents.java b/src/main/java/ch/njol/skript/events/SimpleEvents.java index f50cef32a2b..ffae0c687f5 100644 --- a/src/main/java/ch/njol/skript/events/SimpleEvents.java +++ b/src/main/java/ch/njol/skript/events/SimpleEvents.java @@ -207,7 +207,7 @@ public class SimpleEvents { Skript.registerEvent("Respawn", SimpleEvent.class, PlayerRespawnEvent.class, "[player] respawn[ing]") .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, INSERT VERSION (respawn reason)"); + .since("1.0"); Skript.registerEvent("Sneak Toggle", SimpleEvent.class, PlayerToggleSneakEvent.class, "[player] toggl(e|ing) sneak", "[player] sneak toggl(e|ing)") .description("Called when a player starts or stops sneaking. Use is sneaking to get whether the player was sneaking before the event was called.") .examples("# make players that stop sneaking jump", From fe6431f09f3766437625145348c7d683e447e42a Mon Sep 17 00:00:00 2001 From: MrScopes Date: Wed, 17 Dec 2025 21:22:12 -0500 Subject: [PATCH 5/7] example -> examples to fix build failure --- src/main/java/ch/njol/skript/expressions/ExprRespawnReason.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprRespawnReason.java b/src/main/java/ch/njol/skript/expressions/ExprRespawnReason.java index fa69c36d5bb..ab750a78a0a 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprRespawnReason.java +++ b/src/main/java/ch/njol/skript/expressions/ExprRespawnReason.java @@ -10,7 +10,7 @@ @Name("Respawn Reason") @Description("The respawn reason in a respawn event.") -@Example(""" +@Examples(""" on respawn: if respawn reason is end portal: broadcast "%player% took the end portal to the overworld!" From c818e7b92ba0f6df1f002f67e2f6c6ee2fb49b31 Mon Sep 17 00:00:00 2001 From: MrScopes Date: Wed, 17 Dec 2025 23:35:24 -0500 Subject: [PATCH 6/7] reflection for <1.21.5 support --- .../skript/classes/data/BukkitEventValues.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) 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 46299c0832c..329663462fe 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java @@ -548,8 +548,21 @@ else if (hand == EquipmentSlot.OFF_HAND) } //CreatureSpawnEvent EventValues.registerEventValue(CreatureSpawnEvent.class, SpawnReason.class, CreatureSpawnEvent::getSpawnReason); - //PlayerRespawnEvent - EventValues.registerEventValue(PlayerRespawnEvent.class, RespawnReason.class, PlayerRespawnEvent::getRespawnReason); + //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 { + var 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 -> { From 07b8b2b68a54f92efff865de246d2df8c236eb28 Mon Sep 17 00:00:00 2001 From: MrScopes Date: Wed, 17 Dec 2025 23:38:50 -0500 Subject: [PATCH 7/7] 'Method' instead of just var --- .../java/ch/njol/skript/classes/data/BukkitEventValues.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 329663462fe..4520a44acc5 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java @@ -64,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; @@ -553,7 +554,7 @@ else if (hand == EquipmentSlot.OFF_HAND) EventValues.registerEventValue(PlayerRespawnEvent.class, RespawnReason.class, PlayerRespawnEvent::getRespawnReason); } else { try { - var method = PlayerRespawnEvent.class.getMethod("getRespawnReason"); + Method method = PlayerRespawnEvent.class.getMethod("getRespawnReason"); EventValues.registerEventValue(PlayerRespawnEvent.class, RespawnReason.class, event -> { try { return (RespawnReason) method.invoke(event);