1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем MinotaurWorld, 23 дек 2016.

  1. Автор темы
    MinotaurWorld

    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. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooo
    chestname.equals(keyname)
     
  3. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Потому что сравниваются ссылки на объекты и равны они будут только если это один и тот же объект.
     
  4. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    +1
     
  5. iD3LSY

    iD3LSY Активный участник Пользователь

    Баллы:
    76
    Код:
    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()) {
     
  6. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooo
    нельзя так делать
     
  7. iD3LSY

    iD3LSY Активный участник Пользователь

    Баллы:
    76
    Извини, я не тестил xd
     
  8. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooo
    так вообще делать нельзя. строки через equals надо сравнивать.
     
  9. iD3LSY

    iD3LSY Активный участник Пользователь

    Баллы:
    76
    ..? Я лично всегда сравнивал через ==. Вообще, в чём отличие? По сути дела, одно и тоже.
     
  10. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Оператор == используется для проверки, что две строки указывают на один и тот же объект.
    Код:
    // Эти строки имеют одно и тоже же значение
    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 на == может привести к заметному ускорению.
     
  11. iD3LSY

    iD3LSY Активный участник Пользователь

    Баллы:
    76
    Воу воу воу 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");
                }
            }
        }
    Хотя мне пришлось немного прокакать на это время, но всё же :)
     
  12. Fenix78563

    Fenix78563 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    и все таки когда работаешь со строками лучше использовать equals. (ну кроме тех случаев которые нам так ахриненно расписал Ission
     

Поделиться этой страницей