diff --git a/doc/Modding.md b/doc/Modding.md
index e2572301e..52e6df0c5 100644
--- a/doc/Modding.md
+++ b/doc/Modding.md
@@ -138,7 +138,7 @@ public class ChatEvent extends EventListener {
if (event.isCancelled()) {
return;
}
- if (event.getMessage().getRawMessage().contains("Bixilon")) {
+ if (event.getMessage().getMessage().contains("Bixilon")) {
MinosoftExampleMod.getInstance().getLogger().game("Bixilon is awful, suppressing this potential bad chat message!");
event.setCancelled(true);
}
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/ChatColors.java b/src/main/java/de/bixilon/minosoft/game/datatypes/ChatColors.java
deleted file mode 100644
index 319ce9717..000000000
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/ChatColors.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Codename Minosoft
- * Copyright (C) 2020 Moritz Zwerger
- *
- * 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 (at your option) 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 .
- *
- * This software is not affiliated with Mojang AB, the original developer of Minecraft.
- */
-
-package de.bixilon.minosoft.game.datatypes;
-
-public enum ChatColors {
- BLACK,
- DARK_BLUE,
- DARK_GREEN,
- DARK_AQUA,
- DARK_RED,
- DARK_PURPLE,
- GOLD,
- GRAY,
- DARK_GRAY,
- BLUE,
- GREEN,
- AQUA,
- RED,
- PURPLE,
- YELLOW,
- WHITE,
- OBFUSCATED,
- BOLD,
- STRIKETHROUGH,
- UNDERLINED,
- ITALIC,
- RESET;
-
- public static ChatColors byId(int id) {
- if (id < 0 || id >= values().length) {
- return null;
- }
- return values()[id];
- }
-
- public String getPrefix() {
- return String.format("%x", getColor());
- }
-
- public int getColor() {
- return ordinal();
- }
-}
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/Player.java b/src/main/java/de/bixilon/minosoft/game/datatypes/Player.java
index d06a76c53..8f9645b2f 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/Player.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/Player.java
@@ -20,6 +20,7 @@ import de.bixilon.minosoft.game.datatypes.inventory.InventorySlots;
import de.bixilon.minosoft.game.datatypes.inventory.Slot;
import de.bixilon.minosoft.game.datatypes.player.PlayerListItem;
import de.bixilon.minosoft.game.datatypes.scoreboard.ScoreboardManager;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.game.datatypes.world.BlockPosition;
import de.bixilon.minosoft.game.datatypes.world.World;
import de.bixilon.minosoft.util.mojang.api.MojangAccount;
@@ -46,8 +47,8 @@ public class Player {
OtherPlayer player;
boolean spawnConfirmed = false;
- TextComponent tabHeader;
- TextComponent tabFooter;
+ BaseComponent tabHeader;
+ BaseComponent tabFooter;
public Player(MojangAccount account) {
this.account = account;
@@ -203,19 +204,19 @@ public class Player {
return null;
}
- public TextComponent getTabHeader() {
+ public BaseComponent getTabHeader() {
return tabHeader;
}
- public void setTabHeader(TextComponent tabHeader) {
+ public void setTabHeader(BaseComponent tabHeader) {
this.tabHeader = tabHeader;
}
- public TextComponent getTabFooter() {
+ public BaseComponent getTabFooter() {
return tabFooter;
}
- public void setTabFooter(TextComponent tabFooter) {
+ public void setTabFooter(BaseComponent tabFooter) {
this.tabFooter = tabFooter;
}
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/TextComponent.java b/src/main/java/de/bixilon/minosoft/game/datatypes/TextComponent.java
deleted file mode 100644
index 652f4a864..000000000
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/TextComponent.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- * Codename Minosoft
- * Copyright (C) 2020 Moritz Zwerger
- *
- * 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 (at your option) 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 .
- *
- * This software is not affiliated with Mojang AB, the original developer of Minecraft.
- */
-
-package de.bixilon.minosoft.game.datatypes;
-
-import com.google.gson.JsonArray;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParseException;
-import com.google.gson.JsonParser;
-
-import java.util.ArrayList;
-
-public class TextComponent {
- final JsonObject json;
- String rawMessage;
- String coloredMessage;
-
- public TextComponent(String raw) {
- JsonObject json;
- if (raw == null) {
- this.json = new JsonObject();
- return;
- }
- try {
- json = JsonParser.parseString(raw).getAsJsonObject();
- } catch (Exception e) {
- // not a text component, is a legacy string
- json = new JsonObject();
- JsonArray extra = new JsonArray();
-
- String[] paragraphSplit = raw.split("§");
-
- StringBuilder message = new StringBuilder();
- ArrayList attributesList = new ArrayList<>();
- ChatAttributes color = ChatAttributes.WHITE;
- boolean first = true;
- for (String paragraph : paragraphSplit) {
- if (paragraph.length() >= 1) {
- if (first) {
- // skip first, just append.
- message.append(paragraph);
- first = false;
- continue;
- }
- // only 1 code without message, append to list
- ChatColors colorCheck = null;
- try {
- colorCheck = ChatColors.byId(Integer.parseInt(paragraph.substring(0, 1), 16));
- } catch (NumberFormatException ignored) {
- }
- if (colorCheck == null) {
- //this is not a color, append attribute to list
- //save and clear
- switch (paragraph.substring(0, 1)) {
- case "k" -> attributesList.add(ChatAttributes.OBFUSCATED);
- case "l" -> attributesList.add(ChatAttributes.BOLD);
- case "m" -> attributesList.add(ChatAttributes.STRIKETHROUGH);
- case "n" -> attributesList.add(ChatAttributes.UNDERLINED);
- case "o" -> attributesList.add(ChatAttributes.ITALIC);
- case "r" -> {
- extra.add(getExtraByAttributes(message.toString(), color, attributesList));
- attributesList.clear();
- color = ChatAttributes.WHITE;
- message = new StringBuilder();
- }
- }
- } else {
- // save current
- if (!message.toString().isEmpty()) {
- extra.add(getExtraByAttributes(message.toString(), color, attributesList));
- message = new StringBuilder();
- }
- color = ChatAttributes.byColor(colorCheck);
- }
- message.append(paragraph.substring(1));
- } else {
- if (first) {
- // skip first
- first = false;
- }
- }
- }
- // save
- extra.add(getExtraByAttributes(message.toString(), color, attributesList));
-
- json.add("extra", extra);
- }
- this.json = json;
- }
-
- static JsonObject getExtraByAttributes(String message, ChatAttributes color, ArrayList formatting) {
- JsonObject ret = new JsonObject();
- ret.addProperty("text", message);
- if (color != null) {
- ret.addProperty("color", color.name());
- }
- formatting.forEach((attribute) -> {
- if (attribute == ChatAttributes.BOLD && !ret.has("bold")) {
- ret.addProperty("bold", true);
- } else if (attribute == ChatAttributes.ITALIC && !ret.has("italic")) {
- ret.addProperty("italic", true);
- } else if (attribute == ChatAttributes.UNDERLINED && !ret.has("underlined")) {
- ret.addProperty("underlined", true);
- } else if (attribute == ChatAttributes.STRIKETHROUGH && !ret.has("strikethrough")) {
- ret.addProperty("strikethrough", true);
- } else if (attribute == ChatAttributes.OBFUSCATED && !ret.has("obfuscated")) {
- ret.addProperty("obfuscated", true);
- }
- });
- return ret;
- }
-
- public TextComponent(JsonObject json) {
- this.json = json;
- }
-
- public String getRawMessage() {
- if (rawMessage == null) {
- if (json.has("text") && json.get("text").getAsString().length() != 0) {
- rawMessage = json.get("text").getAsString();
- } else {
- StringBuilder buffer = new StringBuilder();
- if (json.has("extra")) {
- JsonArray arr = json.getAsJsonArray("extra");
- for (int i = 0; i < arr.size(); i++) {
- JsonObject object;
- try {
- object = arr.get(i).getAsJsonObject();
- } catch (JsonParseException e) {
- // reset text
- buffer.append(arr.get(i).getAsString());
- continue;
- }
- buffer.append(object.get("text").getAsString());
- }
- rawMessage = buffer.toString();
- } else if (json.has("with")) {
- JsonArray arr = json.getAsJsonArray("with");
- for (int i = 0; i < arr.size(); i++) {
- if (arr.get(i).isJsonPrimitive()) {
- buffer.append(" ");
- buffer.append(arr.get(i).getAsString());
- continue;
- }
- JsonObject object = arr.get(i).getAsJsonObject();
- buffer.append(object.get("text").getAsString());
- buffer.append(" ");
- }
- } else {
- rawMessage = "";
- }
- rawMessage = buffer.toString();
- }
- }
- return rawMessage;
- }
-
- public JsonObject getRaw() {
- return this.json;
- }
-
- @Override
- public String toString() {
- return getColoredMessage();
- }
-
- public String getColoredMessage() {
- if (coloredMessage == null) {
- if (json.has("text") && json.get("text").getAsString().length() != 0) {
- coloredMessage = json.get("text").getAsString();
- } else {
- StringBuilder buffer = new StringBuilder();
- if (json.has("extra")) {
- JsonArray arr = json.getAsJsonArray("extra");
- for (int i = 0; i < arr.size(); i++) {
- if (arr.get(i).isJsonPrimitive()) {
- buffer.append(ChatAttributes.RESET);
- buffer.append(" ");
- buffer.append(arr.get(i).getAsString());
- continue;
- }
- JsonObject object = arr.get(i).getAsJsonObject();
- if (object.has("bold") && object.get("bold").getAsBoolean()) {
- buffer.append(ChatAttributes.BOLD);
- }
- if (object.has("color")) {
- buffer.append(ChatAttributes.byName(object.get("color").getAsString()));
- }
- if (object.has("italic") && object.get("italic").getAsBoolean()) {
- buffer.append(ChatAttributes.ITALIC);
- }
- if (object.has("underlined") && object.get("underlined").getAsBoolean()) {
- buffer.append(ChatAttributes.UNDERLINED);
- }
- if (object.has("strikethrough") && object.get("strikethrough").getAsBoolean()) {
- buffer.append(ChatAttributes.STRIKETHROUGH);
- }
- if (object.has("obfuscated") && object.get("obfuscated").getAsBoolean()) {
- buffer.append(ChatAttributes.OBFUSCATED);
- }
- buffer.append(object.get("text").getAsString());
- }
- buffer.append(ChatAttributes.RESET);
- }
- if (json.has("with")) {
- JsonArray arr = json.getAsJsonArray("with");
- for (int i = 0; i < arr.size(); i++) {
- if (arr.get(i).isJsonPrimitive()) {
- buffer.append(ChatAttributes.RESET);
- buffer.append(" ");
- buffer.append(arr.get(i).getAsString());
- continue;
- }
- JsonObject object = arr.get(i).getAsJsonObject();
- buffer.append(object.get("text").getAsString());
- buffer.append(" ");
- }
- buffer.append(ChatAttributes.RESET);
- }
- coloredMessage = buffer.toString();
- }
- }
- return coloredMessage;
- }
-
- public String getLegacyText() {
- //ToDo
- return null;
- }
-
- public enum ChatAttributes {
- BLACK("\033[38;2;0;0;0m", ChatColors.BLACK),
- DARK_BLUE("\033[38;2;0;0;170m", ChatColors.DARK_BLUE),
- DARK_GREEN("\033[38;2;0;170;0m", ChatColors.DARK_GREEN),
- DARK_AQUA("\033[38;2;0;170;170m", ChatColors.DARK_AQUA),
- DARK_RED("\033[38;2;170;0;0m", ChatColors.DARK_RED),
- DARK_PURPLE("\033[38;2;170;0;170m", ChatColors.DARK_PURPLE),
- GOLD("\033[38;2;255;170;0m", ChatColors.GOLD),
- GRAY("\033[38;2;170;170;170m", ChatColors.GRAY),
- DARK_GRAY("\033[38;2;85;85;85m", ChatColors.DARK_GRAY),
- BLUE("\033[38;2;85;85;255m", ChatColors.DARK_BLUE),
- GREEN("\033[38;2;85;255;85m", ChatColors.GREEN),
- AQUA("\033[38;2;85;255;255m", ChatColors.AQUA),
- RED("\033[38;2;255;85;85m", ChatColors.RED),
- LIGHT_PURPLE("\033[38;2;255;85;255m", ChatColors.PURPLE),
- YELLOW("\033[38;2;255;255;85m", ChatColors.YELLOW),
- WHITE("\033[38;2;255;255;255m", ChatColors.WHITE),
-
- RESET("\u001b[0m", "r"),
- BOLD("\u001b[1m", "l"),
- STRIKETHROUGH("\u001b[9m", "m"),
- UNDERLINED("\u001b[4m", "n"),
- ITALIC("\u001b[3m", "o"),
- OBFUSCATED("\u001b[47;1m", "k"); // ToDo
-
- final String consolePrefix;
- final ChatColors color;
- final String prefix;
-
- ChatAttributes(String consolePrefix, ChatColors color) {
- this.consolePrefix = consolePrefix;
- this.color = color;
- this.prefix = null;
- }
-
- ChatAttributes(String consolePrefix, String prefix, String name) {
- this.consolePrefix = consolePrefix;
- this.prefix = prefix;
- this.color = null;
- }
-
- ChatAttributes(String consolePrefix, String prefix) {
- this.consolePrefix = consolePrefix;
- this.prefix = prefix;
- this.color = null;
- }
-
- public static ChatAttributes byName(String name) {
- return valueOf(name.toUpperCase());
- }
-
- public static ChatAttributes byColor(ChatColors color) {
- for (ChatAttributes attribute : values()) {
- if (attribute.getColor() == color) {
- return attribute;
- }
- }
- return null;
- }
-
- public ChatColors getColor() {
- return color;
- }
-
- public String getPrefix() {
- if (prefix == null) {
- return color.getPrefix();
- }
- return prefix;
- }
-
- @Override
- public String toString() {
- return getConsolePrefix();
- }
-
- public String getConsolePrefix() {
- return consolePrefix;
- }
- }
-}
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/CatMetaData.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/CatMetaData.java
index 14f6d0628..79f0dada9 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/CatMetaData.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/CatMetaData.java
@@ -12,7 +12,9 @@
*/
package de.bixilon.minosoft.game.datatypes.entities.meta;
-import de.bixilon.minosoft.game.datatypes.Colors;
+
+import de.bixilon.minosoft.game.datatypes.text.ChatColors;
+import de.bixilon.minosoft.game.datatypes.text.RGBColor;
public class CatMetaData extends AnimalMetaData {
@@ -28,12 +30,12 @@ public class CatMetaData extends AnimalMetaData {
return CatTypes.byId(sets.getInt(super.getLastDataIndex() + 1, defaultValue));
}
- public Colors getCollarColor() {
- final int defaultValue = Colors.RED.ordinal();
+ public RGBColor getCollarColor() {
+ final int defaultValue = ChatColors.getColorId(ChatColors.getColorByName("red"));
if (protocolId < 477) { // ToDo
- return Colors.byId(defaultValue);
+ return ChatColors.getColorById(defaultValue);
}
- return Colors.byId(sets.getInt(super.getLastDataIndex() + 2, defaultValue));
+ return ChatColors.getColorById(sets.getInt(super.getLastDataIndex() + 2, defaultValue));
}
@Override
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/CommandBlockMinecartMetaData.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/CommandBlockMinecartMetaData.java
index 9239c1615..64cf9cdb6 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/CommandBlockMinecartMetaData.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/CommandBlockMinecartMetaData.java
@@ -12,7 +12,7 @@
*/
package de.bixilon.minosoft.game.datatypes.entities.meta;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import javax.annotation.Nullable;
@@ -32,8 +32,8 @@ public class CommandBlockMinecartMetaData extends EntityMetaData {
}
@Nullable
- public TextComponent getLastOutput() {
- final TextComponent defaultValue = null;
+ public BaseComponent getLastOutput() {
+ final BaseComponent defaultValue = null;
if (protocolId < 110) { //ToDo
return defaultValue;
}
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/EntityMetaData.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/EntityMetaData.java
index b7a6ec11b..03efa2d18 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/EntityMetaData.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/EntityMetaData.java
@@ -18,6 +18,7 @@ import de.bixilon.minosoft.game.datatypes.entities.VillagerData;
import de.bixilon.minosoft.game.datatypes.inventory.Slot;
import de.bixilon.minosoft.game.datatypes.objectLoader.blocks.Block;
import de.bixilon.minosoft.game.datatypes.objectLoader.particle.data.ParticleData;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.game.datatypes.world.BlockPosition;
import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
import de.bixilon.minosoft.util.BitByte;
@@ -132,12 +133,12 @@ public class EntityMetaData {
}
@Nullable
- public TextComponent getNameTag() {
+ public BaseComponent getNameTag() {
if (protocolId <= 110) { //ToDo
return null;
}
if (protocolId <= 335) { //ToDo
- return new TextComponent(sets.getString(2, null));
+ return BaseComponent.fromString(sets.getString(2, null));
}
return sets.getTextComponent(2, null);
}
@@ -322,8 +323,8 @@ public class EntityMetaData {
return (Slot) get(index, defaultValue);
}
- public TextComponent getTextComponent(int index, TextComponent defaultValue) {
- return (TextComponent) get(index, defaultValue);
+ public BaseComponent getTextComponent(int index, BaseComponent defaultValue) {
+ return (BaseComponent) get(index, defaultValue);
}
public String getString(int index, String defaultValue) {
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/LivingMetaData.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/LivingMetaData.java
index b8482e807..210ec3db5 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/LivingMetaData.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/LivingMetaData.java
@@ -12,8 +12,8 @@
*/
package de.bixilon.minosoft.game.datatypes.entities.meta;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
import de.bixilon.minosoft.game.datatypes.player.Hands;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import javax.annotation.Nullable;
@@ -70,12 +70,12 @@ public class LivingMetaData extends EntityMetaData {
@Nullable
@Override
- public TextComponent getNameTag() {
+ public BaseComponent getNameTag() {
if (protocolId < 7) { //ToDo
- return new TextComponent(sets.getString(10, null));
+ return BaseComponent.fromString(sets.getString(10, null));
}
if (protocolId < 57) { //ToDo
- return new TextComponent(sets.getString(2, null));
+ return BaseComponent.fromString(sets.getString(2, null));
}
return super.getNameTag();
}
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/LlamaMetaData.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/LlamaMetaData.java
index ba086e783..47aa31972 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/LlamaMetaData.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/LlamaMetaData.java
@@ -12,7 +12,9 @@
*/
package de.bixilon.minosoft.game.datatypes.entities.meta;
-import de.bixilon.minosoft.game.datatypes.Colors;
+
+import de.bixilon.minosoft.game.datatypes.text.ChatColors;
+import de.bixilon.minosoft.game.datatypes.text.RGBColor;
import javax.annotation.Nullable;
@@ -31,12 +33,15 @@ public class LlamaMetaData extends ChestedHorseMetaData {
}
@Nullable
- public Colors getCarpetColor() {
- final int defaultValue = -1;
+ public RGBColor getCarpetColor() {
+ final RGBColor defaultValue = null;
if (protocolId < 315) { // ToDo
- return Colors.byId(defaultValue);
+ return defaultValue;
}
- return Colors.byId(sets.getInt(super.getLastDataIndex() + 2, defaultValue));
+ if (!sets.containsKey(super.getLastDataIndex() + 2)) {
+ return defaultValue;
+ }
+ return ChatColors.getColorById(sets.getInt(super.getLastDataIndex() + 2, 0));
}
public LlamaVariants getVariant() {
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/SheepMetaData.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/SheepMetaData.java
index 4c1d8cafd..41d38f520 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/SheepMetaData.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/SheepMetaData.java
@@ -12,7 +12,9 @@
*/
package de.bixilon.minosoft.game.datatypes.entities.meta;
-import de.bixilon.minosoft.game.datatypes.Colors;
+
+import de.bixilon.minosoft.game.datatypes.text.ChatColors;
+import de.bixilon.minosoft.game.datatypes.text.RGBColor;
public class SheepMetaData extends AnimalMetaData {
@@ -20,12 +22,12 @@ public class SheepMetaData extends AnimalMetaData {
super(sets, protocolId);
}
- public Colors getColor() {
- final int defaultValue = Colors.WHITE.ordinal();
+ public RGBColor getColor() {
+ final int defaultValue = ChatColors.getColorId(ChatColors.getColorByName("white"));
if (protocolId < 57) {
- return Colors.byId(sets.getInt(16, defaultValue) & 0xF);
+ return ChatColors.getColorById(sets.getInt(16, defaultValue) & 0xF);
}
- return Colors.byId(sets.getInt(super.getLastDataIndex() + 1, defaultValue) & 0xF);
+ return ChatColors.getColorById(sets.getInt(super.getLastDataIndex() + 1, defaultValue) & 0xF);
}
public boolean isSheared() {
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/ShulkerMetaData.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/ShulkerMetaData.java
index 68d48f333..085e0b1fe 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/ShulkerMetaData.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/ShulkerMetaData.java
@@ -12,8 +12,9 @@
*/
package de.bixilon.minosoft.game.datatypes.entities.meta;
-import de.bixilon.minosoft.game.datatypes.Colors;
import de.bixilon.minosoft.game.datatypes.Directions;
+import de.bixilon.minosoft.game.datatypes.text.ChatColors;
+import de.bixilon.minosoft.game.datatypes.text.RGBColor;
import de.bixilon.minosoft.game.datatypes.world.BlockPosition;
import javax.annotation.Nullable;
@@ -49,12 +50,12 @@ public class ShulkerMetaData extends GolemMetaData {
return sets.getByte(super.getLastDataIndex(), defaultValue);
}
- public Colors getColor() {
- final int defaultValue = Colors.PURPLE.ordinal();
+ public RGBColor getColor() {
+ final int defaultValue = ChatColors.getColorId(ChatColors.getColorByName("purple"));
if (protocolId < 110) { //ToDo
- return Colors.byId(defaultValue);
+ return ChatColors.getColorById(defaultValue);
}
- return Colors.byId(sets.getByte(super.getLastDataIndex(), defaultValue));
+ return ChatColors.getColorById(sets.getByte(super.getLastDataIndex(), defaultValue));
}
@Override
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/WolfMetaData.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/WolfMetaData.java
index 45dee6e58..853678ba4 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/WolfMetaData.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/WolfMetaData.java
@@ -12,7 +12,9 @@
*/
package de.bixilon.minosoft.game.datatypes.entities.meta;
-import de.bixilon.minosoft.game.datatypes.Colors;
+
+import de.bixilon.minosoft.game.datatypes.text.ChatColors;
+import de.bixilon.minosoft.game.datatypes.text.RGBColor;
public class WolfMetaData extends TameableMetaData {
@@ -64,12 +66,12 @@ public class WolfMetaData extends TameableMetaData {
return sets.getBoolean(super.getLastDataIndex() + 1, defaultValue);
}
- public Colors getColor() {
- final int defaultValue = Colors.RED.ordinal();
+ public RGBColor getColor() {
+ final int defaultValue = ChatColors.getColorId(ChatColors.getColorByName("red"));
if (protocolId < 57) {
- return Colors.byId(sets.getByte(20, defaultValue));
+ return ChatColors.getColorById(sets.getByte(20, defaultValue));
}
- return Colors.byId(sets.getInt(super.getLastDataIndex() + 2, defaultValue));
+ return ChatColors.getColorById(sets.getByte(super.getLastDataIndex() + 2, defaultValue));
}
public int getAngerTime() {
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/inventory/InventoryProperties.java b/src/main/java/de/bixilon/minosoft/game/datatypes/inventory/InventoryProperties.java
index 4c948b25a..fd503a59b 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/inventory/InventoryProperties.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/inventory/InventoryProperties.java
@@ -13,15 +13,15 @@
package de.bixilon.minosoft.game.datatypes.inventory;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
public class InventoryProperties {
final int windowId;
final InventoryTypes type;
- final TextComponent title;
+ final BaseComponent title;
final byte slotCount;
- public InventoryProperties(int windowId, InventoryTypes type, TextComponent title, byte slotCount) {
+ public InventoryProperties(int windowId, InventoryTypes type, BaseComponent title, byte slotCount) {
this.windowId = windowId;
this.type = type;
this.title = title;
@@ -36,7 +36,7 @@ public class InventoryProperties {
return type;
}
- public TextComponent getTitle() {
+ public BaseComponent getTitle() {
return title;
}
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/inventory/Slot.java b/src/main/java/de/bixilon/minosoft/game/datatypes/inventory/Slot.java
index 5859f962e..2042b7dfe 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/inventory/Slot.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/inventory/Slot.java
@@ -13,10 +13,10 @@
package de.bixilon.minosoft.game.datatypes.inventory;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
import de.bixilon.minosoft.game.datatypes.objectLoader.CustomMapping;
import de.bixilon.minosoft.game.datatypes.objectLoader.enchantments.Enchantment;
import de.bixilon.minosoft.game.datatypes.objectLoader.items.Item;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.util.BitByte;
import de.bixilon.minosoft.util.nbt.tag.*;
@@ -31,11 +31,11 @@ public class Slot {
short itemMetadata;
int repairCost;
int durability;
- TextComponent customDisplayName;
+ BaseComponent customDisplayName;
boolean unbreakable;
String skullOwner;
byte hideFlags;
- ArrayList lore = new ArrayList<>();
+ ArrayList lore = new ArrayList<>();
public Slot(CustomMapping mapping, Item item, int itemCount, CompoundTag nbt) {
this.item = item;
@@ -53,11 +53,11 @@ public class Slot {
if (nbt.containsKey("display")) {
CompoundTag display = nbt.getCompoundTag("display");
if (display.containsKey("Name")) {
- this.customDisplayName = new TextComponent(display.getStringTag("Name").getValue());
+ this.customDisplayName = BaseComponent.fromString(display.getStringTag("Name").getValue());
}
if (display.containsKey("Lore")) {
for (StringTag lore : display.getListTag("Lore").getValue()) {
- this.lore.add(new TextComponent(lore.getValue()));
+ this.lore.add(BaseComponent.fromString(lore.getValue()));
}
}
}
@@ -109,7 +109,7 @@ public class Slot {
display.writeTag("Name", new StringTag(customDisplayName.getLegacyText()));
}
if (lore.size() > 0) {
- display.writeTag("Lore", new ListTag(TagTypes.STRING, lore.stream().map(TextComponent::getLegacyText).map(StringTag::new).toArray(StringTag[]::new)));
+ display.writeTag("Lore", new ListTag(TagTypes.STRING, lore.stream().map(BaseComponent::getLegacyText).map(StringTag::new).toArray(StringTag[]::new)));
}
if (display.size() > 0) {
nbt.writeTag("display", display);
@@ -185,19 +185,19 @@ public class Slot {
}
public String getDisplayName() {
- TextComponent customName = getCustomDisplayName();
+ BaseComponent customName = getCustomDisplayName();
if (customName != null) {
- return customName.getColoredMessage();
+ return customName.getANSIColoredMessage();
}
return (item == null ? "AIR" : item.toString()); // ToDo display name per Item (from language file)
}
@Nullable
- public TextComponent getCustomDisplayName() {
+ public BaseComponent getCustomDisplayName() {
return customDisplayName;
}
- public void setCustomDisplayName(TextComponent customDisplayName) {
+ public void setCustomDisplayName(BaseComponent customDisplayName) {
this.customDisplayName = customDisplayName;
}
@@ -271,7 +271,7 @@ public class Slot {
this.skullOwner = skullOwner;
}
- public ArrayList getLore() {
+ public ArrayList getLore() {
return lore;
}
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/player/PlayerListItem.java b/src/main/java/de/bixilon/minosoft/game/datatypes/player/PlayerListItem.java
index e8bfa9bb7..67e4f17ef 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/player/PlayerListItem.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/player/PlayerListItem.java
@@ -14,7 +14,7 @@
package de.bixilon.minosoft.game.datatypes.player;
import de.bixilon.minosoft.game.datatypes.GameModes;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import java.util.HashMap;
import java.util.UUID;
@@ -28,7 +28,7 @@ public class PlayerListItem {
int ping;
//optional fields
GameModes gameMode;
- TextComponent displayName;
+ BaseComponent displayName;
HashMap properties;
/**
@@ -44,7 +44,7 @@ public class PlayerListItem {
this.legacy = true;
}
- public PlayerListItem(UUID uuid, String name, int ping, GameModes gameMode, TextComponent displayName, HashMap properties) {
+ public PlayerListItem(UUID uuid, String name, int ping, GameModes gameMode, BaseComponent displayName, HashMap properties) {
this.uuid = uuid;
this.name = name;
this.ping = ping;
@@ -78,15 +78,15 @@ public class PlayerListItem {
this.gameMode = gameMode;
}
- public TextComponent getDisplayName() {
- return (hasDisplayName() ? displayName : new TextComponent(name));
+ public BaseComponent getDisplayName() {
+ return (hasDisplayName() ? displayName : BaseComponent.fromString(name));
}
public boolean hasDisplayName() {
return displayName != null;
}
- public void setDisplayName(TextComponent displayName) {
+ public void setDisplayName(BaseComponent displayName) {
this.displayName = displayName;
}
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/player/PlayerListItemBulk.java b/src/main/java/de/bixilon/minosoft/game/datatypes/player/PlayerListItemBulk.java
index 662f72589..0517994d9 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/player/PlayerListItemBulk.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/player/PlayerListItemBulk.java
@@ -14,7 +14,7 @@
package de.bixilon.minosoft.game.datatypes.player;
import de.bixilon.minosoft.game.datatypes.GameModes;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketPlayerListItem;
import java.util.HashMap;
@@ -29,7 +29,7 @@ public class PlayerListItemBulk {
final int ping;
//optional fields
final GameModes gameMode;
- final TextComponent displayName;
+ final BaseComponent displayName;
final HashMap properties;
final PacketPlayerListItem.PlayerListItemActions action;
@@ -44,7 +44,7 @@ public class PlayerListItemBulk {
this.legacy = true;
}
- public PlayerListItemBulk(UUID uuid, String name, int ping, GameModes gameMode, TextComponent displayName, HashMap properties, PacketPlayerListItem.PlayerListItemActions action) {
+ public PlayerListItemBulk(UUID uuid, String name, int ping, GameModes gameMode, BaseComponent displayName, HashMap properties, PacketPlayerListItem.PlayerListItemActions action) {
this.uuid = uuid;
this.name = name;
this.ping = ping;
@@ -71,8 +71,8 @@ public class PlayerListItemBulk {
return gameMode;
}
- public TextComponent getDisplayName() {
- return (hasDisplayName() ? displayName : new TextComponent(name));
+ public BaseComponent getDisplayName() {
+ return (hasDisplayName() ? displayName : BaseComponent.fromString(name));
}
public boolean hasDisplayName() {
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/player/advancements/AdvancementDisplay.java b/src/main/java/de/bixilon/minosoft/game/datatypes/player/advancements/AdvancementDisplay.java
index 466e59601..8bf848900 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/player/advancements/AdvancementDisplay.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/player/advancements/AdvancementDisplay.java
@@ -13,13 +13,13 @@
package de.bixilon.minosoft.game.datatypes.player.advancements;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
import de.bixilon.minosoft.game.datatypes.inventory.Slot;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.util.BitByte;
public class AdvancementDisplay {
- final TextComponent title;
- final TextComponent description;
+ final BaseComponent title;
+ final BaseComponent description;
final Slot icon;
final AdvancementFrameTypes frameType;
final int flags;
@@ -27,7 +27,7 @@ public class AdvancementDisplay {
final float x;
final float y;
- public AdvancementDisplay(TextComponent title, TextComponent description, Slot icon, AdvancementFrameTypes frameType, int flags, String backgroundTexture, float x, float y) {
+ public AdvancementDisplay(BaseComponent title, BaseComponent description, Slot icon, AdvancementFrameTypes frameType, int flags, String backgroundTexture, float x, float y) {
this.title = title;
this.description = description;
this.icon = icon;
@@ -38,7 +38,7 @@ public class AdvancementDisplay {
this.y = y;
}
- public AdvancementDisplay(TextComponent title, TextComponent description, Slot icon, AdvancementFrameTypes frameType, int flags, float x, float y) {
+ public AdvancementDisplay(BaseComponent title, BaseComponent description, Slot icon, AdvancementFrameTypes frameType, int flags, float x, float y) {
this.title = title;
this.description = description;
this.icon = icon;
@@ -49,11 +49,11 @@ public class AdvancementDisplay {
this.y = y;
}
- public TextComponent getTitle() {
+ public BaseComponent getTitle() {
return title;
}
- public TextComponent getDescription() {
+ public BaseComponent getDescription() {
return description;
}
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/scoreboard/ScoreboardObjective.java b/src/main/java/de/bixilon/minosoft/game/datatypes/scoreboard/ScoreboardObjective.java
index 71492201c..4062644ba 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/scoreboard/ScoreboardObjective.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/scoreboard/ScoreboardObjective.java
@@ -13,16 +13,16 @@
package de.bixilon.minosoft.game.datatypes.scoreboard;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import java.util.HashMap;
public class ScoreboardObjective {
final String objectiveName;
final HashMap scores = new HashMap<>();
- TextComponent objectiveValue;
+ BaseComponent objectiveValue;
- public ScoreboardObjective(String objectiveName, TextComponent objectiveValue) {
+ public ScoreboardObjective(String objectiveName, BaseComponent objectiveValue) {
this.objectiveName = objectiveName;
this.objectiveValue = objectiveValue;
}
@@ -31,7 +31,7 @@ public class ScoreboardObjective {
return objectiveName;
}
- public TextComponent getObjectiveValue() {
+ public BaseComponent getObjectiveValue() {
return objectiveValue;
}
@@ -57,7 +57,7 @@ public class ScoreboardObjective {
return scores.get(itemName);
}
- public void setValue(TextComponent value) {
+ public void setValue(BaseComponent value) {
objectiveValue = value;
}
}
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/scoreboard/Team.java b/src/main/java/de/bixilon/minosoft/game/datatypes/scoreboard/Team.java
index 3c12d3da8..1da54729c 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/scoreboard/Team.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/scoreboard/Team.java
@@ -13,7 +13,7 @@
package de.bixilon.minosoft.game.datatypes.scoreboard;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import java.util.ArrayList;
import java.util.Arrays;
@@ -22,13 +22,13 @@ import java.util.List;
public class Team {
final String name;
final ArrayList players;
- TextComponent displayName;
- TextComponent prefix;
- TextComponent suffix;
+ BaseComponent displayName;
+ BaseComponent prefix;
+ BaseComponent suffix;
boolean friendlyFire;
boolean seeFriendlyInvisibles;
- public Team(String name, TextComponent displayName, TextComponent prefix, TextComponent suffix, boolean friendlyFire, boolean seeFriendlyInvisibles, String[] players) {
+ public Team(String name, BaseComponent displayName, BaseComponent prefix, BaseComponent suffix, boolean friendlyFire, boolean seeFriendlyInvisibles, String[] players) {
this.name = name;
this.displayName = displayName;
this.prefix = prefix;
@@ -38,7 +38,7 @@ public class Team {
this.players = new ArrayList<>(Arrays.asList(players));
}
- public void updateInformation(TextComponent displayName, TextComponent prefix, TextComponent suffix, boolean friendlyFire, boolean seeFriendlyInvisibles) {
+ public void updateInformation(BaseComponent displayName, BaseComponent prefix, BaseComponent suffix, boolean friendlyFire, boolean seeFriendlyInvisibles) {
this.displayName = displayName;
this.prefix = prefix;
this.suffix = suffix;
@@ -50,15 +50,15 @@ public class Team {
return name;
}
- public TextComponent getDisplayName() {
+ public BaseComponent getDisplayName() {
return displayName;
}
- public TextComponent getPrefix() {
+ public BaseComponent getPrefix() {
return prefix;
}
- public TextComponent getSuffix() {
+ public BaseComponent getSuffix() {
return suffix;
}
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/Colors.java b/src/main/java/de/bixilon/minosoft/game/datatypes/text/BaseComponent.java
similarity index 56%
rename from src/main/java/de/bixilon/minosoft/game/datatypes/Colors.java
rename to src/main/java/de/bixilon/minosoft/game/datatypes/text/BaseComponent.java
index 6efcd83ae..dbbaca800 100644
--- a/src/main/java/de/bixilon/minosoft/game/datatypes/Colors.java
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/text/BaseComponent.java
@@ -11,27 +11,28 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
-package de.bixilon.minosoft.game.datatypes;
+package de.bixilon.minosoft.game.datatypes.text;
-public enum Colors {
- WHITE,
- ORANGE,
- MAGENTA,
- LIGHT_BLUE,
- YELLOW,
- LIME,
- PINK,
- GRAY,
- SILVER,
- CYAN,
- PURPLE,
- BLUE,
- BROWN,
- GREEN,
- RED,
- BLACK;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonParser;
- public static Colors byId(int id) {
- return values()[id];
+public interface BaseComponent {
+ static BaseComponent fromString(String raw) {
+ if (raw == null) {
+ return new TextComponent();
+ }
+ try {
+ return new TextComponent(JsonParser.parseString(raw).getAsJsonObject());
+ } catch (JsonParseException | IllegalStateException ignored) {
+ }
+ return new TextComponent(raw);
}
-}
+
+ String toString();
+
+ String getANSIColoredMessage();
+
+ String getLegacyText();
+
+ String getMessage();
+}
\ No newline at end of file
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/text/ChatColors.java b/src/main/java/de/bixilon/minosoft/game/datatypes/text/ChatColors.java
new file mode 100644
index 000000000..03e04ba9d
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/text/ChatColors.java
@@ -0,0 +1,81 @@
+/*
+ * Codename Minosoft
+ * Copyright (C) 2020 Moritz Zwerger
+ *
+ * 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 (at your option) 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 .
+ *
+ * This software is not affiliated with Mojang AB, the original developer of Minecraft.
+ */
+
+package de.bixilon.minosoft.game.datatypes.text;
+
+import com.google.common.collect.HashBiMap;
+
+public final class ChatColors {
+ private static final HashBiMap colors = HashBiMap.create();
+
+ static {
+ colors.put(0, new RGBColor(0, 0, 0));
+ colors.put(1, new RGBColor(0, 0, 170));
+ colors.put(2, new RGBColor(0, 170, 0));
+ colors.put(3, new RGBColor(0, 170, 170));
+ colors.put(4, new RGBColor(170, 0, 0));
+ colors.put(5, new RGBColor(170, 0, 170));
+ colors.put(6, new RGBColor(255, 170, 0));
+ colors.put(7, new RGBColor(170, 170, 170));
+ colors.put(8, new RGBColor(85, 85, 85));
+ colors.put(9, new RGBColor(85, 85, 255));
+ colors.put(10, new RGBColor(85, 255, 85));
+ colors.put(11, new RGBColor(85, 255, 255));
+ colors.put(12, new RGBColor(255, 85, 85));
+ colors.put(13, new RGBColor(255, 85, 255));
+ colors.put(14, new RGBColor(255, 255, 85));
+ colors.put(15, new RGBColor(255, 255, 255));
+ }
+
+ public static String getANSIColorByFormattingChar(char c) {
+ return getANSIColorByRGBColor(getColorByFormattingChar(c));
+ }
+
+ public static String getANSIColorByRGBColor(RGBColor color) {
+ return String.format("\033[38;2;%d;%d;%dm", color.getRed(), color.getGreen(), color.getBlue());
+ }
+
+ public static RGBColor getColorByFormattingChar(char c) {
+ return colors.get(Character.digit(c, 16));
+ }
+
+ public static RGBColor getColorById(int id) {
+ return colors.get(id);
+ }
+
+ public static int getColorId(RGBColor color) {
+ return colors.inverse().get(color);
+ }
+
+ public static RGBColor getColorByName(String name) {
+ return colors.get(switch (name.toLowerCase()) {
+ case "black" -> 0;
+ case "dark_blue" -> 1;
+ case "dark_green" -> 2;
+ case "dark_aqua" -> 3;
+ case "dark_red" -> 4;
+ case "dark_purple" -> 5;
+ case "gold" -> 6;
+ case "gray", "grey" -> 7;
+ case "dark_gray", "dark_grey" -> 8;
+ case "blue" -> 9;
+ case "green" -> 10;
+ case "aqua" -> 11;
+ case "red" -> 12;
+ case "light_purple" -> 13;
+ case "yellow" -> 14;
+ case "white" -> 15;
+ default -> throw new IllegalStateException("Unexpected value: " + name);
+ });
+ }
+}
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/text/ChatFormattingCodes.java b/src/main/java/de/bixilon/minosoft/game/datatypes/text/ChatFormattingCodes.java
new file mode 100644
index 000000000..744caaedc
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/text/ChatFormattingCodes.java
@@ -0,0 +1,77 @@
+/*
+ * Codename Minosoft
+ * Copyright (C) 2020 Moritz Zwerger
+ *
+ * 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 (at your option) 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 .
+ *
+ * This software is not affiliated with Mojang AB, the original developer of Minecraft.
+ */
+
+package de.bixilon.minosoft.game.datatypes.text;
+
+import com.google.common.collect.HashBiMap;
+
+import java.util.Arrays;
+
+public enum ChatFormattingCodes {
+ OBFUSCATED('k', "\u001b[5m"),
+ BOLD('l', "\u001b[1m"),
+ STRIKETHROUGH('m', "\u001b[9m"),
+ UNDERLINED('n', "\u001b[4m"),
+ ITALIC('o', "\u001b[3m"),
+ RESET('r', "\u001b[0m", ChatFormattingCodePosition.POST);
+
+ private final static HashBiMap formattingCodes = HashBiMap.create();
+
+ static {
+ Arrays.stream(values()).forEach(chatFormattingCodes -> formattingCodes.put(chatFormattingCodes.getChar(), chatFormattingCodes));
+ }
+
+ final char c;
+ final String ansi;
+ final ChatFormattingCodePosition position;
+
+ ChatFormattingCodes(char c, String ansi) {
+ this.c = c;
+ this.ansi = ansi;
+ this.position = ChatFormattingCodePosition.PRE;
+ }
+
+ ChatFormattingCodes(char c, String ansi, ChatFormattingCodePosition position) {
+ this.c = c;
+ this.ansi = ansi;
+ this.position = position;
+ }
+
+ public static ChatFormattingCodes getChatFormattingCodeByChar(char c) {
+ return formattingCodes.get(c);
+ }
+
+ public char getChar() {
+ return c;
+ }
+
+ public ChatFormattingCodePosition getPosition() {
+ return position;
+ }
+
+ @Override
+ public String toString() {
+ return getANSI();
+ }
+
+ public String getANSI() {
+ return ansi;
+ }
+
+
+ public enum ChatFormattingCodePosition {
+ PRE,
+ POST
+ }
+}
+
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/text/ChatPart.java b/src/main/java/de/bixilon/minosoft/game/datatypes/text/ChatPart.java
new file mode 100644
index 000000000..fbe0da339
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/text/ChatPart.java
@@ -0,0 +1,171 @@
+/*
+ * Codename Minosoft
+ * Copyright (C) 2020 Moritz Zwerger
+ *
+ * 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 (at your option) 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 .
+ *
+ * This software is not affiliated with Mojang AB, the original developer of Minecraft.
+ */
+
+package de.bixilon.minosoft.game.datatypes.text;
+
+import java.util.HashSet;
+import java.util.Objects;
+
+public class ChatPart implements BaseComponent {
+ private final String text;
+ private RGBColor color;
+ private HashSet formatting;
+
+ public ChatPart(String text, RGBColor color, HashSet formatting) {
+ this.text = text;
+ this.color = color;
+ this.formatting = formatting;
+ }
+
+ public ChatPart(String text, RGBColor color) {
+ this.text = text;
+ this.color = color;
+ }
+
+ public ChatPart(String text) {
+ this.text = text;
+ }
+
+ public ChatPart setObfuscated(boolean obfuscated) {
+ if (obfuscated) {
+ formatting.add(ChatFormattingCodes.OBFUSCATED);
+ } else {
+ formatting.remove(ChatFormattingCodes.OBFUSCATED);
+ }
+ return this;
+ }
+
+ public ChatPart setBold(boolean bold) {
+ if (bold) {
+ formatting.add(ChatFormattingCodes.BOLD);
+ } else {
+ formatting.remove(ChatFormattingCodes.BOLD);
+ }
+ return this;
+ }
+
+ public ChatPart setStrikethrough(boolean strikethrough) {
+ if (strikethrough) {
+ formatting.add(ChatFormattingCodes.STRIKETHROUGH);
+ } else {
+ formatting.remove(ChatFormattingCodes.STRIKETHROUGH);
+ }
+ return this;
+ }
+
+ public ChatPart setUnderlined(boolean underlined) {
+ if (underlined) {
+ formatting.add(ChatFormattingCodes.UNDERLINED);
+ } else {
+ formatting.remove(ChatFormattingCodes.UNDERLINED);
+ }
+ return this;
+ }
+
+ public ChatPart setItalic(boolean italic) {
+ if (italic) {
+ formatting.add(ChatFormattingCodes.ITALIC);
+ } else {
+ formatting.remove(ChatFormattingCodes.ITALIC);
+ }
+ return this;
+ }
+
+ public ChatPart setReset(boolean reset) {
+ if (reset) {
+ formatting.add(ChatFormattingCodes.RESET);
+ } else {
+ formatting.remove(ChatFormattingCodes.RESET);
+ }
+ return this;
+ }
+
+ public RGBColor getColor() {
+ return color;
+ }
+
+
+ public ChatPart setColor(RGBColor color) {
+ this.color = color;
+ return this;
+ }
+
+
+ public HashSet getFormatting() {
+ return formatting;
+ }
+
+
+ public ChatPart setFormatting(HashSet formatting) {
+ this.formatting = formatting;
+ return this;
+ }
+
+
+ @Override
+ public boolean equals(Object obj) {
+ if (super.equals(obj)) {
+ return true;
+ }
+ if (hashCode() != obj.hashCode()) {
+ return false;
+ }
+ ChatPart their = (ChatPart) obj;
+ return text.equals(their.getMessage()) && color.equals(their.getColor()) && formatting.equals(their.getFormatting());
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(text, color, formatting);
+ }
+
+ @Override
+ public String getANSIColoredMessage() {
+ StringBuilder builder = new StringBuilder();
+ if (color != null) {
+ builder.append(ChatColors.getANSIColorByRGBColor(color));
+ }
+ if (formatting != null) {
+ formatting.forEach((chatFormattingCodes -> {
+ if (chatFormattingCodes.getPosition() == ChatFormattingCodes.ChatFormattingCodePosition.PRE) {
+ builder.append(chatFormattingCodes.getANSI());
+ }
+ }));
+ }
+ builder.append(text);
+ if (formatting != null) {
+ formatting.forEach((chatFormattingCodes -> {
+ if (chatFormattingCodes.getPosition() == ChatFormattingCodes.ChatFormattingCodePosition.POST) {
+ builder.append(chatFormattingCodes.getANSI());
+ }
+ }));
+ }
+ builder.append(ChatFormattingCodes.RESET);
+ return builder.toString();
+ }
+
+ @Override
+ public String getLegacyText() {
+ return getMessage(); //ToDo
+ }
+
+ @Override
+ public String getMessage() {
+ return text;
+ }
+
+ @Override
+ public String toString() {
+ return getANSIColoredMessage();
+ }
+}
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/text/RGBColor.java b/src/main/java/de/bixilon/minosoft/game/datatypes/text/RGBColor.java
new file mode 100644
index 000000000..ed37081a8
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/text/RGBColor.java
@@ -0,0 +1,67 @@
+/*
+ * Codename Minosoft
+ * Copyright (C) 2020 Moritz Zwerger
+ *
+ * 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 (at your option) 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 .
+ *
+ * This software is not affiliated with Mojang AB, the original developer of Minecraft.
+ */
+
+package de.bixilon.minosoft.game.datatypes.text;
+
+public final class RGBColor {
+ private final int color;
+
+ public RGBColor(int color) {
+ this.color = color;
+ }
+
+ public RGBColor(int red, int green, int blue) {
+ this.color = blue | (green << 8) | (red << 16);
+ }
+
+ public RGBColor(String colorString) {
+ if (colorString.startsWith("#")) {
+ colorString = colorString.substring(1);
+ }
+ color = Integer.parseInt(colorString, 16);
+ }
+
+ public int getColor() {
+ return color;
+ }
+
+ public int getRed() {
+ return (color >> 16) & 0xFF;
+ }
+
+ public int getGreen() {
+ return (color >> 8) & 0xFF;
+ }
+
+ public int getBlue() {
+ return color & 0xFF;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (super.equals(obj)) {
+ return true;
+ }
+ return hashCode() == obj.hashCode();
+ }
+
+ @Override
+ public int hashCode() {
+ return color;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("#%06X", (0xFFFFFF & color));
+ }
+}
diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/text/TextComponent.java b/src/main/java/de/bixilon/minosoft/game/datatypes/text/TextComponent.java
new file mode 100644
index 000000000..574665b40
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/game/datatypes/text/TextComponent.java
@@ -0,0 +1,190 @@
+/*
+ * Codename Minosoft
+ * Copyright (C) 2020 Moritz Zwerger
+ *
+ * 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 (at your option) 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 .
+ *
+ * This software is not affiliated with Mojang AB, the original developer of Minecraft.
+ */
+
+package de.bixilon.minosoft.game.datatypes.text;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+
+import javax.annotation.Nullable;
+import java.text.CharacterIterator;
+import java.text.StringCharacterIterator;
+import java.util.ArrayList;
+import java.util.HashSet;
+
+public class TextComponent implements BaseComponent {
+ private final ArrayList parts = new ArrayList<>();
+
+ public TextComponent() {
+ }
+
+ public TextComponent(String text) {
+ // legacy String
+ StringBuilder currentText = new StringBuilder();
+ RGBColor color = null;
+ HashSet formattingCodes = new HashSet<>();
+ StringCharacterIterator iterator = new StringCharacterIterator(text);
+ while (iterator.current() != CharacterIterator.DONE) {
+ char c = iterator.current();
+ iterator.next();
+ if (c != '§') {
+ currentText.append(c);
+ continue;
+ }
+ // check next char
+ char nextFormattingChar = iterator.current();
+ iterator.next();
+ RGBColor nextColor = ChatColors.getColorByFormattingChar(nextFormattingChar);
+ if (nextColor != null && nextColor != color) {
+ // color change, add text part
+ if (currentText.length() > 0) {
+ parts.add(new ChatPart(currentText.toString(), color, formattingCodes));
+ currentText = new StringBuilder();
+ }
+ color = nextColor;
+ formattingCodes = new HashSet<>();
+ continue;
+ }
+ ChatFormattingCodes nextFormattingCode = ChatFormattingCodes.getChatFormattingCodeByChar(nextFormattingChar);
+ if (nextFormattingCode != null) {
+ if (currentText.length() > 0) {
+ parts.add(new ChatPart(currentText.toString(), color, formattingCodes));
+ currentText = new StringBuilder();
+ color = null;
+ formattingCodes = new HashSet<>();
+ }
+ formattingCodes.add(nextFormattingCode);
+ if (nextFormattingCode == ChatFormattingCodes.RESET) {
+ // special rule here
+ if (currentText.length() > 0) {
+ // color change, add text part
+ parts.add(new ChatPart(currentText.toString(), color, formattingCodes));
+ currentText = new StringBuilder();
+ }
+ color = null;
+ formattingCodes = new HashSet<>();
+ }
+ }
+ }
+ if (currentText.length() > 0) {
+ parts.add(new ChatPart(currentText.toString(), color, formattingCodes));
+ }
+ }
+
+
+ public TextComponent(JsonObject json) {
+ this(null, json);
+ }
+
+ public TextComponent(@Nullable ChatPart parent, JsonObject json) {
+ ChatPart thisChatPart = null;
+ if (json.has("text")) {
+ String text = json.get("text").getAsString();
+ if (text.contains("§")) {
+ // legacy text component
+ parts.add(new TextComponent(text));
+ return;
+ }
+ RGBColor color;
+ if (parent != null && parent.getColor() != null) {
+ color = parent.getColor();
+ } else {
+ color = null;
+ }
+ if (json.has("color")) {
+ String colorString = json.get("color").getAsString();
+ if (colorString.startsWith("#")) {
+ // RGB
+ color = new RGBColor(colorString);
+ } else {
+ color = ChatColors.getColorByName(colorString);
+ }
+ }
+ HashSet formattingCodes;
+ if (parent != null && parent.getFormatting() != null) {
+ formattingCodes = (HashSet) parent.getFormatting().clone();
+ } else {
+ formattingCodes = new HashSet<>();
+ }
+ if (json.has("bold")) {
+ if (json.get("bold").getAsBoolean()) {
+ formattingCodes.add(ChatFormattingCodes.BOLD);
+ } else {
+ formattingCodes.remove(ChatFormattingCodes.BOLD);
+ }
+ }
+ if (json.has("italic")) {
+ if (json.get("italic").getAsBoolean()) {
+ formattingCodes.add(ChatFormattingCodes.ITALIC);
+ } else {
+ formattingCodes.remove(ChatFormattingCodes.ITALIC);
+ }
+ }
+ if (json.has("underlined")) {
+ if (json.get("underlined").getAsBoolean()) {
+ formattingCodes.add(ChatFormattingCodes.UNDERLINED);
+ } else {
+ formattingCodes.remove(ChatFormattingCodes.UNDERLINED);
+
+ }
+ }
+ if (json.has("strikethrough")) {
+ if (json.get("strikethrough").getAsBoolean()) {
+ formattingCodes.add(ChatFormattingCodes.STRIKETHROUGH);
+ } else {
+ formattingCodes.remove(ChatFormattingCodes.STRIKETHROUGH);
+ }
+ }
+ if (json.has("obfuscated")) {
+ if (json.get("obfuscated").getAsBoolean()) {
+ formattingCodes.add(ChatFormattingCodes.OBFUSCATED);
+ } else {
+ formattingCodes.remove(ChatFormattingCodes.OBFUSCATED);
+ }
+ }
+ thisChatPart = new ChatPart(text, color, formattingCodes);
+ }
+
+
+ if (json.has("extra")) {
+ JsonArray extras = json.getAsJsonArray("extra");
+ ChatPart finalThisChatPart = thisChatPart;
+ extras.forEach((extra -> parts.add(new TextComponent(finalThisChatPart, extra.getAsJsonObject()))));
+ }
+ if (thisChatPart != null) {
+ parts.add(thisChatPart);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getANSIColoredMessage();
+ }
+
+ public String getANSIColoredMessage() {
+ StringBuilder builder = new StringBuilder();
+ parts.forEach((chatPart -> builder.append(chatPart.getANSIColoredMessage())));
+ builder.append(ChatFormattingCodes.RESET);
+ return builder.toString();
+ }
+
+ public String getLegacyText() {
+ return getMessage(); //ToDo
+ }
+
+ public String getMessage() {
+ StringBuilder builder = new StringBuilder();
+ parts.forEach((chatPart -> builder.append(chatPart.getMessage())));
+ return builder.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/de/bixilon/minosoft/gui/main/ServerListCell.java b/src/main/java/de/bixilon/minosoft/gui/main/ServerListCell.java
index 5d63bf3a8..21bed821f 100644
--- a/src/main/java/de/bixilon/minosoft/gui/main/ServerListCell.java
+++ b/src/main/java/de/bixilon/minosoft/gui/main/ServerListCell.java
@@ -169,7 +169,7 @@ public class ServerListCell extends ListCell implements Initializable {
}
serverBrand.setText(ping.getServerModInfo().getBrand());
serverBrand.setTooltip(new Tooltip(ping.getServerModInfo().getInfo()));
- motd.setText(ping.getMotd().getRawMessage());
+ motd.setText(ping.getMotd().getMessage());
if (ping.getFavicon() != null) {
icon.setImage(ping.getFavicon());
if (!ping.getBase64EncodedFavicon().equals(server.getBase64Favicon())) {
@@ -392,7 +392,7 @@ public class ServerListCell extends ListCell implements Initializable {
Label serverVersionLabel = new Label(serverVersionString);
Label serverBrandLabel = new Label(lastPing.getServerBrand());
Label playersOnlineMaxLabel = new Label(String.format("%d/%d", lastPing.getPlayerOnline(), lastPing.getMaxPlayers()));
- Label motdLabel = new Label(lastPing.getMotd().getRawMessage());
+ Label motdLabel = new Label(lastPing.getMotd().getMessage());
Label moddedBrandLabel = new Label(lastPing.getServerModInfo().getBrand());
grid.add(new Label("Real server address:"), 0, ++column);
diff --git a/src/main/java/de/bixilon/minosoft/logging/Log.java b/src/main/java/de/bixilon/minosoft/logging/Log.java
index 677de7d62..ea221fe3e 100644
--- a/src/main/java/de/bixilon/minosoft/logging/Log.java
+++ b/src/main/java/de/bixilon/minosoft/logging/Log.java
@@ -14,7 +14,9 @@
package de.bixilon.minosoft.logging;
import de.bixilon.minosoft.Config;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.ChatColors;
+import de.bixilon.minosoft.game.datatypes.text.ChatFormattingCodes;
+import de.bixilon.minosoft.game.datatypes.text.RGBColor;
import java.text.SimpleDateFormat;
import java.util.concurrent.LinkedBlockingQueue;
@@ -51,14 +53,14 @@ public class Log {
* @param message Raw message to log
*/
public static void game(String message) {
- log(LogLevels.GAME, message, TextComponent.ChatAttributes.GREEN);
+ log(LogLevels.GAME, message, ChatColors.getColorByName("green"));
}
- public static void log(LogLevels level, String message, TextComponent.ChatAttributes color) {
+ public static void log(LogLevels level, String message, RGBColor color) {
log(level, "", message, color);
}
- public static void log(LogLevels level, String prefix, String message, TextComponent.ChatAttributes color) {
+ public static void log(LogLevels level, String prefix, String message, RGBColor color) {
if (level.ordinal() > Log.level.ordinal()) {
// log level too low
return;
@@ -73,12 +75,13 @@ public class Log {
builder.append("] ");
builder.append(prefix);
if (color != null && Config.colorLog) {
- builder.append(color);
+ builder.append(ChatColors.getANSIColorByRGBColor(color));
builder.append(message);
- builder.append(TextComponent.ChatAttributes.RESET);
+ builder.append(ChatFormattingCodes.RESET.getANSI());
} else {
builder.append(message);
}
+ builder.append(ChatFormattingCodes.RESET.getANSI());
queue.add(builder.toString());
}
@@ -88,7 +91,7 @@ public class Log {
* @param message Raw message to log
*/
public static void fatal(String message) {
- log(LogLevels.FATAL, message, TextComponent.ChatAttributes.DARK_RED);
+ log(LogLevels.FATAL, message, ChatColors.getColorByName("dark_red"));
}
/**
@@ -97,7 +100,7 @@ public class Log {
* @param message Raw message to log
*/
public static void warn(String message) {
- log(LogLevels.WARNING, message, TextComponent.ChatAttributes.RED);
+ log(LogLevels.WARNING, message, ChatColors.getColorByName("red"));
}
/**
@@ -106,7 +109,7 @@ public class Log {
* @param message Raw message to log
*/
public static void debug(String message) {
- log(LogLevels.DEBUG, message, TextComponent.ChatAttributes.GRAY);
+ log(LogLevels.DEBUG, message, ChatColors.getColorByName("gray"));
}
/**
@@ -115,7 +118,7 @@ public class Log {
* @param message Raw message to log
*/
public static void verbose(String message) {
- log(LogLevels.VERBOSE, message, TextComponent.ChatAttributes.YELLOW);
+ log(LogLevels.VERBOSE, message, ChatColors.getColorByName("yellow"));
}
/**
@@ -124,7 +127,7 @@ public class Log {
* @param message Raw message to log
*/
public static void protocol(String message) {
- log(LogLevels.PROTOCOL, message, TextComponent.ChatAttributes.BLUE);
+ log(LogLevels.PROTOCOL, message, ChatColors.getColorByName("blue"));
}
/**
@@ -133,7 +136,7 @@ public class Log {
* @param message Raw message to log
*/
public static void mojang(String message) {
- log(LogLevels.MOJANG, message, TextComponent.ChatAttributes.AQUA);
+ log(LogLevels.MOJANG, message, ChatColors.getColorByName("aqua"));
}
public static LogLevels getLevel() {
@@ -154,6 +157,6 @@ public class Log {
* @param message Raw message to log
*/
public static void info(String message) {
- log(LogLevels.INFO, message, TextComponent.ChatAttributes.WHITE);
+ log(LogLevels.INFO, message, ChatColors.getColorByName("white"));
}
}
diff --git a/src/main/java/de/bixilon/minosoft/modding/Logger.java b/src/main/java/de/bixilon/minosoft/modding/Logger.java
index ea190d104..b0f43ec72 100644
--- a/src/main/java/de/bixilon/minosoft/modding/Logger.java
+++ b/src/main/java/de/bixilon/minosoft/modding/Logger.java
@@ -13,7 +13,8 @@
package de.bixilon.minosoft.modding;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.ChatColors;
+import de.bixilon.minosoft.game.datatypes.text.RGBColor;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.logging.LogLevels;
@@ -30,10 +31,10 @@ public class Logger {
* @param message Raw message to log
*/
public void game(String message) {
- log(LogLevels.GAME, message, TextComponent.ChatAttributes.GREEN);
+ log(LogLevels.GAME, message, ChatColors.getColorByName("green"));
}
- public void log(LogLevels level, String message, TextComponent.ChatAttributes color) {
+ public void log(LogLevels level, String message, RGBColor color) {
Log.log(level, String.format("[%s] ", modName), message, color);
}
@@ -43,7 +44,7 @@ public class Logger {
* @param message Raw message to log
*/
public void fatal(String message) {
- log(LogLevels.FATAL, message, TextComponent.ChatAttributes.DARK_RED);
+ log(LogLevels.FATAL, message, ChatColors.getColorByName("dark_red"));
}
/**
@@ -52,7 +53,7 @@ public class Logger {
* @param message Raw message to log
*/
public void info(String message) {
- log(LogLevels.INFO, message, TextComponent.ChatAttributes.WHITE);
+ log(LogLevels.INFO, message, ChatColors.getColorByName("white"));
}
/**
@@ -61,7 +62,7 @@ public class Logger {
* @param message Raw message to log
*/
public void warn(String message) {
- log(LogLevels.WARNING, message, TextComponent.ChatAttributes.RED);
+ log(LogLevels.WARNING, message, ChatColors.getColorByName("red"));
}
/**
@@ -70,7 +71,7 @@ public class Logger {
* @param message Raw message to log
*/
public void debug(String message) {
- log(LogLevels.DEBUG, message, TextComponent.ChatAttributes.GRAY);
+ log(LogLevels.DEBUG, message, ChatColors.getColorByName("gray"));
}
/**
@@ -79,7 +80,7 @@ public class Logger {
* @param message Raw message to log
*/
public void verbose(String message) {
- log(LogLevels.VERBOSE, message, TextComponent.ChatAttributes.YELLOW);
+ log(LogLevels.VERBOSE, message, ChatColors.getColorByName("yellow"));
}
/**
@@ -88,6 +89,6 @@ public class Logger {
* @param message Raw message to log
*/
public void protocol(String message) {
- log(LogLevels.PROTOCOL, message, TextComponent.ChatAttributes.BLUE);
+ log(LogLevels.PROTOCOL, message, ChatColors.getColorByName("blue"));
}
}
diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/BossBarChangeEvent.java b/src/main/java/de/bixilon/minosoft/modding/event/events/BossBarChangeEvent.java
index dd4fb883c..276d9b981 100644
--- a/src/main/java/de/bixilon/minosoft/modding/event/events/BossBarChangeEvent.java
+++ b/src/main/java/de/bixilon/minosoft/modding/event/events/BossBarChangeEvent.java
@@ -13,7 +13,7 @@
package de.bixilon.minosoft.modding.event.events;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.modding.event.EventListener;
import de.bixilon.minosoft.protocol.network.Connection;
import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketBossBar;
@@ -26,7 +26,7 @@ import java.util.UUID;
public class BossBarChangeEvent extends CancelableEvent {
private UUID uuid;
private PacketBossBar.BossBarActions action;
- private TextComponent title;
+ private BaseComponent title;
private float health;
private PacketBossBar.BossBarColors color;
private PacketBossBar.BossBarDivisions divisions;
@@ -35,7 +35,7 @@ public class BossBarChangeEvent extends CancelableEvent {
private boolean createFog;
- public BossBarChangeEvent(Connection connection, UUID uuid, PacketBossBar.BossBarActions action, TextComponent title, float health, PacketBossBar.BossBarColors color, PacketBossBar.BossBarDivisions divisions, boolean isDragonBar, boolean shouldDarkenSky, boolean createFog) {
+ public BossBarChangeEvent(Connection connection, UUID uuid, PacketBossBar.BossBarActions action, BaseComponent title, float health, PacketBossBar.BossBarColors color, PacketBossBar.BossBarDivisions divisions, boolean isDragonBar, boolean shouldDarkenSky, boolean createFog) {
super(connection);
this.uuid = uuid;
this.action = action;
@@ -77,11 +77,11 @@ public class BossBarChangeEvent extends CancelableEvent {
this.action = action;
}
- public TextComponent getTitle() {
+ public BaseComponent getTitle() {
return title;
}
- public void setTitle(TextComponent title) {
+ public void setTitle(BaseComponent title) {
this.title = title;
}
diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/ChatMessageReceivingEvent.java b/src/main/java/de/bixilon/minosoft/modding/event/events/ChatMessageReceivingEvent.java
index bddb11111..34f1d1528 100644
--- a/src/main/java/de/bixilon/minosoft/modding/event/events/ChatMessageReceivingEvent.java
+++ b/src/main/java/de/bixilon/minosoft/modding/event/events/ChatMessageReceivingEvent.java
@@ -14,7 +14,7 @@
package de.bixilon.minosoft.modding.event.events;
import de.bixilon.minosoft.game.datatypes.ChatTextPositions;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.modding.event.EventListener;
import de.bixilon.minosoft.modding.event.events.annotations.MinimumProtocolVersion;
import de.bixilon.minosoft.protocol.network.Connection;
@@ -23,11 +23,11 @@ import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketChatMessageRe
import java.util.UUID;
public class ChatMessageReceivingEvent extends CancelableEvent {
- private final TextComponent message;
+ private final BaseComponent message;
private final ChatTextPositions position;
private final UUID sender;
- public ChatMessageReceivingEvent(Connection connection, TextComponent message, ChatTextPositions position, UUID sender) {
+ public ChatMessageReceivingEvent(Connection connection, BaseComponent message, ChatTextPositions position, UUID sender) {
super(connection);
this.message = message;
this.position = position;
@@ -41,7 +41,7 @@ public class ChatMessageReceivingEvent extends CancelableEvent {
this.sender = pkg.getSender();
}
- public TextComponent getMessage() {
+ public BaseComponent getMessage() {
return message;
}
diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/DisconnectEvent.java b/src/main/java/de/bixilon/minosoft/modding/event/events/DisconnectEvent.java
index a383ba061..bca36f0db 100644
--- a/src/main/java/de/bixilon/minosoft/modding/event/events/DisconnectEvent.java
+++ b/src/main/java/de/bixilon/minosoft/modding/event/events/DisconnectEvent.java
@@ -13,15 +13,15 @@
package de.bixilon.minosoft.modding.event.events;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.modding.event.EventListener;
import de.bixilon.minosoft.protocol.network.Connection;
import de.bixilon.minosoft.protocol.packets.clientbound.login.PacketLoginDisconnect;
public class DisconnectEvent extends Event {
- private final TextComponent reason;
+ private final BaseComponent reason;
- public DisconnectEvent(Connection connection, TextComponent reason) {
+ public DisconnectEvent(Connection connection, BaseComponent reason) {
super(connection);
this.reason = reason;
}
@@ -31,7 +31,7 @@ public class DisconnectEvent extends Event {
this.reason = pkg.getReason();
}
- public TextComponent getReason() {
+ public BaseComponent getReason() {
return reason;
}
diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/LoginDisconnectEvent.java b/src/main/java/de/bixilon/minosoft/modding/event/events/LoginDisconnectEvent.java
index 90d0ecceb..5b70ce5d4 100644
--- a/src/main/java/de/bixilon/minosoft/modding/event/events/LoginDisconnectEvent.java
+++ b/src/main/java/de/bixilon/minosoft/modding/event/events/LoginDisconnectEvent.java
@@ -13,15 +13,15 @@
package de.bixilon.minosoft.modding.event.events;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.modding.event.EventListener;
import de.bixilon.minosoft.protocol.network.Connection;
import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketDisconnect;
public class LoginDisconnectEvent extends Event {
- private final TextComponent reason;
+ private final BaseComponent reason;
- public LoginDisconnectEvent(Connection connection, TextComponent reason) {
+ public LoginDisconnectEvent(Connection connection, BaseComponent reason) {
super(connection);
this.reason = reason;
}
@@ -31,7 +31,7 @@ public class LoginDisconnectEvent extends Event {
this.reason = pkg.getReason();
}
- public TextComponent getReason() {
+ public BaseComponent getReason() {
return reason;
}
diff --git a/src/main/java/de/bixilon/minosoft/ping/ServerListPing.java b/src/main/java/de/bixilon/minosoft/ping/ServerListPing.java
index a71fbd822..3869b4448 100644
--- a/src/main/java/de/bixilon/minosoft/ping/ServerListPing.java
+++ b/src/main/java/de/bixilon/minosoft/ping/ServerListPing.java
@@ -14,7 +14,8 @@
package de.bixilon.minosoft.ping;
import com.google.gson.JsonObject;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
+import de.bixilon.minosoft.game.datatypes.text.TextComponent;
import de.bixilon.minosoft.gui.main.GUITools;
import javafx.scene.image.Image;
@@ -25,7 +26,7 @@ public class ServerListPing {
int maxPlayers;
String base64Favicon;
Image favicon;
- TextComponent motd;
+ BaseComponent motd;
String serverBrand;
public ServerListPing(JsonObject json) {
@@ -37,10 +38,10 @@ public class ServerListPing {
favicon = GUITools.getImageFromBase64(base64Favicon);
}
- try {
+ if (json.get("description").isJsonPrimitive()) {
+ motd = BaseComponent.fromString(json.get("description").getAsString());
+ } else {
motd = new TextComponent(json.getAsJsonObject("description"));
- } catch (Exception ignored) {
- motd = new TextComponent(json.get("description").getAsString());
}
serverBrand = json.getAsJsonObject("version").get("name").getAsString();
@@ -71,7 +72,7 @@ public class ServerListPing {
return favicon;
}
- public TextComponent getMotd() {
+ public BaseComponent getMotd() {
return motd;
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginDisconnect.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginDisconnect.java
index 774ddc58e..1637742d6 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginDisconnect.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginDisconnect.java
@@ -13,14 +13,14 @@
package de.bixilon.minosoft.protocol.packets.clientbound.login;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
import de.bixilon.minosoft.protocol.protocol.PacketHandler;
public class PacketLoginDisconnect implements ClientboundPacket {
- TextComponent reason;
+ BaseComponent reason;
@Override
public boolean read(InByteBuffer buffer) {
@@ -35,10 +35,10 @@ public class PacketLoginDisconnect implements ClientboundPacket {
@Override
public void log() {
- Log.protocol(String.format("Receiving login disconnect packet (%s)", reason.getColoredMessage()));
+ Log.protocol(String.format("Receiving login disconnect packet (%s)", reason.getANSIColoredMessage()));
}
- public TextComponent getReason() {
+ public BaseComponent getReason() {
return reason;
}
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAdvancements.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAdvancements.java
index 8221f54e4..04656476e 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAdvancements.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAdvancements.java
@@ -13,12 +13,12 @@
package de.bixilon.minosoft.protocol.packets.clientbound.play;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
import de.bixilon.minosoft.game.datatypes.inventory.Slot;
import de.bixilon.minosoft.game.datatypes.player.advancements.Advancement;
import de.bixilon.minosoft.game.datatypes.player.advancements.AdvancementDisplay;
import de.bixilon.minosoft.game.datatypes.player.advancements.AdvancementProgress;
import de.bixilon.minosoft.game.datatypes.player.advancements.CriterionProgress;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
@@ -47,8 +47,8 @@ public class PacketAdvancements implements ClientboundPacket {
}
AdvancementDisplay display = null;
if (buffer.readBoolean()) {
- TextComponent title = buffer.readTextComponent();
- TextComponent description = buffer.readTextComponent();
+ BaseComponent title = buffer.readTextComponent();
+ BaseComponent description = buffer.readTextComponent();
Slot icon = buffer.readSlot();
AdvancementDisplay.AdvancementFrameTypes frameType = AdvancementDisplay.AdvancementFrameTypes.byId(buffer.readVarInt());
int flags = buffer.readInt();
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBossBar.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBossBar.java
index 2c56e8bd3..6974ab5f6 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBossBar.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBossBar.java
@@ -13,7 +13,7 @@
package de.bixilon.minosoft.protocol.packets.clientbound.play;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
@@ -27,7 +27,7 @@ public class PacketBossBar implements ClientboundPacket {
BossBarActions action;
//fields depend on action
- TextComponent title;
+ BaseComponent title;
float health;
BossBarColors color;
BossBarDivisions divisions;
@@ -64,10 +64,10 @@ public class PacketBossBar implements ClientboundPacket {
@Override
public void log() {
switch (action) {
- case ADD -> Log.protocol(String.format("Received boss bar (action=%s, uuid=%s, title=\"%s\", health=%s, color=%s, divisions=%s, dragonBar=%s, darkenSky=%s)", action, uuid.toString(), title.getColoredMessage(), health, color, divisions, isDragonBar(), shouldDarkenSky()));
+ case ADD -> Log.protocol(String.format("Received boss bar (action=%s, uuid=%s, title=\"%s\", health=%s, color=%s, divisions=%s, dragonBar=%s, darkenSky=%s)", action, uuid.toString(), title.getANSIColoredMessage(), health, color, divisions, isDragonBar(), shouldDarkenSky()));
case REMOVE -> Log.protocol(String.format("Received boss bar (action=%s, uuid=%s)", action, uuid.toString()));
case UPDATE_HEALTH -> Log.protocol(String.format("Received boss bar (action=%s, uuid=%s, health=%s)", action, uuid.toString(), health));
- case UPDATE_TITLE -> Log.protocol(String.format("Received boss bar (action=%s, uuid=%s, title=\"%s\")", action, uuid.toString(), title.getColoredMessage()));
+ case UPDATE_TITLE -> Log.protocol(String.format("Received boss bar (action=%s, uuid=%s, title=\"%s\")", action, uuid.toString(), title.getANSIColoredMessage()));
case UPDATE_STYLE -> Log.protocol(String.format("Received boss bar (action=%s, uuid=%s, color=%s, divisions=%s)", action, uuid.toString(), color, divisions));
case UPDATE_FLAGS -> Log.protocol(String.format("Received boss bar (action=%s, uuid=%s, dragonBar=%s, darkenSky=%s)", action, uuid.toString(), isDragonBar(), shouldDarkenSky()));
}
@@ -101,7 +101,7 @@ public class PacketBossBar implements ClientboundPacket {
return health;
}
- public TextComponent getTitle() {
+ public BaseComponent getTitle() {
return title;
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChatMessageReceiving.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChatMessageReceiving.java
index 6219e87fc..4f98082e0 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChatMessageReceiving.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChatMessageReceiving.java
@@ -14,7 +14,7 @@
package de.bixilon.minosoft.protocol.packets.clientbound.play;
import de.bixilon.minosoft.game.datatypes.ChatTextPositions;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
@@ -23,7 +23,7 @@ import de.bixilon.minosoft.protocol.protocol.PacketHandler;
import java.util.UUID;
public class PacketChatMessageReceiving implements ClientboundPacket {
- TextComponent message;
+ BaseComponent message;
ChatTextPositions position;
UUID sender;
@@ -48,10 +48,10 @@ public class PacketChatMessageReceiving implements ClientboundPacket {
@Override
public void log() {
- Log.protocol(String.format("Received chat message (message=\"%s\")", message.getRawMessage()));
+ Log.protocol(String.format("Received chat message (message=\"%s\")", message.getMessage()));
}
- public TextComponent getMessage() {
+ public BaseComponent getMessage() {
return message;
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCombatEvent.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCombatEvent.java
index 66fafa20b..fa73936b4 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCombatEvent.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCombatEvent.java
@@ -13,7 +13,7 @@
package de.bixilon.minosoft.protocol.packets.clientbound.play;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
@@ -25,7 +25,7 @@ public class PacketCombatEvent implements ClientboundPacket {
int duration;
int playerId;
int entityId;
- TextComponent message;
+ BaseComponent message;
@Override
public boolean read(InByteBuffer buffer) {
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDisconnect.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDisconnect.java
index ab539eddd..e22f3b0ae 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDisconnect.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDisconnect.java
@@ -13,14 +13,14 @@
package de.bixilon.minosoft.protocol.packets.clientbound.play;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
import de.bixilon.minosoft.protocol.protocol.PacketHandler;
public class PacketDisconnect implements ClientboundPacket {
- TextComponent reason;
+ BaseComponent reason;
@Override
public boolean read(InByteBuffer buffer) {
@@ -35,10 +35,10 @@ public class PacketDisconnect implements ClientboundPacket {
@Override
public void log() {
- Log.game(String.format("Disconnected: %s", reason.getColoredMessage()));
+ Log.game(String.format("Disconnected: %s", reason.getANSIColoredMessage()));
}
- public TextComponent getReason() {
+ public BaseComponent getReason() {
return reason;
}
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketMapData.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketMapData.java
index 87c392b19..756187776 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketMapData.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketMapData.java
@@ -13,7 +13,7 @@
package de.bixilon.minosoft.protocol.packets.clientbound.play;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
@@ -110,7 +110,7 @@ public class PacketMapData implements ClientboundPacket {
byte x = buffer.readByte();
byte z = buffer.readByte();
byte direction = buffer.readByte();
- TextComponent displayName = null;
+ BaseComponent displayName = null;
if (buffer.readBoolean()) {
displayName = buffer.readTextComponent();
}
@@ -220,7 +220,7 @@ public class PacketMapData implements ClientboundPacket {
final byte direction;
final byte x;
final byte z;
- final TextComponent displayName;
+ final BaseComponent displayName;
public MapPinSet(MapPinTypes type, int direction, byte x, byte z) {
this.type = type;
@@ -230,7 +230,7 @@ public class PacketMapData implements ClientboundPacket {
displayName = null;
}
- public MapPinSet(MapPinTypes type, int direction, byte x, byte z, TextComponent displayName) {
+ public MapPinSet(MapPinTypes type, int direction, byte x, byte z, BaseComponent displayName) {
this.type = type;
this.direction = (byte) direction;
this.x = x;
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenWindow.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenWindow.java
index 16e7f9aa3..e1e25c36b 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenWindow.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenWindow.java
@@ -13,9 +13,9 @@
package de.bixilon.minosoft.protocol.packets.clientbound.play;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
import de.bixilon.minosoft.game.datatypes.inventory.InventoryProperties;
import de.bixilon.minosoft.game.datatypes.inventory.InventoryTypes;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
@@ -24,7 +24,7 @@ import de.bixilon.minosoft.protocol.protocol.PacketHandler;
public class PacketOpenWindow implements ClientboundPacket {
byte windowId;
InventoryTypes type;
- TextComponent title;
+ BaseComponent title;
byte slotCount;
int entityId;
@@ -72,7 +72,7 @@ public class PacketOpenWindow implements ClientboundPacket {
return entityId;
}
- public TextComponent getTitle() {
+ public BaseComponent getTitle() {
return title;
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerListItem.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerListItem.java
index 8b5c122e3..8bbe01af7 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerListItem.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerListItem.java
@@ -14,10 +14,10 @@
package de.bixilon.minosoft.protocol.packets.clientbound.play;
import de.bixilon.minosoft.game.datatypes.GameModes;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
import de.bixilon.minosoft.game.datatypes.player.PlayerListItemBulk;
import de.bixilon.minosoft.game.datatypes.player.PlayerProperties;
import de.bixilon.minosoft.game.datatypes.player.PlayerProperty;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
@@ -61,7 +61,7 @@ public class PacketPlayerListItem implements ClientboundPacket {
}
GameModes gameMode = GameModes.byId(buffer.readVarInt());
int ping = buffer.readVarInt();
- TextComponent displayName = (buffer.readBoolean() ? buffer.readTextComponent() : null);
+ BaseComponent displayName = (buffer.readBoolean() ? buffer.readTextComponent() : null);
listItemBulk = new PlayerListItemBulk(uuid, name, ping, gameMode, displayName, playerProperties, action);
}
case UPDATE_GAMEMODE -> listItemBulk = new PlayerListItemBulk(uuid, null, 0, GameModes.byId(buffer.readVarInt()), null, null, action);
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardDisplayScoreboard.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardDisplayScoreboard.java
index b77700e6e..11814ecaa 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardDisplayScoreboard.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardDisplayScoreboard.java
@@ -13,7 +13,6 @@
package de.bixilon.minosoft.protocol.packets.clientbound.play;
-import de.bixilon.minosoft.game.datatypes.ChatColors;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
@@ -41,43 +40,28 @@ public class PacketScoreboardDisplayScoreboard implements ClientboundPacket {
}
public enum ScoreboardAnimations {
- LIST(0),
- SIDEBAR(1),
- BELOW_NAME(2),
- TEAM_BLACK(ChatColors.BLACK.getColor() + 3),
- TEAM_DARK_BLUE(ChatColors.DARK_BLUE.getColor() + 3),
- TEAM_DARK_GREEN(ChatColors.DARK_GREEN.getColor() + 3),
- TEAM_DARK_AQUA(ChatColors.DARK_AQUA.getColor() + 3),
- TEAM_DARK_RED(ChatColors.DARK_RED.getColor() + 3),
- TEAM_DARK_PURPLE(ChatColors.DARK_PURPLE.getColor() + 3),
- TEAM_GOLD(ChatColors.GOLD.getColor() + 3),
- TEAM_GRAY(ChatColors.GRAY.getColor() + 3),
- TEAM_DARK_GRAY(ChatColors.DARK_GRAY.getColor() + 3),
- TEAM_BLUE(ChatColors.BLUE.getColor() + 3),
- TEAM_GREEN(ChatColors.GREEN.getColor() + 3),
- TEAM_AQUA(ChatColors.AQUA.getColor() + 3),
- TEAM_RED(ChatColors.RED.getColor() + 3),
- TEAM_PURPLE(ChatColors.PURPLE.getColor() + 3),
- TEAM_YELLOW(ChatColors.YELLOW.getColor() + 3),
- TEAM_WHITE(ChatColors.WHITE.getColor() + 3);
-
- final int id;
-
- ScoreboardAnimations(int id) {
- this.id = id;
- }
+ LIST,
+ SIDEBAR,
+ BELOW_NAME,
+ TEAM_BLACK,
+ TEAM_DARK_BLUE,
+ TEAM_DARK_GREEN,
+ TEAM_DARK_AQUA,
+ TEAM_DARK_RED,
+ TEAM_DARK_PURPLE,
+ TEAM_GOLD,
+ TEAM_GRAY,
+ TEAM_DARK_GRAY,
+ TEAM_BLUE,
+ TEAM_GREEN,
+ TEAM_AQUA,
+ TEAM_RED,
+ TEAM_PURPLE,
+ TEAM_YELLOW,
+ TEAM_WHITE;
public static ScoreboardAnimations byId(int id) {
- for (ScoreboardAnimations animation : values()) {
- if (animation.getId() == id) {
- return animation;
- }
- }
- return null;
- }
-
- public int getId() {
- return id;
+ return values()[id];
}
}
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardObjective.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardObjective.java
index da5b1596d..68ce7a542 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardObjective.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardObjective.java
@@ -13,7 +13,7 @@
package de.bixilon.minosoft.protocol.packets.clientbound.play;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
@@ -21,7 +21,7 @@ import de.bixilon.minosoft.protocol.protocol.PacketHandler;
public class PacketScoreboardObjective implements ClientboundPacket {
String name;
- TextComponent value;
+ BaseComponent value;
ScoreboardObjectiveActions action;
ScoreboardObjectiveTypes type;
@@ -59,7 +59,7 @@ public class PacketScoreboardObjective implements ClientboundPacket {
@Override
public void log() {
if (action == ScoreboardObjectiveActions.CREATE || action == ScoreboardObjectiveActions.UPDATE) {
- Log.protocol(String.format("Received scoreboard objective action (action=%s, name=\"%s\", value=\"%s\", type=%s)", action, name, value.getColoredMessage(), type));
+ Log.protocol(String.format("Received scoreboard objective action (action=%s, name=\"%s\", value=\"%s\", type=%s)", action, name, value.getANSIColoredMessage(), type));
} else {
Log.protocol(String.format("Received scoreboard objective action (action=%s, name=\"%s\")", action, name));
}
@@ -69,7 +69,7 @@ public class PacketScoreboardObjective implements ClientboundPacket {
return name;
}
- public TextComponent getValue() {
+ public BaseComponent getValue() {
return value;
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTabHeaderAndFooter.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTabHeaderAndFooter.java
index 18ee52726..5a3cc6bbd 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTabHeaderAndFooter.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTabHeaderAndFooter.java
@@ -13,15 +13,15 @@
package de.bixilon.minosoft.protocol.packets.clientbound.play;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
import de.bixilon.minosoft.protocol.protocol.PacketHandler;
public class PacketTabHeaderAndFooter implements ClientboundPacket {
- TextComponent header;
- TextComponent footer;
+ BaseComponent header;
+ BaseComponent footer;
@Override
public boolean read(InByteBuffer buffer) {
@@ -37,15 +37,15 @@ public class PacketTabHeaderAndFooter implements ClientboundPacket {
@Override
public void log() {
- Log.protocol(String.format("Received tab list header: %s", header.getColoredMessage()));
- Log.protocol(String.format("Received tab list footer: %s", footer.getColoredMessage()));
+ Log.protocol(String.format("Received tab list header: %s", header.getANSIColoredMessage()));
+ Log.protocol(String.format("Received tab list footer: %s", footer.getANSIColoredMessage()));
}
- public TextComponent getHeader() {
+ public BaseComponent getHeader() {
return header;
}
- public TextComponent getFooter() {
+ public BaseComponent getFooter() {
return footer;
}
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTeams.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTeams.java
index a01d3418e..38f4d75c2 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTeams.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTeams.java
@@ -13,8 +13,9 @@
package de.bixilon.minosoft.protocol.packets.clientbound.play;
-import de.bixilon.minosoft.game.datatypes.ChatColors;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
+import de.bixilon.minosoft.game.datatypes.text.ChatColors;
+import de.bixilon.minosoft.game.datatypes.text.RGBColor;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
@@ -24,14 +25,14 @@ import de.bixilon.minosoft.util.BitByte;
public class PacketTeams implements ClientboundPacket {
String name;
TeamActions action;
- TextComponent displayName;
- TextComponent prefix;
- TextComponent suffix;
+ BaseComponent displayName;
+ BaseComponent prefix;
+ BaseComponent suffix;
boolean friendlyFire;
boolean seeFriendlyInvisibles;
TeamCollisionRules collisionRule = TeamCollisionRules.NEVER;
TeamNameTagVisibilities nameTagVisibility = TeamNameTagVisibilities.ALWAYS;
- TextComponent.ChatAttributes color = TextComponent.ChatAttributes.WHITE;
+ RGBColor color;
String[] playerNames;
@Override
@@ -57,9 +58,9 @@ public class PacketTeams implements ClientboundPacket {
collisionRule = TeamCollisionRules.byName(buffer.readString());
}
if (buffer.getProtocolId() < 352) {
- color = TextComponent.ChatAttributes.byColor(ChatColors.byId(buffer.readByte()));
+ color = ChatColors.getColorById(buffer.readByte());
} else {
- color = TextComponent.ChatAttributes.byColor(ChatColors.byId(buffer.readVarInt()));
+ color = ChatColors.getColorById(buffer.readVarInt());
}
}
if (buffer.getProtocolId() >= 375) {
@@ -112,15 +113,15 @@ public class PacketTeams implements ClientboundPacket {
return action;
}
- public TextComponent getDisplayName() {
+ public BaseComponent getDisplayName() {
return displayName;
}
- public TextComponent getPrefix() {
+ public BaseComponent getPrefix() {
return prefix;
}
- public TextComponent getSuffix() {
+ public BaseComponent getSuffix() {
return suffix;
}
@@ -132,7 +133,7 @@ public class PacketTeams implements ClientboundPacket {
return seeFriendlyInvisibles;
}
- public TextComponent.ChatAttributes getColor() {
+ public RGBColor getColor() {
return color;
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTitle.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTitle.java
index c20c9acd5..b1bd69e7b 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTitle.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTitle.java
@@ -14,8 +14,8 @@
package de.bixilon.minosoft.protocol.packets.clientbound.play;
import de.bixilon.minosoft.game.datatypes.MapSet;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
import de.bixilon.minosoft.game.datatypes.VersionValueMap;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
@@ -25,8 +25,8 @@ public class PacketTitle implements ClientboundPacket {
TitleActions action;
//fields depend on action
- TextComponent text;
- TextComponent subText;
+ BaseComponent text;
+ BaseComponent subText;
int fadeInTime;
int stayTime;
int fadeOutTime;
@@ -54,8 +54,8 @@ public class PacketTitle implements ClientboundPacket {
@Override
public void log() {
switch (action) {
- case SET_TITLE -> Log.protocol(String.format("Received title (action=%s, text=%s)", action, text.getColoredMessage()));
- case SET_SUBTITLE -> Log.protocol(String.format("Received title (action=%s, subText=%s)", action, subText.getColoredMessage()));
+ case SET_TITLE -> Log.protocol(String.format("Received title (action=%s, text=%s)", action, text.getANSIColoredMessage()));
+ case SET_SUBTITLE -> Log.protocol(String.format("Received title (action=%s, subText=%s)", action, subText.getANSIColoredMessage()));
case SET_TIMES_AND_DISPLAY -> Log.protocol(String.format("Received title (action=%s, fadeInTime=%d, stayTime=%d, fadeOutTime=%d)", action, fadeInTime, stayTime, fadeOutTime));
case HIDE, RESET -> Log.protocol(String.format("Received title (action=%s)", action));
}
@@ -73,11 +73,11 @@ public class PacketTitle implements ClientboundPacket {
return stayTime;
}
- public TextComponent getSubText() {
+ public BaseComponent getSubText() {
return subText;
}
- public TextComponent getText() {
+ public BaseComponent getText() {
return text;
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateSignReceiving.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateSignReceiving.java
index f9d5b972b..fb7c5dbf3 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateSignReceiving.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateSignReceiving.java
@@ -13,7 +13,7 @@
package de.bixilon.minosoft.protocol.packets.clientbound.play;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.game.datatypes.world.BlockPosition;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
@@ -21,7 +21,7 @@ import de.bixilon.minosoft.protocol.protocol.InByteBuffer;
import de.bixilon.minosoft.protocol.protocol.PacketHandler;
public class PacketUpdateSignReceiving implements ClientboundPacket {
- final TextComponent[] lines = new TextComponent[4];
+ final BaseComponent[] lines = new BaseComponent[4];
BlockPosition position;
@Override
@@ -51,7 +51,7 @@ public class PacketUpdateSignReceiving implements ClientboundPacket {
return position;
}
- public TextComponent[] getLines() {
+ public BaseComponent[] getLines() {
return lines;
}
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketUpdateSignSending.java b/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketUpdateSignSending.java
index 22f42ca9d..c7aed997a 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketUpdateSignSending.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketUpdateSignSending.java
@@ -13,7 +13,7 @@
package de.bixilon.minosoft.protocol.packets.serverbound.play;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.game.datatypes.world.BlockPosition;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.network.Connection;
@@ -23,9 +23,9 @@ import de.bixilon.minosoft.protocol.protocol.Packets;
public class PacketUpdateSignSending implements ServerboundPacket {
final BlockPosition position;
- final TextComponent[] lines;
+ final BaseComponent[] lines;
- public PacketUpdateSignSending(BlockPosition position, TextComponent[] lines) {
+ public PacketUpdateSignSending(BlockPosition position, BaseComponent[] lines) {
this.position = position;
this.lines = lines;
}
@@ -40,7 +40,7 @@ public class PacketUpdateSignSending implements ServerboundPacket {
}
if (buffer.getProtocolId() < 21 || buffer.getProtocolId() >= 62) {
for (int i = 0; i < 4; i++) {
- buffer.writeString(lines[i].getRawMessage());
+ buffer.writeString(lines[i].getMessage());
}
} else {
for (int i = 0; i < 4; i++) {
diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java
index 08e21921f..50f0dce45 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java
@@ -16,7 +16,6 @@ package de.bixilon.minosoft.protocol.protocol;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import de.bixilon.minosoft.game.datatypes.Directions;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
import de.bixilon.minosoft.game.datatypes.entities.Location;
import de.bixilon.minosoft.game.datatypes.entities.Poses;
import de.bixilon.minosoft.game.datatypes.entities.meta.EntityMetaData;
@@ -27,6 +26,7 @@ import de.bixilon.minosoft.game.datatypes.objectLoader.particle.data.DustParticl
import de.bixilon.minosoft.game.datatypes.objectLoader.particle.data.ItemParticleData;
import de.bixilon.minosoft.game.datatypes.objectLoader.particle.data.ParticleData;
import de.bixilon.minosoft.game.datatypes.objectLoader.recipes.Ingredient;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.game.datatypes.world.BlockPosition;
import de.bixilon.minosoft.protocol.network.Connection;
import de.bixilon.minosoft.util.BitByte;
@@ -199,8 +199,8 @@ public class InByteBuffer {
return new BlockPosition(x, y, z);
}
- public TextComponent readTextComponent() {
- return new TextComponent(readString());
+ public BaseComponent readTextComponent() {
+ return BaseComponent.fromString(readString());
}
public int getLength() {
diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/OutByteBuffer.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/OutByteBuffer.java
index f1e068f97..aa05e0c14 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/protocol/OutByteBuffer.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/OutByteBuffer.java
@@ -14,8 +14,8 @@
package de.bixilon.minosoft.protocol.protocol;
import com.google.gson.JsonObject;
-import de.bixilon.minosoft.game.datatypes.TextComponent;
import de.bixilon.minosoft.game.datatypes.inventory.Slot;
+import de.bixilon.minosoft.game.datatypes.text.BaseComponent;
import de.bixilon.minosoft.game.datatypes.world.BlockPosition;
import de.bixilon.minosoft.protocol.network.Connection;
import de.bixilon.minosoft.util.nbt.tag.CompoundTag;
@@ -74,10 +74,21 @@ public class OutByteBuffer {
}
}
+ public void writeTextComponent(BaseComponent component) {
+ writeString(component.getMessage()); //ToDo: test if this should not be json
+ }
+
public void writeJSON(JsonObject j) {
writeString(j.toString());
}
+ public void writeString(String s) {
+ writeVarInt(s.length());
+ for (byte b : s.getBytes(StandardCharsets.UTF_8)) {
+ bytes.add(b);
+ }
+ }
+
public void writeVarLong(long value) {
do
{
@@ -124,11 +135,8 @@ public class OutByteBuffer {
writeInt((int) (d * 32.0D));
}
- public void writeString(String s) {
- writeVarInt(s.length());
- for (byte b : s.getBytes(StandardCharsets.UTF_8)) {
- bytes.add(b);
- }
+ public void writeVarInt(int value) {
+ writeVarInt(value, bytes);
}
public ArrayList getBytes() {
@@ -147,14 +155,6 @@ public class OutByteBuffer {
writeLong((((long) (position.getX() & 0x3FFFFFF) << 38) | ((long) (position.getZ() & 0x3FFFFFF) << 12) | (long) (position.getY() & 0xFFF)));
}
- public void writeVarInt(int value) {
- writeVarInt(value, bytes);
- }
-
- public void writeTextComponent(TextComponent component) {
- writeJSON(component.getRaw());
- }
-
public static void writeVarInt(int value, ArrayList write) {
// thanks https://wiki.vg/Protocol#VarInt_and_VarLong
do
diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java
index 776320122..06bb6d135 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java
@@ -68,7 +68,7 @@ public class PacketHandler {
} else {
connection.setVersion(version);
}
- Log.info(String.format("Status response received: %s/%s online. MotD: '%s'", pkg.getResponse().getPlayerOnline(), pkg.getResponse().getMaxPlayers(), pkg.getResponse().getMotd().getColoredMessage()));
+ Log.info(String.format("Status response received: %s/%s online. MotD: '%s'", pkg.getResponse().getPlayerOnline(), pkg.getResponse().getMaxPlayers(), pkg.getResponse().getMotd().getANSIColoredMessage()));
connection.handlePingCallbacks(pkg.getResponse());
}
@@ -117,7 +117,7 @@ public class PacketHandler {
public void handle(PacketLoginDisconnect pkg) {
connection.fireEvent(new LoginDisconnectEvent(connection, pkg.getReason()));
- Log.info(String.format("Disconnecting from server (reason=%s)", pkg.getReason().getColoredMessage()));
+ Log.info(String.format("Disconnecting from server (reason=%s)", pkg.getReason().getANSIColoredMessage()));
connection.disconnect();
}
@@ -370,7 +370,7 @@ public class PacketHandler {
nbt.writeBlockPosition(pkg.getPosition());
nbt.writeTag("id", new StringTag("minecraft:sign"));
for (int i = 0; i < 4; i++) {
- nbt.writeTag(String.format("Text%d", (i + 1)), new StringTag(pkg.getLines()[i].getRaw().toString()));
+ nbt.writeTag(String.format("Text%d", (i + 1)), new StringTag(pkg.getLines()[i].getLegacyText()));
}
}