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

Помогите Почему не находит в HashMap локацию?

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    Krong
    я не у этой локи меняю, а у локи которую получаю с ивента.
     
  2. Sturm_PT

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

    Баллы:
    76
    Тогда должно быть все ок. Впрочем, попробуй вместо setY создавать новую локу сразу с уменьшенным игреком
     
  3. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Убедись, что работаешь с разными экземплярами Location - мне кажется, ты меняешь тот же, который уже лежит в качестве ключа в HashMap.
    HashMap сначала находит твой объект у себя через hashCode, потом проверяет через equals. Проблема в том, что когда кладешь объект в HashMap, хэш забирается лишь раз. Соответственно, когда ты меняешь Location, у него меняется и хэш, а в HashMap он не обновляется. Отсюда и такое поведение: ключ вроде и проходит equals, но HashMap не находит из-за несовпадающих хэшей.
    Location учитывает любые отклонения.
     
    Последнее редактирование: 29 окт 2022
  4. Автор темы
    Krongss_fur

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

    Баллы:
    76
    Имя в Minecraft:
    Krong
    Хорошо, попробую сделать новую локацию с игриком а не поменять её у старой локации.
     
  5. Автор темы
    Krongss_fur

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

    Баллы:
    76
    Имя в Minecraft:
    Krong
    Если честно, потом совсем голова сломалась..
     
  6. Автор темы
    Krongss_fur

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

    Баллы:
    76
    Имя в Minecraft:
    Krong
    Когда я ставлю компаратор - проверяю координаты и смотрю после того как добавил его в мапу через containsKey и возвращает true. Потом когда игрок ломает компаратор мне выбивает в консоли что в мапе состоит
    Код:
     {Location{world=CraftWorld{name=world},x=-114.0,y=49.5,z=98.0,pitch=0.0,yaw=0.0}
    Но по сравнению с значением которое я записываю, там оно 50.0, а не 49.5. Вопрос, почему возник,но если подумать, компаратор это пол блока и наверно его считает как он стоит на 49.5 координате, но как это исправить, что делать для этого надо?
     
  7. Автор темы
    Krongss_fur

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

    Баллы:
    76
    Имя в Minecraft:
    Krong
    Вообще loc я получаю с BlockBreakEvent когда игрок ломает такой компаратор, и должно глянуть, есть ли такая локация в мапе, и получается они разные, но по значениям должны быть одинаковыми, а тут в мапе почему то записывает как 49.5, а должно 50.0. Перед тем как записать я выводил координаты с Location которую надо записать там стояло 50.0 и я после того как записал проверял, есть ли она там через containskey - есть.
     
  8. Sturm_PT

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

    Баллы:
    76
    Я ничего не понял, но если тебе надо прибавить корду без add - создай новую локу и параметрами передай значения старой. Вообще add у локации лучше не использовать, если не знаешь точно, как оно будет работать, ибо чёрт его знает, где ещё этот объект у тебя встречается
     
  9. Автор темы
    Krongss_fur

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

    Баллы:
    76
    Имя в Minecraft:
    Krong
    Если я создам то появиться блок по координатам другим.
     
  10. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Показывай полный код, как записываешь координаты.
     
  11. Автор темы
    Krongss_fur

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

    Баллы:
    76
    Имя в Minecraft:
    Krong
    Код:
        public void CreateRegionMethod(Player creator, Location loc){
            HashMap<UUID, RegionInfo> RegionsList = pl.RegionsList;
            HashMap<Location, RegionInfo> RegionToLoc = pl.RegionToLoc;
            HashSet<UUID> MemberList = pl.MembersList;
              if(isMemberOfRegion(creator) == false){
    
                  RegionInfo rg = new RegionInfo();
                  RegionInfo regionInfo = rg;
                  regionInfo.setOwner(creator);
    
                  regionInfo.setLocation(loc);
                  regionInfo.SaveInformation();
                  RegionsList.put(creator.getUniqueId(), regionInfo);
                  loc.setY(loc.getBlockY()); // Убирал и добавлял.
                  RegionToLoc.put(loc, regionInfo);
                  System.out.println(RegionToLoc.containsKey(loc));
    
                  setHologramToRegion(loc, creator);
                  creator.sendMessage(ChatColor.GREEN + "Вы успешно зарегистрировали свою базу!");
              } else if(isMemberOfRegion(creator) == true){
                  creator.sendMessage(ChatColor.RED + "Не делайте это! У вас уже есть регион свой!");
              }
        }
    Метод вызывается когда в ивенте BlockPlaceEvent игрок ставит специальный comparator.
     
  12. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Ужас, не называй, пожалуйста, методы и переменные с заглавной буквы.
    Увидеть бы полностью проблемные участки кода, от А до я
     
  13. Автор темы
    Krongss_fur

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

    Баллы:
    76
    Имя в Minecraft:
    Krong
    ну установка региона и удаление региона код я скидывал, этого должно быть достаточно.
     
  14. MurlikMurlik

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

    Баллы:
    96
    Нет, не достаточно. Скидывай все как есть например через pastebin.

    Как говорили выше, предполагаю что ты меняешь один и тот же экземпляр локации.
    В таком случае после того как ты получил его из хешмапы или из ивента, просто клонируй ее используя метод clone(), тогда ты гарантируешь что изменение этой копии не затронет ту что находится в хешмапе или где то еще, если тебе действительно нужно именно такое поведение.
    Лучше всего тогда сделать свою не изменяемую реализацию локации в которой переопределить методы equals и hashcode и использовать ее в качестве ключа в хешмапе, это может уберечь от таких ошибок.
     

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