Compare commits

..

27 Commits

Author SHA1 Message Date
cf117ff13b feature: add a miniplaceholders expansion 2024-01-03 11:50:15 +01:00
ead7acdd76 fix: allow pistons on merged plot road if detect-invalid-edge-pistons true (#4257)
- fixes #4232
2023-12-31 18:50:29 +00:00
1991142d48 refactor: move leave event dispact to after logic (#4260)
- closes #4171
2023-12-26 15:26:31 +00:00
63ae11b3d3 Back to snapshot for development 2023-12-25 19:54:00 +01:00
86fe3c6846 Release 7.3.1 2023-12-25 19:49:36 +01:00
a90e179338 Relocate net.kyori.options (Support newer 1.20.4 builds) (#4280)
chore/fix: relocate net.kyori.option
2023-12-25 18:32:29 +01:00
a6ae287908 Back to snapshot for development 2023-12-22 17:59:33 +01:00
1a33997099 Release 7.3.0 2023-12-22 17:54:28 +01:00
6edd4b8220 Update dependency net.kyori:adventure-platform-bukkit to v4.3.2 (#4276)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-22 17:51:28 +01:00
9b0d1e484c Update dependency com.github.spotbugs:spotbugs-annotations to v4.8.3 (#4275)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-22 17:51:20 +01:00
6971fa4c10 Update github/codeql-action action to v3 (#4274)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-22 17:36:22 +01:00
3c818f3e33 Update dependency org.checkerframework:checker-qual to v3.42.0 (#4273)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-22 17:36:14 +01:00
31be2e5eb3 Update adventure to v4.15.0 (#4272)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-22 17:36:08 +01:00
945a8ad306 Update worldedit to v7.2.18 (#4271)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-22 17:35:54 +01:00
c6b0b99cd6 Fix MM update in plot condensation 2023-12-22 17:28:00 +01:00
dbfc43e3cd feat: allow for custom plot limit handling (#4261)
* feat: allow for custom plot limit handling

* feat: allow for custom plot limit handling

* chore: use fluent setter
2023-12-18 21:07:41 +01:00
c8b4a2fa39 feat: Allow admin done permission to override requiring plot complexity calculation (#4267)
Co-authored-by: MrJoshuaT <josh@jmt.me>
2023-12-16 21:04:11 +00:00
d851e27aed Fix checkerframework javadoc URL 2023-12-16 17:34:56 +01:00
4a45729c9e feat: add projectile-change-block flag (#4185)
- closes #4081
2023-12-12 13:53:10 +00:00
7931c0864e Update dependency org.checkerframework:checker-qual to v3.41.0 (#4265)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-09 10:26:00 +01:00
1456b29d93 Update fawe to v2.8.3 (#4264)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-09 10:25:53 +01:00
761477b76d Update dependency com.diffplug.spotless to v6.23.3 (#4263)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-09 10:25:46 +01:00
e61bcf905f Back to snapshot for development 2023-12-09 10:21:05 +01:00
85bec710df Release 7.2.1 2023-12-09 10:13:42 +01:00
d130794453 Prepare for 1.20.3/4 2023-12-08 07:29:19 +01:00
f5f875eb11 feat: add HasOwner PlotFilter filter (#4259)
* feat: add HasOwner PlotFilter filter
 - closes #3831

* change since to TODO

* Address feedback

---------

Co-authored-by: Alexander Brandes <mc.cache@web.de>
2023-12-07 18:29:10 +01:00
89511f07f9 Fix: disable sign-coloring when edit-sign flag is false (#4252)
* Initial commit

* Update Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java

Co-authored-by: powercas_gamer <cas@mizule.dev>

* Relocated Item check

* Added version check when building list of items

* Use mutable set and copy to immutable

---------

Co-authored-by: powercas_gamer <cas@mizule.dev>
2023-12-06 22:56:22 +01:00
26 changed files with 356 additions and 32 deletions

View File

@ -27,7 +27,7 @@ body:
description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first.
multiple: false
options:
- '1.20.2'
- '1.20.4'
- '1.20'
- '1.19.4'
- '1.19.3'

View File

@ -27,10 +27,10 @@ jobs:
distribution: temurin
java-version: 17
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
- name: Autobuild
uses: github/codeql-action/autobuild@v2
uses: github/codeql-action/autobuild@v3
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
uses: github/codeql-action/analyze@v3

View File

@ -41,6 +41,7 @@ dependencies {
compileOnly(libs.luckperms)
compileOnly(libs.essentialsx)
compileOnly(libs.mvdwapi) { isTransitive = false }
compileOnly(libs.miniplaceholders) { isTransitive = false }
// Other libraries
implementation(libs.squirrelid) { isTransitive = false }
@ -67,6 +68,7 @@ tasks.named<ShadowJar>("shadowJar") {
exclude(dependency("org.checkerframework:"))
}
relocate("net.kyori.option", "com.plotsquared.core.configuration.option")
relocate("net.kyori.adventure", "com.plotsquared.core.configuration.adventure")
relocate("net.kyori.examination", "com.plotsquared.core.configuration.examination")
relocate("io.papermc.lib", "com.plotsquared.bukkit.paperlib")
@ -105,7 +107,7 @@ tasks {
opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/")
opt.links("https://jd.advntr.dev/api/4.14.0/")
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.isLinkSource = true
opt.bottom(File("$rootDir/javadocfooter.html").readText())
opt.isUse = true

View File

@ -35,6 +35,7 @@ import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
import com.plotsquared.core.plot.flag.implementations.EntityChangeBlockFlag;
import com.plotsquared.core.plot.flag.implementations.ExplosionFlag;
import com.plotsquared.core.plot.flag.implementations.InvincibleFlag;
import com.plotsquared.core.plot.flag.implementations.ProjectileChangeBlockFlag;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.PlotFlagUtil;
@ -358,13 +359,13 @@ public class EntityEventListener implements Listener {
if (shooter instanceof Player) {
PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter);
if (plot == null) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
if (area.isRoadFlags() && !area.getRoadFlag(ProjectileChangeBlockFlag.class) && !pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
entity.remove();
event.setCancelled(true);
}
return;
}
if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
if (plot.isAdded(pp.getUUID()) || plot.getFlag(ProjectileChangeBlockFlag.class) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
return;
}
entity.remove();

View File

@ -50,6 +50,7 @@ import com.plotsquared.core.plot.flag.implementations.DenyPortalsFlag;
import com.plotsquared.core.plot.flag.implementations.DenyTeleportFlag;
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
import com.plotsquared.core.plot.flag.implementations.DropProtectionFlag;
import com.plotsquared.core.plot.flag.implementations.EditSignFlag;
import com.plotsquared.core.plot.flag.implementations.HangingBreakFlag;
import com.plotsquared.core.plot.flag.implementations.HangingPlaceFlag;
import com.plotsquared.core.plot.flag.implementations.HostileInteractFlag;
@ -87,6 +88,7 @@ import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
import org.bukkit.block.data.Waterlogged;
import org.bukkit.command.PluginCommand;
import org.bukkit.entity.ArmorStand;
@ -175,6 +177,33 @@ public class PlayerEventListener implements Listener {
Material.WRITABLE_BOOK,
Material.WRITTEN_BOOK
);
private static final Set<String> DYES;
static {
Set<String> mutableDyes = new HashSet<>(Set.of(
"WHITE_DYE",
"LIGHT_GRAY_DYE",
"GRAY_DYE",
"BLACK_DYE",
"BROWN_DYE",
"RED_DYE",
"ORANGE_DYE",
"YELLOW_DYE",
"LIME_DYE",
"GREEN_DYE",
"CYAN_DYE",
"LIGHT_BLUE_DYE",
"BLUE_DYE",
"PURPLE_DYE",
"MAGENTA_DYE",
"PINK_DYE",
"GLOW_INK_SAC"
));
int[] version = PlotSquared.platform().serverVersion();
if (version[1] >= 20 && version[2] >= 1) {
mutableDyes.add("HONEYCOMB");
}
DYES = Set.copyOf(mutableDyes);
}
private final EventDispatcher eventDispatcher;
private final WorldEdit worldEdit;
private final PlotAreaManager plotAreaManager;
@ -207,6 +236,38 @@ public class PlayerEventListener implements Listener {
this.plotListener = plotListener;
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerDyeSign(PlayerInteractEvent event) {
ItemStack itemStack = event.getItem();
if (itemStack == null) {
return;
}
Block block = event.getClickedBlock();
if (block != null && block.getState() instanceof Sign) {
if (DYES.contains(itemStack.getType().toString())) {
Location location = BukkitUtil.adapt(block.getLocation());
PlotArea area = location.getPlotArea();
if (area == null) {
return;
}
Plot plot = location.getOwnedPlot();
if (plot == null) {
if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, EditSignFlag.class, false)) {
event.setCancelled(true);
}
return;
}
if (plot.isAdded(event.getPlayer().getUniqueId())) {
return; // allow for added players
}
if (!plot.getFlag(EditSignFlag.class)) {
plot.debug(event.getPlayer().getName() + " could not color the sign because of edit-sign = false");
event.setCancelled(true);
}
}
}
}
@EventHandler(ignoreCancelled = true)
public void onEffect(@NonNull EntityPotionEffectEvent event) {
if (Settings.Enabled_Components.DISABLE_BEACON_EFFECT_OVERFLOW ||

View File

@ -31,7 +31,7 @@ import org.bukkit.event.player.PlayerSignOpenEvent;
/**
* For events since 1.20.1
* @since TODO
* @since 7.2.1
*/
public class PlayerEventListener1201 implements Listener {

View File

@ -21,6 +21,7 @@ package com.plotsquared.bukkit.listener;
import com.google.inject.Inject;
import com.plotsquared.bukkit.BukkitPlatform;
import com.plotsquared.bukkit.placeholder.MVdWPlaceholders;
import com.plotsquared.bukkit.placeholder.MiniPlaceholders;
import com.plotsquared.bukkit.util.BukkitEconHandler;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings;
@ -52,6 +53,11 @@ public class ServerListener implements Listener {
new MVdWPlaceholders(this.plugin, this.plugin.placeholderRegistry());
ConsolePlayer.getConsole().sendMessage(TranslatableCaption.of("placeholder.hooked"));
}
if (Bukkit.getPluginManager().getPlugin("MiniPlaceholders") != null
&& Settings.Enabled_Components.USE_MINIPLACEHOLDERS) {
new MiniPlaceholders(this.plugin.placeholderRegistry());
ConsolePlayer.getConsole().sendMessage(TranslatableCaption.of("placeholder.miniplaceholders.hooked"));
}
if (Settings.Enabled_Components.ECONOMY && Bukkit.getPluginManager().isPluginEnabled("Vault")) {
EconHandler econHandler = new BukkitEconHandler();
try {

View File

@ -0,0 +1,69 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* 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.bukkit.placeholder;
import com.google.common.eventbus.Subscribe;
import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.player.ConsolePlayer;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.util.placeholders.Placeholder;
import com.plotsquared.core.util.placeholders.PlaceholderRegistry;
import io.github.miniplaceholders.api.Expansion;
import io.github.miniplaceholders.api.utils.TagsUtils;
import org.bukkit.entity.Player;
import org.checkerframework.checker.nullness.qual.NonNull;
public final class MiniPlaceholders {
private Expansion expansion = null;
private final PlaceholderRegistry registry;
public MiniPlaceholders(final @NonNull PlaceholderRegistry registry) {
this.registry = registry;
this.createExpansion();
PlotSquared.get().getEventDispatcher().registerListener(this);
}
@Subscribe
public void onNewPlaceholder(final PlaceholderRegistry.@NonNull PlaceholderAddedEvent event) {
// We cannot register placeholders on the fly, so we have to replace the expansion.
this.createExpansion();
}
private synchronized void createExpansion() {
if (this.expansion != null && this.expansion.registered()) {
this.expansion.unregister();
}
final Expansion.Builder builder = Expansion.builder("plotsquared");
for (final Placeholder placeholder : this.registry.getPlaceholders()) {
builder.audiencePlaceholder(placeholder.getKey(), (audience, argumentQueue, context) -> {
final PlotPlayer<?> plotPlayer;
if (audience instanceof Player player) {
plotPlayer = BukkitUtil.adapt(player);
} else {
plotPlayer = ConsolePlayer.getConsole();
}
return TagsUtils.staticTag(placeholder.getValue(plotPlayer));
});
}
this.expansion = builder.build();
this.expansion.register();
}
}

View File

@ -47,7 +47,13 @@ public class TranslationUpdateManager {
String usedGrants = "usedGrants";
String usedGrantsReplacement = "used_grants";
String remainingGrants = "remainingGrants";
String rremainingGrantsReplacement = "remaining_grants";
String remainingGrantsReplacement = "remaining_grants";
String minimumRadius = "minimumRadius";
String minimumRadiusReplacement = "minimum_radius";
String maximumMoves = "maximumMoves";
String maximumMovesReplacement = "maximum_moves";
String userMove = "userMove";
String userMoveReplacement = "user_move";
try (Stream<Path> paths = Files.walk(Paths.get(PlotSquared.platform().getDirectory().toPath().resolve("lang").toUri()))) {
paths
@ -58,7 +64,10 @@ public class TranslationUpdateManager {
replaceInFile(p, minHeight, minheightReplacement);
replaceInFile(p, maxHeight, maxheightReplacement);
replaceInFile(p, usedGrants, usedGrantsReplacement);
replaceInFile(p, remainingGrants, rremainingGrantsReplacement);
replaceInFile(p, remainingGrants, remainingGrantsReplacement);
replaceInFile(p, minimumRadius, minimumRadiusReplacement);
replaceInFile(p, maximumMoves, maximumMovesReplacement);
replaceInFile(p, userMove, userMoveReplacement);
});
}
}

View File

@ -71,7 +71,7 @@ tasks {
opt.links("https://jd.advntr.dev/api/4.14.0/")
opt.links("https://jd.advntr.dev/text-minimessage/4.14.0/")
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.isLinkSource = true
opt.bottom(File("$rootDir/javadocfooter.html").readText())
opt.isUse = true

View File

@ -256,11 +256,11 @@ public class Condense extends SubCommand {
player.sendMessage(TranslatableCaption.of("condense.default_eval"));
player.sendMessage(
TranslatableCaption.of("condense.minimum_radius"),
TagResolver.resolver("minimumRadius", Tag.inserting(Component.text(minimumRadius)))
TagResolver.resolver("minimum_radius", Tag.inserting(Component.text(minimumRadius)))
);
player.sendMessage(
TranslatableCaption.of("condense.maximum_moved"),
TagResolver.resolver("maxMove", Tag.inserting(Component.text(maxMove)))
TagResolver.resolver("maximum_moves", Tag.inserting(Component.text(maxMove)))
);
player.sendMessage(TranslatableCaption.of("condense.input_eval"));
player.sendMessage(
@ -269,7 +269,7 @@ public class Condense extends SubCommand {
);
player.sendMessage(
TranslatableCaption.of("condense.estimated_moves"),
TagResolver.resolver("userMove", Tag.inserting(Component.text(userMove)))
TagResolver.resolver("user_move", Tag.inserting(Component.text(userMove)))
);
player.sendMessage(TranslatableCaption.of("condense.eta"));
player.sendMessage(TranslatableCaption.of("condense.radius_measured"));

View File

@ -94,7 +94,7 @@ public class Done extends SubCommand {
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
);
final Settings.Auto_Clear doneRequirements = Settings.AUTO_CLEAR.get("done");
if (PlotSquared.platform().expireManager() == null || doneRequirements == null) {
if (PlotSquared.platform().expireManager() == null || doneRequirements == null || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DONE)) {
finish(plot, player, true);
plot.removeRunning();
} else {

View File

@ -810,6 +810,10 @@ public class Settings extends Config {
);
@Comment("Whether PlotSquared should hook into MvDWPlaceholderAPI or not")
public static boolean USE_MVDWAPI = true;
@Comment("Whether PlotSquared should hook into MiniPlaceholders")
public static boolean USE_MINIPLACEHOLDERS = true;
@Comment("Prevent cross plot beacon effects")
public static boolean DISABLE_BEACON_EFFECT_OVERFLOW = true;

View File

@ -0,0 +1,77 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* 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.events;
import com.plotsquared.core.player.PlotPlayer;
import org.checkerframework.checker.index.qual.NonNegative;
import org.checkerframework.checker.nullness.qual.NonNull;
/**
* Called every time after PlotSquared calculated a players plot limit based on their permission.
* <p>
* May be used to grant a player more plots based on another rank or bought feature.
*
* @since 7.3.0
*/
public class PlayerPlotLimitEvent {
private final PlotPlayer<?> player;
private int limit;
public PlayerPlotLimitEvent(@NonNull final PlotPlayer<?> player, @NonNegative final int limit) {
this.player = player;
this.limit = limit;
}
/**
* Overrides the previously calculated or set plot limit for {@link #player()}.
*
* @param limit The amount of plots a player may claim. Must be {@code 0} or greater.
* @since 7.3.0
*/
public void limit(@NonNegative final int limit) {
if (limit < 0) {
throw new IllegalArgumentException("Player plot limit must be greater or equal 0");
}
this.limit = limit;
}
/**
* Returns the previous set limit, if none was overridden before this event handler the default limit based on the players
* permissions node is returned.
*
* @return The currently defined plot limit of this player.
* @since 7.3.0
*/
public @NonNegative int limit() {
return limit;
}
/**
* The player for which the limit is queried.
*
* @return the player.
* @since 7.3.0
*/
public @NonNull PlotPlayer<?> player() {
return player;
}
}

View File

@ -75,7 +75,7 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
* Gets the currently applied {@link UnaryOperator<Location> transformer} or null, if none was set
*
* @return LocationTransformer
* @since TODO
* @since 7.2.1
*/
public @Nullable UnaryOperator<Location> getLocationTransformer() {
return this.locationTransformer;
@ -86,7 +86,7 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
* May be {@code null}, if any previous set transformations should be discarded.
*
* @param locationTransformer The new transformer
* @since TODO
* @since 7.2.1
*/
public void setLocationTransformer(@Nullable UnaryOperator<Location> locationTransformer) {
this.locationTransformer = locationTransformer;

View File

@ -364,7 +364,6 @@ public class PlotListener {
public boolean plotExit(final PlotPlayer<?> player, Plot plot) {
try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
final Plot previous = lastPlot.remove();
this.eventDispatcher.callLeave(player, plot);
List<StatusEffect> effects = playerEffects.remove(player.getUUID());
if (effects != null) {
@ -467,6 +466,8 @@ public class PlotListener {
feedRunnable.remove(player.getUUID());
healRunnable.remove(player.getUUID());
}
} finally {
this.eventDispatcher.callLeave(player, plot);
}
return true;
}

View File

@ -306,7 +306,8 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
* @return number of allowed plots within the scope (globally, or in the player's current world as defined in the settings.yml)
*/
public int getAllowedPlots() {
return hasPermissionRange("plots.plot", Settings.Limit.MAX_PLOTS);
final int calculatedLimit = hasPermissionRange("plots.plot", Settings.Limit.MAX_PLOTS);
return this.eventDispatcher.callPlayerPlotLimit(this, calculatedLimit).limit();
}
/**

View File

@ -89,6 +89,7 @@ import com.plotsquared.core.plot.flag.implementations.PlayerInteractFlag;
import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag;
import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag;
import com.plotsquared.core.plot.flag.implementations.PriceFlag;
import com.plotsquared.core.plot.flag.implementations.ProjectileChangeBlockFlag;
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
import com.plotsquared.core.plot.flag.implementations.PveFlag;
import com.plotsquared.core.plot.flag.implementations.PvpFlag;
@ -185,6 +186,7 @@ public final class GlobalFlagContainer extends FlagContainer {
this.addFlag(NoWorldeditFlag.NO_WORLDEDIT_FALSE);
this.addFlag(PlayerInteractFlag.PLAYER_INTERACT_FALSE);
this.addFlag(PreventCreativeCopyFlag.PREVENT_CREATIVE_COPY_FALSE);
this.addFlag(ProjectileChangeBlockFlag.PROJECTILE_CHANGE_BLOCK_FALSE);
this.addFlag(PveFlag.PVE_FALSE);
this.addFlag(PvpFlag.PVP_FALSE);
this.addFlag(RedstoneFlag.REDSTONE_TRUE);

View File

@ -23,7 +23,7 @@ import com.plotsquared.core.plot.flag.types.BooleanFlag;
import org.checkerframework.checker.nullness.qual.NonNull;
/**
* @since TODO
* @since 7.2.1
*/
public class EditSignFlag extends BooleanFlag<EditSignFlag> {
public static final EditSignFlag EDIT_SIGN_TRUE = new EditSignFlag(true);

View File

@ -0,0 +1,39 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* 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.plot.flag.implementations;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.plot.flag.types.BooleanFlag;
import org.checkerframework.checker.nullness.qual.NonNull;
public class ProjectileChangeBlockFlag extends BooleanFlag<ProjectileChangeBlockFlag> {
public static final ProjectileChangeBlockFlag PROJECTILE_CHANGE_BLOCK_TRUE = new ProjectileChangeBlockFlag(true);
public static final ProjectileChangeBlockFlag PROJECTILE_CHANGE_BLOCK_FALSE = new ProjectileChangeBlockFlag(false);
private ProjectileChangeBlockFlag(boolean value) {
super(value, TranslatableCaption.of("flags.flag_description_projectile_change_block"));
}
@Override
protected ProjectileChangeBlockFlag flagOf(@NonNull Boolean value) {
return value ? PROJECTILE_CHANGE_BLOCK_TRUE : PROJECTILE_CHANGE_BLOCK_FALSE;
}
}

View File

@ -30,6 +30,7 @@ import com.plotsquared.core.events.PlayerEnterPlotEvent;
import com.plotsquared.core.events.PlayerLeavePlotEvent;
import com.plotsquared.core.events.PlayerPlotDeniedEvent;
import com.plotsquared.core.events.PlayerPlotHelperEvent;
import com.plotsquared.core.events.PlayerPlotLimitEvent;
import com.plotsquared.core.events.PlayerPlotTrustedEvent;
import com.plotsquared.core.events.PlayerTeleportToPlotEvent;
import com.plotsquared.core.events.PlotAutoMergeEvent;
@ -308,6 +309,12 @@ public class EventDispatcher {
return event;
}
public PlayerPlotLimitEvent callPlayerPlotLimit(PlotPlayer<?> player, int calculatedLimit) {
PlayerPlotLimitEvent event = new PlayerPlotLimitEvent(player, calculatedLimit);
eventBus.post(event);
return event;
}
public void doJoinTask(final PlotPlayer<?> player) {
if (player == null) {
return; //possible future warning message to figure out where we are retrieving null

View File

@ -0,0 +1,31 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* 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.query;
import com.plotsquared.core.plot.Plot;
import org.checkerframework.checker.nullness.qual.NonNull;
class HasOwnerFilter implements PlotFilter {
@Override
public boolean accepts(final @NonNull Plot plot) {
return plot.hasOwner();
}
}

View File

@ -219,6 +219,16 @@ public final class PlotQuery implements Iterable<Plot> {
return this.addFilter(new OwnersIncludeFilter(owner.getUUID()));
}
/**
* Query only for plots that have an owner
*
* @return The query instance
* @since 7.2.1
*/
public @NonNull PlotQuery hasOwner() {
return this.addFilter(new HasOwnerFilter());
}
/**
* Query for plots with a specific alias
*

View File

@ -190,6 +190,7 @@
"core.prefix": "<dark_gray>[</dark_gray><gold>P2</gold><dark_gray>] </dark_gray>",
"core.enabled": "<prefix><gold><value> is now enabled.</gold>",
"placeholder.hooked": "<prefix><gold>PlotSquared hooked into MVdWPlaceholderAPI</gold>",
"placeholder.miniplaceholders.hooked": "<prefix><gold>PlotSquared hooked into MiniPlaceholders</gold>",
"placeholder.nan": "Not a number",
"reload.reloaded_configs": "<prefix><gold>Translations and world settings have been reloaded successfully.</gold>",
"reload.reload_failed": "<prefix><red>Failed to reload file configurations.</red>",
@ -248,11 +249,11 @@
"condense.skipping": "<prefix><red>Skipping complex plot: </red><gold><plot></gold><red>.</red>",
"condense.task_stopped": "<prefix><gold>Task already stopped.</gold>",
"condense.default_eval": "<dark_gray><strikethrough>=== <reset> <gold>DEFAULT EVAL </gold><dark_gray><strikethrough>===</dark_gray>",
"condense.minimum_radius": "<gold>Minimum radius: </gold><gray><minimumRadius></gray>",
"condense.maximum_moved": "<gold>Maximum moved: </gold><gray><maximumMoves></gray>",
"condense.minimum_radius": "<gold>Minimum radius: </gold><gray><minimum_radius></gray>",
"condense.maximum_moved": "<gold>Maximum moved: </gold><gray><maximum_moves></gray>",
"condense.input_eval": "<dark_gray><strikethrough>=== <reset> <gold>INPUT EVAL </gold><dark_gray><strikethrough>===</dark_gray>",
"condense.input_radius": "<gold>Input radius: </gold><gray><radius></gray>",
"condense.estimated_moves": "<gold>Estimated moves: </gold><gray><userMove></gray>",
"condense.estimated_moves": "<gold>Estimated moves: </gold><gray><user_move></gray>",
"condense.eta": "<prefix><gold>Estimated time: No idea, times will drastically change based on the system performance and load.</gold>",
"condense.radius_measured": "<yellow> - Radius is measured in plot width.</yellow>",
"database.starting_conversion": "<prefix><gold>Starting...</gold>",
@ -589,6 +590,7 @@
"flags.flag_description_place": "<gray>Define a list of materials players should be able to place in the plot.</gray>",
"flags.flag_description_player_interact": "<gray>Set to `true` to allow guests to interact with players in the plot.</gray>",
"flags.flag_description_price": "<gray>Set a price for a plot. Must be a positive decimal number.</gray>",
"flags.flag_description_projectile_change_block": "<gray>Set to `true` to allow projectiles to change blocks (tnt, etc.) on the plot.</gray>",
"flags.flag_description_pve": "<gray>Set to `true` to enable PVE inside the plot.</gray>",
"flags.flag_description_pvp": "<gray>Set to `true` to enable PVP inside the plot.</gray>",
"flags.flag_description_redstone": "<gray>Set to `false` to disable redstone in the plot.</gray>",

View File

@ -22,7 +22,7 @@ plugins {
}
group = "com.intellectualsites.plotsquared"
version = "7.2.1-SNAPSHOT"
version = "7.3.2-SNAPSHOT"
if (!File("$rootDir/.git").exists()) {
logger.lifecycle("""
@ -225,7 +225,7 @@ tasks.getByName<Jar>("jar") {
enabled = false
}
val supportedVersions = listOf("1.16.5", "1.17.1", "1.18.2", "1.19.4", "1.20.1", "1.20.2")
val supportedVersions = listOf("1.16.5", "1.17.1", "1.18.2", "1.19.4", "1.20.1", "1.20.4")
tasks {
register("cacheLatestFaweArtifact") {
val lastSuccessfulBuildUrl = uri("https://ci.athion.net/job/FastAsyncWorldEdit/lastSuccessfulBuild/api/json").toURL()

View File

@ -2,22 +2,23 @@
# Platform expectations
paper = "1.20.2-R0.1-SNAPSHOT"
guice = "7.0.0"
spotbugs = "4.8.2"
checkerqual = "3.40.0"
spotbugs = "4.8.3"
checkerqual = "3.42.0"
gson = "2.10"
guava = "31.1-jre"
snakeyaml = "2.0"
adventure = "4.14.0"
adventure-bukkit = "4.3.1"
adventure = "4.15.0"
adventure-bukkit = "4.3.2"
log4j = "2.19.0"
# Plugins
worldedit = "7.2.17"
fawe = "2.8.2"
worldedit = "7.2.18"
fawe = "2.8.3"
placeholderapi = "2.11.5"
luckperms = "5.4"
essentialsx = "2.20.1"
mvdwapi = "3.1.1"
miniplaceholders = "2.2.3"
# Third party
prtree = "2.0.1"
@ -35,7 +36,7 @@ serverlib = "2.3.4"
# Gradle plugins
shadow = "8.1.1"
grgit = "4.1.1"
spotless = "6.23.2"
spotless = "6.23.3"
nexus = "1.3.0"
runPaper = "2.2.2"
@ -68,6 +69,7 @@ prtree = { group = "com.intellectualsites.prtree", name = "PRTree", version.ref
aopalliance = { group = "aopalliance", name = "aopalliance", version.ref = "aopalliance" }
cloudServices = { group = "cloud.commandframework", name = "cloud-services", version.ref = "cloud-services" }
mvdwapi = { group = "com.intellectualsites.mvdwplaceholderapi", name = "MVdWPlaceholderAPI", version.ref = "mvdwapi" }
miniplaceholders = { group = "io.github.miniplaceholders", name = "miniplaceholders-api", version.ref = "miniplaceholders" }
squirrelid = { group = "org.enginehub", name = "squirrelid", version.ref = "squirrelid" }
arkitektonika = { group = "com.intellectualsites.arkitektonika", name = "Arkitektonika-Client", version.ref = "arkitektonika" }
paster = { group = "com.intellectualsites.paster", name = "Paster", version.ref = "paster" }