Compare commits

...

7 Commits

Author SHA1 Message Date
12463dbb1c refactor!: Align plugin's java version with API java version 2022-01-24 15:16:10 +01:00
6a5859ee0f build: Update release-drafter/release-drafter action to v5.17.6 (#3467)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-01-24 11:06:27 +01:00
59e0b4b67a feat: unknown owner(s) for plot expiry (#3452)
* feat: unknown owner(s) for plot expiry

* Sort plugins on `/plot debugpaste` alphabetically (#3447)

* feat: Sort plugins on debugpaste alphabetically

* Put (F[A])WE at the top

* feat: Add 1.18's music disc additions to `/plot music` (#3446)

* refactor: Prepare removal of our maven repository (#3451)

* Allow restoration of road schematic height calculation behaviour from pre 6.1.4 (#3444)

* refactor: Update SquirrelID GAV

* build: Release 6.3.0

* build: Back to snapshot for development

* fix: fallback method in BukkitQueueCoordinator uses world coordinates

* mark since tags as TODO

* fix: get the lowest diff for plot age

* fix: initialize with high value and better readability

* fix: no need for multiple age checks

* fix: address exceptions in plot analysis

* chore: address requested changes

* chore: Fix introduced violations

Co-authored-by: Alex <mc.cache@web.de>
Co-authored-by: Jordan <dordsor21@gmail.com>
2022-01-23 10:44:11 +01:00
5fc153d896 fix: PlayerInteractEvent does not necessarily interact with a block (#3463) 2022-01-22 17:25:41 +01:00
a003836dbc feat: plot-title flag value should allow single values (#3410) 2022-01-22 11:02:08 +01:00
42bf413528 chore: Address more violations 2022-01-20 21:01:38 +01:00
827f46566c draft: Address false positives in code style issues (#3461)
* chore: Address false positive code style issues

* chore: More work

* More work
2022-01-20 12:39:40 +01:00
69 changed files with 340 additions and 188 deletions

View File

@ -13,6 +13,6 @@ jobs:
update_release_draft: update_release_draft:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: release-drafter/release-drafter@v5.17.5 - uses: release-drafter/release-drafter@v5.17.6
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

4
.lift.toml Normal file
View 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"]

View File

@ -218,6 +218,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
private PlatformWorldManager<World> worldManager; private PlatformWorldManager<World> worldManager;
private Locale serverLocale; private Locale serverLocale;
@SuppressWarnings("StringSplitter")
@Override @Override
public int @NonNull [] serverVersion() { public int @NonNull [] serverVersion() {
if (this.version == null) { if (this.version == null) {
@ -323,8 +324,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
// Comments // Comments
CommentManager.registerDefaultInboxes(); CommentManager.registerDefaultInboxes();
plotSquared.startExpiryTasks();
// Do stuff that was previously done in PlotSquared // Do stuff that was previously done in PlotSquared
// Kill entities // Kill entities
if (Settings.Enabled_Components.KILL_ROAD_MOBS || Settings.Enabled_Components.KILL_ROAD_VEHICLES) { 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)); }, TaskTime.ticks(1L));
} }
plotSquared.startExpiryTasks();
// Once the server has loaded force updating all generators known to P2 // Once the server has loaded force updating all generators known to P2
TaskManager.runTaskLater(() -> PlotSquared.platform().setupUtils().updateGenerators(true), TaskTime.ticks(1L)); 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(); iterator.remove();
entity.remove(); entity.remove();
continue;
} }
} }
} else { } else {
@ -982,7 +982,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
} }
iterator.remove(); iterator.remove();
entity.remove(); entity.remove();
continue;
} }
} }
} }
@ -1223,7 +1222,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
@Override @Override
@NonNull @NonNull
@SuppressWarnings("ALL") @SuppressWarnings("unchecked")
public PlayerManager<? extends PlotPlayer<Player>, ? extends Player> playerManager() { public PlayerManager<? extends PlotPlayer<Player>, ? extends Player> playerManager() {
return (PlayerManager<BukkitPlayer, Player>) injector().getInstance(PlayerManager.class); return (PlayerManager<BukkitPlayer, Player>) injector().getInstance(PlayerManager.class);
} }

View File

