Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов 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. Хостинг MineCraft
    <
  3. slavik123123123

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

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

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

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

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    +1
     
  6. iD3LSY

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

    Баллы:
    46
    Имя в Minecraft:
    opy
    Код:
    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()) {
     
  7. slavik123123123

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

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

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

    Баллы:
    46
    Имя в Minecraft:
    opy
    Извини, я не тестил xd
     
  9. slavik123123123

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

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

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

    Баллы:
    46
    Имя в Minecraft:
    opy
    ..? Я лично всегда сравнивал через ==. Вообще, в чём отличие? По сути дела, одно и тоже.
     
  11. 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 на == может привести к заметному ускорению.
     
  12. iD3LSY

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

    Баллы:
    46
    Имя в Minecraft:
    opy
    Воу воу воу xd. Полегче))0[DOUBLEPOST=1482526891,1482525996][/DOUBLEPOST]Крч, люди, разобрался. Хз почему, но предметы, название которых не имеет цвета, не проходят проверку. Установи любой цвет, будь то даже §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");
                }
            }
        }
    Хотя мне пришлось немного прокакать на это время, но всё же :)
     
  13. Fenix78563

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

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

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