Помогите По чему это значение не равно этому значению?

MinotaurWorld

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
MinotaurWorld
Я писал плагин на ключи для сундуков. И столкулся с проблемой. Есть 2 String переменные. В первой переменной хранится имя сундука, во второй переменной хранится имя ключа. Вот пример:

Код:
Chest chest = (Chest) event.getClickedBlock().getState();
String chestname = chest.getCustomName();
String keyname =  player.getItemInHand().getItemMeta().getDisplayName();
if (chestname == keyname){
    player.sendMessage(Подходит.);
}
if (chestname != keyname){
    player.sendMessage(Не подходит.);
}
Когда я переименовываю сундук и ключ в разные имена, он пишет (Не подходит.). Если одинаковые то, он пишет (Не подходит.). Почему? Подходит он пишет, только если оба значения null.
 
Я писал плагин на ключи для сундуков. И столкулся с проблемой. Есть 2 String переменные. В первой переменной хранится имя сундука, во второй переменной хранится имя ключа. Вот пример:

Код:
Chest chest = (Chest) event.getClickedBlock().getState();
String chestname = chest.getCustomName();
String keyname =  player.getItemInHand().getItemMeta().getDisplayName();
if (chestname == keyname){
    player.sendMessage(Подходит.);
}
if (chestname != keyname){
    player.sendMessage(Не подходит.);
}
Когда я переименовываю сундук и ключ в разные имена, он пишет (Не подходит.). Если одинаковые то, он пишет (Не подходит.). Почему? Подходит он пишет, только если оба значения null.
Потому что сравниваются ссылки на объекты и равны они будут только если это один и тот же объект.
 
Код:
Chest chest = (Chest) event.getClickedBlock().getState();
        if(event.getPlayer().getItemInHand().getItemMeta().getDisplayName() == "Название шмотки" &&
                chest.getBlockInventory().getTitle() == "Название инвенторя") {
            player.sendMessage("Подходит.");
        } else {
            player.sendMessage("Не подходит.");
        }
Пробуй.

Ну или
Код:
if(event.getPlayer().getItemInHand().getItemMeta().getDisplayName() == "Название шмотки" &&
                chest.getBlockInventory().getTitle() == "Название инвенторя") {
Замени на
Код:
if(event.getPlayer().getItemInHand().getItemMeta().getDisplayName() == chest.getBlockInventory().getTitle()) {
 
Оператор == используется для проверки, что две строки указывают на один и тот же объект.
Java:
// Эти строки имеют одно и тоже же значение
new String("test").equals("test") // --> true 

// ...но это разные объекты
new String("test") == "test" // --> false 

// ...эти строки тоже разные объекты
new String("test") == new String("test") // --> false 

// ...но эти строки указывают на один и тот же объект,
// потому что компилятор добавляет все литералы в пул.
"test" == "test" // --> true 

// Конкатенация литералов тоже происходит на стадии компиляции,
// поэтому они указывают на один объект
"test" == "te" + "st" // --> true

// но вызов substring() происходит во время выполнения,
// в результате получаются разные объекты.
"test" == "!test".substring(1) // --> false

// Строки из пула могут быть получены с помощью вызова intern().
"test" == "!test".substring(1).intern() // --> true
Надо отметить, что == заметно быстрее, чем equals (сравнение ссылки вместо вызова метода и посимвольного сравнения, если строки разной длины), поэтому, если вы работаете со строками из пула (или системного, или своего), замена equals на == может привести к заметному ускорению.
 
Оператор == используется для проверки, что две строки указывают на один и тот же объект.
Java:
// Эти строки имеют одно и тоже же значение
new String("test").equals("test") // --> true

// ...но это разные объекты
new String("test") == "test" // --> false

// ...эти строки тоже разные объекты
new String("test") == new String("test") // --> false

// ...но эти строки указывают на один и тот же объект,
// потому что компилятор добавляет все литералы в пул.
"test" == "test" // --> true

// Конкатенация литералов тоже происходит на стадии компиляции,
// поэтому они указывают на один объект
"test" == "te" + "st" // --> true

// но вызов substring() происходит во время выполнения,
// в результате получаются разные объекты.
"test" == "!test".substring(1) // --> false

// Строки из пула могут быть получены с помощью вызова intern().
"test" == "!test".substring(1).intern() // --> true
Надо отметить, что == заметно быстрее, чем equals (сравнение ссылки вместо вызова метода и посимвольного сравнения, если строки разной длины), поэтому, если вы работаете со строками из пула (или системного, или своего), замена equals на == может привести к заметному ускорению.
Воу воу воу xd. Полегче))0
Крч, люди, разобрался. Хз почему, но предметы, название которых не имеет цвета, не проходят проверку. Установи любой цвет, будь то даже §f. То есть выдавай игроку не "key", а "§fkey". Цвет не поменяется, а вот работать всё будет.
Код:
public void onInteract(PlayerInteractEvent e) {
        if (e.getAction().equals(Action.RIGHT_CLICK_BLOCK) && e.getClickedBlock().getType() == Material.CHEST) {
            Chest chest = (Chest) e.getClickedBlock().getState();
            if (!chest.getBlockInventory().getName().equals("container.chest") && e.getPlayer().getItemInHand().getItemMeta().getDisplayName() == "§fkey") {
                e.getPlayer().sendMessage(chest.getBlockInventory().getName());
            } else {
                e.getPlayer().sendMessage("sosi");
            }
        }
    }
Хотя мне пришлось немного прокакать на это время, но всё же :)
 
Воу воу воу xd. Полегче))0
Крч, люди, разобрался. Хз почему, но предметы, название которых не имеет цвета, не проходят проверку. Установи любой цвет, будь то даже §f. То есть выдавай игроку не "key", а "§fkey". Цвет не поменяется, а вот работать всё будет.
Код:
public void onInteract(PlayerInteractEvent e) {
        if (e.getAction().equals(Action.RIGHT_CLICK_BLOCK) && e.getClickedBlock().getType() == Material.CHEST) {
            Chest chest = (Chest) e.getClickedBlock().getState();
            if (!chest.getBlockInventory().getName().equals("container.chest") && e.getPlayer().getItemInHand().getItemMeta().getDisplayName() == "§fkey") {
                e.getPlayer().sendMessage(chest.getBlockInventory().getName());
            } else {
                e.getPlayer().sendMessage("sosi");
            }
        }
    }
Хотя мне пришлось немного прокакать на это время, но всё же :)
и все таки когда работаешь со строками лучше использовать equals. (ну кроме тех случаев которые нам так ахриненно расписал Ission
 
Назад
Верх