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

Помогите Не выполняется метод после проверки, вызванной ивентом.

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    Ryazha_
    Код:
    @EventHandler
        public void onInventoryOpen(InventoryOpenEvent event) {
            if (event.getInventory().getHolder() instanceof Block) {
                Block clickedBlock = (Block) event.getInventory().getHolder();
    
                if (clickedBlock.getType() == Material.ENDER_CHEST || clickedBlock.getType() == Material.CHEST) {
                    Location chestLocation = clickedBlock.getLocation();
                    event.setCancelled(true);
    
                    checkCases(chestLocation, (Player) event.getPlayer());
                }
            }
        }
    
        private static final double COORDINATE_TOLERANCE = 0.85; // Погрешность для сравнения координат
    
        private void checkCases(Location chestLocation, Player player) {
            try {
                File pluginFolder = plugin.getDataFolder();
                File[] files = pluginFolder.listFiles();
    
                if (files != null) {
                    for (File file : files) {
                        if (file.isFile() && file.getName().endsWith(".db")) {
                            String dbName = file.getName();
                            String[] parts = dbName.split("\\.");
                            String caseName = parts[0]; // Имя кейса из имени файла
    
                            try (Connection connection = DriverManager.getConnection("jdbc:sqlite:" + plugin.getDataFolder() + "/" + dbName);
                                 Statement statement = connection.createStatement()) {
    
                                ResultSet resultSet = statement.executeQuery("SELECT * FROM cases WHERE x=? AND y=? AND z=?");
                                while (resultSet.next()) {
                                    double x = resultSet.getDouble("x");
                                    double y = resultSet.getDouble("y");
                                    double z = resultSet.getDouble("z");
    
                                    if (isLocationWithinTolerance(chestLocation, x, y, z)) {
                                        String caseType = resultSet.getString("type");
                                        animateCase(caseName, caseType, player);
                                        return;
                                    }
                                }
                            }
                        }
                    }
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
        private boolean isLocationWithinTolerance(Location location, double x, double y, double z) {
            return Math.abs(location.getX() - x) < COORDINATE_TOLERANCE &&
                    Math.abs(location.getY() - y) < COORDINATE_TOLERANCE &&
                    Math.abs(location.getZ() - z) < COORDINATE_TOLERANCE;
        }
    По окончанию проверки должны появляться партиклы и т.д. вокруг сундука, если всё верно.
    Вот код класса, проверки, вроде, все правильные, ошибок в консоли нет.
     
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    При помощи отладки в IDE или путём вывода сообщений в консоль/чат выясни, какое условие не выполняется, и всё сразу станет понятно.

    Сходу могу предположить, что косяк в первой же проверке в событии, поскольку Block не является InventoryHolder'ом. Для этого есть отдельный интерфейс BlockInventoryHolder.

    И не рекомендую делать запросы к БД в основном потоке
     

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