From 69ad2b7ba17693e397778f5f8079e0ddb07fde85 Mon Sep 17 00:00:00 2001 From: Steve Green Date: Fri, 31 May 2019 14:11:55 -0400 Subject: [PATCH] Refactored for modern Bukkit (1.13+) Removed old large font --- .gitignore | 8 + README.md | 5 +- pom.xml | 22 +- .../com/allocinit/bukkit/CommandPlugin.java | 64 ++++ .../com/allocinit/bukkit/ErrorException.java | 9 + .../bukkit/PermissionDeniedException.java | 5 + .../java/com/allocinit/bukkit/SubCommand.java | 29 ++ .../com/allocinit/bukkit/UsageException.java | 5 + .../java/com/allocinit/skyjot/Character.java | 49 ++- .../com/allocinit/skyjot/DirectionHelper.java | 27 +- src/main/java/com/allocinit/skyjot/Font.java | 321 +--------------- .../com/allocinit/skyjot/FontMaterial.java | 87 +++++ .../java/com/allocinit/skyjot/LargeFont.java | 342 +++++++++++++++++ .../java/com/allocinit/skyjot/SkyJot.java | 68 +--- .../java/com/allocinit/skyjot/SmallFont.java | 343 ++++++++++++++++++ .../java/com/allocinit/skyjot/SubCommand.java | 12 - src/main/java/com/allocinit/skyjot/Undo.java | 28 +- .../com/allocinit/skyjot/UndoCommand.java | 24 +- .../com/allocinit/skyjot/WriteCommand.java | 127 +++---- src/main/resources/plugin.yml | 10 +- 20 files changed, 1039 insertions(+), 546 deletions(-) create mode 100644 .gitignore create mode 100644 src/main/java/com/allocinit/bukkit/CommandPlugin.java create mode 100644 src/main/java/com/allocinit/bukkit/ErrorException.java create mode 100644 src/main/java/com/allocinit/bukkit/PermissionDeniedException.java create mode 100644 src/main/java/com/allocinit/bukkit/SubCommand.java create mode 100644 src/main/java/com/allocinit/bukkit/UsageException.java create mode 100644 src/main/java/com/allocinit/skyjot/FontMaterial.java create mode 100644 src/main/java/com/allocinit/skyjot/LargeFont.java create mode 100644 src/main/java/com/allocinit/skyjot/SmallFont.java delete mode 100644 src/main/java/com/allocinit/skyjot/SubCommand.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ce9980f --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +.classpath +.project +.settings/ +.vscode/ +target/ + + diff --git a/README.md b/README.md index 2d8872c..693aac2 100644 --- a/README.md +++ b/README.md @@ -13,4 +13,7 @@ SkyJot is a Bukkit Minecraft plugin for writing block letters in the sky. It wa * Text direction is determined by the direction you are facing when you run the write command. Text will be left-to-right from the perspective of the player. ### Example -/skyjot write b:17:2 ~ ~ ~ Hello\nWorld \ No newline at end of file +/skyjot write b:17:2 ~ ~ ~ Hello\nWorld + +### Open Source +[github](https://github.com/lagnat/SkyJot) \ No newline at end of file diff --git a/pom.xml b/pom.xml index a03a380..2d159f7 100644 --- a/pom.xml +++ b/pom.xml @@ -3,8 +3,8 @@ 4.0.0 com.allocinit SkyJot - 1.0.0-SNAPSHOT - BlockHunt + 2.0.0-SNAPSHOT + SkyJot @@ -17,31 +17,19 @@ org.bukkit bukkit - 1.8.8-R0.1-SNAPSHOT + 1.14.2-R0.1-SNAPSHOT - - - . - true - ${basedir}/src/main/resources - - plugin.yml - - - - - src org.apache.maven.plugins maven-compiler-plugin 2.3.2 - 1.7 - 1.7 + 1.8 + 1.8 UTF-8 diff --git a/src/main/java/com/allocinit/bukkit/CommandPlugin.java b/src/main/java/com/allocinit/bukkit/CommandPlugin.java new file mode 100644 index 0000000..6ec8a6b --- /dev/null +++ b/src/main/java/com/allocinit/bukkit/CommandPlugin.java @@ -0,0 +1,64 @@ +package com.allocinit.bukkit; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; + +public class CommandPlugin extends JavaPlugin implements CommandExecutor { + private String cmdName; + private Map> commands = new HashMap<>(); + + public CommandPlugin(String cmdName) { + this.cmdName = cmdName; + } + + public void onEnable() { + try { + this.saveDefaultConfig(); + } catch (Exception e) { + } + + this.getCommand(cmdName).setExecutor(this); + } + + protected void registerSubCommand(SubCommand cmd) { + commands.put(cmd.getCommandName(), cmd); + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + try { + if (args.length == 0) + throw new UsageException(); + + SubCommand cmd = commands.get(args[0]); + + if (cmd == null) + throw new UsageException(); + + cmd.doCommand(sender, Arrays.copyOfRange(args, 1, args.length)); + } catch (UsageException e) { + this.writeUsage(sender); + } catch (PermissionDeniedException e) { + sender.sendMessage(ChatColor.RED + "Permission Denied"); + } catch (ErrorException e) { + sender.sendMessage(ChatColor.RED + e.getMessage()); + } catch (Exception e) { + sender.sendMessage("Uncaught exception: " + e.getMessage()); + } + + return true; + } + + public void writeUsage(CommandSender player) { + player.sendMessage("[" + ChatColor.GOLD + cmdName + ChatColor.WHITE + " usage]"); + for (SubCommand cmd : commands.values()) + cmd.writeUsage(player); + } +} diff --git a/src/main/java/com/allocinit/bukkit/ErrorException.java b/src/main/java/com/allocinit/bukkit/ErrorException.java new file mode 100644 index 0000000..7e9e826 --- /dev/null +++ b/src/main/java/com/allocinit/bukkit/ErrorException.java @@ -0,0 +1,9 @@ +package com.allocinit.bukkit; + +public class ErrorException extends RuntimeException { + private static final long serialVersionUID = 1L; + + public ErrorException(String string) { + super(string); + } +} diff --git a/src/main/java/com/allocinit/bukkit/PermissionDeniedException.java b/src/main/java/com/allocinit/bukkit/PermissionDeniedException.java new file mode 100644 index 0000000..eec77af --- /dev/null +++ b/src/main/java/com/allocinit/bukkit/PermissionDeniedException.java @@ -0,0 +1,5 @@ +package com.allocinit.bukkit; + +public class PermissionDeniedException extends RuntimeException { + private static final long serialVersionUID = 1L; +} diff --git a/src/main/java/com/allocinit/bukkit/SubCommand.java b/src/main/java/com/allocinit/bukkit/SubCommand.java new file mode 100644 index 0000000..faa860c --- /dev/null +++ b/src/main/java/com/allocinit/bukkit/SubCommand.java @@ -0,0 +1,29 @@ +package com.allocinit.bukkit; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public abstract class SubCommand { + protected T plugin; + private String cmd; + + public SubCommand(T plugin, String cmd) { + this.plugin = plugin; + this.cmd = cmd; + } + + public String getCommandName() { + return this.cmd; + } + + public abstract void doCommand(CommandSender sender, String[] args) throws Exception; + + public abstract void writeUsage(CommandSender player); + + protected void checkPerm(CommandSender sender, String perm) { + if (sender instanceof Player) { + if (!((Player) sender).hasPermission(perm)) + throw new PermissionDeniedException(); + } + } +} diff --git a/src/main/java/com/allocinit/bukkit/UsageException.java b/src/main/java/com/allocinit/bukkit/UsageException.java new file mode 100644 index 0000000..7a8e2d0 --- /dev/null +++ b/src/main/java/com/allocinit/bukkit/UsageException.java @@ -0,0 +1,5 @@ +package com.allocinit.bukkit; + +public class UsageException extends RuntimeException { + private static final long serialVersionUID = 1L; +} diff --git a/src/main/java/com/allocinit/skyjot/Character.java b/src/main/java/com/allocinit/skyjot/Character.java index bfbea62..6a55888 100644 --- a/src/main/java/com/allocinit/skyjot/Character.java +++ b/src/main/java/com/allocinit/skyjot/Character.java @@ -3,37 +3,54 @@ import java.util.ArrayList; import java.util.List; - -public class Character -{ - private List path = new ArrayList<>(); +public class Character { + private List path = new ArrayList<>(); private int width = 0; - public Character(String... rows) - { - for (int i = 0; i < rows.length; i++) - { - String row = rows [rows.length - i - 1]; + public Character(String... rows) { + for (int i = 0; i < rows.length; i++) { + String row = rows[i]; - for (int j = 0; j < row.length(); j++) - { + for (int j = 0; j < row.length(); j++) { if (j >= width) width = j + 1; char dot = row.charAt(j); if (dot != ' ') - path.add(new Integer [] { j, i }); + path.add(new Dot(j, -i, dot)); } } } - public int getWidth() - { + public int getWidth() { return width; } - public List getPath() - { + public List getPath() { return path; } + + public static class Dot { + private int x; + private int y; + private char dot; + + public Dot(int x, int y, char dot) { + this.x = x; + this.y = y; + this.dot = dot; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public char getDot() { + return dot; + } + } } diff --git a/src/main/java/com/allocinit/skyjot/DirectionHelper.java b/src/main/java/com/allocinit/skyjot/DirectionHelper.java index 893ec0f..5334161 100644 --- a/src/main/java/com/allocinit/skyjot/DirectionHelper.java +++ b/src/main/java/com/allocinit/skyjot/DirectionHelper.java @@ -4,35 +4,34 @@ import org.bukkit.entity.Player; import org.bukkit.util.Vector; -class DirectionHelper -{ +class DirectionHelper { private double xAdd; private double zAdd; + private Location location; - public DirectionHelper() - { + public DirectionHelper() { } - public void setFromPlayerView(Player player) - { - Vector direction = player.getLocation().getDirection(); + public Location getLocation() { + return location; + } + + public void setFromPlayerView(Player player) { + location = player.getLocation(); + Vector direction = location.getDirection(); direction.setY(0); - if (Math.abs(direction.getX()) < Math.abs(direction.getZ())) - { + if (Math.abs(direction.getX()) < Math.abs(direction.getZ())) { xAdd = direction.getZ() > 0 ? -1 : 1; zAdd = 0; - } - else - { + } else { zAdd = direction.getX() < 0 ? -1 : 1; xAdd = 0; } } - public void move(Location loc, int xoff, int yoff) - { + public void move(Location loc, int xoff, int yoff) { loc.setX(loc.getX() + xoff * xAdd); loc.setZ(loc.getZ() + xoff * zAdd); loc.setY(loc.getY() + yoff); diff --git a/src/main/java/com/allocinit/skyjot/Font.java b/src/main/java/com/allocinit/skyjot/Font.java index 0976d73..8349fb2 100644 --- a/src/main/java/com/allocinit/skyjot/Font.java +++ b/src/main/java/com/allocinit/skyjot/Font.java @@ -1,322 +1,13 @@ package com.allocinit.skyjot; -import java.util.HashMap; -import java.util.Map; +import org.bukkit.block.Block; +public interface Font { + public int getHeight(); -public class Font -{ - private Character SPACE = new Character() - { - @Override - public int getWidth() - { - return 2; - } - }; + public Character get(String c); - private Character A = new Character(// - "XXX", // - "X X", // - "XXX", // - "X X", // - "X X"); + public void setBlock(DirectionHelper dirHelper, Block block, FontMaterial mat, char dot); - private Character B = new Character(// - "XXX", // - "X X", // - "XXX", // - "X X", // - "XXX"); - - private Character C = new Character(// - "XXX", // - "X", // - "X", // - "X", // - "XXX"); - - private Character D = new Character(// - "XXX", // - "X X", // - "X X", // - "X X", // - "XXX"); - - private Character E = new Character(// - "XXX", // - "X", // - "XX", // - "X", // - "XXX"); - - private Character F = new Character(// - "XXX", // - "X", // - "XX", // - "X", // - "X"); - - private Character G = new Character(// - "XXX", // - "X", // - "X", // - "X X", // - "XXX"); - - private Character H = new Character(// - "X X", // - "X X", // - "XXX", // - "X X", // - "X X"); - - private Character I = new Character(// - "XXX", // - " X", // - " X", // - " X", // - "XXX"); - - private Character J = new Character(// - "XXXX", // - " X", // - " X", // - " X", // - "XXX"); - - private Character K = new Character(// - "X X", // - "X X", // - "XX", // - "X X", // - "X X"); - - private Character L = new Character(// - "X", // - "X", // - "X", // - "X", // - "XXX"); - - private Character M = new Character(// - "XX XX", // - "X X X", // - "X X X", // - "X X", // - "X X"); - - private Character N = new Character(// - "X X", // - "XX X", // - "X X X", // - "X XX", // - "X X"); - - private Character O = new Character(// - " XX ", // - "X X", // - "X X", // - "X X", // - " XX"); - - private Character P = new Character(// - "XXX", // - "X X", // - "XXX", // - "X", // - "X"); - - private Character Q = new Character(// - " XXX ", // - "X X", // - "X X X", // - "X XX", // - " XXX"); - - private Character R = new Character(// - "XXX", // - "X X", // - "XX", // - "X X", // - "X X"); - - private Character S = new Character(// - "XXX", // - "X", // - "XXX", // - " X", // - "XXX"); - - private Character T = new Character(// - "XXX", // - " X", // - " X", // - " X", // - " X"); - - private Character U = new Character(// - "X X", // - "X X", // - "X X", // - "X X", // - " XX"); - - private Character V = new Character(// - "X X", // - "X X", // - " X X", // - " X X", // - " X"); - - private Character W = new Character(// - "X X", // - "X X", // - "X X X", // - "X X X", // - " X X"); - - private Character X = new Character(// - "X X", // - "X X", // - " X", // - "X X", // - "X X"); - - private Character Y = new Character(// - "X X", // - "X X", // - " X", // - " X", // - " X"); - - private Character Z = new Character(// - "XXX", // - " X", // - " X", // - "X", // - "XXX"); - - private Character N1 = new Character(// - "XX", // - " X", // - " X", // - " X", // - "XXX"); - - private Character N2 = new Character(// - "XXX", // - " X", // - "XXX", // - "X", // - "XXX"); - - private Character N3 = new Character(// - "XXX", // - " X", // - "XXX", // - " X", // - "XXX"); - - private Character N4 = new Character(// - "X X", // - "X X", // - "XXX", // - " X", // - " X"); - - private Character N5 = new Character(// - "XXX", // - "X", // - "XXX", // - " X", // - "XXX"); - - private Character N6 = new Character(// - "XXX", // - "X", // - "XXX", // - "X X", // - "XXX"); - - private Character N7 = new Character(// - "XXX", // - " X", // - " X", // - " X", // - " X"); - - private Character N8 = new Character(// - "XXX", // - "X X", // - "XXX", // - "X X", // - "XXX"); - - private Character N9 = new Character(// - "XXX", // - "X X", // - "XXX", // - " X", // - " X"); - - private Character N0 = new Character(// - "XXX", // - "X X", // - "X X", // - "X X", // - "XXX"); - - private Map font = new HashMap<>(); - - public Font() - { - font.put(" ", SPACE); - font.put("A", A); - font.put("B", B); - font.put("C", C); - font.put("D", D); - font.put("E", E); - font.put("F", F); - font.put("G", G); - font.put("H", H); - font.put("I", I); - font.put("J", J); - font.put("K", K); - font.put("L", L); - font.put("M", M); - font.put("N", N); - font.put("O", O); - font.put("P", P); - font.put("Q", Q); - font.put("R", R); - font.put("S", S); - font.put("T", T); - font.put("U", U); - font.put("V", V); - font.put("W", W); - font.put("X", X); - font.put("Y", Y); - font.put("Z", Z); - font.put("0", N0); - font.put("1", N1); - font.put("2", N2); - font.put("3", N3); - font.put("4", N4); - font.put("5", N5); - font.put("6", N6); - font.put("7", N7); - font.put("8", N8); - font.put("9", N9); - } - - public int getHeight() - { - return 5; - } - - public Character get(String c) - { - return font.get(c); - } + public FontMaterial parseMaterial(String material); } diff --git a/src/main/java/com/allocinit/skyjot/FontMaterial.java b/src/main/java/com/allocinit/skyjot/FontMaterial.java new file mode 100644 index 0000000..33b2465 --- /dev/null +++ b/src/main/java/com/allocinit/skyjot/FontMaterial.java @@ -0,0 +1,87 @@ +package com.allocinit.skyjot; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.bukkit.Material; + +public class FontMaterial { + public static Set allMaterials = new HashSet() { + { + this.add("ACACIA"); + this.add("ANDESITE"); + this.add("BIRCH"); + this.add("BRICK"); + this.add("COBBLESTONE"); + this.add("DARK_OAK"); + this.add("DARK_PRISMARINE"); + this.add("DIORITE"); + this.add("END_STONE_BRICK"); + this.add("GRANITE"); + this.add("JUNGLE"); + this.add("MOSSY_COBBLESTONE"); + this.add("MOSSY_STONE_BRICK"); + this.add("NETHER_BRICK"); + this.add("OAK"); + this.add("POLISHED_ANDESITE"); + this.add("POLISHED_DIORITE"); + this.add("POLISHED_GRANITE"); + this.add("PRISMARINE_BRICK"); + this.add("PRISMARINE"); + this.add("PURPUR"); + this.add("QUARTZ"); + this.add("RED_NETHER_BRICK"); + this.add("RED_SANDSTONE"); + this.add("SANDSTONE"); + this.add("SMOOTH_QUARTZ"); + this.add("SMOOTH_RED_SANDSTONE"); + this.add("SMOOTH_SANDSTONE"); + this.add("SPRUCE"); + this.add("STONE_BRICK"); + this.add("STONE"); + } + }; + + private static Map blockRenames = new HashMap() { + { + this.put("QUARTZ", "QUARTZ_BLOCK"); + this.put("ACACIA", "ACACIA_PLANKS"); + this.put("JUNGLE", "JUNGLE_PLANKS"); + this.put("OAK", "OAK_PLANKS"); + this.put("DARK_OAK", "DARK_OAK_PLANKS"); + this.put("SPRUCE", "SPRUCE_PLANKS"); + this.put("BIRCH", "BIRCH_PLANKS"); + this.put("BRICK", "BRICKS"); + this.put("END_STONE_BRICK", "END_STONE_BRICKS"); + this.put("MOSSY_STONE_BRICK", "MOSSY_STONE_BRICKS"); + this.put("NETHER_BRICK", "NETHER_BRICKS"); + this.put("PRISMARINE_BRICK", "PRISMARINE_BRICKS"); + this.put("STONE_BRICK", "STONE_BRICKS"); + this.put("PURPUR", "PURPUR_BLOCK"); + this.put("RED_NETHER_BRICK", "RED_NETHER_BRICKS"); + } + }; + + public Material stairMaterial; + public Material blockMaterial; + public Material slabMaterial; + + public FontMaterial(Material materialData) { + blockMaterial = materialData; + } + + public FontMaterial(String name) { + name = name.toUpperCase(); + + String renamed = blockRenames.get(name); + + if (renamed == null) + renamed = name; + + blockMaterial = Material.getMaterial(renamed); + stairMaterial = Material.getMaterial(name + "_STAIRS"); + slabMaterial = Material.getMaterial(name + "_SLAB"); + } +} diff --git a/src/main/java/com/allocinit/skyjot/LargeFont.java b/src/main/java/com/allocinit/skyjot/LargeFont.java new file mode 100644 index 0000000..2e997d8 --- /dev/null +++ b/src/main/java/com/allocinit/skyjot/LargeFont.java @@ -0,0 +1,342 @@ +// package com.allocinit.skyjot; + +// import java.util.HashMap; +// import java.util.Map; + +// import org.bukkit.Material; +// import org.bukkit.block.Block; +// import org.bukkit.material.MaterialData; + +// public class LargeFont implements Font { +// private Character SPACE = new Character() { +// @Override +// public int getWidth() { +// return 2; +// } +// }; + +// private Character A = new Character(// +// "XXX", // +// "X X", // +// "XXX", // +// "X X", // +// "X X"); + +// private Character B = new Character(// +// "XXX", // +// "X X", // +// "XXX", // +// "X X", // +// "XXX"); + +// private Character C = new Character(// +// "XXX", // +// "X", // +// "X", // +// "X", // +// "XXX"); + +// private Character D = new Character(// +// "XXX", // +// "X X", // +// "X X", // +// "X X", // +// "XXX"); + +// private Character E = new Character(// +// "XXX", // +// "X", // +// "XX", // +// "X", // +// "XXX"); + +// private Character F = new Character(// +// "XXX", // +// "X", // +// "XX", // +// "X", // +// "X"); + +// private Character G = new Character(// +// "XXX", // +// "X", // +// "X", // +// "X X", // +// "XXX"); + +// private Character H = new Character(// +// "X X", // +// "X X", // +// "XXX", // +// "X X", // +// "X X"); + +// private Character I = new Character(// +// "XXX", // +// " X", // +// " X", // +// " X", // +// "XXX"); + +// private Character J = new Character(// +// "XXXX", // +// " X", // +// " X", // +// " X", // +// "XXX"); + +// private Character K = new Character(// +// "X X", // +// "X X", // +// "XX", // +// "X X", // +// "X X"); + +// private Character L = new Character(// +// "X", // +// "X", // +// "X", // +// "X", // +// "XXX"); + +// private Character M = new Character(// +// "XX XX", // +// "X X X", // +// "X X X", // +// "X X", // +// "X X"); + +// private Character N = new Character(// +// "X X", // +// "XX X", // +// "X X X", // +// "X XX", // +// "X X"); + +// private Character O = new Character(// +// " XX ", // +// "X X", // +// "X X", // +// "X X", // +// " XX"); + +// private Character P = new Character(// +// "XXX", // +// "X X", // +// "XXX", // +// "X", // +// "X"); + +// private Character Q = new Character(// +// " XXX ", // +// "X X", // +// "X X X", // +// "X XX", // +// " XXX"); + +// private Character R = new Character(// +// "XXX", // +// "X X", // +// "XX", // +// "X X", // +// "X X"); + +// private Character S = new Character(// +// "XXX", // +// "X", // +// "XXX", // +// " X", // +// "XXX"); + +// private Character T = new Character(// +// "XXX", // +// " X", // +// " X", // +// " X", // +// " X"); + +// private Character U = new Character(// +// "X X", // +// "X X", // +// "X X", // +// "X X", // +// " XX"); + +// private Character V = new Character(// +// "X X", // +// "X X", // +// " X X", // +// " X X", // +// " X"); + +// private Character W = new Character(// +// "X X", // +// "X X", // +// "X X X", // +// "X X X", // +// " X X"); + +// private Character X = new Character(// +// "X X", // +// "X X", // +// " X", // +// "X X", // +// "X X"); + +// private Character Y = new Character(// +// "X X", // +// "X X", // +// " X", // +// " X", // +// " X"); + +// private Character Z = new Character(// +// "XXX", // +// " X", // +// " X", // +// "X", // +// "XXX"); + +// private Character N1 = new Character(// +// "XX", // +// " X", // +// " X", // +// " X", // +// "XXX"); + +// private Character N2 = new Character(// +// "XXX", // +// " X", // +// "XXX", // +// "X", // +// "XXX"); + +// private Character N3 = new Character(// +// "XXX", // +// " X", // +// "XXX", // +// " X", // +// "XXX"); + +// private Character N4 = new Character(// +// "X X", // +// "X X", // +// "XXX", // +// " X", // +// " X"); + +// private Character N5 = new Character(// +// "XXX", // +// "X", // +// "XXX", // +// " X", // +// "XXX"); + +// private Character N6 = new Character(// +// "XXX", // +// "X", // +// "XXX", // +// "X X", // +// "XXX"); + +// private Character N7 = new Character(// +// "XXX", // +// " X", // +// " X", // +// " X", // +// " X"); + +// private Character N8 = new Character(// +// "XXX", // +// "X X", // +// "XXX", // +// "X X", // +// "XXX"); + +// private Character N9 = new Character(// +// "XXX", // +// "X X", // +// "XXX", // +// " X", // +// " X"); + +// private Character N0 = new Character(// +// "XXX", // +// "X X", // +// "X X", // +// "X X", // +// "XXX"); + +// private Map font = new HashMap<>(); + +// public LargeFont() { +// font.put(" ", SPACE); +// font.put("A", A); +// font.put("B", B); +// font.put("C", C); +// font.put("D", D); +// font.put("E", E); +// font.put("F", F); +// font.put("G", G); +// font.put("H", H); +// font.put("I", I); +// font.put("J", J); +// font.put("K", K); +// font.put("L", L); +// font.put("M", M); +// font.put("N", N); +// font.put("O", O); +// font.put("P", P); +// font.put("Q", Q); +// font.put("R", R); +// font.put("S", S); +// font.put("T", T); +// font.put("U", U); +// font.put("V", V); +// font.put("W", W); +// font.put("X", X); +// font.put("Y", Y); +// font.put("Z", Z); +// font.put("0", N0); +// font.put("1", N1); +// font.put("2", N2); +// font.put("3", N3); +// font.put("4", N4); +// font.put("5", N5); +// font.put("6", N6); +// font.put("7", N7); +// font.put("8", N8); +// font.put("9", N9); +// } + +// public int getHeight() { +// return 5; +// } + +// public Character get(String c) { +// return font.get(c); +// } + +// @Override +// public void setBlock(DirectionHelper dirHelper, Block block, FontMaterial mat, char dot) { +// block.setType(mat.blockMaterial.getItemType()); +// block.setData(mat.blockMaterial.getData()); +// } + +// @Override +// public FontMaterial parseMaterial(String val) { +// if (val == null || val.isEmpty()) +// val = "stone"; + +// byte data = 0; + +// String[] parts = val.split(":", 2); +// Material material = Material.matchMaterial(parts[0]); +// if (parts.length > 1) +// data = (byte) Integer.parseInt(parts[1]); + +// MaterialData materialData = new MaterialData(material, data); + +// return new FontMaterial(materialData); +// } +// } diff --git a/src/main/java/com/allocinit/skyjot/SkyJot.java b/src/main/java/com/allocinit/skyjot/SkyJot.java index a1fadec..093591a 100644 --- a/src/main/java/com/allocinit/skyjot/SkyJot.java +++ b/src/main/java/com/allocinit/skyjot/SkyJot.java @@ -1,75 +1,21 @@ package com.allocinit.skyjot; -import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; +import com.allocinit.bukkit.CommandPlugin; - -public class SkyJot extends JavaPlugin -{ +public class SkyJot extends CommandPlugin { private Map playerState = new HashMap<>(); - private SubCommand writeCommand = new WriteCommand(this); - private SubCommand undoCommand = new UndoCommand(this); - - @Override - public void onEnable() - { - this.getCommand("skyjot").setExecutor(new CommandExecutor() - { - @Override - public boolean onCommand(CommandSender sender, Command cmd, - String label, String [] args) - { - Player player = (Player) sender; - - if (!player.hasPermission("skyjot")) - { - player.sendMessage("&cPermission Denied"); - return true; - } - - if (args.length < 1) - { - writeUsage(player); - return true; - } - - String subCmd = args [0]; - - args = Arrays.copyOfRange(args, 1, args.length); - if ("write".equals(subCmd)) - writeCommand.doCommand(sender, args); - else if ("undo".equals(subCmd)) - undoCommand.doCommand(sender, args); - else - writeUsage(player); - - return true; - } - }); - - } - - private void writeUsage(Player player) - { - writeCommand.writeUsage(player); - undoCommand.writeUsage(player); - } + public SkyJot() { + super("skyjot"); - @Override - public void onDisable() - { + registerSubCommand(new WriteCommand(this)); + registerSubCommand(new UndoCommand(this)); } - public Map getPlayerState() - { + public Map getPlayerState() { return playerState; } } \ No newline at end of file diff --git a/src/main/java/com/allocinit/skyjot/SmallFont.java b/src/main/java/com/allocinit/skyjot/SmallFont.java new file mode 100644 index 0000000..e116e62 --- /dev/null +++ b/src/main/java/com/allocinit/skyjot/SmallFont.java @@ -0,0 +1,343 @@ +package com.allocinit.skyjot; + +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.Bisected; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.Slab; +import org.bukkit.block.data.type.Stairs; + +public class SmallFont implements Font { + private Character SPACE = new Character() { + @Override + public int getWidth() { + return 1; + } + }; + + private Character A = new Character(// + "⅃⁻L", // + "X_X", // + "X X"); + + private Character B = new Character(// + "X⁻L", // + "X⁻L", // + "X_Г"); + + private Character C = new Character(// + "⅃⁻L", // + "X", // + "˥_Г"); + + private Character D = new Character(// + "X⁻L", // + "X X", // + "X_Г"); + + private Character E = new Character(// + "X⁻⁻", // + "X⁻", // + "X__"); + + private Character F = new Character(// + "X⁻⁻", // + "X⁻", // + "X"); + + private Character G = new Character(// + "⅃⁻L", // + "X _", // + "˥_⅃"); + + private Character H = new Character(// + "X X", // + "X⁻X", // + "X X"); + + private Character I = new Character(// + "⁻X⁻", // + " X", // + "_X_"); + + private Character J = new Character(// + " X", // + " X", // + "˥_Г"); + + private Character K = new Character(// + "X ⅃", // + "XXГ", // + "X L"); + + private Character L = new Character(// + "X", // + "X", // + "X__"); + + private Character M = new Character(// + "L ⅃", // + "X⁻X", // + "X X"); + + private Character N = new Character(// + "L X", // + "XLX", // + "X ˥"); + + private Character O = new Character(// + "⅃⁻L", // + "X X", // + "˥_Г"); + + private Character P = new Character(// + "X⁻L", // + "X_Г", // + "X"); + + private Character Q = new Character(// + "⅃⁻L", // + "X X", // + "˥XX"); + + private Character R = new Character(// + "X⁻L", // + "X_Г", // + "X X"); + + private Character S = new Character(// + "⅃⁻⁻", // + " ⁻L", // + "˥_Г"); + + private Character T = new Character(// + "⁻X⁻", // + " X", // + " X"); + + private Character U = new Character(// + "X X", // + "X X", // + "˥XГ"); + + private Character V = new Character(// + "X X", // + "X X", // + " X"); + + private Character W = new Character(// + "X X", // + "X_X", // + "Г ˥"); + + private Character X = new Character(// + "˥_Г", // + " X", // + "⅃ L"); + + private Character Y = new Character(// + "X X", // + "˥_Г", // + " X"); + + private Character Z = new Character(// + "⁻⁻X", // + " ⅃Г", // + "⅃X_"); + + private Character N1 = new Character(// + "⅃X", // + " X", // + "_X_"); + + private Character N2 = new Character(// + "⅃⁻L", // + " _Г", // + "X__"); + + private Character N3 = new Character(// + "⁻⁻L", // + " ⁻X", // + "__Г"); + + private Character N4 = new Character(// + "X", // + "X⅃_", // + " X"); + + private Character N5 = new Character(// + "X⁻⁻", // + "⁻⁻X", // + "˥_Г"); + + private Character N6 = new Character(// + "⅃⁻⁻", // + "X⁻L", // + "˥_Г"); + + private Character N7 = new Character(// + "⁻⁻X", // + " ⅃Г", // + "⅃Г"); + + private Character N8 = new Character(// + "⅃⁻L", // + "⅃⁻L", // + "˥_Г"); + + private Character N9 = new Character(// + "⅃⁻L", // + "˥_X", // + " X"); + + private Character N0 = new Character(// + "⅃⁻L", // + "X X", // + "˥_Г"); + + private Character dot = new Character(// + "⅃⁻L", // + "X X", // + "˥_Г"); + + private Map font = new HashMap<>(); + + public SmallFont() { + font.put(" ", SPACE); + font.put(".", dot); + font.put("A", A); + font.put("B", B); + font.put("C", C); + font.put("D", D); + font.put("E", E); + font.put("F", F); + font.put("G", G); + font.put("H", H); + font.put("I", I); + font.put("J", J); + font.put("K", K); + font.put("L", L); + font.put("M", M); + font.put("N", N); + font.put("O", O); + font.put("P", P); + font.put("Q", Q); + font.put("R", R); + font.put("S", S); + font.put("T", T); + font.put("U", U); + font.put("V", V); + font.put("W", W); + font.put("X", X); + font.put("Y", Y); + font.put("Z", Z); + font.put("0", N0); + font.put("1", N1); + font.put("2", N2); + font.put("3", N3); + font.put("4", N4); + font.put("5", N5); + font.put("6", N6); + font.put("7", N7); + font.put("8", N8); + font.put("9", N9); + } + + public int getHeight() { + return 5; + } + + public Character get(String c) { + return font.get(c); + } + + private BlockData xx(DirectionHelper dirHelper, FontMaterial material, char dot) { + BlockData md; + + switch (dot) { + case 'X': + md = material.blockMaterial.createBlockData(); + break; + + case '⁻': + md = material.slabMaterial.createBlockData(); + ((Slab) md).setType(Slab.Type.TOP); + break; + + case '⅃': + md = material.stairMaterial.createBlockData(); + ((Stairs) md).setFacing(getBlockFace(dirHelper.getLocation(), 90)); + break; + + case 'L': + md = material.stairMaterial.createBlockData(); + ((Stairs) md).setFacing(getBlockFace(dirHelper.getLocation(), 270)); + break; + + case '˥': + md = material.stairMaterial.createBlockData(); + ((Stairs) md).setFacing(getBlockFace(dirHelper.getLocation(), 90)); + ((Stairs) md).setHalf(Bisected.Half.TOP); + break; + + case '_': + md = material.slabMaterial.createBlockData(); + ((Slab) md).setType(Slab.Type.BOTTOM); + break; + + case 'Г': + md = material.stairMaterial.createBlockData(); + ((Stairs) md).setFacing(getBlockFace(dirHelper.getLocation(), 270)); + ((Stairs) md).setHalf(Bisected.Half.TOP); + break; + + default: + return null; + } + + return md; + } + + @Override + public void setBlock(DirectionHelper dirHelper, Block block, FontMaterial mat, char dot) { + BlockData md = xx(dirHelper, mat, dot); + block.setBlockData(md); + } + + private BlockFace getBlockFace(Location location, float correction) { + float yaw = location.getYaw() + correction; + + yaw += 360; + yaw %= 360; + + if (yaw <= 45 || yaw >= 315) + return BlockFace.SOUTH; + + else if (yaw > 45 && yaw < 135) + return BlockFace.WEST; + + else if (yaw > 135 && yaw < 225) + return BlockFace.NORTH; + + else + return BlockFace.EAST; + } + + @Override + public FontMaterial parseMaterial(String material) { + return new FontMaterial(material); + } + + public static void main(String[] args) { + // SmallFont font = new SmallFont(); + // + // FontMaterial xx = font.parseMaterial("ACACIA"); + // + // System.out.println(font.xx(null, xx, '⁻')); + } + +} diff --git a/src/main/java/com/allocinit/skyjot/SubCommand.java b/src/main/java/com/allocinit/skyjot/SubCommand.java deleted file mode 100644 index 059895a..0000000 --- a/src/main/java/com/allocinit/skyjot/SubCommand.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.allocinit.skyjot; - -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - - -public interface SubCommand -{ - public void doCommand(CommandSender sender, String [] args); - - public void writeUsage(Player player); -} diff --git a/src/main/java/com/allocinit/skyjot/Undo.java b/src/main/java/com/allocinit/skyjot/Undo.java index 10e3464..c87a4dc 100644 --- a/src/main/java/com/allocinit/skyjot/Undo.java +++ b/src/main/java/com/allocinit/skyjot/Undo.java @@ -5,32 +5,24 @@ import org.bukkit.Location; import org.bukkit.block.Block; -import org.bukkit.material.MaterialData; +import org.bukkit.block.data.BlockData; +public class Undo { + private Map undoMap = new HashMap<>(); -public class Undo -{ - private Map undoMap = new HashMap<>(); - - public Undo() - { + public Undo() { } - public void saveLocation(Location where) - { - MaterialData what = where.getBlock().getState().getData(); + public void saveLocation(Location where) { + BlockData what = where.getBlock().getBlockData(); undoMap.put(where, what); } - public void undo() - { - for (Map.Entry entry : undoMap.entrySet()) - { - MaterialData data = entry.getValue(); - + public void undo() { + for (Map.Entry entry : undoMap.entrySet()) { + BlockData data = entry.getValue(); Block block = entry.getKey().getBlock(); - block.setType(data.getItemType()); - block.setData(data.getData()); + block.setBlockData(data); } undoMap.clear(); diff --git a/src/main/java/com/allocinit/skyjot/UndoCommand.java b/src/main/java/com/allocinit/skyjot/UndoCommand.java index 6f5e5f1..c912ddf 100644 --- a/src/main/java/com/allocinit/skyjot/UndoCommand.java +++ b/src/main/java/com/allocinit/skyjot/UndoCommand.java @@ -1,30 +1,28 @@ package com.allocinit.skyjot; +import com.allocinit.bukkit.SubCommand; + import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; - -public class UndoCommand implements SubCommand -{ - private SkyJot skyjot; - - public UndoCommand(SkyJot skyjot) - { - this.skyjot = skyjot; +public class UndoCommand extends SubCommand { + public UndoCommand(SkyJot plugin) { + super(plugin, "undo"); } - public void doCommand(CommandSender sender, String [] args) - { + public void doCommand(CommandSender sender, String[] args) { + checkPerm(sender, "skyjot.undo"); + Player player = (Player) sender; - Undo undo = skyjot.getPlayerState().get(player.getName()); + Undo undo = plugin.getPlayerState().get(player.getName()); if (undo != null) undo.undo(); } - public void writeUsage(Player player) - { + @Override + public void writeUsage(CommandSender player) { player.sendMessage("skyjot undo"); } } diff --git a/src/main/java/com/allocinit/skyjot/WriteCommand.java b/src/main/java/com/allocinit/skyjot/WriteCommand.java index 024d54f..17919d8 100644 --- a/src/main/java/com/allocinit/skyjot/WriteCommand.java +++ b/src/main/java/com/allocinit/skyjot/WriteCommand.java @@ -2,93 +2,95 @@ import java.util.Arrays; +import com.allocinit.bukkit.ErrorException; +import com.allocinit.bukkit.SubCommand; +import com.allocinit.skyjot.Character.Dot; + import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.material.MaterialData; +public class WriteCommand extends SubCommand { + public WriteCommand(SkyJot plugin) { + super(plugin, "write"); + } -public class WriteCommand implements SubCommand -{ - private SkyJot skyjot; - private Font font = new Font(); + // private LargeFont largeFont = new LargeFont(); + private SmallFont smallFont = new SmallFont(); - public WriteCommand(SkyJot skyjot) - { - this.skyjot = skyjot; - } + public void doCommand(CommandSender sender, String[] args) { + checkPerm(sender, "skyjot.write"); - public void doCommand(CommandSender sender, String [] args) - { Player player = (Player) sender; char justification = 'c'; DirectionHelper dirHelper = new DirectionHelper(); - MaterialData material = new MaterialData(Material.STONE); - dirHelper.setFromPlayerView(player); + String material = "QUARTZ"; + Font font = smallFont; // write [b:block type] [j:left|right|center] text ... - while (args.length > 4) - { - String arg = args [0]; + while (args.length > 4) { + String arg = args[0]; - if (arg.startsWith("j:")) - { + if (arg.startsWith("j:")) { justification = arg.charAt(2); - } - else if (arg.startsWith("b:")) - { - String val = arg.substring(2); - material = parseMaterial(val); - } - else + // } else if (arg.startsWith("f:")) { + // String val = arg.substring(2); + // if ("small".equals(val)) + // font = smallFont; + } else if (arg.startsWith("b:")) { + material = arg.substring(2); + if (material == null || !FontMaterial.allMaterials.contains(material)) { + throw new ErrorException( + "Invalid block type. Valid types are " + String.join(", ", FontMaterial.allMaterials)); + } + } else break; args = Arrays.copyOfRange(args, 1, args.length); } - if (args.length < 4) - { + // if (material == null) + // material = new MaterialData(Material.STONE); + + if (args.length < 4) { writeUsage(player); return; } + FontMaterial mat = font.parseMaterial(material); + Location where = player.getLocation(); - where.setX(parseCoord(where.getX(), args [0])); - where.setY(parseCoord(where.getY(), args [1])); - where.setZ(parseCoord(where.getZ(), args [2])); + where.setX(parseCoord(where.getX(), args[0])); + where.setY(parseCoord(where.getY(), args[1])); + where.setZ(parseCoord(where.getZ(), args[2])); Undo undo = new Undo(); - skyjot.getPlayerState().put(player.getName(), undo); + plugin.getPlayerState().put(player.getName(), undo); Location cursor = where.clone(); - String complete = ""; - for (int i = 3; i < args.length; i++) - complete += args [i] + " "; + String complete = String.join(" ", Arrays.copyOfRange(args, 3, args.length)); // For now complete = complete.toUpperCase(); - String [] lines = complete.split("\\\\N"); + String[] lines = complete.split("\\\\N"); + + for (String line : lines) { + dirHelper.setFromPlayerView(player); - for (String line : lines) - { - if (justification == 'c' || justification == 'r') - { + if (justification == 'c' || justification == 'r') { // Get a total width int width = 0; int letterCnt = 0; - for (int j = 0; j < line.length(); j++) - { + for (int j = 0; j < line.length(); j++) { String letter = line.substring(j, j + 1); Character c = font.get(letter); - if (c != null) - { + if (c != null) { letterCnt++; width += c.getWidth(); } @@ -103,8 +105,7 @@ else if (justification == 'r') dirHelper.move(cursor, -width, 0); } - for (int j = 0; j < line.length(); j++) - { + for (int j = 0; j < line.length(); j++) { String letter = line.substring(j, j + 1); Character c = font.get(letter); @@ -112,17 +113,15 @@ else if (justification == 'r') if (c == null) continue; - for (Integer [] offset : c.getPath()) - { + for (Dot dot : c.getPath()) { Location blockLoc = cursor.clone(); - dirHelper.move(blockLoc, offset [0], offset [1]); + dirHelper.move(blockLoc, dot.getX(), dot.getY()); undo.saveLocation(blockLoc); Block block = blockLoc.getBlock(); - block.setType(material.getItemType()); - block.setData(material.getData()); + font.setBlock(dirHelper, block, mat, dot.getDot()); } dirHelper.move(cursor, c.getWidth() + 1, 0); @@ -135,22 +134,8 @@ else if (justification == 'r') } } - private MaterialData parseMaterial(String val) - { - byte data = 0; - - String [] parts = val.split(":", 2); - Material material = Material.matchMaterial(parts [0]); - if (parts.length > 1) - data = (byte) Integer.parseInt(parts [1]); - - return new MaterialData(material, data); - } - - private double parseCoord(double d, String coord) - { - if (coord.startsWith("~")) - { + private double parseCoord(double d, String coord) { + if (coord.startsWith("~")) { if (coord.length() > 1) d += Integer.parseInt(coord.substring(1)); return d; @@ -159,10 +144,8 @@ private double parseCoord(double d, String coord) return Integer.parseInt(coord); } - public void writeUsage(Player player) - { - player.sendMessage( - "skyjot write [b:block type] [a:left|right|center] text ..."); + @Override + public void writeUsage(CommandSender player) { + player.sendMessage("skyjot write [b:block type] [a:left|right|center] text ..."); } - } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index f7351cf..2c4f063 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,11 +1,7 @@ -name: RW +name: SkyJot main: com.allocinit.skyjot.SkyJot -version: 1.0.0-SNAPSHOT +version: 2.0.0-SNAPSHOT +api-version: 1.13 commands: skyjot: - -permissions: - skyjot: - default: op - \ No newline at end of file