@ -461,6 +461,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
this.tamed.tamed = tamed.isTamed(); this.tamed.tamed = tamed.isTamed();
} }
@SuppressWarnings("deprecation") // Paper deprecation
@Override @Override
public Entity spawn(World world, int xOffset, int zOffset) { public Entity spawn(World world, int xOffset, int zOffset) {
Location location = new Location(world, this.getX() + xOffset, this.getY(), this.z + zOffset); Location location = new Location(world, this.getX() + xOffset, this.getY(), this.z + zOffset);

View File

@ -36,6 +36,7 @@ import org.bukkit.World;
public class WorldManagerModule extends AbstractModule { public class WorldManagerModule extends AbstractModule {
@SuppressWarnings("removal") // Internal use only
@Provides @Provides
@Singleton @Singleton
PlatformWorldManager<World> provideWorldManager() { PlatformWorldManager<World> provideWorldManager() {

View File

@ -60,7 +60,7 @@ import java.util.List;
public class EntitySpawnListener implements Listener { 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 ignoreTP = false;
private static boolean hasPlotArea = false; private static boolean hasPlotArea = false;
private static String areaName = null; private static String areaName = null;

View File

@ -36,7 +36,6 @@ import com.plotsquared.core.plot.world.PlotAreaManager;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import org.bukkit.block.Banner; import org.bukkit.block.Banner;
import org.bukkit.block.Beacon; import org.bukkit.block.Beacon;
import org.bukkit.block.Bed;
import org.bukkit.block.BlockState; import org.bukkit.block.BlockState;
import org.bukkit.block.CommandBlock; import org.bukkit.block.CommandBlock;
import org.bukkit.block.Comparator; import org.bukkit.block.Comparator;
@ -51,6 +50,7 @@ import org.bukkit.block.Jukebox;
import org.bukkit.block.Sign; import org.bukkit.block.Sign;
import org.bukkit.block.Skull; import org.bukkit.block.Skull;
import org.bukkit.block.Structure; import org.bukkit.block.Structure;
import org.bukkit.block.data.type.Bed;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPlaceEvent;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;

View File

@ -154,7 +154,6 @@ import org.checkerframework.checker.nullness.qual.NonNull;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
@ -224,6 +223,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
} }
} }
@SuppressWarnings("StringSplitter")
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void playerCommand(PlayerCommandPreprocessEvent event) { public void playerCommand(PlayerCommandPreprocessEvent event) {
String msg = event.getMessage().toLowerCase().replaceAll("/", "").trim(); String msg = event.getMessage().toLowerCase().replaceAll("/", "").trim();
@ -379,6 +379,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
this.eventDispatcher.doRespawnTask(pp); this.eventDispatcher.doRespawnTask(pp);
} }
@SuppressWarnings("deprecation") // We explicitly want #getHomeSynchronous here
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onTeleport(PlayerTeleportEvent event) { public void onTeleport(PlayerTeleportEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
@ -1063,9 +1064,13 @@ public class PlayerEventListener extends PlotListener implements Listener {
if (area == null) { if (area == null) {
return; return;
} }
PlayerBlockEventType eventType = null; PlayerBlockEventType eventType;
BlockType blocktype1; BlockType blocktype1;
Block block = event.getClickedBlock(); 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()); Location location = BukkitUtil.adapt(block.getLocation());
Action action = event.getAction(); Action action = event.getAction();
switch (action) { switch (action) {
@ -1667,6 +1672,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
} }
} }
@SuppressWarnings("deprecation") // #getLocate is needed for Spigot compatibility
@EventHandler @EventHandler
public void onLocaleChange(final PlayerLocaleChangeEvent event) { public void onLocaleChange(final PlayerLocaleChangeEvent event) {
// The event is fired before the player is deemed online upon login // The event is fired before the player is deemed online upon login

View File

@ -43,7 +43,6 @@ import java.lang.reflect.Method;
import static com.plotsquared.core.util.ReflectionUtils.getRefClass; import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
@SuppressWarnings("unused")
public class SingleWorldListener implements Listener { public class SingleWorldListener implements Listener {
private final Method methodGetHandleChunk; private final Method methodGetHandleChunk;

View File

@ -162,6 +162,7 @@ public class BukkitPlayer extends PlotPlayer<Player> {
} }
} }
@SuppressWarnings("StringSplitter")
@Override @Override
@NonNegative @NonNegative
public int hasPermissionRange( public int hasPermissionRange(
@ -319,7 +320,7 @@ public class BukkitPlayer extends PlotPlayer<Player> {
if (id == ItemTypes.AIR) { if (id == ItemTypes.AIR) {
// Let's just stop all the discs because why not? // Let's just stop all the discs because why not?
for (final Sound sound : Arrays.stream(Sound.values()) 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); player.stopSound(sound);
} }
// this.player.playEffect(BukkitUtil.getLocation(location), Effect.RECORD_PLAY, Material.AIR); // 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 @Override
public void kick(final String message) { public void kick(final String message) {
this.player.kickPlayer(message); this.player.kickPlayer(message);

View File

@ -51,7 +51,6 @@ import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockState;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.Container; import org.bukkit.block.Container;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
@ -199,7 +198,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
} }
} }
if (localChunk.getTiles().size() > 0) { if (localChunk.getTiles().size() > 0) {
localChunk.getTiles().forEach(((blockVector3, tag) -> { localChunk.getTiles().forEach((blockVector3, tag) -> {
try { try {
BaseBlock block = getWorld().getBlock(blockVector3).toBaseBlock(tag); BaseBlock block = getWorld().getBlock(blockVector3).toBaseBlock(tag);
getWorld().setBlock(blockVector3, block, noSideEffectSet); getWorld().setBlock(blockVector3, block, noSideEffectSet);
@ -207,7 +206,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
StateWrapper sw = new StateWrapper(tag); StateWrapper sw = new StateWrapper(tag);
sw.restoreTag(getWorld().getName(), blockVector3.getX(), blockVector3.getY(), blockVector3.getZ()); sw.restoreTag(getWorld().getName(), blockVector3.getX(), blockVector3.getY(), blockVector3.getZ());
} }
})); });
} }
if (localChunk.getEntities().size() > 0) { if (localChunk.getEntities().size() > 0) {
localChunk.getEntities().forEach((location, entity) -> getWorld().createEntity(location, entity)); 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 * 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) { private void setWorldBlock(int x, int y, int z, @NonNull BaseBlock block, @NonNull BlockVector2 blockVector2, boolean edge) {
try { try {
BlockVector3 loc = BlockVector3.at(x, y, z); BlockVector3 loc = BlockVector3.at(x, y, z);
@ -266,9 +266,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
} catch (WorldEditException ignored) { } catch (WorldEditException ignored) {
// Fallback to not so nice method // Fallback to not so nice method
BlockData blockData = BukkitAdapter.adapt(block); BlockData blockData = BukkitAdapter.adapt(block);
Chunk chunk = getBukkitWorld().getChunkAt(blockVector2.getX(), blockVector2.getZ()); Block existing = getBukkitWorld().getBlockAt(x, y, z);
Block existing = chunk.getBlock(x, y, z);
final BlockState existingBaseBlock = BukkitAdapter.adapt(existing.getBlockData()); final BlockState existingBaseBlock = BukkitAdapter.adapt(existing.getBlockData());
if (BukkitBlockUtil.get(existing).equals(existingBaseBlock) && existing.getBlockData().matches(blockData)) { if (BukkitBlockUtil.get(existing).equals(existingBaseBlock) && existing.getBlockData().matches(blockData)) {
return; return;

View File

@ -166,6 +166,7 @@ public class StateWrapper {
return str; return str;
} }
@SuppressWarnings("deprecation") // #setLine is needed for Spigot compatibility
public boolean restoreTag(String worldName, int x, int y, int z) { public boolean restoreTag(String worldName, int x, int y, int z) {
if (this.tag == null) { if (this.tag == null) {
return false; return false;

View File

@ -77,6 +77,7 @@ public class BukkitInventoryUtil extends InventoryUtil {
return stack; return stack;
} }
@SuppressWarnings("deprecation") // Paper deprecation
@Override @Override
public void open(PlotInventory inv) { public void open(PlotInventory inv) {
BukkitPlayer bp = (BukkitPlayer) inv.getPlayer(); BukkitPlayer bp = (BukkitPlayer) inv.getPlayer();
@ -113,6 +114,7 @@ public class BukkitInventoryUtil extends InventoryUtil {
bp.player.updateInventory(); bp.player.updateInventory();
} }
@SuppressWarnings("deprecation") // Paper deprecation
public PlotItemStack getItem(ItemStack item) { public PlotItemStack getItem(ItemStack item) {
if (item == null) { if (item == null) {
return null; return null;
@ -145,6 +147,7 @@ public class BukkitInventoryUtil extends InventoryUtil {
.toArray(PlotItemStack[]::new); .toArray(PlotItemStack[]::new);
} }
@SuppressWarnings("deprecation") // #getTitle is needed for Spigot compatibility
@Override @Override
public boolean isOpen(PlotInventory plotInventory) { public boolean isOpen(PlotInventory plotInventory) {
if (!plotInventory.isOpen()) { if (!plotInventory.isOpen()) {

View File

@ -61,6 +61,7 @@ public class UpdateUtility implements Listener {
internalVersion = PlotSquared.get().getVersion(); 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() { public void updateChecker() {
task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> { task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> {
try { try {
@ -68,7 +69,7 @@ public class UpdateUtility implements Listener {
"https://api.spigotmc.org/simple/0.1/index.php?action=getResource&id=77506") "https://api.spigotmc.org/simple/0.1/index.php?action=getResource&id=77506")
.openConnection(); .openConnection();
connection.setRequestMethod("GET"); connection.setRequestMethod("GET");
JsonObject result = (new JsonParser()) JsonObject result = new JsonParser()
.parse(new JsonReader(new InputStreamReader(connection.getInputStream()))) .parse(new JsonReader(new InputStreamReader(connection.getInputStream())))
.getAsJsonObject(); .getAsJsonObject();
spigotVersion = result.get("current_version").getAsString(); spigotVersion = result.get("current_version").getAsString();
@ -91,7 +92,7 @@ public class UpdateUtility implements Listener {
notify = false; notify = false;
LOGGER.info("Congratulations! You are running the latest PlotSquared version"); 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() { private void cancelTask() {

View File

@ -75,6 +75,7 @@ public class FaweSchematicHandler extends SchematicHandler {
return delegate.save(tag, path); return delegate.save(tag, path);
} }
@SuppressWarnings("removal") // Just the override
@Override @Override
public void upload(final CompoundTag tag, final UUID uuid, final String file, final RunnableVal<URL> whenDone) { public void upload(final CompoundTag tag, final UUID uuid, final String file, final RunnableVal<URL> whenDone) {
delegate.upload(tag, uuid, file, whenDone); delegate.upload(tag, uuid, file, whenDone);

View File

@ -342,6 +342,7 @@ public class PlotSquared {
* @param plotArea the {@link PlotArea} to add. * @param plotArea the {@link PlotArea} to add.
* @see #removePlotArea(PlotArea) To remove the reference * @see #removePlotArea(PlotArea) To remove the reference
*/ */
@SuppressWarnings("unchecked")
public void addPlotArea(final @NonNull PlotArea plotArea) { public void addPlotArea(final @NonNull PlotArea plotArea) {
HashMap<PlotId, Plot> plots; HashMap<PlotId, Plot> plots;
if (plots_tmp == null || (plots = plots_tmp.remove(plotArea.toString())) == null) { 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 * @param input an array of plots to sort
*/ */
@SuppressWarnings("unchecked")
private void sortPlotsByHash(final @NonNull Plot @NonNull [] input) { private void sortPlotsByHash(final @NonNull Plot @NonNull [] input) {
List<Plot>[] bucket = new ArrayList[32]; List<Plot>[] bucket = new ArrayList[32];
Arrays.fill(bucket, new ArrayList<>()); Arrays.fill(bucket, new ArrayList<>());
@ -696,20 +698,12 @@ public class PlotSquared {
ArrayList<Plot> toReturn = new ArrayList<>(plots.size()); ArrayList<Plot> toReturn = new ArrayList<>(plots.size());
for (PlotArea area : areas) { for (PlotArea area : areas) {
switch (type) { switch (type) {
case CREATION_DATE: case CREATION_DATE -> toReturn.addAll(sortPlotsByTemp(map.get(area)));
toReturn.addAll(sortPlotsByTemp(map.get(area))); case CREATION_DATE_TIMESTAMP -> toReturn.addAll(sortPlotsByTimestamp(map.get(area)));
break; case DISTANCE_FROM_ORIGIN -> toReturn.addAll(sortPlotsByHash(map.get(area)));
case CREATION_DATE_TIMESTAMP: case LAST_MODIFIED -> toReturn.addAll(sortPlotsByModified(map.get(area)));
toReturn.addAll(sortPlotsByTimestamp(map.get(area))); default -> {
break; }
case DISTANCE_FROM_ORIGIN:
toReturn.addAll(sortPlotsByHash(map.get(area)));
break;
case LAST_MODIFIED:
toReturn.addAll(sortPlotsByModified(map.get(area)));
break;
default:
break;
} }
} }
return toReturn; 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. * the {@link TranslatableCaption}s inside the map.
* *
* @param namespace Namespace * @param namespace Namespace

View File

@ -29,7 +29,8 @@ import java.util.Arrays;
public class ArrayUtil { 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; int totalLength = first.length;
for (T[] array : rest) { for (T[] array : rest) {
totalLength += array.length; totalLength += array.length;

View File

@ -35,6 +35,7 @@ public class FlatRandomCollection<T> extends RandomCollection<T> {
private final T[] values; private final T[] values;
@SuppressWarnings("unchecked")
public FlatRandomCollection(Map<T, Double> weights, Random random) { public FlatRandomCollection(Map<T, Double> weights, Random random) {
super(weights, random); super(weights, random);
int max = 0; int max = 0;

View File

@ -241,6 +241,7 @@ public class QuadMap<T> {
return false; return false;
} }
@SuppressWarnings("unchecked")
public void recalculateSkip() { public void recalculateSkip() {
QuadMap<T> map = null; QuadMap<T> map = null;
for (QuadMap<T> current : new QuadMap[]{this.one, this.two, this.three, this.four}) { for (QuadMap<T> current : new QuadMap[]{this.one, this.two, this.three, this.four}) {

View File

@ -58,6 +58,7 @@ import java.util.concurrent.CompletableFuture;
public class Clear extends Command { public class Clear extends Command {
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
@SuppressWarnings({"unused", "FieldCanBeLocal"})
private final GlobalBlockQueue blockQueue; private final GlobalBlockQueue blockQueue;
@Inject @Inject

View File

@ -375,7 +375,6 @@ public abstract class Command {
boolean failed = args.length < reqArgs.length; boolean failed = args.length < reqArgs.length;
String[] baseSplit = getCommandString().split(" "); String[] baseSplit = getCommandString().split(" ");
String[] fullSplit = getUsage().split(" "); String[] fullSplit = getUsage().split(" ");
String base = getCommandString();
if (fullSplit.length - baseSplit.length < reqArgs.length) { if (fullSplit.length - baseSplit.length < reqArgs.length) {
String[] tmp = new String[baseSplit.length + reqArgs.length]; String[] tmp = new String[baseSplit.length + reqArgs.length];
System.arraycopy(fullSplit, 0, tmp, 0, fullSplit.length); System.arraycopy(fullSplit, 0, tmp, 0, fullSplit.length);

View File

@ -69,6 +69,7 @@ public class Condense extends SubCommand {
this.worldUtil = worldUtil; this.worldUtil = worldUtil;
} }
@SuppressWarnings("unchecked")
@Override @Override
public boolean onCommand(final PlotPlayer<?> player, String[] args) { public boolean onCommand(final PlotPlayer<?> player, String[] args) {
if (args.length != 2 && args.length != 3) { if (args.length != 2 && args.length != 3) {

View File

@ -255,7 +255,7 @@ public class DatabaseCommand extends SubCommand {
player.sendMessage(TranslatableCaption.of("database.failed_to_save_plots")); player.sendMessage(TranslatableCaption.of("database.failed_to_save_plots"));
player.sendMessage(TranslatableCaption.of("errors.stacktrace_begin")); player.sendMessage(TranslatableCaption.of("errors.stacktrace_begin"));
e.printStackTrace(); e.printStackTrace();
player.sendMessage(TranslatableCaption.of(("errors.stacktrace_end"))); player.sendMessage(TranslatableCaption.of("errors.stacktrace_end"));
player.sendMessage(TranslatableCaption.of("database.invalid_args")); player.sendMessage(TranslatableCaption.of("database.invalid_args"));
return false; return false;
} }

View File

@ -94,12 +94,12 @@ public class Download extends SubCommand {
player.sendMessage(TranslatableCaption.of("info.plot_unowned")); player.sendMessage(TranslatableCaption.of("info.plot_unowned"));
return false; 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)) { .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DOWNLOAD)) {
player.sendMessage(TranslatableCaption.of("done.done_not_done")); player.sendMessage(TranslatableCaption.of("done.done_not_done"));
return false; return false;
} }
if ((!plot.isOwner(player.getUUID())) && !Permissions if (!plot.isOwner(player.getUUID()) && !Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN.toString())) { .hasPermission(player, Permission.PERMISSION_ADMIN.toString())) {
player.sendMessage(TranslatableCaption.of("permission.no_plot_perms")); player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
return false; return false;

View File

@ -367,6 +367,7 @@ public final class FlagCommand extends Command {
); );
} }
@SuppressWarnings({"unchecked", "rawtypes"})
@CommandDeclaration(command = "add", @CommandDeclaration(command = "add",
aliases = {"a", "add"}, aliases = {"a", "add"},
usage = "/plot flag add <flag> <value>", usage = "/plot flag add <flag> <value>",
@ -435,6 +436,7 @@ public final class FlagCommand extends Command {
); );
} }
@SuppressWarnings({"unchecked", "rawtypes"})
@CommandDeclaration(command = "remove", @CommandDeclaration(command = "remove",
aliases = {"r", "remove", "delete"}, aliases = {"r", "remove", "delete"},
usage = "/plot flag remove <flag> [values]", usage = "/plot flag remove <flag> [values]",

View File

@ -112,7 +112,7 @@ public class Like extends SubCommand {
}); });
for (final Plot plot : plots) { for (final Plot plot : plots) {
if ((!Settings.Done.REQUIRED_FOR_RATINGS || DoneFlag.isDone(plot)) && plot 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 -> { plot.teleportPlayer(player, TeleportCause.COMMAND_LIKE, result -> {
}); });
player.sendMessage(TranslatableCaption.of("tutorial.rate_this")); player.sendMessage(TranslatableCaption.of("tutorial.rate_this"));

View File

@ -104,7 +104,7 @@ public class Rate extends SubCommand {
UUID uuid = player.getUUID(); UUID uuid = player.getUUID();
for (Plot p : plots) { for (Plot p : plots) {
if ((!Settings.Done.REQUIRED_FOR_RATINGS || DoneFlag.isDone(p)) && p if ((!Settings.Done.REQUIRED_FOR_RATINGS || DoneFlag.isDone(p)) && p
.isBasePlot() && (!p.getRatings().containsKey(uuid)) && !p .isBasePlot() && !p.getRatings().containsKey(uuid) && !p
.isAdded(uuid)) { .isAdded(uuid)) {
p.teleportPlayer(player, TeleportCause.COMMAND_RATE, result -> { p.teleportPlayer(player, TeleportCause.COMMAND_RATE, result -> {
}); });

View File

@ -88,7 +88,6 @@ public class RegenAllRoads extends SubCommand {
); );
return false; return false;
} }
String name = args[0];
PlotManager manager = area.getPlotManager(); PlotManager manager = area.getPlotManager();
if (!(manager instanceof HybridPlotManager)) { if (!(manager instanceof HybridPlotManager)) {
player.sendMessage(TranslatableCaption.of("errors.invalid_plot_world")); player.sendMessage(TranslatableCaption.of("errors.invalid_plot_world"));

View File

@ -181,8 +181,6 @@ public class SchematicCmd extends SubCommand {
}); });
} }
case "saveall", "exportall" -> { case "saveall", "exportall" -> {
Location loc = player.getLocation();
final Plot plot = loc.getPlotAbs();
if (!(player instanceof ConsolePlayer)) { if (!(player instanceof ConsolePlayer)) {
player.sendMessage(TranslatableCaption.of("console.not_console")); player.sendMessage(TranslatableCaption.of("console.not_console"));
return false; return false;

View File

@ -100,7 +100,7 @@ public class Set extends SubCommand {
if (Settings.Enabled_Components.CHUNK_PROCESSOR) { if (Settings.Enabled_Components.CHUNK_PROCESSOR) {
forbiddenTypes.addAll(worldUtil.getTileEntityTypes().stream().map( forbiddenTypes.addAll(worldUtil.getTileEntityTypes().stream().map(
BlockType::getName).collect(Collectors.toList())); BlockType::getName).toList());
} }
if (!Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_ALLOW_UNSAFE) && if (!Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_ALLOW_UNSAFE) &&

View File

@ -361,30 +361,4 @@ public class Visit extends Command {
return completions; 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
) {
});
}
}
} }

View File

@ -65,6 +65,7 @@ public class ComponentPreset implements ConfigurationSerializable {
this.icon = icon; this.icon = icon;
} }
@SuppressWarnings("unchecked")
public static ComponentPreset deserialize(final @NonNull Map<String, Object> map) { public static ComponentPreset deserialize(final @NonNull Map<String, Object> map) {
final ClassicPlotManagerComponent classicPlotManagerComponent = ClassicPlotManagerComponent final ClassicPlotManagerComponent classicPlotManagerComponent = ClassicPlotManagerComponent
.fromString(map.getOrDefault("component", "").toString()).orElseThrow(() -> .fromString(map.getOrDefault("component", "").toString()).orElseThrow(() ->

View File

@ -75,6 +75,7 @@ public class ComponentPresetManager {
private final InventoryUtil inventoryUtil; private final InventoryUtil inventoryUtil;
private File componentsFile; private File componentsFile;
@SuppressWarnings("unchecked")
@Inject @Inject
public ComponentPresetManager(final @NonNull EconHandler econHandler, final @NonNull InventoryUtil inventoryUtil) throws public ComponentPresetManager(final @NonNull EconHandler econHandler, final @NonNull InventoryUtil inventoryUtil) throws
IOException { IOException {

View File

@ -58,6 +58,7 @@ public class Config {
* @param <T> value type * @param <T> value type
* @return value * @return value
*/ */
@SuppressWarnings("unchecked")
public static <T> T get(String key, Class<?> root) { public static <T> T get(String key, Class<?> root) {
String[] split = key.split("\\."); String[] split = key.split("\\.");
Object instance = getInstance(split, root); Object instance = getInstance(split, root);
@ -183,6 +184,7 @@ public class Config {
return value != null ? value.toString() : "null"; return value != null ? value.toString() : "null";
} }
@SuppressWarnings({"unchecked", "rawtypes"})
private static void save(PrintWriter writer, Class<?> clazz, Object instance, int indent) { private static void save(PrintWriter writer, Class<?> clazz, Object instance, int indent) {
try { try {
String lineSeparator = System.lineSeparator(); 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> * Get the field for a specific config node and instance<br>
* Note: As expiry can have multiple blocks there will be multiple instances * Note: As expiry can have multiple blocks there will be multiple instances
@ -305,6 +292,7 @@ public class Config {
* @param root * @param root
* @return The instance or null * @return The instance or null
*/ */
@SuppressWarnings({"unchecked", "rawtypes"})
private static Object getInstance(String[] split, Class<?> root) { private static Object getInstance(String[] split, Class<?> root) {
try { try {
Class<?> clazz = root == null ? MethodHandles.lookup().lookupClass() : root; Class<?> clazz = root == null ? MethodHandles.lookup().lookupClass() : root;

View File

@ -196,6 +196,8 @@ public class Settings extends Config {
public boolean CONFIRMATION = true; public boolean CONFIRMATION = true;
public int DAYS = 90; public int DAYS = 90;
public int SKIP_ACCOUNT_AGE_DAYS = -1; 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("*")); public List<String> WORLDS = new ArrayList<>(Collections.singletonList("*"));

View File

@ -101,7 +101,9 @@ public class SQLManager implements AbstractDB {
private final String prefix; private final String prefix;
private final Database database; private final Database database;
private final boolean mySQL; private final boolean mySQL;
@SuppressWarnings({"unused", "FieldCanBeLocal"})
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
@SuppressWarnings({"unused", "FieldCanBeLocal"})
private final PlotListener plotListener; private final PlotListener plotListener;
private final YamlConfiguration worldConfiguration; private final YamlConfiguration worldConfiguration;
/** /**
@ -408,7 +410,6 @@ public class SQLManager implements AbstractDB {
while (iterator.hasNext()) { while (iterator.hasNext()) {
try { try {
Entry<Plot, Queue<UniqueStatement>> entry = iterator.next(); Entry<Plot, Queue<UniqueStatement>> entry = iterator.next();
Plot plot = entry.getKey();
Queue<UniqueStatement> tasks = entry.getValue(); Queue<UniqueStatement> tasks = entry.getValue();
if (tasks.isEmpty()) { if (tasks.isEmpty()) {
iterator.remove(); iterator.remove();
@ -2295,8 +2296,6 @@ public class SQLManager implements AbstractDB {
int size = uniqueIdsList.size(); int size = uniqueIdsList.size();
int packet = 990; int packet = 990;
int amount = size / packet; int amount = size / packet;
int count = 0;
int last = -1;
for (int j = 0; j <= amount; j++) { for (int j = 0; j <= amount; j++) {
List<Integer> subList = List<Integer> subList =
uniqueIdsList.subList(j * packet, Math.min(size, (j + 1) * packet)); uniqueIdsList.subList(j * packet, Math.min(size, (j + 1) * packet));
@ -3200,6 +3199,7 @@ public class SQLManager implements AbstractDB {
return true; return true;
} }
@SuppressWarnings({"unchecked", "unused"})
@Override @Override
public void validateAllPlots(Set<Plot> toValidate) { public void validateAllPlots(Set<Plot> toValidate) {
if (!isValid()) { if (!isValid()) {
@ -3455,15 +3455,7 @@ public class SQLManager implements AbstractDB {
} }
private static class UUIDPair { private record UUIDPair(int id, UUID uuid) {
public final int id;
public final UUID uuid;
public UUIDPair(int id, UUID uuid) {
this.id = id;
this.uuid = uuid;
}
} }

View File

@ -40,8 +40,6 @@ import java.util.List;
*/ */
public class PlayerAutoPlotsChosenEvent extends PlotPlayerEvent { public class PlayerAutoPlotsChosenEvent extends PlotPlayerEvent {
private Result eventResult;
private List<Plot> plots; private List<Plot> plots;
/** /**

View File

@ -97,8 +97,8 @@ public class HybridGen extends IndependentPlotGenerator {
} }
// Coords // Coords
Location min = result.getMin(); Location min = result.getMin();
int bx = (min.getX()) - hybridPlotWorld.ROAD_OFFSET_X; int bx = min.getX() - hybridPlotWorld.ROAD_OFFSET_X;
int bz = (min.getZ()) - hybridPlotWorld.ROAD_OFFSET_Z; int bz = min.getZ() - hybridPlotWorld.ROAD_OFFSET_Z;
// The relative X-coordinate (within the plot) of the minimum X coordinate // The relative X-coordinate (within the plot) of the minimum X coordinate
// contained in the scoped queue // contained in the scoped queue
short relativeOffsetX; short relativeOffsetX;

View File

@ -148,12 +148,22 @@ public class HybridUtils {
return; return;
} }
ChunkQueueCoordinator chunk = new ChunkQueueCoordinator(bot, top, false); ChunkQueueCoordinator chunk = new ChunkQueueCoordinator(worldUtil.getWeWorld(world), bot, top, false);
hpw.getGenerator().generateChunk(chunk, hpw); hpw.getGenerator().generateChunk(chunk, hpw);
final BlockState airBlock = BlockTypes.AIR.getDefaultState();
final BlockState[][][] oldBlocks = chunk.getBlocks(); final BlockState[][][] oldBlocks = chunk.getBlocks();
final BlockState[][][] newBlocks = new BlockState[256][width][length]; 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();
System.gc(); System.gc();
@ -221,9 +231,6 @@ public class HybridUtils {
for (int y = 0; y < 256; y++) { for (int y = 0; y < 256; y++) {
BlockState old = oldBlocks[y][x][z]; BlockState old = oldBlocks[y][x][z];
try { try {
if (old == null) {
old = airBlock;
}
BlockState now = newBlocks[y][x][z]; BlockState now = newBlocks[y][x][z];
if (!old.equals(now)) { if (!old.equals(now)) {
changes[i]++; changes[i]++;

View File

@ -95,6 +95,7 @@ public abstract class IndependentPlotGenerator {
* @param world ChunkGenerator Implementation * @param world ChunkGenerator Implementation
* @return Chunk generator * @return Chunk generator
*/ */
@SuppressWarnings("unchecked")
public <T> GeneratorWrapper<T> specify(final @NonNull String world) { public <T> GeneratorWrapper<T> specify(final @NonNull String world) {
return (GeneratorWrapper<T>) PlotSquared.platform().wrapPlotGenerator(world, this); return (GeneratorWrapper<T>) PlotSquared.platform().wrapPlotGenerator(world, this);
} }

View File

@ -42,8 +42,6 @@ import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder; 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 org.checkerframework.checker.nullness.qual.NonNull;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -53,8 +51,6 @@ import java.util.Set;
public class ProcessedWEExtent extends AbstractDelegateExtent { public class ProcessedWEExtent extends AbstractDelegateExtent {
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ProcessedWEExtent.class.getSimpleName());
private final Set<CuboidRegion> mask; private final Set<CuboidRegion> mask;
private final String world; private final String world;
private final int max; private final int max;
@ -162,6 +158,7 @@ public class ProcessedWEExtent extends AbstractDelegateExtent {
return null; return null;
} }
@SuppressWarnings("deprecation")
@Override @Override
public boolean setBiome(BlockVector2 position, BiomeType biome) { public boolean setBiome(BlockVector2 position, BiomeType biome) {
return WEManager.maskContains(this.mask, position.getX(), position.getZ()) && super return WEManager.maskContains(this.mask, position.getX(), position.getZ()) && super

View File

@ -54,6 +54,7 @@ public class WEExtent extends AbstractDelegateExtent {
this.mask = mask; this.mask = mask;
} }
@SuppressWarnings("unchecked")
@Override @Override
public boolean setBlock(BlockVector3 location, BlockStateHolder block) public boolean setBlock(BlockVector3 location, BlockStateHolder block)
throws WorldEditException { throws WorldEditException {

View File

@ -53,7 +53,7 @@ public abstract class MetaDataAccess<T> implements AutoCloseable {
this.lockAccess = lockAccess; this.lockAccess = lockAccess;
} }
@SuppressWarnings("ALL") @SuppressWarnings("unchecked")
private static <E extends Throwable> void sneakyThrow(final Throwable e) throws E { private static <E extends Throwable> void sneakyThrow(final Throwable e) throws E {
throw (E) e; throw (E) e;
} }

View File

@ -62,6 +62,7 @@ public final class MetaDataKey<T> {
* @param <T> Type * @param <T> Type
* @return MetaData key instance * @return MetaData key instance
*/ */
@SuppressWarnings("unchecked")
public static @NonNull <T> MetaDataKey<T> of(final @NonNull String key, final @NonNull TypeLiteral<T> type) { public static @NonNull <T> MetaDataKey<T> of(final @NonNull String key, final @NonNull TypeLiteral<T> type) {
synchronized (keyMetaData) { synchronized (keyMetaData) {
return (MetaDataKey<T>) return (MetaDataKey<T>)

View File

@ -47,6 +47,7 @@ final class PersistentMetaDataAccess<T> extends MetaDataAccess<T> {
return this.getPlayer().hasPersistentMeta(getMetaDataKey().toString()); return this.getPlayer().hasPersistentMeta(getMetaDataKey().toString());
} }
@SuppressWarnings("unchecked")
@Override @Override
public @Nullable T remove() { public @Nullable T remove() {
this.checkClosed(); this.checkClosed();

View File

@ -104,7 +104,8 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
private static final Set<PlotPlayer<?>> debugModeEnabled = private static final Set<PlotPlayer<?>> debugModeEnabled =
Collections.synchronizedSet(new HashSet<>()); 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 LockRepository lockRepository = new LockRepository();
private final PlotAreaManager plotAreaManager; private final PlotAreaManager plotAreaManager;
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
@ -128,6 +129,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
this.permissionHandler = permissionHandler; this.permissionHandler = permissionHandler;
} }
@SuppressWarnings({"rawtypes", "unchecked"})
public static <T> PlotPlayer<T> from(final @NonNull T object) { public static <T> PlotPlayer<T> from(final @NonNull T object) {
// fast path // fast path
if (converters.containsKey(object.getClass())) { if (converters.containsKey(object.getClass())) {
@ -234,6 +236,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
* @param <T> the object type to return * @param <T> the object type to return
* @return the value assigned to the key or null if it does not exist * @return the value assigned to the key or null if it does not exist
*/ */
@SuppressWarnings("unchecked")
<T> T getMeta(String key) { <T> T getMeta(String key) {
if (this.meta != null) { if (this.meta != null) {
return (T) this.meta.get(key); return (T) this.meta.get(key);
@ -361,7 +364,6 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
} }
public int getClusterCount(String world) { public int getClusterCount(String world) {
UUID uuid = getUUID();
int count = 0; int count = 0;
for (PlotArea area : this.plotAreaManager.getPlotAreasSet(world)) { for (PlotArea area : this.plotAreaManager.getPlotAreasSet(world)) {
for (PlotCluster cluster : area.getClusters()) { for (PlotCluster cluster : area.getClusters()) {
@ -795,16 +797,16 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
final @NonNull MetaDataKey<T> key, final @NonNull MetaDataKey<T> key,
final @NonNull T value final @NonNull T value
) { ) {
final Object rawValue = value;
if (key.getType().getRawType().equals(Integer.class)) { 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)) { } 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 { } else {
throw new IllegalArgumentException(String.format("Unknown meta data type '%s'", key.getType())); throw new IllegalArgumentException(String.format("Unknown meta data type '%s'", key.getType()));
} }
} }
@SuppressWarnings("unchecked")
@Nullable <T> T getPersistentMeta(final @NonNull MetaDataKey<T> key) { @Nullable <T> T getPersistentMeta(final @NonNull MetaDataKey<T> key) {
final byte[] value = this.getPersistentMeta(key.toString()); final byte[] value = this.getPersistentMeta(key.toString());
if (value == null) { if (value == null) {

View File

@ -47,6 +47,7 @@ final class TemporaryMetaDataAccess<T> extends MetaDataAccess<T> {
return this.getPlayer().getMeta(this.getMetaDataKey().toString()) != null; return this.getPlayer().getMeta(this.getMetaDataKey().toString()) != null;
} }
@SuppressWarnings("unchecked")
@Override @Override
public @Nullable T remove() { public @Nullable T remove() {
this.checkClosed(); this.checkClosed();

View File

@ -2834,7 +2834,7 @@ public class Plot {
if (this.isOnline()) { if (this.isOnline()) {
seen = TranslatableCaption.of("info.now").getComponent(player); seen = TranslatableCaption.of("info.now").getComponent(player);
} else { } else {
int time = (int) (ExpireManager.IMP.getAge(this) / 1000); int time = (int) (ExpireManager.IMP.getAge(this, false) / 1000);
if (time != 0) { if (time != 0) {
seen = TimeUtil.secToTime(time); seen = TimeUtil.secToTime(time);
} else { } else {

View File

@ -439,38 +439,6 @@ public abstract class PlotArea {
loadConfiguration(config); 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); public abstract void loadConfiguration(ConfigurationSection config);
/** /**

View File

@ -216,24 +216,20 @@ public class ExpireManager {
applicable.add(et); applicable.add(et);
} }
} }
if (applicable.isEmpty()) { if (applicable.isEmpty()) {
return new ArrayList<>(); return new ArrayList<>();
} }
// Don't delete server plots
if (plot.getFlag(ServerPlotFlag.class)) { if (plot.getFlag(ServerPlotFlag.class)) {
return new ArrayList<>(); return new ArrayList<>();
} }
long diff = getAge(plot);
if (diff == 0) {
return new ArrayList<>();
}
// Filter out non old plots // Filter out non old plots
boolean shouldCheckAccountAge = false; boolean shouldCheckAccountAge = false;
for (int i = 0; i < applicable.size(); i++) { for (int i = 0; i < applicable.size(); i++) {
ExpiryTask et = applicable.poll(); ExpiryTask et = applicable.poll();
if (et.applies(diff)) { if (et.applies(getAge(plot, et.shouldDeleteForUnknownOwner()))) {
applicable.add(et); applicable.add(et);
shouldCheckAccountAge |= et.getSettings().SKIP_ACCOUNT_AGE_DAYS != -1; shouldCheckAccountAge |= et.getSettings().SKIP_ACCOUNT_AGE_DAYS != -1;
} }
@ -243,9 +239,9 @@ public class ExpireManager {
} }
// Check account age // Check account age
if (shouldCheckAccountAge) { if (shouldCheckAccountAge) {
long accountAge = getAge(plot);
for (int i = 0; i < applicable.size(); i++) { for (int i = 0; i < applicable.size(); i++) {
ExpiryTask et = applicable.poll(); ExpiryTask et = applicable.poll();
long accountAge = getAge(plot, et.shouldDeleteForUnknownOwner());
if (et.appliesAccountAge(accountAge)) { if (et.appliesAccountAge(accountAge)) {
applicable.add(et); applicable.add(et);
} }
@ -309,9 +305,8 @@ public class ExpireManager {
return false; return false;
} }
this.running = 2; this.running = 2;
final ConcurrentLinkedDeque<Plot> plots =
new ConcurrentLinkedDeque<>(PlotQuery.newQuery().allPlots().asList());
TaskManager.runTaskAsync(new Runnable() { TaskManager.runTaskAsync(new Runnable() {
private ConcurrentLinkedDeque<Plot> plots = null;
@Override @Override
public void run() { public void run() {
final Runnable task = this; final Runnable task = this;
@ -319,7 +314,9 @@ public class ExpireManager {
ExpireManager.this.running = 0; ExpireManager.this.running = 0;
return; return;
} }
long start = System.currentTimeMillis(); if (plots == null) {
plots = new ConcurrentLinkedDeque<>(PlotQuery.newQuery().allPlots().asList());
}
while (!plots.isEmpty()) { while (!plots.isEmpty()) {
if (ExpireManager.this.running != 2) { if (ExpireManager.this.running != 2) {
ExpireManager.this.running = 0; ExpireManager.this.running = 0;
@ -454,7 +451,20 @@ public class ExpireManager {
plot.getPlotModificationManager().deletePlot(null, whenDone); plot.getPlotModificationManager().deletePlot(null, whenDone);
} }
@Deprecated(forRemoval = true, since = "TODO")
public long getAge(UUID uuid) { 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) { if (PlotSquared.platform().playerManager().getPlayerIfExists(uuid) != null) {
return 0; return 0;
} }
@ -464,7 +474,7 @@ public class ExpireManager {
if (opp != null && (last = opp.getLastPlayed()) != 0) { if (opp != null && (last = opp.getLastPlayed()) != 0) {
this.dates_cache.put(uuid, last); this.dates_cache.put(uuid, last);
} else { } else {
return 0; return shouldDeleteUnknownOwner ? Long.MAX_VALUE : 0;
} }
} }
if (last == 0) { if (last == 0) {
@ -473,7 +483,7 @@ public class ExpireManager {
return System.currentTimeMillis() - last; 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()) if (!plot.hasOwner() || Objects.equals(DBFunc.EVERYONE, plot.getOwner())
|| PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwner()) != null || plot.getRunning() > 0) { || PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwner()) != null || plot.getRunning() > 0) {
return 0; return 0;
@ -495,7 +505,7 @@ public class ExpireManager {
} }
long min = Long.MAX_VALUE; long min = Long.MAX_VALUE;
for (UUID owner : plot.getOwners()) { for (UUID owner : plot.getOwners()) {
long age = getAge(owner); long age = getAge(owner, shouldDeleteUnknownOwner);
if (age < min) { if (age < min) {
min = age; min = age;
} }

View File

@ -80,7 +80,7 @@ public class ExpiryTask {
diff = settings.REQUIRED_PLOTS - plots.size(); diff = settings.REQUIRED_PLOTS - plots.size();
} }
List<Long> entireList = 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()); .collect(Collectors.toList());
List<Long> top = new ArrayList<>(diff + 1); List<Long> top = new ArrayList<>(diff + 1);
if (diff > 1000) { if (diff > 1000) {
@ -157,5 +157,13 @@ public class ExpiryTask {
return settings.CONFIRMATION; 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;
}
} }

View File

@ -558,6 +558,7 @@ public class PlotAnalysis {
return ranks; return ranks;
} }
@SuppressWarnings("unchecked")
public static void sort(int[] input) { public static void sort(int[] input) {
int SIZE = 10; int SIZE = 10;
List<Integer>[] bucket = new ArrayList[SIZE]; List<Integer>[] bucket = new ArrayList[SIZE];

View File

@ -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 * PlotFlag. This is an unsafe operation, and should only be performed
* if the generic parameters are known beforehand. * if the generic parameters are known beforehand.
* *
@ -105,7 +105,7 @@ public class FlagContainer {
* @param <T> Flag type * @param <T> Flag type
* @return Casted flag * @return Casted flag
*/ */
@SuppressWarnings("ALL") @SuppressWarnings("unchecked")
public static <V, T extends PlotFlag<V, ?>> T castUnsafe( public static <V, T extends PlotFlag<V, ?>> T castUnsafe(
final PlotFlag<?, ?> flag final PlotFlag<?, ?> flag
) { ) {
@ -181,6 +181,7 @@ public class FlagContainer {
* @param <V> flag value type * @param <V> flag value type
* @return value of flag removed * @return value of flag removed
*/ */
@SuppressWarnings("unchecked")
public <V, T extends PlotFlag<V, ?>> V removeFlag(final T flag) { public <V, T extends PlotFlag<V, ?>> V removeFlag(final T flag) {
final Object value = this.flagMap.remove(flag.getClass()); final Object value = this.flagMap.remove(flag.getClass());
if (this.plotFlagUpdateHandler != null) { if (this.plotFlagUpdateHandler != null) {

View File

@ -29,6 +29,7 @@ import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.plot.PlotTitle; import com.plotsquared.core.plot.PlotTitle;
import com.plotsquared.core.plot.flag.FlagParseException; import com.plotsquared.core.plot.flag.FlagParseException;
import com.plotsquared.core.plot.flag.PlotFlag; import com.plotsquared.core.plot.flag.PlotFlag;
import com.plotsquared.core.util.StringMan;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
public class PlotTitleFlag extends PlotFlag<PlotTitle, PlotTitleFlag> { public class PlotTitleFlag extends PlotFlag<PlotTitle, PlotTitleFlag> {
@ -56,17 +57,18 @@ public class PlotTitleFlag extends PlotFlag<PlotTitle, PlotTitleFlag> {
if (!input.contains("\"")) { if (!input.contains("\"")) {
return new PlotTitleFlag(new PlotTitle(input, "")); return new PlotTitleFlag(new PlotTitle(input, ""));
} }
input = input.substring(input.indexOf("\""));
input = input.substring(0, input.lastIndexOf("\"") + 1); var split = StringMan.splitMessage(input);
String[] inputs = input.split("\"");
PlotTitle value; if (split.isEmpty() || split.size() > 2) {
if (inputs.length == 2) {
value = new PlotTitle(inputs[1], "");
} else if (inputs.length > 3) {
value = new PlotTitle(inputs[1], inputs[3]);
} else {
throw new FlagParseException(this, input, TranslatableCaption.of("flags.flag_error_title")); 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); return new PlotTitleFlag(value);
} }

View File

@ -57,7 +57,9 @@ import java.nio.file.Files;
public class SinglePlotArea extends GridPlotWorld { public class SinglePlotArea extends GridPlotWorld {
@SuppressWarnings({"unused", "FieldCanBeLocal"})
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
@SuppressWarnings({"unused", "FieldCanBeLocal"})
private final PlotListener plotListener; private final PlotListener plotListener;
public boolean VOID = false; public boolean VOID = false;
@ -273,6 +275,7 @@ public class SinglePlotArea extends GridPlotWorld {
return false; // do not create signs for single plots return false; // do not create signs for single plots
} }
@SuppressWarnings("deprecation")
protected Plot adapt(Plot p) { protected Plot adapt(Plot p) {
if (p instanceof SinglePlot) { if (p instanceof SinglePlot) {
return p; return p;

View File

@ -57,7 +57,6 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator {
private final ConcurrentHashMap<BlockVector2, LocalChunk> blockChunks = new ConcurrentHashMap<>(); private final ConcurrentHashMap<BlockVector2, LocalChunk> blockChunks = new ConcurrentHashMap<>();
private final List<BlockVector2> readRegion = new ArrayList<>(); private final List<BlockVector2> readRegion = new ArrayList<>();
private final List<ProgressSubscriber> progressSubscribers = new ArrayList<>(); private final List<ProgressSubscriber> progressSubscribers = new ArrayList<>();
private long modified;
private LocalChunk lastWrappedChunk; private LocalChunk lastWrappedChunk;
private int lastX = Integer.MIN_VALUE; private int lastX = Integer.MIN_VALUE;
private int lastZ = Integer.MIN_VALUE; private int lastZ = Integer.MIN_VALUE;
@ -76,7 +75,6 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator {
public BasicQueueCoordinator(@NonNull World world) { public BasicQueueCoordinator(@NonNull World world) {
super(world); super(world);
this.world = world; this.world = world;
this.modified = System.currentTimeMillis();
} }
@Override @Override
@ -94,7 +92,6 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator {
@Override @Override
public final void setModified(long modified) { public final void setModified(long modified) {
this.modified = modified;
} }
@Override @Override
@ -120,6 +117,7 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator {
return setBlock(x, y, z, id.toBaseBlock()); return setBlock(x, y, z, id.toBaseBlock());
} }
@SuppressWarnings("removal")
@Override @Override
public boolean setBiome(int x, int z, @NonNull BiomeType biomeType) { public boolean setBiome(int x, int z, @NonNull BiomeType biomeType) {
LocalChunk chunk = getChunk(x >> 4, z >> 4); LocalChunk chunk = getChunk(x >> 4, z >> 4);

View File

@ -46,13 +46,20 @@ public class ChunkQueueCoordinator extends ScopedQueueCoordinator {
private final int length; private final int length;
private final BlockVector3 bot; private final BlockVector3 bot;
private final BlockVector3 top; 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)); super(null, Location.at("", 0, 0, 0), Location.at("", 15, 255, 15));
this.weWorld = weWorld;
this.width = top.getX() - bot.getX() + 1; this.width = top.getX() - bot.getX() + 1;
this.length = top.getZ() - bot.getZ() + 1; this.length = top.getZ() - bot.getZ() + 1;
this.result = new BlockState[256][][]; this.result = new BlockState[256][width][length];
this.biomeResult = biomes ? new BiomeType[256][][] : null; this.biomeResult = biomes ? new BiomeType[256][width][length] : null;
this.bot = bot; this.bot = bot;
this.top = top; this.top = top;
} }
@ -137,7 +144,7 @@ public class ChunkQueueCoordinator extends ScopedQueueCoordinator {
@Override @Override
public @Nullable World getWorld() { public @Nullable World getWorld() {
return super.getWorld(); return weWorld;
} }
@Override @Override

View File

@ -56,6 +56,7 @@ public abstract class QueueCoordinator {
private Object chunkObject; private Object chunkObject;
private final AtomicBoolean enqueued = new AtomicBoolean(); private final AtomicBoolean enqueued = new AtomicBoolean();
@SuppressWarnings({"unused", "FieldCanBeLocal"})
@Inject @Inject
private GlobalBlockQueue blockQueue; private GlobalBlockQueue blockQueue;

View File

@ -34,6 +34,7 @@ import java.util.function.Consumer;
/** /**
* A repository for keyed {@link java.util.concurrent.locks.Lock locks} * A repository for keyed {@link java.util.concurrent.locks.Lock locks}
*/ */
@SuppressWarnings("UnstableApiUsage")
public final class LockRepository { public final class LockRepository {
private final Striped<Lock> striped; private final Striped<Lock> striped;

View File

@ -90,7 +90,7 @@ public final class BlockUtil {
if (id.length() == 1 && id.charAt(0) == '*') { if (id.length() == 1 && id.charAt(0) == '*') {
return FuzzyBlockState.builder().type(BlockTypes.AIR).build(); return FuzzyBlockState.builder().type(BlockTypes.AIR).build();
} }
String mutableId = id; String mutableId;
mutableId = id.toLowerCase(); mutableId = id.toLowerCase();
BlockType type = BlockTypes.get(mutableId); BlockType type = BlockTypes.get(mutableId);
if (type != null) { if (type != null) {

View File

@ -73,6 +73,7 @@ public class EntityUtil {
return i; return i;
} }
@SuppressWarnings("unchecked")
public static boolean checkEntity(Plot plot, PlotFlag<Integer, ?>... flags) { public static boolean checkEntity(Plot plot, PlotFlag<Integer, ?>... flags) {
if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
return true; return true;

View File

@ -289,7 +289,7 @@ public abstract class RegionManager {
true true
); );
toQueue2.setCompleteTask(whenDone::run); toQueue2.setCompleteTask(whenDone);
if (actor != null && Settings.QUEUE.NOTIFY_PROGRESS) { if (actor != null && Settings.QUEUE.NOTIFY_PROGRESS) {
toQueue2.addProgressSubscriber(subscriberFactory.createFull( toQueue2.addProgressSubscriber(subscriberFactory.createFull(
actor, actor,

View File

@ -59,6 +59,7 @@ public class StringComparison<T> {
this(input, objects, Object::toString); this(input, objects, Object::toString);
} }
@SuppressWarnings("unchecked")
public StringComparison(String input, Collection<T> objects, Function<T, String> toString) { public StringComparison(String input, Collection<T> objects, Function<T, String> toString) {
this(input, (T[]) objects.toArray(), toString); this(input, (T[]) objects.toArray(), toString);
} }

View File

@ -30,16 +30,21 @@ import com.plotsquared.core.configuration.caption.Caption;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Comparator; import java.util.Comparator;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import java.util.regex.Pattern;
public class StringMan { 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) { public static String replaceFromMap(String string, Map<String, String> replacements) {
StringBuilder sb = new StringBuilder(string); StringBuilder sb = new StringBuilder(string);
int size = string.length(); int size = string.length();
@ -286,7 +291,7 @@ public class StringMan {
} }
public static boolean isEqualIgnoreCase(String a, String b) { 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)); .equalsIgnoreCase(b));
} }
@ -320,4 +325,46 @@ public class StringMan {
return col; 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;
}
} }

View File

@ -265,6 +265,7 @@ public final class TabCompletions {
* @return List of completions * @return List of completions
* @deprecated In favor {@link #completePlayers(String, PlotPlayer, String, List, Predicate)} * @deprecated In favor {@link #completePlayers(String, PlotPlayer, String, List, Predicate)}
*/ */
@SuppressWarnings("unused")
@Deprecated(forRemoval = true) @Deprecated(forRemoval = true)
private static List<Command> completePlayers( private static List<Command> completePlayers(
final @NonNull String cacheIdentifier, final @NonNull String cacheIdentifier,

View File

@ -109,7 +109,7 @@ public class WEManager {
plot = metaDataAccess.get().orElse(null); plot = metaDataAccess.get().orElse(null);
} }
if (plot != null && (!Settings.Done.RESTRICT_BUILDING || !DoneFlag.isDone(plot)) && ( 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)) { .getTrusted().contains(uuid))) && !plot.getFlag(NoWorldeditFlag.class)) {
for (CuboidRegion region : plot.getRegions()) { for (CuboidRegion region : plot.getRegions()) {
BlockVector3 pos1 = region.getMinimumPoint().withY(area.getMinBuildHeight()); BlockVector3 pos1 = region.getMinimumPoint().withY(area.getMinBuildHeight());

View File

@ -25,9 +25,12 @@
*/ */
package com.plotsquared.core.plot; package com.plotsquared.core.plot;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.AbstractDBTest; import com.plotsquared.core.database.AbstractDBTest;
import com.plotsquared.core.database.DBFunc; 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.PlotFlag;
import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag;
import com.plotsquared.core.plot.flag.implementations.UseFlag; import com.plotsquared.core.plot.flag.implementations.UseFlag;
import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.item.ItemType;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
@ -74,4 +77,62 @@ public class FlagTest {
Assertions.assertEquals("use", flagName); 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()
);
}
} }

View File

@ -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) {
}
}

View File

@ -77,7 +77,7 @@ allprojects {
} }
tasks.compileJava.configure { tasks.compileJava.configure {
options.release.set(16) options.release.set(17)
} }
configurations.all { configurations.all {