package net.diamonddominion.esaych.survival; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import net.diamonddominion.esaych.CustomPlugin; import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPistonExtendEvent; import org.bukkit.event.block.BlockPistonRetractEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; public class DemiGodPackage implements Listener { private CustomPlugin plugin; private BlockLog bl = new BlockLog(plugin); private ArrayList<Material> disallowedBlocks = new ArrayList<Material>(); private ArrayList<Material> unclickableBlocks = new ArrayList<Material>(); private ArrayList<Material> unbreakableBlocks = new ArrayList<Material>(); private ArrayList<String> disallowedCommands = new ArrayList<String>(); // private Map<TNTPrimed, String> godTNT = new HashMap<TNTPrimed, String>(); // private Map<Block, String> explodedBlocks = new HashMap<Block, String>(); // private Map<Block, String> explodedBlockData = new HashMap<Block, String>(); public DemiGodPackage(CustomPlugin plugin) { this.plugin = plugin; } public void enable() { plugin.getServer().getPluginManager().registerEvents(this, plugin); populateDisallowedBlocks(); // Blocks you can't take out of inv populateUnclickableBlocks();// Blocks you can't open/right click populateUnbreakableBocks(); // Blocks you can't break populateDisallowedCommands();//Commands you can't type // startTntWatch(); log("Enabled"); } public void disable() { bl.saveLog(); // if (explodedBlocks.size() > 0) { // Set<Block> set = explodedBlocks.keySet(); // for (Block b : set) { //Loop through all logged exploded blocks // b.setTypeId(Integer.parseInt(explodedBlockData.get(b).split(";")[0])); // b.setData(Byte.parseByte(explodedBlockData.get(b).split(";")[1])); // if (b.getType().equals(Material.WALL_SIGN) || b.getType().equals(Material.SIGN_POST)) { // Sign sign = (Sign) b.getState(); // sign.setLine(0, explodedBlockData.get(b).split(";")[2]); // sign.setLine(1, explodedBlockData.get(b).split(";")[3]); // sign.setLine(2, explodedBlockData.get(b).split(";")[4]); // sign.setLine(3, explodedBlockData.get(b).split(";")[5]); // } // } // explodedBlockData.clear(); // explodedBlocks.clear(); // } } public boolean creativeCommand(CommandSender sender, String[] args) { if (args.length > 0) { if (args[0].equalsIgnoreCase("save")) return onReloadCommand(sender, args); } if (!(sender instanceof Player)) { msg(sender, "You may NOT get creative mode. :P"); return true; } Player p = (Player) sender; if (p.getWorld().getName().equals("Build") || p.getWorld().getName().equals("Destruction")) { if (p.getGameMode().equals(GameMode.CREATIVE)) { msg(p, "You are already in creative mode"); return true; } p.setGameMode(GameMode.CREATIVE); return true; } if (!p.hasPermission("customplugin.creative")) { msg(p, "You must purchase the DemiGod class for this command."); return true; } if (p.getGameMode() == GameMode.CREATIVE) { msg(p, "You are already in Creative Mode! Try /survival"); return true; } int a = 0; for (ItemStack i : p.getInventory()) { if (i != null) a++; } boolean helm = (p.getInventory().getHelmet() != null); boolean ches = (p.getInventory().getChestplate() != null); boolean legg = (p.getInventory().getLeggings() != null); boolean boot = (p.getInventory().getBoots() != null); if (a > 0 || helm || ches || legg || boot) { msg(p, "You must clear your inventory completely to switch to creative mode."); return true; } p.setGameMode(GameMode.CREATIVE); return true; } public boolean survivalCommand(CommandSender sender, String[] args) { if (!(sender instanceof Player)) { msg(sender, "Trying to troll?? NOT WORKING."); return true; } Player p = (Player) sender; if (p.getWorld().getName().equals("Build") || p.getWorld().getName().equals("Destruction")) { if (p.getGameMode().equals(GameMode.SURVIVAL)) { msg(p, "You are already in survival mode"); return true; } p.setGameMode(GameMode.SURVIVAL); return true; } if (!p.hasPermission("customplugin.creative")) { msg(p, "You must purchase the DemiGod class for this command."); return true; } if (p.getGameMode() == GameMode.SURVIVAL) { msg(p, "You are already in Survival Mode! Try /creative"); return true; } clearInv(p); return true; } @SuppressWarnings("deprecation") public void clearInv(Player p) { p.getInventory().clear(); p.getInventory().setHelmet(new ItemStack(0)); p.getInventory().setChestplate(new ItemStack(0)); p.getInventory().setLeggings(new ItemStack(0)); p.getInventory().setBoots(new ItemStack(0)); p.setGameMode(GameMode.SURVIVAL); } public boolean onReloadCommand(CommandSender sender, String[] args) { if (sender instanceof Player) { if (sender.isOp()) { bl.saveLog(); msg(sender, "Creative BlockLog saved."); } else { msg(sender, "You do not have permission."); } } else { msg(sender, "Creative BlockLog saved."); } return true; } private boolean res(Player player) { // return player.getGameMode() == GameMode.CREATIVE && !player.isOp(); return player.getGameMode() == GameMode.CREATIVE && (player.hasPermission("customplugin.creative.restrict") || (plugin.voteRewards.rewardCache.containsKey(player.getName()) && plugin.voteRewards.rewardCache.get(player.getName()).containsKey(3))); // return player.getGameMode() == GameMode.CREATIVE && player.hasPermission("customplugin.creative") && !player.isOp(); } //================================================================================================================ private void populateDisallowedBlocks() { disallowedBlocks.add(Material.BEDROCK); disallowedBlocks.add(Material.MONSTER_EGG); disallowedBlocks.add(Material.MONSTER_EGGS); disallowedBlocks.add(Material.ENCHANTED_BOOK); disallowedBlocks.add(Material.COMMAND); disallowedBlocks.add(Material.ENDER_PORTAL_FRAME); disallowedBlocks.add(Material.EYE_OF_ENDER); disallowedBlocks.add(Material.POTION); disallowedBlocks.add(Material.ITEM_FRAME); disallowedBlocks.add(Material.MINECART); disallowedBlocks.add(Material.SADDLE); disallowedBlocks.add(Material.BOAT); disallowedBlocks.add(Material.STORAGE_MINECART); disallowedBlocks.add(Material.POWERED_MINECART); disallowedBlocks.add(Material.FISHING_ROD); disallowedBlocks.add(Material.EXPLOSIVE_MINECART); disallowedBlocks.add(Material.HOPPER_MINECART); disallowedBlocks.add(Material.EXP_BOTTLE); disallowedBlocks.add(Material.LAVA_BUCKET); disallowedBlocks.add(Material.EGG); disallowedBlocks.add(Material.TNT); } private void populateUnclickableBlocks() { unclickableBlocks.add(Material.CHEST); unclickableBlocks.add(Material.HOPPER); unclickableBlocks.add(Material.DISPENSER); unclickableBlocks.add(Material.DROPPER); unclickableBlocks.add(Material.FURNACE); unclickableBlocks.add(Material.BREWING_STAND); unclickableBlocks.add(Material.TRAPPED_CHEST); unclickableBlocks.add(Material.ENDER_CHEST); unclickableBlocks.add(Material.TNT); } private void populateUnbreakableBocks() { unbreakableBlocks.add(Material.BEDROCK); } private void populateDisallowedCommands() { disallowedCommands.add("/enderchest"); disallowedCommands.add("/echest"); disallowedCommands.add("/vc"); disallowedCommands.add("/vchest"); disallowedCommands.add("/virtualchest"); disallowedCommands.add("/kit"); disallowedCommands.add("/ekit"); } //=============================================================================================================== @EventHandler public void onPlayerDropItem(PlayerDropItemEvent event) { if (res(event.getPlayer())) { msg(event.getPlayer(), "You may not drop items in creative mode!"); event.setCancelled(true); } } @EventHandler public void onPlayerPickupItem(PlayerPickupItemEvent event) { if (res(event.getPlayer())) { event.setCancelled(true); } } @EventHandler public void onPlayerDeathEvent(EntityDeathEvent event) { if (event.getEntity() instanceof Player) { Player player = (Player) event.getEntity(); if (res(player)) { event.getDrops().clear(); } } } @EventHandler public void onBlockPlace(BlockPlaceEvent event) { if (res(event.getPlayer())) { bl.write(event.getBlock(), event.getPlayer()); } } @EventHandler public void onBlockBreak(BlockBreakEvent event) { if (event.isCancelled()) return; WorldGuardPlugin wg = plugin.getWorldGuard(); boolean canBuild; if (wg == null) { canBuild = true; } else { canBuild = wg.canBuild(event.getPlayer(), event.getBlock()); } if (bl.isLogged(event.getBlock()) && canBuild) { if (!res(event.getPlayer())) { msg(event.getPlayer(), "A creative mode player placed this block."); } event.setCancelled(true); event.getBlock().setType(Material.AIR); bl.remove(event.getBlock()); } } @EventHandler public void onBlockPistonEvent(BlockPistonExtendEvent event) { for (Block b : event.getBlocks()) { if (bl.isLogged(b)) { event.setCancelled(true); // animateBlock(b); } } } @EventHandler public void onBlockPistonContract(BlockPistonRetractEvent event) { if (event.getBlock().getType().equals(Material.PISTON_STICKY_BASE)) { if (!event.getBlock().getType().equals(Material.AIR)) if (bl.isLogged(event.getBlock())) { event.setCancelled(true); } } } // private void animateBlock(final Block b) { // final Material type = b.getType(); // plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { // @Override // public void run() { // b.setType(Material.REDSTONE_BLOCK); // } // }, 5); // plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { // @Override // public void run() { // b.setType(type); // } // }, 10); // } // @EventHandler // public void onBlocksFall(BlockPhysicsEvent event) { //// if ((event.getBlock().getType().equals(Material.SAND) || event.getBlock().getType().equals(Material.GRAVEL)) && bl.isLogged(event.getBlock())) { //// event.getBlock().setType(Material.AIR); //// event.setCancelled(true); // bl.remove(event.getBlock()); //// } // } @SuppressWarnings("deprecation") @EventHandler public void onPlayerClick(InventoryClickEvent event) { if (res((Player) event.getWhoClicked())) { // log("Cursor: " + event.getCursor().getType().name()); // log("CurrentItem: " + event.getCurrentItem().getType().name()); if (event.getCurrentItem() != null) { if (disallowedBlocks.contains(event.getCurrentItem().getType())) { event.setCurrentItem(new ItemStack(Material.AIR)); event.setCancelled(true); } } if (event.getCursor() != null) { if (disallowedBlocks.contains(event.getCursor().getType())) { event.setCancelled(true); } } } if (event.getWhoClicked().getGameMode().equals(GameMode.CREATIVE)) { if (event.getCurrentItem() != null) { if (event.getCurrentItem().getType().equals(Material.MONSTER_EGG)) { event.setCurrentItem(new ItemStack(Material.AIR)); event.setCancelled(true); } } if (event.getCursor() != null) { if (event.getCursor().getType().equals(Material.MONSTER_EGG)) { event.setCursor(new ItemStack(Material.AIR)); event.setCancelled(true); } } } } @EventHandler (priority = EventPriority.LOWEST) public void onPlayerInteract(PlayerInteractEvent event) { if (res(event.getPlayer())) { Block cB = event.getClickedBlock(); if (cB != null) { if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (unclickableBlocks.contains(cB.getType())) { event.setCancelled(true); msg(event.getPlayer(), "You may not use this block."); } if (cB.getType().equals(Material.WALL_SIGN) || cB.getType().equals(Material.SIGN_POST)) { final Sign sign = (Sign) cB.getState(); if (sign.getLine(0).equals(ChatColor.DARK_BLUE + "[Buy]")) { sign.setLine(0, ""); sign.update(); plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { @Override public void run() { sign.setLine(0, ChatColor.DARK_BLUE + "[Buy]"); sign.update(); } }, 1); } if (sign.getLine(0).equals(ChatColor.DARK_BLUE + "[Sell]")) { sign.setLine(0, ""); sign.update(); plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { @Override public void run() { sign.setLine(0, ChatColor.DARK_BLUE + "[Sell]"); sign.update(); } }, 1); } } } else if (event.getAction() == Action.LEFT_CLICK_BLOCK) { if (unbreakableBlocks.contains(cB.getType())) { event.setCancelled(true); msg(event.getPlayer(), "You may not break this block."); } } } } if (event.isCancelled()) return; // if (!event.getClickedBlock().getType().equals(Material.TNT)) // return; // if (bl.isLogged(event.getClickedBlock())) { // final Block tnt = event.getClickedBlock(); // final Player player = event.getPlayer(); // if (tnt.getWorld().getName().equals("Survival") || tnt.getWorld().getName().equals("PeaceWorld")) // plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { // @Override // public void run() { // if (tnt.getType() != Material.AIR) // return; // if (player.getItemInHand() != null && player.getItemInHand().getType().equals(Material.FLINT_AND_STEEL)) { // log("LIT!"); // bl.remove(tnt); // for (Entity possibleTNT : tnt.getWorld().getEntities()) { // if (possibleTNT instanceof TNTPrimed) { // TNTPrimed tntEnt = (TNTPrimed) possibleTNT; // log(tntEnt.getSource().toString()); // if (tntEnt.getSource().equals(player)) { // godTNT.put(tntEnt, player.getName()); // log(player.getName() + " just lit tnt at " + tntEnt.getLocation().toString()); // } // } // } // } // } // }, 1); // } } @EventHandler public void onPlayerSendCommand(PlayerCommandPreprocessEvent event) { if (res(event.getPlayer())) { String command = event.getMessage().split(" ")[0]; if (disallowedCommands.contains(command)) { event.setCancelled(true); msg(event.getPlayer(), "You may not type that command."); } } } @EventHandler (priority=EventPriority.LOWEST) public void onPlayerChangeWorld(PlayerChangedWorldEvent event) { if (res(event.getPlayer())) { clearInv(event.getPlayer()); } } @EventHandler (priority=EventPriority.LOWEST) public void onPlayerQuitGame(PlayerQuitEvent event) { if (res(event.getPlayer())) { clearInv(event.getPlayer()); } } @EventHandler public void onPlayerPunch(EntityDamageByEntityEvent event) { if (event.getDamager() instanceof Player && res((Player) event.getDamager())) { event.setCancelled(true); } } @EventHandler public void onPlayerTouchEntity(PlayerInteractEntityEvent event) { if (res(event.getPlayer())) { event.setCancelled(true); } } // @EventHandler // public void onTNTPrimeEvent (ExplosionPrimeEvent event) { // log("PRIMED"); // } // @EventHandler // public void onRedstoneEvent (BlockRedstoneEvent event) { // final Block tnt = event.getBlock(); // if (tnt.getType().equals(Material.TNT)) { // if (bl.isLogged(tnt)) { // log("TNT CURRENT: " + event.getNewCurrent()); // plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { // @Override // public void run() { // if (tnt.getTypeId() != 0) // return; // log("LIT!"); // bl.remove(tnt); // for (Entity possibleTNT : tnt.getWorld().getEntities()) { // if (possibleTNT instanceof TNTPrimed) { // TNTPrimed tntEnt = (TNTPrimed) possibleTNT; // log(tntEnt.getSource().toString()); // godTNT.put(tntEnt, "REDSTONE"); // log("REDSTONE just lit tnt at " + tntEnt.getLocation().toString()); // } // } // } // }, 1); // } // } // } // @SuppressWarnings("deprecation") // @EventHandler // public void onExplodeEvent(EntityExplodeEvent event) { // log("EXPLODE"); // // if (event.isCancelled()) // return; // for (Block block : event.blockList()) { // if (bl.isLogged(block)) { // block.setType(Material.AIR); // bl.remove(block); // } // if (block.getType().equals(Material.TNT)) { // block.setType(Material.AIR); // } // } // if (event.getEntity() instanceof TNTPrimed) { // if (godTNT.keySet().contains(event.getEntity())) { // // for (Block b : event.blockList()) { // // if (b.getType().equals(Material.WALL_SIGN) || b.getType().equals(Material.SIGN_POST)) { // // explodedBlocks.put(b, godTNT.get(event.getEntity())); // // Sign sign = (Sign) b.getState(); // // String signData = ";" + sign.getLine(0) + ";" + sign.getLine(1) + ";" + sign.getLine(2) + ";" + sign.getLine(3); // // explodedBlockData.put(b, b.getTypeId() + ";" + b.getData() + signData); // // b.setTypeId(0); // // } // // } // for (Block b : event.blockList()) { // // if (!(b.getType().equals(Material.WALL_SIGN) || b.getType().equals(Material.SIGN_POST))) { // explodedBlocks.put(b, godTNT.get(event.getEntity())); // explodedBlockData.put(b, b.getTypeId() + ";" + b.getData()); // b.setType(Material.AIR); // // } // } // godTNT.remove(event.getEntity()); // } // } // } // private void startTntWatch() { // plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { // @SuppressWarnings("deprecation") // @Override // public void run() { // if (explodedBlocks.size() > 0) { // ArrayList<String> alreadyGened = new ArrayList<String>(); //This allows for several people to regen at the same time // ArrayList<Block> toRemove = new ArrayList<Block>(); // Set<Block> set = explodedBlocks.keySet(); // for (Block b : set) { //Loop through all logged exploded blocks // String playerName = explodedBlocks.get(b); // if (!alreadyGened.contains(playerName)) { //If the player hasn't already been covered // b = getLowestBlockPerPlayer(playerName); //// int typeID = Integer.parseInt(explodedBlockData.get(b).split(";")[0]); //// if (typeID == 63 || typeID == 68) { //// if (typeID == 68) { //// for (Block wallBlock : getPlayerBlocksExploded(playerName)) { //// if (wallBlock.getLocation().distance(b.getLocation()) == 1) { //// b = wallBlock; //// typeID = Integer.parseInt(explodedBlockData.get(b).split(";")[0]); //// if (typeID == 68) { //// continue; //// } //// } //// } //// } //// if (typeID == 68 || typeID == 68) { //// Sign sign = (Sign) b.getState(); //// sign.setLine(0, explodedBlockData.get(b).split(";")[2]); //// sign.setLine(1, explodedBlockData.get(b).split(";")[3]); //// sign.setLine(2, explodedBlockData.get(b).split(";")[4]); //// sign.setLine(3, explodedBlockData.get(b).split(";")[5]); //// sign.update(); //// } //// } // b.setTypeId(Integer.parseInt(explodedBlockData.get(b).split(";")[0])); // b.setData(Byte.parseByte(explodedBlockData.get(b).split(";")[1])); // alreadyGened.add(playerName); // explodedBlockData.remove(b); // toRemove.add(b); // } // } // for (Block b : toRemove) { // explodedBlocks.remove(b); // } // } // } // }, 20 * 10, 1); // } // private ArrayList<Block> getPlayerBlocksExploded(String p) { // ArrayList<Block> data = new ArrayList<Block>(); // for (Block b : explodedBlocks.keySet()) { // if (explodedBlocks.get(b).equals(p)) { // data.add(b); // } // } // return data; // } // private Block getLowestBlockPerPlayer (String p) { // int lowest = 300; // Block block = null; // for (Block b : getPlayerBlocksExploded(p)) { // if (b.getLocation().getBlockY() < lowest) { // lowest = b.getLocation().getBlockY(); // block = b; // } // } // return block; // } private void msg(CommandSender sender, String msg) { if (sender instanceof Player) { ((Player) sender).sendMessage(ChatColor.DARK_RED + "[" + ChatColor.GOLD + "CREATIVE" + ChatColor.DARK_RED + "] " + ChatColor.WHITE + ChatColor.translateAlternateColorCodes('&', msg)); } else { log(msg); } } private void log(String info) { plugin.getLogger().info("<CreativeMode> " + info); } } class BlockLog { private File blockLogFile; private FileConfiguration blockLog; private Plugin plugin; public BlockLog(Plugin plugin) { this.plugin = plugin; blockLogFile = new File("CreativeBlockLog.yml"); blockLog = YamlConfiguration.loadConfiguration(blockLogFile); } public List<String> getList() { @SuppressWarnings("unchecked") List<String> blocks = (List<String>) blockLog.getList("blocks"); if (blocks == null) { blocks = new ArrayList<String>(); } return blocks; } public void write(Block block, Player player) { List<String> blocks = getList(); blocks.add(getData(block, player)); blockLog.set("blocks", blocks); } public void remove(Block block) { List<String> blocks = getList(); List<String> newBlocks = new ArrayList<String>(); for (String log : blocks) { if (!log.contains(getTitle(block))) newBlocks.add(log); } blockLog.set("blocks", newBlocks); } public boolean isLogged(Block block) { for (String s : getList()) { if (s.contains(getTitle(block))) { return true; } } return false; } public void saveLog() { if (blockLog == null || blockLogFile == null) { plugin.getLogger().severe("Could not save config to " + blockLogFile); return; } try { blockLog.save(blockLogFile); } catch (IOException ex) { plugin.getLogger().severe("Could not save config to " + blockLogFile); } } private String getTitle(Block b) { return b.getWorld().getName() + ";" + b.getX() + ";" + b.getY() + ";" + b.getZ(); } private String getData(Block b, Player p) { return getTitle(b) + ";" + b.getType().name() + ";" + p.getName(); } }