Theme

Creating a Theme

A Theme in SefiLib is a way to pre-define a style and reuse it in multi locations.

It supports basic chat messages and strings, Themed ItemStack and Themed SlimefunItemStack also.

To create a new Theme, first add the import:

import io.github.sefiraat.sefilib.string.Theme;

Then you need to choose your ChatColor for the theme.

ChatColor chatColor = ChatColor.of("#3295a8");
ChatColor chatColor = ChatColor.RED;
Color color = new Color(255, 150, 20);
ChatColor chatColor = ChatColor.of(color);

Be sure you use ChatColor from net.md_5.bungee.api.ChatColor not org.bukkit.ChatColor

Then you need a String that will be the name, lore line and tag for this Theme. This string is used in the following ways:

  • Added to the final line in the lore of an ItemStack

  • Prepends any logging message sent via the Theme

Then create a new Theme using these two arguments.

Theme TRAIT = new Theme(ChatColor.of("#3295a8"), "Trait");

I would suggest creating themes as static elements of a utility class, as per the below example:

package dev.sefiraat.slimetinker2.implementation;

import io.github.sefiraat.sefilib.string.Theme;
import net.md_5.bungee.api.ChatColor;

public final class TinkerThemes {

    private TinkerThemes() {
        throw new IllegalStateException("Utility class");
    }

    public static final Theme MAIN = new Theme(ChatColor.of("#8a0e0e"), "SlimeTinker2");
    public static final Theme RESEARCH = new Theme(ChatColor.of("#a60e03"), "Research");
    public static final Theme CRAFTING = new Theme(ChatColor.of("#dbcea9"), "Crafting Material");
    public static final Theme RECIPE_TYPE = new Theme(ChatColor.of("#ffe89c"), "Recipe Type");
    public static final Theme MACHINE = new Theme(ChatColor.of("#3295a8"), "Machine");
    public static final Theme TOOL = new Theme(ChatColor.of("#3295a8"), "Tool");
    public static final Theme PART = new Theme(ChatColor.of("#dbcea9"), "Part");
    public static final Theme TRAIT = new Theme(ChatColor.of("#3295a8"), "Trait");
    public static final Theme MATERIAL = new Theme(ChatColor.of("#dbcea9"), "Material");
    public static final Theme ENCHANTMENT = new Theme(ChatColor.of("#ffe89c"), "Enchantment");
    public static final Theme UPGRADE = new Theme(ChatColor.of("#ea201a"), "Upgrade");
    public static final Theme ADDON = new Theme(ChatColor.of("#8a0e0e"), "Addon");
}

The Theme class comes with some default themes that can be used for common purposes (and used by Theme for item generation and certain strings).

// Yellow theme used to denote a warning of some kind
public static final Theme WARNING = new Theme(ChatColor.YELLOW, "Warning");
// Red theme used to denote an error, misuse etc.
public static final Theme ERROR = new Theme(ChatColor.RED, "Error");
// A plain white theme used for simple notices
public static final Theme NOTICE = new Theme(ChatColor.WHITE, "Notice");
// A passive light grey theme used for hints, sub-information and item lore
public static final Theme PASSIVE = new Theme(ChatColor.GRAY);
// A lime-green theme used to denote success and/or 'good' responses
public static final Theme SUCCESS = new Theme(ChatColor.GREEN, "Success");
// A bright yellow used for highlighting key word or where to click
public static final Theme CLICK_INFO = new Theme(ChatColor.of("#e4ed32"), "Click here");

ItemStacks

To create an ItemStack with the Theme applied. Simply use the static method Theme#themedItemStack() providing the Material, the Theme to be applied, the Item's name and a List<String> for the lore.

ItemStack itemStack = Theme.themedItemStack(
    Material.OAK_LOG,
    Themes.MATERIAL,
    "Testing Name",
    List.of(
        "Hello there",
        "This is some lore"
    )
);

The resulting ItemStack will have the name you provided using the Theme's color. The lore lines will follow after a single line gap using a the default Theme#PASSIVE. After all of the lore lines, there will be one last gap followed by the Theme's lore line using Theme#CLICK_INFO

SlimefunItemStack

A SlimefunItemStack is created in almost the same way, requiring an additional argument for the SlimefunItem ID as well as the List<String> being replaced with a String Array/String var-args

SlimefunItemStack slimefunItemStack = Theme.themedSlimefunItemStack(
    "ADDON_ITEM_ID",
    Material.OAK_LOG,
    Themes.MATERIAL,
    "Testing Name",
    new String[] {
        "Hello there",
        "This is some lore"
    }
);
SlimefunItemStack slimefunItemStack = Theme.themedSlimefunItemStack(
    "ADDON_ITEM_ID",
    Material.OAK_LOG,
    Themes.MATERIAL,
    "Testing Name",
    "Hello there",
    "This is some lore"
);

Themed Strings

The Theme class overrides .toString() to provide the theme's base color. This means at the most basic level, you can use your theme field directly within a string concatenation or other message formatter

String string = Themes.WARNING_THEME + "WARNING"

String string = MESSAGE_FORMAT.format(
    new Object[]{Themes.WARNING_THEME, "WARNING"}, 
    new StringBuffer(), 
    null
).toString()

You can use the .apply(Object) method which will directly return a String that is colored to match the theme. The static method Theme#applyThemeToString(Theme, String) does the same as .apply() but in a static context.

Player player = getPlayer();

player.sendMessage(Themes.WARNING_THEME.apply("This is a warning message"));

player.sendMessage(Theme.applyThemeToString(Themes.WARNING_THEME, "This is a warning mesage"));

You can use the .asTitle(Object, Object) method which will directly return a String that has the first object (as a string) in the themes color followed immedietly by a colon, a space then the second object as a string using the default Theme.PASSIVE. The static method Theme#applyThemeAsTitle(Theme, String, Object) does the same as .asTitle() but in a static context.

Player player = getPlayer();
int numberOfItems = getNumberOfItems();
String message = Theme.CLICK_INFO.asTitle("Total Items", numberOfItems);

player.sendMessage(message);

Last updated