FastTravelModule.java (3240B)
1 package poppy.modules; 2 3 import java.util.List; 4 import java.util.ArrayList; 5 6 import org.bukkit.Location; 7 import org.bukkit.Material; 8 import org.bukkit.Sound; 9 import org.bukkit.block.Block; 10 import org.bukkit.plugin.Plugin; 11 import org.bukkit.entity.Player; 12 import org.bukkit.event.Listener; 13 import org.bukkit.event.EventHandler; 14 import org.bukkit.event.block.Action; 15 import org.bukkit.inventory.ItemStack; 16 import org.bukkit.inventory.EquipmentSlot; 17 import org.bukkit.inventory.meta.CompassMeta; 18 import org.bukkit.scheduler.BukkitRunnable; 19 import org.bukkit.event.player.PlayerInteractEvent; 20 import org.bukkit.event.player.PlayerMoveEvent; 21 import org.bukkit.event.player.PlayerQuitEvent; 22 23 public class FastTravelModule implements Listener { 24 25 public static final int COUNTDOWN_TIME = 5; 26 public static final double MOVEMENT_THRESHOLD = 0.1D; 27 28 private Plugin plugin; 29 private List<Player> playersQueue; 30 31 public FastTravelModule(final Plugin plugin) { 32 this.plugin = plugin; 33 this.playersQueue = new ArrayList<>(); 34 } 35 36 public void onDisable() { 37 this.playersQueue.clear(); 38 } 39 40 @EventHandler 41 public void onPlayerInteract(final PlayerInteractEvent event) { 42 if (event.getHand() != EquipmentSlot.HAND) { 43 return; 44 } 45 if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { 46 return; 47 } 48 final ItemStack item = event.getItem(); 49 if (item == null || item.getType() != Material.COMPASS) { 50 return; 51 } 52 final Block block = event.getClickedBlock(); 53 if (block != null && block.getType() == Material.LODESTONE) { 54 return; 55 } 56 final CompassMeta meta = (CompassMeta) item.getItemMeta(); 57 if (!meta.hasLodestone()) { 58 return; 59 } 60 final Player player = event.getPlayer(); 61 final Location location = meta.getLodestone(); 62 if (playersQueue.contains(player)) { 63 return; 64 } 65 playersQueue.add(player); 66 new BukkitRunnable() { 67 int timer = COUNTDOWN_TIME; 68 @Override 69 public void run() { 70 if (!playersQueue.contains(player)) { 71 this.cancel(); 72 return; 73 } 74 final Location playerLocation = player.getLocation(); 75 if ( timer > 0) { 76 player.playSound(playerLocation, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 100.0F, 1.0F); 77 } 78 if (timer == 0) { 79 this.cancel(); 80 location.add(0.5, 1.0, 0.5); 81 location.setYaw(playerLocation.getYaw()); 82 location.setPitch(playerLocation.getPitch()); 83 player.teleport(location); 84 player.playSound(playerLocation, Sound.ENTITY_PLAYER_TELEPORT, 100.0F, 1.0F); 85 playersQueue.remove(player); 86 return; 87 } 88 timer--; 89 } 90 }.runTaskTimer(this.plugin, 0L, 20L); 91 } 92 93 @EventHandler 94 public void onPlayerMove(final PlayerMoveEvent event) { 95 final Player player = event.getPlayer(); 96 if (playersQueue.contains(player)) { 97 final Location fromLocation = event.getFrom(); 98 final Location toLocation = event.getTo(); 99 if (fromLocation.distance(toLocation) > MOVEMENT_THRESHOLD) { 100 player.playSound(toLocation, Sound.BLOCK_GLASS_BREAK, 100.0F, 1.0F); 101 playersQueue.remove(player); 102 } 103 } 104 } 105 106 @EventHandler 107 public void onPlayerQuit(final PlayerQuitEvent event) { 108 final Player player = event.getPlayer(); 109 if (playersQueue.contains(player)) { 110 playersQueue.remove(player); 111 } 112 } 113 }