Skip to content

Commit 5e837cb

Browse files
committed
Added Json Support, better command completion
1 parent 2150838 commit 5e837cb

File tree

7 files changed

+328
-63
lines changed

7 files changed

+328
-63
lines changed

pom.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>io.github.realMorgon</groupId>
88
<artifactId>SignTextGenerator</artifactId>
9-
<version>1.0.0</version>
9+
<version>1.1.0</version>
1010
<packaging>jar</packaging>
1111

1212
<name>SignTextGenerator</name>
@@ -77,5 +77,10 @@
7777
<artifactId>acf-paper</artifactId>
7878
<version>0.5.1-SNAPSHOT</version>
7979
</dependency>
80+
<dependency>
81+
<groupId>com.fasterxml.jackson.core</groupId>
82+
<artifactId>jackson-databind</artifactId>
83+
<version>2.16.1</version>
84+
</dependency>
8085
</dependencies>
8186
</project>

src/main/java/io/github/realMorgon/signTextGenerator/GiveSignCommand.java

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,34 @@
11
package io.github.realMorgon.signTextGenerator;
22

33
import co.aikar.commands.BaseCommand;
4+
import co.aikar.commands.CommandManager;
45
import co.aikar.commands.annotation.*;
6+
import com.fasterxml.jackson.databind.ObjectMapper;
57
import org.bukkit.ChatColor;
68
import org.bukkit.Material;
79
import org.bukkit.block.Sign;
810
import org.bukkit.entity.Player;
911
import org.bukkit.inventory.ItemStack;
1012
import org.bukkit.inventory.meta.BlockStateMeta;
1113

