Skip to content

Commit a6cc8bd

Browse files
committed
Better null checking for to and from event locations
1 parent ee4cd18 commit a6cc8bd

File tree

1 file changed

+41
-20
lines changed

1 file changed

+41
-20
lines changed

src/main/java/org/mvplugins/multiverse/core/listeners/MVPlayerListener.java

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.mvplugins.multiverse.core.dynamiclistener.annotations.DefaultEventPriority;
3737
import org.mvplugins.multiverse.core.dynamiclistener.annotations.EventMethod;
3838
import org.mvplugins.multiverse.core.dynamiclistener.annotations.EventPriorityKey;
39+
import org.mvplugins.multiverse.core.dynamiclistener.annotations.IgnoreIfCancelled;
3940
import org.mvplugins.multiverse.core.economy.MVEconomist;
4041
import org.mvplugins.multiverse.core.event.MVRespawnEvent;
4142
import org.mvplugins.multiverse.core.locale.PluginLocales;
@@ -269,12 +270,28 @@ void playerChangedWorld(PlayerChangedWorldEvent event) {
269270
@EventPriorityKey("mvcore-player-teleport")
270271
@DefaultEventPriority(EventPriority.HIGHEST)
271272
void playerTeleport(PlayerTeleportEvent event) {
272-
Logging.finer("Got teleport event for player '"
273-
+ event.getPlayer().getName() + "' with cause '" + event.getCause() + "'");
273+
Player teleportee = event.getPlayer();
274+
274275
if (event.isCancelled()) {
276+
Logging.finer("Teleport event for player '" + teleportee.getName() + "' was already cancelled.");
275277
return;
276278
}
277-
Player teleportee = event.getPlayer();
279+
280+
Logging.finer("Got teleport event for player '"
281+
+ teleportee.getName() + "' with cause '" + event.getCause() + "'");
282+
283+
Location fromLocation = event.getFrom();
284+
if (fromLocation == null || fromLocation.getWorld() == null) { // should never be null, but just in case
285+
Logging.finer("Teleport event for player '" + teleportee.getName() + "' has null from-location or world.");
286+
return;
287+
}
288+
289+
Location toLocation = event.getTo();
290+
if (toLocation == null || toLocation.getWorld() == null) { // may be null on spigot
291+
Logging.finer("Teleport event for player '" + teleportee.getName() + "' has null to-location or world.");
292+
return;
293+
}
294+
278295
Option<String> teleporterName = teleportQueue.popFromQueue(teleportee.getName());
279296
CommandSender teleporter = teleporterName.map(name -> {
280297
if (name.equalsIgnoreCase("CONSOLE")) {
@@ -295,17 +312,17 @@ void playerTeleport(PlayerTeleportEvent event) {
295312
}
296313

297314
Logging.finer("Teleporter %s is teleporting %s from %s to %s", teleporter.getName(), teleportee.getName(),
298-
event.getFrom(), event.getTo());
315+
fromLocation, toLocation);
299316

300-
MultiverseWorld fromWorld = getWorldManager().getLoadedWorld(event.getFrom().getWorld()).getOrNull();
301-
LoadedMultiverseWorld toWorld = getWorldManager().getLoadedWorld(event.getTo().getWorld()).getOrNull();
317+
MultiverseWorld fromWorld = getWorldManager().getLoadedWorld(fromLocation.getWorld()).getOrNull();
318+
LoadedMultiverseWorld toWorld = getWorldManager().getLoadedWorld(toLocation.getWorld()).getOrNull();
302319
if (toWorld == null) {
303320
Logging.fine("Player '" + teleportee.getName() + "' is teleporting to world '"
304-
+ event.getTo().getWorld().getName() + "' which is not managed by Multiverse-Core. No further "
321+
+ toLocation.getWorld().getName() + "' which is not managed by Multiverse-Core. No further "
305322
+ "actions will be taken by Multiverse-Core.");
306323
return;
307324
}
308-
if (event.getFrom().getWorld().equals(event.getTo().getWorld())) {
325+
if (fromLocation.getWorld().equals(toLocation.getWorld())) {
309326
// The player is Teleporting to the same world.
310327
Logging.finer("Player '" + teleportee.getName() + "' is teleporting to the same world.");
311328
this.stateSuccess(teleportee.getName(), toWorld.getName());
@@ -339,20 +356,19 @@ private void stateSuccess(String playerName, String worldName) {
339356
*/
340357
@EventMethod
341358
@DefaultEventPriority(EventPriority.LOWEST)
359+
@IgnoreIfCancelled
342360
void playerPortalCheck(PlayerPortalEvent event) {
343-
if (event.isCancelled()) {
344-
return;
345-
}
346-
if (event.getFrom().getWorld() == null) {
361+
Location fromLocation = event.getFrom();
362+
if (fromLocation == null || fromLocation.getWorld() == null) {
347363
Logging.warning("PlayerPortalEvent's from world is null!");
348364
return;
349365
}
350-
if (event.getFrom().getWorld().getBlockAt(event.getFrom()).getType() == Material.NETHER_PORTAL) {
366+
if (fromLocation.getWorld().getBlockAt(fromLocation).getType() == Material.NETHER_PORTAL) {
351367
return;
352368
}
353369

354370
// Player was actually outside of the portal, adjust the from location
355-
Location newLocation = blockSafety.findPortalBlockNextTo(event.getFrom());
371+
Location newLocation = blockSafety.findPortalBlockNextTo(fromLocation);
356372
if (newLocation != null) {
357373
event.setFrom(newLocation);
358374
}
@@ -365,28 +381,33 @@ void playerPortalCheck(PlayerPortalEvent event) {
365381
@EventMethod
366382
@EventPriorityKey("mvcore-player-portal")
367383
@DefaultEventPriority(EventPriority.HIGH)
384+
@IgnoreIfCancelled
368385
void playerPortal(PlayerPortalEvent event) {
369-
if (event.isCancelled()) {
386+
Location fromLocation = event.getFrom();
387+
if (fromLocation == null || fromLocation.getWorld() == null) { // should never be null, but just in case
388+
Logging.finer("PlayerPortalEvent's from world is null!");
370389
return;
371390
}
372-
if (event.getTo() == null || event.getTo().getWorld() == null) {
391+
392+
Location toLocation = event.getTo();
393+
if (toLocation == null || toLocation.getWorld() == null) { // may be null on spigot
373394
Logging.finer("PlayerPortalEvent's to world is null!");
374395
return;
375396
}
376397
if (config.isUsingCustomPortalSearch()) {
377398
event.setSearchRadius(config.getCustomPortalSearchRadius());
378399
}
379-
if (Objects.equals(event.getFrom().getWorld(), event.getTo().getWorld())) {
400+
if (Objects.equals(fromLocation.getWorld(), toLocation.getWorld())) {
380401
// The player is Portaling to the same world.
381402
Logging.finer("Player '" + event.getPlayer().getName() + "' is portaling to the same world.");
382403
return;
383404
}
384405

385-
MultiverseWorld fromWorld = getWorldManager().getLoadedWorld(event.getFrom().getWorld()).getOrNull();
386-
LoadedMultiverseWorld toWorld = getWorldManager().getLoadedWorld(event.getTo().getWorld()).getOrNull();
406+
MultiverseWorld fromWorld = getWorldManager().getLoadedWorld(fromLocation.getWorld()).getOrNull();
407+
LoadedMultiverseWorld toWorld = getWorldManager().getLoadedWorld(toLocation.getWorld()).getOrNull();
387408
if (toWorld == null) {
388409
Logging.fine("Player '" + event.getPlayer().getName() + "' is portaling to world '"
389-
+ event.getTo().getWorld().getName() + "' which is not managed by Multiverse-Core. No further "
410+
+ toLocation.getWorld().getName() + "' which is not managed by Multiverse-Core. No further "
390411
+ "actions will be taken by Multiverse-Core.");
391412
return;
392413
}

0 commit comments

Comments
 (0)