Use a Pair<Vector,String> to allow worlds to unload while they are stored in TP history
This commit is contained in:
parent
f54b6606ab
commit
76eb530b5f
@ -3,8 +3,13 @@ package mineplex.mapparser.command.teleport;
|
|||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.World;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import mineplex.core.common.Pair;
|
||||||
|
import mineplex.core.common.util.C;
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
import mineplex.mapparser.command.BaseCommand;
|
import mineplex.mapparser.command.BaseCommand;
|
||||||
|
|
||||||
public class BackCommand extends BaseCommand
|
public class BackCommand extends BaseCommand
|
||||||
@ -21,7 +26,7 @@ public class BackCommand extends BaseCommand
|
|||||||
@Override
|
@Override
|
||||||
public boolean execute(Player player, String alias, String[] args)
|
public boolean execute(Player player, String alias, String[] args)
|
||||||
{
|
{
|
||||||
LinkedList<Location> teleportHistory = _teleportManager.getTeleportHistory(player);
|
LinkedList<Pair<Vector, String>> teleportHistory = _teleportManager.getTeleportHistory(player);
|
||||||
|
|
||||||
if (teleportHistory == null || teleportHistory.isEmpty())
|
if (teleportHistory == null || teleportHistory.isEmpty())
|
||||||
{
|
{
|
||||||
@ -49,39 +54,38 @@ public class BackCommand extends BaseCommand
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Location location = null;
|
Pair<Vector, String> locationPair = null;
|
||||||
|
|
||||||
if (steps == 1)
|
if (steps == 1)
|
||||||
{
|
{
|
||||||
location = teleportHistory.removeFirst();
|
locationPair = teleportHistory.removeFirst();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (int i = 0; i < steps; i++)
|
for (int i = 0; i < steps; i++)
|
||||||
{
|
{
|
||||||
location = teleportHistory.remove(i);
|
locationPair = teleportHistory.remove(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (location == null)
|
if (locationPair == null)
|
||||||
{
|
{
|
||||||
message(player, "Something went wrong. Couldn't teleport you back.");
|
message(player, "Something went wrong. Couldn't teleport you back.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
World locationWorld =_teleportManager.getPlugin().getWorldFromName(locationPair.getRight());
|
||||||
|
Vector locationVec = locationPair.getLeft();
|
||||||
|
Location location = new Location(locationWorld, locationVec.getX(), locationVec.getY(), locationVec.getZ());
|
||||||
|
|
||||||
if (!_teleportManager.canTeleportTo(player, location))
|
if (!_teleportManager.canTeleportTo(player, location))
|
||||||
{
|
{
|
||||||
message(player, "You don't have access to teleport back to that location.");
|
message(player, "You don't have access to teleport back to that location.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the world doesn't already exist, load it
|
|
||||||
if (location.getWorld() == null || (!location.getWorld().equals(player.getWorld()) && location.getWorld().getPlayers().size() == 0))
|
|
||||||
{
|
|
||||||
_teleportManager.getPlugin().getWorldFromName(location.getWorld().getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
player.teleport(location);
|
player.teleport(location);
|
||||||
|
message(player, "You undid your last " + ((steps == 1) ? "teleport." : F.count(steps) + C.mBody + " teleports."));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,14 +6,16 @@ import java.util.Map;
|
|||||||
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import mineplex.core.common.Pair;
|
||||||
import mineplex.mapparser.MapData;
|
import mineplex.mapparser.MapData;
|
||||||
import mineplex.mapparser.MapParser;
|
import mineplex.mapparser.MapParser;
|
||||||
|
|
||||||
public class TeleportManager
|
public class TeleportManager
|
||||||
{
|
{
|
||||||
private MapParser _plugin;
|
private MapParser _plugin;
|
||||||
private Map<Player, LinkedList<Location>> _teleportHistory;
|
private Map<Player, LinkedList<Pair<Vector, String>>> _teleportHistory;
|
||||||
|
|
||||||
public TeleportManager(MapParser plugin)
|
public TeleportManager(MapParser plugin)
|
||||||
{
|
{
|
||||||
@ -23,10 +25,10 @@ public class TeleportManager
|
|||||||
|
|
||||||
private void addToHistory(Player player, Location location)
|
private void addToHistory(Player player, Location location)
|
||||||
{
|
{
|
||||||
_teleportHistory.computeIfAbsent(player, key -> new LinkedList<>()).addFirst(location);
|
_teleportHistory.computeIfAbsent(player, key -> new LinkedList<>()).addFirst(Pair.create(new Vector(location.getX(), location.getY(), location.getZ()), location.getWorld().getName()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public LinkedList<Location> getTeleportHistory(Player player)
|
public LinkedList<Pair<Vector, String>> getTeleportHistory(Player player)
|
||||||
{
|
{
|
||||||
return _teleportHistory.get(player);
|
return _teleportHistory.get(player);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user