mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-10-31 17:43:44 +01:00 
			
		
		
		
	Compare commits
	
		
			11 Commits
		
	
	
		
			6.2.3
			...
			refactor/v
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 12463dbb1c | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 6a5859ee0f | ||
|   | 59e0b4b67a | ||
|   | 5fc153d896 | ||
|   | a003836dbc | ||
|   | 42bf413528 | ||
|   | 827f46566c | ||
|   | 6f4d2f6d5a | ||
|   | 6073b96317 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 74a490f9f0 | ||
|   | 3a752db698 | 
							
								
								
									
										2
									
								
								.github/workflows/release-drafter.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/release-drafter.yml
									
									
									
									
										vendored
									
									
								
							| @@ -13,6 +13,6 @@ jobs: | ||||
|   update_release_draft: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: release-drafter/release-drafter@v5.15.0 | ||||
|       - uses: release-drafter/release-drafter@v5.17.6 | ||||
|         env: | ||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||
|   | ||||
							
								
								
									
										4
									
								
								.lift.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.lift.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| jdkVersion = "17" | ||||
| build = "gradle clean build -x test" | ||||
| tools = ["findsecbugs", "ErrorProne", "Semgrep", "Detekt", "Infer"] | ||||
| ignoreRules = ["CatchAndPrintStackTrace", "ReferenceEquality", "FallThrough", "FutureReturnValueIgnored", "MixedMutabilityReturnType", "EmptyCatch", "MissingCasesInEnumSwitch", "OperatorPrecedence", "StaticAssignmentInConstructor", "ReferenceEquality", "EqualsHashCode", "EqualsGetClass", "TypeParameterUnusedInFormals", "StringSplitter", "InlineMeSuggester", "NULL_DEREFERENCE"] | ||||
| @@ -218,6 +218,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | ||||
|     private PlatformWorldManager<World> worldManager; | ||||
|     private Locale serverLocale; | ||||
|  | ||||
|     @SuppressWarnings("StringSplitter") | ||||
|     @Override | ||||
|     public int @NonNull [] serverVersion() { | ||||
|         if (this.version == null) { | ||||
| @@ -323,8 +324,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | ||||
|         // Comments | ||||
|         CommentManager.registerDefaultInboxes(); | ||||
|  | ||||
|         plotSquared.startExpiryTasks(); | ||||
|  | ||||
|         // Do stuff that was previously done in PlotSquared | ||||
|         // Kill entities | ||||
|         if (Settings.Enabled_Components.KILL_ROAD_MOBS || Settings.Enabled_Components.KILL_ROAD_VEHICLES) { | ||||
| @@ -421,6 +420,8 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | ||||
|             }, TaskTime.ticks(1L)); | ||||
|         } | ||||
|  | ||||
|         plotSquared.startExpiryTasks(); | ||||
|  | ||||
|         // Once the server has loaded force updating all generators known to P2 | ||||
|         TaskManager.runTaskLater(() -> PlotSquared.platform().setupUtils().updateGenerators(true), TaskTime.ticks(1L)); | ||||
|  | ||||
| @@ -970,7 +971,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | ||||
|                                                 } | ||||
|                                                 iterator.remove(); | ||||
|                                                 entity.remove(); | ||||
|                                                 continue; | ||||
|                                             } | ||||
|                                         } | ||||
|                                     } else { | ||||
| @@ -982,7 +982,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | ||||
|                                             } | ||||
|                                             iterator.remove(); | ||||
|                                             entity.remove(); | ||||
|                                             continue; | ||||
|                                         } | ||||
|                                     } | ||||
|                                 } | ||||
| @@ -1223,7 +1222,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | ||||
|  | ||||
|     @Override | ||||
|     @NonNull | ||||
|     @SuppressWarnings("ALL") | ||||
|     @SuppressWarnings("unchecked") | ||||
|     public PlayerManager<? extends PlotPlayer<Player>, ? extends Player> playerManager() { | ||||
|         return (PlayerManager<BukkitPlayer, Player>) injector().getInstance(PlayerManager.class); | ||||
|     } | ||||
|   | ||||
| @@ -461,6 +461,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | ||||
|         this.tamed.tamed = tamed.isTamed(); | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("deprecation") // Paper deprecation | ||||
|     @Override | ||||
|     public Entity spawn(World world, int xOffset, int zOffset) { | ||||
|         Location location = new Location(world, this.getX() + xOffset, this.getY(), this.z + zOffset); | ||||
|   | ||||
| @@ -36,6 +36,7 @@ import org.bukkit.World; | ||||
|  | ||||
| public class WorldManagerModule extends AbstractModule { | ||||
|  | ||||
|     @SuppressWarnings("removal") // Internal use only | ||||
|     @Provides | ||||
|     @Singleton | ||||
|     PlatformWorldManager<World> provideWorldManager() { | ||||
|   | ||||
| @@ -60,7 +60,7 @@ import java.util.List; | ||||
|  | ||||
| public class EntitySpawnListener implements Listener { | ||||
|  | ||||
|     private final static String KEY = "P2"; | ||||
|     private static final String KEY = "P2"; | ||||
|     private static boolean ignoreTP = false; | ||||
|     private static boolean hasPlotArea = false; | ||||
|     private static String areaName = null; | ||||
|   | ||||
| @@ -36,7 +36,6 @@ import com.plotsquared.core.plot.world.PlotAreaManager; | ||||
| import net.kyori.adventure.text.minimessage.Template; | ||||
| import org.bukkit.block.Banner; | ||||
| import org.bukkit.block.Beacon; | ||||
| import org.bukkit.block.Bed; | ||||
| import org.bukkit.block.BlockState; | ||||
| import org.bukkit.block.CommandBlock; | ||||
| import org.bukkit.block.Comparator; | ||||
| @@ -51,6 +50,7 @@ import org.bukkit.block.Jukebox; | ||||
| import org.bukkit.block.Sign; | ||||
| import org.bukkit.block.Skull; | ||||
| import org.bukkit.block.Structure; | ||||
| import org.bukkit.block.data.type.Bed; | ||||
| import org.bukkit.event.EventHandler; | ||||
| import org.bukkit.event.block.BlockPlaceEvent; | ||||
| import org.checkerframework.checker.nullness.qual.NonNull; | ||||
|   | ||||
| @@ -154,7 +154,6 @@ import org.checkerframework.checker.nullness.qual.NonNull; | ||||
|  | ||||
| import java.lang.reflect.Field; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.HashSet; | ||||
| import java.util.List; | ||||
| import java.util.Locale; | ||||
| @@ -224,6 +223,7 @@ public class PlayerEventListener extends PlotListener implements Listener { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("StringSplitter") | ||||
|     @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) | ||||
|     public void playerCommand(PlayerCommandPreprocessEvent event) { | ||||
|         String msg = event.getMessage().toLowerCase().replaceAll("/", "").trim(); | ||||
| @@ -379,6 +379,7 @@ public class PlayerEventListener extends PlotListener implements Listener { | ||||
|         this.eventDispatcher.doRespawnTask(pp); | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("deprecation") // We explicitly want #getHomeSynchronous here | ||||
|     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) | ||||
|     public void onTeleport(PlayerTeleportEvent event) { | ||||
|         Player player = event.getPlayer(); | ||||
| @@ -1063,9 +1064,13 @@ public class PlayerEventListener extends PlotListener implements Listener { | ||||
|         if (area == null) { | ||||
|             return; | ||||
|         } | ||||
|         PlayerBlockEventType eventType = null; | ||||
|         PlayerBlockEventType eventType; | ||||
|         BlockType blocktype1; | ||||
|         Block block = event.getClickedBlock(); | ||||
|         if (block == null) { | ||||
|             // We do not care in this case, the player is likely interacting with air ("nothing"). | ||||
|             return; | ||||
|         } | ||||
|         Location location = BukkitUtil.adapt(block.getLocation()); | ||||
|         Action action = event.getAction(); | ||||
|         switch (action) { | ||||
| @@ -1667,6 +1672,7 @@ public class PlayerEventListener extends PlotListener implements Listener { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("deprecation") // #getLocate is needed for Spigot compatibility | ||||
|     @EventHandler | ||||
|     public void onLocaleChange(final PlayerLocaleChangeEvent event) { | ||||
|         // The event is fired before the player is deemed online upon login | ||||
|   | ||||
| @@ -43,7 +43,6 @@ import java.lang.reflect.Method; | ||||
|  | ||||
| import static com.plotsquared.core.util.ReflectionUtils.getRefClass; | ||||
|  | ||||
| @SuppressWarnings("unused") | ||||
| public class SingleWorldListener implements Listener { | ||||
|  | ||||
|     private final Method methodGetHandleChunk; | ||||
|   | ||||
| @@ -162,6 +162,7 @@ public class BukkitPlayer extends PlotPlayer<Player> { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("StringSplitter") | ||||
|     @Override | ||||
|     @NonNegative | ||||
|     public int hasPermissionRange( | ||||
| @@ -319,7 +320,7 @@ public class BukkitPlayer extends PlotPlayer<Player> { | ||||
|         if (id == ItemTypes.AIR) { | ||||
|             // Let's just stop all the discs because why not? | ||||
|             for (final Sound sound : Arrays.stream(Sound.values()) | ||||
|                     .filter(sound -> sound.name().contains("DISC")).collect(Collectors.toList())) { | ||||
|                     .filter(sound -> sound.name().contains("DISC")).toList()) { | ||||
|                 player.stopSound(sound); | ||||
|             } | ||||
|             // this.player.playEffect(BukkitUtil.getLocation(location), Effect.RECORD_PLAY, Material.AIR); | ||||
| @@ -331,6 +332,7 @@ public class BukkitPlayer extends PlotPlayer<Player> { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("deprecation") // Needed for Spigot compatibility | ||||
|     @Override | ||||
|     public void kick(final String message) { | ||||
|         this.player.kickPlayer(message); | ||||
|   | ||||
| @@ -51,7 +51,6 @@ import com.sk89q.worldedit.world.biome.BiomeType; | ||||
| import com.sk89q.worldedit.world.block.BaseBlock; | ||||
| import com.sk89q.worldedit.world.block.BlockState; | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.Chunk; | ||||
| import org.bukkit.block.Block; | ||||
| import org.bukkit.block.Container; | ||||
| import org.bukkit.block.data.BlockData; | ||||
| @@ -199,7 +198,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator { | ||||
|                     } | ||||
|                 } | ||||
|                 if (localChunk.getTiles().size() > 0) { | ||||
|                     localChunk.getTiles().forEach(((blockVector3, tag) -> { | ||||
|                     localChunk.getTiles().forEach((blockVector3, tag) -> { | ||||
|                         try { | ||||
|                             BaseBlock block = getWorld().getBlock(blockVector3).toBaseBlock(tag); | ||||
|                             getWorld().setBlock(blockVector3, block, noSideEffectSet); | ||||
| @@ -207,7 +206,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator { | ||||
|                             StateWrapper sw = new StateWrapper(tag); | ||||
|                             sw.restoreTag(getWorld().getName(), blockVector3.getX(), blockVector3.getY(), blockVector3.getZ()); | ||||
|                         } | ||||
|                     })); | ||||
|                     }); | ||||
|                 } | ||||
|                 if (localChunk.getEntities().size() > 0) { | ||||
|                     localChunk.getEntities().forEach((location, entity) -> getWorld().createEntity(location, entity)); | ||||
| @@ -238,6 +237,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator { | ||||
|     /** | ||||
|      * Set a block to the world. First tries WNA but defaults to normal block setting methods if that fails | ||||
|      */ | ||||
|     @SuppressWarnings("unused") | ||||
|     private void setWorldBlock(int x, int y, int z, @NonNull BaseBlock block, @NonNull BlockVector2 blockVector2, boolean edge) { | ||||
|         try { | ||||
|             BlockVector3 loc = BlockVector3.at(x, y, z); | ||||
| @@ -266,9 +266,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator { | ||||
|         } catch (WorldEditException ignored) { | ||||
|             // Fallback to not so nice method | ||||
|             BlockData blockData = BukkitAdapter.adapt(block); | ||||
|             Chunk chunk = getBukkitWorld().getChunkAt(blockVector2.getX(), blockVector2.getZ()); | ||||
|  | ||||
|             Block existing = chunk.getBlock(x, y, z); | ||||
|             Block existing = getBukkitWorld().getBlockAt(x, y, z); | ||||
|             final BlockState existingBaseBlock = BukkitAdapter.adapt(existing.getBlockData()); | ||||
|             if (BukkitBlockUtil.get(existing).equals(existingBaseBlock) && existing.getBlockData().matches(blockData)) { | ||||
|                 return; | ||||
|   | ||||
| @@ -166,6 +166,7 @@ public class StateWrapper { | ||||
|         return str; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("deprecation") // #setLine is needed for Spigot compatibility | ||||
|     public boolean restoreTag(String worldName, int x, int y, int z) { | ||||
|         if (this.tag == null) { | ||||
|             return false; | ||||
|   | ||||
| @@ -77,6 +77,7 @@ public class BukkitInventoryUtil extends InventoryUtil { | ||||
|         return stack; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("deprecation") // Paper deprecation | ||||
|     @Override | ||||
|     public void open(PlotInventory inv) { | ||||
|         BukkitPlayer bp = (BukkitPlayer) inv.getPlayer(); | ||||
| @@ -113,6 +114,7 @@ public class BukkitInventoryUtil extends InventoryUtil { | ||||
|         bp.player.updateInventory(); | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("deprecation") // Paper deprecation | ||||
|     public PlotItemStack getItem(ItemStack item) { | ||||
|         if (item == null) { | ||||
|             return null; | ||||
| @@ -145,6 +147,7 @@ public class BukkitInventoryUtil extends InventoryUtil { | ||||
|                 .toArray(PlotItemStack[]::new); | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("deprecation") // #getTitle is needed for Spigot compatibility | ||||
|     @Override | ||||
|     public boolean isOpen(PlotInventory plotInventory) { | ||||
|         if (!plotInventory.isOpen()) { | ||||
|   | ||||
| @@ -61,6 +61,7 @@ public class UpdateUtility implements Listener { | ||||
|         internalVersion = PlotSquared.get().getVersion(); | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings({"deprecation", "DefaultCharset"}) // Suppress Json deprecation, we can't use features from gson 2.8.1 and newer yet | ||||
|     public void updateChecker() { | ||||
|         task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> { | ||||
|             try { | ||||
| @@ -68,7 +69,7 @@ public class UpdateUtility implements Listener { | ||||
|                         "https://api.spigotmc.org/simple/0.1/index.php?action=getResource&id=77506") | ||||
|                         .openConnection(); | ||||
|                 connection.setRequestMethod("GET"); | ||||
|                 JsonObject result = (new JsonParser()) | ||||
|                 JsonObject result = new JsonParser() | ||||
|                         .parse(new JsonReader(new InputStreamReader(connection.getInputStream()))) | ||||
|                         .getAsJsonObject(); | ||||
|                 spigotVersion = result.get("current_version").getAsString(); | ||||
| @@ -91,7 +92,7 @@ public class UpdateUtility implements Listener { | ||||
|                 notify = false; | ||||
|                 LOGGER.info("Congratulations! You are running the latest PlotSquared version"); | ||||
|             } | ||||
|         }, 0L, Settings.UpdateChecker.POLL_RATE * 60 * 20); | ||||
|         }, 0L, (long) Settings.UpdateChecker.POLL_RATE * 60 * 20); | ||||
|     } | ||||
|  | ||||
|     private void cancelTask() { | ||||
|   | ||||
| @@ -75,6 +75,7 @@ public class FaweSchematicHandler extends SchematicHandler { | ||||
|         return delegate.save(tag, path); | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("removal") // Just the override | ||||
|     @Override | ||||
|     public void upload(final CompoundTag tag, final UUID uuid, final String file, final RunnableVal<URL> whenDone) { | ||||
|         delegate.upload(tag, uuid, file, whenDone); | ||||
|   | ||||
| @@ -342,6 +342,7 @@ public class PlotSquared { | ||||
|      * @param plotArea the {@link PlotArea} to add. | ||||
|      * @see #removePlotArea(PlotArea) To remove the reference | ||||
|      */ | ||||
|     @SuppressWarnings("unchecked") | ||||
|     public void addPlotArea(final @NonNull PlotArea plotArea) { | ||||
|         HashMap<PlotId, Plot> plots; | ||||
|         if (plots_tmp == null || (plots = plots_tmp.remove(plotArea.toString())) == null) { | ||||
| @@ -556,6 +557,7 @@ public class PlotSquared { | ||||
|      * | ||||
|      * @param input an array of plots to sort | ||||
|      */ | ||||
|     @SuppressWarnings("unchecked") | ||||
|     private void sortPlotsByHash(final @NonNull Plot @NonNull [] input) { | ||||
|         List<Plot>[] bucket = new ArrayList[32]; | ||||
|         Arrays.fill(bucket, new ArrayList<>()); | ||||
| @@ -696,20 +698,12 @@ public class PlotSquared { | ||||
|         ArrayList<Plot> toReturn = new ArrayList<>(plots.size()); | ||||
|         for (PlotArea area : areas) { | ||||
|             switch (type) { | ||||
|                 case CREATION_DATE: | ||||
|                     toReturn.addAll(sortPlotsByTemp(map.get(area))); | ||||
|                     break; | ||||
|                 case CREATION_DATE_TIMESTAMP: | ||||
|                     toReturn.addAll(sortPlotsByTimestamp(map.get(area))); | ||||
|                     break; | ||||
|                 case DISTANCE_FROM_ORIGIN: | ||||
|                     toReturn.addAll(sortPlotsByHash(map.get(area))); | ||||
|                     break; | ||||
|                 case LAST_MODIFIED: | ||||
|                     toReturn.addAll(sortPlotsByModified(map.get(area))); | ||||
|                     break; | ||||
|                 default: | ||||
|                     break; | ||||
|                 case CREATION_DATE -> toReturn.addAll(sortPlotsByTemp(map.get(area))); | ||||
|                 case CREATION_DATE_TIMESTAMP -> toReturn.addAll(sortPlotsByTimestamp(map.get(area))); | ||||
|                 case DISTANCE_FROM_ORIGIN -> toReturn.addAll(sortPlotsByHash(map.get(area))); | ||||
|                 case LAST_MODIFIED -> toReturn.addAll(sortPlotsByModified(map.get(area))); | ||||
|                 default -> { | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         return toReturn; | ||||
| @@ -1540,7 +1534,7 @@ public class PlotSquared { | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Register a caption map. The namespace needs be equal to the namespace used for | ||||
|      * Register a caption map. The namespace needs to be equal to the namespace used for | ||||
|      * the {@link TranslatableCaption}s inside the map. | ||||
|      * | ||||
|      * @param namespace  Namespace | ||||
|   | ||||
| @@ -29,7 +29,8 @@ import java.util.Arrays; | ||||
|  | ||||
| public class ArrayUtil { | ||||
|  | ||||
|     public static final <T> T[] concatAll(T[] first, T[]... rest) { | ||||
|     @SuppressWarnings("unchecked") | ||||
|     public static <T> T[] concatAll(T[] first, T[]... rest) { | ||||
|         int totalLength = first.length; | ||||
|         for (T[] array : rest) { | ||||
|             totalLength += array.length; | ||||
|   | ||||
| @@ -35,6 +35,7 @@ public class FlatRandomCollection<T> extends RandomCollection<T> { | ||||
|  | ||||
|     private final T[] values; | ||||
|  | ||||
|     @SuppressWarnings("unchecked") | ||||
|     public FlatRandomCollection(Map<T, Double> weights, Random random) { | ||||
|         super(weights, random); | ||||
|         int max = 0; | ||||
|   | ||||
| @@ -241,6 +241,7 @@ public class QuadMap<T> { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("unchecked") | ||||
|     public void recalculateSkip() { | ||||
|         QuadMap<T> map = null; | ||||
|         for (QuadMap<T> current : new QuadMap[]{this.one, this.two, this.three, this.four}) { | ||||
|   | ||||
| @@ -106,7 +106,7 @@ public class Add extends Command { | ||||
|                                         .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_TRUST))) { | ||||
|                             player.sendMessage( | ||||
|                                     TranslatableCaption.of("errors.invalid_player"), | ||||
|                                     Template.of("value", PlayerManager.getName(uuid)) | ||||
|                                     Template.of("value", PlayerManager.resolveName(uuid).getComponent(player)) | ||||
|                             ); | ||||
|                             iterator.remove(); | ||||
|                             continue; | ||||
| @@ -114,7 +114,7 @@ public class Add extends Command { | ||||
|                         if (plot.isOwner(uuid)) { | ||||
|                             player.sendMessage( | ||||
|                                     TranslatableCaption.of("member.already_added"), | ||||
|                                     Template.of("player", PlayerManager.getName(uuid)) | ||||
|                                     Template.of("player", PlayerManager.resolveName(uuid).getComponent(player)) | ||||
|                             ); | ||||
|                             iterator.remove(); | ||||
|                             continue; | ||||
| @@ -122,7 +122,7 @@ public class Add extends Command { | ||||
|                         if (plot.getMembers().contains(uuid)) { | ||||
|                             player.sendMessage( | ||||
|                                     TranslatableCaption.of("member.already_added"), | ||||
|                                     Template.of("player", PlayerManager.getName(uuid)) | ||||
|                                     Template.of("player", PlayerManager.resolveName(uuid).getComponent(player)) | ||||
|                             ); | ||||
|                             iterator.remove(); | ||||
|                             continue; | ||||
|   | ||||
| @@ -58,6 +58,7 @@ import java.util.concurrent.CompletableFuture; | ||||
| public class Clear extends Command { | ||||
|  | ||||
|     private final EventDispatcher eventDispatcher; | ||||
|     @SuppressWarnings({"unused", "FieldCanBeLocal"}) | ||||
|     private final GlobalBlockQueue blockQueue; | ||||
|  | ||||
|     @Inject | ||||
|   | ||||
| @@ -375,7 +375,6 @@ public abstract class Command { | ||||
|             boolean failed = args.length < reqArgs.length; | ||||
|             String[] baseSplit = getCommandString().split(" "); | ||||
|             String[] fullSplit = getUsage().split(" "); | ||||
|             String base = getCommandString(); | ||||
|             if (fullSplit.length - baseSplit.length < reqArgs.length) { | ||||
|                 String[] tmp = new String[baseSplit.length + reqArgs.length]; | ||||
|                 System.arraycopy(fullSplit, 0, tmp, 0, fullSplit.length); | ||||
|   | ||||
| @@ -69,6 +69,7 @@ public class Condense extends SubCommand { | ||||
|         this.worldUtil = worldUtil; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("unchecked") | ||||
|     @Override | ||||
|     public boolean onCommand(final PlotPlayer<?> player, String[] args) { | ||||
|         if (args.length != 2 && args.length != 3) { | ||||
|   | ||||
| @@ -255,7 +255,7 @@ public class DatabaseCommand extends SubCommand { | ||||
|                 player.sendMessage(TranslatableCaption.of("database.failed_to_save_plots")); | ||||
|                 player.sendMessage(TranslatableCaption.of("errors.stacktrace_begin")); | ||||
|                 e.printStackTrace(); | ||||
|                 player.sendMessage(TranslatableCaption.of(("errors.stacktrace_end"))); | ||||
|                 player.sendMessage(TranslatableCaption.of("errors.stacktrace_end")); | ||||
|                 player.sendMessage(TranslatableCaption.of("database.invalid_args")); | ||||
|                 return false; | ||||
|             } | ||||
|   | ||||
| @@ -125,7 +125,7 @@ public class Deny extends SubCommand { | ||||
|                     } else if (plot.getDenied().contains(uuid)) { | ||||
|                         player.sendMessage( | ||||
|                                 TranslatableCaption.of("member.already_added"), | ||||
|                                 Template.of("player", PlayerManager.getName(uuid)) | ||||
|                                 Template.of("player", PlayerManager.resolveName(uuid).getComponent(player)) | ||||
|                         ); | ||||
|                         return; | ||||
|                     } else { | ||||
|   | ||||
| @@ -94,12 +94,12 @@ public class Download extends SubCommand { | ||||
|             player.sendMessage(TranslatableCaption.of("info.plot_unowned")); | ||||
|             return false; | ||||
|         } | ||||
|         if ((Settings.Done.REQUIRED_FOR_DOWNLOAD && (!DoneFlag.isDone(plot))) && !Permissions | ||||
|         if ((Settings.Done.REQUIRED_FOR_DOWNLOAD && !DoneFlag.isDone(plot)) && !Permissions | ||||
|                 .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DOWNLOAD)) { | ||||
|             player.sendMessage(TranslatableCaption.of("done.done_not_done")); | ||||
|             return false; | ||||
|         } | ||||
|         if ((!plot.isOwner(player.getUUID())) && !Permissions | ||||
|         if (!plot.isOwner(player.getUUID()) && !Permissions | ||||
|                 .hasPermission(player, Permission.PERMISSION_ADMIN.toString())) { | ||||
|             player.sendMessage(TranslatableCaption.of("permission.no_plot_perms")); | ||||
|             return false; | ||||
|   | ||||
| @@ -367,6 +367,7 @@ public final class FlagCommand extends Command { | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings({"unchecked", "rawtypes"}) | ||||
|     @CommandDeclaration(command = "add", | ||||
|             aliases = {"a", "add"}, | ||||
|             usage = "/plot flag add <flag> <value>", | ||||
| @@ -435,6 +436,7 @@ public final class FlagCommand extends Command { | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings({"unchecked", "rawtypes"}) | ||||
|     @CommandDeclaration(command = "remove", | ||||
|             aliases = {"r", "remove", "delete"}, | ||||
|             usage = "/plot flag remove <flag> [values]", | ||||
|   | ||||
| @@ -112,7 +112,7 @@ public class Like extends SubCommand { | ||||
|                     }); | ||||
|                     for (final Plot plot : plots) { | ||||
|                         if ((!Settings.Done.REQUIRED_FOR_RATINGS || DoneFlag.isDone(plot)) && plot | ||||
|                                 .isBasePlot() && (!plot.getLikes().containsKey(uuid))) { | ||||
|                                 .isBasePlot() && !plot.getLikes().containsKey(uuid)) { | ||||
|                             plot.teleportPlayer(player, TeleportCause.COMMAND_LIKE, result -> { | ||||
|                             }); | ||||
|                             player.sendMessage(TranslatableCaption.of("tutorial.rate_this")); | ||||
|   | ||||
| @@ -142,7 +142,7 @@ public class Owner extends SetCommand { | ||||
|             if (plot.isOwner(uuid)) { | ||||
|                 player.sendMessage( | ||||
|                         TranslatableCaption.of("member.already_owner"), | ||||
|                         Template.of("player", PlayerManager.getName(uuid, false)) | ||||
|                         Template.of("player", PlayerManager.resolveName(uuid, false).getComponent(player)) | ||||
|                 ); | ||||
|                 return; | ||||
|             } | ||||
| @@ -151,7 +151,7 @@ public class Owner extends SetCommand { | ||||
|                 if (other == null) { | ||||
|                     player.sendMessage( | ||||
|                             TranslatableCaption.of("errors.invalid_player_offline"), | ||||
|                             Template.of("player", PlayerManager.getName(uuid)) | ||||
|                             Template.of("player", PlayerManager.resolveName(uuid).getComponent(player)) | ||||
|                     ); | ||||
|                     return; | ||||
|                 } | ||||
|   | ||||
| @@ -104,7 +104,7 @@ public class Rate extends SubCommand { | ||||
|                     UUID uuid = player.getUUID(); | ||||
|                     for (Plot p : plots) { | ||||
|                         if ((!Settings.Done.REQUIRED_FOR_RATINGS || DoneFlag.isDone(p)) && p | ||||
|                                 .isBasePlot() && (!p.getRatings().containsKey(uuid)) && !p | ||||
|                                 .isBasePlot() && !p.getRatings().containsKey(uuid) && !p | ||||
|                                 .isAdded(uuid)) { | ||||
|                             p.teleportPlayer(player, TeleportCause.COMMAND_RATE, result -> { | ||||
|                             }); | ||||
|   | ||||
| @@ -88,7 +88,6 @@ public class RegenAllRoads extends SubCommand { | ||||
|             ); | ||||
|             return false; | ||||
|         } | ||||
|         String name = args[0]; | ||||
|         PlotManager manager = area.getPlotManager(); | ||||
|         if (!(manager instanceof HybridPlotManager)) { | ||||
|             player.sendMessage(TranslatableCaption.of("errors.invalid_plot_world")); | ||||
|   | ||||
| @@ -181,8 +181,6 @@ public class SchematicCmd extends SubCommand { | ||||
|                 }); | ||||
|             } | ||||
|             case "saveall", "exportall" -> { | ||||
|                 Location loc = player.getLocation(); | ||||
|                 final Plot plot = loc.getPlotAbs(); | ||||
|                 if (!(player instanceof ConsolePlayer)) { | ||||
|                     player.sendMessage(TranslatableCaption.of("console.not_console")); | ||||
|                     return false; | ||||
|   | ||||
| @@ -100,7 +100,7 @@ public class Set extends SubCommand { | ||||
|  | ||||
|                 if (Settings.Enabled_Components.CHUNK_PROCESSOR) { | ||||
|                     forbiddenTypes.addAll(worldUtil.getTileEntityTypes().stream().map( | ||||
|                             BlockType::getName).collect(Collectors.toList())); | ||||
|                             BlockType::getName).toList()); | ||||
|                 } | ||||
|  | ||||
|                 if (!Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_ALLOW_UNSAFE) && | ||||
|   | ||||
| @@ -112,7 +112,7 @@ public class Trust extends Command { | ||||
|                                     .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_TRUST))) { | ||||
|                         player.sendMessage( | ||||
|                                 TranslatableCaption.of("errors.invalid_player"), | ||||
|                                 Template.of("value", PlayerManager.getName(uuid)) | ||||
|                                 Template.of("value", PlayerManager.resolveName(uuid).getComponent(player)) | ||||
|                         ); | ||||
|                         iterator.remove(); | ||||
|                         continue; | ||||
| @@ -120,7 +120,7 @@ public class Trust extends Command { | ||||
|                     if (currentPlot.isOwner(uuid)) { | ||||
|                         player.sendMessage( | ||||
|                                 TranslatableCaption.of("member.already_added"), | ||||
|                                 Template.of("value", PlayerManager.getName(uuid)) | ||||
|                                 Template.of("value", PlayerManager.resolveName(uuid).getComponent(player)) | ||||
|                         ); | ||||
|                         iterator.remove(); | ||||
|                         continue; | ||||
| @@ -128,7 +128,7 @@ public class Trust extends Command { | ||||
|                     if (currentPlot.getTrusted().contains(uuid)) { | ||||
|                         player.sendMessage( | ||||
|                                 TranslatableCaption.of("member.already_added"), | ||||
|                                 Template.of("value", PlayerManager.getName(uuid)) | ||||
|                                 Template.of("value", PlayerManager.resolveName(uuid).getComponent(player)) | ||||
|                         ); | ||||
|                         iterator.remove(); | ||||
|                         continue; | ||||
|   | ||||
| @@ -361,30 +361,4 @@ public class Visit extends Command { | ||||
|         return completions; | ||||
|     } | ||||
|  | ||||
|     private void completeNumbers(final List<Command> commands, final String arg, final int start) { | ||||
|         for (int i = 0; i < 100; i++) { | ||||
|             final String command = Integer.toString(start + 1); | ||||
|             if (!command.toLowerCase().startsWith(arg.toLowerCase())) { | ||||
|                 continue; | ||||
|             } | ||||
|             commands.add(new Command(this, false, command, "", | ||||
|                     RequiredType.NONE, CommandCategory.TELEPORT | ||||
|             ) { | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void completeAreas(final List<Command> commands, final String arg) { | ||||
|         for (final PlotArea area : this.plotAreaManager.getAllPlotAreas()) { | ||||
|             final String areaName = area.getWorldName() + ";" + area.getId(); | ||||
|             if (!areaName.toLowerCase().startsWith(arg.toLowerCase())) { | ||||
|                 continue; | ||||
|             } | ||||
|             commands.add(new Command(this, false, area.getWorldName() + ";" + area.getId(), "", | ||||
|                     RequiredType.NONE, CommandCategory.TELEPORT | ||||
|             ) { | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -65,6 +65,7 @@ public class ComponentPreset implements ConfigurationSerializable { | ||||
|         this.icon = icon; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("unchecked") | ||||
|     public static ComponentPreset deserialize(final @NonNull Map<String, Object> map) { | ||||
|         final ClassicPlotManagerComponent classicPlotManagerComponent = ClassicPlotManagerComponent | ||||
|                 .fromString(map.getOrDefault("component", "").toString()).orElseThrow(() -> | ||||
|   | ||||
| @@ -75,6 +75,7 @@ public class ComponentPresetManager { | ||||
|     private final InventoryUtil inventoryUtil; | ||||
|     private File componentsFile; | ||||
|  | ||||
|     @SuppressWarnings("unchecked") | ||||
|     @Inject | ||||
|     public ComponentPresetManager(final @NonNull EconHandler econHandler, final @NonNull InventoryUtil inventoryUtil) throws | ||||
|             IOException { | ||||
|   | ||||
| @@ -58,6 +58,7 @@ public class Config { | ||||
|      * @param <T>  value type | ||||
|      * @return value | ||||
|      */ | ||||
|     @SuppressWarnings("unchecked") | ||||
|     public static <T> T get(String key, Class<?> root) { | ||||
|         String[] split = key.split("\\."); | ||||
|         Object instance = getInstance(split, root); | ||||
| @@ -183,6 +184,7 @@ public class Config { | ||||
|         return value != null ? value.toString() : "null"; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings({"unchecked", "rawtypes"}) | ||||
|     private static void save(PrintWriter writer, Class<?> clazz, Object instance, int indent) { | ||||
|         try { | ||||
|             String lineSeparator = System.lineSeparator(); | ||||
| @@ -258,21 +260,6 @@ public class Config { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the field for a specific config node. | ||||
|      * | ||||
|      * @param split the node (split by period) | ||||
|      * @param root | ||||
|      * @return | ||||
|      */ | ||||
|     private static Field getField(String[] split, Class<?> root) { | ||||
|         Object instance = getInstance(split, root); | ||||
|         if (instance == null) { | ||||
|             return null; | ||||
|         } | ||||
|         return getField(split, instance); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the field for a specific config node and instance<br> | ||||
|      * Note: As expiry can have multiple blocks there will be multiple instances | ||||
| @@ -305,6 +292,7 @@ public class Config { | ||||
|      * @param root | ||||
|      * @return The instance or null | ||||
|      */ | ||||
|     @SuppressWarnings({"unchecked", "rawtypes"}) | ||||
|     private static Object getInstance(String[] split, Class<?> root) { | ||||
|         try { | ||||
|             Class<?> clazz = root == null ? MethodHandles.lookup().lookupClass() : root; | ||||
|   | ||||
| @@ -196,6 +196,8 @@ public class Settings extends Config { | ||||
|         public boolean CONFIRMATION = true; | ||||
|         public int DAYS = 90; | ||||
|         public int SKIP_ACCOUNT_AGE_DAYS = -1; | ||||
|         @Comment("True, if a plot should be deleted if the plot owner is unknown to the server") | ||||
|         public boolean DELETE_IF_OWNER_IS_UNKNOWN = false; | ||||
|         public List<String> WORLDS = new ArrayList<>(Collections.singletonList("*")); | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -70,7 +70,7 @@ public final class Templates { | ||||
|      * @return Generated template | ||||
|      */ | ||||
|     public static @NonNull Template of(final @NonNull String key, final @NonNull UUID uuid) { | ||||
|         final String username = PlayerManager.getName(uuid); | ||||
|         final String username = PlayerManager.resolveName(uuid).getComponent(LocaleHolder.console()); | ||||
|         return Template.of(key, username); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -101,7 +101,9 @@ public class SQLManager implements AbstractDB { | ||||
|     private final String prefix; | ||||
|     private final Database database; | ||||
|     private final boolean mySQL; | ||||
|     @SuppressWarnings({"unused", "FieldCanBeLocal"}) | ||||
|     private final EventDispatcher eventDispatcher; | ||||
|     @SuppressWarnings({"unused", "FieldCanBeLocal"}) | ||||
|     private final PlotListener plotListener; | ||||
|     private final YamlConfiguration worldConfiguration; | ||||
|     /** | ||||
| @@ -408,7 +410,6 @@ public class SQLManager implements AbstractDB { | ||||
|                 while (iterator.hasNext()) { | ||||
|                     try { | ||||
|                         Entry<Plot, Queue<UniqueStatement>> entry = iterator.next(); | ||||
|                         Plot plot = entry.getKey(); | ||||
|                         Queue<UniqueStatement> tasks = entry.getValue(); | ||||
|                         if (tasks.isEmpty()) { | ||||
|                             iterator.remove(); | ||||
| @@ -2295,8 +2296,6 @@ public class SQLManager implements AbstractDB { | ||||
|                     int size = uniqueIdsList.size(); | ||||
|                     int packet = 990; | ||||
|                     int amount = size / packet; | ||||
|                     int count = 0; | ||||
|                     int last = -1; | ||||
|                     for (int j = 0; j <= amount; j++) { | ||||
|                         List<Integer> subList = | ||||
|                                 uniqueIdsList.subList(j * packet, Math.min(size, (j + 1) * packet)); | ||||
| @@ -3200,6 +3199,7 @@ public class SQLManager implements AbstractDB { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings({"unchecked", "unused"}) | ||||
|     @Override | ||||
|     public void validateAllPlots(Set<Plot> toValidate) { | ||||
|         if (!isValid()) { | ||||
| @@ -3455,15 +3455,7 @@ public class SQLManager implements AbstractDB { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     private static class UUIDPair { | ||||
|  | ||||
|         public final int id; | ||||
|         public final UUID uuid; | ||||
|  | ||||
|         public UUIDPair(int id, UUID uuid) { | ||||
|             this.id = id; | ||||
|             this.uuid = uuid; | ||||
|         } | ||||
|     private record UUIDPair(int id, UUID uuid) { | ||||
|  | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -40,8 +40,6 @@ import java.util.List; | ||||
|  */ | ||||
| public class PlayerAutoPlotsChosenEvent extends PlotPlayerEvent { | ||||
|  | ||||
|     private Result eventResult; | ||||
|  | ||||
|     private List<Plot> plots; | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -97,8 +97,8 @@ public class HybridGen extends IndependentPlotGenerator { | ||||
|         } | ||||
|         // Coords | ||||
|         Location min = result.getMin(); | ||||
|         int bx = (min.getX()) - hybridPlotWorld.ROAD_OFFSET_X; | ||||
|         int bz = (min.getZ()) - hybridPlotWorld.ROAD_OFFSET_Z; | ||||
|         int bx = min.getX() - hybridPlotWorld.ROAD_OFFSET_X; | ||||
|         int bz = min.getZ() - hybridPlotWorld.ROAD_OFFSET_Z; | ||||
|         // The relative X-coordinate (within the plot) of the minimum X coordinate | ||||
|         // contained in the scoped queue | ||||
|         short relativeOffsetX; | ||||
|   | ||||
| @@ -148,12 +148,22 @@ public class HybridUtils { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             ChunkQueueCoordinator chunk = new ChunkQueueCoordinator(bot, top, false); | ||||
|             ChunkQueueCoordinator chunk = new ChunkQueueCoordinator(worldUtil.getWeWorld(world), bot, top, false); | ||||
|             hpw.getGenerator().generateChunk(chunk, hpw); | ||||
|  | ||||
|             final BlockState airBlock = BlockTypes.AIR.getDefaultState(); | ||||
|             final BlockState[][][] oldBlocks = chunk.getBlocks(); | ||||
|             final BlockState[][][] newBlocks = new BlockState[256][width][length]; | ||||
|             final BlockState airBlock = BlockTypes.AIR.getDefaultState(); | ||||
|             for (final BlockState[][] newBlock : newBlocks) { | ||||
|                 for (final BlockState[] blockStates : newBlock) { | ||||
|                     Arrays.fill(blockStates, airBlock); | ||||
|                 } | ||||
|             } | ||||
|             for (final BlockState[][] oldBlock : oldBlocks) { | ||||
|                 for (final BlockState[] blockStates : oldBlock) { | ||||
|                     Arrays.fill(blockStates, airBlock); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             System.gc(); | ||||
|             System.gc(); | ||||
| @@ -221,9 +231,6 @@ public class HybridUtils { | ||||
|                         for (int y = 0; y < 256; y++) { | ||||
|                             BlockState old = oldBlocks[y][x][z]; | ||||
|                             try { | ||||
|                                 if (old == null) { | ||||
|                                     old = airBlock; | ||||
|                                 } | ||||
|                                 BlockState now = newBlocks[y][x][z]; | ||||
|                                 if (!old.equals(now)) { | ||||
|                                     changes[i]++; | ||||
|   | ||||
| @@ -95,6 +95,7 @@ public abstract class IndependentPlotGenerator { | ||||
|      * @param world ChunkGenerator Implementation | ||||
|      * @return Chunk generator | ||||
|      */ | ||||
|     @SuppressWarnings("unchecked") | ||||
|     public <T> GeneratorWrapper<T> specify(final @NonNull String world) { | ||||
|         return (GeneratorWrapper<T>) PlotSquared.platform().wrapPlotGenerator(world, this); | ||||
|     } | ||||
|   | ||||
| @@ -198,13 +198,7 @@ public class PlotListener { | ||||
|                         final PlotPlayer<?> owner = PlotSquared.platform().playerManager().getPlayerIfExists(uuid); | ||||
|                         if (owner != null && !owner.getUUID().equals(player.getUUID()) && owner.canSee(player)) { | ||||
|                             Caption caption = TranslatableCaption.of("notification.notify_enter"); | ||||
|                             Template playerTemplate = Template.of("player", player.getName()); | ||||
|                             Template plotTemplate = Template.of("plot", plot.getId().toString()); | ||||
|                             if (!Settings.Chat.NOTIFICATION_AS_ACTIONBAR) { | ||||
|                                 owner.sendMessage(caption, playerTemplate, plotTemplate); | ||||
|                             } else { | ||||
|                                 owner.sendActionBar(caption, playerTemplate, plotTemplate); | ||||
|                             } | ||||
|                             notifyPlotOwner(player, plot, owner, caption); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
| @@ -327,7 +321,7 @@ public class PlotListener { | ||||
|                         } | ||||
|                         if ((lastPlot != null) && plot.getId().equals(lastPlot.getId()) && plot.hasOwner()) { | ||||
|                             final UUID plotOwner = plot.getOwnerAbs(); | ||||
|                             String owner = PlayerManager.getName(plotOwner, false); | ||||
|                             String owner = PlayerManager.resolveName(plotOwner, false).getComponent(player); | ||||
|                             Caption header = fromFlag ? StaticCaption.of(title) : TranslatableCaption.of("titles" + | ||||
|                                     ".title_entered_plot"); | ||||
|                             Caption subHeader = fromFlag ? StaticCaption.of(subtitle) : TranslatableCaption.of("titles" + | ||||
| @@ -443,13 +437,7 @@ public class PlotListener { | ||||
|                             final PlotPlayer<?> owner = PlotSquared.platform().playerManager().getPlayerIfExists(uuid); | ||||
|                             if ((owner != null) && !owner.getUUID().equals(player.getUUID()) && owner.canSee(player)) { | ||||
|                                 Caption caption = TranslatableCaption.of("notification.notify_leave"); | ||||
|                                 Template playerTemplate = Template.of("player", player.getName()); | ||||
|                                 Template plotTemplate = Template.of("plot", plot.getId().toString()); | ||||
|                                 if (!Settings.Chat.NOTIFICATION_AS_ACTIONBAR) { | ||||
|                                     owner.sendMessage(caption, playerTemplate, plotTemplate); | ||||
|                                 } else { | ||||
|                                     owner.sendActionBar(caption, playerTemplate, plotTemplate); | ||||
|                                 } | ||||
|                                 notifyPlotOwner(player, plot, owner, caption); | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
| @@ -497,6 +485,17 @@ public class PlotListener { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     private void notifyPlotOwner(final PlotPlayer<?> player, final Plot plot, final PlotPlayer<?> owner, final Caption caption) { | ||||
|         Template playerTemplate = Template.of("player", player.getName()); | ||||
|         Template plotTemplate = Template.of("plot", plot.getId().toString()); | ||||
|         Template areaTemplate = Template.of("area", plot.getArea().toString()); | ||||
|         if (!Settings.Chat.NOTIFICATION_AS_ACTIONBAR) { | ||||
|             owner.sendMessage(caption, playerTemplate, plotTemplate, areaTemplate); | ||||
|         } else { | ||||
|             owner.sendActionBar(caption, playerTemplate, plotTemplate, areaTemplate); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void logout(UUID uuid) { | ||||
|         feedRunnable.remove(uuid); | ||||
|         healRunnable.remove(uuid); | ||||
|   | ||||
| @@ -42,8 +42,6 @@ import com.sk89q.worldedit.world.biome.BiomeType; | ||||
| import com.sk89q.worldedit.world.block.BaseBlock; | ||||
| import com.sk89q.worldedit.world.block.BlockState; | ||||
| import com.sk89q.worldedit.world.block.BlockStateHolder; | ||||
| import org.apache.logging.log4j.LogManager; | ||||
| import org.apache.logging.log4j.Logger; | ||||
| import org.checkerframework.checker.nullness.qual.NonNull; | ||||
|  | ||||
| import java.lang.reflect.Field; | ||||
| @@ -53,8 +51,6 @@ import java.util.Set; | ||||
|  | ||||
| public class ProcessedWEExtent extends AbstractDelegateExtent { | ||||
|  | ||||
|     private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ProcessedWEExtent.class.getSimpleName()); | ||||
|  | ||||
|     private final Set<CuboidRegion> mask; | ||||
|     private final String world; | ||||
|     private final int max; | ||||
| @@ -162,6 +158,7 @@ public class ProcessedWEExtent extends AbstractDelegateExtent { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("deprecation") | ||||
|     @Override | ||||
|     public boolean setBiome(BlockVector2 position, BiomeType biome) { | ||||
|         return WEManager.maskContains(this.mask, position.getX(), position.getZ()) && super | ||||
|   | ||||
| @@ -54,6 +54,7 @@ public class WEExtent extends AbstractDelegateExtent { | ||||
|         this.mask = mask; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("unchecked") | ||||
|     @Override | ||||
|     public boolean setBlock(BlockVector3 location, BlockStateHolder block) | ||||
|             throws WorldEditException { | ||||
|   | ||||
| @@ -53,7 +53,7 @@ public abstract class MetaDataAccess<T> implements AutoCloseable { | ||||
|         this.lockAccess = lockAccess; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("ALL") | ||||
|     @SuppressWarnings("unchecked") | ||||
|     private static <E extends Throwable> void sneakyThrow(final Throwable e) throws E { | ||||
|         throw (E) e; | ||||
|     } | ||||
|   | ||||
| @@ -62,6 +62,7 @@ public final class MetaDataKey<T> { | ||||
|      * @param <T>  Type | ||||
|      * @return MetaData key instance | ||||
|      */ | ||||
|     @SuppressWarnings("unchecked") | ||||
|     public static @NonNull <T> MetaDataKey<T> of(final @NonNull String key, final @NonNull TypeLiteral<T> type) { | ||||
|         synchronized (keyMetaData) { | ||||
|             return (MetaDataKey<T>) | ||||
|   | ||||
| @@ -47,6 +47,7 @@ final class PersistentMetaDataAccess<T> extends MetaDataAccess<T> { | ||||
|         return this.getPlayer().hasPersistentMeta(getMetaDataKey().toString()); | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("unchecked") | ||||
|     @Override | ||||
|     public @Nullable T remove() { | ||||
|         this.checkClosed(); | ||||
|   | ||||
| @@ -104,7 +104,8 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer, | ||||
|     private static final Set<PlotPlayer<?>> debugModeEnabled = | ||||
|             Collections.synchronizedSet(new HashSet<>()); | ||||
|  | ||||
|     private static final Map<Class, PlotPlayerConverter> converters = new HashMap<>(); | ||||
|     @SuppressWarnings("rawtypes") | ||||
|     private static final Map<Class<?>, PlotPlayerConverter> converters = new HashMap<>(); | ||||
|     private final LockRepository lockRepository = new LockRepository(); | ||||
|     private final PlotAreaManager plotAreaManager; | ||||
|     private final EventDispatcher eventDispatcher; | ||||
| @@ -128,6 +129,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer, | ||||
|         this.permissionHandler = permissionHandler; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings({"rawtypes", "unchecked"}) | ||||
|     public static <T> PlotPlayer<T> from(final @NonNull T object) { | ||||
|         // fast path | ||||
|         if (converters.containsKey(object.getClass())) { | ||||
| @@ -234,6 +236,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer, | ||||
|      * @param <T> the object type to return | ||||
|      * @return the value assigned to the key or null if it does not exist | ||||
|      */ | ||||
|     @SuppressWarnings("unchecked") | ||||
|     <T> T getMeta(String key) { | ||||
|         if (this.meta != null) { | ||||
|             return (T) this.meta.get(key); | ||||
| @@ -361,7 +364,6 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer, | ||||
|     } | ||||
|  | ||||
|     public int getClusterCount(String world) { | ||||
|         UUID uuid = getUUID(); | ||||
|         int count = 0; | ||||
|         for (PlotArea area : this.plotAreaManager.getPlotAreasSet(world)) { | ||||
|             for (PlotCluster cluster : area.getClusters()) { | ||||
| @@ -795,16 +797,16 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer, | ||||
|             final @NonNull MetaDataKey<T> key, | ||||
|             final @NonNull T value | ||||
|     ) { | ||||
|         final Object rawValue = value; | ||||
|         if (key.getType().getRawType().equals(Integer.class)) { | ||||
|             this.setPersistentMeta(key.toString(), Ints.toByteArray((int) rawValue)); | ||||
|             this.setPersistentMeta(key.toString(), Ints.toByteArray((int) (Object) value)); | ||||
|         } else if (key.getType().getRawType().equals(Boolean.class)) { | ||||
|             this.setPersistentMeta(key.toString(), ByteArrayUtilities.booleanToBytes((boolean) rawValue)); | ||||
|             this.setPersistentMeta(key.toString(), ByteArrayUtilities.booleanToBytes((boolean) (Object) value)); | ||||
|         } else { | ||||
|             throw new IllegalArgumentException(String.format("Unknown meta data type '%s'", key.getType())); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("unchecked") | ||||
|     @Nullable <T> T getPersistentMeta(final @NonNull MetaDataKey<T> key) { | ||||
|         final byte[] value = this.getPersistentMeta(key.toString()); | ||||
|         if (value == null) { | ||||
|   | ||||
| @@ -47,6 +47,7 @@ final class TemporaryMetaDataAccess<T> extends MetaDataAccess<T> { | ||||
|         return this.getPlayer().getMeta(this.getMetaDataKey().toString()) != null; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("unchecked") | ||||
|     @Override | ||||
|     public @Nullable T remove() { | ||||
|         this.checkClosed(); | ||||
|   | ||||
| @@ -2834,11 +2834,11 @@ public class Plot { | ||||
|                         if (this.isOnline()) { | ||||
|                             seen = TranslatableCaption.of("info.now").getComponent(player); | ||||
|                         } else { | ||||
|                             int time = (int) (ExpireManager.IMP.getAge(this) / 1000); | ||||
|                             int time = (int) (ExpireManager.IMP.getAge(this, false) / 1000); | ||||
|                             if (time != 0) { | ||||
|                                 seen = TimeUtil.secToTime(time); | ||||
|                             } else { | ||||
|                                 seen = TranslatableCaption.of("info.known").getComponent(player); | ||||
|                                 seen = TranslatableCaption.of("info.unknown").getComponent(player); | ||||
|                             } | ||||
|                         } | ||||
|                     } else { | ||||
|   | ||||
| @@ -439,38 +439,6 @@ public abstract class PlotArea { | ||||
|         loadConfiguration(config); | ||||
|     } | ||||
|  | ||||
|     private Component getFlagsComponent(Component flagsComponent, Collection<PlotFlag<?, ?>> flagCollection) { | ||||
|         if (flagCollection.isEmpty()) { | ||||
|             flagsComponent = MINI_MESSAGE.parse(TranslatableCaption.of("flag.no_flags").getComponent(LocaleHolder.console())); | ||||
|         } else { | ||||
|             String prefix = " "; | ||||
|             for (final PlotFlag<?, ?> flag : flagCollection) { | ||||
|                 Object value; | ||||
|                 if (flag instanceof DoubleFlag && !Settings.General.SCIENTIFIC) { | ||||
|                     value = FLAG_DECIMAL_FORMAT.format(flag.getValue()); | ||||
|                 } else { | ||||
|                     value = flag.toString(); | ||||
|                 } | ||||
|                 Component snip = MINI_MESSAGE.parse( | ||||
|                         prefix + CaptionUtility | ||||
|                                 .format( | ||||
|                                         ConsolePlayer.getConsole(), | ||||
|                                         TranslatableCaption.of("info.plot_flag_list").getComponent(LocaleHolder.console()) | ||||
|                                 ), | ||||
|                         Template.of("flag", flag.getName()), | ||||
|                         Template.of("value", CaptionUtility.formatRaw(ConsolePlayer.getConsole(), value.toString())) | ||||
|                 ); | ||||
|                 if (flagsComponent != null) { | ||||
|                     flagsComponent.append(snip); | ||||
|                 } else { | ||||
|                     flagsComponent = snip; | ||||
|                 } | ||||
|                 prefix = ", "; | ||||
|             } | ||||
|         } | ||||
|         return flagsComponent; | ||||
|     } | ||||
|  | ||||
|     public abstract void loadConfiguration(ConfigurationSection config); | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -30,6 +30,7 @@ import com.plotsquared.core.PlotSquared; | ||||
| import com.plotsquared.core.configuration.ConfigurationUtil; | ||||
| import com.plotsquared.core.configuration.Settings; | ||||
| import com.plotsquared.core.configuration.caption.Caption; | ||||
| import com.plotsquared.core.configuration.caption.LocaleHolder; | ||||
| import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||
| import com.plotsquared.core.database.DBFunc; | ||||
| import com.plotsquared.core.events.PlotComponentSetEvent; | ||||
| @@ -358,7 +359,8 @@ public final class PlotModificationManager { | ||||
|         if (createSign) { | ||||
|             queue.setCompleteTask(() -> TaskManager.runTaskAsync(() -> { | ||||
|                 for (Plot current : plots) { | ||||
|                     current.getPlotModificationManager().setSign(PlayerManager.getName(current.getOwnerAbs())); | ||||
|                     current.getPlotModificationManager().setSign(PlayerManager.resolveName(current.getOwnerAbs()).getComponent( | ||||
|                             LocaleHolder.console())); | ||||
|                 } | ||||
|             })); | ||||
|         } | ||||
|   | ||||
| @@ -216,24 +216,20 @@ public class ExpireManager { | ||||
|                 applicable.add(et); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (applicable.isEmpty()) { | ||||
|             return new ArrayList<>(); | ||||
|         } | ||||
|  | ||||
|         // Don't delete server plots | ||||
|         if (plot.getFlag(ServerPlotFlag.class)) { | ||||
|             return new ArrayList<>(); | ||||
|         } | ||||
|  | ||||
|         long diff = getAge(plot); | ||||
|         if (diff == 0) { | ||||
|             return new ArrayList<>(); | ||||
|         } | ||||
|         // Filter out non old plots | ||||
|         boolean shouldCheckAccountAge = false; | ||||
|         for (int i = 0; i < applicable.size(); i++) { | ||||
|             ExpiryTask et = applicable.poll(); | ||||
|             if (et.applies(diff)) { | ||||
|             if (et.applies(getAge(plot, et.shouldDeleteForUnknownOwner()))) { | ||||
|                 applicable.add(et); | ||||
|                 shouldCheckAccountAge |= et.getSettings().SKIP_ACCOUNT_AGE_DAYS != -1; | ||||
|             } | ||||
| @@ -243,9 +239,9 @@ public class ExpireManager { | ||||
|         } | ||||
|         // Check account age | ||||
|         if (shouldCheckAccountAge) { | ||||
|             long accountAge = getAge(plot); | ||||
|             for (int i = 0; i < applicable.size(); i++) { | ||||
|                 ExpiryTask et = applicable.poll(); | ||||
|                 long accountAge = getAge(plot, et.shouldDeleteForUnknownOwner()); | ||||
|                 if (et.appliesAccountAge(accountAge)) { | ||||
|                     applicable.add(et); | ||||
|                 } | ||||
| @@ -309,9 +305,8 @@ public class ExpireManager { | ||||
|             return false; | ||||
|         } | ||||
|         this.running = 2; | ||||
|         final ConcurrentLinkedDeque<Plot> plots = | ||||
|                 new ConcurrentLinkedDeque<>(PlotQuery.newQuery().allPlots().asList()); | ||||
|         TaskManager.runTaskAsync(new Runnable() { | ||||
|             private ConcurrentLinkedDeque<Plot> plots = null; | ||||
|             @Override | ||||
|             public void run() { | ||||
|                 final Runnable task = this; | ||||
| @@ -319,7 +314,9 @@ public class ExpireManager { | ||||
|                     ExpireManager.this.running = 0; | ||||
|                     return; | ||||
|                 } | ||||
|                 long start = System.currentTimeMillis(); | ||||
|                 if (plots == null) { | ||||
|                     plots = new ConcurrentLinkedDeque<>(PlotQuery.newQuery().allPlots().asList()); | ||||
|                 } | ||||
|                 while (!plots.isEmpty()) { | ||||
|                     if (ExpireManager.this.running != 2) { | ||||
|                         ExpireManager.this.running = 0; | ||||
| @@ -454,7 +451,20 @@ public class ExpireManager { | ||||
|         plot.getPlotModificationManager().deletePlot(null, whenDone); | ||||
|     } | ||||
|  | ||||
|     @Deprecated(forRemoval = true, since = "TODO") | ||||
|     public long getAge(UUID uuid) { | ||||
|         return getAge(uuid, false); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the age (last play time) of the passed player | ||||
|      * | ||||
|      * @param uuid                     the uuid of the owner to check against | ||||
|      * @param shouldDeleteUnknownOwner {@code true} if an unknown player should be counted as never online | ||||
|      * @return the millis since the player was last online, or {@link Long#MAX_VALUE} if player was never online | ||||
|      * @since TODO | ||||
|      */ | ||||
|     public long getAge(UUID uuid, final boolean shouldDeleteUnknownOwner) { | ||||
|         if (PlotSquared.platform().playerManager().getPlayerIfExists(uuid) != null) { | ||||
|             return 0; | ||||
|         } | ||||
| @@ -464,7 +474,7 @@ public class ExpireManager { | ||||
|             if (opp != null && (last = opp.getLastPlayed()) != 0) { | ||||
|                 this.dates_cache.put(uuid, last); | ||||
|             } else { | ||||
|                 return 0; | ||||
|                 return shouldDeleteUnknownOwner ? Long.MAX_VALUE : 0; | ||||
|             } | ||||
|         } | ||||
|         if (last == 0) { | ||||
| @@ -473,7 +483,7 @@ public class ExpireManager { | ||||
|         return System.currentTimeMillis() - last; | ||||
|     } | ||||
|  | ||||
|     public long getAge(Plot plot) { | ||||
|     public long getAge(Plot plot, final boolean shouldDeleteUnknownOwner) { | ||||
|         if (!plot.hasOwner() || Objects.equals(DBFunc.EVERYONE, plot.getOwner()) | ||||
|                 || PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwner()) != null || plot.getRunning() > 0) { | ||||
|             return 0; | ||||
| @@ -495,7 +505,7 @@ public class ExpireManager { | ||||
|         } | ||||
|         long min = Long.MAX_VALUE; | ||||
|         for (UUID owner : plot.getOwners()) { | ||||
|             long age = getAge(owner); | ||||
|             long age = getAge(owner, shouldDeleteUnknownOwner); | ||||
|             if (age < min) { | ||||
|                 min = age; | ||||
|             } | ||||
|   | ||||
| @@ -80,7 +80,7 @@ public class ExpiryTask { | ||||
|                         diff = settings.REQUIRED_PLOTS - plots.size(); | ||||
|                     } | ||||
|                     List<Long> entireList = | ||||
|                             plots.stream().map(plot -> ExpireManager.IMP.getAge(plot)) | ||||
|                             plots.stream().map(plot -> ExpireManager.IMP.getAge(plot, settings.DELETE_IF_OWNER_IS_UNKNOWN)) | ||||
|                                     .collect(Collectors.toList()); | ||||
|                     List<Long> top = new ArrayList<>(diff + 1); | ||||
|                     if (diff > 1000) { | ||||
| @@ -157,5 +157,13 @@ public class ExpiryTask { | ||||
|         return settings.CONFIRMATION; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns {@code true} if this task respects unknown owners | ||||
|      * @return {@code true} if unknown owners should be counted as never online | ||||
|      * @since TODO | ||||
|      */ | ||||
|     public boolean shouldDeleteForUnknownOwner() { | ||||
|         return settings.DELETE_IF_OWNER_IS_UNKNOWN; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -558,6 +558,7 @@ public class PlotAnalysis { | ||||
|         return ranks; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("unchecked") | ||||
|     public static void sort(int[] input) { | ||||
|         int SIZE = 10; | ||||
|         List<Integer>[] bucket = new ArrayList[SIZE]; | ||||
|   | ||||
| @@ -96,7 +96,7 @@ public class FlagContainer { | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Cast a plot flag with wildcard parameters into a parametrisized | ||||
|      * Cast a plot flag with wildcard parameters into a parametrized | ||||
|      * PlotFlag. This is an unsafe operation, and should only be performed | ||||
|      * if the generic parameters are known beforehand. | ||||
|      * | ||||
| @@ -105,7 +105,7 @@ public class FlagContainer { | ||||
|      * @param <T>  Flag type | ||||
|      * @return Casted flag | ||||
|      */ | ||||
|     @SuppressWarnings("ALL") | ||||
|     @SuppressWarnings("unchecked") | ||||
|     public static <V, T extends PlotFlag<V, ?>> T castUnsafe( | ||||
|             final PlotFlag<?, ?> flag | ||||
|     ) { | ||||
| @@ -181,6 +181,7 @@ public class FlagContainer { | ||||
|      * @param <V>  flag value type | ||||
|      * @return value of flag removed | ||||
|      */ | ||||
|     @SuppressWarnings("unchecked") | ||||
|     public <V, T extends PlotFlag<V, ?>> V removeFlag(final T flag) { | ||||
|         final Object value = this.flagMap.remove(flag.getClass()); | ||||
|         if (this.plotFlagUpdateHandler != null) { | ||||
|   | ||||
| @@ -29,6 +29,7 @@ import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||
| import com.plotsquared.core.plot.PlotTitle; | ||||
| import com.plotsquared.core.plot.flag.FlagParseException; | ||||
| import com.plotsquared.core.plot.flag.PlotFlag; | ||||
| import com.plotsquared.core.util.StringMan; | ||||
| import org.checkerframework.checker.nullness.qual.NonNull; | ||||
|  | ||||
| public class PlotTitleFlag extends PlotFlag<PlotTitle, PlotTitleFlag> { | ||||
| @@ -56,17 +57,18 @@ public class PlotTitleFlag extends PlotFlag<PlotTitle, PlotTitleFlag> { | ||||
|         if (!input.contains("\"")) { | ||||
|             return new PlotTitleFlag(new PlotTitle(input, "")); | ||||
|         } | ||||
|         input = input.substring(input.indexOf("\"")); | ||||
|         input = input.substring(0, input.lastIndexOf("\"") + 1); | ||||
|         String[] inputs = input.split("\""); | ||||
|         PlotTitle value; | ||||
|         if (inputs.length == 2) { | ||||
|             value = new PlotTitle(inputs[1], ""); | ||||
|         } else if (inputs.length > 3) { | ||||
|             value = new PlotTitle(inputs[1], inputs[3]); | ||||
|         } else { | ||||
|  | ||||
|         var split = StringMan.splitMessage(input); | ||||
|  | ||||
|         if (split.isEmpty() || split.size() > 2) { | ||||
|             throw new FlagParseException(this, input, TranslatableCaption.of("flags.flag_error_title")); | ||||
|         } | ||||
|         PlotTitle value; | ||||
|         if (split.size() == 1) { | ||||
|             value = new PlotTitle(split.get(0), ""); | ||||
|         } else { | ||||
|             value = new PlotTitle(split.get(0), split.get(1)); | ||||
|         } | ||||
|         return new PlotTitleFlag(value); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -57,7 +57,9 @@ import java.nio.file.Files; | ||||
|  | ||||
| public class SinglePlotArea extends GridPlotWorld { | ||||
|  | ||||
|     @SuppressWarnings({"unused", "FieldCanBeLocal"}) | ||||
|     private final EventDispatcher eventDispatcher; | ||||
|     @SuppressWarnings({"unused", "FieldCanBeLocal"}) | ||||
|     private final PlotListener plotListener; | ||||
|     public boolean VOID = false; | ||||
|  | ||||
| @@ -273,6 +275,7 @@ public class SinglePlotArea extends GridPlotWorld { | ||||
|         return false; // do not create signs for single plots | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("deprecation") | ||||
|     protected Plot adapt(Plot p) { | ||||
|         if (p instanceof SinglePlot) { | ||||
|             return p; | ||||
|   | ||||
| @@ -57,7 +57,6 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator { | ||||
|     private final ConcurrentHashMap<BlockVector2, LocalChunk> blockChunks = new ConcurrentHashMap<>(); | ||||
|     private final List<BlockVector2> readRegion = new ArrayList<>(); | ||||
|     private final List<ProgressSubscriber> progressSubscribers = new ArrayList<>(); | ||||
|     private long modified; | ||||
|     private LocalChunk lastWrappedChunk; | ||||
|     private int lastX = Integer.MIN_VALUE; | ||||
|     private int lastZ = Integer.MIN_VALUE; | ||||
| @@ -76,7 +75,6 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator { | ||||
|     public BasicQueueCoordinator(@NonNull World world) { | ||||
|         super(world); | ||||
|         this.world = world; | ||||
|         this.modified = System.currentTimeMillis(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -94,7 +92,6 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator { | ||||
|  | ||||
|     @Override | ||||
|     public final void setModified(long modified) { | ||||
|         this.modified = modified; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -120,6 +117,7 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator { | ||||
|         return setBlock(x, y, z, id.toBaseBlock()); | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("removal") | ||||
|     @Override | ||||
|     public boolean setBiome(int x, int z, @NonNull BiomeType biomeType) { | ||||
|         LocalChunk chunk = getChunk(x >> 4, z >> 4); | ||||
|   | ||||
| @@ -46,13 +46,20 @@ public class ChunkQueueCoordinator extends ScopedQueueCoordinator { | ||||
|     private final int length; | ||||
|     private final BlockVector3 bot; | ||||
|     private final BlockVector3 top; | ||||
|     private final World weWorld; | ||||
|  | ||||
|     public ChunkQueueCoordinator(@NonNull BlockVector3 bot, @NonNull BlockVector3 top, boolean biomes) { | ||||
|     public ChunkQueueCoordinator( | ||||
|             final @NonNull World weWorld, | ||||
|             @NonNull BlockVector3 bot, | ||||
|             @NonNull BlockVector3 top, | ||||
|             boolean biomes | ||||
|     ) { | ||||
|         super(null, Location.at("", 0, 0, 0), Location.at("", 15, 255, 15)); | ||||
|         this.weWorld = weWorld; | ||||
|         this.width = top.getX() - bot.getX() + 1; | ||||
|         this.length = top.getZ() - bot.getZ() + 1; | ||||
|         this.result = new BlockState[256][][]; | ||||
|         this.biomeResult = biomes ? new BiomeType[256][][] : null; | ||||
|         this.result = new BlockState[256][width][length]; | ||||
|         this.biomeResult = biomes ? new BiomeType[256][width][length] : null; | ||||
|         this.bot = bot; | ||||
|         this.top = top; | ||||
|     } | ||||
| @@ -137,7 +144,7 @@ public class ChunkQueueCoordinator extends ScopedQueueCoordinator { | ||||
|  | ||||
|     @Override | ||||
|     public @Nullable World getWorld() { | ||||
|         return super.getWorld(); | ||||
|         return weWorld; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|   | ||||
| @@ -56,6 +56,7 @@ public abstract class QueueCoordinator { | ||||
|     private Object chunkObject; | ||||
|     private final AtomicBoolean enqueued = new AtomicBoolean(); | ||||
|  | ||||
|     @SuppressWarnings({"unused", "FieldCanBeLocal"}) | ||||
|     @Inject | ||||
|     private GlobalBlockQueue blockQueue; | ||||
|  | ||||
|   | ||||
| @@ -34,6 +34,7 @@ import java.util.function.Consumer; | ||||
| /** | ||||
|  * A repository for keyed {@link java.util.concurrent.locks.Lock locks} | ||||
|  */ | ||||
| @SuppressWarnings("UnstableApiUsage") | ||||
| public final class LockRepository { | ||||
|  | ||||
|     private final Striped<Lock> striped; | ||||
|   | ||||
| @@ -90,7 +90,7 @@ public final class BlockUtil { | ||||
|         if (id.length() == 1 && id.charAt(0) == '*') { | ||||
|             return FuzzyBlockState.builder().type(BlockTypes.AIR).build(); | ||||
|         } | ||||
|         String mutableId = id; | ||||
|         String mutableId; | ||||
|         mutableId = id.toLowerCase(); | ||||
|         BlockType type = BlockTypes.get(mutableId); | ||||
|         if (type != null) { | ||||
|   | ||||
| @@ -73,6 +73,7 @@ public class EntityUtil { | ||||
|         return i; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("unchecked") | ||||
|     public static boolean checkEntity(Plot plot, PlotFlag<Integer, ?>... flags) { | ||||
|         if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { | ||||
|             return true; | ||||
|   | ||||
| @@ -27,7 +27,9 @@ package com.plotsquared.core.util; | ||||
|  | ||||
| import com.plotsquared.core.PlotSquared; | ||||
| import com.plotsquared.core.configuration.Settings; | ||||
| import com.plotsquared.core.configuration.caption.Caption; | ||||
| import com.plotsquared.core.configuration.caption.LocaleHolder; | ||||
| import com.plotsquared.core.configuration.caption.StaticCaption; | ||||
| import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||
| import com.plotsquared.core.database.DBFunc; | ||||
| import com.plotsquared.core.player.ConsolePlayer; | ||||
| @@ -162,7 +164,9 @@ public abstract class PlayerManager<P extends PlotPlayer<? extends T>, T> { | ||||
|      * | ||||
|      * @param owner Owner UUID | ||||
|      * @return The player's name, None, Everyone or Unknown | ||||
|      * @deprecated Use {@link #resolveName(UUID)} | ||||
|      */ | ||||
|     @Deprecated(forRemoval = true, since = "TODO") | ||||
|     public static @NonNull String getName(final @Nullable UUID owner) { | ||||
|         return getName(owner, true); | ||||
|     } | ||||
| @@ -173,7 +177,9 @@ public abstract class PlayerManager<P extends PlotPlayer<? extends T>, T> { | ||||
|      * @param owner    Owner UUID | ||||
|      * @param blocking Whether or not the operation can be blocking | ||||
|      * @return The player's name, None, Everyone or Unknown | ||||
|      * @deprecated Use {@link #resolveName(UUID, boolean)} | ||||
|      */ | ||||
|     @Deprecated(forRemoval = true, since = "TODO") | ||||
|     public static @NonNull String getName(final @Nullable UUID owner, final boolean blocking) { | ||||
|         if (owner == null) { | ||||
|             TranslatableCaption.of("info.none"); | ||||
| @@ -203,6 +209,57 @@ public abstract class PlayerManager<P extends PlotPlayer<? extends T>, T> { | ||||
|         return name; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Attempts to resolve the username by an uuid | ||||
|      * <p> | ||||
|      * <b>Note:</b> blocks the thread until the name was resolved or failed | ||||
|      * | ||||
|      * @param owner The UUID of the owner | ||||
|      * @return A caption containing either the name, {@code None}, {@code Everyone} or {@code Unknown} | ||||
|      * @see #resolveName(UUID, boolean) | ||||
|      * @since TODO | ||||
|      */ | ||||
|     public static @NonNull Caption resolveName(final @Nullable UUID owner) { | ||||
|         return resolveName(owner, true); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Attempts to resolve the username by an uuid | ||||
|      * | ||||
|      * @param owner    The UUID of the owner | ||||
|      * @param blocking If the operation should block the current thread for {@link Settings.UUID#BLOCKING_TIMEOUT} milliseconds | ||||
|      * @return A caption containing either the name, {@code None}, {@code Everyone} or {@code Unknown} | ||||
|      * @since TODO | ||||
|      */ | ||||
|     public static @NonNull Caption resolveName(final @Nullable UUID owner, final boolean blocking) { | ||||
|         if (owner == null) { | ||||
|             return TranslatableCaption.of("info.none"); | ||||
|         } | ||||
|         if (owner.equals(DBFunc.EVERYONE)) { | ||||
|             return TranslatableCaption.of("info.everyone"); | ||||
|         } | ||||
|         if (owner.equals(DBFunc.SERVER)) { | ||||
|             return TranslatableCaption.of("info.server"); | ||||
|         } | ||||
|         final String name; | ||||
|         if (blocking) { | ||||
|             name = PlotSquared.get().getImpromptuUUIDPipeline() | ||||
|                     .getSingle(owner, Settings.UUID.BLOCKING_TIMEOUT); | ||||
|         } else { | ||||
|             final UUIDMapping uuidMapping = | ||||
|                     PlotSquared.get().getImpromptuUUIDPipeline().getImmediately(owner); | ||||
|             if (uuidMapping != null) { | ||||
|                 name = uuidMapping.getUsername(); | ||||
|             } else { | ||||
|                 name = null; | ||||
|             } | ||||
|         } | ||||
|         if (name == null) { | ||||
|             return TranslatableCaption.of("info.unknown"); | ||||
|         } | ||||
|         return StaticCaption.of(name); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove a player from the player map | ||||
|      * | ||||
|   | ||||
| @@ -289,7 +289,7 @@ public abstract class RegionManager { | ||||
|                 true | ||||
|         ); | ||||
|  | ||||
|         toQueue2.setCompleteTask(whenDone::run); | ||||
|         toQueue2.setCompleteTask(whenDone); | ||||
|         if (actor != null && Settings.QUEUE.NOTIFY_PROGRESS) { | ||||
|             toQueue2.addProgressSubscriber(subscriberFactory.createFull( | ||||
|                     actor, | ||||
|   | ||||
| @@ -59,6 +59,7 @@ public class StringComparison<T> { | ||||
|         this(input, objects, Object::toString); | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("unchecked") | ||||
|     public StringComparison(String input, Collection<T> objects, Function<T, String> toString) { | ||||
|         this(input, (T[]) objects.toArray(), toString); | ||||
|     } | ||||
|   | ||||
| @@ -30,16 +30,21 @@ import com.plotsquared.core.configuration.caption.Caption; | ||||
| import org.checkerframework.checker.nullness.qual.NonNull; | ||||
|  | ||||
| import java.lang.reflect.Array; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.Collection; | ||||
| import java.util.Comparator; | ||||
| import java.util.Iterator; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Map.Entry; | ||||
| import java.util.Set; | ||||
| import java.util.regex.Pattern; | ||||
|  | ||||
| public class StringMan { | ||||
|  | ||||
|     private static final Pattern STRING_SPLIT_PATTERN = Pattern.compile("(?<quoted>\"[\\w ]+\")|(?<single>\\w+)"); | ||||
|  | ||||
|     public static String replaceFromMap(String string, Map<String, String> replacements) { | ||||
|         StringBuilder sb = new StringBuilder(string); | ||||
|         int size = string.length(); | ||||
| @@ -286,7 +291,7 @@ public class StringMan { | ||||
|     } | ||||
|  | ||||
|     public static boolean isEqualIgnoreCase(String a, String b) { | ||||
|         return (a.equals(b)) || ((a != null) && (b != null) && (a.length() == b.length()) && a | ||||
|         return a.equals(b) || ((a != null) && (b != null) && (a.length() == b.length()) && a | ||||
|                 .equalsIgnoreCase(b)); | ||||
|     } | ||||
|  | ||||
| @@ -320,4 +325,46 @@ public class StringMan { | ||||
|         return col; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param message an input string | ||||
|      * @return a list of strings | ||||
|      * @since TODO | ||||
|      * | ||||
|      *         <table border="1"> | ||||
|      *         <caption>Converts multiple quoted and single strings into a list of strings</caption> | ||||
|      *         <thead> | ||||
|      *           <tr> | ||||
|      *             <th>Input</th> | ||||
|      *             <th>Output</th> | ||||
|      *           </tr> | ||||
|      *         </thead> | ||||
|      *         <tbody> | ||||
|      *           <tr> | ||||
|      *             <td>title "sub title"</td> | ||||
|      *             <td>["title", "sub title"]</td> | ||||
|      *           </tr> | ||||
|      *           <tr> | ||||
|      *             <td>"a title" subtitle</td> | ||||
|      *             <td>["a title", "subtitle"]</td> | ||||
|      *           </tr> | ||||
|      *           <tr> | ||||
|      *             <td>"title" "subtitle"</td> | ||||
|      *             <td>["title", "subtitle"]</td> | ||||
|      *           </tr> | ||||
|      *           <tr> | ||||
|      *             <td>"PlotSquared is going well" the authors "and many contributors"</td> | ||||
|      *             <td>["PlotSquared is going well", "the", "authors", "and many contributors"]</td> | ||||
|      *           </tr> | ||||
|      *         </tbody> | ||||
|      *         </table> | ||||
|      */ | ||||
|     public static @NonNull List<String> splitMessage(@NonNull String message) { | ||||
|         var matcher = StringMan.STRING_SPLIT_PATTERN.matcher(message); | ||||
|         List<String> splitMessages = new ArrayList<>(); | ||||
|         while (matcher.find()) { | ||||
|             splitMessages.add(matcher.group(0).replaceAll("\"", "")); | ||||
|         } | ||||
|         return splitMessages; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -265,6 +265,7 @@ public final class TabCompletions { | ||||
|      * @return List of completions | ||||
|      * @deprecated In favor {@link #completePlayers(String, PlotPlayer, String, List, Predicate)} | ||||
|      */ | ||||
|     @SuppressWarnings("unused") | ||||
|     @Deprecated(forRemoval = true) | ||||
|     private static List<Command> completePlayers( | ||||
|             final @NonNull String cacheIdentifier, | ||||
|   | ||||
| @@ -109,7 +109,7 @@ public class WEManager { | ||||
|                 plot = metaDataAccess.get().orElse(null); | ||||
|             } | ||||
|             if (plot != null && (!Settings.Done.RESTRICT_BUILDING || !DoneFlag.isDone(plot)) && ( | ||||
|                     (allowMember && plot.isAdded(uuid)) || (!allowMember && (plot.isOwner(uuid)) || plot | ||||
|                     (allowMember && plot.isAdded(uuid)) || (!allowMember && plot.isOwner(uuid) || plot | ||||
|                             .getTrusted().contains(uuid))) && !plot.getFlag(NoWorldeditFlag.class)) { | ||||
|                 for (CuboidRegion region : plot.getRegions()) { | ||||
|                     BlockVector3 pos1 = region.getMinimumPoint().withY(area.getMinBuildHeight()); | ||||
|   | ||||
| @@ -116,7 +116,7 @@ public final class PlaceholderRegistry { | ||||
|             } | ||||
|  | ||||
|             try { | ||||
|                 return PlayerManager.getName(plotOwner, false); | ||||
|                 return PlayerManager.resolveName(plotOwner, false).getComponent(player); | ||||
|             } catch (final Exception ignored) { | ||||
|             } | ||||
|             return legacyComponent(TranslatableCaption.of("info.unknown"), player); | ||||
|   | ||||
| @@ -60,8 +60,8 @@ | ||||
|   "worldedit.worldedit_bypassed": "<prefix><gray>Currently bypassing WorldEdit restriction.</gray>", | ||||
|   "gamemode.gamemode_was_bypassed": "<prefix><gold>You bypassed the gamemode (</gold><gray><gamemode></gray><gold>) <gold>set for </gold><gray><plot>.</gray>", | ||||
|   "height.height_limit": "<prefix><gold>This plot area has building height limits: Min height: </gold><gray><minHeight></gray><gold>, Max height: </gold><gray><maxHeight></gray>", | ||||
|   "notification.notify_enter": "<prefix><gray><player> entered your plot (</gray><gold><plot></gold><gray>).</gray>", | ||||
|   "notification.notify_leave": "<prefix><gray><player> left your plot (</gray><gold><plot></gold><gray>).</gray>", | ||||
|   "notification.notify_enter": "<prefix><gray><player> entered your plot (</gray><gold><area>;<plot></gold><gray>).</gray>", | ||||
|   "notification.notify_leave": "<prefix><gray><player> left your plot (</gray><gold><area>;<plot></gold><gray>).</gray>", | ||||
|   "swap.swap_overlap": "<prefix><red>The proposed areas are not allowed to overlap.</red>", | ||||
|   "swap.swap_success": "<prefix><dark_aqua>Successfully swapped plots</dark_aqua> <gold><origin></gold><dark_aqua> -> </dark_aqua><gold><target></gold>", | ||||
|   "swap.swap_merged": "<prefix><red>Merged plots may not be swapped. Please unmerge the plots before performing the swap.</red>", | ||||
|   | ||||
| @@ -25,9 +25,12 @@ | ||||
|  */ | ||||
| package com.plotsquared.core.plot; | ||||
|  | ||||
| import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||
| import com.plotsquared.core.database.AbstractDBTest; | ||||
| import com.plotsquared.core.database.DBFunc; | ||||
| import com.plotsquared.core.plot.flag.FlagParseException; | ||||
| import com.plotsquared.core.plot.flag.PlotFlag; | ||||
| import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag; | ||||
| import com.plotsquared.core.plot.flag.implementations.UseFlag; | ||||
| import com.sk89q.worldedit.world.item.ItemType; | ||||
| import org.apache.logging.log4j.LogManager; | ||||
| @@ -74,4 +77,62 @@ public class FlagTest { | ||||
|         Assertions.assertEquals("use", flagName); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldSuccessfullyParseTitleFlagWithTitleSingularAndSubTitleEmpty() { | ||||
|         Assertions.assertDoesNotThrow(() -> { | ||||
|             var title = PlotTitleFlag.TITLE_FLAG_DEFAULT.parse("\"test\" \"\"").getValue(); | ||||
|             Assertions.assertEquals("test", title.title()); | ||||
|             Assertions.assertEquals("", title.subtitle()); | ||||
|         }, "Should not throw a FlagParseException"); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldSuccessfullyParseTitleFlagWithTitleMultipleWordsAndSubTitleEmpty() { | ||||
|         Assertions.assertDoesNotThrow(() -> { | ||||
|             var title = PlotTitleFlag.TITLE_FLAG_DEFAULT.parse("\"test hello test\" \"\"").getValue(); | ||||
|             Assertions.assertEquals("test hello test", title.title()); | ||||
|             Assertions.assertEquals("", title.subtitle()); | ||||
|         }, "Should not throw a FlagParseException"); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldSuccessfullyParseTitleFlagWithTitleMultipleWordsAndSubTitleMultipleWords() { | ||||
|         Assertions.assertDoesNotThrow(() -> { | ||||
|             var title = PlotTitleFlag.TITLE_FLAG_DEFAULT.parse("\"test hello test\" \"a very long subtitle\"").getValue(); | ||||
|             Assertions.assertEquals("test hello test", title.title()); | ||||
|             Assertions.assertEquals("a very long subtitle", title.subtitle()); | ||||
|         }, "Should not throw a FlagParseException"); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldSuccessfullyParseTitleFlagWithTitleEmptyAndSubTitleSingleWord() { | ||||
|         Assertions.assertDoesNotThrow(() -> { | ||||
|             var title = PlotTitleFlag.TITLE_FLAG_DEFAULT.parse("\"\" \"single\"").getValue(); | ||||
|             Assertions.assertEquals(" ", title.title()); | ||||
|             Assertions.assertEquals("single", title.subtitle()); | ||||
|         }, "Should not throw a FlagParseException"); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldExtractTitleWhenASingleDoubleQuoteAtEndOfTitle() { | ||||
|         Assertions.assertDoesNotThrow(() -> { | ||||
|             var plotTitle = PlotTitleFlag.TITLE_FLAG_DEFAULT.parse("title\"").getValue(); | ||||
|             Assertions.assertEquals("title", plotTitle.title()); | ||||
|             Assertions.assertEquals("", plotTitle.subtitle()); | ||||
|         }, "Should not throw a FlagParseException"); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void shouldThrowFlagParseExceptionWithQuotesGreater4() { | ||||
|         var exception = Assertions.assertThrows( | ||||
|                 FlagParseException.class, | ||||
|                 () -> PlotTitleFlag.TITLE_FLAG_DEFAULT.parse("\"title\" \"subtitle\" \"more\""), | ||||
|                 "Needs to throw a FlagParseException" | ||||
|         ); | ||||
|         Assertions.assertTrue(exception.getErrorMessage() instanceof TranslatableCaption); | ||||
|         Assertions.assertEquals( | ||||
|                 "flags.flag_error_title", | ||||
|                 ((TranslatableCaption) exception.getErrorMessage()).getKey() | ||||
|         ); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,61 @@ | ||||
| /* | ||||
|  *       _____  _       _    _____                                _ | ||||
|  *      |  __ \| |     | |  / ____|                              | | | ||||
|  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | | ||||
|  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | | ||||
|  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | | ||||
|  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| | ||||
|  *                                    | | | ||||
|  *                                    |_| | ||||
|  *            PlotSquared plot management system for Minecraft | ||||
|  *               Copyright (C) 2014 - 2022 IntellectualSites | ||||
|  * | ||||
|  *     This program is free software: you can redistribute it and/or modify | ||||
|  *     it under the terms of the GNU General Public License as published by | ||||
|  *     the Free Software Foundation, either version 3 of the License, or | ||||
|  *     (at your option) any later version. | ||||
|  * | ||||
|  *     This program is distributed in the hope that it will be useful, | ||||
|  *     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  *     GNU General Public License for more details. | ||||
|  * | ||||
|  *     You should have received a copy of the GNU General Public License | ||||
|  *     along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| package com.plotsquared.core.util; | ||||
|  | ||||
| import org.junit.jupiter.api.Assertions; | ||||
| import org.junit.jupiter.api.Test; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| public class StringManTest { | ||||
|  | ||||
|     @Test | ||||
|     public void ensureThatAllVariationsHasTheExpectedOutcome() { | ||||
|  | ||||
|         List<Message> messages = List.of( | ||||
|                 new Message("title", List.of("title")), | ||||
|                 new Message("title \"sub title\"", List.of("title", "sub title")), | ||||
|                 new Message("\"a title\" subtitle", List.of("a title", "subtitle")), | ||||
|                 new Message("\"title\" \"subtitle\"", List.of("title", "subtitle")) | ||||
|         ); | ||||
|  | ||||
|         for (Message message : messages) { | ||||
|             var messageList = StringMan.splitMessage(message.input); | ||||
|  | ||||
|             Assertions.assertEquals(message.expected.size(), messageList.size()); | ||||
|             if (message.expected.size() > 0) { | ||||
|                 Assertions.assertEquals(message.expected.get(0), messageList.get(0)); | ||||
|             } | ||||
|             if (message.expected.size() > 1) { | ||||
|                 Assertions.assertEquals(message.expected.get(1), messageList.get(1)); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private record Message(String input, List<String> expected) { | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -77,7 +77,7 @@ allprojects { | ||||
|     } | ||||
|  | ||||
|     tasks.compileJava.configure { | ||||
|         options.release.set(16) | ||||
|         options.release.set(17) | ||||
|     } | ||||
|  | ||||
|     configurations.all { | ||||
|   | ||||
| @@ -18,7 +18,7 @@ adventure-platform-bukkit = "4.0.1" | ||||
|  | ||||
| # Plugins | ||||
| worldedit = "7.2.8" | ||||
| fawe = "2.0.0-SNAPSHOT" | ||||
| fawe = "2.0.0" | ||||
| vault = "1.7.1" | ||||
| placeholderapi = "2.11.1" | ||||
| luckperms = "5.3" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user