- Баллы
- 76
- Имя в Minecraft
- Krong
я не у этой локи меняю, а у локи которую получаю с ивента.Если ты сначала суёшь локу в мапу, а потом изменяешь её - да, по идее может не найти
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
я не у этой локи меняю, а у локи которую получаю с ивента.Если ты сначала суёшь локу в мапу, а потом изменяешь её - да, по идее может не найти
Тогда должно быть все ок. Впрочем, попробуй вместо setY создавать новую локу сразу с уменьшенным игрекомя не у этой локи меняю, а у локи которую получаю с ивента.
Убедись, что работаешь с разными экземплярами Location - мне кажется, ты меняешь тот же, который уже лежит в качестве ключа в HashMap.Код:public void DeleteRegion(Player plr, Location loc){ HashMap<Location, RegionInfo> RegionsLocation = pl.RegionToLoc; double y = loc.getY(); y = y - 0.5; loc.setY(y); HashMap<UUID, RegionInfo> Regions = pl.RegionsList; for(Location locs : RegionsLocation.keySet()){ System.out.println(locs.equals(loc)); System.out.println(loc.toString() + " Coordinated"); System.out.println(locs.toString() + " Coordinated to location hashmap"); } System.out.println(RegionsLocation.containsKey(loc)); if(RegionsLocation.containsKey(loc)){ RegionInfo rg = RegionsLocation.get(loc); System.out.println("Executed"); System.out.println(loc.toString() + " Coordinated"); System.out.println(RegionsLocation.toString() + " Locations to region"); System.out.println(Regions.toString() + "Regions"); if(rg.getOwnerName().equals(plr.getName().toString())){ rg.DeleteHologram(); RegionsLocation.remove(loc, rg); Regions.remove(plr.getUniqueId(), rg); plr.sendMessage(ChatColor.YELLOW + "Вы разрушили свою базу!"); } } }
Location учитывает любые отклонения.А вопрос такой, может ли повлиять такой момент, что в одном из значений было на 0,5 больше по y чем у другой локации, я про это уже упоминал т.к это компаратор и пол блока, и я просто вычитал 0,5 из этого y что получал значение.0
{Location{world=CraftWorld{name=world},x=-114.0,y=49.5,z=98.0,pitch=0.0,yaw=0.0}
Вообще loc я получаю с BlockBreakEvent когда игрок ломает такой компаратор, и должно глянуть, есть ли такая локация в мапе, и получается они разные, но по значениям должны быть одинаковыми, а тут в мапе почему то записывает как 49.5, а должно 50.0. Перед тем как записать я выводил координаты с Location которую надо записать там стояло 50.0 и я после того как записал проверял, есть ли она там через containskey - есть.Убедись, что работаешь с разными экземплярами Location - мне кажется, ты меняешь тот же, который уже лежит в качестве ключа в HashMap.
HashMap сначала находит твой объект у себя через hashCode, потом проверяет через equals. Проблема в том, что когда кладешь объект в HashMap, хэш забирается лишь раз. Соответственно, когда ты меняешь Location, у него меняется и хэш, а в HashMap он не обновляется. Отсюда и такое поведение: ключ вроде и проходит equals, но HashMap не находит из-за несовпадающих хэшей.
Location учитывает любые отклонения.
Я ничего не понял, но если тебе надо прибавить корду без add - создай новую локу и параметрами передай значения старой. Вообще add у локации лучше не использовать, если не знаешь точно, как оно будет работать, ибо чёрт его знает, где ещё этот объект у тебя встречаетсяКогда я ставлю компаратор - проверяю координаты и смотрю после того как добавил его в мапу через containsKey и возвращает true. Потом когда игрок ломает компаратор мне выбивает в консоли что в мапе состоит
Но по сравнению с значением которое я записываю, там оно 50.0, а не 49.5. Вопрос, почему возник,но если подумать, компаратор это пол блока и наверно его считает как он стоит на 49.5 координате, но как это исправить, что делать для этого надо?Код:{Location{world=CraftWorld{name=world},x=-114.0,y=49.5,z=98.0,pitch=0.0,yaw=0.0}
Показывай полный код, как записываешь координаты.Когда я ставлю компаратор - проверяю координаты и смотрю после того как добавил его в мапу через containsKey и возвращает true. Потом когда игрок ломает компаратор мне выбивает в консоли что в мапе состоит
Но по сравнению с значением которое я записываю, там оно 50.0, а не 49.5. Вопрос, почему возник,но если подумать, компаратор это пол блока и наверно его считает как он стоит на 49.5 координате, но как это исправить, что делать для этого надо?Код:{Location{world=CraftWorld{name=world},x=-114.0,y=49.5,z=98.0,pitch=0.0,yaw=0.0}
Показывай полный код, как записываешь координаты.
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.Код: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 + "Не делайте это! У вас уже есть регион свой!"); } }
ну установка региона и удаление региона код я скидывал, этого должно быть достаточно.Ужас, не называй, пожалуйста, методы и переменные с заглавной буквы.
Увидеть бы полностью проблемные участки кода, от А до я
Нет, не достаточно. Скидывай все как есть например через pastebin.ну установка региона и удаление региона код я скидывал, этого должно быть достаточно.