9
0
mirror of https://github.com/Xiao-MoMi/Custom-Nameplates.git synced 2026-01-04 15:31:47 +00:00
This commit is contained in:
Xiao-MoMi
2023-04-04 22:51:26 +08:00
parent 62b9ad7b95
commit c38463fed6
263 changed files with 7065 additions and 124 deletions

View File

@@ -4,7 +4,7 @@ plugins {
}
group = 'net.momirealms'
version = '2.2.0.2'
version = '2.2.0.3'
repositories {
mavenCentral()

View File

@@ -149,7 +149,6 @@ public final class CustomNameplates extends JavaPlugin {
fontManager.unload();
backgroundManager.unload();
dataManager.unload();
configManager.load();
messageManager.load();
dataManager.load();
@@ -159,7 +158,6 @@ public final class CustomNameplates extends JavaPlugin {
// team manager must before nameplates manager
teamManager.load();
nameplateManager.load();
chatBubblesManager.load();
backgroundManager.load();
bossBarManager.load();

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.api;
import net.momirealms.customnameplates.CustomNameplates;

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.api.events;
import org.bukkit.entity.Player;

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.data;
import java.util.UUID;

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.data;
public class SqlConstants {

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.data;
public enum StorageType {

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.helper;
import net.momirealms.customnameplates.CustomNameplates;
@@ -122,6 +139,6 @@ public class VersionHelper {
}
public boolean isLatest() {
return isLatest;
return isLatest || !ConfigManager.checkUpdate;
}
}

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.listener;
import net.momirealms.customnameplates.manager.ChatBubblesManager;

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.listener;
import mineverse.Aust1n46.chat.api.events.VentureChatEvent;

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.listener.packet;
import com.comphenix.protocol.PacketType;

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.manager;
import net.momirealms.customnameplates.CustomNameplates;

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.manager;
import net.momirealms.customnameplates.object.Function;
@@ -6,6 +23,8 @@ import org.bukkit.Bukkit;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File;
public class ConfigManager extends Function {
public static String namespace;
@@ -34,6 +53,7 @@ public class ConfigManager extends Function {
public static boolean enableBubbles;
public static boolean enableBackground;
public static boolean enableImages;
public static int default_width;
@Override
public void load(){
@@ -45,6 +65,7 @@ public class ConfigManager extends Function {
loadModules(config);
loadIntegrations(config);
loadResourcePack(config);
loadOtherSettings(config);
}
private void loadIntegrations(ConfigurationSection config) {
@@ -70,7 +91,6 @@ public class ConfigManager extends Function {
backgrounds_folder_path = section.getString("image-path.backgrounds","font\\backgrounds\\");
space_split_folder_path = section.getString("image-path.space-split","font\\base\\");
images_folder_path = section.getString("image-path.images","font\\images\\");
thin_font = section.getBoolean("use-thin-font",false);
extractShader = section.getBoolean("extract-shader",true);
extractBars = section.getBoolean("extract-bar-image",true);
}
@@ -88,6 +108,21 @@ public class ConfigManager extends Function {
}
}
private void loadOtherSettings(ConfigurationSection config) {
ConfigurationSection section = config.getConfigurationSection("other-settings");
if (section != null) {
default_width = section.getInt("default-character-width", 8);
}
if (enableNameplates) {
YamlConfiguration np_config = ConfigUtils.getConfig("configs" + File.separator + "nameplate.yml");
thin_font = np_config.getBoolean("thin-font", false);
}
else {
thin_font = false;
}
}
public static String getMiniMessageFontTag() {
return "<font:" + namespace + ":" + font + ">";
}

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.manager;
import net.momirealms.customnameplates.CustomNameplates;

View File

@@ -1,17 +1,42 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.manager;
import me.clip.placeholderapi.PlaceholderAPI;
import net.momirealms.customnameplates.CustomNameplates;
import net.momirealms.customnameplates.helper.Log;
import net.momirealms.customnameplates.object.Function;
import net.momirealms.customnameplates.object.SimpleChar;
import net.momirealms.customnameplates.object.font.ASCIIWidth;
import net.momirealms.customnameplates.object.font.OffsetFont;
import net.momirealms.customnameplates.object.font.UnicodeWidth;
import net.momirealms.customnameplates.object.font.ThinASCIIWidth;
import net.momirealms.customnameplates.utils.AdventureUtils;
import net.momirealms.customnameplates.utils.ConfigUtils;
import org.apache.commons.lang.StringEscapeUtils;
import org.bukkit.configuration.file.YamlConfiguration;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Objects;
@@ -19,39 +44,60 @@ public class FontManager extends Function {
private final CustomNameplates plugin;
private final HashMap<Character, Integer> customImageWidth;
private final HashMap<Character, Integer> asciiWidth;
public FontManager(CustomNameplates plugin) {
this.plugin = plugin;
this.customImageWidth = new HashMap<>();
this.customImageWidth = new HashMap<>(1024);
this.asciiWidth = new HashMap<>();
}
@Override
public void load() {
this.saveFonts();
this.loadASCIIWidth();
this.loadUnicodesWidth();
this.loadCustomWidth();
}
@Override
public void unload() {
customImageWidth.clear();
asciiWidth.clear();
}
private void loadASCIIWidth() {
if (ConfigManager.thin_font)
for (int i = 0; i < UnicodeWidth.values().length; i++)
customImageWidth.put(UnicodeWidth.values()[i].getCharacter(), UnicodeWidth.values()[i].getWidth());
for (int i = 0; i < ThinASCIIWidth.values().length; i++)
asciiWidth.put(ThinASCIIWidth.values()[i].getCharacter(), ThinASCIIWidth.values()[i].getWidth());
else
for (int i = 0; i < ASCIIWidth.values().length; i++)
customImageWidth.put(ASCIIWidth.values()[i].getCharacter(), ASCIIWidth.values()[i].getWidth());
asciiWidth.put(ASCIIWidth.values()[i].getCharacter(), ASCIIWidth.values()[i].getWidth());
}
private void loadCustomWidth() {
for (SimpleChar simpleChar : plugin.getImageManager().getCharacterMap().values()) {
for (int i = 0; i < ASCIIWidth.values().length; i++)
customImageWidth.put(ASCIIWidth.values()[i].getCharacter(), ASCIIWidth.values()[i].getWidth());
for (SimpleChar simpleChar : plugin.getImageManager().getCharacterMap().values())
customImageWidth.put(simpleChar.getChars(), simpleChar.getWidth());
}
YamlConfiguration config = ConfigUtils.getConfig("configs" + File.separator + "image-width.yml");
for (String image : config.getKeys(false)) {
customImageWidth.put(AdventureUtils.stripAllTags(PlaceholderAPI.setPlaceholders(null, image)).charAt(0), config.getInt(image, 8));
String character = AdventureUtils.stripAllTags(PlaceholderAPI.setPlaceholders(null, image));
if (character.length() == 1) customImageWidth.put(character.charAt(0), config.getInt(image, 8));
}
}
private void saveFonts() {
File font_file = new File(plugin.getDataFolder(), "unicodes");
if (!font_file.exists()) {
for (int i = 0; i < 256; i++) {
saveResource("unicodes" + File.separator + "unicode_page_" + String.format("%02x", i) + ".png");
}
}
File template_file = new File(plugin.getDataFolder(), "templates");
if (!template_file.exists()) {
plugin.saveResource("templates" + File.separator + "default.json", false);
plugin.saveResource("templates" + File.separator + "unicode.json", false);
}
}
@@ -64,8 +110,16 @@ public class FontManager extends Function {
return plugin.getFontManager().getShortestNegChars(totalWidth + totalWidth % 2 + 1);
}
// All the characters
public int getCharWidth(char c) {
return Objects.requireNonNullElse(customImageWidth.get(c), 8);
return Objects.requireNonNullElse(customImageWidth.get(c), ConfigManager.default_width);
}
// Player name
public int getNameCharWidth(char c) {
Integer width = asciiWidth.get(c);
if (width != null) return width;
return Objects.requireNonNullElse(customImageWidth.get(c), ConfigManager.default_width);
}
public int getTotalWidth(String text) {
@@ -77,6 +131,15 @@ public class FontManager extends Function {
return n + length;
}
public int getTotalPlayerNameWidth(String text) {
int length = text.length();
int n = 0;
for (int i = 0; i < length; i++) {
n += getNameCharWidth(text.charAt(i));
}
return n + length;
}
public String getOffset(int offset) {
if (offset >= 0) {
return getShortestPosChars(offset);
@@ -189,4 +252,93 @@ public class FontManager extends Function {
}
return stringBuilder.toString();
}
private void loadUnicodesWidth() {
File[] files = new File(CustomNameplates.getInstance().getDataFolder(), "unicodes").listFiles();
if (files == null) return;
for (File file : files) {
if (!file.getName().endsWith(".png")) continue;
String unicodeStr = file.getName().substring(file.getName().length() - 6, file.getName().length() - 4);
try {
BufferedImage bufferedImage = ImageIO.read(file);
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
int single = width / 16;
int max_y = height / single;
for (int i = 0; i < 16; i++) {
for (int j = 0; j < max_y; j++) {
int x_final = i * single;
outer:
for (int x = i * single; x < (i+1) * single; x++) {
for (int y = j * single; y < (j+1) * single; y++) {
int rgb = bufferedImage.getRGB(x, y);
int alpha = (rgb >> 24) & 0xff;
if (alpha != 0) {
x_final = x;
continue outer;
}
}
}
int single_real_width = (int) (((double) (x_final - i * single) / single * 8) + 1);
String unicode = "\\u" + unicodeStr + String.format("%02x", i + j * 16);
String unicodeFinalStr = StringEscapeUtils.unescapeJava(unicode);
customImageWidth.put(unicodeFinalStr.charAt(0), single_real_width);
}
}
}
catch (IOException ignored) {
Log.warn("Error occurred when reading png files");
}
}
}
@Nullable
public InputStream getResource(@NotNull String filename) {
try {
URL url = plugin.getClass().getClassLoader().getResource(filename);
if (url == null) {
return null;
}
URLConnection connection = url.openConnection();
connection.setUseCaches(false);
return connection.getInputStream();
} catch (IOException ex) {
return null;
}
}
public void saveResource(@NotNull String resourcePath) {
if (resourcePath.equals("")) {
throw new IllegalArgumentException("ResourcePath cannot be null or empty");
}
resourcePath = resourcePath.replace('\\', '/');
InputStream in = getResource(resourcePath);
if (in == null) {
return;
}
File outFile = new File(plugin.getDataFolder(), resourcePath);
int lastIndex = resourcePath.lastIndexOf('/');
File outDir = new File(plugin.getDataFolder(), resourcePath.substring(0, Math.max(lastIndex, 0)));
if (!outDir.exists()) {
outDir.mkdirs();
}
try {
if (!outFile.exists()) {
OutputStream out = new FileOutputStream(outFile);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.close();
in.close();
}
} catch (IOException ex) {
Log.warn("Could not save " + outFile.getName() + " to " + outFile);
}
}
}

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.manager;
import net.momirealms.customnameplates.CustomNameplates;

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.manager;
import net.momirealms.customnameplates.object.Function;

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.manager;
import net.momirealms.customnameplates.CustomNameplates;
@@ -160,7 +177,7 @@ public class NameplateManager extends Function {
}
public String getNameplatePrefix(String text, NameplateConfig nameplate) {
int totalWidth = plugin.getFontManager().getTotalWidth(text);
int totalWidth = plugin.getFontManager().getTotalPlayerNameWidth(text);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(plugin.getFontManager().getShortestNegChars(totalWidth % 2 == 0 ? totalWidth + nameplate.left().getWidth() : totalWidth + nameplate.left().getWidth() + 1))
.append(nameplate.left().getChars()).append(OffsetFont.NEG_1.getCharacter());

View File

@@ -41,22 +41,26 @@ public class PlaceholderManager extends Function {
private final NameplatePlaceholders nameplatePlaceholders;
private final Pattern placeholderPattern = Pattern.compile("%([^%]*)%");
private final HashSet<Integer> descent_fonts;
private final HashSet<Integer> descent_unicode_fonts;
private final HashMap<String, NameplateText> nameplateTextMap;
private final HashMap<String, BackGroundText> backGroundTextMap;
private final HashMap<String, StaticText> stringStaticTextMap;
private final HashMap<String, DescentText> descentTextMap;
private final HashMap<String, DescentText> descentUnicodeMap;
private final HashMap<String, ConditionalTexts> conditionalTextsMap;
private final HashMap<String, VanillaHud> vanillaHudMap;
public PlaceholderManager(CustomNameplates plugin) {
this.nameplatePlaceholders = new NameplatePlaceholders(plugin, this);
this.descent_fonts = new HashSet<>();
this.descent_unicode_fonts = new HashSet<>();
this.nameplateTextMap = new HashMap<>();
this.backGroundTextMap = new HashMap<>();
this.stringStaticTextMap = new HashMap<>();
this.descentTextMap = new HashMap<>();
this.conditionalTextsMap = new HashMap<>();
this.vanillaHudMap = new HashMap<>();
this.descentUnicodeMap = new HashMap<>();
}
@Override
@@ -75,6 +79,8 @@ public class PlaceholderManager extends Function {
this.descentTextMap.clear();
this.conditionalTextsMap.clear();
this.vanillaHudMap.clear();
this.descent_unicode_fonts.clear();
this.descentUnicodeMap.clear();
}
private void loadConfig() {
@@ -100,6 +106,11 @@ public class PlaceholderManager extends Function {
loadDescentText(descentSection);
}
ConfigurationSection descentUnicodeSection = config.getConfigurationSection("descent-unicode");
if (descentUnicodeSection != null) {
loadDescentUnicode(descentUnicodeSection);
}
ConfigurationSection conditionalSection = config.getConfigurationSection("conditional-text");
if (conditionalSection != null) {
loadConditionalText(conditionalSection);
@@ -147,6 +158,13 @@ public class PlaceholderManager extends Function {
}
}
private void loadDescentUnicode(ConfigurationSection section) {
for (String key : section.getKeys(false)) {
descent_unicode_fonts.add(8 - section.getInt(key + ".descent"));
descentUnicodeMap.put(key, new DescentText(section.getString(key + ".text"), 8 - section.getInt(key + ".descent")));
}
}
private void loadStaticText(ConfigurationSection section) {
for (String key : section.getKeys(false)) {
stringStaticTextMap.put(key, new StaticText(section.getString(key + ".text"), section.getInt(key + ".value"), StaticText.StaticState.valueOf(section.getString(key + ".position", "left").toUpperCase())));
@@ -204,4 +222,12 @@ public class PlaceholderManager extends Function {
public HashSet<Integer> getDescent_fonts() {
return descent_fonts;
}
public HashSet<Integer> getDescent_unicode_fonts() {
return descent_unicode_fonts;
}
public DescentText getDescentUnicode(String key) {
return descentUnicodeMap.get(key);
}
}

View File

@@ -17,9 +17,8 @@
package net.momirealms.customnameplates.manager;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.*;
import com.google.gson.stream.JsonReader;
import net.momirealms.customnameplates.CustomNameplates;
import net.momirealms.customnameplates.object.SimpleChar;
import net.momirealms.customnameplates.object.background.BackGroundConfig;
@@ -31,9 +30,8 @@ import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -181,60 +179,47 @@ public class ResourceManager {
private void saveOffsets() {
for (int ascent : plugin.getPlaceholderManager().getDescent_fonts()) {
JsonObject jsonObject_offset = new JsonObject();
JsonArray jsonArray_offset = new JsonArray();
jsonObject_offset.add("providers", jsonArray_offset);
JsonObject jo_providers = new JsonObject();
jo_providers.add("type", new JsonPrimitive("space"));
JsonObject jo_space = new JsonObject();
jo_space.add(" ", new JsonPrimitive(4));
jo_space.add("\\u200c", new JsonPrimitive(0));
jo_providers.add("advances", jo_space);
jsonArray_offset.add(jo_providers);
JsonObject jo_ascii = new JsonObject();
jo_ascii.add("type", new JsonPrimitive("bitmap"));
jo_ascii.add("file", new JsonPrimitive("minecraft:font/ascii.png"));
jo_ascii.add("ascent", new JsonPrimitive(ascent));
jo_ascii.add("height", new JsonPrimitive(8));
JsonArray ja_ascii = new JsonArray();
ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000");
ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000");
ja_ascii.add("\\u0020\\u0021\\u0022\\u0023\\u0024\\u0025\\u0026\\u0027\\u0028\\u0029\\u002a\\u002b\\u002c\\u002d\\u002e\\u002f");
ja_ascii.add("\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u003a\\u003b\\u003c\\u003d\\u003e\\u003f");
ja_ascii.add("\\u0040\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f");
ja_ascii.add("\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u005b\\u005c\\u005d\\u005e\\u005f");
ja_ascii.add("\\u0060\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f");
ja_ascii.add("\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u007b\\u007c\\u007d\\u007e\\u0000");
ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000");
ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u00a3\\u0000\\u0000\\u0192");
ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u00aa\\u00ba\\u0000\\u0000\\u00ac\\u0000\\u0000\\u0000\\u00ab\\u00bb");
ja_ascii.add("\\u2591\\u2592\\u2593\\u2502\\u2524\\u2561\\u2562\\u2556\\u2555\\u2563\\u2551\\u2557\\u255d\\u255c\\u255b\\u2510");
ja_ascii.add("\\u2514\\u2534\\u252c\\u251c\\u2500\\u253c\\u255e\\u255f\\u255a\\u2554\\u2569\\u2566\\u2560\\u2550\\u256c\\u2567");
ja_ascii.add("\\u2568\\u2564\\u2565\\u2559\\u2558\\u2552\\u2553\\u256b\\u256a\\u2518\\u250c\\u2588\\u2584\\u258c\\u2590\\u2580");
ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u2205\\u2208\\u0000");
ja_ascii.add("\\u2261\\u00b1\\u2265\\u2264\\u2320\\u2321\\u00f7\\u2248\\u00b0\\u2219\\u0000\\u221a\\u207f\\u00b2\\u25a0\\u0000");
jo_ascii.add("chars", ja_ascii);
jsonArray_offset.add(jo_ascii);
JsonObject legacy_unicode = new JsonObject();
legacy_unicode.add("type", new JsonPrimitive("legacy_unicode"));
legacy_unicode.add("sizes", new JsonPrimitive("minecraft:font/glyph_sizes.bin"));
legacy_unicode.add("template", new JsonPrimitive("minecraft:font/unicode_page_%s.png"));
jsonArray_offset.add(legacy_unicode);
try (FileWriter fileWriter = new FileWriter(
plugin.getDataFolder() +
File.separator + "ResourcePack" +
File.separator + "assets" +
File.separator + ConfigManager.namespace +
File.separator + "font" +
File.separator + "ascent_" + ascent + ".json")) {
fileWriter.write(jsonObject_offset.toString().replace("\\\\", "\\"));
String line;
StringBuilder sb = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(plugin.getDataFolder(), "templates" + File.separator + "default.json")), StandardCharsets.UTF_8))) {
while ((line = reader.readLine()) != null) {
sb.append(line).append(System.lineSeparator());
}
} catch (IOException e) {
e.printStackTrace();
}
catch (IOException e) {
AdventureUtils.consoleMessage("<red>[CustomNameplates] Error! Failed to generate offset font json.</red>");
try (BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(new File(plugin.getDataFolder(),
"ResourcePack" +
File.separator + "assets" +
File.separator + ConfigManager.namespace +
File.separator + "font" +
File.separator + "ascent_" + ascent + ".json")), StandardCharsets.UTF_8))) {
writer.write(sb.toString().replace("\\\\", "\\").replace("%ascent%", String.valueOf(ascent)));
} catch (IOException e) {
e.printStackTrace();
}
}
for (int ascent : plugin.getPlaceholderManager().getDescent_unicode_fonts()) {
String line;
StringBuilder sb = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(plugin.getDataFolder(), "templates" + File.separator + "unicode.json")), StandardCharsets.UTF_8))) {
while ((line = reader.readLine()) != null) {
sb.append(line).append(System.lineSeparator());
}
} catch (IOException e) {
e.printStackTrace();
}
try (BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(new File(plugin.getDataFolder(),
"ResourcePack" +
File.separator + "assets" +
File.separator + ConfigManager.namespace +
File.separator + "font" +
File.separator + "unicode_ascent_" + ascent + ".json")), StandardCharsets.UTF_8))) {
writer.write(sb.toString().replace("\\\\", "\\").replace("%ascent%", String.valueOf(ascent)));
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@@ -1,22 +1,24 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.object;
import net.momirealms.customnameplates.object.requirements.Requirement;
public class ConditionalText {
public record ConditionalText(Requirement[] requirements, String text) {
private final Requirement[] requirements;
private final String text;
public ConditionalText(Requirement[] requirements, String text) {
this.requirements = requirements;
this.text = text;
}
public Requirement[] getRequirements() {
return requirements;
}
public String getText() {
return text;
}
}

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.object;
public record StaticText(String text, int value, StaticState staticState) {

View File

@@ -50,9 +50,9 @@ public class ArmorStandManager {
addArmorStand(UUID.randomUUID(), new FakeArmorStand(
this,
owner,
new DynamicText(owner, entry.getKey().getText()),
new DynamicText(owner, entry.getKey().text()),
entry.getValue(),
entry.getKey().getRequirements()
entry.getKey().requirements()
));
}
}

View File

@@ -17,7 +17,7 @@
package net.momirealms.customnameplates.object.font;
public enum UnicodeWidth {
public enum ThinASCIIWidth {
A('A', 3), a('a', 3), B('B', 3), b('b', 3),
C('C', 3), c('c', 3), D('D', 3), d('d', 3),
@@ -49,7 +49,7 @@ public enum UnicodeWidth {
private final char character;
private final int width;
UnicodeWidth(char character, int width) {
ThinASCIIWidth(char character, int width) {
this.character = character;
this.width = width;
}

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.object.placeholders;
import net.momirealms.customnameplates.object.ConditionalText;
@@ -15,12 +32,12 @@ public class ConditionalTexts {
public String getValue(Player player) {
outer:
for (ConditionalText conditionalText : conditionalTexts) {
for (Requirement requirement : conditionalText.getRequirements()) {
for (Requirement requirement : conditionalText.requirements()) {
if (!requirement.isConditionMet(player)) {
continue outer;
}
}
return conditionalText.getText();
return conditionalText.text();
}
return "";
}

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.object.placeholders;
public record DescentText(String text, int ascent) {

View File

@@ -109,6 +109,9 @@ public class NameplatePlaceholders extends PlaceholderExpansion {
case "actionbar" -> {
return getOtherActionBar(player);
}
case "unicode" -> {
return getUnicodeDescent(mainParam[1], player);
}
}
return null;
}
@@ -218,6 +221,13 @@ public class NameplatePlaceholders extends PlaceholderExpansion {
return "<font:" + ConfigManager.namespace + ":" + "ascent_" + descentText.ascent() + ">" + parsed + "</font>";
}
private String getUnicodeDescent(String param, Player player) {
DescentText descentText = placeholderManager.getDescentUnicode(param);
if (descentText == null) return param + " NOT FOUND";
String parsed = PlaceholderAPI.setPlaceholders(player, descentText.text());
return "<font:" + ConfigManager.namespace + ":" + "unicode_ascent_" + descentText.ascent() + ">" + parsed + "</font>";
}
private String getVanilla(String param, Player player) {
VanillaHud vanillaHud = placeholderManager.getVanillaHud(param);
if (vanillaHud == null) return param + " NOT FOUND";

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.object.placeholders;
public record VanillaHud(String empty, String half, String full, String papi, String max) {

View File

@@ -1,3 +1,20 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.object.requirements;
import org.bukkit.entity.Player;

View File

@@ -21,10 +21,6 @@ import org.bukkit.entity.Player;
public record PermissionImpl(String permission) implements Requirement {
public String getPermission() {
return this.permission;
}
@Override
public boolean isConditionMet(Player player) {
return player.hasPermission(permission);

View File

@@ -24,10 +24,6 @@ import java.util.List;
public record TimeImpl(List<String> times) implements Requirement{
public List<String> getTimes() {
return this.times;
}
@Override
public boolean isConditionMet(Player player) {
long time = player.getWorld().getTime();

View File

@@ -24,10 +24,6 @@ import java.util.List;
public record WeatherImpl(List<String> weathers) implements Requirement {
public List<String> getWeathers() {
return this.weathers;
}
@Override
public boolean isConditionMet(Player player) {
World world = player.getWorld();

View File

@@ -23,10 +23,6 @@ import java.util.List;
public record WorldImpl(List<String> worlds) implements Requirement {
public List<String> getWorlds() {
return this.worlds;
}
@Override
public boolean isConditionMet(Player player) {
org.bukkit.World world = player.getWorld();

View File

@@ -24,10 +24,6 @@ import java.util.List;
public record YPosImpl(List<String> yPos) implements Requirement {
public List<String> getYPos() {
return this.yPos;
}
@Override
public boolean isConditionMet(Player player) {
int y = (int) player.getLocation().getY();

View File

@@ -1,5 +1,5 @@
# Do not change
config-version: '15'
config-version: '16'
# bStats
metrics: true
@@ -60,6 +60,10 @@ resource-pack:
bubbles: 'font\bubbles\'
space-split: 'font\base\'
# The initial character of a font
# 字体的初始字符
initial-char: '뀁'
# Thin-font support for ASCII
thin-font: false
other-settings:
# default width
# 默认文字宽度
default-character-width: 8

View File

@@ -3,7 +3,7 @@ basic_info_hud:
overlay: PROGRESS
dynamic-text:
- '%nameplates_background_weather% %nameplates_background_position%'
- '%nameplates_background_time%'
- '%nameplates_background_time% %nameplates_background_hello%'
#- '%nameplates_conditional_region%'
switch-interval: 15
conditions:

View File

@@ -90,6 +90,10 @@ background-text:
background: bedrock_1
text: '<#FFFEFD>%nameplates_image_weather%</#FFFEFD> %nameplates_descent_weather%'
remove-shadow: true
hello:
background: bedrock_1
text: '<#FFFEFD>%nameplates_image_bubble%</#FFFEFD> %nameplates_unicode_hello%'
remove-shadow: true
region:
background: bedrock_1
text: '<#FFFEFD>%nameplates_image_compass%</#FFFEFD> %nameplates_descent_region%'
@@ -109,8 +113,7 @@ static-text:
position: middle
text: '%nameplates_actionbar%'
value: 180
# Only ASCII characters are supported here
# Read the wiki to learn how to make all the unicodes work
# %nameplates_descent_{0}%
descent-text:
player:
@@ -135,6 +138,12 @@ descent-text:
text: "%vault_eco_balance%"
descent: 13
# %nameplates_unicode_{0}%
descent-unicode:
hello:
text: "Hello 여보세요 你好 こんにちは"
descent: 5
# %nameplates_vanilla_{0}%
vanilla-hud:
stamina_hud:

File diff suppressed because it is too large Load Diff

View File

@@ -20,6 +20,9 @@ preview-duration: 5
# "none" represents no default nameplate.
default-nameplate: 'none'
# Is thin font name
thin-font: false
# Prefix & Suffix
# Rejoin the server to apply the changes
# 前缀和后缀,重新进入服务器以应用更改

View File

@@ -0,0 +1,113 @@
{
"providers": [
{
"type": "space",
"advances": {
" ": 4,
"\u200c": 0
}
},
{
"type": "bitmap",
"file": "minecraft:font/nonlatin_european.png",
"ascent": %ascent%,
"chars": [
"\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392",
"\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3",
"\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba",
"\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402",
"\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a",
"\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a",
"\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b",
"\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b",
"\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d",
"\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8",
"\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473",
"\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122",
"\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2",
"\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd",
"\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5",
"\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036",
"\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117",
"\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665",
"\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1",
"\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8",
"\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229",
"\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c",
"\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540",
"\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551",
"\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a",
"\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a",
"\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538",
"\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c",
"\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5",
"\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8",
"\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535",
"\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af",
"\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0",
"\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0",
"\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0",
"\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0",
"\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0",
"\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a",
"\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7",
"\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b",
"\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b",
"\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9",
"\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae",
"\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be",
"\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6",
"\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6",
"\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6",
"\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d",
"\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286",
"\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09",
"\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17",
"\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153",
"\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662",
"\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209",
"\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4",
"\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7",
"\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086",
"\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c",
"\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc",
"\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242",
"\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff",
"\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d",
"\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a",
"\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697",
"\u2bea\u2beb\u2c6d\ud83d\udee1\u2702\ud83c\udf56\ud83e\udea3\ud83d\udd14\u23f3\u2691\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5",
"\u20a6\u20a9\u20ab\u20ad\u20ae\u20b0\u20b1\u20b2\u20b3\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb",
"\u20bc\u20bf\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"
]
},
{
"type": "bitmap",
"file": "minecraft:font/ascii.png",
"ascent": %ascent%,
"chars": [
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
"\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f",
"\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f",
"\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f",
"\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f",
"\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f",
"\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000",
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192",
"\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb",
"\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510",
"\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567",
"\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580",
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000",
"\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u0000\u221a\u207f\u00b2\u25a0\u0000"
]
},
{
"type": "legacy_unicode",
"sizes": "minecraft:font/glyph_sizes.bin",
"template": "minecraft:font/unicode_page_%s.png"
}
]
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1010 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Some files were not shown because too many files have changed in this diff Show More