Save players trapped in portals who log out.

If they log out while trapped but before the auto-rescue task runs, this
will save them when they log back in as long as the plugin hasn't
rebooted since they left.
This commit is contained in:
ryanhamshire 2016-05-05 10:02:48 -07:00
parent 305978810d
commit d46a2b1f6c
3 changed files with 27 additions and 5 deletions

View File

@ -43,12 +43,18 @@ class CheckForPortalTrapTask implements Runnable
public void run() public void run()
{ {
//if player has logged out, do nothing //if player has logged out, do nothing
if(!this.player.isOnline()) return; if(!player.isOnline()) return;
//otherwise if still standing in a portal frame, teleport him back through //if still standing in a portal frame, teleport him back through
if(this.player.getLocation().getBlock().getType() == Material.PORTAL) if(this.player.getLocation().getBlock().getType() == Material.PORTAL)
{ {
this.player.teleport(this.returnLocation); this.player.teleport(this.returnLocation);
} }
//otherwise, note that he 'escaped' the portal frame
else
{
PlayerEventHandler.portalReturnMap.remove(player.getUniqueId());
}
} }
} }

View File

@ -893,6 +893,17 @@ class PlayerEventHandler implements Listener
//create a thread to load ignore information //create a thread to load ignore information
new IgnoreLoaderThread(playerID, playerData.ignoredPlayers).start(); new IgnoreLoaderThread(playerID, playerData.ignoredPlayers).start();
//is he possibly stuck in a portal frame?
Location returnLocation = PlayerEventHandler.portalReturnMap.get(player.getUniqueId());
if(returnLocation != null)
{
PlayerEventHandler.portalReturnMap.remove(player.getUniqueId());
if(player.getLocation().getBlock().getType() == Material.PORTAL)
{
player.teleport(returnLocation);
}
}
} }
//when a player spawns, conditionally apply temporary pvp protection //when a player spawns, conditionally apply temporary pvp protection
@ -1075,6 +1086,9 @@ class PlayerEventHandler implements Listener
} }
} }
//remember where players teleport from (via portals) in case they're trapped at the destination
static ConcurrentHashMap<UUID, Location> portalReturnMap = new ConcurrentHashMap<UUID, Location>();
//when a player teleports via a portal //when a player teleports via a portal
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH)
void onPlayerPortal(PlayerPortalEvent event) void onPlayerPortal(PlayerPortalEvent event)
@ -1092,6 +1106,7 @@ class PlayerEventHandler implements Listener
//FEATURE: when players get trapped in a nether portal, send them back through to the other side //FEATURE: when players get trapped in a nether portal, send them back through to the other side
CheckForPortalTrapTask task = new CheckForPortalTrapTask(player, event.getFrom()); CheckForPortalTrapTask task = new CheckForPortalTrapTask(player, event.getFrom());
GriefPrevention.instance.getServer().getScheduler().scheduleSyncDelayedTask(GriefPrevention.instance, task, 200L); GriefPrevention.instance.getServer().getScheduler().scheduleSyncDelayedTask(GriefPrevention.instance, task, 200L);
portalReturnMap.put(player.getUniqueId(), event.getFrom());
//FEATURE: if the player teleporting doesn't have permission to build a nether portal and none already exists at the destination, cancel the teleportation //FEATURE: if the player teleporting doesn't have permission to build a nether portal and none already exists at the destination, cancel the teleportation
if(GriefPrevention.instance.config_claims_portalsRequirePermission) if(GriefPrevention.instance.config_claims_portalsRequirePermission)
@ -1102,6 +1117,7 @@ class PlayerEventHandler implements Listener
if(event.getPortalTravelAgent().getCanCreatePortal()) if(event.getPortalTravelAgent().getCanCreatePortal())
{ {
//hypothetically find where the portal would be created if it were //hypothetically find where the portal would be created if it were
//this is VERY expensive for the cpu, so this feature is off by default
TravelAgent agent = event.getPortalTravelAgent(); TravelAgent agent = event.getPortalTravelAgent();
agent.setCanCreatePortal(false); agent.setCanCreatePortal(false);
destination = agent.findOrCreate(destination); destination = agent.findOrCreate(destination);