14+
import java.io.File;
15+
import java.io.IOException;
16+
import java.io.InputStream;
17+
import java.net.URISyntaxException;
18+
import java.net.URL;
19+
import java.util.ArrayList;
20+
import java.util.Enumeration;
21+
import java.util.List;
22+
import java.util.jar.JarEntry;
23+
import java.util.jar.JarFile;
24+
1225
@CommandAlias("givesign")
1326
public class GiveSignCommand extends BaseCommand {
1427

1528
@Default
16-
@Syntax("<material> <color> <text>")
17-
@CommandCompletion("oak|spruce|birch|jungle|acacia|dark_oak|mangrove|cherry|bamboo|crimson|warped black|dark_blue|dark_green|dark_aqua|dark_red|dark_purple|gold|gray|dark_gray|blue|green|aqua|red|light_purple|yellow|white <text>")
18-
public void giveSign(String material, String color , String text, Player player) {
29+
@Syntax("<material> <color> <font> <text>")
30+
@CommandCompletion("@material @color @font")
31+
public void giveSign(String material, String color, String font , String text, Player player) {
1932

2033
Material signMaterial;
2134
ChatColor signColor;
@@ -32,12 +45,37 @@ public void giveSign(String material, String color , String text, Player player)
3245
return;
3346
}
3447

35-
if (text.length() % 2 != 0) {
48+
InputStream inputStream;
49+
try {
50+
inputStream = SignTextGenerator.getPlugin().getResource("fonts/" + font + ".json");
51+
}catch (Exception IOException) {
52+
player.sendMessage("Fehler bei der Textgenerierung. Stelle sicher, dass die Schriftart existiert");
53+
return;
54+
}
55+
ObjectMapper objectMapper = new ObjectMapper();
56+
JsonLayout jsonLayout;
57+
try {
58+
jsonLayout = objectMapper.readValue(inputStream, JsonLayout.class);
59+
}catch (Exception IOException) {
60+
player.sendMessage("Fehler bei der Textgenerierung. Stelle sicher, dass die Schriftart existiert");
61+
return;
62+
}
63+
int maxCharsPerSign = jsonLayout.maxCharsPerSign;
64+
if (material.contains("hanging")) {
65+
maxCharsPerSign = Math.round((float) maxCharsPerSign / 2);
66+
}
67+
68+
while (text.length() % maxCharsPerSign != 0) {
3669
text += " ";
3770
}
3871

39-
for (int i = 0; i < text.length() / 2; i++) {
40-
String [] signText = TextGeneration.generateText(text.substring(i * 2, i * 2 + 2));
72+
for (int i = 0; i < text.length() / maxCharsPerSign; i++) {
73+
String currentChars = text.substring(i * maxCharsPerSign, i * maxCharsPerSign + maxCharsPerSign);
74+
String [] signText = TextGeneration.generateText(currentChars, font);
75+
if (signText == null) {
76+
player.sendMessage("Fehler bei der Textgenerierung. Stelle sicher, dass die Schriftart existiert und die gewünschten Zeichen enthält.");
77+
return;
78+
}
4179
ItemStack sign = new ItemStack(signMaterial);
4280
BlockStateMeta meta = (BlockStateMeta) sign.getItemMeta();
4381
Sign signBlock = (Sign) meta.getBlockState();
@@ -47,7 +85,7 @@ public void giveSign(String material, String color , String text, Player player)
4785
signBlock.setLine(3, signColor + signText[3]);
4886
signBlock.setGlowingText(true);
4987
meta.setBlockState(signBlock);
50-
meta.setDisplayName(signColor + "§r" + text.substring(0, (i + 1) * 2 - 2) + text.substring(i * 2, i * 2 + 2).toUpperCase() + text.substring(i * 2 + 2));
88+
meta.setDisplayName(signColor + "§r" + text.substring(0, (i + 1) * maxCharsPerSign - maxCharsPerSign) + ChatColor.BOLD + currentChars + ChatColor.RESET + text.substring(i * maxCharsPerSign + maxCharsPerSign));
5189
sign.setItemMeta(meta);
5290
player.getInventory().addItem(sign);
5391
}
Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,90 @@
11
package io.github.realMorgon.signTextGenerator;
22

33
import co.aikar.commands.PaperCommandManager;
4+
import org.bukkit.ChatColor;
5+
import org.bukkit.Material;
46
import org.bukkit.plugin.java.JavaPlugin;
57

8+
import java.io.File;
9+
import java.net.URISyntaxException;
10+
import java.net.URL;
11+
import java.util.ArrayList;
12+
import java.util.Collection;
13+
import java.util.Enumeration;
14+
import java.util.List;
15+
import java.util.jar.JarEntry;
16+
import java.util.jar.JarFile;
17+
618
public final class SignTextGenerator extends JavaPlugin {
719

20+
private static SignTextGenerator plugin;
21+
822
@Override
923
public void onEnable() {
1024
// Plugin startup logic
11-
TextGeneration.initCharMap();
25+
// TextGeneration.initCharMap();
26+
27+
plugin = this;
1228

1329
PaperCommandManager manager = new PaperCommandManager(this);
30+
31+
manager.getCommandCompletions().registerAsyncCompletion("material", c -> {
32+
Collection<String> materialCompletions = new ArrayList<>();
33+
for (Material material : Material.values()) {
34+
if (material.name().endsWith("_SIGN") && !material.name().contains("WALL")) {
35+
String baseName = material.name().replace("_SIGN", "").toLowerCase();
36+
materialCompletions.add(baseName);
37+
}
38+
}
39+
return materialCompletions;
40+
});
41+
42+
manager.getCommandCompletions().registerAsyncCompletion("color", c -> {
43+
Collection<String> colorCompletions = new ArrayList<>();
44+
for (ChatColor color : ChatColor.values()) {
45+
if (color.isColor()) {
46+
colorCompletions.add(color.name().toLowerCase());
47+
}
48+
}
49+
return colorCompletions;
50+
});
51+
52+
manager.getCommandCompletions().registerAsyncCompletion("font", c -> {
53+
List<String> fileNames = new ArrayList<>();
54+
URL jarUrl = GiveSignCommand.class.getProtectionDomain().getCodeSource().getLocation();
55+
try {
56+
File jarFile = new File(jarUrl.toURI());
57+
try (JarFile jar = new JarFile(jarFile)) {
58+
Enumeration<JarEntry> entries = jar.entries();
59+
while (entries.hasMoreElements()) {
60+
JarEntry entry = entries.nextElement();
61+
if (entry.getName().startsWith("fonts/") && !entry.isDirectory()) {
62+
fileNames.add(entry.getName().substring("fonts/".length()));
63+
}
64+
}
65+
}
66+
}catch (Exception e){}
67+
68+
Collection<String> fontCompletions = new ArrayList<>();
69+
for (String fileName : fileNames) {
70+
String fontName = fileName.replace(".json", "");
71+
fontCompletions.add(fontName);
72+
}
73+
74+
return fontCompletions;
75+
});
76+
1477
manager.registerCommand(new GiveSignCommand());
78+
1579
}
1680

1781
@Override
1882
public void onDisable() {
1983
// Plugin shutdown logic
2084
}
85+
86+
public static SignTextGenerator getPlugin() {
87+
return plugin;
88+
}
89+
2190
}
Lines changed: 33 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,40 @@
11
package io.github.realMorgon.signTextGenerator;
22

3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import org.bukkit.Bukkit;
5+
6+
import java.io.File;
7+
import java.io.InputStream;
38
import java.util.HashMap;
49

510
public class TextGeneration {
611

7-
public static String[] generateText(String inputText) {
8-
String text = inputText.toLowerCase();
12+
public static String[] generateText(String text, String font) {
913
String[] lines = new String[4];
14+
InputStream inputStream;
15+
16+
try {
17+
inputStream = SignTextGenerator.getPlugin().getResource("fonts/" + font + ".json");
18+
}catch (Exception IOException) {
19+
return null;
20+
}
21+
ObjectMapper objectMapper = new ObjectMapper();
22+
JsonLayout jsonLayout;
23+
try {
24+
jsonLayout = objectMapper.readValue(inputStream, JsonLayout.class);
25+
}catch (Exception IOException) {
26+
return null;
27+
}
28+
HashMap<Character, String[]> charMap = jsonLayout.charMap;
29+
1030
for (int i = 0; i < text.length(); i++) {
11-
char c = text.charAt(i);
12-
String[] charLines = charMap.get(c);
31+
String[] charLines;
32+
try {
33+
char c = text.charAt(i);
34+
charLines = charMap.get(c);
35+
}catch (Exception IOException) {
36+
return null;
37+
}
1338
for (int j = 0; j < 4; j++) {
1439
if (lines[j] == null) {
1540
lines[j] = charLines[j];
@@ -21,54 +46,9 @@ public static String[] generateText(String inputText) {
2146
return lines;
2247
}
2348

24-
static HashMap<Character, String[]> charMap = new HashMap<>(); // HashMap to store the characters and their representation on a sign
25-
public static void initCharMap() {
26-
charMap.put(' ', new String[] {" ", " ", " ", " "});
27-
charMap.put('a', new String[] {"████","█ █", "████", "█ █"});
28-
charMap.put('b', new String[] {"███ ", "█▄▄█", "█▀▀█", "███ "});
29-
charMap.put('c', new String[] {"████", "█ ", "█ ", "████"});
30-
charMap.put('d', new String[] {"███ ", "█ █", "█ █", "███ "});
31-
charMap.put('e', new String[] {"████", "█▄▄▄", "█▀▀▀", "████"});
32-
charMap.put('f', new String[] {"████", "█▄▄▄", "█▀▀▀", "█ "});
33-
charMap.put('g', new String[] {"████", "█ ", "█ ▀█", "████"});
34-
charMap.put('h', new String[] {"█ █ ", "█ █ ", "███ ", "█ █ "});
35-
charMap.put('i', new String[] {"████", " █ ", " █ ", "████"});
36-
charMap.put('j', new String[] {"████", " █ ", " █ ", "██ "});
37-
charMap.put('k', new String[] {"█ █", "█ █ ", "█ █ ", "█ █"});
38-
charMap.put('l', new String[] {"█ ", "█ ", "█ ", "████"});
39-
charMap.put('m', new String[] {"█ █", "██ ██", "█ █ █", "█ █"});
40-
charMap.put('n', new String[] {"█ █", "██ █", "█ █ █", "█ ██"});
41-
charMap.put('o', new String[] {"████", "█ █", "█ █", "████"});
42-
charMap.put('p', new String[] {"████", "█ █", "████", "█ "});
43-
charMap.put('q', new String[] {"████", "█ █", "█ █ ", " █ █"});
44-
charMap.put('r', new String[] {"████", "█ █", "████", "█ █ "});
45-
charMap.put('s', new String[] {" ███", "█▄▄▄", "▀▀▀█", "███ "});
46-
charMap.put('t', new String[] {"████", " █ ", " █ ", " █ "});
47-
charMap.put('u', new String[] {"█ █", "█ █", "█ █", " ███ "});
48-
charMap.put('v', new String[] {"█ █", "█ █", "█ █", " █ █ "});
49-
charMap.put('w', new String[] {"█ █", "█ █ █", "█ █ █", " █ █ "});
50-
charMap.put('x', new String[] {"█ █", " █ █ ", " █ █ ", "█ █"});
51-
charMap.put('y', new String[] {"█ █", " █ █ ", " █ ", " █ "});
52-
charMap.put('z', new String[] {"████", " █ ", " █ ", "████"});
53-
charMap.put('0', new String[] {" ██ ", "█ █", "█ █", " ██ "});
54-
charMap.put('1', new String[] {"██ ", "█ █ ", " █ ", "████"});
55-
charMap.put('2', new String[] {" ██ ", "▀ ▄█", "█▀ ", "████"});
56-
charMap.put('3', new String[] {"███ ", "▄▄▄█", "▀▀▀█", "███ "});
57-
charMap.put('4', new String[] {"█ █", "█ █", "████", " █"});
58-
charMap.put('5', new String[] {"████", "█▄▄▄", "▀▀▀█", "███ "});
59-
charMap.put('6', new String[] {"███ ", "█▄▄▄", "█▀▀█", "███ "});
60-
charMap.put('7', new String[] {"████", "▀ █", " █ ", " █ "});
61-
charMap.put('8', new String[] {" ██ ", "█▄▄█", "█▀▀█", " ██ "});
62-
charMap.put('9', new String[] {"████", "█▄▄█", "▀▀▀█", "███ "});
63-
charMap.put('!', new String[] {" █ ", " █ ", " ", " █ "});
64-
charMap.put('?', new String[] {" ██ ", "▀ ▄█", " █ ", " █ "});
65-
charMap.put('+', new String[] {" █ ", " ████", " █ ", " "});
66-
charMap.put('-', new String[] {" ", " ████", " ", " "});
67-
charMap.put('_', new String[] {" ", " ", " ", "████"});
68-
charMap.put('=', new String[] {" ", " ████", " ", " ████"});
69-
charMap.put('(', new String[] {" █ ", " █ ", " █ ", " █ "});
70-
charMap.put(')', new String[] {" █ ", " █ ", " █ ", " █ "});
71-
charMap.put(':', new String[] {" ", " █ ", " ", " █ "});
72-
}
49+
}
7350

51+
class JsonLayout {
52+
public int maxCharsPerSign;
53+
public HashMap<Character, String[]> charMap;
7454
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
{
2+
"maxCharsPerSign" : 2,
3+
"charMap" : {
4+
" ": [" ", " ", " ", " "],
5+
"a": ["████","█ █", "████", "█ █"],
6+
"b": ["███ ", "█▄▄█", "█▀▀█", "███ "],
7+
"c": ["████", "", "", "████"],
8+
"d": ["███ ", "█ █", "█ █", "███ "],
9+
"e": ["████", "█▄▄▄", "█▀▀▀", "████"],
10+
"f": ["████", "█▄▄▄", "█▀▀▀", ""],
11+
"g": ["████", "", "█ ▀█", "████"],
12+
"h": ["█ █ ", "█ █ ", "███ ", "█ █ "],
13+
"i": ["████", "", "", "████"],
14+
"j": ["████", "", "", "██ "],
15+
"k": ["█ █", "█ █ ", "█ █ ", "█ █"],
16+
"l": ["", "", "", "████"],
17+
"m": ["█ █", "██ ██", "█ █ █", "█ █"],
18+
"n": ["█ █", "██ █", "█ █ █", "█ ██"],
19+
"o": ["████", "█ █", "█ █", "████"],
20+
"p": ["████", "█ █", "████", ""],
21+
"q": ["████", "█ █", "█ █ ", " █ █"],
22+
"r": ["████", "█ █", "████", "█ █ "],
23+
"s": [" ███", "█▄▄▄", "▀▀▀█", "███ "],
24+
"t": ["████", "", "", ""],
25+
"u": ["█ █", "█ █", "█ █", " ███ "],
26+
"v": ["█ █", "█ █", "█ █", " █ █ "],
27+
"w": ["█ █", "█ █ █", "█ █ █", " █ █ "],
28+
"x": ["█ █", " █ █ ", " █ █ ", "█ █"],
29+
"y": ["█ █", " █ █ ", "", ""],
30+
"z": ["████", "", "", "████"],
31+
"A": ["████","█ █", "████", "█ █"],
32+
"B": ["███ ", "█▄▄█", "█▀▀█", "███ "],
33+
"C": ["████", "", "", "████"],
34+
"D": ["███ ", "█ █", "█ █", "███ "],
35+
"E": ["████", "█▄▄▄", "█▀▀▀", "████"],
36+
"F": ["████", "█▄▄▄", "█▀▀▀", ""],
37+
"G": ["████", "", "█ ▀█", "████"],
38+
"H": ["█ █ ", "█ █ ", "███ ", "█ █ "],
39+
"I": ["████", "", "", "████"],
40+
"J": ["████", "", "", "██ "],
41+
"K": ["█ █", "█ █ ", "█ █ ", "█ █"],
42+
"L": ["", "", "", "████"],
43+
"M": ["█ █", "██ ██", "█ █ █", "█ █"],
44+
"N": ["█ █", "██ █", "█ █ █", "█ ██"],
45+
"O": ["████", "█ █", "█ █", "████"],
46+
"P": ["████", "█ █", "████", ""],
47+
"Q": ["████", "█ █", "█ █ ", " █ █"],
48+
"R": ["████", "█ █", "████", "█ █ "],
49+
"S": [" ███", "█▄▄▄", "▀▀▀█", "███ "],
50+
"T": ["████", "", "", ""],
51+
"U": ["█ █", "█ █", "█ █", " ███ "],
52+
"V": ["█ █", "█ █", "█ █", " █ █ "],
53+
"W": ["█ █", "█ █ █", "█ █ █", " █ █ "],
54+
"X": ["█ █", " █ █ ", " █ █ ", "█ █"],
55+
"Y": ["█ █", " █ █ ", "", ""],
56+
"Z": ["████", "", "", "████"],
57+
"0": [" ██ ", "█ █", "█ █", " ██ "],
58+
"1": ["██ ", "█ █ ", "", "████"],
59+
"2": [" ██ ", "▀ ▄█", "█▀ ", "████"],
60+
"3": ["███ ", "▄▄▄█", "▀▀▀█", "███ "],
61+
"4": ["█ █", "█ █", "████", ""],
62+
"5": ["████", "█▄▄▄", "▀▀▀█", "███ "],
63+
"6": ["███ ", "█▄▄▄", "█▀▀█", "███ "],
64+
"7": ["████", "▀ █", "", ""],
65+
"8": [" ██ ", "█▄▄█", "█▀▀█", " ██ "],
66+
"9": ["████", "█▄▄█", "▀▀▀█", "███ "],
67+
"!": ["", "", " ", ""],
68+
"?": [" ██ ", "▀ ▄█", "", ""],
69+
"+": ["", " ████", "", " "],
70+
"-": [" ", " ████", " ", " "],
71+
"_": [" ", " ", " ", "████"],
72+
"=": [" ", " ████", " ", " ████"],
73+
"(": ["", "", "", ""],
74+
")": ["", "", "", ""],
75+
":": [" ", "", " ", ""]
76+
}
77+
}

0 commit comments

Comments
 (0)