mirror of
https://github.com/Minestom/Minestom.git
synced 2024-12-28 20:18:10 +01:00
Support for translations in text messages, only used by DamageTypes for the moment
This commit is contained in:
parent
e57addcbf7
commit
2bd5b1786b
@ -14,16 +14,10 @@ repositories {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def lombokDependency = 'org.projectlombok:lombok:1.18.2'
|
|
||||||
|
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
testCompile group: 'junit', name: 'junit', version: '4.12'
|
testCompile group: 'junit', name: 'junit', version: '4.12'
|
||||||
|
|
||||||
compileOnly lombokDependency
|
|
||||||
|
|
||||||
apt lombokDependency
|
|
||||||
|
|
||||||
// https://mvnrepository.com/artifact/io.netty/netty-all
|
// https://mvnrepository.com/artifact/io.netty/netty-all
|
||||||
compile group: 'io.netty', name: 'netty-all', version: '4.1.48.Final'
|
compile group: 'io.netty', name: 'netty-all', version: '4.1.48.Final'
|
||||||
|
|
||||||
@ -40,6 +34,7 @@ dependencies {
|
|||||||
implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
|
implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
|
||||||
|
|
||||||
compile 'com.github.TheMode:CommandBuilder:f893cfbfe4'
|
compile 'com.github.TheMode:CommandBuilder:f893cfbfe4'
|
||||||
|
compile 'com.github.Minestom:minecraft-text:69fd808e92'
|
||||||
|
|
||||||
// https://mvnrepository.com/artifact/javax.vecmath/vecmath
|
// https://mvnrepository.com/artifact/javax.vecmath/vecmath
|
||||||
compile group: 'javax.vecmath', name: 'vecmath', version: '1.5.2' // Used for Fastnoise
|
compile group: 'javax.vecmath', name: 'vecmath', version: '1.5.2' // Used for Fastnoise
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
/**
|
|
||||||
* Utilities for Minecraft.
|
|
||||||
*/
|
|
||||||
package club.thectm.minecraft;
|
|
@ -1,99 +0,0 @@
|
|||||||
/*
|
|
||||||
* MIT License
|
|
||||||
*
|
|
||||||
* Copyright (c) 2018 Ryan Willette
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
|
||||||
* copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
* SOFTWARE.
|
|
||||||
*/
|
|
||||||
package club.thectm.minecraft.text;
|
|
||||||
|
|
||||||
public enum ChatColor {
|
|
||||||
// Colors
|
|
||||||
BLACK,
|
|
||||||
DARK_BLUE,
|
|
||||||
DARK_GREEN,
|
|
||||||
DARK_AQUA,
|
|
||||||
DARK_RED,
|
|
||||||
DARK_PURPLE,
|
|
||||||
GOLD,
|
|
||||||
GRAY,
|
|
||||||
DARK_GRAY,
|
|
||||||
BLUE,
|
|
||||||
GREEN,
|
|
||||||
AQUA,
|
|
||||||
RED,
|
|
||||||
LIGHT_PURPLE,
|
|
||||||
YELLOW,
|
|
||||||
WHITE,
|
|
||||||
// Styles
|
|
||||||
OBFUSCATED(true),
|
|
||||||
BOLD(true),
|
|
||||||
STRIKETHROUGH(true),
|
|
||||||
UNDERLINE(true),
|
|
||||||
ITALIC(true),
|
|
||||||
RESET(true);
|
|
||||||
|
|
||||||
|
|
||||||
public static final char SECTION_SYMBOL = '\u00A7';
|
|
||||||
|
|
||||||
private static final String CHARS_STRING = "0123456789abcdefklmnor";
|
|
||||||
private static final char[] CHARS = CHARS_STRING.toCharArray();
|
|
||||||
|
|
||||||
private boolean format;
|
|
||||||
|
|
||||||
|
|
||||||
ChatColor(boolean format) {
|
|
||||||
this.format = format;
|
|
||||||
}
|
|
||||||
|
|
||||||
ChatColor() {
|
|
||||||
this(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isValid(char c) {
|
|
||||||
return CHARS_STRING.indexOf(Character.toLowerCase(c)) != -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ChatColor getByCharCode(char c) {
|
|
||||||
return ChatColor.values()[CHARS_STRING.indexOf(Character.toLowerCase(c))];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public boolean isFormat() {
|
|
||||||
return format;
|
|
||||||
}
|
|
||||||
|
|
||||||
public char charCode() {
|
|
||||||
return CHARS[this.ordinal()];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public String toLegacyString() {
|
|
||||||
return String.valueOf(new char[]{SECTION_SYMBOL, this.charCode()});
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toJsonString() {
|
|
||||||
return this.name().toLowerCase();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return this.toLegacyString();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,74 +0,0 @@
|
|||||||
/*
|
|
||||||
* MIT License
|
|
||||||
*
|
|
||||||
* Copyright (c) 2018 Ryan Willette
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
|
||||||
* copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
* SOFTWARE.
|
|
||||||
*/
|
|
||||||
package club.thectm.minecraft.text;
|
|
||||||
|
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
|
|
||||||
public final class ClickEvent {
|
|
||||||
|
|
||||||
private Action action;
|
|
||||||
private String value;
|
|
||||||
|
|
||||||
public ClickEvent(Action action, String value) {
|
|
||||||
this.action = action;
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ClickEvent fromJson(JsonObject object) {
|
|
||||||
String action = object.getAsJsonPrimitive("action").getAsString();
|
|
||||||
String value = object.getAsJsonPrimitive("value").getAsString();
|
|
||||||
|
|
||||||
return new ClickEvent(Action.valueOf(action), value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public JsonObject toJson() {
|
|
||||||
JsonObject object = new JsonObject();
|
|
||||||
|
|
||||||
object.addProperty("action", action.toString());
|
|
||||||
|
|
||||||
// CHANGE_PAGE is an integer, the rest are Strings.
|
|
||||||
if (this.action == Action.CHANGE_PAGE) {
|
|
||||||
object.addProperty("value", Integer.valueOf(value));
|
|
||||||
} else {
|
|
||||||
object.addProperty("value", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return object;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public enum Action {
|
|
||||||
OPEN_URL,
|
|
||||||
RUN_COMMAND,
|
|
||||||
SUGGEST_COMMAND,
|
|
||||||
|
|
||||||
// For Books
|
|
||||||
CHANGE_PAGE;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return name().toLowerCase();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,64 +0,0 @@
|
|||||||
/*
|
|
||||||
* MIT License
|
|
||||||
*
|
|
||||||
* Copyright (c) 2018 Ryan Willette
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
|
||||||
* copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
* SOFTWARE.
|
|
||||||
*/
|
|
||||||
package club.thectm.minecraft.text;
|
|
||||||
|
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
|
|
||||||
public final class HoverEvent {
|
|
||||||
private Action action;
|
|
||||||
private String value;
|
|
||||||
|
|
||||||
public HoverEvent(Action action, String value) {
|
|
||||||
this.action = action;
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HoverEvent fromJson(JsonObject object) {
|
|
||||||
String action = object.getAsJsonPrimitive("action").getAsString();
|
|
||||||
String value = object.getAsJsonPrimitive("value").getAsString();
|
|
||||||
|
|
||||||
return new HoverEvent(Action.valueOf(action), value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public JsonObject toJson() {
|
|
||||||
JsonObject object = new JsonObject();
|
|
||||||
|
|
||||||
object.addProperty("action", action.toString());
|
|
||||||
object.addProperty("value", value);
|
|
||||||
|
|
||||||
return object;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public enum Action {
|
|
||||||
SHOW_TEXT,
|
|
||||||
SHOW_ITEM,
|
|
||||||
SHOW_ENTITY;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return name().toLowerCase();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,191 +0,0 @@
|
|||||||
/*
|
|
||||||
* MIT License
|
|
||||||
*
|
|
||||||
* Copyright (c) 2018 Ryan Willette
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
|
||||||
* copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
* SOFTWARE.
|
|
||||||
*/
|
|
||||||
package club.thectm.minecraft.text;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Legacy text is a conversion util which will convert a "legacy" chat string into a TextObject,
|
|
||||||
* and a TextObject into a legacy string
|
|
||||||
*/
|
|
||||||
public final class LegacyText {
|
|
||||||
|
|
||||||
public static TextObject fromLegacy(String legacyText) {
|
|
||||||
return LegacyText.fromLegacy(legacyText, '&');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This function takes in a legacy text string and converts it into a {@link TextObject}.
|
|
||||||
* <p>
|
|
||||||
* Legacy text strings use the {@link ChatColor#SECTION_SYMBOL}. Many keyboards do not have this symbol however,
|
|
||||||
* which is probably why it was chosen. To get around this, it is common practice to substitute
|
|
||||||
* the symbol for another, then translate it later. Often '&' is used, but this can differ from person
|
|
||||||
* to person. In case the string does not have a {@link ChatColor#SECTION_SYMBOL}, the method also checks for the
|
|
||||||
* {@param characterSubstitute}
|
|
||||||
*
|
|
||||||
* @param legacyText The text to make into an object
|
|
||||||
* @param characterSubstitute The character substitute
|
|
||||||
* @return A TextObject representing the legacy text.
|
|
||||||
*/
|
|
||||||
public static TextObject fromLegacy(String legacyText, char characterSubstitute) {
|
|
||||||
TextBuilder builder = TextBuilder.of("");
|
|
||||||
TextObject currentObject = new TextObject("");
|
|
||||||
StringBuilder text = new StringBuilder();
|
|
||||||
|
|
||||||
for (int i = 0; i < legacyText.length(); i++) {
|
|
||||||
char c = legacyText.charAt(i);
|
|
||||||
|
|
||||||
if (c == ChatColor.SECTION_SYMBOL || c == characterSubstitute) {
|
|
||||||
if ((i + 1) > legacyText.length() - 1) {
|
|
||||||
// do nothing.
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// peek at the next character.
|
|
||||||
char peek = legacyText.charAt(i + 1);
|
|
||||||
|
|
||||||
if (ChatColor.isValid(peek)) {
|
|
||||||
i += 1; // if valid
|
|
||||||
if (text.length() > 0) {
|
|
||||||
// create a new text object
|
|
||||||
currentObject.setText(text.toString());
|
|
||||||
|
|
||||||
// append the current object.
|
|
||||||
builder.appendJson(currentObject);
|
|
||||||
|
|
||||||
// reset the current object.
|
|
||||||
currentObject = new TextObject("");
|
|
||||||
|
|
||||||
// reset the buffer
|
|
||||||
text.setLength(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ChatColor color = ChatColor.getByCharCode(peek);
|
|
||||||
|
|
||||||
switch (color) {
|
|
||||||
case OBFUSCATED:
|
|
||||||
currentObject.setObfuscated(true);
|
|
||||||
break;
|
|
||||||
case BOLD:
|
|
||||||
currentObject.setBold(true);
|
|
||||||
break;
|
|
||||||
case STRIKETHROUGH:
|
|
||||||
currentObject.setStrikethrough(true);
|
|
||||||
break;
|
|
||||||
case ITALIC:
|
|
||||||
currentObject.setItalic(true);
|
|
||||||
break;
|
|
||||||
case UNDERLINE:
|
|
||||||
currentObject.setUnderlined(true);
|
|
||||||
break;
|
|
||||||
case RESET:
|
|
||||||
// Reset everything.
|
|
||||||
currentObject.setColor(ChatColor.WHITE);
|
|
||||||
currentObject.setObfuscated(false);
|
|
||||||
currentObject.setBold(false);
|
|
||||||
currentObject.setItalic(false);
|
|
||||||
currentObject.setUnderlined(false);
|
|
||||||
currentObject.setStrikethrough(false);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// emulate Minecraft's behavior of dropping styles that do not yet have an object.
|
|
||||||
currentObject = new TextObject("");
|
|
||||||
currentObject.setColor(color);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
text.append(c);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
text.append(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// whatever we were working on when the loop exited
|
|
||||||
{
|
|
||||||
currentObject.setText(text.toString());
|
|
||||||
builder.appendJson(currentObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
return builder.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String toLegacy(TextObject object) {
|
|
||||||
return LegacyText.toLegacy(object, ChatColor.SECTION_SYMBOL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Takes an {@link TextObject} and transforms it into a legacy string.
|
|
||||||
*
|
|
||||||
* @param textObject - The {@link TextObject} to transform to.
|
|
||||||
* @param charSubstitute - The substitute character to use if you do not want to use {@link ChatColor#SECTION_SYMBOL}
|
|
||||||
* @return A legacy string representation of a text object
|
|
||||||
*/
|
|
||||||
public static String toLegacy(TextObject textObject, char charSubstitute) {
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
|
|
||||||
if (textObject.getColor() != null) {
|
|
||||||
builder.append(charSubstitute).append(textObject.getColor().charCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (textObject.isObfuscated()) {
|
|
||||||
builder.append(charSubstitute).append(ChatColor.OBFUSCATED.charCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (textObject.isBold()) {
|
|
||||||
builder.append(charSubstitute).append(ChatColor.BOLD.charCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (textObject.isStrikethrough()) {
|
|
||||||
builder.append(charSubstitute).append(ChatColor.STRIKETHROUGH.charCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (textObject.isUnderlined()) {
|
|
||||||
builder.append(charSubstitute).append(ChatColor.UNDERLINE.charCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (textObject.isItalic()) {
|
|
||||||
builder.append(charSubstitute).append(ChatColor.ITALIC.charCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (textObject.getColor() == ChatColor.RESET) {
|
|
||||||
builder.setLength(0);
|
|
||||||
builder.append(charSubstitute).append(ChatColor.RESET.charCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (textObject.getText() != null && !textObject.getText().isEmpty()) {
|
|
||||||
builder.append(textObject.getText());
|
|
||||||
}
|
|
||||||
|
|
||||||
for (TextObject extra : textObject.getExtra()) {
|
|
||||||
builder.append(LegacyText.toLegacy(extra, charSubstitute));
|
|
||||||
}
|
|
||||||
|
|
||||||
return builder.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,112 +0,0 @@
|
|||||||
/*
|
|
||||||
* MIT License
|
|
||||||
*
|
|
||||||
* Copyright (c) 2018 Ryan Willette
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
|
||||||
* copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
* SOFTWARE.
|
|
||||||
*/
|
|
||||||
package club.thectm.minecraft.text;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public final class TextBuilder {
|
|
||||||
private TextObject root;
|
|
||||||
|
|
||||||
// The current text object. This will change when we append text for example
|
|
||||||
private TextObject current;
|
|
||||||
|
|
||||||
// The storage of the extra items
|
|
||||||
private List<TextObject> extra = new ArrayList<>();
|
|
||||||
|
|
||||||
private TextBuilder(TextObject root) {
|
|
||||||
this.root = root;
|
|
||||||
this.current = root;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TextBuilder of(String text) {
|
|
||||||
return new TextBuilder(new TextObject(text));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TextBuilder empty() {
|
|
||||||
return new TextBuilder(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextBuilder color(ChatColor color) {
|
|
||||||
this.current.setColor(color);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextBuilder italicize(boolean b) {
|
|
||||||
this.current.setItalic(b);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextBuilder bold(boolean b) {
|
|
||||||
this.current.setBold(b);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextBuilder underline(boolean b) {
|
|
||||||
this.current.setUnderlined(b);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextBuilder obfuscate(boolean b) {
|
|
||||||
this.current.setObfuscated(b);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextBuilder strikethrough(boolean b) {
|
|
||||||
this.current.setStrikethrough(b);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextBuilder clickEvent(ClickEvent clickEvent) {
|
|
||||||
this.current.setClickEvent(clickEvent);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextBuilder hoverEvent(HoverEvent hoverEvent) {
|
|
||||||
this.current.setHoverEvent(hoverEvent);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextBuilder append(String text) {
|
|
||||||
// essentially this completes what ever object we were on. No turning back!
|
|
||||||
return this.appendJson(new TextObject(text));
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextBuilder appendJson(TextObject object) {
|
|
||||||
if (root == null) {
|
|
||||||
this.root = object;
|
|
||||||
this.current = object;
|
|
||||||
} else {
|
|
||||||
this.extra.add(this.current = object);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextObject build() {
|
|
||||||
// currently we're only adding the extras to the root.
|
|
||||||
this.root.setExtra(extra);
|
|
||||||
return this.root;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,167 +0,0 @@
|
|||||||
/*
|
|
||||||
* MIT License
|
|
||||||
*
|
|
||||||
* Copyright (c) 2018 Ryan Willette
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
|
||||||
* copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
* SOFTWARE.
|
|
||||||
*/
|
|
||||||
package club.thectm.minecraft.text;
|
|
||||||
|
|
||||||
import com.google.gson.JsonArray;
|
|
||||||
import com.google.gson.JsonElement;
|
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
import lombok.AccessLevel;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.ToString;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Getter(AccessLevel.PROTECTED)
|
|
||||||
@ToString
|
|
||||||
public final class TextObject {
|
|
||||||
|
|
||||||
private String text;
|
|
||||||
private ChatColor color;
|
|
||||||
private ClickEvent clickEvent;
|
|
||||||
private HoverEvent hoverEvent;
|
|
||||||
private boolean italic, bold, underlined, obfuscated, strikethrough;
|
|
||||||
private List<TextObject> extra = new ArrayList<>();
|
|
||||||
|
|
||||||
public TextObject(String text) {
|
|
||||||
this.text = text;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TextObject fromJson(JsonObject object) {
|
|
||||||
if (object.has("text")) {
|
|
||||||
TextObject o = new TextObject(object.get("text").getAsString());
|
|
||||||
|
|
||||||
if (object.has("clickEvent")) {
|
|
||||||
o.setClickEvent(ClickEvent.fromJson(object.get("clickEvent").getAsJsonObject()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (object.has("hoverEvent")) {
|
|
||||||
o.setHoverEvent(HoverEvent.fromJson(object.get("hoverEvent").getAsJsonObject()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (object.has("color")) {
|
|
||||||
o.setColor(ChatColor.valueOf(object.get("color").getAsString().toUpperCase()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (object.has("obfuscated"))
|
|
||||||
o.setObfuscated(object.get("obfuscated").getAsBoolean());
|
|
||||||
if (object.has("italic"))
|
|
||||||
o.setItalic(object.get("italic").getAsBoolean());
|
|
||||||
if (object.has("bold"))
|
|
||||||
o.setBold(object.get("bold").getAsBoolean());
|
|
||||||
if (object.has("underlined"))
|
|
||||||
o.setUnderlined(object.get("underlined").getAsBoolean());
|
|
||||||
|
|
||||||
if (object.has("extra")) {
|
|
||||||
for (JsonElement extra : object.getAsJsonArray("extra")) {
|
|
||||||
if (extra.isJsonObject()) {
|
|
||||||
TextObject e = TextObject.fromJson(extra.getAsJsonObject());
|
|
||||||
if (e != null) {
|
|
||||||
o.extra.add(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
// invalid object
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setColor(ChatColor color) {
|
|
||||||
this.color = color;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setClickEvent(ClickEvent clickEvent) {
|
|
||||||
this.clickEvent = clickEvent;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHoverEvent(HoverEvent hoverEvent) {
|
|
||||||
this.hoverEvent = hoverEvent;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setItalic(boolean italic) {
|
|
||||||
this.italic = italic;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBold(boolean bold) {
|
|
||||||
this.bold = bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUnderlined(boolean underlined) {
|
|
||||||
this.underlined = underlined;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStrikethrough(boolean strikethrough) {
|
|
||||||
this.strikethrough = strikethrough;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setObfuscated(boolean obfuscated) {
|
|
||||||
this.obfuscated = obfuscated;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setExtra(List<TextObject> extra) {
|
|
||||||
this.extra.addAll(extra);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setText(String text) {
|
|
||||||
this.text = text;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JsonObject toJson() {
|
|
||||||
JsonObject object = new JsonObject();
|
|
||||||
|
|
||||||
object.addProperty("text", text);
|
|
||||||
|
|
||||||
if (color != null)
|
|
||||||
object.addProperty("color", color.toJsonString());
|
|
||||||
if (clickEvent != null)
|
|
||||||
object.add("clickEvent", clickEvent.toJson());
|
|
||||||
if (hoverEvent != null)
|
|
||||||
object.add("hoverEvent", hoverEvent.toJson());
|
|
||||||
if (italic)
|
|
||||||
object.addProperty("italic", true);
|
|
||||||
if (bold)
|
|
||||||
object.addProperty("bold", true);
|
|
||||||
if (underlined)
|
|
||||||
object.addProperty("underlined", true);
|
|
||||||
if (obfuscated)
|
|
||||||
object.addProperty("obfuscated", true);
|
|
||||||
if (strikethrough)
|
|
||||||
object.addProperty("strikethrough", true);
|
|
||||||
|
|
||||||
if (!extra.isEmpty()) {
|
|
||||||
JsonArray array = new JsonArray();
|
|
||||||
|
|
||||||
for (TextObject ex : extra) {
|
|
||||||
array.add(ex.toJson());
|
|
||||||
}
|
|
||||||
|
|
||||||
object.add("extra", array);
|
|
||||||
}
|
|
||||||
return object;
|
|
||||||
}
|
|
||||||
}
|
|
@ -251,7 +251,7 @@ public class Player extends LivingEntity {
|
|||||||
// send death message to player
|
// send death message to player
|
||||||
TextObject deathMessage;
|
TextObject deathMessage;
|
||||||
if (lastDamageSource != null) {
|
if (lastDamageSource != null) {
|
||||||
deathMessage = lastDamageSource.buildDeathMessage();
|
deathMessage = lastDamageSource.buildDeathScreenMessage(this);
|
||||||
} else { // may happen if killed by the server without applying damage
|
} else { // may happen if killed by the server without applying damage
|
||||||
deathMessage = TextBuilder.of("Killed by poor programming.").build();
|
deathMessage = TextBuilder.of("Killed by poor programming.").build();
|
||||||
}
|
}
|
||||||
|
@ -10,8 +10,8 @@ import net.minestom.server.entity.Player;
|
|||||||
*/
|
*/
|
||||||
public class DamageType {
|
public class DamageType {
|
||||||
|
|
||||||
public static final DamageType VOID = new DamageType("void");
|
public static final DamageType VOID = new DamageType("attack.outOfWorld");
|
||||||
public static final DamageType GRAVITY = new DamageType("gravity");
|
public static final DamageType GRAVITY = new DamageType("attack.fall");
|
||||||
private final String identifier;
|
private final String identifier;
|
||||||
|
|
||||||
public DamageType(String identifier) {
|
public DamageType(String identifier) {
|
||||||
@ -27,14 +27,14 @@ public class DamageType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public TextObject buildChatMessage(Player killed) {
|
public TextObject buildChatMessage(Player killed) {
|
||||||
return TextBuilder.of(killed.getUsername() + " was killed by damage of type " + identifier).build();
|
return TextBuilder.ofTranslation("death."+identifier, TextBuilder.of(killed.getUsername()).build()).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DamageType fromPlayer(Player player) {
|
public static DamageType fromPlayer(Player player) {
|
||||||
return new EntityDamage(player);
|
return new EntityDamage(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TextObject buildDeathMessage() {
|
public TextObject buildDeathScreenMessage(Player killed) {
|
||||||
return TextBuilder.of("Killed by damage of type " + identifier).build();
|
return buildChatMessage(killed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user