Compare commits

..

1 Commits

Author SHA1 Message Date
69552fd688 Update dependency net.essentialsx:EssentialsX to v2.20.1 2023-08-08 20:35:38 +00:00
82 changed files with 466 additions and 1346 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.4'
- '1.20.1'
- '1.20'
- '1.19.4'
- '1.19.3'

View File

@ -14,6 +14,6 @@
"com.google.code.gson:gson",
"com.google.guava:guava",
"org.yaml:snakeyaml",
"org.apache.logging.log4j:log4j-api"
"org.apache.logging.log4j:log4j-api",
]
}

View File

@ -9,11 +9,11 @@ jobs:
os: [ ubuntu-latest, windows-latest, macos-latest ]
steps:
- name: Checkout Repository
uses: actions/checkout@v4
uses: actions/checkout@v3
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
- name: Setup Java
uses: actions/setup-java@v4
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17

View File

@ -9,11 +9,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
uses: actions/checkout@v3
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
- name: Setup Java
uses: actions/setup-java@v4
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17

View File

@ -20,17 +20,17 @@ jobs:
language: [ 'java' ]
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v3
- name: Setup Java
uses: actions/setup-java@v4
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
- name: Autobuild
uses: github/codeql-action/autobuild@v3
uses: github/codeql-action/autobuild@v2
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@v2

View File

@ -1,23 +0,0 @@
name: "Label conflicting PRs"
on:
push:
pull_request_target:
types: [ synchronize ]
pull_request:
types: [ synchronize ]
permissions:
pull-requests: write
jobs:
main:
if: github.event.pull_request.user.login != 'dependabot[bot]'
runs-on: ubuntu-latest
steps:
- name: Label conflicting PRs
uses: eps1lon/actions-label-merge-conflict@v2.1.0
with:
dirtyLabel: "unresolved-merge-conflict"
repoToken: "${{ secrets.GITHUB_TOKEN }}"
commentOnDirty: "Please take a moment and address the merge conflicts of your pull request. Thanks!"
continueOnMissingPermissions: true

5
.gitignore vendored
View File

@ -138,5 +138,6 @@ build/
.DS_Store
# Ignore run folders
run-[0-9].[0-9][0-9]/
run-[0-9].[0-9][0-9].[0-9]/
run-[0-0].[0-9]/
run-[0-0].[0-9].[0-9]/

View File

@ -41,7 +41,6 @@ dependencies {
compileOnly(libs.luckperms)
compileOnly(libs.essentialsx)
compileOnly(libs.mvdwapi) { isTransitive = false }
compileOnly(libs.miniplaceholders) { isTransitive = false }
// Other libraries
implementation(libs.squirrelid) { isTransitive = false }
@ -68,7 +67,6 @@ 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")
@ -102,12 +100,12 @@ tasks {
withType<Javadoc> {
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
val opt = options as StandardJavadocDocletOptions
opt.links("https://jd.papermc.io/paper/1.20/")
opt.links("https://jd.papermc.io/paper/1.19/")
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
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

@ -37,7 +37,6 @@ import com.plotsquared.bukkit.listener.EntityEventListener;
import com.plotsquared.bukkit.listener.EntitySpawnListener;
import com.plotsquared.bukkit.listener.PaperListener;
import com.plotsquared.bukkit.listener.PlayerEventListener;
import com.plotsquared.bukkit.listener.PlayerEventListener1201;
import com.plotsquared.bukkit.listener.ProjectileEventListener;
import com.plotsquared.bukkit.listener.ServerListener;
import com.plotsquared.bukkit.listener.SingleWorldListener;
@ -51,7 +50,6 @@ import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.bukkit.util.BukkitWorld;
import com.plotsquared.bukkit.util.SetGenCB;
import com.plotsquared.bukkit.util.TranslationUpdateManager;
import com.plotsquared.bukkit.util.UpdateUtility;
import com.plotsquared.bukkit.util.task.BukkitTaskManager;
import com.plotsquared.bukkit.util.task.PaperTimeConverter;
import com.plotsquared.bukkit.util.task.SpigotTimeConverter;
@ -136,7 +134,6 @@ import org.bukkit.generator.ChunkGenerator;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
@ -254,7 +251,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
}
@Override
@SuppressWarnings("deprecation") // Paper deprecation
public void onEnable() {
this.pluginName = getDescription().getName();
@ -306,9 +302,11 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
this.serverLocale = Locale.forLanguageTag(Settings.Enabled_Components.DEFAULT_LOCALE);
/* TODO Enable update checker before v7 is released to GA
if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) {
injector.getInstance(UpdateUtility.class).updateChecker();
}
*/
if (PremiumVerification.isPremium()) {
LOGGER.info("PlotSquared version licensed to Spigot user {}", getUserID());
@ -360,9 +358,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
if (Settings.Enabled_Components.EVENTS) {
getServer().getPluginManager().registerEvents(injector().getInstance(PlayerEventListener.class), this);
if ((serverVersion()[1] == 20 && serverVersion()[2] >= 1) || serverVersion()[1] > 20) {
getServer().getPluginManager().registerEvents(injector().getInstance(PlayerEventListener1201.class), this);
}
getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener.class), this);
if (serverVersion()[1] >= 17) {
getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener117.class), this);
@ -556,7 +551,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
this.startMetrics();
if (Settings.Enabled_Components.WORLDS) {
TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(10L));
TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(1L));
try {
singleWorldListener = injector().getInstance(SingleWorldListener.class);
Bukkit.getPluginManager().registerEvents(singleWorldListener, this);
@ -818,7 +813,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
case "MINECART_MOB_SPAWNER":
case "ENDER_CRYSTAL":
case "MINECART_TNT":
case "CHEST_BOAT":
case "BOAT":
if (Settings.Enabled_Components.KILL_ROAD_VEHICLES) {
com.plotsquared.core.location.Location location = BukkitUtil.adapt(entity.getLocation());
@ -1167,7 +1161,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
return new BukkitPlotGenerator(world, generator, this.plotAreaManager);
}
@SuppressWarnings("deprecation") // Paper deprecation
@Override
public @NonNull String pluginsFormatted() {
StringBuilder msg = new StringBuilder();
@ -1184,23 +1177,12 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
.append(" • Load Before: ").append(p.getDescription().getLoadBefore()).append("\n")
.append(" • Dependencies: ").append(p.getDescription().getDepend()).append("\n")
.append(" • Soft Dependencies: ").append(p.getDescription().getSoftDepend()).append("\n");
List<RegisteredServiceProvider<?>> providers = Bukkit.getServicesManager().getRegistrations(p);
if (!providers.isEmpty()) {
msg.append(" • Provided Services: \n");
for (RegisteredServiceProvider<?> provider : providers) {
msg.append("")
.append(provider.getService().getName()).append(" = ")
.append(provider.getProvider().getClass().getName())
.append(" (priority: ").append(provider.getPriority()).append(")")
.append("\n");
}
}
}
return msg.toString();
}
@Override
@SuppressWarnings({"ConstantConditions", "deprecation"}) // Paper deprecation
@SuppressWarnings("ConstantConditions")
public @NonNull String worldEditImplementations() {
StringBuilder msg = new StringBuilder();
if (Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit") != null) {

View File

@ -33,7 +33,6 @@ import org.bukkit.entity.Ageable;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Bat;
import org.bukkit.entity.Boat;
import org.bukkit.entity.Breedable;
import org.bukkit.entity.ChestedHorse;
import org.bukkit.entity.EnderDragon;
import org.bukkit.entity.Entity;
@ -75,7 +74,6 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
private HorseStats horse;
private boolean noGravity;
@SuppressWarnings("deprecation") // Deprecation exists since 1.20, while we support 1.16 onwards
public ReplicatingEntityWrapper(Entity entity, short depth) {
super(entity);
@ -166,7 +164,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
//this.horse.style = horse.getStyle();
//this.horse.color = horse.getColor();
storeTameable(horse);
storeBreedable(horse);
storeAgeable(horse);
storeLiving(horse);
storeInventory(horse);
return;
@ -174,7 +172,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
// END INVENTORY HOLDER //
case "WOLF", "OCELOT" -> {
storeTameable((Tameable) entity);
storeBreedable((Breedable) entity);
storeAgeable((Ageable) entity);
storeLiving((LivingEntity) entity);
return;
}
@ -188,18 +186,18 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
this.dataByte = (byte) 0;
}
this.dataByte2 = sheep.getColor().getDyeData();
storeBreedable(sheep);
storeAgeable(sheep);
storeLiving(sheep);
return;
}
case "VILLAGER", "CHICKEN", "COW", "MUSHROOM_COW", "PIG", "TURTLE", "POLAR_BEAR" -> {
storeBreedable((Breedable) entity);
storeAgeable((Ageable) entity);
storeLiving((LivingEntity) entity);
return;
}
case "RABBIT" -> {
this.dataByte = getOrdinal(Rabbit.Type.values(), ((Rabbit) entity).getRabbitType());
storeBreedable((Breedable) entity);
storeAgeable((Ageable) entity);
storeLiving((LivingEntity) entity);
return;
}
@ -383,11 +381,6 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
}
}
/**
* @deprecated Use {@link #restoreBreedable(Breedable)} instead
* @since 7.1.0
*/
@Deprecated(forRemoval = true, since = "7.1.0")
private void restoreAgeable(Ageable entity) {
if (!this.aged.adult) {
entity.setBaby();
@ -398,11 +391,6 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
}
}
/**
* @deprecated Use {@link #storeBreedable(Breedable)} instead
* @since 7.1.0
*/
@Deprecated(forRemoval = true, since = "7.1.0")
public void storeAgeable(Ageable aged) {
this.aged = new AgeableStats();
this.aged.age = aged.getAge();
@ -410,29 +398,6 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
this.aged.adult = aged.isAdult();
}
/**
* @since 7.1.0
*/
private void restoreBreedable(Breedable entity) {
if (!this.aged.adult) {
entity.setBaby();
}
entity.setAgeLock(this.aged.locked);
if (this.aged.age > 0) {
entity.setAge(this.aged.age);
}
}
/**
* @since 7.1.0
*/
private void storeBreedable(Breedable breedable) {
this.aged = new AgeableStats();
this.aged.age = breedable.getAge();
this.aged.locked = breedable.getAgeLock();
this.aged.adult = breedable.isAdult();
}
public void storeTameable(Tameable tamed) {
this.tamed = new TameableStats();
this.tamed.owner = tamed.getOwner();
@ -536,7 +501,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
//horse.setStyle(this.horse.style);
//horse.setColor(this.horse.color);
restoreTameable(horse);
restoreBreedable(horse);
restoreAgeable(horse);
restoreLiving(horse);
restoreInventory(horse);
return entity;
@ -544,7 +509,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
// END INVENTORY HOLDER //
case "WOLF", "OCELOT" -> {
restoreTameable((Tameable) entity);
restoreBreedable((Breedable) entity);
restoreAgeable((Ageable) entity);
restoreLiving((LivingEntity) entity);
return entity;
}
@ -557,12 +522,12 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
if (this.dataByte2 != 0) {
sheep.setColor(DyeColor.getByDyeData(this.dataByte2));
}
restoreBreedable(sheep);
restoreAgeable(sheep);
restoreLiving(sheep);
return sheep;
}
case "VILLAGER", "CHICKEN", "COW", "TURTLE", "POLAR_BEAR", "MUSHROOM_COW", "PIG" -> {
restoreBreedable((Breedable) entity);
restoreAgeable((Ageable) entity);
restoreLiving((LivingEntity) entity);
return entity;
}
@ -571,7 +536,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
if (this.dataByte != 0) {
((Rabbit) entity).setRabbitType(Rabbit.Type.values()[this.dataByte]);
}
restoreBreedable((Breedable) entity);
restoreAgeable((Ageable) entity);
restoreLiving((LivingEntity) entity);
return entity;
}

View File

