Проверка, содержит ли история предмета строку (loren.contains ("§eSigned from")) - PullRequest
1 голос
/ 11 июля 2020

Я только хочу проверить:

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

, но не понимаю, что он действительно содержит «§eSigned of»

Я написал команду Minecraft /sign вы можете добавить сведения к предмету («Подписано рейтинг игрока | имя игрока »). Затем я хотел добавить команду /unsign, чтобы удалить эту информацию.

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;

Все работает нормально, пока вы, например, не измените свое имя. чем вы не можете удалить знак, потому что getChatName(p) изменилось. Чтобы исправить это, я хочу только проверить

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

, но он не получает его и возвращает false. (он говорит, что лор не содержит «§eSigned of») Я много пробовал, но он работает только со строкой «§eSigned of» и getChatName(p). Поскольку документация «содержит» выполняет поиск указанной строки c, она должна работать так, как я думал, правильно?

Добавить: getChatName(p) возвращает рейтинг игрока и имя игрока, например: «Член | domi» sendMessage(p, "") отправляет простое сообщение в чат Minecraft

1 Ответ

1 голос
/ 11 июля 2020

Проблема, с которой вы столкнулись, заключается в том, что contains(String) ищет подходящую строку. То, что вы ищете, - это проверка, начинается ли какая-либо строка в списке с «§eSigned of».

Я бы предложил добавить функцию isSignedItem вроде этой:

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

, а затем чтобы использовать эту функцию, чтобы проверить, подписан ли элемент или нет:

    [...]
    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);
        }
        [...]
...