From eceeea2b6638e3859ef6ba3aec26cc30502bda45 Mon Sep 17 00:00:00 2001 From: Patrick Miller Date: Mon, 3 Aug 2026 14:24:02 -0400 Subject: [PATCH] Handle missing world in ExprRespawnLocation --- .../expressions/ExprRespawnLocation.java | 87 ----------------- .../bukkit/entity/player/PlayerModule.java | 3 +- .../expressions/ExprRespawnLocation.java | 97 +++++++++++++++++++ 3 files changed, 99 insertions(+), 88 deletions(-) delete mode 100644 src/main/java/ch/njol/skript/expressions/ExprRespawnLocation.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/entity/player/elements/expressions/ExprRespawnLocation.java diff --git a/src/main/java/ch/njol/skript/expressions/ExprRespawnLocation.java b/src/main/java/ch/njol/skript/expressions/ExprRespawnLocation.java deleted file mode 100644 index 9aede4a2bcd..00000000000 --- a/src/main/java/ch/njol/skript/expressions/ExprRespawnLocation.java +++ /dev/null @@ -1,87 +0,0 @@ -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; -import org.jetbrains.annotations.Nullable; - -import ch.njol.skript.Skript; -import ch.njol.skript.classes.Changer; -import ch.njol.skript.classes.Changer.ChangeMode; -import ch.njol.skript.doc.Description; -import ch.njol.skript.doc.Example; -import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.Since; -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.skript.log.ErrorQuality; -import ch.njol.util.Kleenean; -import ch.njol.util.coll.CollectionUtils; - -@Name("Respawn location") -@Description("The location that a player should respawn at. This is used within the respawn event.") -@Example(""" - on respawn: - set respawn location to {example::spawn} - """) -@Since("2.2-dev35") -public class ExprRespawnLocation extends SimpleExpression implements EventRestrictedSyntax { - - static { - Skript.registerExpression(ExprRespawnLocation.class, Location.class, ExpressionType.SIMPLE, "[the] respawn location"); - } - - @Override - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - return true; - } - - @Override - public Class[] supportedEvents() { - return CollectionUtils.array(PlayerRespawnEvent.class); - } - - @Override - @Nullable - protected Location[] get(Event event) { - if (!(event instanceof PlayerRespawnEvent)) - return null; - - return CollectionUtils.array(((PlayerRespawnEvent)event).getRespawnLocation()); - } - - @Override - public boolean isSingle() { - return true; - } - - @Override - public Class getReturnType() { - return Location.class; - } - - @Override - public String toString(final @Nullable Event event, final boolean debug) { - return "the respawn location " + ((event != null) ? ": " + ((PlayerRespawnEvent)event).getRespawnLocation() : ""); - } - - @Nullable - @Override - public Class[] acceptChange(Changer.ChangeMode mode) { - if (mode == ChangeMode.SET) - return CollectionUtils.array(Location.class); - return null; - } - - @Override - public void change(Event event, @Nullable Object[] delta, Changer.ChangeMode mode) { - if (!(event instanceof PlayerRespawnEvent)) - return; - - if (delta != null) ((PlayerRespawnEvent)event).setRespawnLocation((Location)delta[0]); - } - -} diff --git a/src/main/java/org/skriptlang/skript/bukkit/entity/player/PlayerModule.java b/src/main/java/org/skriptlang/skript/bukkit/entity/player/PlayerModule.java index 10704eda253..f6f405af567 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/entity/player/PlayerModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/entity/player/PlayerModule.java @@ -37,7 +37,8 @@ protected void loadSelf(SkriptAddon addon) { ExprPlayerListHeaderFooter::register, ExprPlayerListName::register, ExprPlayerListPriority::register, - ExprQuitMessage::register + ExprQuitMessage::register, + ExprRespawnLocation::register ); if (Skript.classExists("io.papermc.paper.event.player.PlayerPickBlockEvent")) { register(addon, diff --git a/src/main/java/org/skriptlang/skript/bukkit/entity/player/elements/expressions/ExprRespawnLocation.java b/src/main/java/org/skriptlang/skript/bukkit/entity/player/elements/expressions/ExprRespawnLocation.java new file mode 100644 index 00000000000..62eebdec185 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/entity/player/elements/expressions/ExprRespawnLocation.java @@ -0,0 +1,97 @@ +package org.skriptlang.skript.bukkit.entity.player.elements.expressions; + +import ch.njol.skript.doc.Events; +import ch.njol.skript.lang.EventRestrictedSyntax; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.event.Event; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.jetbrains.annotations.Nullable; + +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Example; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.Expression; +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.skriptlang.skript.registration.SyntaxInfo; +import org.skriptlang.skript.registration.SyntaxRegistry; + +@Name("Respawn Location") +@Description(""" + The location that a player should respawn at. \ + This is used within the respawn event. + """) +@Example(""" + on respawn: + set respawn location to {example::spawn} + """) +@Since("2.2-dev35") +@Events("respawn") +public class ExprRespawnLocation extends SimpleExpression implements EventRestrictedSyntax { + + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register(SyntaxRegistry.EXPRESSION, + SyntaxInfo.Expression.simple(ExprRespawnLocation.class, ExprRespawnLocation::new, Location.class, + "[the] respawn location")); + } + + @Override + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + return true; + } + + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(PlayerRespawnEvent.class); + } + + @Override + protected Location[] get(Event event) { + if (event instanceof PlayerRespawnEvent respawnEvent) { + return new Location[]{respawnEvent.getRespawnLocation()}; + } + return new Location[0]; + } + + @Override + public Class @Nullable [] acceptChange(ChangeMode mode) { + if (mode == ChangeMode.SET) { + return CollectionUtils.array(Location.class); + } + return null; + } + + @Override + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { + if (event instanceof PlayerRespawnEvent respawnEvent) { + assert delta != null; + Location location = (Location) delta[0]; + if (location.getWorld() == null) { // if no world was provided, use the default world + location = location.clone(); + location.setWorld(Bukkit.getWorlds().getFirst()); + } + respawnEvent.setRespawnLocation(location); + } + } + + @Override + public boolean isSingle() { + return true; + } + + @Override + public Class getReturnType() { + return Location.class; + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return "the respawn location"; + } + +}