@ -23,13 +23,13 @@ import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.google.inject.assistedinject.FactoryModuleBuilder;
import com.plotsquared.bukkit.BukkitPlatform;
import com.plotsquared.bukkit.listener.ServerListener;
import com.plotsquared.bukkit.listener.SingleWorldListener;
import com.plotsquared.bukkit.player.BukkitPlayerManager;
import com.plotsquared.bukkit.queue.BukkitChunkCoordinator;
import com.plotsquared.bukkit.queue.BukkitQueueCoordinator;
import com.plotsquared.bukkit.schematic.BukkitSchematicHandler;
import com.plotsquared.bukkit.util.BukkitChunkManager;
import com.plotsquared.bukkit.util.BukkitEconHandler;
import com.plotsquared.bukkit.util.BukkitInventoryUtil;
import com.plotsquared.bukkit.util.BukkitRegionManager;
import com.plotsquared.bukkit.util.BukkitSetupUtils;
@ -47,9 +47,6 @@ import com.plotsquared.core.inject.factory.ChunkCoordinatorBuilderFactory;
import com.plotsquared.core.inject.factory.ChunkCoordinatorFactory;
import com.plotsquared.core.inject.factory.HybridPlotWorldFactory;
import com.plotsquared.core.inject.factory.ProgressSubscriberFactory;
import com.plotsquared.core.player.OfflinePlotPlayer;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.world.DefaultPlotAreaManager;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.plot.world.SinglePlotAreaManager;
@ -75,8 +72,6 @@ import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.plugin.java.JavaPlugin;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.Objects;
public class BukkitModule extends AbstractModule {
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitModule.class.getSimpleName());
@ -133,64 +128,21 @@ public class BukkitModule extends AbstractModule {
@Provides
@Singleton
@NonNull EconHandler provideEconHandler() {
if (!Settings.Enabled_Components.ECONOMY || !Bukkit.getPluginManager().isPluginEnabled("Vault")) {
if (!Settings.Enabled_Components.ECONOMY) {
return EconHandler.nullEconHandler();
}
// Guice eagerly initializes singletons, so we need to bring the laziness ourselves
return new LazyEconHandler();
}
private static final class LazyEconHandler extends EconHandler implements ServerListener.MutableEconHandler {
private volatile EconHandler implementation;
public void setImplementation(EconHandler econHandler) {
this.implementation = econHandler;
if (Bukkit.getPluginManager().isPluginEnabled("Vault")) {
try {
BukkitEconHandler econHandler = new BukkitEconHandler();
if (!econHandler.init()) {
LOGGER.warn("Economy is enabled but no plugin is providing an economy service. Falling back...");
return EconHandler.nullEconHandler();
}
return econHandler;
} catch (final Exception ignored) {
}
}
@Override
public boolean init() {
return get().init();
}
@Override
public double getBalance(final PlotPlayer<?> player) {
return get().getBalance(player);
}
@Override
public void withdrawMoney(final PlotPlayer<?> player, final double amount) {
get().withdrawMoney(player, amount);
}
@Override
public void depositMoney(final PlotPlayer<?> player, final double amount) {
get().depositMoney(player, amount);
}
@Override
public void depositMoney(final OfflinePlotPlayer player, final double amount) {
get().depositMoney(player, amount);
}
@Override
public boolean isEnabled(final PlotArea plotArea) {
return get().isEnabled(plotArea);
}
@Override
public @NonNull String format(final double balance) {
return get().format(balance);
}
@Override
public boolean isSupported() {
return get().isSupported();
}
private EconHandler get() {
return Objects.requireNonNull(this.implementation, "EconHandler not ready yet.");
}
return EconHandler.nullEconHandler();
}
}

View File

@ -33,7 +33,6 @@ import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.flag.implementations.BlockBurnFlag;
import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag;
import com.plotsquared.core.plot.flag.implementations.BreakFlag;
import com.plotsquared.core.plot.flag.implementations.ConcreteHardenFlag;
import com.plotsquared.core.plot.flag.implementations.CoralDryFlag;
import com.plotsquared.core.plot.flag.implementations.CropGrowFlag;
import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
@ -261,10 +260,7 @@ public class BlockEventListener implements Listener {
final BlockFace facing = piston.getFacing();
location = location.add(facing.getModX(), facing.getModY(), facing.getModZ());
Plot newPlot = area.getOwnedPlotAbs(location);
if (plot.equals(newPlot)) {
return;
}
if (!plot.isMerged() || !plot.getConnectedPlots().contains(newPlot)) {
if (!plot.equals(newPlot)) {
event.setCancelled(true);
plot.debug("Prevented piston update because of invalid edge piston detection");
}
@ -590,12 +586,6 @@ public class BlockEventListener implements Listener {
event.setCancelled(true);
}
}
if (event.getNewState().getType().toString().endsWith("CONCRETE")) {
if (!plot.getFlag(ConcreteHardenFlag.class)) {
plot.debug("Concrete powder could not harden because concrete-harden = false");
event.setCancelled(true);
}
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)

View File

@ -35,7 +35,6 @@ 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;
@ -144,10 +143,6 @@ public class EntityEventListener implements Listener {
if (area == null) {
return;
}
// Armour-stands are handled elsewhere and should not be handled by area-wide entity-spawn options
if (entity.getType() == EntityType.ARMOR_STAND) {
return;
}
CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason();
switch (reason.toString()) {
case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> {
@ -158,7 +153,7 @@ public class EntityEventListener implements Listener {
}
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
"TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL",
"DUPLICATION", "FROZEN", "SPELL", "DEFAULT" -> {
"DUPLICATION", "FROZEN", "SPELL" -> {
if (!area.isMobSpawning()) {
event.setCancelled(true);
return;
@ -171,7 +166,7 @@ public class EntityEventListener implements Listener {
}
}
case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
if (!area.isSpawnCustom()) {
if (!area.isSpawnCustom() && entity.getType() != EntityType.ARMOR_STAND) {
event.setCancelled(true);
return;
}
@ -359,13 +354,13 @@ public class EntityEventListener implements Listener {
if (shooter instanceof Player) {
PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter);
if (plot == null) {
if (area.isRoadFlags() && !area.getRoadFlag(ProjectileChangeBlockFlag.class) && !pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
entity.remove();
event.setCancelled(true);
}
return;
}
if (plot.isAdded(pp.getUUID()) || plot.getFlag(ProjectileChangeBlockFlag.class) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
return;
}
entity.remove();

View File

@ -124,7 +124,7 @@ public class PaperListener implements Listener {
}
Slime slime = event.getEntity();
Block b = slime.getTargetBlockExact(4);
Block b = slime.getTargetBlock(4);
if (b == null) {
return;
}
@ -166,16 +166,12 @@ public class PaperListener implements Listener {
}
Location location = BukkitUtil.adapt(event.getSpawnLocation());
PlotArea area = location.getPlotArea();
if (area == null) {
if (!location.isPlotArea()) {
return;
}
// Armour-stands are handled elsewhere and should not be handled by area-wide entity-spawn options
if (event.getType() == EntityType.ARMOR_STAND) {
return;
}
// If entities are spawning... the chunk should be loaded?
//If entities are spawning... the chunk should be loaded?
Entity[] entities = event.getSpawnLocation().getChunk().getEntities();
if (entities.length >= Settings.Chunk_Processor.MAX_ENTITIES) {
if (entities.length > Settings.Chunk_Processor.MAX_ENTITIES) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
return;
@ -204,7 +200,7 @@ public class PaperListener implements Listener {
}
}
case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
if (!area.isSpawnCustom()) {
if (!area.isSpawnCustom() && event.getType() != EntityType.ARMOR_STAND) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
return;

View File

@ -50,7 +50,6 @@ 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;
@ -88,7 +87,6 @@ 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;
@ -177,33 +175,6 @@ 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;
@ -236,38 +207,6 @@ 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 ||
@ -430,7 +369,6 @@ public class PlayerEventListener implements Listener {
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
@SuppressWarnings("deprecation") // Paper deprecation
public void onConnect(PlayerJoinEvent event) {
final Player player = event.getPlayer();
PlotSquared.platform().playerManager().removePlayer(player.getUniqueId());
@ -669,7 +607,7 @@ public class PlayerEventListener implements Listener {
this.tmpTeleport = true;
return;
}
int border = area.getBorder(true);
int border = area.getBorder();
int x1;
if (x2 > border && this.tmpTeleport) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
@ -764,7 +702,7 @@ public class PlayerEventListener implements Listener {
this.tmpTeleport = true;
return;
}
int border = area.getBorder(true);
int border = area.getBorder();
int z1;
if (z2 > border && this.tmpTeleport) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
@ -795,7 +733,6 @@ public class PlayerEventListener implements Listener {
}
@EventHandler(priority = EventPriority.LOW)
@SuppressWarnings("deprecation") // Paper deprecation
public void onChat(AsyncPlayerChatEvent event) {
if (event.isCancelled()) {
return;
@ -1126,7 +1063,6 @@ public class PlayerEventListener implements Listener {
}
@EventHandler(priority = EventPriority.LOW)
@SuppressWarnings("deprecation") // Paper deprecation
public void onCancelledInteract(PlayerInteractEvent event) {
if (event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_AIR) {
Player player = event.getPlayer();

View File

@ -1,63 +0,0 @@
/*
* 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.listener;
import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.flag.implementations.EditSignFlag;
import com.plotsquared.core.util.PlotFlagUtil;
import org.bukkit.block.Sign;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerSignOpenEvent;
/**
* For events since 1.20.1
* @since 7.2.1
*/
public class PlayerEventListener1201 implements Listener {
@EventHandler(ignoreCancelled = true)
@SuppressWarnings({"removal", "UnstableApiUsage"}) // thanks Paper, thanks Spigot
public void onPlayerSignOpenEvent(PlayerSignOpenEvent event) {
Sign sign = event.getSign();
Location location = BukkitUtil.adapt(sign.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 edit the sign because of edit-sign = false");
event.setCancelled(true);
}
}
}

View File

@ -21,15 +21,9 @@ 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;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.player.ConsolePlayer;
import com.plotsquared.core.util.EconHandler;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@ -38,8 +32,6 @@ import org.checkerframework.checker.nullness.qual.NonNull;
public class ServerListener implements Listener {
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ServerListener.class.getSimpleName());
private final BukkitPlatform plugin;
@Inject
@ -53,34 +45,6 @@ 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 {
if (!econHandler.init()) {
LOGGER.warn("Economy is enabled but no plugin is providing an economy service. Falling back...");
econHandler = EconHandler.nullEconHandler();
}
} catch (final Exception ignored) {
econHandler = EconHandler.nullEconHandler();
}
if (PlotSquared.platform().econHandler() instanceof MutableEconHandler meh) {
meh.setImplementation(econHandler);
}
}
}
/**
* Internal use only. Required to implement lazy econ loading using Guice.
*
* @since 7.2.0
*/
public interface MutableEconHandler {
void setImplementation(EconHandler econHandler);
}
}

View File

@ -1,69 +0,0 @@
/*
* 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

@ -158,7 +158,6 @@ public class BukkitPlayer extends PlotPlayer<Player> {
}
final String[] nodes = stub.split("\\.");
final StringBuilder n = new StringBuilder();
// Wildcard check from less specific permission to more specific permission
for (int i = 0; i < (nodes.length - 1); i++) {
n.append(nodes[i]).append(".");
if (!stub.equals(n + Permission.PERMISSION_STAR.toString())) {
@ -167,11 +166,9 @@ public class BukkitPlayer extends PlotPlayer<Player> {
}
}
}
// Wildcard check for the full permission
if (hasPermission(stub + ".*")) {
return Integer.MAX_VALUE;
}
// Permission value cache for iterative check
int max = 0;
if (CHECK_EFFECTIVE) {
boolean hasAny = false;

View File

@ -44,7 +44,6 @@ import java.util.stream.IntStream;
@Singleton
public class BukkitInventoryUtil extends InventoryUtil {
@SuppressWarnings("deprecation") // Paper deprecation
private static @Nullable ItemStack getItem(PlotItemStack item) {
if (item == null) {
return null;

View File

@ -67,7 +67,6 @@ public class BukkitSetupUtils extends SetupUtils {
this.worldFile = worldFile;
}
@SuppressWarnings("deprecation") // Paper deprecation
@Override
public void updateGenerators(final boolean force) {
if (loaded && !SetupUtils.generators.isEmpty() && !force) {

View File

@ -44,16 +44,6 @@ public class TranslationUpdateManager {
String minheightReplacement = "minheight";
String maxHeight = "maxHeight";
String maxheightReplacement = "maxheight";
String usedGrants = "usedGrants";
String usedGrantsReplacement = "used_grants";
String remainingGrants = "remainingGrants";
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
@ -63,11 +53,6 @@ public class TranslationUpdateManager {
replaceInFile(p, suggestCommand, suggestCommandReplacement);
replaceInFile(p, minHeight, minheightReplacement);
replaceInFile(p, maxHeight, maxheightReplacement);
replaceInFile(p, usedGrants, usedGrantsReplacement);
replaceInFile(p, remainingGrants, remainingGrantsReplacement);
replaceInFile(p, minimumRadius, minimumRadiusReplacement);
replaceInFile(p, maximumMoves, maximumMovesReplacement);
replaceInFile(p, userMove, userMoveReplacement);
});
}
}

View File

@ -35,7 +35,7 @@ import org.bukkit.scheduler.BukkitTask;
import javax.net.ssl.HttpsURLConnection;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URL;
public class UpdateUtility implements Listener {
@ -59,9 +59,8 @@ public class UpdateUtility implements Listener {
public void updateChecker() {
task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> {
try {
HttpsURLConnection connection = (HttpsURLConnection) URI.create(
"https://api.spigotmc.org/simple/0.2/index.php?action=getResource&id=77506")
.toURL()
HttpsURLConnection connection = (HttpsURLConnection) new URL(
"https://api.spigotmc.org/simple/0.1/index.php?action=getResource&id=77506")
.openConnection();
connection.setRequestMethod("GET");
JsonObject result = new JsonParser()

76
CODE_OF_CONDUCT.md Normal file
View File

@ -0,0 +1,76 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at contact<at>intellectualsites.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq

View File

@ -57,8 +57,8 @@ tasks.processResources {
doLast {
copy {
from(layout.buildDirectory.file("$rootDir/LICENSE"))
into(layout.buildDirectory.dir("resources/main"))
from(File("$rootDir/LICENSE"))
into("$buildDir/resources/main/")
}
}
}
@ -71,7 +71,8 @@ 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.links("https://javadoc.io/doc/com.intellectualsites.informative-annotations/informative-annotations/latest/")
opt.isLinkSource = true
opt.bottom(File("$rootDir/javadocfooter.html").readText())
opt.isUse = true

View File

@ -84,7 +84,7 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.URI;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Files;
@ -210,10 +210,9 @@ public class PlotSquared {
try {
URL logurl = PlotSquared.class.getProtectionDomain().getCodeSource().getLocation();
this.jarFile = new File(
URI.create(
logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file"))
.getPath());
} catch (URISyntaxException | SecurityException e) {
new URL(logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file"))
.toURI().getPath());
} catch (MalformedURLException | URISyntaxException | SecurityException e) {
e.printStackTrace();
this.jarFile = new File(this.platform.getDirectory().getParentFile(), "PlotSquared.jar");
if (!this.jarFile.exists()) {
@ -1282,7 +1281,7 @@ public class PlotSquared {
}
/**
* Set up the database connection.
* Setup the database connection.
*/
public void setupDatabase() {
try {

View File

@ -19,7 +19,6 @@
package com.plotsquared.core.command;
import com.google.inject.Inject;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc;
@ -102,14 +101,9 @@ public class Add extends Command {
Permission.PERMISSION_ADMIN_COMMAND_TRUST))) {
player.sendMessage(
TranslatableCaption.of("errors.invalid_player"),
PlotSquared
.platform()
.playerManager()
.getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"value",
Tag.inserting(caption.toComponent(player))
))
TagResolver.resolver("value", Tag.inserting(
PlayerManager.resolveName(uuid).toComponent(player)
))
);
iterator.remove();
continue;
@ -117,11 +111,9 @@ public class Add extends Command {
if (plot.isOwner(uuid)) {
player.sendMessage(
TranslatableCaption.of("member.already_added"),
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"player",
Tag.inserting(caption.toComponent(player))
))
TagResolver.resolver("player", Tag.inserting(
PlayerManager.resolveName(uuid).toComponent(player)
))
);
iterator.remove();
continue;
@ -129,11 +121,9 @@ public class Add extends Command {
if (plot.getMembers().contains(uuid)) {
player.sendMessage(
TranslatableCaption.of("member.already_added"),
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"player",
Tag.inserting(caption.toComponent(player))
))
TagResolver.resolver("player", Tag.inserting(
PlayerManager.resolveName(uuid).toComponent(player)
))
);
iterator.remove();
continue;

View File

@ -131,8 +131,8 @@ public class Auto extends SubCommand {
player.sendMessage(
TranslatableCaption.of("economy.removed_granted_plot"),
TagResolver.builder()
.tag("used_grants", Tag.inserting(Component.text(grantedPlots - left)))
.tag("remaining_grants", Tag.inserting(Component.text(left)))
.tag("usedGrants", Tag.inserting(Component.text(grantedPlots - left)))
.tag("remainingGrants", Tag.inserting(Component.text(left)))
.build()
);
}

View File

@ -186,14 +186,14 @@ public class Claim extends SubCommand {
player.sendMessage(
TranslatableCaption.of("economy.removed_granted_plot"),
TagResolver.builder()
.tag("used_grants", Tag.inserting(Component.text(grants - 1)))
.tag("remaining_grants", Tag.inserting(Component.text(grants)))
.tag("usedGrants", Tag.inserting(Component.text(grants - 1)))
.tag("remainingGrants", Tag.inserting(Component.text(grants)))
.build()
);
}
}
if (!player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
int border = area.getBorder(false);
int border = area.getBorder();
if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border && !force) {
player.sendMessage(TranslatableCaption.of("border.denied"));
return false;

View File

@ -25,7 +25,6 @@ import com.plotsquared.core.player.PlotPlayer;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull;
/**
* CommandCategory.
@ -83,7 +82,7 @@ public enum CommandCategory implements Caption {
// TODO this method shouldn't be invoked
@Deprecated
@Override
public @NotNull String toString() {
public String toString() {
return this.caption.getComponent(LocaleHolder.console());
}
@ -109,5 +108,4 @@ public enum CommandCategory implements Caption {
return !MainCommand.getInstance().getCommands(this, player).isEmpty();
}
}

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("minimum_radius", Tag.inserting(Component.text(minimumRadius)))
TagResolver.resolver("minimumRadius", Tag.inserting(Component.text(minimumRadius)))
);
player.sendMessage(
TranslatableCaption.of("condense.maximum_moved"),
TagResolver.resolver("maximum_moves", Tag.inserting(Component.text(maxMove)))
TagResolver.resolver("maxMove", 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("user_move", Tag.inserting(Component.text(userMove)))
TagResolver.resolver("userMove", Tag.inserting(Component.text(userMove)))
);
player.sendMessage(TranslatableCaption.of("condense.eta"));
player.sendMessage(TranslatableCaption.of("condense.radius_measured"));

View File

@ -29,6 +29,7 @@ import com.plotsquared.core.util.WorldUtil;
import com.plotsquared.core.util.entity.EntityCategories;
import com.plotsquared.core.util.entity.EntityCategory;
import com.plotsquared.core.util.query.PlotQuery;
import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.uuid.UUIDMapping;
import com.sk89q.worldedit.world.entity.EntityType;
import net.kyori.adventure.text.Component;
@ -70,7 +71,7 @@ public class Debug extends SubCommand {
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text("/plot debug <player | debug-players | entitytypes | msg>"))
Tag.inserting(Component.text("/plot debug <loadedchunks | player | debug-players | entitytypes | msg>"))
)
);
}
@ -84,6 +85,16 @@ public class Debug extends SubCommand {
return true;
}
}
if (args.length > 0 && "loadedchunks".equalsIgnoreCase(args[0])) {
final long start = System.currentTimeMillis();
player.sendMessage(TranslatableCaption.of("debug.fetching_loaded_chunks"));
TaskManager.runTaskAsync(() -> player.sendMessage(StaticCaption
.of("Loaded chunks: " + this.worldUtil
.getChunkChunks(player.getLocation().getWorldName())
.size() + " (" + (System.currentTimeMillis()
- start) + "ms) using thread: " + Thread.currentThread().getName())));
return true;
}
if (args.length > 0 && "uuids".equalsIgnoreCase(args[0])) {
final Collection<UUIDMapping> mappings = PlotSquared.get().getImpromptuUUIDPipeline().getAllImmediately();
player.sendMessage(
@ -185,7 +196,7 @@ public class Debug extends SubCommand {
@Override
public Collection<Command> tab(final PlotPlayer<?> player, String[] args, boolean space) {
return Stream.of("debug-players", "entitytypes")
return Stream.of("loadedchunks", "debug-players", "entitytypes")
.filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH)))
.map(value -> new Command(null, false, value, "plots.admin", RequiredType.NONE, null) {
}).collect(Collectors.toList());

View File

@ -96,7 +96,6 @@ public class DebugRoadRegen extends SubCommand {
PlotArea area = location.getPlotArea();
if (area == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
return false;
}
Plot plot = player.getCurrentPlot();
if (plot == null) {

View File

@ -117,11 +117,10 @@ public class Deny extends SubCommand {
} else if (plot.getDenied().contains(uuid)) {
player.sendMessage(
TranslatableCaption.of("member.already_added"),
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
TagResolver.resolver(
"player",
Tag.inserting(caption.toComponent(player))
))
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
)
);
return;
} else {

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 || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DONE)) {
if (PlotSquared.platform().expireManager() == null || doneRequirements == null) {
finish(plot, player, true);
plot.removeRunning();
} else {

View File

@ -136,9 +136,7 @@ public class Download extends SubCommand {
}
player.sendMessage(
TranslatableCaption.of("web.generation_link_success_legacy_world"),
TagResolver.builder()
.tag("url", Tag.preProcessParsed(url.toString()))
.build()
TagResolver.resolver("url", Tag.inserting(Component.text(url.toString())))
);
}
});

View File

@ -103,10 +103,9 @@ public final class FlagCommand extends Command {
if (flag instanceof IntegerFlag && MathMan.isInteger(value)) {
try {
int numeric = Integer.parseInt(value);
// Getting full permission without ".<amount>" at the end
perm = perm.substring(0, perm.length() - value.length() - 1);
boolean result = false;
if (numeric >= 0) {
if (numeric > 0) {
int checkRange = PlotSquared.get().getPlatform().equalsIgnoreCase("bukkit") ?
numeric :
Settings.Limit.MAX_PLOTS;

View File

@ -517,7 +517,6 @@ public class ListCmd extends SubCommand {
}
}
finalResolver.tag("players", Tag.inserting(builder.asComponent()));
finalResolver.tag("size", Tag.inserting(Component.text(plot.getConnectedPlots().size())));
caption.set(TranslatableCaption.of("info.plot_list_item"));
caption.setTagResolvers(finalResolver.build());
}

View File

@ -41,7 +41,6 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.Collections;
import java.util.List;
@ -117,7 +116,7 @@ public class Load extends SubCommand {
}
final URL url;
try {
url = URI.create(Settings.Web.URL + "saves/" + player.getUUID() + '/' + schematic).toURL();
url = new URL(Settings.Web.URL + "saves/" + player.getUUID() + '/' + schematic);
} catch (MalformedURLException e) {
e.printStackTrace();
player.sendMessage(TranslatableCaption.of("web.load_failed"));

View File

@ -31,6 +31,7 @@ import com.plotsquared.core.player.PlayerMetaDataKeys;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.PlayerManager;
import com.plotsquared.core.util.TabCompletions;
import com.plotsquared.core.util.task.TaskManager;
import net.kyori.adventure.text.Component;
@ -135,11 +136,10 @@ public class Owner extends SetCommand {
if (plot.isOwner(uuid)) {
player.sendMessage(
TranslatableCaption.of("member.already_owner"),
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
TagResolver.resolver(
"player",
Tag.inserting(caption.toComponent(player))
))
Tag.inserting(PlayerManager.resolveName(uuid, false).toComponent(player))
)
);
return;
}
@ -147,11 +147,10 @@ public class Owner extends SetCommand {
if (other == null) {
player.sendMessage(
TranslatableCaption.of("errors.invalid_player_offline"),
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
TagResolver.resolver(
"player",
Tag.inserting(caption.toComponent(player))
))
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
)
);
return;
}

View File

@ -100,17 +100,15 @@ public class Remove extends SubCommand {
count++;
}
} else if (uuid == DBFunc.EVERYONE) {
count += plot.getTrusted().size();
if (plot.removeTrusted(uuid)) {
this.eventDispatcher.callTrusted(player, plot, uuid, false);
}
count += plot.getMembers().size();
if (plot.removeMember(uuid)) {
count++;
} else if (plot.removeMember(uuid)) {
this.eventDispatcher.callMember(player, plot, uuid, false);
}
count += plot.getDenied().size();
if (plot.removeDenied(uuid)) {
count++;
} else if (plot.removeDenied(uuid)) {
this.eventDispatcher.callDenied(player, plot, uuid, false);
count++;
}
}
}

View File

@ -40,7 +40,6 @@ import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
@ -131,7 +130,8 @@ public class SchematicCmd extends SubCommand {
if (location.startsWith("url:")) {
try {
UUID uuid = UUID.fromString(location.substring(4));
URL url = URI.create(Settings.Web.URL + "uploads/" + uuid + ".schematic").toURL();
URL base = new URL(Settings.Web.URL);
URL url = new URL(base, "uploads/" + uuid + ".schematic");
schematic = this.schematicHandler.getSchematic(url);
} catch (Exception e) {
e.printStackTrace();

View File

@ -19,7 +19,6 @@
package com.plotsquared.core.command;
import com.google.inject.Inject;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc;
@ -104,11 +103,10 @@ public class Trust extends Command {
player.hasPermission(Permission.PERMISSION_TRUST_EVERYONE) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_TRUST))) {
player.sendMessage(
TranslatableCaption.of("errors.invalid_player"),
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
TagResolver.resolver(
"value",
Tag.inserting(caption.toComponent(player))
))
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
)
);
iterator.remove();
continue;
@ -116,11 +114,10 @@ public class Trust extends Command {
if (currentPlot.isOwner(uuid)) {
player.sendMessage(
TranslatableCaption.of("member.already_added"),
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"player",
Tag.inserting(caption.toComponent(player))
))
TagResolver.resolver(
"value",
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
)
);
iterator.remove();
continue;
@ -128,11 +125,10 @@ public class Trust extends Command {
if (currentPlot.getTrusted().contains(uuid)) {
player.sendMessage(
TranslatableCaption.of("member.already_added"),
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"player",
Tag.inserting(caption.toComponent(player))
))
TagResolver.resolver(
"value",
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
)
);
iterator.remove();
continue;

View File

@ -522,7 +522,7 @@ public class Settings extends Config {
@Comment("Should the limit be global (over multiple worlds)")
public static boolean GLOBAL =
false;
@Comment({"The max range of integer permissions to check for, e.g. 'plots.plot.127' or 'plots.set.flag.mob-cap.127'",
@Comment({"The max range of permissions to check for, e.g. plots.plot.127",
"The value covers the permission range to check, you need to assign the permission to players/groups still",
"Modifying the value does NOT change the amount of plots players can claim"})
public static int MAX_PLOTS = 127;
@ -810,10 +810,6 @@ 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

@ -44,6 +44,4 @@ public interface Caption {
*/
@NonNull Component toComponent(@NonNull LocaleHolder localeHolder);
@NonNull String toString();
}

View File

@ -51,9 +51,4 @@ public final class StaticCaption implements Caption {
return MiniMessage.miniMessage().deserialize(this.value);
}
@Override
public @NonNull String toString() {
return "StaticCaption(" + value + ")";
}
}

View File

@ -25,7 +25,6 @@ import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull;
import java.util.Locale;
import java.util.regex.Pattern;
@ -133,9 +132,4 @@ public final class TranslatableCaption implements NamespacedCaption {
return Objects.hashCode(this.getNamespace(), this.getKey());
}
@Override
public @NotNull String toString() {
return "TranslatableCaption(" + getNamespace() + ":" + getKey() + ")";
}
}

View File

@ -130,7 +130,6 @@ public class SQLManager implements AbstractDB {
public volatile ConcurrentHashMap<PlotCluster, Queue<UniqueStatement>> clusterTasks;
// Private
private Connection connection;
private boolean supportsGetGeneratedKeys;
private boolean closed = false;
/**
@ -155,8 +154,6 @@ public class SQLManager implements AbstractDB {
this.worldConfiguration = worldConfiguration;
this.database = database;
this.connection = database.openConnection();
final DatabaseMetaData databaseMetaData = this.connection.getMetaData();
this.supportsGetGeneratedKeys = databaseMetaData.supportsGetGeneratedKeys();
this.mySQL = database instanceof MySQL;
this.globalTasks = new ConcurrentLinkedQueue<>();
this.notifyTasks = new ConcurrentLinkedQueue<>();
@ -164,14 +161,6 @@ public class SQLManager implements AbstractDB {
this.playerTasks = new ConcurrentHashMap<>();
this.clusterTasks = new ConcurrentHashMap<>();
this.prefix = prefix;
if (mySQL && !supportsGetGeneratedKeys) {
String driver = databaseMetaData.getDriverName();
String driverVersion = databaseMetaData.getDriverVersion();
throw new SQLException("Database Driver for MySQL does not support Statement#getGeneratedKeys - which breaks " +
"PlotSquared functionality (Using " + driver + ":" + driverVersion + ")");
}
this.SET_OWNER = "UPDATE `" + this.prefix
+ "plot` SET `owner` = ? WHERE `plot_id_x` = ? AND `plot_id_z` = ? AND `world` = ?";
this.GET_ALL_PLOTS =
@ -182,32 +171,20 @@ public class SQLManager implements AbstractDB {
"INSERT INTO `" + this.prefix + "plot_settings` (`plot_plot_id`) values ";
this.CREATE_TIERS =
"INSERT INTO `" + this.prefix + "plot_%tier%` (`plot_plot_id`, `user_uuid`) values ";
String tempCreatePlot = "INSERT INTO `" + this.prefix
this.CREATE_PLOT = "INSERT INTO `" + this.prefix
+ "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) VALUES(?, ?, ?, ?, ?)";
if (!supportsGetGeneratedKeys) {
tempCreatePlot += " RETURNING `id`";
}
this.CREATE_PLOT = tempCreatePlot;
if (mySQL) {
this.CREATE_PLOT_SAFE = "INSERT IGNORE INTO `" + this.prefix
+ "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) SELECT ?, ?, ?, ?, ? FROM DUAL WHERE NOT EXISTS (SELECT null FROM `"
+ this.prefix + "plot` WHERE `world` = ? AND `plot_id_x` = ? AND `plot_id_z` = ?)";
} else {
String tempCreatePlotSafe = "INSERT INTO `" + this.prefix
this.CREATE_PLOT_SAFE = "INSERT INTO `" + this.prefix
+ "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) SELECT ?, ?, ?, ?, ? WHERE NOT EXISTS (SELECT null FROM `"
+ this.prefix + "plot` WHERE `world` = ? AND `plot_id_x` = ? AND `plot_id_z` = ?)";
if (!supportsGetGeneratedKeys) {
tempCreatePlotSafe += " RETURNING `id`";
}
this.CREATE_PLOT_SAFE = tempCreatePlotSafe;
}
String tempCreateCluster = "INSERT INTO `" + this.prefix
this.CREATE_CLUSTER = "INSERT INTO `" + this.prefix
+ "cluster`(`pos1_x`, `pos1_z`, `pos2_x`, `pos2_z`, `owner`, `world`) VALUES(?, ?, ?, ?, ?, ?)";
if (!supportsGetGeneratedKeys) {
tempCreateCluster += " RETURNING `id`";
}
this.CREATE_CLUSTER = tempCreateCluster;
try {
createTables();
} catch (SQLException e) {
@ -1096,8 +1073,9 @@ public class SQLManager implements AbstractDB {
@Override
public void addBatch(PreparedStatement statement) throws SQLException {
if (statement.execute() || statement.getUpdateCount() > 0) {
try (ResultSet keys = supportsGetGeneratedKeys ? statement.getGeneratedKeys() : statement.getResultSet()) {
int inserted = statement.executeUpdate();
if (inserted > 0) {
try (ResultSet keys = statement.getGeneratedKeys()) {
if (keys.next()) {
plot.temp = keys.getInt(1);
addPlotTask(plot, new UniqueStatement(
@ -1167,8 +1145,8 @@ public class SQLManager implements AbstractDB {
@Override
public void addBatch(PreparedStatement statement) throws SQLException {
statement.execute();
try (ResultSet keys = supportsGetGeneratedKeys ? statement.getGeneratedKeys() : statement.getResultSet()) {
statement.executeUpdate();
try (ResultSet keys = statement.getGeneratedKeys()) {
if (keys.next()) {
plot.temp = keys.getInt(1);
}
@ -3080,8 +3058,8 @@ public class SQLManager implements AbstractDB {
@Override
public void addBatch(PreparedStatement statement) throws SQLException {
statement.execute();
try (ResultSet keys = supportsGetGeneratedKeys ? statement.getGeneratedKeys() : statement.getResultSet()) {
statement.executeUpdate();
try (ResultSet keys = statement.getGeneratedKeys()) {
if (keys.next()) {
cluster.temp = keys.getInt(1);
}

View File

@ -1,77 +0,0 @@
/*
* 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

@ -21,26 +21,21 @@ package com.plotsquared.core.events;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.function.UnaryOperator;
/**
* Called when a player teleports to a plot
*/
public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements CancellablePlotEvent {
private final Location from;
private final TeleportCause cause;
private Result eventResult;
private final Location from;
private UnaryOperator<Location> locationTransformer;
/**
* PlayerTeleportToPlotEvent: Called when a player teleports to a plot
*
* @param player That was teleported
* @param from The origin location, from where the teleport was triggered (players location most likely)
* @param from Start location
* @param plot Plot to which the player was teleported
* @param cause Why the teleport is being completed
* @since 6.1.0
@ -62,8 +57,7 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
}
/**
* Get the location, from where the teleport was triggered
* (the players current location when executing the home command for example)
* Get the from location
*
* @return Location
*/
@ -71,27 +65,6 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
return this.from;
}
/**
* Gets the currently applied {@link UnaryOperator<Location> transformer} or null, if none was set
*
* @return LocationTransformer
* @since 7.2.1
*/
public @Nullable UnaryOperator<Location> getLocationTransformer() {
return this.locationTransformer;
}
/**
* Sets the {@link UnaryOperator<Location> transformer} to mutate the location where the player will be teleported to.
* May be {@code null}, if any previous set transformations should be discarded.
*
* @param locationTransformer The new transformer
* @since 7.2.1
*/
public void setLocationTransformer(@Nullable UnaryOperator<Location> locationTransformer) {
this.locationTransformer = locationTransformer;
}
@Override
public Result getEventResult() {
return eventResult;

View File

@ -189,7 +189,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
}
Object value;
try {
final boolean accessible = field.canAccess(this);
final boolean accessible = field.isAccessible();
field.setAccessible(true);
value = field.get(this);
field.setAccessible(accessible);

View File

@ -77,10 +77,6 @@ public class HybridUtils {
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + HybridUtils.class.getSimpleName());
private static final BlockState AIR = BlockTypes.AIR.getDefaultState();
/**
* Deprecated and likely to be removed in a future release.
*/
@Deprecated(forRemoval = true, since = "7.0.0")
public static HybridUtils manager;
public static Set<BlockVector2> regions;
public static int height;

View File

@ -55,6 +55,7 @@ import com.plotsquared.core.plot.flag.implementations.TitlesFlag;
import com.plotsquared.core.plot.flag.implementations.WeatherFlag;
import com.plotsquared.core.plot.flag.types.TimedFlag;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.PlayerManager;
import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.util.task.TaskTime;
import com.sk89q.worldedit.world.gamemode.GameMode;
@ -62,6 +63,7 @@ import com.sk89q.worldedit.world.gamemode.GameModes;
import com.sk89q.worldedit.world.item.ItemType;
import com.sk89q.worldedit.world.item.ItemTypes;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
@ -75,7 +77,6 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
public class PlotListener {
@ -320,27 +321,22 @@ public class PlotListener {
}
if ((lastPlot != null) && plot.getId().equals(lastPlot.getId()) && plot.hasOwner()) {
final UUID plotOwner = plot.getOwnerAbs();
ComponentLike owner = PlayerManager.resolveName(plotOwner, true).toComponent(player);
Caption header = fromFlag ? StaticCaption.of(title) : TranslatableCaption.of("titles" +
".title_entered_plot");
Caption subHeader = fromFlag ? StaticCaption.of(subtitle) : TranslatableCaption.of("titles" +
".title_entered_plot_sub");
CompletableFuture<TagResolver> future = PlotSquared.platform().playerManager()
.getUsernameCaption(plotOwner).thenApply(caption -> TagResolver.builder()
.tag("owner", Tag.inserting(caption.toComponent(player)))
.tag("plot", Tag.inserting(Component.text(lastPlot.getId().toString())))
.tag("world", Tag.inserting(Component.text(player.getLocation().getWorldName())))
.tag("alias", Tag.inserting(Component.text(plot.getAlias())))
.build()
);
future.whenComplete((tagResolver, throwable) -> {
if (Settings.Titles.TITLES_AS_ACTIONBAR) {
player.sendActionBar(header, tagResolver);
} else {
player.sendTitle(header, subHeader, tagResolver);
}
});
TagResolver resolver = TagResolver.builder()
.tag("plot", Tag.inserting(Component.text(lastPlot.getId().toString())))
.tag("world", Tag.inserting(Component.text(player.getLocation().getWorldName())))
.tag("owner", Tag.inserting(owner))
.tag("alias", Tag.inserting(Component.text(plot.getAlias())))
.build();
if (Settings.Titles.TITLES_AS_ACTIONBAR) {
player.sendActionBar(header, resolver);
} else {
player.sendTitle(header, subHeader, resolver);
}
}
}, TaskTime.seconds(1L));
}
@ -364,6 +360,7 @@ 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) {
@ -466,8 +463,6 @@ public class PlotListener {
feedRunnable.remove(player.getUUID());
healRunnable.remove(player.getUUID());
}
} finally {
this.eventDispatcher.callLeave(player, plot);
}
return true;
}

View File

@ -55,25 +55,6 @@ public enum Direction {
return NORTH;
}
/**
* {@return the opposite direction}
* If this is {@link Direction#ALL}, then {@link Direction#ALL} is returned.
* @since 7.2.0
*/
public Direction opposite() {
return switch (this) {
case ALL -> ALL;
case NORTH -> SOUTH;
case EAST -> WEST;
case SOUTH -> NORTH;
case WEST -> EAST;
case NORTHEAST -> SOUTHWEST;
case SOUTHEAST -> NORTHWEST;
case SOUTHWEST -> NORTHEAST;
case NORTHWEST -> SOUTHEAST;
};
}
public int getIndex() {
return index;
}

View File

@ -100,7 +100,6 @@ public interface PermissionHolder {
}
String[] nodes = stub.split("\\.");
StringBuilder builder = new StringBuilder();
// Wildcard check from less specific permission to more specific permission
for (int i = 0; i < (nodes.length - 1); i++) {
builder.append(nodes[i]).append(".");
if (!stub.equals(builder + Permission.PERMISSION_STAR.toString())) {
@ -109,7 +108,6 @@ public interface PermissionHolder {
}
}
}
// Wildcard check for the full permission
if (hasPermission(stub + ".*")) {
return Integer.MAX_VALUE;
}

View File

@ -25,9 +25,9 @@ import java.util.UUID;
public interface OfflinePlotPlayer extends PermissionHolder {
/**
* Returns the UUID of the player.
* Gets the {@code UUID} of this player
*
* @return the UUID of the player
* @return the player {@link UUID}
*/
UUID getUUID();
@ -39,9 +39,9 @@ public interface OfflinePlotPlayer extends PermissionHolder {
long getLastPlayed();
/**
* Returns the name of the player.
* Gets the name of this player.
*
* @return the name of the player
* @return the player name
*/
String getName();

View File

@ -80,7 +80,6 @@ import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
@ -274,9 +273,8 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
return this.meta == null ? null : this.meta.remove(key);
}
/**
* Returns the name of the player.
* This player's name.
*
* @return the name of the player
*/
@ -306,8 +304,7 @@ 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() {
final int calculatedLimit = hasPermissionRange("plots.plot", Settings.Limit.MAX_PLOTS);
return this.eventDispatcher.callPlayerPlotLimit(this, calculatedLimit).limit();
return hasPermissionRange("plots.plot", Settings.Limit.MAX_PLOTS);
}
/**
@ -883,7 +880,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
final Component titleComponent = MiniMessage.miniMessage().deserialize(title.getComponent(this), replacements);
final Component subtitleComponent =
MiniMessage.miniMessage().deserialize(subtitle.getComponent(this), replacements);
final Title.Times times = Title.Times.times(
final Title.Times times = Title.Times.of(
Duration.of(Settings.Titles.TITLES_FADE_IN * 50L, ChronoUnit.MILLIS),
Duration.of(Settings.Titles.TITLES_STAY * 50L, ChronoUnit.MILLIS),
Duration.of(Settings.Titles.TITLES_FADE_OUT * 50L, ChronoUnit.MILLIS)
@ -955,54 +952,6 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
}
}
/**
* Sends a message to the command caller, when the future is resolved
*
* @param caption Caption to send
* @param asyncReplacement Async variable replacement
* @return A Future to be resolved, after the message was sent
* @since 7.1.0
*/
public final CompletableFuture<Void> sendMessage(
@NonNull Caption caption,
CompletableFuture<@NonNull TagResolver> asyncReplacement
) {
return sendMessage(caption, new CompletableFuture[]{asyncReplacement});
}
/**
* Sends a message to the command caller, when all futures are resolved
*
* @param caption Caption to send
* @param asyncReplacements Async variable replacements
* @param replacements Sync variable replacements
* @return A Future to be resolved, after the message was sent
* @since 7.1.0
*/
public final CompletableFuture<Void> sendMessage(
@NonNull Caption caption,
CompletableFuture<@NonNull TagResolver>[] asyncReplacements,
@NonNull TagResolver... replacements
) {
return CompletableFuture.allOf(asyncReplacements).whenComplete((unused, throwable) -> {
Set<TagResolver> resolvers = new HashSet<>(Arrays.asList(replacements));
if (throwable != null) {
sendMessage(
TranslatableCaption.of("errors.error"),
TagResolver.resolver("value", Tag.inserting(
Component.text("Failed to resolve asynchronous caption replacements")
))
);
LOGGER.error("Failed to resolve asynchronous tagresolver(s) for " + caption, throwable);
} else {
for (final CompletableFuture<TagResolver> asyncReplacement : asyncReplacements) {
resolvers.add(asyncReplacement.join());
}
}
sendMessage(caption, resolvers.toArray(TagResolver[]::new));
});
}
// Redefine from PermissionHolder as it's required from CommandCaller
@Override
public boolean hasPermission(@NonNull String permission) {

View File

@ -29,7 +29,6 @@ import com.plotsquared.core.configuration.caption.CaptionUtility;
import com.plotsquared.core.configuration.caption.StaticCaption;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc;
import com.plotsquared.core.events.PlayerTeleportToPlotEvent;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.events.TeleportCause;
import com.plotsquared.core.generator.ClassicPlotWorld;
@ -86,7 +85,6 @@ import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@ -2285,8 +2283,8 @@ public class Plot {
}
/**
* Gets a set of plots connected (and including) this plot.
* The returned set is immutable.
* Gets a set of plots connected (and including) this plot<br>
* - This result is cached globally
*
* @return a Set of Plots connected to this Plot
*/
@ -2297,73 +2295,115 @@ public class Plot {
if (!this.isMerged()) {
return Collections.singleton(this);
}
Plot basePlot = getBasePlot(false);
if (this.connectedCache == null && this != basePlot) {
// share cache between connected plots
Set<Plot> connectedPlots = basePlot.getConnectedPlots();
this.connectedCache = connectedPlots;
return connectedPlots;
}
if (this.connectedCache != null && this.connectedCache.contains(this)) {
return this.connectedCache;
}
Set<Plot> tmpSet = new HashSet<>();
HashSet<Plot> tmpSet = new HashSet<>();
tmpSet.add(this);
HashSet<Plot> queueCache = new HashSet<>();
Plot tmp;
HashSet<Object> queuecache = new HashSet<>();
ArrayDeque<Plot> frontier = new ArrayDeque<>();
computeDirectMerged(queueCache, frontier, Direction.NORTH);
computeDirectMerged(queueCache, frontier, Direction.EAST);
computeDirectMerged(queueCache, frontier, Direction.SOUTH);
computeDirectMerged(queueCache, frontier, Direction.WEST);
if (this.isMerged(Direction.NORTH)) {
tmp = this.area.getPlotAbs(this.id.getRelative(Direction.NORTH));
if (!tmp.isMerged(Direction.SOUTH)) {
// invalid merge
if (tmp.isOwnerAbs(this.getOwnerAbs())) {
tmp.getSettings().setMerged(Direction.SOUTH, true);
DBFunc.setMerged(tmp, tmp.getSettings().getMerged());
} else {
this.getSettings().setMerged(Direction.NORTH, false);
DBFunc.setMerged(this, this.getSettings().getMerged());
}
}
queuecache.add(tmp);
frontier.add(tmp);
}
if (this.isMerged(Direction.EAST)) {
tmp = this.area.getPlotAbs(this.id.getRelative(Direction.EAST));
assert tmp != null;
if (!tmp.isMerged(Direction.WEST)) {
// invalid merge
if (tmp.isOwnerAbs(this.getOwnerAbs())) {
tmp.getSettings().setMerged(Direction.WEST, true);
DBFunc.setMerged(tmp, tmp.getSettings().getMerged());
} else {
this.getSettings().setMerged(Direction.EAST, false);
DBFunc.setMerged(this, this.getSettings().getMerged());
}
}
queuecache.add(tmp);
frontier.add(tmp);
}
if (this.isMerged(Direction.SOUTH)) {
tmp = this.area.getPlotAbs(this.id.getRelative(Direction.SOUTH));
assert tmp != null;
if (!tmp.isMerged(Direction.NORTH)) {
// invalid merge
if (tmp.isOwnerAbs(this.getOwnerAbs())) {
tmp.getSettings().setMerged(Direction.NORTH, true);
DBFunc.setMerged(tmp, tmp.getSettings().getMerged());
} else {
this.getSettings().setMerged(Direction.SOUTH, false);
DBFunc.setMerged(this, this.getSettings().getMerged());
}
}
queuecache.add(tmp);
frontier.add(tmp);
}
if (this.isMerged(Direction.WEST)) {
tmp = this.area.getPlotAbs(this.id.getRelative(Direction.WEST));
if (!tmp.isMerged(Direction.EAST)) {
// invalid merge
if (tmp.isOwnerAbs(this.getOwnerAbs())) {
tmp.getSettings().setMerged(Direction.EAST, true);
DBFunc.setMerged(tmp, tmp.getSettings().getMerged());
} else {
this.getSettings().setMerged(Direction.WEST, false);
DBFunc.setMerged(this, this.getSettings().getMerged());
}
}
queuecache.add(tmp);
frontier.add(tmp);
}
Plot current;
while ((current = frontier.poll()) != null) {
if (!current.hasOwner() || current.settings == null) {
continue;
}
tmpSet.add(current);
queueCache.remove(current);
addIfIncluded(current, Direction.NORTH, queueCache, tmpSet, frontier);
addIfIncluded(current, Direction.EAST, queueCache, tmpSet, frontier);
addIfIncluded(current, Direction.SOUTH, queueCache, tmpSet, frontier);
addIfIncluded(current, Direction.WEST, queueCache, tmpSet, frontier);
}
tmpSet = Set.copyOf(tmpSet);
this.connectedCache = tmpSet;
return tmpSet;
}
private void computeDirectMerged(Set<Plot> queueCache, Deque<Plot> frontier, Direction direction) {
if (this.isMerged(direction)) {
Plot tmp = this.area.getPlotAbs(this.id.getRelative(direction));
assert tmp != null;
if (!tmp.isMerged(direction.opposite())) {
// invalid merge
if (tmp.isOwnerAbs(this.getOwnerAbs())) {
tmp.getSettings().setMerged(direction.opposite(), true);
DBFunc.setMerged(tmp, tmp.getSettings().getMerged());
} else {
this.getSettings().setMerged(direction, false);
DBFunc.setMerged(this, this.getSettings().getMerged());
queuecache.remove(current);
if (current.isMerged(Direction.NORTH)) {
tmp = current.area.getPlotAbs(current.id.getRelative(Direction.NORTH));
if (tmp != null && !queuecache.contains(tmp) && !tmpSet.contains(tmp)) {
queuecache.add(tmp);
frontier.add(tmp);
}
}
if (current.isMerged(Direction.EAST)) {
tmp = current.area.getPlotAbs(current.id.getRelative(Direction.EAST));
if (tmp != null && !queuecache.contains(tmp) && !tmpSet.contains(tmp)) {
queuecache.add(tmp);
frontier.add(tmp);
}
}
if (current.isMerged(Direction.SOUTH)) {
tmp = current.area.getPlotAbs(current.id.getRelative(Direction.SOUTH));
if (tmp != null && !queuecache.contains(tmp) && !tmpSet.contains(tmp)) {
queuecache.add(tmp);
frontier.add(tmp);
}
}
if (current.isMerged(Direction.WEST)) {
tmp = current.area.getPlotAbs(current.id.getRelative(Direction.WEST));
if (tmp != null && !queuecache.contains(tmp) && !tmpSet.contains(tmp)) {
queuecache.add(tmp);
frontier.add(tmp);
}
}
queueCache.add(tmp);
frontier.add(tmp);
}
}
private void addIfIncluded(
Plot current, Direction
direction, Set<Plot> queueCache, Set<Plot> tmpSet, Deque<Plot> frontier
) {
if (!current.isMerged(direction)) {
return;
}
Plot tmp = current.area.getPlotAbs(current.id.getRelative(direction));
if (tmp != null && !queueCache.contains(tmp) && !tmpSet.contains(tmp)) {
queueCache.add(tmp);
frontier.add(tmp);
}
this.connectedCache = tmpSet;
return tmpSet;
}
/**
@ -2574,9 +2614,8 @@ public class Plot {
*/
public void teleportPlayer(final PlotPlayer<?> player, TeleportCause cause, Consumer<Boolean> resultConsumer) {
Plot plot = this.getBasePlot(false);
PlayerTeleportToPlotEvent event = this.eventDispatcher.callTeleport(player, player.getLocation(), plot, cause);
if (event.getEventResult() == Result.DENY) {
Result result = this.eventDispatcher.callTeleport(player, player.getLocation(), plot, cause).getEventResult();
if (result == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Teleport")))
@ -2584,10 +2623,7 @@ public class Plot {
resultConsumer.accept(false);
return;
}
final Consumer<Location> locationConsumer = calculatedLocation -> {
Location location = event.getLocationTransformer() == null ? calculatedLocation :
Objects.requireNonNullElse(event.getLocationTransformer().apply(calculatedLocation), calculatedLocation);
final Consumer<Location> locationConsumer = location -> {
if (Settings.Teleport.DELAY == 0 || player.hasPermission("plots.teleport.delay.bypass")) {
player.sendMessage(TranslatableCaption.of("teleport.teleported_to_plot"));
player.teleport(location, cause);
@ -2643,11 +2679,6 @@ public class Plot {
return false;
}
/**
* Get the maximum distance of the plot from x=0, z=0.
*
* @return max block distance from 0,0
*/
public int getDistanceFromOrigin() {
Location bot = getManager().getPlotBottomLocAbs(id);
Location top = getManager().getPlotTopLocAbs(id);
@ -2661,7 +2692,7 @@ public class Plot {
* Expands the world border to include this plot if it is beyond the current border.
*/
public void updateWorldBorder() {
int border = this.area.getBorder(false);
int border = this.area.getBorder();
if (border == Integer.MAX_VALUE) {
return;
}

View File

@ -51,8 +51,6 @@ import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.PlotExpression;
import com.plotsquared.core.util.RegionUtil;
import com.plotsquared.core.util.StringMan;
import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.util.task.TaskTime;
import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.CuboidRegion;
@ -147,7 +145,6 @@ public abstract class PlotArea implements ComponentLike {
private Map<String, PlotExpression> prices = new HashMap<>();
private List<String> schematics = new ArrayList<>();
private boolean worldBorder = false;
private int borderSize = 1;
private boolean useEconomy = false;
private int hash;
private CuboidRegion region;
@ -357,7 +354,6 @@ public abstract class PlotArea implements ComponentLike {
this.plotChat = config.getBoolean("chat.enabled");
this.forcingPlotChat = config.getBoolean("chat.forced");
this.worldBorder = config.getBoolean("world.border");
this.borderSize = config.getInt("world.border_size");
this.maxBuildHeight = config.getInt("world.max_height");
this.minBuildHeight = config.getInt("world.min_height");
this.minGenHeight = config.getInt("world.min_gen_height");
@ -395,28 +391,6 @@ public abstract class PlotArea implements ComponentLike {
}
}
this.spawnEggs = config.getBoolean("event.spawn.egg");
this.spawnCustom = config.getBoolean("event.spawn.custom");
this.spawnBreeding = config.getBoolean("event.spawn.breeding");
if (PlotSquared.get().isWeInitialised()) {
loadFlags(config);
} else {
ConsolePlayer.getConsole().sendMessage(
TranslatableCaption.of("flags.delaying_loading_area_flags"),
TagResolver.resolver("area", Tag.inserting(Component.text(this.id == null ? this.worldName : this.id)))
);
TaskManager.runTaskLater(() -> loadFlags(config), TaskTime.ticks(1));
}
loadConfiguration(config);
}
private void loadFlags(ConfigurationSection config) {
ConsolePlayer.getConsole().sendMessage(
TranslatableCaption.of("flags.loading_area_flags"),
TagResolver.resolver("area", Tag.inserting(Component.text(this.id == null ? this.worldName : this.id)))
);
List<String> flags = config.getStringList("flags.default");
if (flags.isEmpty()) {
flags = config.getStringList("flags");
@ -437,6 +411,10 @@ public abstract class PlotArea implements ComponentLike {
TagResolver.resolver("flags", Tag.inserting(Component.text(flags.toString())))
);
this.spawnEggs = config.getBoolean("event.spawn.egg");
this.spawnCustom = config.getBoolean("event.spawn.custom");
this.spawnBreeding = config.getBoolean("event.spawn.breeding");
List<String> roadflags = config.getStringList("road.flags");
if (roadflags.isEmpty()) {
roadflags = new ArrayList<>();
@ -448,12 +426,14 @@ public abstract class PlotArea implements ComponentLike {
}
}
}
this.roadFlags = !roadflags.isEmpty();
this.roadFlags = roadflags.size() > 0;
parseFlags(this.getRoadFlagContainer(), roadflags);
ConsolePlayer.getConsole().sendMessage(
TranslatableCaption.of("flags.road_flags"),
TagResolver.resolver("flags", Tag.inserting(Component.text(roadflags.toString())))
);
loadConfiguration(config);
}
public abstract void loadConfiguration(ConfigurationSection config);
@ -491,7 +471,6 @@ public abstract class PlotArea implements ComponentLike {
options.put("event.spawn.custom", this.isSpawnCustom());
options.put("event.spawn.breeding", this.isSpawnBreeding());
options.put("world.border", this.hasWorldBorder());
options.put("world.border_size", this.getBorderSize());
options.put("home.default", "side");
String position = config.getString(
"home.nonmembers",
@ -940,9 +919,7 @@ public abstract class PlotArea implements ComponentLike {
* Get the plot border distance for a world<br>
*
* @return The border distance or Integer.MAX_VALUE if no border is set
* @deprecated Use {@link PlotArea#getBorder(boolean)}
*/
@Deprecated(forRemoval = true, since = "7.2.0")
public int getBorder() {
final Integer meta = (Integer) getMeta("worldBorder");
if (meta != null) {
@ -956,27 +933,6 @@ public abstract class PlotArea implements ComponentLike {
return Integer.MAX_VALUE;
}
/**
* Get the plot border distance for a world, specifying whether the returned value should include the world.border-size
* value. This is a player-traversable area, where plots cannot be claimed
*
* @param getExtended If the extra border given by world.border-size should be included
* @return Border distance of Integer.MAX_VALUE if no border is set
* @since 7.2.0
*/
public int getBorder(boolean getExtended) {
final Integer meta = (Integer) getMeta("worldBorder");
if (meta != null) {
int border = meta + 1;
if (border == 0) {
return Integer.MAX_VALUE;
} else {
return getExtended ? border + borderSize : border;
}
}
return Integer.MAX_VALUE;
}
/**
* Setup the plot border for a world (usually done when the world is created).
*/
@ -1236,16 +1192,6 @@ public abstract class PlotArea implements ComponentLike {
return worldBorder;
}
/**
* Get the "extra border" size of the plot area.
*
* @return Plot area extra border size
* @since 7.2.0
*/
public int getBorderSize() {
return borderSize;
}
/**
* Get whether plot signs are allowed or not.
*

View File

@ -26,8 +26,8 @@ import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* The PlotId class represents a Plot's x and y coordinates within a {@link PlotArea}. PlotId x,y values do not correspond to Block locations.
* A PlotId instance can be created using the {@link #of(int, int)} method or parsed from a string using the {@link #fromString(String)} method.
* Plot (X,Y) tuples for plot locations
* within a plot area
*/
public final class PlotId {
@ -36,10 +36,10 @@ public final class PlotId {
private final int hash;
/**
* Constructs a new PlotId with the given x and y coordinates.
* PlotId class (PlotId x,y values do not correspond to Block locations)
*
* @param x the x-coordinate of the plot
* @param y the y-coordinate of the plot
* @param x The plot x coordinate
* @param y The plot y coordinate
*/
private PlotId(final int x, final int y) {
this.x = x;
@ -48,11 +48,11 @@ public final class PlotId {
}
/**
* Returns a new PlotId instance with the specified x and y coordinates.
* Create a new plot ID instance
*
* @param x the x-coordinate of the plot
* @param y the y-coordinate of the plot
* @return a new PlotId instance with the specified x and y coordinates
* @param x The plot x coordinate
* @param y The plot y coordinate
* @return a new PlotId at x,y
*/
public static @NonNull PlotId of(final int x, final int y) {
return new PlotId(x, y);
@ -74,13 +74,10 @@ public final class PlotId {
}
/**
* Returns a PlotId object from the given string, or null if the string is invalid.
* The string should be in the format "x;y" where x and y are integers.
* The string can also contain any combination of the characters ";_,."
* as delimiters.
* Attempt to parse a plot ID from a string
*
* @param string the string to parse
* @return a PlotId object parsed from the given string, or null if the string is invalid
* @param string ID string
* @return Plot ID, or {@code null} if none could be parsed
*/
public static @Nullable PlotId fromStringOrNull(final @NonNull String string) {
final String[] parts = string.split("[;_,.]");
@ -98,39 +95,39 @@ public final class PlotId {
return of(x, y);
}
/**
* Returns a new PlotId instance from the given hash.
* Gets the PlotId from the HashCode<br>
* Note: Only accurate for small x,z values (short)
*
* @param hash the hash to unpair
* @return a new PlotId instance
* @param hash ID hash
* @return Plot ID
*/
public static @NonNull PlotId unpair(final int hash) {
return PlotId.of(hash >> 16, hash & 0xFFFF);
}
/**
* Returns the x-coordinate of this Plot ID.
* Get the ID X component
*
* @return the x-coordinate of this Plot ID
* @return X component
*/
public int getX() {
return this.x;
}
/**
* Returns the y-coordinate of this Plot ID.
* Get the ID Y component
*
* @return the y-coordinate of this Plot ID
* @return Y component
*/
public int getY() {
return this.y;
}
/**
* Returns the next Plot ID for claiming purposes based on the current Plot ID.
* Get the next plot ID for claiming purposes
*
* @return the next Plot ID
* @return Next plot ID
*/
public @NonNull PlotId getNextId() {
final int absX = Math.abs(x);
@ -162,11 +159,10 @@ public final class PlotId {
}
/**
* Returns a new Plot ID in the specified relative direction based on the
* current Plot ID.
* Get the PlotId in a relative direction
*
* @param direction the direction in which to get the relative Plot ID
* @return the relative Plot ID
* @param direction Direction
* @return Relative plot ID
*/
public @NonNull PlotId getRelative(final @NonNull Direction direction) {
return switch (direction) {
@ -197,11 +193,10 @@ public final class PlotId {
}
/**
* Returns a string representation of this Plot ID in the format "x;y".
* Get a String representation of the plot ID where the
* components are separated by ";"
*
* <p> The format is {@code x + ";" + y}
*
* @return a string representation of this Plot ID
* @return {@code x + ";" + y}
*/
@Override
public @NonNull String toString() {
@ -209,40 +204,41 @@ public final class PlotId {
}
/**
* Returns a string representation of this Plot ID with the specified separator.
* <p>
* The format is {@code x + separator + y}
* Get a String representation of the plot ID where the
* components are separated by a specified string
*
* @param separator the separator to use between the X and Y coordinates
* @return a string representation of this Plot ID with the specified separator
* @param separator Separator
* @return {@code x + separator + y}
*/
public @NonNull String toSeparatedString(String separator) {
return this.getX() + separator + this.getY();
}
/**
* Returns a string representation of this Plot ID in the format "x,y".
* Get a String representation of the plot ID where the
* components are separated by ","
*
* @return a string representation of this Plot ID
* @return {@code x + "," + y}
*/
public @NonNull String toCommaSeparatedString() {
return this.getX() + "," + this.getY();
}
/**
* Returns a string representation of this Plot ID in the format "x_y".
* Get a String representation of the plot ID where the
* components are separated by "_"
*
* @return a string representation of this Plot ID
* @return {@code x + "_" + y}
*/
public @NonNull String toUnderscoreSeparatedString() {
return this.getX() + "_" + this.getY();
}
/**
* Returns a string representation of this Plot ID in the format "x-y".
* Get a String representation of the plot ID where the
* components are separated by "-"
*
* @return a string representation of this Plot ID
* @return {@code x + "-" + y}
*/
public @NonNull String toDashSeparatedString() {
return this.getX() + "-" + this.getY();
@ -254,10 +250,6 @@ public final class PlotId {
}
/**
* An iterator that iterates over a range of {@link PlotId}s.
* The range is defined by a start and end {@link PlotId}.
*/
public static final class PlotRangeIterator implements Iterator<PlotId>, Iterable<PlotId> {
private final PlotId start;
@ -273,13 +265,6 @@ public final class PlotId {
this.y = this.start.getY();
}
/**
* Returns a new {@link PlotRangeIterator} that iterates over the range of Plots between the specified start and end Plots (inclusive).
*
* @param start the starting Plot of the range
* @param end the ending Plot of the range
* @return a new {@link PlotRangeIterator} that iterates over the range of Plots between the specified start and end Plots (inclusive)
*/
public static PlotRangeIterator range(final @NonNull PlotId start, final @NonNull PlotId end) {
return new PlotRangeIterator(start, end);
}

View File

@ -67,25 +67,14 @@ public class PlotItemStack {
return this.type;
}
/**
* Returns the number of items in this stack.
* Valid values range from 1-255.
*
* @return the amount of items in this stack
*/
public int getAmount() {
return amount;
}
/**
* Returns the given name of this stack of items. The name is displayed when
* hovering over the item.
*
* @return the given name of this stack of items
*/
public String getName() {
return name;
}
public String[] getLore() {
return lore;
}

View File

@ -38,6 +38,7 @@ import com.plotsquared.core.location.Location;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.flag.PlotFlag;
import com.plotsquared.core.queue.QueueCoordinator;
import com.plotsquared.core.util.PlayerManager;
import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.util.task.TaskTime;
import com.sk89q.worldedit.function.pattern.Pattern;
@ -58,7 +59,6 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
@ -383,17 +383,13 @@ public final class PlotModificationManager {
}
if (createSign) {
queue.setCompleteTask(() -> TaskManager.runTaskAsync(() -> {
List<CompletableFuture<Void>> tasks = plots.stream().map(current -> PlotSquared.platform().playerManager()
.getUsernameCaption(current.getOwnerAbs())
.thenAccept(caption -> current
.getPlotModificationManager()
.setSign(caption.getComponent(LocaleHolder.console()))))
.toList();
CompletableFuture.allOf(tasks.toArray(CompletableFuture[]::new)).whenComplete((unused, throwable) -> {
if (whenDone != null) {
TaskManager.runTask(whenDone);
}
});
for (Plot current : plots) {
current.getPlotModificationManager().setSign(PlayerManager.resolveName(current.getOwnerAbs()).getComponent(
LocaleHolder.console()));
}
if (whenDone != null) {
TaskManager.runTask(whenDone);
}
}));
} else if (whenDone != null) {
queue.setCompleteTask(whenDone);
@ -895,6 +891,7 @@ public final class PlotModificationManager {
}
/**
* /**
* Sets components such as border, wall, floor.
* (components are generator specific)
*

View File

@ -18,25 +18,9 @@
*/
package com.plotsquared.core.plot;
/**
* The different types of weather that can be set for a Plot.
*/
public enum PlotWeather {
/**
* Rainy weather conditions
*/
RAIN,
/**
* Clear weather conditions
*/
CLEAR,
/**
* Use the weather of the world the plot is in
*/
WORLD,
/**
* Turn off weather for the plot
*/
OFF
}

View File

@ -29,7 +29,6 @@ import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag;
import com.plotsquared.core.plot.flag.implementations.BlockedCmdsFlag;
import com.plotsquared.core.plot.flag.implementations.BreakFlag;
import com.plotsquared.core.plot.flag.implementations.ChatFlag;
import com.plotsquared.core.plot.flag.implementations.ConcreteHardenFlag;
import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag;
import com.plotsquared.core.plot.flag.implementations.CoralDryFlag;
import com.plotsquared.core.plot.flag.implementations.CropGrowFlag;
@ -42,7 +41,6 @@ import com.plotsquared.core.plot.flag.implementations.DeviceInteractFlag;
import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
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.EntityCapFlag;
import com.plotsquared.core.plot.flag.implementations.EntityChangeBlockFlag;
import com.plotsquared.core.plot.flag.implementations.ExplosionFlag;
@ -89,7 +87,6 @@ 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;
@ -145,7 +142,6 @@ public final class GlobalFlagContainer extends FlagContainer {
this.addFlag(BeaconEffectsFlag.BEACON_EFFECT_TRUE);
this.addFlag(BlockIgnitionFlag.BLOCK_IGNITION_TRUE);
this.addFlag(ChatFlag.CHAT_FLAG_TRUE);
this.addFlag(ConcreteHardenFlag.CONCRETE_HARDEN_TRUE);
this.addFlag(CopperOxideFlag.COPPER_OXIDE_FALSE);
this.addFlag(CoralDryFlag.CORAL_DRY_FALSE);
this.addFlag(CropGrowFlag.CROP_GROW_TRUE);
@ -155,7 +151,6 @@ public final class GlobalFlagContainer extends FlagContainer {
this.addFlag(DeviceInteractFlag.DEVICE_INTERACT_FALSE);
this.addFlag(DisablePhysicsFlag.DISABLE_PHYSICS_FALSE);
this.addFlag(DropProtectionFlag.DROP_PROTECTION_FALSE);
this.addFlag(EditSignFlag.EDIT_SIGN_FALSE);
this.addFlag(EntityChangeBlockFlag.ENTITY_CHANGE_BLOCK_FALSE);
this.addFlag(ExplosionFlag.EXPLOSION_FALSE);
this.addFlag(ForcefieldFlag.FORCEFIELD_FALSE);
@ -186,7 +181,6 @@ 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

@ -1,39 +0,0 @@
/*
* 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 ConcreteHardenFlag extends BooleanFlag<ConcreteHardenFlag> {
public static final ConcreteHardenFlag CONCRETE_HARDEN_TRUE = new ConcreteHardenFlag(true);
public static final ConcreteHardenFlag CONCRETE_HARDEN_FALSE = new ConcreteHardenFlag(false);
private ConcreteHardenFlag(boolean value) {
super(value, TranslatableCaption.of("flags.flag_description_concrete_harden"));
}
@Override
protected ConcreteHardenFlag flagOf(@NonNull Boolean value) {
return value ? CONCRETE_HARDEN_TRUE : CONCRETE_HARDEN_FALSE;
}
}

View File

@ -1,41 +0,0 @@
/*
* 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;
/**
* @since 7.2.1
*/
public class EditSignFlag extends BooleanFlag<EditSignFlag> {
public static final EditSignFlag EDIT_SIGN_TRUE = new EditSignFlag(true);
public static final EditSignFlag EDIT_SIGN_FALSE = new EditSignFlag(false);
private EditSignFlag(final boolean value) {
super(value, TranslatableCaption.of("flags.flag_description_edit_sign"));
}
@Override
protected EditSignFlag flagOf(@NonNull final Boolean value) {
return value ? EDIT_SIGN_TRUE : EDIT_SIGN_FALSE;
}
}

View File

@ -1,39 +0,0 @@
/*
* 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

@ -183,7 +183,7 @@ public class ChunkCoordinatorBuilder {
* Set whether the chunks should be allow to unload after being accessed. This should only be used where the chunks are read from
* and then written to from a separate queue where they're consequently unloaded.
*
* @param unloadAfter if to unload chunks afterwards
* @param unloadAfter if to unload chuns afterwards
* @return this ChunkCoordinatorBuilder instance
*/
public @NonNull ChunkCoordinatorBuilder unloadAfter(final boolean unloadAfter) {

View File

@ -42,14 +42,28 @@ public class EntityUtil {
}
private static int capNumeral(final @NonNull String flagName) {
return switch (flagName) {
case "mob-cap" -> CAP_MOB;
case "hostile-cap" -> CAP_MONSTER;
case "animal-cap" -> CAP_ANIMAL;
case "vehicle-cap" -> CAP_VEHICLE;
case "misc-cap" -> CAP_MISC;
default -> CAP_ENTITY;
};
int i;
switch (flagName) {
case "mob-cap":
i = CAP_MOB;
break;
case "hostile-cap":
i = CAP_MONSTER;
break;
case "animal-cap":
i = CAP_ANIMAL;
break;
case "vehicle-cap":
i = CAP_VEHICLE;
break;
case "misc-cap":
i = CAP_MISC;
break;
case "entity-cap":
default:
i = CAP_ENTITY;
}
return i;
}
@SuppressWarnings("unchecked")

View File

@ -30,7 +30,6 @@ 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;
@ -64,7 +63,6 @@ import com.plotsquared.core.plot.PlotId;
import com.plotsquared.core.plot.Rating;
import com.plotsquared.core.plot.flag.PlotFlag;
import com.plotsquared.core.plot.flag.implementations.DeviceInteractFlag;
import com.plotsquared.core.plot.flag.implementations.EditSignFlag;
import com.plotsquared.core.plot.flag.implementations.MiscPlaceFlag;
import com.plotsquared.core.plot.flag.implementations.MobPlaceFlag;
import com.plotsquared.core.plot.flag.implementations.PlaceFlag;
@ -76,7 +74,6 @@ import com.plotsquared.core.util.task.TaskManager;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.world.block.BlockCategories;
import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes;
import net.kyori.adventure.text.Component;
@ -309,12 +306,6 @@ 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
@ -401,12 +392,6 @@ public class EventDispatcher {
if (player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER.toString(), false)) {
return true;
}
// we check for the EditSignFlag in the PlayerSignOpenEvent again, but we must not cancel the interact event
// or send a message if the flag is true
if (BlockCategories.ALL_SIGNS != null && BlockCategories.ALL_SIGNS.contains(blockType)
&& plot.getFlag(EditSignFlag.class)) {
return true;
}
if (notifyPerms) {
player.sendMessage(
TranslatableCaption.of("commandconfig.flag_tutorial_usage"),

View File

@ -28,7 +28,6 @@ import com.plotsquared.core.database.DBFunc;
import com.plotsquared.core.player.ConsolePlayer;
import com.plotsquared.core.player.OfflinePlotPlayer;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.uuid.UUIDMapping;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike;
@ -38,7 +37,6 @@ import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.jetbrains.annotations.Contract;
import java.util.ArrayList;
import java.util.Collection;
@ -50,7 +48,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer;
@ -172,9 +169,7 @@ public abstract class PlayerManager<P extends PlotPlayer<? extends T>, T> {
* @return A caption containing either the name, {@code None}, {@code Everyone} or {@code Unknown}
* @see #resolveName(UUID, boolean)
* @since 6.4.0
* @deprecated Don't unnecessarily block threads and utilize playerMap - see {@link #getUsernameCaption(UUID)}
*/
@Deprecated(since = "7.1.0")
public static @NonNull Caption resolveName(final @Nullable UUID owner) {
return resolveName(owner, true);
}
@ -186,9 +181,7 @@ public abstract class PlayerManager<P extends PlotPlayer<? extends T>, T> {
* @param blocking If the operation should block the current thread for {@link Settings.UUID#BLOCKING_TIMEOUT} milliseconds
* @return A caption containing either the name, {@code None}, {@code Everyone} or {@code Unknown}
* @since 6.4.0
* @deprecated Don't unnecessarily block threads and utilize playerMap - see {@link #getUsernameCaption(UUID)}
*/
@Deprecated(since = "7.1.0")
public static @NonNull Caption resolveName(final @Nullable UUID owner, final boolean blocking) {
if (owner == null) {
return TranslatableCaption.of("info.none");
@ -218,50 +211,6 @@ public abstract class PlayerManager<P extends PlotPlayer<? extends T>, T> {
return StaticCaption.of(name);
}
/**
* Resolves a UUID to a formatted {@link Caption} representing the player behind the UUID.
* Returns a {@link CompletableFuture} instead of a plain {@link UUID} as this method may query the
* {@link com.plotsquared.core.uuid.UUIDPipeline ImpromptuUUIDPipeline}.
* <br>
* Special Cases:
* <ul>
* <li>{@code null}: Resolves to a {@link TranslatableCaption} with the key {@code info.none}</li>
* <li>{@link DBFunc#EVERYONE}: Resolves to a {@link TranslatableCaption} with the key {@code info.everyone}</li>
* <li>{@link DBFunc#SERVER}: Resolves to a {@link TranslatableCaption} with the key {@code info.server}</li>
* </ul>
* <br>
* Otherwise, if the UUID is a valid UUID and not reserved by PlotSquared itself, this method first attempts to query the
* online players ({@link #getPlayerIfExists(UUID)}) for the specific UUID.
* If no online player was found for that UUID, the {@link com.plotsquared.core.uuid.UUIDPipeline ImpromptuUUIDPipeline} is
* queried to retrieve the known username
*
* @param uuid The UUID of the player (for example provided by {@link Plot#getOwner()}
* @return A CompletableFuture resolving to a Caption representing the players name of the uuid
* @since 7.1.0
*/
@Contract("_->!null")
public @NonNull CompletableFuture<Caption> getUsernameCaption(@Nullable UUID uuid) {
if (uuid == null) {
return CompletableFuture.completedFuture(TranslatableCaption.of("info.none"));
}
if (uuid.equals(DBFunc.EVERYONE)) {
return CompletableFuture.completedFuture(TranslatableCaption.of("info.everyone"));
}
if (uuid.equals(DBFunc.SERVER)) {
return CompletableFuture.completedFuture(TranslatableCaption.of("info.server"));
}
P player = getPlayerIfExists(uuid);
if (player != null) {
return CompletableFuture.completedFuture(StaticCaption.of(player.getName()));
}
return PlotSquared.get().getImpromptuUUIDPipeline().getNames(Collections.singleton(uuid)).thenApply(mapping -> {
if (mapping.isEmpty()) {
return TranslatableCaption.of("info.unknown");
}
return StaticCaption.of(mapping.get(0).username());
});
}
/**
* Remove a player from the player map
*

View File

@ -83,7 +83,6 @@ import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.nio.channels.Channels;
@ -145,7 +144,7 @@ public abstract class SchematicHandler {
}
final URL url;
try {
url = URI.create(Settings.Web.URL + "?key=" + uuid + "&type=" + extension).toURL();
url = new URL(Settings.Web.URL + "?key=" + uuid + "&type=" + extension);
} catch (MalformedURLException e) {
e.printStackTrace();
whenDone.run();
@ -154,7 +153,7 @@ public abstract class SchematicHandler {
TaskManager.runTaskAsync(() -> {
try {
String boundary = Long.toHexString(System.currentTimeMillis());
URLConnection con = URI.create(website).toURL().openConnection();
URLConnection con = new URL(website).openConnection();
con.setDoOutput(true);
con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
try (OutputStream output = con.getOutputStream();
@ -499,10 +498,9 @@ public abstract class SchematicHandler {
public List<String> getSaves(UUID uuid) {
String rawJSON;
try {
URLConnection connection = URI.create(
Settings.Web.URL + "list.php?" + uuid.toString())
.toURL()
.openConnection();
String website = Settings.Web.URL + "list.php?" + uuid.toString();
URL url = new URL(website);
URLConnection connection = new URL(url.toString()).openConnection();
connection.setRequestProperty("User-Agent", "Mozilla/5.0");
try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
rawJSON = reader.lines().collect(Collectors.joining());

View File

@ -173,7 +173,7 @@ public final class TabCompletions {
return Collections.emptyList();
}
final List<String> commands = new ArrayList<>();
for (int i = offset; i <= highestLimit && (offset - i + amountLimit) > 0; i++) {
for (int i = offset; i < highestLimit && (offset - i + amountLimit) > 0; i++) {
commands.add(String.valueOf(i));
}
return asCompletions(commands.toArray(new String[0]));

View File

@ -47,7 +47,6 @@ import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.function.BiFunction;
/**
@ -110,9 +109,9 @@ public final class PlaceholderRegistry {
if (plotOwner == null) {
return legacyComponent(TranslatableCaption.of("generic.generic_unowned"), player);
}
try {
return PlotSquared.platform().playerManager().getUsernameCaption(plotOwner)
.get(Settings.UUID.BLOCKING_TIMEOUT, TimeUnit.MILLISECONDS).getComponent(player);
return PlayerManager.resolveName(plotOwner, false).getComponent(player);
} catch (final Exception ignored) {
}
return legacyComponent(TranslatableCaption.of("info.unknown"), player);
@ -188,7 +187,6 @@ public final class PlaceholderRegistry {
}
});
this.createPlaceholder("currentplot_biome", (player, plot) -> plot.getBiomeSynchronous().toString());
this.createPlaceholder("currentplot_size", (player, plot) -> String.valueOf(plot.getConnectedPlots().size()));
}
/**

View File

@ -1,31 +0,0 @@
/*
* 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,16 +219,6 @@ 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

@ -124,7 +124,7 @@
"economy.cannot_afford_merge": "<prefix><red>You cannot afford to merge the plots. It costs <gold><money></gold>.</red>",
"economy.added_balance": "<prefix><gold><money> </gold><gray>has been added to your balance.</gray>",
"economy.removed_balance": "<prefix><gold><money> </gold><gray>has been taken from your balance.</gray>",
"economy.removed_granted_plot": "<prefix><gray>You used <used_grants> plot grant(s), you've got </gray><gold><remaining_grants></gold> <gray>left.</gray>",
"economy.removed_granted_plot": "<prefix><gray>You used <usedGrants> plot grant(s), you've got </gray><gold><remainingGrants></gold> <gray>left.</gray>",
"setup.choose_generator": "<gold>What generator do you want?</gold>",
"setup.setup_not_started": "<prefix><gold>No setup started.</gold>",
"setup.setup_init": "<prefix><gold>Usage: </gold><gray>/plot setup <value></gray>",
@ -190,7 +190,6 @@
"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>",
@ -249,11 +248,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><minimum_radius></gray>",
"condense.maximum_moved": "<gold>Maximum moved: </gold><gray><maximum_moves></gray>",
"condense.minimum_radius": "<gold>Minimum radius: </gold><gray><minimumRadius></gray>",
"condense.maximum_moved": "<gold>Maximum moved: </gold><gray><maximumMoves></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><user_move></gray>",
"condense.estimated_moves": "<gold>Estimated moves: </gold><gray><userMove></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>",
@ -552,11 +551,9 @@
"flags.flag_description_block_burn": "<gray>Set to `true` to allow blocks to burn within the plot.</gray>",
"flags.flag_description_block_ignition": "<gray>Set to `false` to prevent blocks from igniting within the plot.</gray>",
"flags.flag_description_break": "<gray>Define a list of materials players should be able to break even when they aren't added to the plot.</gray>",
"flags.flag_description_concrete_harden": "<gray>Set to `false` to disable concrete powder forming to concrete with water.</gray>",
"flags.flag_description_device_interact": "<gray>Set to `true` to allow devices to be interacted with in the plot.</gray>",
"flags.flag_description_disable_physics": "<gray>Set to `true` to disable block physics in the plot.</gray>",
"flags.flag_description_drop_protection": "<gray>Set to `true` to prevent dropped items from being picked up by non-members of the plot.</gray>",
"flags.flag_description_edit_sign": "<gray>Set to `true` to allow editing signs in the plot.</gray>",
"flags.flag_description_feed": "<gray>Specify an interval in seconds and an optional amount by which the players will be fed (amount is 1 by default).</gray>",
"flags.flag_description_forcefield": "<gray>Set to `true` to enable member forcefield in the plot.</gray>",
"flags.flag_description_grass_grow": "<gray>Set to `false` to prevent grass from growing within the plot.</gray>",
@ -590,7 +587,6 @@
"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>",
@ -635,8 +631,6 @@
"flags.flag_error_double": "Flag value must be a decimal number.",
"flags.flag_error_music": "Flag value must be a valid music disc ID.",
"flags.flag_error_title": "Flag value must be in the format </red><grey>\"A title\" \"The subtitle\"</grey><red>.",
"flags.delaying_loading_area_flags": "<prefix><gray>Delaying loading flags for area `</gray><dark_aqua><area></dark_aqua><gray>` as WorldEdit is not initialised yet.</gray>",
"flags.loading_area_flags": "<prefix><gray>Loading flags for area: </gray><dark_aqua><area></dark_aqua>",
"flags.area_flags": "<prefix><gray>Area flags: </gray><dark_aqua><flags></dark_aqua>",
"flags.road_flags": "<prefix><gray>Road flags: </gray><dark_aqua><flags></dark_aqua>",
"commands.description.add": "<gray>Allow a user to build in a plot while the plot owner is online.</gray>",

View File

@ -1,8 +1,7 @@
import com.diffplug.gradle.spotless.SpotlessPlugin
import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin
import groovy.json.JsonSlurper
import xyz.jpenilla.runpaper.task.RunServer
import java.net.URI
import xyz.jpenilla.runpaper.task.RunServer
plugins {
java
@ -22,7 +21,7 @@ plugins {
}
group = "com.intellectualsites.plotsquared"
version = "7.3.2-SNAPSHOT"
version = "7.0.0-SNAPSHOT"
if (!File("$rootDir/.git").exists()) {
logger.lifecycle("""
@ -79,8 +78,7 @@ subprojects {
dependencies {
// Tests
testImplementation("org.junit.jupiter:junit-jupiter:5.10.1")
testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.10.1")
testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
}
plugins.withId("java") {
@ -151,34 +149,29 @@ subprojects {
id.set("Sauilitired")
name.set("Alexander Söderberg")
organization.set("IntellectualSites")
organizationUrl.set("https://github.com/IntellectualSites")
}
developer {
id.set("NotMyFault")
name.set("Alexander Brandes")
organization.set("IntellectualSites")
organizationUrl.set("https://github.com/IntellectualSites")
email.set("contact(at)notmyfault.dev")
}
developer {
id.set("SirYwell")
name.set("Hannes Greule")
organization.set("IntellectualSites")
organizationUrl.set("https://github.com/IntellectualSites")
}
developer {
id.set("dordsor21")
name.set("dordsor21")
organization.set("IntellectualSites")
organizationUrl.set("https://github.com/IntellectualSites")
}
}
scm {
url.set("https://github.com/IntellectualSites/PlotSquared")
connection.set("scm:git:https://github.com/IntellectualSites/PlotSquared.git")
developerConnection.set("scm:git:git@github.com:IntellectualSites/PlotSquared.git")
tag.set("${project.version}")
connection.set("scm:https://IntellectualSites@github.com/IntellectualSites/PlotSquared.git")
developerConnection.set("scm:git://github.com/IntellectualSites/PlotSquared.git")
}
issueManagement {
@ -225,28 +218,14 @@ 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.4")
val supportedVersions = listOf("1.16.5", "1.17", "1.17.1", "1.18.2", "1.19", "1.19.1", "1.19.2", "1.19.3", "1.19.4", "1.20")
tasks {
register("cacheLatestFaweArtifact") {
val lastSuccessfulBuildUrl = uri("https://ci.athion.net/job/FastAsyncWorldEdit/lastSuccessfulBuild/api/json").toURL()
val artifact = ((JsonSlurper().parse(lastSuccessfulBuildUrl) as Map<*, *>)["artifacts"] as List<*>)
.map { it as Map<*, *> }
.map { it["fileName"] as String }
.first { it -> it.contains("Bukkit") }
project.ext["faweArtifact"] = artifact
}
supportedVersions.forEach {
register<RunServer>("runServer-$it") {
dependsOn(getByName("cacheLatestFaweArtifact"))
minecraftVersion(it)
pluginJars(*project(":plotsquared-bukkit").getTasksByName("shadowJar", false)
.map { task -> (task as Jar).archiveFile }
pluginJars(*project(":plotsquared-bukkit").getTasksByName("shadowJar", false).map { (it as Jar).archiveFile }
.toTypedArray())
jvmArgs("-DPaper.IgnoreJavaVersion=true", "-Dcom.mojang.eula.agree=true")
downloadPlugins {
url("https://ci.athion.net/job/FastAsyncWorldEdit/lastSuccessfulBuild/artifact/artifacts/${project.ext["faweArtifact"]}")
}
group = "run paper"
runDirectory.set(file("run-$it"))
}

View File

@ -1,44 +1,43 @@
[versions]
# Platform expectations
paper = "1.20.2-R0.1-SNAPSHOT"
paper = "1.20.1-R0.1-SNAPSHOT"
guice = "7.0.0"
spotbugs = "4.8.3"
checkerqual = "3.42.0"
spotbugs = "4.7.3"
checkerqual = "3.37.0"
gson = "2.10"
guava = "31.1-jre"
snakeyaml = "2.0"
adventure = "4.15.0"
adventure-bukkit = "4.3.2"
adventure = "4.14.0"
adventure-bukkit = "4.3.0"
log4j = "2.19.0"
# Plugins
worldedit = "7.2.18"
fawe = "2.8.3"
placeholderapi = "2.11.5"
worldedit = "7.2.15"
fawe = "2.7.0"
placeholderapi = "2.11.3"
luckperms = "5.4"
essentialsx = "2.20.1"
mvdwapi = "3.1.1"
miniplaceholders = "2.2.3"
# Third party
prtree = "2.0.1"
aopalliance = "1.0"
cloud-services = "1.8.4"
cloud-services = "1.8.3"
arkitektonika = "2.1.2"
squirrelid = "0.3.2"
paster = "1.1.5"
bstats = "3.0.2"
paperlib = "1.0.8"
informative-annotations = "1.4"
informative-annotations = "1.3"
vault = "1.7.1"
serverlib = "2.3.4"
serverlib = "2.3.1"
# Gradle plugins
shadow = "8.1.1"
grgit = "4.1.1"
spotless = "6.23.3"
spotless = "6.20.0"
nexus = "1.3.0"
runPaper = "2.2.2"
runPaper = "2.1.0"
[libraries]
# Platform expectations
@ -69,7 +68,6 @@ 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" }

Binary file not shown.

View File

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

17
gradlew vendored
View File

@ -83,8 +83,7 @@ done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@ -145,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
# shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
@ -153,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
# shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@ -202,11 +201,11 @@ fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \