package io.github.lucaseasedup.logit.persistence; import io.github.lucaseasedup.logit.LogItCoreObject; import io.github.lucaseasedup.logit.util.PlayerUtils; import java.util.Map; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; @Keys({ @Key(name = "world", constraint = KeyConstraint.NOT_EMPTY), @Key(name = "x", constraint = KeyConstraint.NOT_EMPTY), @Key(name = "y", constraint = KeyConstraint.NOT_EMPTY), @Key(name = "z", constraint = KeyConstraint.NOT_EMPTY), @Key(name = "yaw", constraint = KeyConstraint.NOT_EMPTY), @Key(name = "pitch", constraint = KeyConstraint.NOT_EMPTY), }) public final class LocationSerializer extends LogItCoreObject implements PersistenceSerializer { @Override public void serialize(Map<String, String> data, final Player player) { serialize(data, player.getLocation()); if (player.isOnline()) { final Location waitingRoomLocation = getCore().getWaitingRoomLocation(); player.teleport(waitingRoomLocation); final int teleportPasses = getConfig("secret.yml") .getInt("locationSerializer.teleportCheck.passes"); final double dislocationRadius = getConfig("secret.yml") .getDouble("locationSerializer.teleportCheck.dislocationRadius"); // Make sure that no other plugin teleported the player away. new BukkitRunnable() { @Override public void run() { if (++passes > teleportPasses) { cancel(); } else if (!PlayerUtils.isPlayerAt(player, waitingRoomLocation, dislocationRadius, dislocationRadius, dislocationRadius)) { player.teleport(waitingRoomLocation); } } /** * Tells how many checks has been done so far. */ private int passes = 0; }.runTaskTimer(getPlugin(), 1L, 1L); } } @Override public void unserialize(Map<String, String> data, Player player) { if (player.isOnline()) { org.bukkit.Location location = unserialize(data); if (location != null) { player.teleport(location); } } } private static void serialize(Map<String, String> data, org.bukkit.Location location) { data.put("world", location.getWorld().getName()); data.put("x", String.valueOf(location.getX())); data.put("y", String.valueOf(location.getY())); data.put("z", String.valueOf(location.getZ())); data.put("yaw", String.valueOf(location.getYaw())); data.put("pitch", String.valueOf(location.getPitch())); } private static org.bukkit.Location unserialize(Map<String, String> data) { World world = Bukkit.getWorld(data.get("world")); if (world == null) return null; return new org.bukkit.Location( world, Double.valueOf(data.get("x")), Double.valueOf(data.get("y")), Double.valueOf(data.get("z")), Float.valueOf(data.get("yaw")), Float.valueOf(data.get("pitch")) ); } @Keys({ @Key(name = "world", constraint = KeyConstraint.NOT_EMPTY), @Key(name = "x", constraint = KeyConstraint.NOT_EMPTY), @Key(name = "y", constraint = KeyConstraint.NOT_EMPTY), @Key(name = "z", constraint = KeyConstraint.NOT_EMPTY), @Key(name = "yaw", constraint = KeyConstraint.NOT_EMPTY), @Key(name = "pitch", constraint = KeyConstraint.NOT_EMPTY), }) public static final class PlayerlessLocationSerializer implements PersistenceSerializer { public PlayerlessLocationSerializer(org.bukkit.Location location) { if (location == null) throw new IllegalArgumentException(); this.location = location; } @Override public void serialize(Map<String, String> data, Player player) { LocationSerializer.serialize(data, location); } @Override public void unserialize(Map<String, String> data, Player player) { location = LocationSerializer.unserialize(data); } public Location getLocation() { return location; } private Location location; } }