Guest User

CoreProtectUtils.java

a guest
Oct 16th, 2022
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.68 KB | None | 0 0
  1. import net.coreprotect.CoreProtect;
  2. import net.coreprotect.CoreProtectAPI;
  3. import net.coreprotect.database.Database;
  4. import net.coreprotect.utility.Util;
  5. import org.bukkit.block.Block;
  6. import org.bukkit.plugin.Plugin;
  7.  
  8. import javax.annotation.Nonnull;
  9. import java.sql.Connection;
  10. import java.sql.ResultSet;
  11. import java.sql.Statement;
  12.  
  13. // Author: Dymeth.Ru
  14. public class CoreProtectUtils {
  15.     private static final int PAGE_RECORDS_AMOUNT = 10;
  16.  
  17.     public CoreProtectUtils(@Nonnull Plugin plugin) {
  18.         Plugin cpPlugin = plugin.getServer().getPluginManager().getPlugin("CoreProtect");
  19.         if (!(cpPlugin instanceof CoreProtect cp)) {
  20.             throw new IllegalStateException("CoreProtect не обнаружен");
  21.         }
  22.         CoreProtectAPI coreProtect = cp.getAPI();
  23.         if (!coreProtect.isEnabled()) {
  24.             throw new IllegalStateException("CoreProtect не включён");
  25.         }
  26.         if (coreProtect.APIVersion() < 9) {
  27.             throw new IllegalStateException("CoreProtect имеет неподдерживаемую версию: " + coreProtect.APIVersion()
  28.                 + ". Требуется минимум 9");
  29.         }
  30.     }
  31.  
  32.     /**
  33.      * @return false, если сгенерирован натурально, true, если был изменён (сломан или поставлен)
  34.      */
  35.     public boolean isBlockModified(@Nonnull Block block) {
  36.         // Не используется CoreProtectAPI.blockLookup(block, 0), поскольку:
  37.         // 1) Делает выборку абсолютно всех изменений (даже если их 100К+)
  38.         // 2) Возвращает много ненужной информации
  39.         // 3) Возвращает всё в виде строк, которые необходимо парсить
  40.         // Текущей реализацией удалось сократить время исполнения метода с 200-300 мс до 0-1 мс
  41.  
  42.         String sql = "SELECT action,rolled_back"
  43.             + " FROM " + "co_block"
  44.             + " INDEXED BY block_index"
  45.             + " WHERE wid = '" + Util.getWorldId(block.getWorld().getName()) + "'"
  46.             + " AND x = '" + block.getX() + "'"
  47.             + " AND z = '" + block.getZ() + "'"
  48.             + " AND y = '" + block.getY() + "'";
  49.  
  50.         try (Connection connection = Database.getConnection(true, 1000)) {
  51.             if (connection == null) throw new IllegalStateException("Connection not initialized");
  52.             int page = 0;
  53.             int limit = PAGE_RECORDS_AMOUNT;
  54.             int offset;
  55.             while (true) {
  56.                 int rows = 0;
  57.                 Statement statement = connection.createStatement();
  58.                 offset = page * PAGE_RECORDS_AMOUNT;
  59.                 ResultSet results = statement.executeQuery(sql + " LIMIT " + offset + "," + limit);
  60.                 while (results.next()) {
  61.                     rows++;
  62.                     int rolledBack = Integer.parseInt(results.getString("rolled_back"));
  63.                     if (rolledBack == 1 || rolledBack == 3) continue; // reverted
  64.                     int actionId = Integer.parseInt(results.getString("action"));
  65.                     if (actionId == 0 || actionId == 1) return true; // break or place
  66.                 }
  67.                 results.close();
  68.                 statement.close();
  69.                 if (rows < limit) {
  70.                     return false;
  71.                 } else {
  72.                     page++;
  73.                 }
  74.             }
  75.         } catch (Exception e) {
  76.             throw new IllegalStateException("Unknown exception while checking if block modified", e);
  77.         }
  78.     }
  79. }
  80.  
Advertisement
Add Comment
Please, Sign In to add comment