Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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;
    }

По окончанию проверки должны появляться партиклы и т.д. вокруг сундука, если всё верно.
Вот код класса, проверки, вроде, все правильные, ошибок в консоли нет.
 
При помощи отладки в IDE или путём вывода сообщений в консоль/чат выясни, какое условие не выполняется, и всё сразу станет понятно.

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

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

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

Назад
Верх