Compare commits

..

12 Commits

Author SHA1 Message Date
3676e1df35 build: Release 6.9.2 2022-07-05 22:25:57 +02:00
12e2705260 Revert #3681 (#3722)
Revert "Adjust schematic height logic when pasting and actually set air as well (#3681)"

This reverts commit 08ce4c872c.
2022-07-05 15:02:25 +02:00
31e777a03a build: Update dependency me.clip:placeholderapi to v2.11.2 (#3720)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-04 14:07:14 +02:00
7f436c405b fix: Don't fail post processing compilation on non-ascii charmap (#3719) 2022-07-03 14:58:17 +02:00
4d4d2ab087 Ignore cancelled projectile launch events (#3709) 2022-06-28 21:15:09 +02:00
91017acce4 Realistically only need the "highest" y level of adding overlay block errors 2022-06-27 17:41:47 +01:00
e90fd231d9 build: Update dependency com.github.spotbugs:spotbugs-annotations to v4.7.1 (#3714)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-06-27 17:00:13 +02:00
cd9f0789de build: Update bom to 1.9 2022-06-27 16:47:32 +02:00
5f4c8d92df build: Back to snapshot for development 2022-06-27 14:57:32 +02:00
263cb47a21 build: Release 6.9.1 2022-06-27 14:56:44 +02:00
005600c99e Show old flag value in remove command (#3711) 2022-06-27 13:31:45 +02:00
26bec7fe2f style: Address javadoc violations 2022-06-26 11:18:33 +02:00
11 changed files with 56 additions and 129 deletions

View File

@ -105,5 +105,6 @@ tasks {
opt.links("https://jd.adventure.kyori.net/api/4.9.3/") opt.links("https://jd.adventure.kyori.net/api/4.9.3/")
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/") opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
opt.links("https://checkerframework.org/api/") opt.links("https://checkerframework.org/api/")
opt.encoding("UTF-8")
} }
} }

View File

@ -89,7 +89,7 @@ public class ProjectileEventListener implements Listener {
} }
} }
@EventHandler @EventHandler(ignoreCancelled = true)
public void onProjectileLaunch(ProjectileLaunchEvent event) { public void onProjectileLaunch(ProjectileLaunchEvent event) {
Projectile entity = event.getEntity(); Projectile entity = event.getEntity();
ProjectileSource shooter = entity.getShooter(); ProjectileSource shooter = entity.getShooter();

View File

@ -64,5 +64,6 @@ tasks {
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/") opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
opt.links("https://checkerframework.org/api/") opt.links("https://checkerframework.org/api/")
opt.links("https://javadoc.io/doc/com.intellectualsites.informative-annotations/informative-annotations/latest/") opt.links("https://javadoc.io/doc/com.intellectualsites.informative-annotations/informative-annotations/latest/")
opt.encoding("UTF-8")
} }
} }

View File

@ -462,6 +462,7 @@ public final class FlagCommand extends Command {
return; return;
} }
final Plot plot = player.getLocation().getPlotAbs(); final Plot plot = player.getLocation().getPlotAbs();
final PlotFlag<?, ?> flagWithOldValue = plot.getFlagContainer().getFlag(flag.getClass());
PlotFlagRemoveEvent event = eventDispatcher.callFlagRemove(flag, plot); PlotFlagRemoveEvent event = eventDispatcher.callFlagRemove(flag, plot);
if (event.getEventResult() == Result.DENY) { if (event.getEventResult() == Result.DENY) {
player.sendMessage( player.sendMessage(
@ -506,7 +507,7 @@ public final class FlagCommand extends Command {
if (plot.removeFlag(flag)) { if (plot.removeFlag(flag)) {
player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of( player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of(
"value", "value",
String.valueOf(flag) String.valueOf(flagWithOldValue)
)); ));
return; return;
} else { } else {
@ -544,7 +545,7 @@ public final class FlagCommand extends Command {
} }
player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of( player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of(
"value", "value",
String.valueOf(flag) String.valueOf(flagWithOldValue)
)); ));
} }

View File

