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