diff --git a/build.gradle b/build.gradle index da073189..d5d49141 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,9 @@ import org.apache.tools.ant.filters.ReplaceTokens plugins { - id 'com.gradleup.shadow' version '9.0.0-beta17' - id 'org.cadixdev.licenser' version '0.6.1' apply false - id 'dev.architectury.loom' version '1.9-SNAPSHOT' apply false + id 'com.gradleup.shadow' version '9.4.1' + id 'dev.yumi.gradle.licenser' version '3.0.1' apply false + id 'dev.architectury.loom' version '1.14.+' apply false id 'gg.essential.multi-version.root' apply false id 'org.ajoberstar.grgit' version '5.3.2' id 'maven-publish' @@ -13,7 +13,7 @@ plugins { group 'net.william278' version "$ext.plugin_version${versionMetadata()}" description "$ext.plugin_description" -defaultTasks 'licenseFormat', 'build' +defaultTasks 'applyLicenses', 'build' ext { set 'version', version.toString() @@ -63,16 +63,15 @@ allprojects { } apply plugin: 'com.gradleup.shadow' - apply plugin: 'org.cadixdev.licenser' + apply plugin: 'dev.yumi.gradle.licenser' apply plugin: 'java' compileJava.options.encoding = 'UTF-8' - compileJava.options.release.set 17 + compileJava.options.release.set 21 javadoc.options.encoding = 'UTF-8' javadoc.options.addStringOption('Xdoclint:none', '-quiet') repositories { - mavenLocal() mavenCentral() maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' } maven { url 'https://repo.papermc.io/repository/maven-public/' } @@ -96,9 +95,8 @@ allprojects { } license { - header = rootProject.file('HEADER') - include '**/*.java' - newLine = true + rule(rootProject.file('HEADER')) + include('**/*.java') } test { @@ -127,7 +125,7 @@ subprojects { } else { name += "-${project.name.capitalize()}" } - archivesBaseName = name + base.archivesName = name // Fabric-specific configuration if (project.parent?.name?.equals('fabric')) { diff --git a/bukkit/src/main/java/net/william278/huskclaims/BukkitHuskClaims.java b/bukkit/src/main/java/net/william278/huskclaims/BukkitHuskClaims.java index d2ae0c5c..490366a3 100644 --- a/bukkit/src/main/java/net/william278/huskclaims/BukkitHuskClaims.java +++ b/bukkit/src/main/java/net/william278/huskclaims/BukkitHuskClaims.java @@ -152,7 +152,7 @@ public void loadMetrics() { try { final Metrics metrics = new Metrics(this, BSTATS_PLUGIN_ID); metrics.addCustomChart(new SimplePie("is_cross_server", - () -> settings.getCrossServer().isEnabled() ? "true" : "false") + () -> Boolean.toString(settings.getCrossServer().isEnabled())) ); metrics.addCustomChart(new SimplePie("language", () -> settings.getLanguage().toLowerCase(Locale.ENGLISH)) diff --git a/bukkit/src/main/java/net/william278/huskclaims/command/BukkitCommand.java b/bukkit/src/main/java/net/william278/huskclaims/command/BukkitCommand.java index 3d5b791e..832f2ace 100644 --- a/bukkit/src/main/java/net/william278/huskclaims/command/BukkitCommand.java +++ b/bukkit/src/main/java/net/william278/huskclaims/command/BukkitCommand.java @@ -121,4 +121,4 @@ protected static PermissionDefault getPermissionDefault(boolean isOperatorComman return isOperatorCommand ? PermissionDefault.OP : PermissionDefault.TRUE; } -} \ No newline at end of file +} diff --git a/bukkit/src/main/java/net/william278/huskclaims/event/BukkitEvent.java b/bukkit/src/main/java/net/william278/huskclaims/event/BukkitEvent.java index e7b49059..0862b9ad 100644 --- a/bukkit/src/main/java/net/william278/huskclaims/event/BukkitEvent.java +++ b/bukkit/src/main/java/net/william278/huskclaims/event/BukkitEvent.java @@ -50,4 +50,4 @@ public HuskClaims getPlugin() { return plugin; } -} \ No newline at end of file +} diff --git a/bukkit/src/main/java/net/william278/huskclaims/hook/BukkitGriefPreventionImporter.java b/bukkit/src/main/java/net/william278/huskclaims/hook/BukkitGriefPreventionImporter.java index c252b44a..7d759a34 100644 --- a/bukkit/src/main/java/net/william278/huskclaims/hook/BukkitGriefPreventionImporter.java +++ b/bukkit/src/main/java/net/william278/huskclaims/hook/BukkitGriefPreventionImporter.java @@ -261,7 +261,6 @@ SELECT COUNT(*) return 0; } - private int getTotalClaims() { try (Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement(""" diff --git a/bukkit/src/main/java/net/william278/huskclaims/hook/BukkitPlaceholderAPIHook.java b/bukkit/src/main/java/net/william278/huskclaims/hook/BukkitPlaceholderAPIHook.java index 5a318cce..fd07f2c3 100644 --- a/bukkit/src/main/java/net/william278/huskclaims/hook/BukkitPlaceholderAPIHook.java +++ b/bukkit/src/main/java/net/william278/huskclaims/hook/BukkitPlaceholderAPIHook.java @@ -35,7 +35,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.text.DecimalFormat; import java.util.Arrays; import java.util.List; import java.util.Locale; diff --git a/bukkit/src/main/java/net/william278/huskclaims/util/BukkitTask.java b/bukkit/src/main/java/net/william278/huskclaims/util/BukkitTask.java index 2b41fa22..6223a92c 100644 --- a/bukkit/src/main/java/net/william278/huskclaims/util/BukkitTask.java +++ b/bukkit/src/main/java/net/william278/huskclaims/util/BukkitTask.java @@ -168,14 +168,12 @@ public void run() { final GracefulScheduling scheduler = getScheduler(); - if (e instanceof Entity entity) { - scheduled = scheduler.entitySpecificScheduler(entity).run(runnable, null); - } else if (e instanceof Location location) { - scheduled = scheduler.regionSpecificScheduler(location).run(runnable); - } else if (e instanceof Chunk chunk) { - scheduled = scheduler.regionSpecificScheduler(chunk.getWorld(), chunk.getX(), chunk.getZ()).run(runnable); - } else { - scheduled = scheduler.globalRegionalScheduler().run(runnable); + switch (e) { + case Entity entity -> scheduled = scheduler.entitySpecificScheduler(entity).run(runnable, null); + case Location location -> scheduled = scheduler.regionSpecificScheduler(location).run(runnable); + case Chunk chunk -> + scheduled = scheduler.regionSpecificScheduler(chunk.getWorld(), chunk.getX(), chunk.getZ()).run(runnable); + case null, default -> scheduled = scheduler.globalRegionalScheduler().run(runnable); } } diff --git a/common/src/main/java/net/william278/huskclaims/claim/Claim.java b/common/src/main/java/net/william278/huskclaims/claim/Claim.java index 83bf0093..a0fd8745 100644 --- a/common/src/main/java/net/william278/huskclaims/claim/Claim.java +++ b/common/src/main/java/net/william278/huskclaims/claim/Claim.java @@ -325,17 +325,16 @@ public void setTagTrustLevel(@NotNull TrustTag tag, @NotNull TrustLevel level) { * @since 1.0 */ public void setTrustLevel(@NotNull Trustable trustable, @NotNull TrustLevel level) { - if (trustable instanceof User user) { - setUserTrustLevel(user.getUuid(), level); - } else if (trustable instanceof UserGroup group) { - if (isAdminClaim()) { - throw new IllegalArgumentException("Cannot set group trust level in admin claim"); + switch (trustable) { + case User user -> setUserTrustLevel(user.getUuid(), level); + case UserGroup group -> { + if (isAdminClaim()) { + throw new IllegalArgumentException("Cannot set group trust level in admin claim"); + } + setGroupTrustLevel(group, level); } - setGroupTrustLevel(group, level); - } else if (trustable instanceof TrustTag tag) { - setTagTrustLevel(tag, level); - } else { - throw new IllegalArgumentException("Trustable must be a User, UserGroup, or TrustTag"); + case TrustTag tag -> setTagTrustLevel(tag, level); + default -> throw new IllegalArgumentException("Trustable must be a User, UserGroup, or TrustTag"); } } @@ -347,15 +346,14 @@ public void setTrustLevel(@NotNull Trustable trustable, @NotNull TrustLevel leve * @since 1.0 */ public void removeTrustLevel(@NotNull Trustable trustable, @NotNull ClaimWorld world) { - if (trustable instanceof User user) { - trustedUsers.remove(user.getUuid()); - world.cacheUser(user); - } else if (trustable instanceof UserGroup group) { - trustedGroups.remove(group.name()); - } else if (trustable instanceof TrustTag tag) { - trustedTags.remove(tag.getName()); - } else { - throw new IllegalArgumentException("Trustable must be a User, UserGroup, or TrustTag"); + switch (trustable) { + case User user -> { + trustedUsers.remove(user.getUuid()); + world.cacheUser(user); + } + case UserGroup group -> trustedGroups.remove(group.name()); + case TrustTag tag -> trustedTags.remove(tag.getName()); + default -> throw new IllegalArgumentException("Trustable must be a User, UserGroup, or TrustTag"); } } @@ -441,14 +439,12 @@ public Optional getUserTrustLevel(@NotNull User user, @NotNull HuskC * @since 1.0 */ public Optional getTrustLevel(@NotNull Trustable trustable, @NotNull HuskClaims plugin) { - if (trustable instanceof User user) { - return getUserTrustLevel(user, plugin); - } else if (trustable instanceof UserGroup group) { - return getGroupTrustLevel(group.name(), plugin); - } else if (trustable instanceof TrustTag tag) { - return getTagTrustLevel(tag.getName(), plugin); - } - throw new IllegalArgumentException("Trustable must be a User, UserGroup, or TrustedTag"); + return switch (trustable) { + case User user -> getUserTrustLevel(user, plugin); + case UserGroup group -> getGroupTrustLevel(group.name(), plugin); + case TrustTag tag -> getTagTrustLevel(tag.getName(), plugin); + default -> throw new IllegalArgumentException("Trustable must be a User, UserGroup, or TrustedTag"); + }; } /** diff --git a/common/src/main/java/net/william278/huskclaims/claim/ClaimEditor.java b/common/src/main/java/net/william278/huskclaims/claim/ClaimEditor.java index d5206eb1..12cc8a6c 100644 --- a/common/src/main/java/net/william278/huskclaims/claim/ClaimEditor.java +++ b/common/src/main/java/net/william278/huskclaims/claim/ClaimEditor.java @@ -263,6 +263,20 @@ default void userTransferClaim(@NotNull OnlineUser user, @NotNull Claim claim, return; } + // Validate the new owner has enough available claim blocks to receive the claim. + // Without this check, /transferclaim + /unclaim can be used to generate free blocks: + // the original owner is refunded on transfer, but if the new owner's available + // balance is never debited, unclaiming gives them a refund for blocks they + // never paid for. See claim block accounting in ClaimBlocksManager#editClaimBlocks. + final long surfaceArea = claim.getRegion().getSurfaceArea(); + final long newOwnerAvailable = getPlugin().getClaimBlocks(newOwner.getUuid()); + if (newOwnerAvailable < surfaceArea) { + getPlugin().getLocales().getLocale("error_not_enough_claim_blocks", + Long.toString(surfaceArea - newOwnerAvailable)) + .ifPresent(user::sendMessage); + return; + } + // Transfer claim getPlugin().fireTransferClaimEvent(user, claim, claimWorld, newOwner, (event) -> { // Cache user, send message, invalidate source user/admin claim list cache @@ -272,7 +286,6 @@ default void userTransferClaim(@NotNull OnlineUser user, @NotNull Claim claim, getPlugin().invalidateClaimListCache(claim.getOwner().orElse(null)); // Adjust claim blocks for both users to maintain proper accounting - final long surfaceArea = claim.getRegion().getSurfaceArea(); claim.getOwner().flatMap(claimWorld::getUser).ifPresent(originalOwner -> { // Return available blocks to original owner and reduce their spent blocks getPlugin().editClaimBlocks( @@ -280,8 +293,11 @@ default void userTransferClaim(@NotNull OnlineUser user, @NotNull Claim claim, getPlugin().editSpentClaimBlocks( originalOwner, ClaimBlocksManager.ClaimBlockSource.CLAIM_TRANSFER_AWAY, (blocks) -> blocks - surfaceArea); }); - // Set the new owner's spent blocks so unclaim accounting works correctly + // Debit the new owner's available blocks and increase their spent counter + // so unclaim accounting works correctly and no blocks are duplicated. claimWorld.getUser(newOwner.getUuid()).ifPresent(owner -> { + getPlugin().editClaimBlocks( + owner, ClaimBlocksManager.ClaimBlockSource.CLAIM_CREATED, (blocks) -> blocks - surfaceArea); getPlugin().editSpentClaimBlocks( owner, ClaimBlocksManager.ClaimBlockSource.CLAIM_CREATED, (blocks) -> blocks + surfaceArea); }); diff --git a/common/src/main/java/net/william278/huskclaims/claim/ClaimManager.java b/common/src/main/java/net/william278/huskclaims/claim/ClaimManager.java index 055fb12f..3d78f5c3 100644 --- a/common/src/main/java/net/william278/huskclaims/claim/ClaimManager.java +++ b/common/src/main/java/net/william278/huskclaims/claim/ClaimManager.java @@ -217,7 +217,9 @@ default void deleteClaim(@NotNull ClaimWorld claimWorld, @NotNull Claim claim) { getPlugin().runQueued(() -> getPlugin().getDatabase().updateClaimWorld(claimWorld)); // Adjust the owner's claim block count - claim.getOwner().flatMap(claimWorld::getUser).ifPresent(user -> { + claim.getOwner().ifPresent(ownerUuid -> { + final User user = claimWorld.getUser(ownerUuid) + .orElseGet(() -> User.of(ownerUuid, ownerUuid.toString())); getPlugin().editClaimBlocks( user, ClaimBlocksManager.ClaimBlockSource.CLAIM_DELETED, (blocks -> blocks + surfaceArea)); getPlugin().editSpentClaimBlocks( diff --git a/common/src/main/java/net/william278/huskclaims/command/BuyClaimBlocksCommand.java b/common/src/main/java/net/william278/huskclaims/command/BuyClaimBlocksCommand.java index 755b5666..0f29e044 100644 --- a/common/src/main/java/net/william278/huskclaims/command/BuyClaimBlocksCommand.java +++ b/common/src/main/java/net/william278/huskclaims/command/BuyClaimBlocksCommand.java @@ -77,5 +77,4 @@ private double getBlockPrice(long amount) { return amount * Math.max(0.0, plugin.getSettings().getHooks().getEconomy().getCostPerBlock()); } - } diff --git a/common/src/main/java/net/william278/huskclaims/command/ClaimFlagsCommand.java b/common/src/main/java/net/william278/huskclaims/command/ClaimFlagsCommand.java index 095412db..4f135d4e 100644 --- a/common/src/main/java/net/william278/huskclaims/command/ClaimFlagsCommand.java +++ b/common/src/main/java/net/william278/huskclaims/command/ClaimFlagsCommand.java @@ -95,7 +95,7 @@ private void handleFlagsCommand(@NotNull OnlineUser executor, @NotNull String ac private void handleSetClaimFlag(@NotNull OnlineUser onlineUser, @Nullable Claim claim, @NotNull ClaimWorld world, @NotNull String[] args) { - final Optional operationType = parseOperationTypeArg(args, 0); + final Optional operationType = parseOperationTypeArg(args); if (operationType.isEmpty()) { plugin.getLocales().getLocale("error_invalid_syntax", getUsage()) .ifPresent(onlineUser::sendMessage); @@ -122,7 +122,7 @@ private void handleSetClaimFlag(@NotNull OnlineUser onlineUser, @Nullable Claim } plugin.getDatabase().updateClaimWorld(world); - // Send flag list on correct page to indicated the update + // Send flag list on correct page to indicate the update final double changedIndex = plugin.getOperationListener() .getRegisteredOperationTypes().stream() .filter(op -> canManageFlag(onlineUser, op)).toList().indexOf(type); diff --git a/common/src/main/java/net/william278/huskclaims/command/Executable.java b/common/src/main/java/net/william278/huskclaims/command/Executable.java index 103c06f9..e85162c6 100644 --- a/common/src/main/java/net/william278/huskclaims/command/Executable.java +++ b/common/src/main/java/net/william278/huskclaims/command/Executable.java @@ -26,4 +26,4 @@ public interface Executable { void onExecuted(@NotNull CommandUser executor, @NotNull String[] args); -} \ No newline at end of file +} diff --git a/common/src/main/java/net/william278/huskclaims/command/Node.java b/common/src/main/java/net/william278/huskclaims/command/Node.java index 7b54d2e4..40b7045e 100644 --- a/common/src/main/java/net/william278/huskclaims/command/Node.java +++ b/common/src/main/java/net/william278/huskclaims/command/Node.java @@ -74,7 +74,7 @@ public String getName() { if (aliases.isEmpty()) { throw new IllegalStateException("Primary alias of command node is blank"); } - return aliases.get(0); + return aliases.getFirst(); } protected Optional resolveUser(@NotNull CommandUser executor, @NotNull String[] args) { @@ -150,8 +150,8 @@ protected Optional parsePositionArgs(@NotNull String[] args, int index return Optional.empty(); } - protected Optional parseOperationTypeArg(@NotNull String[] args, int index) { - return parseStringArg(args, index).flatMap(arg -> plugin.getOperationListener().getOperationType(arg)); + protected Optional parseOperationTypeArg(@NotNull String[] args) { + return parseStringArg(args, 0).flatMap(arg -> plugin.getOperationListener().getOperationType(arg)); } protected Optional parseClaimBlocksArg(@NotNull String[] args, int index) { diff --git a/common/src/main/java/net/william278/huskclaims/command/TrustListCommand.java b/common/src/main/java/net/william278/huskclaims/command/TrustListCommand.java index 6f711f0c..3bc8e7fc 100644 --- a/common/src/main/java/net/william278/huskclaims/command/TrustListCommand.java +++ b/common/src/main/java/net/william278/huskclaims/command/TrustListCommand.java @@ -74,7 +74,7 @@ private String getClaimHeaderDetails(@NotNull Claim claim, @NotNull ClaimWorld w Integer.toString(claim.getRegion().getLongestEdge()), Integer.toString(claim.getRegion().getShortestEdge()), Integer.toString(claim.getChildren().size()), - Integer.toString(claim.getTrustedUsers().keySet().size()), + Integer.toString(claim.getTrustedUsers().size()), claim.getCreationTime().map(t -> t.format(DateTimeFormatter.ISO_LOCAL_DATE)).orElse(na) ).orElse(ownerName); } @@ -88,7 +88,7 @@ private String getChildClaimHeaderDetails(@NotNull Claim claim, @NotNull ClaimWo Long.toString(claim.getRegion().getSurfaceArea()), Integer.toString(claim.getRegion().getLongestEdge()), Integer.toString(claim.getRegion().getShortestEdge()), - Integer.toString(claim.getTrustedUsers().keySet().size()), + Integer.toString(claim.getTrustedUsers().size()), plugin.getLocales().getRawLocale(String.format("child_claims_inherit_%srestricted", claim.isInheritParent() ? "un" : "")).orElse(Boolean.toString(claim.isInheritParent())), claim.getCreationTime().map(t -> t.format(DateTimeFormatter.ISO_LOCAL_DATE)).orElse(na) diff --git a/common/src/main/java/net/william278/huskclaims/command/TrustableTabCompletable.java b/common/src/main/java/net/william278/huskclaims/command/TrustableTabCompletable.java index d21a66d4..b899d68b 100644 --- a/common/src/main/java/net/william278/huskclaims/command/TrustableTabCompletable.java +++ b/common/src/main/java/net/william278/huskclaims/command/TrustableTabCompletable.java @@ -60,5 +60,4 @@ default List suggest(@NotNull CommandUser user, @NotNull String[] args) @Nullable UUID getGroupOwner(@NotNull OnlineUser user); - } diff --git a/common/src/main/java/net/william278/huskclaims/command/UnlockDropsCommand.java b/common/src/main/java/net/william278/huskclaims/command/UnlockDropsCommand.java index c3d25f2b..b8afeffb 100644 --- a/common/src/main/java/net/william278/huskclaims/command/UnlockDropsCommand.java +++ b/common/src/main/java/net/william278/huskclaims/command/UnlockDropsCommand.java @@ -56,5 +56,4 @@ public void execute(@NotNull CommandUser executor, @NotNull String[] args) { }); } - } diff --git a/common/src/main/java/net/william278/huskclaims/config/Locales.java b/common/src/main/java/net/william278/huskclaims/config/Locales.java index c02af21e..d45343fb 100644 --- a/common/src/main/java/net/william278/huskclaims/config/Locales.java +++ b/common/src/main/java/net/william278/huskclaims/config/Locales.java @@ -62,7 +62,7 @@ public class Locales implements PaginatedListProvider { protected static final String DEFAULT_LOCALE = "en-gb"; - // The raw set of locales loaded from yaml + // The raw set of locales loaded from YAML Map locales = Maps.newTreeMap(); /** diff --git a/common/src/main/java/net/william278/huskclaims/config/Settings.java b/common/src/main/java/net/william278/huskclaims/config/Settings.java index a7ca0f1c..3eb2f879 100644 --- a/common/src/main/java/net/william278/huskclaims/config/Settings.java +++ b/common/src/main/java/net/william278/huskclaims/config/Settings.java @@ -165,7 +165,6 @@ public static class SentinelSettings { } } - @Comment("Claim flags & world settings") private ClaimSettings claims = new ClaimSettings(); @@ -600,7 +599,6 @@ public static class HuskTownsHookSettings { private boolean enabled = true; } - private EconomyHookSettings economy = new EconomyHookSettings(); @Getter @@ -645,7 +643,6 @@ public static class GeyserSettings { private boolean enabled = true; } - private MapHookSettings map = new MapHookSettings(); @Getter diff --git a/common/src/main/java/net/william278/huskclaims/config/TrustLevels.java b/common/src/main/java/net/william278/huskclaims/config/TrustLevels.java index 9eca075c..930f88b8 100644 --- a/common/src/main/java/net/william278/huskclaims/config/TrustLevels.java +++ b/common/src/main/java/net/william278/huskclaims/config/TrustLevels.java @@ -49,7 +49,7 @@ public class TrustLevels { """; private List trustLevels = Lists.newArrayList( - // Permission trust (manage trustees, make sub-divisions, etc.) + // Permission trust (manage trustees, make subdivisions, etc.) TrustLevel.builder() .id("manage") .weight(400) diff --git a/common/src/main/java/net/william278/huskclaims/database/Database.java b/common/src/main/java/net/william278/huskclaims/database/Database.java index cb50c9b3..0d67f599 100644 --- a/common/src/main/java/net/william278/huskclaims/database/Database.java +++ b/common/src/main/java/net/william278/huskclaims/database/Database.java @@ -472,7 +472,7 @@ public static List getOrderedMigrations() { } public static int getLatestVersion() { - return getOrderedMigrations().get(getOrderedMigrations().size() - 1).getVersion(); + return getOrderedMigrations().getLast().getVersion(); } } diff --git a/common/src/main/java/net/william278/huskclaims/database/MongoDbDatabase.java b/common/src/main/java/net/william278/huskclaims/database/MongoDbDatabase.java index c0fe8af6..ea885739 100644 --- a/common/src/main/java/net/william278/huskclaims/database/MongoDbDatabase.java +++ b/common/src/main/java/net/william278/huskclaims/database/MongoDbDatabase.java @@ -22,7 +22,6 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import com.google.gson.JsonSyntaxException; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; @@ -110,7 +109,7 @@ private String buildConnectionString(@NotNull Settings.DatabaseSettings.Database } @Override - protected void executeScript(@NotNull Connection connection, @NotNull String name) throws SQLException { + protected void executeScript(@NotNull Connection connection, @NotNull String name) { throw new UnsupportedOperationException("MongoDB does not use SQL scripts"); } @@ -193,22 +192,16 @@ protected void performMongoMigration(@NotNull Migration migration) { metadataCollection.insertOne(new Document("schema_version", 0)); } } - case REMOVE_HOURS_PLAYED_COLUMN -> { - userCollection.updateMany( - new Document(), - new Document("$unset", new Document("hours_played", "")) - ); - } - case ADD_SPENT_CLAIM_BLOCKS_COLUMN -> { - userCollection.updateMany( - Filters.exists("spent_claim_blocks", false), - Updates.set("spent_claim_blocks", 0L) - ); - } - default -> { - throw new UnsupportedOperationException("MongoDB migration " + migration.name() - + " is not implemented in performMongoMigration"); - } + case REMOVE_HOURS_PLAYED_COLUMN -> userCollection.updateMany( + new Document(), + new Document("$unset", new Document("hours_played", "")) + ); + case ADD_SPENT_CLAIM_BLOCKS_COLUMN -> userCollection.updateMany( + Filters.exists("spent_claim_blocks", false), + Updates.set("spent_claim_blocks", 0L) + ); + default -> throw new UnsupportedOperationException("MongoDB migration " + migration.name() + + " is not implemented in performMongoMigration"); } } @@ -245,9 +238,9 @@ public List getInactiveUsers(long daysInactive) { try { final long cutoffTime = System.currentTimeMillis() - (daysInactive * 24L * 60L * 60L * 1000L); final Date cutoffDate = new Date(cutoffTime); - userCollection.find(Filters.lt("last_login", cutoffDate)).forEach(document -> { - inactiveUsers.add(documentToSavedUser(document)); - }); + userCollection.find(Filters.lt("last_login", cutoffDate)).forEach(document -> + inactiveUsers.add(documentToSavedUser(document)) + ); } catch (Exception e) { plugin.log(Level.SEVERE, "Failed to fetch list of inactive users", e); inactiveUsers.clear(); @@ -306,9 +299,9 @@ public void createOrUpdateUser(@NotNull SavedUser data) { public Set getUserGroups(@NotNull UUID uuid) { try { final Set userGroups = Sets.newHashSet(); - userGroupCollection.find(Filters.eq("uuid", uuid.toString())).forEach(document -> { - userGroups.add(documentToUserGroup(document)); - }); + userGroupCollection.find(Filters.eq("uuid", uuid.toString())).forEach(document -> + userGroups.add(documentToUserGroup(document)) + ); return userGroups; } catch (Exception e) { plugin.log(Level.SEVERE, "Failed to fetch user groups from collection", e); @@ -531,4 +524,3 @@ private int getNextClaimWorldId() { } } - diff --git a/common/src/main/java/net/william278/huskclaims/event/ClaimBanEvent.java b/common/src/main/java/net/william278/huskclaims/event/ClaimBanEvent.java index c080e5d2..60dd11fc 100644 --- a/common/src/main/java/net/william278/huskclaims/event/ClaimBanEvent.java +++ b/common/src/main/java/net/william278/huskclaims/event/ClaimBanEvent.java @@ -20,4 +20,5 @@ package net.william278.huskclaims.event; public interface ClaimBanEvent extends BanEvent { + } diff --git a/common/src/main/java/net/william278/huskclaims/event/ClaimUnBanEvent.java b/common/src/main/java/net/william278/huskclaims/event/ClaimUnBanEvent.java index ce0a5567..a687121c 100644 --- a/common/src/main/java/net/william278/huskclaims/event/ClaimUnBanEvent.java +++ b/common/src/main/java/net/william278/huskclaims/event/ClaimUnBanEvent.java @@ -20,4 +20,5 @@ package net.william278.huskclaims.event; public interface ClaimUnBanEvent extends BanEvent { + } diff --git a/common/src/main/java/net/william278/huskclaims/event/PostCreateClaimEvent.java b/common/src/main/java/net/william278/huskclaims/event/PostCreateClaimEvent.java index 6558039f..f6460a63 100644 --- a/common/src/main/java/net/william278/huskclaims/event/PostCreateClaimEvent.java +++ b/common/src/main/java/net/william278/huskclaims/event/PostCreateClaimEvent.java @@ -20,4 +20,5 @@ package net.william278.huskclaims.event; public interface PostCreateClaimEvent extends OnlineUserEvent, ClaimEvent, Event { + } diff --git a/common/src/main/java/net/william278/huskclaims/hook/BlueMapHook.java b/common/src/main/java/net/william278/huskclaims/hook/BlueMapHook.java index 94bb3b78..e70c541c 100644 --- a/common/src/main/java/net/william278/huskclaims/hook/BlueMapHook.java +++ b/common/src/main/java/net/william278/huskclaims/hook/BlueMapHook.java @@ -157,4 +157,4 @@ public void markAllClaims() { plugin.log(Level.INFO, "Populated web map with %s claims in %s".formatted(claims.size(), name)); }); } -} \ No newline at end of file +} diff --git a/common/src/main/java/net/william278/huskclaims/hook/LuckPermsHook.java b/common/src/main/java/net/william278/huskclaims/hook/LuckPermsHook.java index 57beceac..febb2b9b 100644 --- a/common/src/main/java/net/william278/huskclaims/hook/LuckPermsHook.java +++ b/common/src/main/java/net/william278/huskclaims/hook/LuckPermsHook.java @@ -91,7 +91,7 @@ protected GroupTrustTag(@NotNull Group group, @NotNull UserManager users, @NotNu String.format( "%s%s", plugin.getSettings().getHooks().getLuckPerms().getTrustTagPrefix(), - group.getName().toLowerCase(Locale.ENGLISH).replaceAll(" ", "_") + group.getName().toLowerCase(Locale.ENGLISH).replace(" ", "_") ), plugin.getLocales().getRawLocale("group_tag_description", Locales. escapeText(group.getDisplayName() == null ? group.getName() : group.getDisplayName()) diff --git a/common/src/main/java/net/william278/huskclaims/hook/PluginHook.java b/common/src/main/java/net/william278/huskclaims/hook/PluginHook.java index 84977bd4..1ef8cc71 100644 --- a/common/src/main/java/net/william278/huskclaims/hook/PluginHook.java +++ b/common/src/main/java/net/william278/huskclaims/hook/PluginHook.java @@ -42,4 +42,4 @@ enum Register { ON_ENABLE } -} \ No newline at end of file +} diff --git a/common/src/main/java/net/william278/huskclaims/hook/WorldGuardHook.java b/common/src/main/java/net/william278/huskclaims/hook/WorldGuardHook.java index 13d04c97..e499c6aa 100644 --- a/common/src/main/java/net/william278/huskclaims/hook/WorldGuardHook.java +++ b/common/src/main/java/net/william278/huskclaims/hook/WorldGuardHook.java @@ -43,6 +43,7 @@ public void load() { @Override public void unload() { + } } diff --git a/common/src/main/java/net/william278/huskclaims/listener/InspectionToolHandler.java b/common/src/main/java/net/william278/huskclaims/listener/InspectionToolHandler.java index 62741837..9ccabf54 100644 --- a/common/src/main/java/net/william278/huskclaims/listener/InspectionToolHandler.java +++ b/common/src/main/java/net/william278/huskclaims/listener/InspectionToolHandler.java @@ -44,7 +44,6 @@ public interface InspectionToolHandler { String INSPECT_NEARBY_PERMISSION = "huskclaims.inspect.nearby"; String VIEW_LAST_SEEN_PERMISSION = "huskclaims.inspect.view_last_seen"; - // When the inspection tool (default: stick) is used default void onInspectionToolUse(@NotNull OperationUser opUser, @NotNull OperationPosition opPosition) { final OnlineUser user = (OnlineUser) opUser; diff --git a/common/src/main/java/net/william278/huskclaims/moderation/SignListener.java b/common/src/main/java/net/william278/huskclaims/moderation/SignListener.java index cb983d25..65c607e9 100644 --- a/common/src/main/java/net/william278/huskclaims/moderation/SignListener.java +++ b/common/src/main/java/net/william278/huskclaims/moderation/SignListener.java @@ -37,7 +37,6 @@ */ public interface SignListener { - /** * Handles the editing of a sign * diff --git a/common/src/main/java/net/william278/huskclaims/network/Broker.java b/common/src/main/java/net/william278/huskclaims/network/Broker.java index 8d713ea3..0e245bde 100644 --- a/common/src/main/java/net/william278/huskclaims/network/Broker.java +++ b/common/src/main/java/net/william278/huskclaims/network/Broker.java @@ -113,7 +113,6 @@ public Broker getBroker() { return this; } - /** * Identifies types of message brokers */ diff --git a/common/src/main/java/net/william278/huskclaims/network/PluginMessageBroker.java b/common/src/main/java/net/william278/huskclaims/network/PluginMessageBroker.java index 0ed07bc0..cca34699 100644 --- a/common/src/main/java/net/william278/huskclaims/network/PluginMessageBroker.java +++ b/common/src/main/java/net/william278/huskclaims/network/PluginMessageBroker.java @@ -101,5 +101,6 @@ protected void send(@NotNull Message message, @NotNull OnlineUser sender) { @Override public void close() { + } } diff --git a/common/src/main/java/net/william278/huskclaims/network/RedisBroker.java b/common/src/main/java/net/william278/huskclaims/network/RedisBroker.java index 0a28a560..a6577d71 100644 --- a/common/src/main/java/net/william278/huskclaims/network/RedisBroker.java +++ b/common/src/main/java/net/william278/huskclaims/network/RedisBroker.java @@ -117,4 +117,4 @@ public void close() { } } -} \ No newline at end of file +} diff --git a/common/src/main/java/net/william278/huskclaims/position/ServerWorld.java b/common/src/main/java/net/william278/huskclaims/position/ServerWorld.java index 3cd901a5..a92ed5e7 100644 --- a/common/src/main/java/net/william278/huskclaims/position/ServerWorld.java +++ b/common/src/main/java/net/william278/huskclaims/position/ServerWorld.java @@ -35,15 +35,16 @@ public boolean equals(Object obj) { if (obj == this) { return true; } - if (!(obj instanceof final ServerWorld serverWorld)) { + if (!(obj instanceof ServerWorld(String server1, World world1))) { return false; } - return serverWorld.server().equals(server) && serverWorld.world().equals(world); + return server1.equals(server) && world1.equals(world); } @Override + @NotNull public String toString() { return String.format("%s/%s", server, world.getName()); } -} \ No newline at end of file +} diff --git a/common/src/main/java/net/william278/huskclaims/trust/TrustTag.java b/common/src/main/java/net/william278/huskclaims/trust/TrustTag.java index 27896350..bda2e1de 100644 --- a/common/src/main/java/net/william278/huskclaims/trust/TrustTag.java +++ b/common/src/main/java/net/william278/huskclaims/trust/TrustTag.java @@ -67,7 +67,7 @@ public String getTrustIdentifier(@NotNull HuskClaims plugin) { return String.format( "%s%s", plugin.getSettings().getTrustTags().getTagSpecifierPrefix(), - name.replaceAll(" ", "_") + name.replace(" ", "_") ); } diff --git a/common/src/main/java/net/william278/huskclaims/trust/UserGroup.java b/common/src/main/java/net/william278/huskclaims/trust/UserGroup.java index c20674d6..811d0f23 100644 --- a/common/src/main/java/net/william278/huskclaims/trust/UserGroup.java +++ b/common/src/main/java/net/william278/huskclaims/trust/UserGroup.java @@ -55,7 +55,7 @@ public String getTrustIdentifier(@NotNull HuskClaims plugin) { return String.format( "%s%s", plugin.getSettings().getUserGroups().getGroupSpecifierPrefix(), - name.replaceAll(" ", "_") + name.replace(" ", "_") ); } diff --git a/common/src/main/java/net/william278/huskclaims/util/StatusLine.java b/common/src/main/java/net/william278/huskclaims/util/StatusLine.java index 5f61502a..baa89332 100644 --- a/common/src/main/java/net/william278/huskclaims/util/StatusLine.java +++ b/common/src/main/java/net/william278/huskclaims/util/StatusLine.java @@ -87,7 +87,7 @@ public Component get(@NotNull HuskClaims plugin) { return Component .text("•").appendSpace() .append(Component.text( - WordUtils.capitalizeFully(name().replaceAll("_", " ")), + WordUtils.capitalizeFully(name().replace("_", " ")), TextColor.color(0x848484) )) .append(Component.text(':')).append(Component.space().color(NamedTextColor.WHITE)) diff --git a/common/src/main/java/net/william278/huskclaims/util/datastrcture/ConcurrentLong2ObjectMap.java b/common/src/main/java/net/william278/huskclaims/util/datastrcture/ConcurrentLong2ObjectMap.java index 88d0ae4e..555b9ba9 100644 --- a/common/src/main/java/net/william278/huskclaims/util/datastrcture/ConcurrentLong2ObjectMap.java +++ b/common/src/main/java/net/william278/huskclaims/util/datastrcture/ConcurrentLong2ObjectMap.java @@ -29,13 +29,15 @@ import it.unimi.dsi.fastutil.objects.ObjectSet; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.concurrent.locks.StampedLock; /** * A concurrent map that implements the fastutil {@link Long2ObjectMap} interface. *

- * This implementation uses a lock striping (sharding) strategy with an array of + * This implementation uses a lock striping (sharding) strategy with a list of * internal buckets, each protected by its own {@link StampedLock}. This allows for * high concurrency levels by reducing lock contention, as threads operating on * different keys can often work on separate buckets in parallel. @@ -61,7 +63,7 @@ public class ConcurrentLong2ObjectMap implements Long2ObjectMap { private static final int DEFAULT_CONCURRENCY_LEVEL = 16; public static final float DEFAULT_LOAD_FACTOR = 0.75f; - private final Bucket[] buckets; + private final List> buckets; private static class Bucket { final Long2ObjectOpenHashMap map; @@ -73,19 +75,18 @@ private static class Bucket { } } - @SuppressWarnings("unchecked") public ConcurrentLong2ObjectMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new IllegalArgumentException("Illegal load factor: " + loadFactor); int concurrencyLevel = DEFAULT_CONCURRENCY_LEVEL; - this.buckets = new Bucket[concurrencyLevel]; - int perBucketCapacity = (initialCapacity / concurrencyLevel) + 1; + List> bucketList = new ArrayList<>(concurrencyLevel); for (int i = 0; i < concurrencyLevel; i++) { - buckets[i] = new Bucket<>(perBucketCapacity, loadFactor); + bucketList.add(new Bucket<>(perBucketCapacity, loadFactor)); } + this.buckets = bucketList; } /** @@ -107,8 +108,8 @@ public ConcurrentLong2ObjectMap() { private Bucket getBucket(long key) { int h = Long.hashCode(key); int spreadHash = h ^ (h >>> 16); - int index = (buckets.length - 1) & spreadHash; - return buckets[index]; + int index = (buckets.size() - 1) & spreadHash; + return buckets.get(index); } @Override @@ -229,7 +230,10 @@ public boolean containsValue(Object value) { @Override public void putAll(@NotNull Map m) { for (Map.Entry entry : m.entrySet()) { - this.put(entry.getKey(), entry.getValue()); + final long key = (entry instanceof Long2ObjectMap.Entry longEntry) + ? longEntry.getLongKey() + : entry.getKey().longValue(); + this.put(key, entry.getValue()); } } @@ -286,4 +290,4 @@ public ObjectCollection values() { } return values; } -} \ No newline at end of file +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b95..d997cfc6 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 94113f20..c61a118f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6d..739907df 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -173,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -206,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9b42019c..e509b2dd 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/settings.gradle b/settings.gradle index 6ed9b125..1d3652aa 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,7 +8,7 @@ pluginManagement { } plugins { - def egtVersion = "0.6.6" + def egtVersion = "0.7.0" id("gg.essential.defaults") version egtVersion id("gg.essential.multi-version.root") version egtVersion }