so://phie

poppy

A feature-rich Minecraft plugin which enhances gaming experience
git clone git://soophie.de/poppy

blob: c99e0fd21e184b7278180392d0787da4e29a8018 (3240 bytes)[doc][blame][raw]

1package poppy.modules;

2

3import java.util.List;

4import java.util.ArrayList;

5

6import org.bukkit.Location;

7import org.bukkit.Material;

8import org.bukkit.Sound;

9import org.bukkit.block.Block;

10import org.bukkit.plugin.Plugin;

11import org.bukkit.entity.Player;

12import org.bukkit.event.Listener;

13import org.bukkit.event.EventHandler;

14import org.bukkit.event.block.Action;

15import org.bukkit.inventory.ItemStack;

16import org.bukkit.inventory.EquipmentSlot;

17import org.bukkit.inventory.meta.CompassMeta;

18import org.bukkit.scheduler.BukkitRunnable;

19import org.bukkit.event.player.PlayerInteractEvent;

20import org.bukkit.event.player.PlayerMoveEvent;

21import org.bukkit.event.player.PlayerQuitEvent;

22

23public 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}