Refactor package
This commit is contained in:
316
src/main/java/fr/pandacube/util/text_display/Display.java
Normal file
316
src/main/java/fr/pandacube/util/text_display/Display.java
Normal file
@@ -0,0 +1,316 @@
|
||||
package fr.pandacube.util.text_display;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.api.chat.ClickEvent;
|
||||
import net.md_5.bungee.api.chat.HoverEvent;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
|
||||
public class Display {
|
||||
|
||||
private BaseComponent root = new TextComponent("");
|
||||
|
||||
private BaseComponent current = null;
|
||||
|
||||
|
||||
/*
|
||||
* ****************
|
||||
* * Constructors *
|
||||
* ****************
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Create a new instance. The current component is not initialized.
|
||||
*/
|
||||
public Display() {}
|
||||
|
||||
/**
|
||||
* Create a new instance, with the current component already initialized with the parameter.
|
||||
* @param legacyText a text that will be converted to a component and set to the current compoment.
|
||||
*/
|
||||
public Display(String legacyText) {
|
||||
next(legacyText);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new instance, with the current component already initialized with the parameter.
|
||||
* @param legacyText a list of text that will be joined by a line return followed by ChatColor.RESET,
|
||||
* then converted to a component and set to the current component.
|
||||
*/
|
||||
public Display(List<String> legacyText) {
|
||||
this(String.join("\n"+ChatColor.RESET, legacyText));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new instance, with the current component already initialized with the parameter.
|
||||
* @param legacyText an array of text that will be joined by a line return followed by ChatColor.RESET,
|
||||
* then converted to a component and set to the current component.
|
||||
*/
|
||||
public Display(String[] legacyText) {
|
||||
this(Arrays.asList(legacyText));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new instance, with the current component already initialized with the parameter.
|
||||
* @param firstComponent a component corresponding to the current component.
|
||||
*/
|
||||
public Display(BaseComponent firstComponent) {
|
||||
next(firstComponent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new instance, with the current component already initialized with the parameter.
|
||||
* @param components an array of component that will be inside the current component.
|
||||
*/
|
||||
public Display(BaseComponent[] components) {
|
||||
if (components == null) throw new IllegalArgumentException("le paramètre ne doit pas être null");
|
||||
next(components);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ******************
|
||||
* * next() methods *
|
||||
* ******************
|
||||
*/
|
||||
|
||||
/**
|
||||
* Initialize the current component with the parameter.
|
||||
* The previous component is stored in the root component.
|
||||
* @param cmp a component corresponding to the new component.
|
||||
* @return this
|
||||
*/
|
||||
public Display next(BaseComponent cmp) {
|
||||
if (cmp == null) throw new IllegalArgumentException("le paramètre ne doit pas être null");
|
||||
finalizeCurrentComponent();
|
||||
current = cmp;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the current component with the parameter.
|
||||
* The previous component is stored in the root component.
|
||||
* @param str a text that will be converted to a component and set to the current compoment.
|
||||
* @return this
|
||||
*/
|
||||
public Display next(String str) {
|
||||
return next(TextComponent.fromLegacyText(str == null ? "" : str));
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the current component with the parameter.
|
||||
* The previous component is stored in the root component.
|
||||
* @param components an array of component that will be inside the current component.
|
||||
* @return this
|
||||
*/
|
||||
public Display next(BaseComponent[] components) {
|
||||
BaseComponent bc = new TextComponent();
|
||||
for (BaseComponent c : components)
|
||||
bc.addExtra(c);
|
||||
return next(bc);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the current component with the parameter.
|
||||
* The previous component is stored in the root component.
|
||||
* @param cmp an other instance of Display that the root component become the current component of this instance.
|
||||
* @return this
|
||||
*/
|
||||
public Display next(Display cmp) {
|
||||
if (cmp == null) throw new IllegalArgumentException("le paramètre ne doit pas être null");
|
||||
return next(cmp.get());
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the current component with the text "\n".
|
||||
* The previous component is stored in the root component.
|
||||
* @return this
|
||||
*/
|
||||
public Display nextLine() {
|
||||
finalizeCurrentComponent();
|
||||
current = new TextComponent("\n");
|
||||
return this;
|
||||
}
|
||||
|
||||
/*
|
||||
* **************************
|
||||
* * Style and behaviour of *
|
||||
* *** current component ****
|
||||
* **************************
|
||||
*/
|
||||
|
||||
/**
|
||||
* Set the color of the current component.
|
||||
* @param color the colour. Can be null;
|
||||
* @return this
|
||||
*/
|
||||
public Display color(ChatColor color) {
|
||||
current.setColor(color);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set if the current component is bold.
|
||||
* @param b true if bold, false if not, null if undefined
|
||||
* @return this
|
||||
*/
|
||||
public Display bold(Boolean b) {
|
||||
current.setBold(b);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set if the current component is italic.
|
||||
* @param b true if italic, false if not, null if undefined
|
||||
* @return this
|
||||
*/
|
||||
public Display italic(Boolean i) {
|
||||
current.setItalic(i);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set if the current component is underlined.
|
||||
* @param b true if underlined, false if not, null if undefined
|
||||
* @return this
|
||||
*/
|
||||
public Display underlined(Boolean u) {
|
||||
current.setUnderlined(u);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set if the current component is obfuscated.
|
||||
* In Minecraft user interface, obfuscated text displays randomly generated character in place of the originals. The random text regenerate each frame.
|
||||
* @param b true if obfuscated, false if not, null if undefined
|
||||
* @return this
|
||||
*/
|
||||
public Display obfuscated(Boolean o) {
|
||||
current.setObfuscated(o);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set if the current component is strikethrough.
|
||||
* @param b true if strikethrough, false if not, null if undefined
|
||||
* @return this
|
||||
*/
|
||||
public Display strikethrough(Boolean s) {
|
||||
current.setStrikethrough(s);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a text displayed as a tooltip when the cursor is hover the current component.
|
||||
* This method is only relevant if this Display is intended to be displayed in the chat or in a book
|
||||
* @param content the text as an array of component.
|
||||
* @return this
|
||||
*/
|
||||
public Display hoverText(BaseComponent[] content) {
|
||||
current.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, content));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a text displayed as a tooltip when the cursor is hover the current component.
|
||||
* This method is only relevant if this Display is intended to be displayed in the chat or in a book
|
||||
* @param content the text as a component
|
||||
* @return this
|
||||
*/
|
||||
public Display hoverText(BaseComponent content) {
|
||||
return hoverText(new BaseComponent[] {content});
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a text displayed as a tooltip when the cursor is hover the current component.
|
||||
* This method is only relevant if this Display is intended to be displayed in the chat or in a book
|
||||
* @param content the text as a legacy string.
|
||||
* @return this
|
||||
*/
|
||||
public Display hoverText(String legacyContent) {
|
||||
return hoverText(TextComponent.fromLegacyText(legacyContent));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a text displayed as a tooltip when the cursor is hover the current component.
|
||||
* This method is only relevant if this Display is intended to be displayed in the chat or in a book
|
||||
* @param content the text as a {@link Display} instance.
|
||||
* @return this
|
||||
*/
|
||||
public Display hoverText(Display content) {
|
||||
return hoverText(content.get());
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow the player to click on the current component to access to the specified URL.
|
||||
* This method is only relevant if this Display is intended to be displayed in the chat
|
||||
* @param url the URL
|
||||
* @return this
|
||||
*/
|
||||
public Display clickURL(String url) {
|
||||
current.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, url));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow the player to click on the current component to run the specified command.
|
||||
* This method is only relevant if this Display is intended to be displayed in the chat, in a book or on a sign.
|
||||
* On the sign, all the commands are executed in a row when the player click on the sign.
|
||||
* @param cmd the command, with the "/"
|
||||
* @return this
|
||||
*/
|
||||
public Display clickCommand(String cmd) {
|
||||
current.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, cmd));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow the player to click on the current component to fill the textfield with the specified command.
|
||||
* This method is only relevant if this Display is intended to be displayed in the chat.
|
||||
* @param cmd the command
|
||||
* @return this
|
||||
*/
|
||||
public Display clickSuggest(String cmd) {
|
||||
current.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, cmd));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow the player to shuft-click on the current component to insert the specified string into the textfield (at the cursor location).
|
||||
* This method is only relevant if this Display is intended to be displayed in the chat.
|
||||
* @param str the string
|
||||
* @return this
|
||||
*/
|
||||
public Display clickInsertion(String str) {
|
||||
current.setInsertion(str);
|
||||
return this;
|
||||
}
|
||||
|
||||
private void finalizeCurrentComponent() {
|
||||
if (current != null) root.addExtra(current);
|
||||
current = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the current compoment into the root component and return the root component.
|
||||
* @return
|
||||
*/
|
||||
public BaseComponent get() {
|
||||
finalizeCurrentComponent();
|
||||
return root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the current compoment into the root component and return all the components in an array.
|
||||
* @return
|
||||
*/
|
||||
public BaseComponent[] getArray() {
|
||||
finalizeCurrentComponent();
|
||||
return root.getExtra().toArray(new BaseComponent[root.getExtra().size()]);
|
||||
}
|
||||
|
||||
}
|
420
src/main/java/fr/pandacube/util/text_display/DisplayUtil.java
Normal file
420
src/main/java/fr/pandacube/util/text_display/DisplayUtil.java
Normal file
@@ -0,0 +1,420 @@
|
||||
package fr.pandacube.util.text_display;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import net.md_5.bungee.api.chat.TranslatableComponent;
|
||||
|
||||
public class DisplayUtil {
|
||||
|
||||
public static final int DEFAULT_CHAR_SIZE = 6;
|
||||
public static final Map<Integer, String> CHARS_SIZE = new ImmutableMap.Builder<Integer, String>()
|
||||
.put(-6, "§")
|
||||
.put(2, "!.,:;i|¡")
|
||||
.put(3, "'`lìí")
|
||||
.put(4, " I[]tï×")
|
||||
.put(5, "\"()*<>fk{}")
|
||||
.put(7, "@~®")
|
||||
.build();
|
||||
|
||||
|
||||
|
||||
public static final int DEFAULT_CHAT_WIDTH = 320;
|
||||
public static final int SIGN_WIDTH = 90;
|
||||
public static final int BOOK_WIDTH = 116;
|
||||
|
||||
public static final int CONSOLE_NB_CHAR_DEFAULT = 50;
|
||||
|
||||
public static final ChatColor COLOR_TITLE = ChatColor.GOLD;
|
||||
public static final ChatColor COLOR_LINK = ChatColor.GREEN;
|
||||
public static final ChatColor COLOR_COMMAND = ChatColor.GRAY;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static BaseComponent createURLLink(String text, String url, String hoverText) {
|
||||
return _createURLLink(new Display(text), url, hoverText);
|
||||
}
|
||||
public static BaseComponent createURLLink(BaseComponent text, String url, String hoverText) {
|
||||
return _createURLLink(new Display(text), url, hoverText);
|
||||
}
|
||||
public static BaseComponent createURLLink(BaseComponent[] text, String url, String hoverText) {
|
||||
return _createURLLink(new Display(text), url, hoverText);
|
||||
}
|
||||
|
||||
private static BaseComponent _createURLLink(Display d, String url, String hoverText) {
|
||||
String dispURL = (url.length() > 50) ? (url.substring(0, 48) + "...") : url;
|
||||
return d.clickURL(url)
|
||||
.hoverText(ChatColor.GRAY + ((hoverText == null) ? "Cliquez pour accéder au site :" : hoverText) + "\n"
|
||||
+ ChatColor.GRAY + dispURL)
|
||||
.color(COLOR_LINK).get();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static BaseComponent createCommandLink(String text, String commandWithSlash, String hoverText) {
|
||||
return createCommandLink(text, commandWithSlash, hoverText == null ? null : TextComponent.fromLegacyText(hoverText));
|
||||
}
|
||||
public static BaseComponent createCommandLink(String text, String commandWithSlash, BaseComponent hoverText) {
|
||||
return createCommandLink(text, commandWithSlash, hoverText == null ? null : new BaseComponent[] {hoverText});
|
||||
}
|
||||
public static BaseComponent createCommandLink(String text, String commandWithSlash, BaseComponent[] hoverText) {
|
||||
return _createCommandLink(new Display(text), commandWithSlash, hoverText);
|
||||
}
|
||||
|
||||
private static BaseComponent _createCommandLink(Display d, String commandWithSlash, BaseComponent[] hoverText) {
|
||||
d.clickCommand(commandWithSlash).color(COLOR_COMMAND);
|
||||
if (hoverText != null) d.hoverText(hoverText);
|
||||
return d.get();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static BaseComponent createCommandSuggest(String text, String commandWithSlash, String hoverText) {
|
||||
return createCommandSuggest(text, commandWithSlash, hoverText == null ? null : TextComponent.fromLegacyText(hoverText));
|
||||
}
|
||||
public static BaseComponent createCommandSuggest(String text, String commandWithSlash, BaseComponent hoverText) {
|
||||
return createCommandSuggest(text, commandWithSlash, hoverText == null ? null : new BaseComponent[] {hoverText});
|
||||
}
|
||||
public static BaseComponent createCommandSuggest(String text, String commandWithSlash, BaseComponent[] hoverText) {
|
||||
return _createCommandSuggest(new Display(text), commandWithSlash, hoverText);
|
||||
}
|
||||
|
||||
private static BaseComponent _createCommandSuggest(Display d, String commandWithSlash, BaseComponent[] hoverText) {
|
||||
d.clickSuggest(commandWithSlash).color(COLOR_COMMAND);
|
||||
if (hoverText != null) d.hoverText(hoverText);
|
||||
return d.get();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// TODO refaire les 4 methodes ci-dessous
|
||||
|
||||
|
||||
|
||||
|
||||
public static BaseComponent centerText(BaseComponent text, char repeatedChar, ChatColor decorationColor,
|
||||
boolean console) {
|
||||
|
||||
int textWidth = strWidth(text.toPlainText(), console, false);
|
||||
if (textWidth > ((console) ? CONSOLE_NB_CHAR_DEFAULT : DEFAULT_CHAT_WIDTH)) return text;
|
||||
|
||||
String current = text.toPlainText();
|
||||
int count = 0;
|
||||
do {
|
||||
count++;
|
||||
current = repeatedChar + current + repeatedChar;
|
||||
} while (strWidth(current, console, false) <= ((console) ? CONSOLE_NB_CHAR_DEFAULT : DEFAULT_CHAT_WIDTH));
|
||||
count--;
|
||||
|
||||
String finalLeftOrRight = "";
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
finalLeftOrRight += repeatedChar;
|
||||
|
||||
Display d = new Display().next(finalLeftOrRight).color(decorationColor).next(text);
|
||||
|
||||
if (repeatedChar != ' ') d.next(finalLeftOrRight).color(decorationColor);
|
||||
|
||||
return d.get();
|
||||
|
||||
}
|
||||
|
||||
public static BaseComponent leftText(BaseComponent text, char repeatedChar, ChatColor decorationColor, int nbLeft,
|
||||
boolean console) {
|
||||
|
||||
int textWidth = strWidth(text.toPlainText(), console, false);
|
||||
if (textWidth > ((console) ? CONSOLE_NB_CHAR_DEFAULT : DEFAULT_CHAT_WIDTH) || textWidth
|
||||
+ nbLeft * charW(repeatedChar, console, false) > ((console) ? CONSOLE_NB_CHAR_DEFAULT : DEFAULT_CHAT_WIDTH))
|
||||
return text;
|
||||
|
||||
Display d = new Display();
|
||||
|
||||
String finalLeft = "";
|
||||
if (nbLeft > 0) {
|
||||
for (int i = 0; i < nbLeft; i++)
|
||||
finalLeft += repeatedChar;
|
||||
d.next(finalLeft).color(decorationColor);
|
||||
}
|
||||
d.next(text);
|
||||
|
||||
int count = 0;
|
||||
String current = finalLeft + text.toPlainText();
|
||||
do {
|
||||
count++;
|
||||
current += repeatedChar;
|
||||
} while (strWidth(current, console, false) <= ((console) ? CONSOLE_NB_CHAR_DEFAULT : DEFAULT_CHAT_WIDTH));
|
||||
count--;
|
||||
|
||||
if (repeatedChar != ' ') {
|
||||
String finalRight = "";
|
||||
for (int i = 0; i < count; i++)
|
||||
finalRight += repeatedChar;
|
||||
d.next(finalRight).color(decorationColor);
|
||||
}
|
||||
|
||||
return d.get();
|
||||
|
||||
}
|
||||
|
||||
public static BaseComponent rightText(BaseComponent text, char repeatedChar, ChatColor decorationColor, int nbRight,
|
||||
boolean console) {
|
||||
|
||||
int textWidth = strWidth(text.toPlainText(), console, false);
|
||||
if (textWidth > ((console) ? CONSOLE_NB_CHAR_DEFAULT : DEFAULT_CHAT_WIDTH) || textWidth
|
||||
+ nbRight * charW(repeatedChar, console, false) > ((console) ? CONSOLE_NB_CHAR_DEFAULT : DEFAULT_CHAT_WIDTH))
|
||||
return text;
|
||||
|
||||
String tempText = text.toPlainText();
|
||||
if (nbRight > 0) {
|
||||
tempText += decorationColor;
|
||||
for (int i = 0; i < nbRight; i++)
|
||||
tempText += repeatedChar;
|
||||
}
|
||||
|
||||
int count = 0;
|
||||
String current = tempText;
|
||||
do {
|
||||
count++;
|
||||
current = repeatedChar + current;
|
||||
} while (strWidth(current, console, false) <= ((console) ? CONSOLE_NB_CHAR_DEFAULT : DEFAULT_CHAT_WIDTH));
|
||||
count--;
|
||||
|
||||
String finalLeft = "";
|
||||
for (int i = 0; i < count; i++)
|
||||
finalLeft += repeatedChar;
|
||||
|
||||
Display d = new Display().next(finalLeft).color(decorationColor).next(text);
|
||||
|
||||
if (repeatedChar != ' ') {
|
||||
String finalRight = "";
|
||||
for (int i = 0; i < nbRight; i++)
|
||||
finalRight += repeatedChar;
|
||||
d.next(finalRight).color(decorationColor);
|
||||
}
|
||||
|
||||
return d.get();
|
||||
|
||||
}
|
||||
|
||||
public static BaseComponent emptyLine(char repeatedChar, ChatColor decorationColor, boolean console) {
|
||||
int count = ((console) ? CONSOLE_NB_CHAR_DEFAULT : DEFAULT_CHAT_WIDTH) / charW(repeatedChar, console, false);
|
||||
String finalLine = "";
|
||||
for (int i = 0; i < count; i++)
|
||||
finalLine += repeatedChar;
|
||||
|
||||
return new Display().next(finalLine).color(decorationColor).get();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static int componentWidth(BaseComponent[] components, boolean console) {
|
||||
return Arrays.stream(components).mapToInt(c -> componentWidth(c, console)).sum();
|
||||
}
|
||||
|
||||
public static int componentWidth(BaseComponent component, boolean console) {
|
||||
int count = 0;
|
||||
for (BaseComponent c : component.getExtra())
|
||||
count += componentWidth(c, console);
|
||||
if (component instanceof TextComponent) {
|
||||
count += strWidth(((TextComponent)component).getText(), console, component.isBold());
|
||||
}
|
||||
else if (component instanceof TranslatableComponent) {
|
||||
for (BaseComponent c : ((TranslatableComponent)component).getWith())
|
||||
count += componentWidth(c, console);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
public static int strWidth(String str, boolean console, boolean bold) {
|
||||
int count = 0;
|
||||
for (char c : str.toCharArray())
|
||||
count += charW(c, console, bold);
|
||||
return (count < 0) ? 0 : count;
|
||||
}
|
||||
|
||||
private static int charW(char c, boolean console, boolean bold) {
|
||||
if (console) return (c == '§') ? -1 : 1;
|
||||
for (int px : CHARS_SIZE.keySet())
|
||||
if (CHARS_SIZE.get(px).indexOf(c) >= 0) return px + (bold ? 1 : 0);
|
||||
return 6 + (bold ? 1 : 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static List<String> wrapInLimitedPixels(String legacyText, int pixelWidth) {
|
||||
List<String> lines = new ArrayList<>();
|
||||
|
||||
legacyText += "\n"; // workaround to force algorithm to compute last lines;
|
||||
|
||||
String currentLine = "";
|
||||
int currentLineSize = 0;
|
||||
int index = 0;
|
||||
|
||||
String currentWord = "";
|
||||
int currentWordSize = 0;
|
||||
boolean bold = false;
|
||||
boolean firstCharCurrentWorldBold = false;
|
||||
|
||||
do {
|
||||
char c = legacyText.charAt(index);
|
||||
if (c == ChatColor.COLOR_CHAR && index < legacyText.length() - 1) {
|
||||
currentWord += c;
|
||||
c = legacyText.charAt(++index);
|
||||
currentWord += c;
|
||||
|
||||
if (c == 'l' || c == 'L') // bold
|
||||
bold = true;
|
||||
if ((c >= '0' && c <= '9') // reset bold
|
||||
|| (c >= 'a' && c <= 'f')
|
||||
|| (c >= 'A' && c <= 'F')
|
||||
|| c == 'r' || c == 'R')
|
||||
bold = false;
|
||||
|
||||
}
|
||||
else if (c == ' ') {
|
||||
if (currentLineSize + currentWordSize > pixelWidth && currentLineSize > 0) { // wrap before word
|
||||
lines.add(currentLine);
|
||||
String lastStyle = getLastColors(currentLine);
|
||||
if (currentWord.charAt(0) == ' ') {
|
||||
currentWord = currentWord.substring(1);
|
||||
currentWordSize -= charW(' ', false, firstCharCurrentWorldBold);
|
||||
}
|
||||
currentLine = (lastStyle.equals("§r") ? "" : lastStyle) + currentWord;
|
||||
currentLineSize = currentWordSize;
|
||||
}
|
||||
else {
|
||||
currentLine += currentWord;
|
||||
currentLineSize += currentWordSize;
|
||||
}
|
||||
currentWord = ""+c;
|
||||
currentWordSize = charW(c, false, bold);
|
||||
firstCharCurrentWorldBold = bold;
|
||||
}
|
||||
else if (c == '\n') {
|
||||
if (currentLineSize + currentWordSize > pixelWidth && currentLineSize > 0) { // wrap before word
|
||||
lines.add(currentLine);
|
||||
String lastStyle = getLastColors(currentLine);
|
||||
if (currentWord.charAt(0) == ' ') {
|
||||
currentWord = currentWord.substring(1);
|
||||
currentWordSize -= charW(' ', false, firstCharCurrentWorldBold);
|
||||
}
|
||||
currentLine = (lastStyle.equals("§r") ? "" : lastStyle) + currentWord;
|
||||
currentLineSize = currentWordSize;
|
||||
}
|
||||
else {
|
||||
currentLine += currentWord;
|
||||
currentLineSize += currentWordSize;
|
||||
}
|
||||
// wrap after
|
||||
lines.add(currentLine);
|
||||
String lastStyle = getLastColors(currentLine);
|
||||
|
||||
currentLine = lastStyle.equals("§r") ? "" : lastStyle;
|
||||
currentLineSize = 0;
|
||||
currentWord = "";
|
||||
currentWordSize = 0;
|
||||
firstCharCurrentWorldBold = bold;
|
||||
}
|
||||
else {
|
||||
currentWord += c;
|
||||
currentWordSize += charW(c, false, bold);
|
||||
}
|
||||
|
||||
} while(++index < legacyText.length());
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return lines;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static String getLastColors(String legacyText) {
|
||||
String result = "";
|
||||
int length = legacyText.length();
|
||||
|
||||
// Search backwards from the end as it is faster
|
||||
for (int index = length - 1; index > -1; index--) {
|
||||
char section = legacyText.charAt(index);
|
||||
if (section == ChatColor.COLOR_CHAR && index < length - 1) {
|
||||
char c = legacyText.charAt(index + 1);
|
||||
ChatColor color = getChatColorByChar(c);
|
||||
|
||||
if (color != null) {
|
||||
result = color.toString() + result;
|
||||
|
||||
// Once we find a color or reset we can stop searching
|
||||
char col = color.toString().charAt(1);
|
||||
if ((col >= '0' && col <= '9')
|
||||
|| (col >= 'a' && col <= 'f')
|
||||
|| col == 'r') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static ChatColor getChatColorByChar(char code) {
|
||||
return ChatColor.getByChar(Character.toLowerCase(code));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@@ -0,0 +1,63 @@
|
||||
package fr.pandacube.util.text_display;
|
||||
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
|
||||
public class TextProgressBar {
|
||||
private static String pattern_start = "[";
|
||||
private static String pattern_end = "]";
|
||||
private static ChatColor color_empty = ChatColor.DARK_GRAY;
|
||||
private static ChatColor color_decoration = ChatColor.GOLD;
|
||||
private static ChatColor color_default = ChatColor.RESET;
|
||||
private static String pattern_empty = ".";
|
||||
private static String pattern_full = "|";
|
||||
|
||||
public static String progressBar(double[] values, ChatColor[] colors, double total, int nbCar) {
|
||||
long[] sizes = new long[values.length];
|
||||
|
||||
int max_size = nbCar - pattern_start.length() - pattern_end.length();
|
||||
|
||||
for (int i = 0; i < values.length; i++) {
|
||||
double sum_values_before = 0;
|
||||
for (int j = i; j >= 0; j--)
|
||||
sum_values_before += values[j];
|
||||
|
||||
long car_position = Math.round(max_size * sum_values_before / total);
|
||||
|
||||
// évite les barre de progressions plus grandes que la taille
|
||||
// demandée
|
||||
if (car_position > max_size) car_position = max_size;
|
||||
|
||||
long sum_sizes_before = 0;
|
||||
for (int j = i - 1; j >= 0; j--)
|
||||
sum_sizes_before += sizes[j];
|
||||
|
||||
sizes[i] = car_position - sum_sizes_before;
|
||||
}
|
||||
int sum_sizes = 0;
|
||||
|
||||
String bar = color_decoration + pattern_start;
|
||||
for (int i = 0; i < sizes.length; i++) {
|
||||
sum_sizes += sizes[i];
|
||||
|
||||
ChatColor color = color_default;
|
||||
if (colors != null && i < colors.length && colors[i] != null) color = colors[i];
|
||||
|
||||
bar = bar + color;
|
||||
|
||||
for (int j = 0; j < sizes[i]; j++)
|
||||
bar = bar + pattern_full;
|
||||
}
|
||||
|
||||
bar = bar + color_empty;
|
||||
for (int j = 0; j < (max_size - sum_sizes); j++)
|
||||
bar = bar + pattern_empty;
|
||||
|
||||
bar = bar + color_decoration + pattern_end;
|
||||
return bar;
|
||||
}
|
||||
|
||||
public static String progressBar(double value, ChatColor color, double max, int nbCar) {
|
||||
return progressBar(new double[] { value }, new ChatColor[] { color }, max, nbCar);
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user