Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import net.coreprotect.CoreProtect;
- import net.coreprotect.CoreProtectAPI;
- import net.coreprotect.database.Database;
- import net.coreprotect.utility.Util;
- import org.bukkit.block.Block;
- import org.bukkit.plugin.Plugin;
- import javax.annotation.Nonnull;
- import java.sql.Connection;
- import java.sql.ResultSet;
- import java.sql.Statement;
- // Author: Dymeth.Ru
- public class CoreProtectUtils {
- private static final int PAGE_RECORDS_AMOUNT = 10;
- public CoreProtectUtils(@Nonnull Plugin plugin) {
- Plugin cpPlugin = plugin.getServer().getPluginManager().getPlugin("CoreProtect");
- if (!(cpPlugin instanceof CoreProtect cp)) {
- throw new IllegalStateException("CoreProtect не обнаружен");
- }
- CoreProtectAPI coreProtect = cp.getAPI();
- if (!coreProtect.isEnabled()) {
- throw new IllegalStateException("CoreProtect не включён");
- }
- if (coreProtect.APIVersion() < 9) {
- throw new IllegalStateException("CoreProtect имеет неподдерживаемую версию: " + coreProtect.APIVersion()
- + ". Требуется минимум 9");
- }
- }
- /**
- * @return false, если сгенерирован натурально, true, если был изменён (сломан или поставлен)
- */
- public boolean isBlockModified(@Nonnull Block block) {
- // Не используется CoreProtectAPI.blockLookup(block, 0), поскольку:
- // 1) Делает выборку абсолютно всех изменений (даже если их 100К+)
- // 2) Возвращает много ненужной информации
- // 3) Возвращает всё в виде строк, которые необходимо парсить
- // Текущей реализацией удалось сократить время исполнения метода с 200-300 мс до 0-1 мс
- String sql = "SELECT action,rolled_back"
- + " FROM " + "co_block"
- + " INDEXED BY block_index"
- + " WHERE wid = '" + Util.getWorldId(block.getWorld().getName()) + "'"
- + " AND x = '" + block.getX() + "'"
- + " AND z = '" + block.getZ() + "'"
- + " AND y = '" + block.getY() + "'";
- try (Connection connection = Database.getConnection(true, 1000)) {
- if (connection == null) throw new IllegalStateException("Connection not initialized");
- int page = 0;
- int limit = PAGE_RECORDS_AMOUNT;
- int offset;
- while (true) {
- int rows = 0;
- Statement statement = connection.createStatement();
- offset = page * PAGE_RECORDS_AMOUNT;
- ResultSet results = statement.executeQuery(sql + " LIMIT " + offset + "," + limit);
- while (results.next()) {
- rows++;
- int rolledBack = Integer.parseInt(results.getString("rolled_back"));
- if (rolledBack == 1 || rolledBack == 3) continue; // reverted
- int actionId = Integer.parseInt(results.getString("action"));
- if (actionId == 0 || actionId == 1) return true; // break or place
- }
- results.close();
- statement.close();
- if (rows < limit) {
- return false;
- } else {
- page++;
- }
- }
- } catch (Exception e) {
- throw new IllegalStateException("Unknown exception while checking if block modified", e);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment