|
14 | 14 | import io.vavr.control.Option; |
15 | 15 | import jakarta.inject.Inject; |
16 | 16 | import jakarta.inject.Provider; |
| 17 | +import org.bukkit.Bukkit; |
17 | 18 | import org.bukkit.Location; |
18 | 19 | import org.bukkit.Material; |
19 | 20 | import org.bukkit.Server; |
@@ -119,48 +120,43 @@ public Map<String, String> getPlayerWorld() { |
119 | 120 | */ |
120 | 121 | @EventHandler(priority = EventPriority.LOW) |
121 | 122 | public void playerRespawn(PlayerRespawnEvent event) { |
122 | | - World world = event.getPlayer().getWorld(); |
123 | | - LoadedMultiverseWorld mvWorld = getWorldManager().getLoadedWorld(world.getName()).getOrNull(); |
124 | | - // If it's not a World MV manages we stop. |
125 | | - if (mvWorld == null) { |
126 | | - return; |
127 | | - } |
128 | | - |
129 | | - if (mvWorld.getBedRespawn() && event.isBedSpawn()) { |
130 | | - Logging.fine("Spawning %s at their bed.", event.getPlayer().getName()); |
131 | | - return; |
132 | | - } |
133 | | - |
134 | | - if (mvWorld.getAnchorRespawn() && event.isAnchorSpawn()) { |
135 | | - Logging.fine("Spawning %s at their anchor.", event.getPlayer().getName()); |
136 | | - return; |
137 | | - } |
138 | | - |
139 | | - // Get the instance of the World the player should respawn at. |
140 | | - LoadedMultiverseWorld respawnWorld = null; |
141 | | - if (getWorldManager().isLoadedWorld(mvWorld.getRespawnWorld())) { |
142 | | - respawnWorld = getWorldManager().getLoadedWorld(mvWorld.getRespawnWorld()).getOrNull(); |
143 | | - } |
144 | | - |
145 | | - // If it's null then it either means the World doesn't exist or the value is blank, so we don't handle it. |
146 | | - // NOW: We'll always handle it to get more accurate spawns |
147 | | - if (respawnWorld != null) { |
148 | | - world = respawnWorld.getBukkitWorld().getOrNull(); |
149 | | - } |
150 | | - // World has been set to the appropriate world |
151 | | - Location respawnLocation = getMostAccurateRespawnLocation(world); |
152 | | - |
153 | | - MVRespawnEvent respawnEvent = new MVRespawnEvent(respawnLocation, event.getPlayer(), "compatability"); |
154 | | - this.server.getPluginManager().callEvent(respawnEvent); |
155 | | - event.setRespawnLocation(respawnEvent.getPlayersRespawnLocation()); |
| 123 | + Player player = event.getPlayer(); |
| 124 | + getWorldManager().getLoadedWorld(player.getWorld()) |
| 125 | + .onEmpty(() -> Logging.fine("Player '%s' is in a world that is not managed by Multiverse.", player.getName())) |
| 126 | + .filter(mvWorld -> { |
| 127 | + if (mvWorld.getBedRespawn() && event.isBedSpawn()) { |
| 128 | + Logging.fine("Spawning %s at their bed.", player.getName()); |
| 129 | + return false; |
| 130 | + } |
| 131 | + if (mvWorld.getAnchorRespawn() && event.isAnchorSpawn()) { |
| 132 | + Logging.fine("Spawning %s at their anchor.", player.getName()); |
| 133 | + return false; |
| 134 | + } |
| 135 | + if (!config.getDefaultRespawnToWorldSpawn() && mvWorld.getRespawnWorldName().isBlank()) { |
| 136 | + Logging.fine("Not overriding respawn location for player '%s' as " + |
| 137 | + "default-respawn-to-world-spawn is disabled and no respawn-world is set.", player.getName()); |
| 138 | + return false; |
| 139 | + } |
| 140 | + return true; |
| 141 | + }) |
| 142 | + .flatMap(mvWorld -> getMostAccurateRespawnLocation (player, mvWorld)) |
| 143 | + .peek(newRespawnLocation -> { |
| 144 | + MVRespawnEvent respawnEvent = new MVRespawnEvent(newRespawnLocation, event.getPlayer(), "compatability"); |
| 145 | + this.server.getPluginManager().callEvent(respawnEvent); |
| 146 | + event.setRespawnLocation(respawnEvent.getPlayersRespawnLocation()); |
| 147 | + }); |
156 | 148 | } |
157 | 149 |
|
158 | | - private Location getMostAccurateRespawnLocation(World w) { |
159 | | - LoadedMultiverseWorld mvw = getWorldManager().getLoadedWorld(w.getName()).getOrNull(); |
160 | | - if (mvw != null) { |
161 | | - return mvw.getSpawnLocation(); |
162 | | - } |
163 | | - return w.getSpawnLocation(); |
| 150 | + private Option<Location> getMostAccurateRespawnLocation(Player player, LoadedMultiverseWorld mvWorld) { |
| 151 | + return Option.of(mvWorld.getRespawnWorldName().isBlank() |
| 152 | + ? player.getWorld() |
| 153 | + : server.getWorld(mvWorld.getRespawnWorldName())) |
| 154 | + .onEmpty(() -> Logging.warning("World '%s' has respawn-world property of '%s' that does not exist!", |
| 155 | + player.getWorld().getName(), mvWorld.getRespawnWorldName())) |
| 156 | + .map(newRespawnWorld -> getWorldManager() |
| 157 | + .getLoadedWorld(newRespawnWorld) |
| 158 | + .map(newMVRespawnWorld -> (Location) newMVRespawnWorld.getSpawnLocation()) |
| 159 | + .getOrElse(newRespawnWorld::getSpawnLocation)); |
164 | 160 | } |
165 | 161 |
|
166 | 162 | @EventHandler |
|
0 commit comments