Skip to content

Commit e226197

Browse files
committed
Fix setting bed spawn with null world
1 parent 43a9195 commit e226197

File tree

1 file changed

+20
-10
lines changed
  • src/main/java/org/mvplugins/multiverse/inventories/share

1 file changed

+20
-10
lines changed

src/main/java/org/mvplugins/multiverse/inventories/share/Sharables.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
import com.google.common.collect.Sets;
55
import org.bukkit.GameRule;
66
import org.bukkit.Material;
7+
import org.bukkit.World;
78
import org.bukkit.advancement.AdvancementProgress;
89
import org.jetbrains.annotations.ApiStatus;
910
import org.mvplugins.multiverse.core.economy.MVEconomist;
1011
import org.mvplugins.multiverse.core.teleportation.AsyncSafetyTeleporter;
1112
import org.mvplugins.multiverse.core.utils.ReflectHelper;
1213
import org.mvplugins.multiverse.external.vavr.control.Option;
14+
import org.mvplugins.multiverse.external.vavr.control.Try;
1315
import org.mvplugins.multiverse.inventories.MultiverseInventories;
1416
import org.mvplugins.multiverse.inventories.config.InventoriesConfig;
1517
import org.mvplugins.multiverse.inventories.profile.data.ProfileData;
@@ -600,26 +602,34 @@ public void updateProfile(ProfileData profile, Player player) {
600602
public boolean updatePlayer(Player player, ProfileData profile) {
601603
Location loc = profile.get(BED_SPAWN);
602604
if (loc == null) {
603-
Logging.finer("No bed location saved");
604-
ignoreSpawnListener.add(player.getUniqueId());
605-
player.setBedSpawnLocation(player.getWorld().getSpawnLocation(), true);
606-
ignoreSpawnListener.remove(player.getUniqueId());
605+
Logging.finer("No respawn location saved");
606+
setSpawnLocation(player, player.getWorld().getSpawnLocation());
607607
return false;
608608
}
609-
ignoreSpawnListener.add(player.getUniqueId());
610-
player.setBedSpawnLocation(loc, true);
611-
ignoreSpawnListener.remove(player.getUniqueId());
612-
Logging.finer("updating bed: " + player.getBedSpawnLocation());
609+
World loclWorld = Try.of(loc::getWorld).getOrNull();
610+
if (loclWorld == null) {
611+
Logging.warning("Respawn location has invalid world!");
612+
setSpawnLocation(player, player.getWorld().getSpawnLocation());
613+
return false;
614+
}
615+
setSpawnLocation(player, loc);
616+
Logging.finer("updated respawn location: " + player.getBedSpawnLocation());
613617
return true;
614618
}
615619
}).serializer(new ProfileEntry(false, DataStrings.PLAYER_BED_SPAWN_LOCATION), new LocationSerializer())
616620
.altName("bedspawn").altName("bed").altName("beds").altName("bedspawns").build();
617621

618622
// todo: handle this somewhere better
619-
private static List<UUID> ignoreSpawnListener = new ArrayList<>();
620-
private static boolean hasSetSpawnEvent = ReflectHelper.hasClass("org.bukkit.event.player.PlayerSpawnChangeEvent")
623+
private static final List<UUID> ignoreSpawnListener = new ArrayList<>();
624+
private static final boolean hasSetSpawnEvent = ReflectHelper.hasClass("org.bukkit.event.player.PlayerSpawnChangeEvent")
621625
|| ReflectHelper.hasClass("com.destroystokyo.paper.event.player.PlayerSetSpawnEvent");
622626

627+
private static void setSpawnLocation(Player player, Location loc) {
628+
ignoreSpawnListener.add(player.getUniqueId());
629+
player.setBedSpawnLocation(loc, true);
630+
ignoreSpawnListener.remove(player.getUniqueId());
631+
}
632+
623633
@ApiStatus.Internal
624634
public static boolean isIgnoringSpawnListener(Player player) {
625635
return ignoreSpawnListener.contains(player.getUniqueId());

0 commit comments

Comments
 (0)