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

Помогите Как проверить наличие рамки на сундуке

Тема в разделе "Разработка плагинов для новичков", создана пользователем Serega87, 11 фев 2025.

Статус темы:
Закрыта.
  1. Автор темы
    Serega87

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

    Баллы:
    61
    Пожалуйста помогите. Уже все форумы пересмотрел и все перепробовал. Не могу проверить наличие рамки на сундуке при нажатии ЛКМ по табличке. Уже знаю что рамка это Entity. Так как в начале работал с событием PlayerInventoryEvent. Не выходит ни чего и с событием PlayerInteractEntityEvent. Нужно чтобы при нажатии ЛКМ по табличке мне написало сообщение ''Вы угадали", если в сундуке предмет соответствовал тому что в рамке.
    Если код большой, напишите пожалуйста хотя бы код проверки наличия рамки на сундуке при нажатии ЛКМ по табличке. Spigot 1.12.2
    3.jpg
     
  2. MrAlexeiMK

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

    Баллы:
    66
    Имя в Minecraft:
    MrAlexeiMK
    Код:
    @EventHandler
    public void onInventoryClick(PlayerInteractEvent event) {
          if (event.getClickedBlock() == null) {
              return;
          }
          if (event.getAction() != Action.LEFT_CLICK_BLOCK) {
              return;
          }
          // TODO: Проверить, что кликнута табличка.
          final var clickedBlockLocation = event.getClickedBlock()
                                                .getLocation();
          // Find all frames nearby to the clicked sign.
          final var nearbyFrames = clickedBlockLocation.getNearbyEntitiesByType(ItemFrame.class, 2)
                                                       .stream()
                                                       // Filter item frames that not attached to chest.
                                                       // TODO: Все фильтры внизу требуют тестирования.
                                                       .filter(frame -> frame.getLocation()
                                                                             .getBlock()
                                                                             .getRelative(frame.getAttachedFace())
                                                                             .getType()
                                                                             .equals(Material.CHEST))
                                                       // Filter frames that not under the sign.
                                                       .filter(frame -> frame.getLocation()
                                                                             .getBlockY() == clickedBlockLocation.getBlockY() - 1)
                                                       // Filter frames that not directly under the sign.
                                                       // TODO: Можно сделать строже.
                                                       .filter(frame -> frame.getLocation()
                                                                             .getBlockX() == clickedBlockLocation.getBlockX()
                                                           || frame.getLocation()
                                                                   .getBlockZ() == clickedBlockLocation.getBlockZ())
                                                       .toList();
          if (nearbyFrames.isEmpty()) {
              // Frames not found.
              return;
          }
          if (nearbyFrames.size() > 1) {
              // TODO: Если эта ситуация достигнута, то фильтры выше недостаточно строги.
              //  Писать в WARN об этом и выбирать ближайший frame, либо ничего не делать.
              return;
          }
          final var frame = nearbyFrames.get(0);
          // Если эта часть кода достигнута, то frame под табличкой найден (frame).
      }
    
     
  3. Автор темы
    Serega87

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

    Баллы:
    61
    Все в ошибках.
     
    Последнее редактирование: 11 фев 2025
  4. MrAlexeiMK

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

    Баллы:
    66
    Имя в Minecraft:
    MrAlexeiMK
    Наверное, нужно импортировать?)
    Если ты в Intellij IDEA, тыкни alt + enter по красному и выбери import.
     
  5. Автор темы
    Serega87

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

    Баллы:
    61
    Пишет что нет таких методов.
     
  6. MrAlexeiMK

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

    Баллы:
    66
    Имя в Minecraft:
    MrAlexeiMK
    Сделай скриншот
     
  7. Автор темы
    Serega87

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

    Баллы:
    61
    Надеюсь я не упустил ни какой мелочи.
    4.jpg
     
    Последнее редактирование: 11 фев 2025
  8. MrAlexeiMK

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

    Баллы:
    66
    Имя в Minecraft:
    MrAlexeiMK
    Выбери Java новее (16 или 17, если нету - download jdk):
    upload_2025-2-11_17-28-20.png
    upload_2025-2-11_17-29-4.png

    Если у тебя в IDEA новая UI'шка, то сам разбирайся, где нужная настройка.
     
  9. Автор темы
    Serega87

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

    Баллы:
    61
    A ядро 1.12.2 будет с такой версией работать?
     
  10. MrAlexeiMK

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

    Баллы:
    66
    Имя в Minecraft:
    MrAlexeiMK
    Нет
     
  11. MrAlexeiMK

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

    Баллы:
    66
    Имя в Minecraft:
    MrAlexeiMK
    Код:
    @EventHandler
        public void onInventoryClick(PlayerInteractEvent event) {
            if (event.getClickedBlock() == null) {
                return;
            }
            if (event.getAction() != Action.LEFT_CLICK_BLOCK) {
                return;
            }
            // TODO: Проверить, что кликнута табличка.
            final Location clickedBlockLocation = event.getClickedBlock()
                                                       .getLocation();
            // Find all frames nearby to the clicked sign.
            final List<ItemFrame> nearbyFrames =
                clickedBlockLocation.getNearbyEntitiesByType(ItemFrame.class, 2)
                                    .stream()
                                    // Filter item frames that not attached to chest.
                                    // TODO: Все фильтры внизу требуют тестирования.
                                    .filter(frame -> frame.getLocation()
                                                          .getBlock()
                                                          .getRelative(frame.getAttachedFace())
                                                          .getType()
                                                          .equals(Material.CHEST))
                                    // Filter frames that not under the sign.
                                    .filter(frame -> frame.getLocation()
                                                          .getBlockY() == clickedBlockLocation.getBlockY() - 1)
                                    // Filter frames that not directly under the sign.
                                    // TODO: Можно сделать строже.
                                    .filter(frame -> frame.getLocation()
                                                          .getBlockX() == clickedBlockLocation.getBlockX()
                                        || frame.getLocation()
                                                .getBlockZ() == clickedBlockLocation.getBlockZ())
                                    .toList();
            if (nearbyFrames.isEmpty()) {
                // Frames not found.
                return;
            }
            if (nearbyFrames.size() > 1) {
                // TODO: Если эта ситуация достигнута, то фильтры выше недостаточно строги.
                //  Писать в WARN об этом и выбирать ближайший frame, либо ничего не делать.
                return;
            }
            final ItemFrame frame = nearbyFrames.get(0);
            // Если эта часть кода достигнута, то frame под табличкой найден (frame).
        }
     
  12. Автор темы
    Serega87

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

    Баллы:
    61
    У меня версия jdk 1.8
    Можно сказать что тоже самое как и выше. "Cannot resolve method 'getNearbyEntitiesByType' in 'Location'"
    5.jpg
     
    Последнее редактирование: 11 фев 2025
  13. MrAlexeiMK

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

    Баллы:
    66
    Имя в Minecraft:
    MrAlexeiMK
    https://helpch.at/docs/1.12.2/org/b...ies-org.bukkit.Location-double-double-double-

    Код:
    @EventHandler
        public void onInventoryClick(PlayerInteractEvent event) {
            if (event.getClickedBlock() == null) {
                return;
            }
            if (event.getAction() != Action.LEFT_CLICK_BLOCK) {
                return;
            }
            // TODO: Проверить, что кликнута табличка.
            final Location clickedBlockLocation = event.getClickedBlock()
                                                       .getLocation();
            // Find all frames nearby to the clicked sign.
            final List<ItemFrame> nearbyFrames =
                clickedBlockLocation.getWorld().getNearbyEntities(clickedBlockLocation, 2, 2, 2)
                                    .stream()
                                    .filter(entity -> entity instanceof ItemFrame)
                                    .map(entity -> (ItemFrame) entity)
                                    // Filter item frames that not attached to chest.
                                    // TODO: Все фильтры внизу требуют тестирования.
                                    .filter(frame -> frame.getLocation()
                                                          .getBlock()
                                                          .getRelative(frame.getAttachedFace())
                                                          .getType()
                                                          .equals(Material.CHEST))
                                    // Filter frames that not under the sign.
                                    .filter(frame -> frame.getLocation()
                                                          .getBlockY() == clickedBlockLocation.getBlockY() - 1)
                                    // Filter frames that not directly under the sign.
                                    // TODO: Можно сделать строже.
                                    .filter(frame -> frame.getLocation()
                                                          .getBlockX() == clickedBlockLocation.getBlockX()
                                        || frame.getLocation()
                                                .getBlockZ() == clickedBlockLocation.getBlockZ())
                                    .toList();
            if (nearbyFrames.isEmpty()) {
                // Frames not found.
                return;
            }
            if (nearbyFrames.size() > 1) {
                // TODO: Если эта ситуация достигнута, то фильтры выше недостаточно строги.
                //  Писать в WARN об этом и выбирать ближайший frame, либо ничего не делать.
                return;
            }
            final ItemFrame frame = nearbyFrames.get(0);
            // Если эта часть кода достигнута, то frame под табличкой найден (frame).
        }
     
  14. Автор темы
    Serega87

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

    Баллы:
    61
    По ошибкам эта единственная.
    5.jpg
     
    Последнее редактирование: 11 фев 2025
  15. MrAlexeiMK

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

    Баллы:
    66
    Имя в Minecraft:
    MrAlexeiMK
    Замени '.toList();' на '.collect(Collectors.toList());'
     
  16. Автор темы
    Serega87

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

    Баллы:
    61
    Все заработало. Большое СПАСИБО!)
     
Статус темы:
Закрыта.

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