Add work-around for nonsensical teleport events from Spigot.

References:

 * https://hub.spigotmc.org/jira/browse/SPIGOT-5252
 * https://github.com/Brettflan/WorldBorder/issues/131#issuecomment-519059869
This commit is contained in:
totemo 2019-08-09 16:00:20 +09:30
parent f88ede397c
commit 3f8923f9d0
1 changed files with 32 additions and 1 deletions

View File

@ -1,18 +1,27 @@
package com.wimbli.WorldBorder;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.event.player.PlayerPortalEvent;
import org.bukkit.event.world.ChunkLoadEvent;
import org.bukkit.event.world.ChunkUnloadEvent;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.Location;
import org.bukkit.entity.Player;
public class WBListener implements Listener
{
final static String PORTAL_EVENT_META = "WorldBorder-portal";
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onPlayerTeleport(PlayerTeleportEvent event)
{
@ -23,7 +32,29 @@ public class WBListener implements Listener
if (Config.Debug())
Config.log("Teleport cause: " + event.getCause().toString());
Location newLoc = BorderCheckTask.checkPlayer(event.getPlayer(), event.getTo(), true, true);
// Ignore nonsensical teleport events.
// https://hub.spigotmc.org/jira/browse/SPIGOT-5252
Player player = event.getPlayer();
if (event.getCause() == TeleportCause.NETHER_PORTAL || event.getCause() == TeleportCause.END_PORTAL) {
// Store event details of the original correct event. TeleportCause.UNKNOWN comes after.
player.setMetadata(PORTAL_EVENT_META, new FixedMetadataValue(WorldBorder.plugin, event));
Bukkit.getScheduler().runTaskLater(WorldBorder.plugin, () -> {
event.getPlayer().removeMetadata(PORTAL_EVENT_META, WorldBorder.plugin);
//WorldBorder.plugin.getLogger().info("Removed " + player.getName() + " portal meta.");
}, 0);
} else if (event.getCause() == TeleportCause.UNKNOWN) {
List<MetadataValue> metas = player.getMetadata(PORTAL_EVENT_META);
if (metas != null && !metas.isEmpty()) {
PlayerTeleportEvent savedEvent = (PlayerTeleportEvent) metas.get(0).value();
if (savedEvent.getFrom().getWorld().equals(event.getFrom().getWorld())) {
//WorldBorder.plugin.getLogger().info("Ignoring nonsensical teleport by " + player.getName() +
// " in " + savedEvent.getFrom().getWorld().getName() + ".");
return;
}
}
}
Location newLoc = BorderCheckTask.checkPlayer(player, event.getTo(), true, true);
if (newLoc != null)
{
if(event.getCause() == PlayerTeleportEvent.TeleportCause.ENDER_PEARL && Config.getDenyEnderpearl())