Search code examples
javaminecraftbukkit

Checking if item lore contains contains string (loren.contains("§eSigned from "))


I only want to check for:

if (lore.contains("§eSigned of ")) {

but it doesn't get that it does contain "§eSigned of "

I wrote a Minecraft Command /sign you can add a lore to an item ("Signed of playerrank | playername"). Then i wanted to add an /unsign command to remove this lore.

ItemStack is = p.getItemInHand();
ItemMeta im = is.getItemMeta();
List<String> lore = im.hasLore() ? im.getLore() : new ArrayList<String>();
        
if (lore.contains("§eSigned of " + getChatName(p))) { // this line is important!
   for (int i = 0; i < 3; i++) {
        int size = lore.size();
        lore.remove(size - 1);                    
    }

    im.setLore(lore);
    is.setItemMeta(im);

    p.setItemInHand(is);
    sendMessage(p, "§aThis item is no longer signed");
} else {
    sendMessage(p, "§aThis item is not signed!");
}
return CommandResult.None;

Everything works fine until you e.g. change your name. than you can't remove the sign because getChatName(p) has changed. To fix this i only want to check

if (lore.contains("§eSigned of ")) {

but than it doesn't get it and returns false. (it says lore does not contain "§eSigned of ") I tried a lot but it only works with the string "§eSigned of " and getChatName(p). As the documentation "contains" searches for the specific string so it should work as I thought right?

Add: getChatName(p) returns the rank of the player and the playername like: "Member | domi" sendMessage(p, "") sends a simple message in the Minecraft chat


Solution

  • The problem you run into is that contains(String) looks for a matching string. What you search for is a check if any string in the list starts with "§eSigned of ".

    I would suggest adding a function isSignedItem like this:

    private boolean isSignedItem(List<String> lore) {
        for (String st : lore)
            if (st.startsWith("§eSigned of "))
                return true;
        return false;
    }
    

    and then to use this function to check if the item is signed or not:

        [...]
        List<String> lore = im.hasLore() ? im.getLore() : new ArrayList<String>();
        if (isSignedItem(lore)) { // this line is important!
            for (int i = 0; i < 3; i++) {
                int size = lore.size();
                lore.remove(size - 1);
            }
            [...]