package me.eccentric_nz.TARDIS.schematic; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.UUID; import me.eccentric_nz.TARDIS.JSON.JSONArray; import me.eccentric_nz.TARDIS.JSON.JSONObject; import me.eccentric_nz.TARDIS.TARDIS; import me.eccentric_nz.TARDIS.utility.TARDISMessage; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Banner; import org.bukkit.block.Block; import org.bukkit.block.banner.Pattern; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; public class TARDISSchematicCommand implements CommandExecutor { private final TARDIS plugin; public TARDISSchematicCommand(TARDIS plugin) { this.plugin = plugin; } @Override @SuppressWarnings({"unchecked", "deprecation"}) public boolean onCommand(final CommandSender sender, Command cmd, String label, String[] args) { if (cmd.getName().equalsIgnoreCase("tardisschematic")) { Player player = null; if (sender instanceof Player) { player = (Player) sender; } if (player == null) { TARDISMessage.send(sender, "CMD_ONLY_PLAYER"); return true; } if (!player.hasPermission("tardis.admin")) { TARDISMessage.send(sender, "CMD_ADMIN"); return true; } UUID uuid = player.getUniqueId(); if (args.length == 1 && args[0].equalsIgnoreCase("paste")) { return new TARDISSchematicPaster(plugin, player).paste(); } if (args.length < 2) { TARDISMessage.send(player, "TOO_FEW_ARGS"); return true; } if (!args[0].equalsIgnoreCase("load") && !args[0].equalsIgnoreCase("save")) { TARDISMessage.send(player, "SCHM_NAME"); return true; } if (args[0].equalsIgnoreCase("save")) { // check they have selected start and end blocks if (!plugin.getTrackerKeeper().getStartLocation().containsKey(uuid)) { TARDISMessage.send(player, "SCHM_NO_START"); return true; } if (!plugin.getTrackerKeeper().getEndLocation().containsKey(uuid)) { TARDISMessage.send(player, "SCHM_NO_END"); return true; } // get the world World w = plugin.getTrackerKeeper().getStartLocation().get(uuid).getWorld(); String chk_w = plugin.getTrackerKeeper().getStartLocation().get(uuid).getWorld().getName(); if (!w.getName().equals(chk_w)) { TARDISMessage.send(player, "SCHM_WORLD!"); return true; } // get the raw coords int sx = plugin.getTrackerKeeper().getStartLocation().get(uuid).getBlockX(); int sy = plugin.getTrackerKeeper().getStartLocation().get(uuid).getBlockY(); int sz = plugin.getTrackerKeeper().getStartLocation().get(uuid).getBlockZ(); int ex = plugin.getTrackerKeeper().getEndLocation().get(uuid).getBlockX(); int ey = plugin.getTrackerKeeper().getEndLocation().get(uuid).getBlockY(); int ez = plugin.getTrackerKeeper().getEndLocation().get(uuid).getBlockZ(); // get the min & max coords int minx = (sx < ex) ? sx : ex; int maxx = (sx < ex) ? ex : sx; int miny = (sy < ey) ? sy : ey; int maxy = (sy < ey) ? ey : sy; int minz = (sz < ez) ? sz : ez; int maxz = (sz < ez) ? ez : sz; // create a JSON objet for relative position JSONObject relative = new JSONObject(); int px = player.getLocation().getBlockX() - minx; int py = player.getLocation().getBlockY() - miny; int pz = player.getLocation().getBlockZ() - minz; relative.put("x", px); relative.put("y", py); relative.put("z", pz); // create a JSON objet for dimensions JSONObject dimensions = new JSONObject(); int width = (maxx - minx) + 1; int height = (maxy - miny) + 1; int length = (maxz - minz) + 1; dimensions.put("width", width); dimensions.put("height", height); dimensions.put("length", length); if (width != length) { TARDISMessage.send(player, "SCHM_SQUARE"); return true; } if ((width % 16 != 0 || length % 16 != 0) && !args[1].equals("zero")) { TARDISMessage.send(player, "SCHM_MULTIPLE"); return true; } // create JSON arrays for block data JSONArray levels = new JSONArray(); // loop through the blocks inside this cube for (int l = miny; l <= maxy; l++) { JSONArray rows = new JSONArray(); for (int r = minx; r <= maxx; r++) { JSONArray columns = new JSONArray(); for (int c = minz; c <= maxz; c++) { JSONObject obj = new JSONObject(); Block b = w.getBlockAt(r, l, c); obj.put("type", b.getType().toString()); byte d = b.getData(); obj.put("data", d); // banners if (b.getType().equals(Material.STANDING_BANNER) || b.getType().equals(Material.WALL_BANNER)) { JSONObject state = new JSONObject(); Banner banner = (Banner) b.getState(); state.put("colour", banner.getBaseColor().toString()); JSONArray patterns = new JSONArray(); if (banner.numberOfPatterns() > 0) { for (Pattern p : banner.getPatterns()) { JSONObject pattern = new JSONObject(); pattern.put("pattern", p.getPattern().toString()); pattern.put("pattern_colour", p.getColor().toString()); patterns.put(pattern); } } state.put("patterns", patterns); state.put("bdata", d); obj.put("banner", state); } columns.put(obj); } rows.put(columns); } levels.put(rows); } JSONObject schematic = new JSONObject(); schematic.put("relative", relative); schematic.put("dimensions", dimensions); schematic.put("input", levels); String output = plugin.getDataFolder() + File.separator + "user_schematics" + File.separator + args[1] + ".json"; File file = new File(output); try { BufferedWriter bw = new BufferedWriter(new FileWriter(file), 16 * 1024); bw.write(schematic.toString()); bw.close(); TARDISSchematicGZip.zip(output, plugin.getDataFolder() + File.separator + "user_schematics" + File.separator + args[1] + ".tschm"); file.delete(); TARDISMessage.send(player, "SCHM_SAVED", args[1]); } catch (IOException e) { TARDISMessage.send(player, "SCHM_ERROR"); } return true; } if (args[0].equalsIgnoreCase("load")) { String instr = plugin.getDataFolder() + File.separator + "user_schematics" + File.separator + args[1] + ".tschm"; File file = new File(instr); if (!file.exists()) { TARDISMessage.send(player, "SCHM_NOT_VALID"); return true; } JSONObject sch = TARDISSchematicGZip.unzip(instr); plugin.getTrackerKeeper().getPastes().put(uuid, sch); TARDISMessage.send(player, "SCHM_LOADED", ChatColor.GREEN + "/ts paste" + ChatColor.RESET); return true; } } return false; } }