package net.diamonddominion.esaych.survival; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import net.diamonddominion.esaych.CustomPlugin; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerToggleSneakEvent; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.util.Vector; public class DonorShop { private CustomPlugin plugin; private Map<Player, Boolean> going = new HashMap<Player, Boolean>(); private Location donorBlock; private Location pressurePlate; private Map<Player, Integer> tasks = new HashMap<Player, Integer>(); private Map<Player, Long> timeout = new HashMap<Player, Long>(); public DonorShop(CustomPlugin plugin) { this.plugin = plugin; } public void enable() { donorBlock = new Location(Bukkit.getWorld("Survival"), 123.5, 75.5, 198.5); pressurePlate = new Location(Bukkit.getWorld("Survival"), 94, 200, 198); log("Enabled"); } @SuppressWarnings("deprecation") public void disable() { for (Block b : exploded.keySet()) { b.setTypeId(Integer.parseInt(exploded.get(b).split(";")[0])); b.setData(Byte.parseByte(exploded.get(b).split(";")[1])); } if (tnt != null) tnt.remove(); } private ArrayList<Player> queued = new ArrayList<Player>(); public void onPlayerMoveEvent(PlayerMoveEvent event) { if (event.getPlayer().getWorld().equals(donorBlock.getWorld())) { Player player = event.getPlayer(); Location pLoc = player.getLocation(); if (!player.hasPermission("customplugin.donorshop")) return; if (pLoc.distance(donorBlock) < 1.5 && !queued.contains(player)) { msg(player, "Punch the quartz below to go to the donor shop."); queued.add(player); } else if (pLoc.distance(pressurePlate) < 1.5 && !queued.contains(player)) { msg(player, "Sneak on the pressure plate to return to spawn."); queued.add(player); } else if (pLoc.distance(pressurePlate) >= 1.5 && pLoc.distance(donorBlock) >= 1.5 && queued.contains(player)) { queued.remove(player); } if (going.containsKey(player) && !pLoc.getWorld().equals(donorBlock.getWorld())) { removePlayer(player); msg(player, "WHY ARE YOU IN ANOTHER WORLD! YOU WERE ABOUT TO GO FLYING UP!"); return; } if (going.containsKey(player) && going.get(player)) { Location pLevelLoc = donorBlock.clone(); pLevelLoc.setY(pLoc.getY()); double dis = pLoc.distance(pLevelLoc); if (dis > 1.5) { // if the player is out of the scope that brings them up, this stops them pLoc.setX(donorBlock.getX()); pLoc.setZ(donorBlock.getZ()); player.teleport(pLoc); } if (pLoc.getY() < donorBlock.getY()) { pLoc.setY(donorBlock.getY()); player.teleport(pLoc); } if (pLoc.getY() > 194) { removePlayer(player); player.setVelocity(new Vector(-1, .5, 0)); msg(player, "Welcome to the Donor Shop!"); } else { player.setVelocity(new Vector(0, 1.5, 0)); player.getWorld().playEffect(player.getLocation(), Effect.MOBSPAWNER_FLAMES, 50); } } } } @SuppressWarnings("deprecation") private void removePlayer(Player player) { for (Block b : exploded.keySet()) { b.setTypeId(Integer.parseInt(exploded.get(b).split(";")[0])); b.setData(Byte.parseByte(exploded.get(b).split(";")[1])); } exploded.clear(); if (tnt != null) { tnt.remove(); tnt = null; } going.remove(player); } private Entity tnt = null; public void onPlayerPunchBlock(PlayerInteractEvent event) { if (event.getClickedBlock() != null) { if (event.getClickedBlock().equals(donorBlock.getBlock())) { final Player player = event.getPlayer(); if (!player.hasPermission("customplugin.donorshop")) return; if (exploded.size() > 0 || tnt != null) { msg(player, "A transport is already commencing! Wait a bit."); return; } msg(player, "Transport Commencing!"); going.put(player, false); tnt = donorBlock.getWorld().spawnEntity(donorBlock.clone().add(0,11,0), EntityType.PRIMED_TNT); plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { @Override public void run() { if (going.containsKey(player)) { going.put(player, true); player.setVelocity(new Vector(0, 2, 0)); } } }, 5 * 17); } } } /* * Further code is from the DrukenWizard (Code to tp back) */ private void attemptTeleport(final Player player) { player.addPotionEffect(new PotionEffect(PotionEffectType.CONFUSION, 20*10, 1000)); // player.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION, 20*10, 50)); player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 20*10, 1)); int task = plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { @Override public void run() { tpPlayer(player); } }, 20*5); tasks.put(player, task); } private void cancelTeleport(Player player) { if (tasks.containsKey(player)) { Bukkit.getScheduler().cancelTask(tasks.get(player)); tasks.remove(player); } removeEffects(player); msg(player, "Keep sneaking to reach the spawn."); } private void tpPlayer(Player player) { for (int a = 0; a < 50; a++) player.getWorld().playEffect(player.getLocation(), Effect.MOBSPAWNER_FLAMES, 0); player.teleport(new Location(donorBlock.getWorld(), donorBlock.getX(), donorBlock.getY() + 1, donorBlock.getZ(), player.getLocation().getYaw(), player.getLocation().getPitch())); for (int a = 0; a < 20; a++) player.getWorld().playEffect(player.getLocation(), Effect.MOBSPAWNER_FLAMES, 0); timeout.put(player, System.currentTimeMillis()/1000); removeEffects(player); } private void removeEffects(Player player) { player.removePotionEffect(PotionEffectType.CONFUSION); player.removePotionEffect(PotionEffectType.BLINDNESS); // player.removePotionEffect(PotionEffectType.NIGHT_VISION); } public void onPlayerSneaks(PlayerToggleSneakEvent e) { Player player = e.getPlayer(); if (player.getLocation().getBlock().equals(pressurePlate.getBlock())) { if (timeout.containsKey(player)) { if (timeout.get(player) + 5 > System.currentTimeMillis()/1000) return; } if (e.isSneaking()) { attemptTeleport(player); } else { cancelTeleport(player); } } } /* * Events for the DonorShop tp */ public Map<Block, String> exploded = new HashMap<Block, String>(); @SuppressWarnings("deprecation") public void onTntExplodeEvent(EntityExplodeEvent event) { if (tnt != null && event.getEntity().equals(tnt)) { for (Block b : exploded.keySet()) { b.setTypeId(Integer.parseInt(exploded.get(b).split(";")[0])); b.setData(Byte.parseByte(exploded.get(b).split(";")[1])); } exploded.clear(); for (Block b : event.blockList()) { exploded.put(b, b.getTypeId() + ";" + b.getData()); b.setTypeId(0); } event.setCancelled(false); tnt = null; } } public void onPlayerTeleportEvent(PlayerTeleportEvent event) { if (!event.getPlayer().hasPermission("customplugin.donorshop")) { if (event.getTo().getWorld().equals(donorBlock.getWorld())) { if (event.getTo().distance(new Location(donorBlock.getWorld(), 104, 199, 198)) < 30) { event.setCancelled(true); msg(event.getPlayer(), "YOU may not teleport to the donor shop!"); } } } if (going.containsKey(event.getPlayer())) { removePlayer(event.getPlayer()); msg(event.getPlayer(), "Your teleportation has been cancelled"); } } public void onPlayerChangeWorld(PlayerChangedWorldEvent event) { if (going.containsKey(event.getPlayer())) { removePlayer(event.getPlayer()); msg(event.getPlayer(), "Don't mess with the system!"); } } public void onPlayerQuitEvent(PlayerQuitEvent event) { if (going.containsKey(event.getPlayer())) { removePlayer(event.getPlayer()); } } public void msg(Player p, String msg) { p.sendMessage("[" + ChatColor.GOLD + "DonorShop" + ChatColor.WHITE + "] " + ChatColor.AQUA + msg); } public void log(String info) { plugin.getLogger().info("<DonorShop> " + info); } }