Guest User

SnowGrowCommands.java

a guest
Feb 11th, 2012
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.22 KB | None | 0 0
  1. package musaddict.snowgrow;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.HashMap;
  6. import java.util.List;
  7.  
  8. import musaddict.snowgrow.SnowGrow;
  9.  
  10. import org.bukkit.Bukkit;
  11. import org.bukkit.ChatColor;
  12. import org.bukkit.Location;
  13. import org.bukkit.Material;
  14. import org.bukkit.World;
  15. import org.bukkit.block.Block;
  16. import org.bukkit.block.BlockFace;
  17. import org.bukkit.command.Command;
  18. import org.bukkit.command.CommandExecutor;
  19. import org.bukkit.command.CommandSender;
  20. import org.bukkit.entity.Player;
  21.  
  22. public class SnowGrowCommands implements CommandExecutor{
  23.     private SnowGrow plugin;
  24.     public HashMap<String, int[]> playerSnow = new HashMap<String, int[]>();
  25.  
  26.     public SnowGrowCommands(SnowGrow plugin) {
  27.         this.plugin = plugin;
  28.     }
  29.  
  30.     @Override
  31.     public boolean onCommand(CommandSender sender, Command command, String label, String[] arg) {
  32.         String s = "[" + sender.getName() + "] /" + command.getName();
  33.         for (int i = 0; i < arg.length; i++) s += " " + arg[i];
  34.         System.out.println(s);
  35.  
  36.         if (arg.length == 2) {
  37.             if (arg[0].equals("enable") || arg[0].equals("disable")) {
  38.                 World world = Bukkit.getServer().getWorld(arg[1]);
  39.                
  40.                 if (world == null) {
  41.                     sender.sendMessage(ChatColor.AQUA + arg[1] + ChatColor.RED + " cannot be found."); //Bad world name
  42.                    
  43.                     return true;
  44.                 }
  45.  
  46.                 if (arg[0].equals("enable")) {
  47.                     if(sender.isOp() || sender.hasPermission("sg.world.enable")){
  48.                         if (SnowGrow.worldData.list.contains(world)) {
  49.                             sender.sendMessage(ChatColor.AQUA + arg[1] + ChatColor.GRAY + " is already enabled. Did you mean '/snow disable'?"); //Already exists
  50.                         }
  51.                         else {
  52.                             SnowGrow.worldData.list.add(world);
  53.                             sender.sendMessage(ChatColor.AQUA + arg[1] + ChatColor.GREEN + " is now hooked into weather!"); //World added to auto-grow list
  54.                         }
  55.                     }
  56.                     else{
  57.                         sender.sendMessage(ChatColor.RED + "You do not have permission to enable snow.");
  58.                     }
  59.                 }
  60.                 else if (arg[0].equals("disable")) {
  61.                     if(sender.isOp() || sender.hasPermission("sg.world.disable")){
  62.                         if (SnowGrow.worldData.list.contains(world)) {
  63.                             SnowGrow.worldData.list.remove(world);
  64.                             sender.sendMessage(ChatColor.AQUA + arg[1] + ChatColor.GRAY + " is unhooked from weather."); //Removed
  65.                         }
  66.                         else {
  67.                             sender.sendMessage(ChatColor.AQUA + arg[1] + ChatColor.GRAY + " is already disabled. Did you mean '/snow enable'?"); //World not in auto-grow list
  68.                         }
  69.                     }
  70.                     else{
  71.                         sender.sendMessage(ChatColor.RED + "You do not have permission to disable snow.");
  72.                     }
  73.                 }
  74.  
  75.                 return true;
  76.             }
  77.             else {
  78.                 Player player = (Player)sender;
  79.                 if(player.isOp() || player.hasPermission("sg.snow")){
  80.                     if (playerSnow.containsKey(player.getName())) {
  81.                         player.sendMessage(ChatColor.RED + "It is already snowing.");
  82.                         player.sendMessage(ChatColor.GRAY + "/snow stop");
  83.                         return true;
  84.                     }
  85.  
  86.                     int radius = Integer.parseInt(arg[0]);
  87.                     int maxRange = plugin.getConfig().getInt("command-snow.max-range");
  88.                     int maxTime = plugin.getConfig().getInt("command-snow.max-time");
  89.                     int time = Integer.parseInt(arg[1]);
  90.  
  91.                     if (time > maxTime && maxTime > -1) {
  92.                         player.sendMessage(ChatColor.AQUA + (time + "") + ChatColor.RED + " seconds is too long.");
  93.                         player.sendMessage(ChatColor.GRAY + "Please use " + ChatColor.AQUA + maxTime + ChatColor.GRAY + " or less.");
  94.                         return true;
  95.                     }
  96.  
  97.                     if (radius > maxRange && maxRange > -1) {
  98.                         player.sendMessage(ChatColor.AQUA + (radius + "") + ChatColor.RED + " meters is too long.");
  99.                         player.sendMessage(ChatColor.GRAY + "Please use " + ChatColor.AQUA + maxRange + ChatColor.GRAY + " or less.");
  100.                         return true;
  101.                     }
  102.  
  103.                     int min = time / 60, sec = time % 60;
  104.  
  105.                     boolean circular = true;
  106.                     if (arg.length == 3)
  107.                         if (arg[2].equals("sq"))
  108.                             circular = false;
  109.  
  110.                     player.sendMessage(ChatColor.GRAY + "You let it snow for " + ChatColor.AQUA + min + ChatColor.GRAY + " minutes and "+ ChatColor.AQUA + sec + ChatColor.GRAY + " seconds.");
  111.  
  112.                     int taskID1 = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new SnowGrowSchedule(plugin, getAffectedBlocks(player.getLocation().getBlock().getRelative(BlockFace.DOWN), radius, circular), true), 20L, (long) (plugin.getConfig().getInt("command-snow.growth-delay") * 20L));
  113.                     int taskID2 = plugin.getServer().getScheduler().scheduleAsyncRepeatingTask(plugin, new RemainingTime(player, time), (30 * 20L), (30 * 20L));
  114.                     int stopID = plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new StopTasks(player, new int[] {taskID1, taskID2}), time * 20L);
  115.                     playerSnow.put(player.getName(), new int[] {stopID, taskID1, taskID2});
  116.                     return true;
  117.                 } else {
  118.                     player.sendMessage(ChatColor.RED + "You do not have permission to start snow.");
  119.                     return true;
  120.                 }
  121.             }
  122.         }
  123.         if (arg.length == 1){
  124.             if (arg[0].equals("stop")){
  125.                 Player player = (Player)sender;
  126.                 if(player.isOp() || player.hasPermission("sg.stop")){
  127.  
  128.                     if (playerSnow.containsKey(player.getName())) {
  129.                         new StopTasks(player, playerSnow.get(player.getName())).run(); //Runs instantly, no need to delay with a scheduler
  130.                     }
  131.                     else {
  132.                         player.sendMessage(ChatColor.GRAY + "There was no snow to stop."); //Wasn't snowing (for this player)
  133.                     }
  134.                     //stop both tasks
  135.                     return true;
  136.                 }else {
  137.                     player.sendMessage(ChatColor.RED + "You do not have permission to stop snow.");
  138.                     return true;
  139.                 }
  140.             }else if(arg[0].equals("help")){
  141.                 Player player = (Player)sender;
  142.                 player.sendMessage(ChatColor.GRAY + "------------------" + ChatColor.AQUA + "SnowGrow" + ChatColor.GRAY + "------------------");
  143.                 player.sendMessage(ChatColor.AQUA + "/snow [enable/disable] [world] " + ChatColor.GRAY + "- Hooks into weather."); //TODO: Make this sound better/shorten
  144.                 player.sendMessage(ChatColor.AQUA + "/snow [radius] [time] (sq) " + ChatColor.GRAY + " - Add \"sq\" for square radius."); //TODO: add 3rd arg for square selection (circle by default)" +
  145.                 player.sendMessage(ChatColor.AQUA + "/snow stop " + ChatColor.GRAY + " - Stops snow growth by you.");
  146.                 player.sendMessage(ChatColor.GRAY + "-----------------" + SnowGrow.info.getVersion() + "----------------");
  147.                 player.sendMessage("");
  148.                 player.sendMessage(ChatColor.GRAY + "Written by:" + ChatColor.GOLD + " Musaddict" + ChatColor.GRAY + "," + ChatColor.GOLD + " Feed_Dante");
  149.                 return true;
  150.             }else{
  151.                 return false;
  152.             }
  153.  
  154.         }
  155.  
  156.         return false;
  157.     }
  158.  
  159.     public class RemainingTime implements Runnable { //This is now thread safe
  160.         private Player player;
  161.         private int remainder;
  162.  
  163.         public RemainingTime(Player player, int remainder) {
  164.             this.player = player;
  165.             this.remainder = remainder;
  166.         }
  167.  
  168.         public void run() {
  169.             if(remainder > 30){
  170.                 remainder = remainder - 30;
  171.                 int min = remainder / 60, sec = remainder % 60;
  172.                 player.sendMessage(ChatColor.GRAY + "Remaining time: " + ChatColor.AQUA + min + ChatColor.GRAY + " minutes " + ChatColor.AQUA + sec + ChatColor.GRAY + " seconds.");
  173.             }
  174.         }
  175.     }
  176.  
  177.     public class StopTasks implements Runnable { //This is now thread safe
  178.         private Player player;
  179.         private int[] tasks;
  180.  
  181.         public StopTasks(Player player, int[] tasks) {
  182.             this.player = player;
  183.             this.tasks = tasks;
  184.         }
  185.  
  186.         public void run() {
  187.             if (tasks == null) {
  188.                 player.sendMessage("tasks is null");
  189.                 return;
  190.             }
  191.             for (int task : tasks) {
  192.                 plugin.getServer().getScheduler().cancelTask(task);
  193.             }
  194.             player.sendMessage(ChatColor.GRAY + "It has stopped snowing.");
  195.             playerSnow.remove(player.getName());
  196.         }
  197.     }
  198.  
  199.     //blocks to ignore when placing snow
  200.     public static List<Material> NotAllowed = Arrays.asList(new Material[] {
  201.             Material.TORCH,
  202.             Material.FIRE,
  203.             Material.WATER,
  204.             Material.STATIONARY_WATER,
  205.             Material.ICE,
  206.             Material.REDSTONE_WIRE,
  207.             Material.REDSTONE_TORCH_ON,
  208.             Material.REDSTONE_TORCH_OFF,
  209.             Material.VINE,
  210.             Material.WATER_LILY,
  211.             Material.LAVA,
  212.             Material.STATIONARY_LAVA,
  213.             Material.WHEAT,
  214.             Material.STEP,
  215.             Material.COBBLESTONE_STAIRS,
  216.             Material.WOOD_STAIRS,
  217.             Material.BRICK_STAIRS,
  218.             Material.NETHER_BRICK_STAIRS,
  219.             Material.FENCE,
  220.             Material.FENCE_GATE,
  221.             Material.SUGAR_CANE_BLOCK,
  222.             Material.CROPS}); //Needs more, too lazy
  223.  
  224.     public static List<Material> ToReplace = Arrays.asList(new Material[] {
  225.         Material.SNOW,
  226.         Material.LONG_GRASS,
  227.         Material.DEAD_BUSH,
  228.         Material.RED_ROSE,
  229.         Material.YELLOW_FLOWER});
  230.  
  231.     private ArrayList<Location> getAffectedBlocks(Block sourceBlock, int radius, boolean circular)
  232.     {
  233.         ArrayList<Location> affectedBlocks = new ArrayList<Location>();
  234.         double sourceX = sourceBlock.getX(), sourceY = sourceBlock.getY(), sourceZ = sourceBlock.getZ();
  235.  
  236.         sourceX += (sourceX >= 0)? 0.5 : -0.5;
  237.         sourceY += (sourceY >= 0)? 0.5 : -0.5;
  238.         sourceZ += (sourceZ >= 0)? 0.5 : -0.5;
  239.  
  240.         double minX = sourceX - radius,
  241.             maxX = sourceX + radius,
  242.             minY = sourceY - radius,
  243.             maxY = sourceY + radius,
  244.             minZ = sourceZ - radius,
  245.             maxZ = sourceZ + radius;
  246.  
  247.         double radSQ = Math.pow(radius, 2);
  248.  
  249.         Block temp = null;
  250.  
  251.         for (double x = minX; x < maxX; x++)
  252.         {
  253.             for (double z = minZ; z < maxZ; z++)
  254.             {
  255.                 if (circular) {
  256.                     double coord = (Math.pow((x - sourceX), 2) + Math.pow((z - sourceZ), 2));
  257.  
  258.                     if (coord >= radSQ) //Make sure the block is within our circle.
  259.                         continue; //If not, go to the next one.
  260.                 }
  261.  
  262.                 int highesyBlockY = sourceBlock.getWorld().getHighestBlockYAt((int) x, (int) z); //Gets the highest non-air coordinate at the given coordinates
  263.  
  264.                 temp = sourceBlock.getWorld().getBlockAt((int) x, highesyBlockY, (int) z);
  265.  
  266.                 while (temp.getType() == Material.AIR) //For some reason getHighestBlockYAt sometimes returns a block that has air beneath it.
  267.                     temp = temp.getRelative(BlockFace.DOWN);
  268.  
  269.                 //if (highesyBlockY < maxY && highesyBlockY > minY)
  270.                 if (temp.getY() < maxY && temp.getY() > minY)
  271.                 {
  272.                     //blocks to replace with snow
  273.                     if (ToReplace.contains(temp.getType()))
  274.                         affectedBlocks.add(temp.getLocation());
  275.                     else if (!NotAllowed.contains(temp.getType()))
  276.                         affectedBlocks.add(temp.getRelative(BlockFace.UP).getLocation());
  277.                 }
  278.             }
  279.         }
  280.  
  281.         return affectedBlocks;
  282.     }
  283. }
Advertisement
Add Comment
Please, Sign In to add comment