diff --git a/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/AdventureComponentWrapper.java b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/AdventureComponentWrapper.java index ce5ced2..d87f8af 100644 --- a/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/AdventureComponentWrapper.java +++ b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/AdventureComponentWrapper.java @@ -5,6 +5,7 @@ import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import org.jetbrains.annotations.NotNull; import xyz.xenondevs.inventoryaccess.component.i18n.AdventureComponentLocalizer; import xyz.xenondevs.inventoryaccess.component.i18n.Languages; +import xyz.xenondevs.inventoryaccess.util.AdventureComponentUtils; public class AdventureComponentWrapper implements ComponentWrapper { @@ -27,6 +28,11 @@ public class AdventureComponentWrapper implements ComponentWrapper { return new AdventureComponentWrapper(AdventureComponentLocalizer.getInstance().localize(lang, component)); } + @Override + public @NotNull ComponentWrapper withoutPreFormatting() { + return new AdventureComponentWrapper(AdventureComponentUtils.withoutPreFormatting(component)); + } + @Override public @NotNull AdventureComponentWrapper clone() { try { diff --git a/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/BaseComponentWrapper.java b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/BungeeComponentWrapper.java similarity index 54% rename from inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/BaseComponentWrapper.java rename to inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/BungeeComponentWrapper.java index 4e5e1ae..9036f7e 100644 --- a/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/BaseComponentWrapper.java +++ b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/BungeeComponentWrapper.java @@ -3,23 +3,29 @@ package xyz.xenondevs.inventoryaccess.component; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.chat.ComponentSerializer; import org.jetbrains.annotations.NotNull; -import xyz.xenondevs.inventoryaccess.component.i18n.BaseComponentLocalizer; +import xyz.xenondevs.inventoryaccess.component.i18n.BungeeComponentLocalizer; import xyz.xenondevs.inventoryaccess.component.i18n.Languages; +import xyz.xenondevs.inventoryaccess.util.BungeeComponentUtils; -public class BaseComponentWrapper implements ComponentWrapper { +public class BungeeComponentWrapper implements ComponentWrapper { private final BaseComponent[] components; - public BaseComponentWrapper(BaseComponent[] components) { + public BungeeComponentWrapper(BaseComponent[] components) { this.components = components; } @Override - public @NotNull ComponentWrapper localized(@NotNull String lang) { + public @NotNull BungeeComponentWrapper localized(@NotNull String lang) { if (!Languages.getInstance().doesServerSideTranslations()) return this; - return new BaseComponentWrapper(BaseComponentLocalizer.getInstance().localize(lang, components)); + return new BungeeComponentWrapper(BungeeComponentLocalizer.getInstance().localize(lang, components)); + } + + @Override + public @NotNull BungeeComponentWrapper withoutPreFormatting() { + return new BungeeComponentWrapper(BungeeComponentUtils.withoutPreFormatting(components)); } @Override @@ -28,9 +34,9 @@ public class BaseComponentWrapper implements ComponentWrapper { } @Override - public @NotNull BaseComponentWrapper clone() { + public @NotNull BungeeComponentWrapper clone() { try { - var clone = (BaseComponentWrapper) super.clone(); + var clone = (BungeeComponentWrapper) super.clone(); for (int i = 0; i < clone.components.length; i++) { clone.components[i] = clone.components[i].duplicate(); } diff --git a/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/ComponentWrapper.java b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/ComponentWrapper.java index a42bc5c..b15a8cd 100644 --- a/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/ComponentWrapper.java +++ b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/ComponentWrapper.java @@ -25,6 +25,14 @@ public interface ComponentWrapper extends Cloneable { */ @NotNull ComponentWrapper localized(@NotNull String lang); + /** + * Creates a new {@link ComponentWrapper} that forces the default formatting (white color, no decorations), + * unless configured otherwise. + * + * @return A new {@link ComponentWrapper} with the default formatting. + */ + @NotNull ComponentWrapper withoutPreFormatting(); + /** * Creates a localized version of the component by replacing all translatable components with text components * of the {@link Player Player's} language. diff --git a/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/i18n/BaseComponentLocalizer.java b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/i18n/BungeeComponentLocalizer.java similarity index 88% rename from inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/i18n/BaseComponentLocalizer.java rename to inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/i18n/BungeeComponentLocalizer.java index 0582048..e1639e4 100644 --- a/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/i18n/BaseComponentLocalizer.java +++ b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/i18n/BungeeComponentLocalizer.java @@ -6,14 +6,14 @@ import net.md_5.bungee.api.chat.TranslatableComponent; import java.util.stream.Collectors; -public class BaseComponentLocalizer extends ComponentLocalizer { +public class BungeeComponentLocalizer extends ComponentLocalizer { - private static final BaseComponentLocalizer INSTANCE = new BaseComponentLocalizer(); + private static final BungeeComponentLocalizer INSTANCE = new BungeeComponentLocalizer(); - private BaseComponentLocalizer() { + private BungeeComponentLocalizer() { } - public static BaseComponentLocalizer getInstance() { + public static BungeeComponentLocalizer getInstance() { return INSTANCE; } diff --git a/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/map/MapIcon.java b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/map/MapIcon.java index f229803..e169f21 100644 --- a/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/map/MapIcon.java +++ b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/map/MapIcon.java @@ -3,7 +3,7 @@ package xyz.xenondevs.inventoryaccess.map; import net.md_5.bungee.api.chat.BaseComponent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import xyz.xenondevs.inventoryaccess.component.BaseComponentWrapper; +import xyz.xenondevs.inventoryaccess.component.BungeeComponentWrapper; import xyz.xenondevs.inventoryaccess.component.ComponentWrapper; public class MapIcon { @@ -23,7 +23,7 @@ public class MapIcon { } public MapIcon(@NotNull MapIconType type, int x, int y, int rot, @Nullable BaseComponent[] component) { - this(type, x, y, rot, new BaseComponentWrapper(component)); + this(type, x, y, rot, new BungeeComponentWrapper(component)); } public MapIcon(MapIconType type, byte x, byte y, byte rot) { diff --git a/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/util/AdventureComponentUtils.java b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/util/AdventureComponentUtils.java new file mode 100644 index 0000000..46272ee --- /dev/null +++ b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/util/AdventureComponentUtils.java @@ -0,0 +1,23 @@ +package xyz.xenondevs.inventoryaccess.util; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.TextDecoration; + +public class AdventureComponentUtils { + + private static final Style FORMATTING_TEMPLATE = Style.style() + .color(NamedTextColor.WHITE) + .decoration(TextDecoration.ITALIC, false) + .decoration(TextDecoration.BOLD, false) + .decoration(TextDecoration.STRIKETHROUGH, false) + .decoration(TextDecoration.UNDERLINED, false) + .decoration(TextDecoration.OBFUSCATED, false) + .build(); + + public static Component withoutPreFormatting(Component component) { + return component.style(component.style().merge(FORMATTING_TEMPLATE, Style.Merge.Strategy.IF_ABSENT_ON_TARGET)); + } + +} diff --git a/invui/src/main/java/xyz/xenondevs/invui/util/ComponentUtils.java b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/util/BungeeComponentUtils.java similarity index 67% rename from invui/src/main/java/xyz/xenondevs/invui/util/ComponentUtils.java rename to inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/util/BungeeComponentUtils.java index d31b61a..e126318 100644 --- a/invui/src/main/java/xyz/xenondevs/invui/util/ComponentUtils.java +++ b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/util/BungeeComponentUtils.java @@ -1,11 +1,13 @@ -package xyz.xenondevs.invui.util; +package xyz.xenondevs.inventoryaccess.util; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.ComponentBuilder; import net.md_5.bungee.api.chat.TextComponent; -public class ComponentUtils { +import java.util.Arrays; + +public class BungeeComponentUtils { private static final BaseComponent FORMATTING_TEMPLATE = new ComponentBuilder("") .italic(false) @@ -21,13 +23,19 @@ public class ComponentUtils { } public static BaseComponent[] withoutPreFormatting(BaseComponent... components) { + BaseComponent[] duplicate = duplicate(components); + BaseComponent previousComponent = FORMATTING_TEMPLATE; - for (BaseComponent component : components) { + for (BaseComponent component : duplicate) { component.copyFormatting(previousComponent, false); previousComponent = component; } - return components; + return duplicate; + } + + public static BaseComponent[] duplicate(BaseComponent... components) { + return Arrays.stream(components).map(BaseComponent::duplicate).toArray(BaseComponent[]::new); } } diff --git a/invui-kotlin/src/main/kotlin/xyz/xenondevs/invui/ItemBuilders.kt b/invui-kotlin/src/main/kotlin/xyz/xenondevs/invui/ItemBuilders.kt index 06ec743..2008a73 100644 --- a/invui-kotlin/src/main/kotlin/xyz/xenondevs/invui/ItemBuilders.kt +++ b/invui-kotlin/src/main/kotlin/xyz/xenondevs/invui/ItemBuilders.kt @@ -3,10 +3,9 @@ package xyz.xenondevs.invui.item.builder import net.md_5.bungee.api.chat.BaseComponent -import xyz.xenondevs.inventoryaccess.component.BaseComponentWrapper -import xyz.xenondevs.invui.util.ComponentUtils +import xyz.xenondevs.inventoryaccess.component.BungeeComponentWrapper /** * Sets the lore of the item stack. */ -fun > T.setLore(lore: List>): T = setLore(lore.map { BaseComponentWrapper(ComponentUtils.withoutPreFormatting(*it)) }) \ No newline at end of file +fun > T.setLore(lore: List>): T = setLore(lore.map { BungeeComponentWrapper(it) }) \ No newline at end of file diff --git a/invui-kotlin/src/main/kotlin/xyz/xenondevs/invui/adventure/AdventureWindows.kt b/invui-kotlin/src/main/kotlin/xyz/xenondevs/invui/adventure/AdventureWindows.kt new file mode 100644 index 0000000..34b3610 --- /dev/null +++ b/invui-kotlin/src/main/kotlin/xyz/xenondevs/invui/adventure/AdventureWindows.kt @@ -0,0 +1,10 @@ +@file:Suppress("PackageDirectoryMismatch") + +package xyz.xenondevs.invui.window + +import net.kyori.adventure.text.Component +import xyz.xenondevs.inventoryaccess.component.AdventureComponentWrapper + +fun Window.changeTitle(title: Component) { + changeTitle(AdventureComponentWrapper(title)) +} \ No newline at end of file diff --git a/invui-resourcepack/src/main/java/xyz/xenondevs/invui/resourcepack/ForceResourcePack.java b/invui-resourcepack/src/main/java/xyz/xenondevs/invui/resourcepack/ForceResourcePack.java index 0b01c8e..9c36df9 100644 --- a/invui-resourcepack/src/main/java/xyz/xenondevs/invui/resourcepack/ForceResourcePack.java +++ b/invui-resourcepack/src/main/java/xyz/xenondevs/invui/resourcepack/ForceResourcePack.java @@ -9,7 +9,7 @@ import org.bukkit.event.player.PlayerResourcePackStatusEvent; import org.bukkit.scheduler.BukkitTask; import org.jetbrains.annotations.Nullable; import xyz.xenondevs.inventoryaccess.InventoryAccess; -import xyz.xenondevs.inventoryaccess.component.BaseComponentWrapper; +import xyz.xenondevs.inventoryaccess.component.BungeeComponentWrapper; import xyz.xenondevs.inventoryaccess.component.ComponentWrapper; import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry; import xyz.xenondevs.inventoryaccess.util.VersionUtils; @@ -79,7 +79,7 @@ public class ForceResourcePack implements Listener { * @throws IOException If the connection was not successful */ public void setResourcePack(@Nullable String resourcePackUrl, @Nullable BaseComponent[] prompt) throws IOException { - setResourcePack(resourcePackUrl, new BaseComponentWrapper(prompt), true); + setResourcePack(resourcePackUrl, new BungeeComponentWrapper(prompt), true); } /** @@ -119,7 +119,7 @@ public class ForceResourcePack implements Listener { * @throws IOException If the connection was not successful */ public void setResourcePack(@Nullable String resourcePackUrl, @Nullable BaseComponent[] prompt, boolean sendToOnlinePlayers) throws IOException { - setResourcePack(resourcePackUrl, new BaseComponentWrapper(prompt), sendToOnlinePlayers); + setResourcePack(resourcePackUrl, new BungeeComponentWrapper(prompt), sendToOnlinePlayers); } public void sendResourcePack(Player player) { diff --git a/invui/src/main/java/xyz/xenondevs/invui/item/builder/AbstractItemBuilder.java b/invui/src/main/java/xyz/xenondevs/invui/item/builder/AbstractItemBuilder.java index c3f7fef..df6750d 100644 --- a/invui/src/main/java/xyz/xenondevs/invui/item/builder/AbstractItemBuilder.java +++ b/invui/src/main/java/xyz/xenondevs/invui/item/builder/AbstractItemBuilder.java @@ -1,6 +1,7 @@ package xyz.xenondevs.invui.item.builder; import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemFlag; @@ -11,10 +12,9 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import xyz.xenondevs.inventoryaccess.InventoryAccess; -import xyz.xenondevs.inventoryaccess.component.BaseComponentWrapper; +import xyz.xenondevs.inventoryaccess.component.BungeeComponentWrapper; import xyz.xenondevs.inventoryaccess.component.ComponentWrapper; import xyz.xenondevs.invui.item.ItemProvider; -import xyz.xenondevs.invui.util.ComponentUtils; import xyz.xenondevs.invui.util.Pair; import java.util.ArrayList; @@ -207,19 +207,19 @@ public abstract class AbstractItemBuilder implements ItemProvider { @Contract("_ -> this") public @NotNull S setDisplayName(String displayName) { - this.displayName = new BaseComponentWrapper(ComponentUtils.withoutPreFormatting(displayName)); + this.displayName = new BungeeComponentWrapper(TextComponent.fromLegacyText(displayName)).withoutPreFormatting(); return (S) this; } @Contract("_ -> this") public @NotNull S setDisplayName(BaseComponent... displayName) { - this.displayName = new BaseComponentWrapper(ComponentUtils.withoutPreFormatting(displayName)); + this.displayName = new BungeeComponentWrapper(displayName).withoutPreFormatting(); return (S) this; } @Contract("_ -> this") public @NotNull S setDisplayName(ComponentWrapper component) { - this.displayName = component; + this.displayName = component.withoutPreFormatting(); return (S) this; } @@ -230,14 +230,16 @@ public abstract class AbstractItemBuilder implements ItemProvider { @Contract("_ -> this") public @NotNull S setLore(List lore) { - this.lore = lore; + this.lore = lore.stream() + .map(ComponentWrapper::withoutPreFormatting) + .collect(Collectors.toList()); return (S) this; } @Contract("_ -> this") public @NotNull S setLegacyLore(@NotNull List lore) { this.lore = lore.stream() - .map(line -> new BaseComponentWrapper(ComponentUtils.withoutPreFormatting(line))) + .map(line -> new BungeeComponentWrapper(TextComponent.fromLegacyText(line)).withoutPreFormatting()) .collect(Collectors.toList()); return (S) this; } @@ -247,7 +249,8 @@ public abstract class AbstractItemBuilder implements ItemProvider { if (lore == null) lore = new ArrayList<>(); for (String line : lines) - lore.add(new BaseComponentWrapper(ComponentUtils.withoutPreFormatting(line))); + lore.add(new BungeeComponentWrapper(TextComponent.fromLegacyText(line)).withoutPreFormatting()); + return (S) this; } @@ -255,11 +258,8 @@ public abstract class AbstractItemBuilder implements ItemProvider { public @NotNull S addLoreLines(@NotNull BaseComponent[]... lines) { if (lore == null) lore = new ArrayList<>(); - lore.addAll( - Arrays.stream(lines) - .map(line -> new BaseComponentWrapper(ComponentUtils.withoutPreFormatting(line))) - .collect(Collectors.toList()) - ); + for (BaseComponent[] line : lines) + lore.add(new BungeeComponentWrapper(line).withoutPreFormatting()); return (S) this; } @@ -268,7 +268,8 @@ public abstract class AbstractItemBuilder implements ItemProvider { public @NotNull S addLoreLines(@NotNull ComponentWrapper... lines) { if (lore == null) lore = new ArrayList<>(); - lore.addAll(Arrays.asList(lines)); + for (ComponentWrapper line : lines) + lore.add(line.withoutPreFormatting()); return (S) this; } diff --git a/invui/src/main/java/xyz/xenondevs/invui/window/AbstractWindow.java b/invui/src/main/java/xyz/xenondevs/invui/window/AbstractWindow.java index 3008361..9cad5b9 100644 --- a/invui/src/main/java/xyz/xenondevs/invui/window/AbstractWindow.java +++ b/invui/src/main/java/xyz/xenondevs/invui/window/AbstractWindow.java @@ -18,7 +18,7 @@ import org.bukkit.persistence.PersistentDataType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import xyz.xenondevs.inventoryaccess.InventoryAccess; -import xyz.xenondevs.inventoryaccess.component.BaseComponentWrapper; +import xyz.xenondevs.inventoryaccess.component.BungeeComponentWrapper; import xyz.xenondevs.inventoryaccess.component.ComponentWrapper; import xyz.xenondevs.inventoryaccess.component.i18n.Languages; import xyz.xenondevs.invui.InvUI; @@ -285,7 +285,7 @@ public abstract class AbstractWindow implements Window, GuiParent { @Override public void changeTitle(@NotNull BaseComponent[] title) { - changeTitle(new BaseComponentWrapper(title)); + changeTitle(new BungeeComponentWrapper(title)); } @Override @@ -413,13 +413,13 @@ public abstract class AbstractWindow implements Window, GuiParent { @Override public @NotNull S setTitle(@NotNull BaseComponent @NotNull [] title) { - this.title = new BaseComponentWrapper(title); + this.title = new BungeeComponentWrapper(title); return (S) this; } @Override public @NotNull S setTitle(@NotNull String title) { - this.title = new BaseComponentWrapper(TextComponent.fromLegacyText(title)); + this.title = new BungeeComponentWrapper(TextComponent.fromLegacyText(title)); return (S) this; }