@ -21,6 +21,7 @@ package com.plotsquared.core.generator;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.Assisted;
import com.intellectualsites.annotations.DoNotUse; import com.intellectualsites.annotations.DoNotUse;
import com.intellectualsites.annotations.NotPublic;
import com.plotsquared.core.PlotSquared; import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.ConfigurationSection; import com.plotsquared.core.configuration.ConfigurationSection;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
@ -74,9 +75,6 @@ public class HybridPlotWorld extends ClassicPlotWorld {
public short PATH_WIDTH_UPPER; public short PATH_WIDTH_UPPER;
public HashMap<Integer, BaseBlock[]> G_SCH; public HashMap<Integer, BaseBlock[]> G_SCH;
public HashMap<Integer, BiomeType> G_SCH_B; public HashMap<Integer, BiomeType> G_SCH_B;
/**
* The Y level at which schematic generation will start, lowest of either road or plot schematic generation.
*/
public int SCHEM_Y; public int SCHEM_Y;
private Location SIGN_LOCATION; private Location SIGN_LOCATION;
private File root = null; private File root = null;
@ -269,57 +267,33 @@ public class HybridPlotWorld extends ClassicPlotWorld {
int oddshift = (this.ROAD_WIDTH & 1); int oddshift = (this.ROAD_WIDTH & 1);
SCHEM_Y = schematicStartHeight(); SCHEM_Y = schematicStartHeight();
// plotY and roadY are important to allow plot and/or road schematic "overflow" into each other without causing AIOOB
// exceptions when attempting either to set blocks to, or get block from G_SCH
// Default plot schematic start height, normalized to the minimum height schematics are pasted from.
int plotY = PLOT_HEIGHT - SCHEM_Y; int plotY = PLOT_HEIGHT - SCHEM_Y;
int minRoadWall = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ? Math.min(ROAD_HEIGHT, WALL_HEIGHT) : ROAD_HEIGHT; int minRoadWall = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ? Math.min(ROAD_HEIGHT, WALL_HEIGHT) : ROAD_HEIGHT;
// Default road schematic start height, normalized to the minimum height schematics are pasted from.
int roadY = minRoadWall - SCHEM_Y; int roadY = minRoadWall - SCHEM_Y;
int worldGenHeight = getMaxGenHeight() - getMinGenHeight() + 1; int worldHeight = getMaxGenHeight() - getMinGenHeight() + 1;
int maxSchematicHeight = 0;
// SCHEM_Y should be normalised to the plot "start" height // SCHEM_Y should be normalised to the plot "start" height
if (schematic3 != null) { if (schematic3 != null) {
if ((maxSchematicHeight = schematic3.getClipboard().getDimensions().getY()) == worldGenHeight) { if (schematic3.getClipboard().getDimensions().getY() == worldHeight) {
SCHEM_Y = getMinGenHeight(); SCHEM_Y = plotY = 0;
plotY = 0;
} else if (!Settings.Schematics.PASTE_ON_TOP) { } else if (!Settings.Schematics.PASTE_ON_TOP) {
SCHEM_Y = getMinBuildHeight(); SCHEM_Y = plotY = getMinBuildHeight() - getMinGenHeight();
plotY = 0;
} }
} }
if (schematic1 != null) { if (schematic1 != null) {
if ((maxSchematicHeight = Math.max( if (schematic1.getClipboard().getDimensions().getY() == worldHeight) {
schematic1.getClipboard().getDimensions().getY(), SCHEM_Y = roadY = getMinGenHeight();
maxSchematicHeight if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldHeight
)) == worldGenHeight) { && !Settings.Schematics.PASTE_ON_TOP) {
SCHEM_Y = getMinGenHeight(); plotY = PLOT_HEIGHT;
roadY = 0; // Road is the lowest schematic
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldGenHeight) {
// Road is the lowest schematic. Normalize plotY to it.
if (Settings.Schematics.PASTE_ON_TOP) {
plotY = PLOT_HEIGHT - getMinGenHeight();
} else {
plotY = getMinBuildHeight() - getMinGenHeight();
}
} }
} else if (!Settings.Schematics.PASTE_ROAD_ON_TOP) { } else if (!Settings.Schematics.PASTE_ROAD_ON_TOP) {
if (SCHEM_Y == getMinGenHeight()) { // Only possible if plot schematic is enabled SCHEM_Y = roadY = getMinBuildHeight();
// Plot is still the lowest schematic, normalize roadY to it if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldHeight
roadY = getMinBuildHeight() - getMinGenHeight(); && !Settings.Schematics.PASTE_ON_TOP) {
} else if (schematic3 != null) { plotY = PLOT_HEIGHT;
SCHEM_Y = getMinBuildHeight();
roadY = 0;// Road is the lowest schematic
if (Settings.Schematics.PASTE_ON_TOP) {
// Road is the lowest schematic. Normalize plotY to it.
plotY = PLOT_HEIGHT - getMinBuildHeight();
}
// If plot schematic is not paste-on-top, it will be from min build height thus plotY = 0 as well already.
} }
} }
} }
@ -357,15 +331,17 @@ public class HybridPlotWorld extends ClassicPlotWorld {
y + min.getBlockY(), y + min.getBlockY(),
z + min.getBlockZ() z + min.getBlockZ()
)); ));
schem3PopulationNeeded |= id.hasNbtData(); if (!id.getBlockType().getMaterial().isAir()) {
addOverlayBlock( schem3PopulationNeeded |= id.hasNbtData();
(short) (x + shift + oddshift + centerShiftX), addOverlayBlock(
(short) (y + plotY), (short) (x + shift + oddshift + centerShiftX),
(short) (z + shift + oddshift + centerShiftZ), (short) (y + plotY),
id, (short) (z + shift + oddshift + centerShiftZ),
false, id,
maxSchematicHeight false,
); h3
);
}
} }
if (blockArrayClipboard3.hasBiomes()) { if (blockArrayClipboard3.hasBiomes()) {
BiomeType biome = blockArrayClipboard3.getBiome(BlockVector2.at( BiomeType biome = blockArrayClipboard3.getBiome(BlockVector2.at(
@ -415,23 +391,18 @@ public class HybridPlotWorld extends ClassicPlotWorld {
y + min.getBlockY(), y + min.getBlockY(),
z + min.getBlockZ() z + min.getBlockZ()
)); ));
schem1PopulationNeeded |= id.hasNbtData(); if (!id.getBlockType().getMaterial().isAir()) {
addOverlayBlock( schem1PopulationNeeded |= id.hasNbtData();
(short) (x - shift), addOverlayBlock((short) (x - shift), (short) (y + roadY), (short) (z + shift + oddshift), id, false, h1);
(short) (y + roadY), addOverlayBlock(
(short) (z + shift + oddshift), (short) (z + shift + oddshift),
id, (short) (y + roadY),
false, (short) (shift - x + (oddshift - 1)),
maxSchematicHeight id,
); true,
addOverlayBlock( h1
(short) (z + shift + oddshift), );
(short) (y + roadY), }
(short) (shift - x + (oddshift - 1)),
id,
true,
maxSchematicHeight
);
} }
if (blockArrayClipboard1.hasBiomes()) { if (blockArrayClipboard1.hasBiomes()) {
BiomeType biome = blockArrayClipboard1.getBiome(BlockVector2.at(x + min.getBlockX(), z + min.getBlockZ())); BiomeType biome = blockArrayClipboard1.getBiome(BlockVector2.at(x + min.getBlockX(), z + min.getBlockZ()));
@ -459,15 +430,10 @@ public class HybridPlotWorld extends ClassicPlotWorld {
y + min.getBlockY(), y + min.getBlockY(),
z + min.getBlockZ() z + min.getBlockZ()
)); ));
schem2PopulationNeeded |= id.hasNbtData(); if (!id.getBlockType().getMaterial().isAir()) {
addOverlayBlock( schem2PopulationNeeded |= id.hasNbtData();
(short) (x - shift), addOverlayBlock((short) (x - shift), (short) (y + roadY), (short) (z - shift), id, false, h2);
(short) (y + roadY), }
(short) (z - shift),
id,
false,
maxSchematicHeight
);
} }
if (blockArrayClipboard2.hasBiomes()) { if (blockArrayClipboard2.hasBiomes()) {
BiomeType biome = blockArrayClipboard2.getBiome(BlockVector2.at(x + min.getBlockX(), z + min.getBlockZ())); BiomeType biome = blockArrayClipboard2.getBiome(BlockVector2.at(x + min.getBlockX(), z + min.getBlockZ()));
@ -477,10 +443,6 @@ public class HybridPlotWorld extends ClassicPlotWorld {
} }
} }
/**
* @deprecated This method should not be available for public API usage and will be made private.
*/
@Deprecated(forRemoval = true, since = "TODO")
public void addOverlayBlock(short x, short y, short z, BaseBlock id, boolean rotate, int height) { public void addOverlayBlock(short x, short y, short z, BaseBlock id, boolean rotate, int height) {
if (z < 0) { if (z < 0) {
z += this.SIZE; z += this.SIZE;
@ -498,7 +460,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
int pair = MathMan.pair(x, z); int pair = MathMan.pair(x, z);
BaseBlock[] existing = this.G_SCH.computeIfAbsent(pair, k -> new BaseBlock[height]); BaseBlock[] existing = this.G_SCH.computeIfAbsent(pair, k -> new BaseBlock[height]);
if (y >= height) { if (y >= height) {
if (y != lastOverlayHeightError) { if (y > lastOverlayHeightError) {
lastOverlayHeightError = y; lastOverlayHeightError = y;
LOGGER.error(String.format("Error adding overlay block. `y > height`. y=%s, height=%s", y, height)); LOGGER.error(String.format("Error adding overlay block. `y > height`. y=%s, height=%s", y, height));
} }
@ -507,10 +469,6 @@ public class HybridPlotWorld extends ClassicPlotWorld {
existing[y] = id; existing[y] = id;
} }
/**
* @deprecated This method should not be available for public API usage and will be made private.
*/
@Deprecated(forRemoval = true, since = "TODO")
public void addOverlayBiome(short x, short z, BiomeType id) { public void addOverlayBiome(short x, short z, BiomeType id) {
if (z < 0) { if (z < 0) {
z += this.SIZE; z += this.SIZE;

View File

@ -313,7 +313,7 @@ public sealed class Location extends BlockLoc implements Comparable<Location> pe
/** /**
* Get the absolute {@link Plot}, if any, that contains this location * Get the absolute {@link Plot}, if any, that contains this location
* *
* @return (Absolute) plot containing the location, or {code null} * @return (Absolute) plot containing the location, or {@code null}
*/ */
public @Nullable Plot getPlotAbs() { public @Nullable Plot getPlotAbs() {
final PlotArea area = this.getPlotArea(); final PlotArea area = this.getPlotArea();
@ -327,7 +327,7 @@ public sealed class Location extends BlockLoc implements Comparable<Location> pe
/** /**
* Get the {@link Plot}, if any, that contains this location * Get the {@link Plot}, if any, that contains this location
* *
* @return plot containing the location, or {code null} * @return plot containing the location, or {@code null}
*/ */
public @Nullable Plot getPlot() { public @Nullable Plot getPlot() {
final PlotArea area = this.getPlotArea(); final PlotArea area = this.getPlotArea();

View File

@ -643,7 +643,7 @@ public abstract class PlotArea {
* @param player Player to check * @param player Player to check
* @param y y height to check * @param y y height to check
* @return true if outside build area with no permissions * @return true if outside build area with no permissions
* @since TODO * @since 6.9.1
*/ */
public boolean notifyIfOutsideBuildArea(PlotPlayer<?> player, int y) { public boolean notifyIfOutsideBuildArea(PlotPlayer<?> player, int y) {
if (!buildRangeContainsY(y) && !Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) { if (!buildRangeContainsY(y) && !Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {

View File

@ -30,18 +30,9 @@ import org.checkerframework.checker.nullness.qual.NonNull;
* The Permissions class handles checking user permissions.<br> * The Permissions class handles checking user permissions.<br>
* - This will respect * nodes and plots.admin and can be used to check permission ranges (e.g. plots.plot.5)<br> * - This will respect * nodes and plots.admin and can be used to check permission ranges (e.g. plots.plot.5)<br>
* - Checking the PlotPlayer class directly will not take the above into account<br> * - Checking the PlotPlayer class directly will not take the above into account<br>
*
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public class Permissions { public class Permissions {
/**
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/
@Deprecated(forRemoval = true, since = "TODO")
public static boolean hasPermission(PlotPlayer<?> player, Permission permission, boolean notify) { public static boolean hasPermission(PlotPlayer<?> player, Permission permission, boolean notify) {
return hasPermission(player, permission.toString(), notify); return hasPermission(player, permission.toString(), notify);
} }
@ -52,25 +43,18 @@ public class Permissions {
* @param caller permission holder * @param caller permission holder
* @param permission Permission * @param permission Permission
* @return {@code true} if the owner has the given permission, else {@code false} * @return {@code true} if the owner has the given permission, else {@code false}
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull Permission permission) { public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull Permission permission) {
return caller.hasPermission(permission.toString()); return caller.hasPermission(permission.toString());
} }
/** /**
* Check if the owner of the profile has a given (global) permission. There is no guarantee that per-world permissions will * Check if the owner of the profile has a given (global) permission
* be checked because unmaintained crap plugins like PEX exist.
* *
* @param caller permission holder * @param caller permission holder
* @param permission Permission * @param permission Permission
* @return {@code true} if the owner has the given permission, else {@code false} * @return {@code true} if the owner has the given permission, else {@code false}
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull String permission) { public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull String permission) {
return caller.hasPermission(permission); return caller.hasPermission(permission);
} }
@ -84,10 +68,7 @@ public class Permissions {
* @param key Permission "key" * @param key Permission "key"
* @return {@code true} if the owner has the given permission, else {@code false} * @return {@code true} if the owner has the given permission, else {@code false}
* @since 6.0.10 * @since 6.0.10
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public static boolean hasKeyedPermission( public static boolean hasKeyedPermission(
final @NonNull PermissionHolder caller, final @NonNull String permission, final @NonNull PermissionHolder caller, final @NonNull String permission,
final @NonNull String key final @NonNull String key
@ -102,10 +83,7 @@ public class Permissions {
* @param permission permission * @param permission permission
* @param notify if to notify the permission holder * @param notify if to notify the permission holder
* @return if permission is had * @return if permission is had
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public static boolean hasPermission(PlotPlayer<?> player, String permission, boolean notify) { public static boolean hasPermission(PlotPlayer<?> player, String permission, boolean notify) {
if (!hasPermission(player, permission)) { if (!hasPermission(player, permission)) {
if (notify) { if (notify) {
@ -119,11 +97,6 @@ public class Permissions {
return true; return true;
} }
/**
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/
@Deprecated(forRemoval = true, since = "TODO")
public static int hasPermissionRange(PlotPlayer<?> player, Permission Permission, int range) { public static int hasPermissionRange(PlotPlayer<?> player, Permission Permission, int range) {
return hasPermissionRange(player, Permission.toString(), range); return hasPermissionRange(player, Permission.toString(), range);
} }
@ -137,10 +110,7 @@ public class Permissions {
* @param stub The permission stub to check e.g. for `plots.plot.#` the stub is `plots.plot` * @param stub The permission stub to check e.g. for `plots.plot.#` the stub is `plots.plot`
* @param range The range to check * @param range The range to check
* @return The highest permission they have within that range * @return The highest permission they have within that range
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public static int hasPermissionRange(PlotPlayer<?> player, String stub, int range) { public static int hasPermissionRange(PlotPlayer<?> player, String stub, int range) {
return player.hasPermissionRange(stub, range); return player.hasPermissionRange(stub, range);
} }

View File

@ -19,7 +19,7 @@ plugins {
} }
group = "com.plotsquared" group = "com.plotsquared"
version = "6.9.1-SNAPSHOT" version = "6.9.2"
subprojects { subprojects {
group = rootProject.group group = rootProject.group
@ -65,7 +65,7 @@ subprojects {
} }
dependencies { dependencies {
implementation(platform("com.intellectualsites.bom:bom-1.18.x:1.7")) implementation(platform("com.intellectualsites.bom:bom-1.18.x:1.9"))
} }
dependencies { dependencies {

View File

@ -2,11 +2,11 @@
# Platform expectations # Platform expectations
paper = "1.18.1-R0.1-SNAPSHOT" paper = "1.18.1-R0.1-SNAPSHOT"
guice = "5.1.0" guice = "5.1.0"
spotbugs = "4.7.0" spotbugs = "4.7.1"
# Plugins # Plugins
worldedit = "7.2.10" worldedit = "7.2.10"
placeholderapi = "2.11.1" placeholderapi = "2.11.2"
luckperms = "5.4" luckperms = "5.4"
essentialsx = "2.19.4" essentialsx = "2.19.4"
mvdwapi = "3.1.1" mvdwapi = "3.1.1"

View File

@ -3,10 +3,6 @@
"config:base", "config:base",
":disableDependencyDashboard" ":disableDependencyDashboard"
], ],
"timezone": "Europe/Berlin",
"schedule": [
"every monday"
],
"labels": ["Renovate"], "labels": ["Renovate"],
"commitMessagePrefix": "build: ", "commitMessagePrefix": "build: ",
"rebaseWhen": "conflicted" "rebaseWhen": "conflicted"