diff --git a/build.gradle.kts b/build.gradle.kts index 7ad14c8..4a5d059 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -49,7 +49,7 @@ dependencies { implementation("io.papermc:paperlib:1.0.7") implementation("co.aikar:idb-core:1.0.0-SNAPSHOT") implementation("com.zaxxer:HikariCP:5.1.0") - implementation("com.github.retrooper.packetevents:spigot:2.2.0") + implementation("com.github.retrooper.packetevents:spigot:2.2.1") compileOnly("com.github.N0RSKA:DeluxeSellwandsAPI:32c") compileOnly("com.ghostchu:quickshop-api:5.2.0.8") compileOnly("com.google.guava:guava:33.0.0-jre") diff --git a/src/main/java/net/crashcraft/crashclaim/claimobjects/Claim.java b/src/main/java/net/crashcraft/crashclaim/claimobjects/Claim.java index 13db9bc..b16a062 100644 --- a/src/main/java/net/crashcraft/crashclaim/claimobjects/Claim.java +++ b/src/main/java/net/crashcraft/crashclaim/claimobjects/Claim.java @@ -137,12 +137,12 @@ public HashMap getContribution(){ } @Override - public synchronized boolean isToSave() { + public boolean isToSave() { return toSave; } @Override - public synchronized void setToSave(boolean toSave) { + public void setToSave(boolean toSave) { this.toSave = toSave; } diff --git a/src/main/java/net/crashcraft/crashclaim/commands/claiming/UnClaimCommand.java b/src/main/java/net/crashcraft/crashclaim/commands/claiming/UnClaimCommand.java index d8295d7..9bd0923 100644 --- a/src/main/java/net/crashcraft/crashclaim/commands/claiming/UnClaimCommand.java +++ b/src/main/java/net/crashcraft/crashclaim/commands/claiming/UnClaimCommand.java @@ -60,7 +60,7 @@ public void unClaim(Player player){ } } - CrashClaim.getPlugin().getDataManager().deleteClaim(claim); + CrashClaim.getPlugin().getDataManager().deleteClaimAsync(claim); VisualGroup group = visualizationManager.fetchVisualGroup(player, false); if (group != null){ group.removeAllVisuals(); @@ -102,7 +102,7 @@ public void unClaimAll(Player player){ } } - CrashClaim.getPlugin().getDataManager().deleteClaim(claim); + CrashClaim.getPlugin().getDataManager().deleteClaimAsync(claim); VisualGroup group = visualizationManager.fetchVisualGroup(player, false); if (group != null) { group.removeAllVisuals(); @@ -132,14 +132,14 @@ public void unClaimAll(Player player, @Flags("other") OfflinePlayer otherPlayer) for (Claim claim : claims) { // Admin Command no need for permission checks - CrashClaim.getPlugin().getDataManager().deleteClaim(claim); + CrashClaim.getPlugin().getDataManager().deleteClaimAsync(claim); VisualGroup group = visualizationManager.fetchVisualGroup(player, false); if (group != null) { group.removeAllVisuals(); } - if (otherPlayer.isOnline()){ - CrashClaim.getPlugin().getDataManager().deleteClaim(claim); + if (otherPlayer.isOnline()) { + CrashClaim.getPlugin().getDataManager().deleteClaimAsync(claim); VisualGroup group2 = visualizationManager.fetchVisualGroup(otherPlayer.getPlayer(), false); if (group2 != null) { group2.removeAllVisuals(); diff --git a/src/main/java/net/crashcraft/crashclaim/data/ClaimDataManager.java b/src/main/java/net/crashcraft/crashclaim/data/ClaimDataManager.java index 11c3461..8035a6f 100644 --- a/src/main/java/net/crashcraft/crashclaim/data/ClaimDataManager.java +++ b/src/main/java/net/crashcraft/crashclaim/data/ClaimDataManager.java @@ -393,7 +393,7 @@ private boolean addClaim(Claim claim){ //Should not be called from anywhere else return true; } - public synchronized void deleteClaim(Claim claim){ + public void deleteClaim(Claim claim){ if (claim.isDeleted()){ return; } @@ -425,15 +425,21 @@ public synchronized void deleteClaim(Claim claim){ } } - public synchronized void deleteSubClaimWithoutSave(SubClaim subClaim){ + public void deleteClaimAsync(Claim claim) { + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> deleteClaim(claim)); + } + + public void deleteSubClaimWithoutSave(SubClaim subClaim){ Claim parent = subClaim.getParent(); parent.removeSubClaim(subClaim.getId()); } - public synchronized void deleteSubClaim(SubClaim subClaim){ + public void deleteSubClaim(SubClaim subClaim){ Claim parent = subClaim.getParent(); parent.removeSubClaim(subClaim.getId()); - saveClaim(parent); + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + provider.removeSubClaim(subClaim); + }); } public void loadChunksForClaim(Claim claim){ @@ -563,7 +569,7 @@ public void preLoadChunk(UUID world, long seed){ } } - public synchronized void saveClaim(Claim claim){ + public void saveClaim(Claim claim){ if (claim.isDeleted()){ return; } diff --git a/src/main/java/net/crashcraft/crashclaim/data/providers/DataProvider.java b/src/main/java/net/crashcraft/crashclaim/data/providers/DataProvider.java index 77af873..df9cf49 100644 --- a/src/main/java/net/crashcraft/crashclaim/data/providers/DataProvider.java +++ b/src/main/java/net/crashcraft/crashclaim/data/providers/DataProvider.java @@ -25,6 +25,11 @@ public interface DataProvider extends Listener { */ void removeClaim(Claim claim); + /** + * Removes a subclaim and all data + **/ + void removeSubClaim(SubClaim claim); + /** * Loads a claim into memory from the datasource * @return A loaded claim object diff --git a/src/main/java/net/crashcraft/crashclaim/data/providers/sqlite/SQLiteDataProvider.java b/src/main/java/net/crashcraft/crashclaim/data/providers/sqlite/SQLiteDataProvider.java index cbf4c5f..7e33f23 100644 --- a/src/main/java/net/crashcraft/crashclaim/data/providers/sqlite/SQLiteDataProvider.java +++ b/src/main/java/net/crashcraft/crashclaim/data/providers/sqlite/SQLiteDataProvider.java @@ -28,12 +28,7 @@ import java.io.File; import java.sql.SQLException; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import java.util.*; public class SQLiteDataProvider implements DataProvider { private BiMap containerIDMap; @@ -241,39 +236,45 @@ public void saveClaim(Claim claim) { savePermissions(claimData_id, claim.getPerms()); //Sub Claim - for (SubClaim subClaim : claim.getSubClaims()) { - Integer subClaimData_id = DB.getFirstColumn("SELECT data FROM subclaims WHERE subclaims.id = ?", subClaim.getId()); - - if (subClaimData_id == null){ - subClaimData_id = -1; + Iterator iterator = new ArrayList<>(claim.getSubClaims()).iterator(); + iterator.forEachRemaining(subClaim -> { + try { + Integer subClaimData_id = DB.getFirstColumn("SELECT data FROM subclaims WHERE subclaims.id = ?", subClaim.getId()); + + if (subClaimData_id == null){ + subClaimData_id = -1; + } + + addClaimData( + subClaimData_id, + subClaim.getMinX(), + subClaim.getMinZ(), + subClaim.getMaxX(), + subClaim.getMaxZ(), + subClaim.getWorld(), + subClaim.getName(), + subClaim.getEntryMessage(), + subClaim.getExitMessage(), + DataType.SUB_CLAIM + ); + + DB.executeUpdate("INSERT OR IGNORE INTO subclaims(id, data, claim_id) VALUES (?, " + + "(SELECT id FROM claim_data WHERE minX = ? AND minZ = ? AND maxX = ? AND maxZ = ? AND world = (SELECT id FROM claimworlds WHERE uuid = ?))," + + "?)", + subClaim.getId(), + subClaim.getMinX(), subClaim.getMinZ(), subClaim.getMaxX(), subClaim.getMaxZ(), subClaim.getWorld().toString(), + subClaim.getParent().getId() + ); + + if (subClaimData_id == -1) { + subClaimData_id = DB.getFirstColumn("SELECT data FROM subclaims WHERE subclaims.id = ?", subClaim.getId()); + } + + savePermissions(subClaimData_id, subClaim.getPerms()); + } catch (SQLException e) { + throw new RuntimeException(e); } - - addClaimData( - subClaimData_id, - subClaim.getMinX(), - subClaim.getMinZ(), - subClaim.getMaxX(), - subClaim.getMaxZ(), - subClaim.getWorld(), - subClaim.getName(), - subClaim.getEntryMessage(), - subClaim.getExitMessage(), - DataType.SUB_CLAIM - ); - - DB.executeUpdate("INSERT OR IGNORE INTO subclaims(id, data, claim_id) VALUES (?, " + - "(SELECT id FROM claim_data WHERE minX = ? AND minZ = ? AND maxX = ? AND maxZ = ? AND world = (SELECT id FROM claimworlds WHERE uuid = ?))," + - "?)", - subClaim.getId(), - subClaim.getMinX(), subClaim.getMinZ(), subClaim.getMaxX(), subClaim.getMaxZ(), subClaim.getWorld().toString(), - subClaim.getParent().getId() - ); - - if (subClaimData_id == -1) { - subClaimData_id = DB.getFirstColumn("SELECT data FROM subclaims WHERE subclaims.id = ?", subClaim.getId()); - } - savePermissions(subClaimData_id, subClaim.getPerms()); - } + }); //Fetch and delete outdated subClaims List list = DB.getFirstColumnResults("SELECT id FROM subclaims WHERE claim_id = ?", claim.getId()); @@ -376,13 +377,23 @@ private void addContainers(int data_id, int player_id, HashMap { if (aBoolean) { if (helper.hasPermission(claim, getPlayer().getUniqueId(), PermissionRoute.MODIFY_PERMISSIONS)) { - CrashClaim.getPlugin().getDataManager().deleteClaim(claim); + CrashClaim.getPlugin().getDataManager().deleteClaimAsync(claim); } else { player.spigot().sendMessage(Localization.MENU__GENERAL__INSUFFICIENT_PERMISSION.getMessage(player)); }