Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package games.coob.skywars.model;
- import org.bukkit.Location;
- import org.bukkit.Material;
- import org.bukkit.block.Block;
- import org.bukkit.block.BlockFace;
- import org.bukkit.entity.Player;
- import org.bukkit.event.EventHandler;
- import org.bukkit.event.Listener;
- import org.bukkit.event.player.PlayerMoveEvent;
- import org.bukkit.potion.PotionEffect;
- import org.bukkit.potion.PotionEffectType;
- import org.mineacademy.fo.Common;
- import org.mineacademy.fo.Messenger;
- import org.mineacademy.fo.RandomUtil;
- import org.mineacademy.fo.region.Region;
- import org.mineacademy.fo.remain.CompMaterial;
- import org.mineacademy.fo.remain.CompSound;
- public class PortalListener implements Listener {
- private final static int LOCATION_SEARCH_TRIES = 4;
- @EventHandler
- public void onPlayerMoveEvent(final PlayerMoveEvent event) {
- final Player player = event.getPlayer();
- final ArenaPlayer cache = ArenaPlayer.getCache(player);
- final Arena arena = cache.getArena();
- final Region range = arena.getSettings().getRegion();
- final ArenaJoinMode mode = cache.getMode();
- final Block portal = event.getPlayer().getLocation().getBlock().getRelative(BlockFace.DOWN);
- final Location location = findLocation(new Location(player.getWorld(), 0, 0, 0), range);
- if (portal.getType() == Material.RESPAWN_ANCHOR) {
- if (!location.getChunk().isLoaded())
- location.getChunk().load(true);
- Common.runLater(20 * 5, () -> {
- player.teleport(location);
- Common.tell(player, "&5Teleport success!");
- });
- // Play sound and add a potion effect to the player standing on a respawn anchor
- CompSound.PORTAL_TRAVEL.play(player);
- player.addPotionEffect(new PotionEffect(PotionEffectType.CONFUSION, 100, 1, false, false, false));
- /**
- * Cancel the event if the player is in spectate mode, moves away or is standing on an uncharged respawn anchor
- **/
- if (mode == ArenaJoinMode.SPECTATING) {
- Messenger.error(player, "You cannot enter portals while spectating!");
- event.setCancelled(true);
- }
- }
- }
- private Location findLocation(final Location center, final int range) {
- for (int i /* try attempt number */ = 0; i < LOCATION_SEARCH_TRIES; ++i) {
- final Location location = RandomUtil.nextLocation(center, 10, true);
- final Block block = location.getBlock();
- final Block blockBelow = block.getRelative(BlockFace.DOWN);
- if (blockBelow.getType() == Material.RESPAWN_ANCHOR && CompMaterial.isAir(block))
- return location;
- }
- return null;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement