Compare commits

..

9 Commits

Author SHA1 Message Date
Pierre Maurice Schwang
f2924f8a73 chore: spotlessApply 2025-02-23 21:51:54 +01:00
Pierre Maurice Schwang
670c241d76 fix: OOB in hasNext of iterator when streaming plots 2025-02-23 21:37:22 +01:00
Pierre Maurice Schwang
9c64c2e5fa chore: doesn't need to be internal anymore 2025-02-23 20:34:21 +01:00
Pierre Maurice Schwang
fb2165e4e0 chore/feat: add comparator for plots, implement PlotQuery#asStream 2025-02-23 20:34:20 +01:00
Pierre Maurice Schwang
30867354cc chore/fix: update iterator 2025-02-23 20:34:20 +01:00
Pierre Maurice Schwang
36de196d3d chore: don't filter on base-plot twice 2025-02-23 20:34:20 +01:00
Pierre Maurice Schwang
60f81c4732 chore/feat: don't query full plot list twice 2025-02-23 20:34:20 +01:00
Pierre Maurice Schwang
d9a46635fd chore: simplify OwnersIncludeFilter (don't construct owner list twice) 2025-02-23 20:34:20 +01:00
Pierre Maurice Schwang
424806c5f4 chore/feat: add stream operations to PlotQuery, avoid larger lookups 2025-02-23 20:34:19 +01:00
111 changed files with 1081 additions and 2024 deletions

View File

@@ -27,7 +27,7 @@ body:
description: Which server version are you using? If your server version is not listed, it is not supported. Update to a supported version first. description: Which server version are you using? If your server version is not listed, it is not supported. Update to a supported version first.
multiple: false multiple: false
options: options:
- '1.21.11' - '1.21.4'
- '1.21.3' - '1.21.3'
- '1.21.1' - '1.21.1'
- '1.20.6' - '1.20.6'

View File

@@ -2,8 +2,7 @@
"$schema": "https://docs.renovatebot.com/renovate-schema.json", "$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [ "extends": [
"config:recommended", "config:recommended",
":semanticCommitsDisabled", ":semanticCommitsDisabled"
"schedule:earlyMondays"
], ],
"automerge": true, "automerge": true,
"labels": [ "labels": [

18
.github/stale.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
daysUntilStale: 30
daysUntilClose: 7
only: issues
exemptLabels:
- "Bug"
- "Enhancement"
- "Approved"
- "Priority"
- "Under investigation"
staleLabel: "resolution: stale"
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. If the issue is still present and can be reproduced, please let the team know.
Thank you for your contributions.
closeComment: >
This issue has been automatically closed because it has not had activity in
a long time. If the issue still applies to the most recent supported
version, please reply to this issue and the team will reopen it.

View File

@@ -11,7 +11,7 @@ jobs:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
DISCORD_USERNAME: PlotSquared Release DISCORD_USERNAME: PlotSquared Release
DISCORD_AVATAR: https://raw.githubusercontent.com/IntellectualSites/Assets/main/plugins/PlotSquared/PlotSquared.png DISCORD_AVATAR: https://raw.githubusercontent.com/IntellectualSites/Assets/main/plugins/PlotSquared/PlotSquared.png
uses: Ilshidur/action-discord@0.4.0 uses: Ilshidur/action-discord@0.3.2
with: with:
args: | args: |
"<@&525015541815967744> <@&679322738552471574> <@&699293353862496266>" "<@&525015541815967744> <@&679322738552471574> <@&699293353862496266>"

View File

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

View File

@@ -9,11 +9,11 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@v6 uses: actions/checkout@v4
- name: Validate Gradle Wrapper - name: Validate Gradle Wrapper
uses: gradle/actions/wrapper-validation@v5 uses: gradle/actions/wrapper-validation@v4
- name: Setup Java - name: Setup Java
uses: actions/setup-java@v5 uses: actions/setup-java@v4
with: with:
distribution: temurin distribution: temurin
java-version: 21 java-version: 21
@@ -29,18 +29,18 @@ jobs:
fi fi
- name: Publish Release - name: Publish Release
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}} if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
run: ./gradlew publishAndReleaseToMavenCentral --no-configuration-cache run: ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository
env: env:
ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.CENTRAL_USERNAME }} ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.CENTRAL_PASSWORD }} ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }}
ORG_GRADLE_PROJECT_signingKey: ${{ secrets.SIGNING_KEY }} ORG_GRADLE_PROJECT_signingKey: ${{ secrets.SIGNING_KEY }}
ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.SIGNING_PASSWORD }} ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.SIGNING_PASSWORD }}
- name: Publish Snapshot - name: Publish Snapshot
if: ${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main' }} if: ${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main' }}
run: ./gradlew publishAllPublicationsToMavenCentralRepository run: ./gradlew publishToSonatype
env: env:
ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.CENTRAL_USERNAME }} ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.CENTRAL_PASSWORD }} ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }}
- name: Publish core javadoc - name: Publish core javadoc
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}} if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
uses: cpina/github-action-push-to-another-repository@main uses: cpina/github-action-push-to-another-repository@main

View File

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

View File

@@ -3,7 +3,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
repositories { repositories {
maven { maven {
name = "PlaceholderAPI" name = "PlaceholderAPI"
url = uri("https://repo.extendedclip.com/releases/") url = uri("https://repo.extendedclip.com/content/repositories/placeholderapi/")
} }
maven { maven {
@@ -17,19 +17,6 @@ repositories {
} }
} }
// Make sure we control the exact version of paper being included, while dropping spigot + bukkit
configurations.all {
exclude("org.bukkit")
exclude("org.spigotmc")
resolutionStrategy.eachDependency {
if (requested.group == "io.papermc.paper" && requested.name == "paper-api") {
useVersion(checkNotNull(libs.paper.orNull?.version))
because("specific paper version is required to prevent binary incompatibilities on older versions")
}
}
}
dependencies { dependencies {
api(projects.plotsquaredCore) api(projects.plotsquaredCore)
@@ -41,13 +28,20 @@ dependencies {
implementation(libs.paperlib) implementation(libs.paperlib)
// Plugins // Plugins
compileOnly(libs.worldeditBukkit) compileOnly(libs.worldeditBukkit) {
exclude(group = "org.bukkit")
exclude(group = "org.spigotmc")
}
compileOnly(libs.faweBukkit) { isTransitive = false } compileOnly(libs.faweBukkit) { isTransitive = false }
testImplementation(libs.faweBukkit) { isTransitive = false } testImplementation(libs.faweBukkit) { isTransitive = false }
compileOnly(libs.vault) compileOnly(libs.vault) {
exclude(group = "org.bukkit")
}
compileOnly(libs.placeholderapi) compileOnly(libs.placeholderapi)
compileOnly(libs.luckperms) compileOnly(libs.luckperms)
compileOnly(libs.essentialsx) compileOnly(libs.essentialsx) {
exclude(group = "org.spigotmc")
}
compileOnly(libs.mvdwapi) { isTransitive = false } compileOnly(libs.mvdwapi) { isTransitive = false }
// Other libraries // Other libraries
@@ -110,9 +104,9 @@ tasks {
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString() val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
val opt = options as StandardJavadocDocletOptions val opt = options as StandardJavadocDocletOptions
opt.links("https://jd.papermc.io/paper/1.20.4/") opt.links("https://jd.papermc.io/paper/1.20.4/")
// opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString()) 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://intellectualsites.github.io/plotsquared-javadocs/core/")
// opt.links("https://jd.advntr.dev/api/" + libs.adventureApi.get().versionConstraint.toString()) opt.links("https://jd.advntr.dev/api/" + libs.adventureApi.get().versionConstraint.toString())
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/") opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
opt.links("https://checkerframework.org/api/") opt.links("https://checkerframework.org/api/")
opt.isLinkSource = true opt.isLinkSource = true

View File

@@ -252,11 +252,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
return Bukkit.getVersion(); return Bukkit.getVersion();
} }
@Override
public @NonNull String serverBrand() {
return Bukkit.getName();
}
@Override @Override
@SuppressWarnings("deprecation") // Paper deprecation @SuppressWarnings("deprecation") // Paper deprecation
public void onEnable() { public void onEnable() {
@@ -837,8 +832,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
case "HOPPER_MINECART": case "HOPPER_MINECART":
case "MINECART_MOB_SPAWNER": case "MINECART_MOB_SPAWNER":
case "SPAWNER_MINECART": case "SPAWNER_MINECART":
case "END_CRYSTAL": case "ENDER_CRYSTAL":
case "ENDER_CRYSTAL": // Backwards compatibility for 1.20.4
case "MINECART_TNT": case "MINECART_TNT":
case "TNT_MINECART": case "TNT_MINECART":
case "CHEST_BOAT": case "CHEST_BOAT":
@@ -956,8 +950,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
case "ENDERMITE": case "ENDERMITE":
case "ENDER_DRAGON": case "ENDER_DRAGON":
case "GHAST": case "GHAST":
case "HAPPY_GHAST": // 1.21.6+
case "GHASTLING": // 1.21.6+
case "GIANT": case "GIANT":
case "GUARDIAN": case "GUARDIAN":
case "HORSE": case "HORSE":

View File

@@ -115,7 +115,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
this.dataByte = getOrdinal(Boat.Type.values(), boat.getBoatType()); this.dataByte = getOrdinal(Boat.Type.values(), boat.getBoatType());
storeInventory(boat); storeInventory(boat);
} }
case "ARROW", "EGG", "END_CRYSTAL", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "EXPERIENCE_ORB", "FALLING_BLOCK", "FIREBALL", case "ARROW", "EGG", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "EXPERIENCE_ORB", "FALLING_BLOCK", "FIREBALL",
"FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND", "MINECART_MOB_SPAWNER", "FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND", "MINECART_MOB_SPAWNER",
"MINECART_TNT", "PLAYER", "PRIMED_TNT", "SLIME", "SMALL_FIREBALL", "SNOWBALL", "MINECART_FURNACE", "SPLASH_POTION", "MINECART_TNT", "PLAYER", "PRIMED_TNT", "SLIME", "SMALL_FIREBALL", "SNOWBALL", "MINECART_FURNACE", "SPLASH_POTION",
"THROWN_EXP_BOTTLE", "WITHER_SKULL", "UNKNOWN", "SPECTRAL_ARROW", "SHULKER_BULLET", "DRAGON_FIREBALL", "AREA_EFFECT_CLOUD", "THROWN_EXP_BOTTLE", "WITHER_SKULL", "UNKNOWN", "SPECTRAL_ARROW", "SHULKER_BULLET", "DRAGON_FIREBALL", "AREA_EFFECT_CLOUD",
@@ -272,7 +272,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
this.dataByte = (byte) entity1.getPhase().ordinal(); this.dataByte = (byte) entity1.getPhase().ordinal();
return; return;
} }
case "SKELETON", "WITHER_SKELETON", "GUARDIAN", "ELDER_GUARDIAN", "GHAST", "HAPPY_GHAST", "GHASTLING", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN", case "SKELETON", "WITHER_SKELETON", "GUARDIAN", "ELDER_GUARDIAN", "GHAST", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN",
"ZOMBIFIED_PIGLIN", "PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH", "ZOMBIFIED_PIGLIN", "PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH",
"GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SHULKER", "SNOWMAN", "SNOW_GOLEM" -> { "GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SHULKER", "SNOWMAN", "SNOW_GOLEM" -> {
storeLiving((LivingEntity) entity); storeLiving((LivingEntity) entity);
@@ -511,7 +511,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
((Slime) entity).setSize(this.dataByte); ((Slime) entity).setSize(this.dataByte);
return entity; return entity;
} */ } */
case "ARROW", "EGG", "END_CRYSTAL", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "DROPPED_ITEM", "EXPERIENCE_ORB", "FALLING_BLOCK", case "ARROW", "EGG", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "DROPPED_ITEM", "EXPERIENCE_ORB", "FALLING_BLOCK",
"FIREBALL", "FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND", "FIREBALL", "FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND",
"MINECART_MOB_SPAWNER", "MINECART_TNT", "PLAYER", "PRIMED_TNT", "SMALL_FIREBALL", "SNOWBALL", "MINECART_MOB_SPAWNER", "MINECART_TNT", "PLAYER", "PRIMED_TNT", "SMALL_FIREBALL", "SNOWBALL",
"SPLASH_POTION", "THROWN_EXP_BOTTLE", "SPECTRAL_ARROW", "SHULKER_BULLET", "AREA_EFFECT_CLOUD", "SPLASH_POTION", "THROWN_EXP_BOTTLE", "SPECTRAL_ARROW", "SHULKER_BULLET", "AREA_EFFECT_CLOUD",
@@ -676,7 +676,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
restoreLiving((LivingEntity) entity); restoreLiving((LivingEntity) entity);
return entity; return entity;
} }
case "ENDERMITE", "GHAST", "HAPPY_GHAST", "GHASTLING", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN", "PIGLIN", "ZOMBIFIED_PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH", "GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SNOWMAN", "SHULKER", "GUARDIAN", "ELDER_GUARDIAN", "SKELETON", "WITHER_SKELETON" -> { case "ENDERMITE", "GHAST", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN", "PIGLIN", "ZOMBIFIED_PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH", "GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SNOWMAN", "SHULKER", "GUARDIAN", "ELDER_GUARDIAN", "SKELETON", "WITHER_SKELETON" -> {
restoreLiving((LivingEntity) entity); restoreLiving((LivingEntity) entity);
return entity; return entity;
} }

View File

@@ -219,7 +219,7 @@ public class BlockEventListener implements Listener {
} }
} }
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.LOWEST)
public void blockDestroy(BlockBreakEvent event) { public void blockDestroy(BlockBreakEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
Location location = BukkitUtil.adapt(event.getBlock().getLocation()); Location location = BukkitUtil.adapt(event.getBlock().getLocation());

View File

@@ -28,6 +28,7 @@ import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag;
import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag; import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag;
import com.plotsquared.core.plot.flag.implementations.SculkSensorInteractFlag; import com.plotsquared.core.plot.flag.implementations.SculkSensorInteractFlag;
import com.plotsquared.core.util.PlotFlagUtil; import com.plotsquared.core.util.PlotFlagUtil;
import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Item; import org.bukkit.entity.Item;
@@ -41,11 +42,31 @@ import org.bukkit.event.block.BlockReceiveGameEvent;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class BlockEventListener117 implements Listener { public class BlockEventListener117 implements Listener {
private static final Set<Material> COPPER_OXIDIZING = Set.of(
Material.COPPER_BLOCK,
Material.EXPOSED_COPPER,
Material.WEATHERED_COPPER,
Material.OXIDIZED_COPPER,
Material.CUT_COPPER,
Material.EXPOSED_CUT_COPPER,
Material.WEATHERED_CUT_COPPER,
Material.OXIDIZED_CUT_COPPER,
Material.CUT_COPPER_STAIRS,
Material.EXPOSED_CUT_COPPER_STAIRS,
Material.WEATHERED_CUT_COPPER_STAIRS,
Material.OXIDIZED_CUT_COPPER_STAIRS,
Material.CUT_COPPER_SLAB,
Material.EXPOSED_CUT_COPPER_SLAB,
Material.WEATHERED_CUT_COPPER_SLAB,
Material.OXIDIZED_CUT_COPPER_SLAB
);
@Inject @Inject
public BlockEventListener117() { public BlockEventListener117() {
} }
@@ -113,7 +134,7 @@ public class BlockEventListener117 implements Listener {
public void onBlockFertilize(BlockFertilizeEvent event) { public void onBlockFertilize(BlockFertilizeEvent event) {
Block block = event.getBlock(); Block block = event.getBlock();
List<org.bukkit.block.BlockState> blocks = event.getBlocks(); List<org.bukkit.block.BlockState> blocks = event.getBlocks();
Location location = BukkitUtil.adapt(block.getLocation()); Location location = BukkitUtil.adapt(blocks.get(0).getLocation());
PlotArea area = location.getPlotArea(); PlotArea area = location.getPlotArea();
if (area == null) { if (area == null) {
@@ -163,7 +184,7 @@ public class BlockEventListener117 implements Listener {
if (plot == null) { if (plot == null) {
return; return;
} }
if (event.getNewState().getType().name().contains("COPPER")) { if (COPPER_OXIDIZING.contains(event.getNewState().getType())) {
if (!plot.getFlag(CopperOxideFlag.class)) { if (!plot.getFlag(CopperOxideFlag.class)) {
plot.debug("Copper could not oxide because copper-oxide = false"); plot.debug("Copper could not oxide because copper-oxide = false");
event.setCancelled(true); event.setCancelled(true);

View File

@@ -160,7 +160,7 @@ public class EntityEventListener implements Listener {
return; return;
} }
} }
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SILVERFISH_BLOCK", "ENDER_PEARL", case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
"TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL", "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL",
"FROZEN", "SPELL", "DEFAULT" -> { "FROZEN", "SPELL", "DEFAULT" -> {
if (!area.isMobSpawning()) { if (!area.isMobSpawning()) {

View File

@@ -29,7 +29,6 @@ import com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent;
import com.destroystokyo.paper.event.server.AsyncTabCompleteEvent; import com.destroystokyo.paper.event.server.AsyncTabCompleteEvent;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.plotsquared.bukkit.util.BukkitUtil; import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.command.Command; import com.plotsquared.core.command.Command;
import com.plotsquared.core.command.MainCommand; import com.plotsquared.core.command.MainCommand;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
@@ -39,7 +38,6 @@ import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.PlotAreaType;
import com.plotsquared.core.plot.flag.FlagContainer; import com.plotsquared.core.plot.flag.FlagContainer;
import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag; import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag;
import com.plotsquared.core.plot.flag.implementations.DoneFlag; import com.plotsquared.core.plot.flag.implementations.DoneFlag;
@@ -50,7 +48,6 @@ import com.plotsquared.core.plot.flag.types.BooleanFlag;
import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.PlotFlagUtil; import com.plotsquared.core.util.PlotFlagUtil;
import io.papermc.paper.event.entity.EntityMoveEvent; import io.papermc.paper.event.entity.EntityMoveEvent;
import io.papermc.paper.event.world.StructuresLocateEvent;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag; import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
@@ -104,10 +101,6 @@ public class PaperListener implements Listener {
} }
Plot plot = area.getPlot(location); Plot plot = area.getPlot(location);
if (plot != null) { if (plot != null) {
// Prevent dropping blocks which normally would not be dropped.
if (!event.willDrop()) {
return;
}
event.setWillDrop(plot.getFlag(TileDropFlag.class)); event.setWillDrop(plot.getFlag(TileDropFlag.class));
} }
} }
@@ -206,7 +199,7 @@ public class PaperListener implements Listener {
return; return;
} }
} }
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SILVERFISH_BLOCK", "ENDER_PEARL", "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> { case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL", "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> {
if (!area.isMobSpawning()) { if (!area.isMobSpawning()) {
event.setShouldAbortSpawn(true); event.setShouldAbortSpawn(true);
event.setCancelled(true); event.setCancelled(true);
@@ -465,21 +458,6 @@ public class PaperListener implements Listener {
} }
} }
/**
* Don't let the server die when populating cartographers (villager offering maps) in classic plot worlds
* (as those don't generate POIs)
*/
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onStructuresLocate(StructuresLocateEvent event) {
if (!PlotSquared.get().getPlotAreaManager().hasPlotArea(event.getWorld().getName())) {
return;
}
final PlotArea area = PlotSquared.get().getPlotAreaManager().getPlotAreaByString(event.getWorld().getName());
if (area != null && area.getType() == PlotAreaType.NORMAL) {
event.setCancelled(true);
}
}
private boolean getBooleanFlagValue( private boolean getBooleanFlagValue(
@NonNull FlagContainer container, @NonNull FlagContainer container,
@NonNull Class<? extends BooleanFlag<?>> flagClass, @NonNull Class<? extends BooleanFlag<?>> flagClass,

View File

@@ -64,11 +64,9 @@ import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag;
import com.plotsquared.core.plot.flag.implementations.TamedInteractFlag; import com.plotsquared.core.plot.flag.implementations.TamedInteractFlag;
import com.plotsquared.core.plot.flag.implementations.TileDropFlag; import com.plotsquared.core.plot.flag.implementations.TileDropFlag;
import com.plotsquared.core.plot.flag.implementations.UntrustedVisitFlag; import com.plotsquared.core.plot.flag.implementations.UntrustedVisitFlag;
import com.plotsquared.core.plot.flag.implementations.UseFlag;
import com.plotsquared.core.plot.flag.implementations.VehicleBreakFlag; import com.plotsquared.core.plot.flag.implementations.VehicleBreakFlag;
import com.plotsquared.core.plot.flag.implementations.VehicleUseFlag; import com.plotsquared.core.plot.flag.implementations.VehicleUseFlag;
import com.plotsquared.core.plot.flag.implementations.VillagerInteractFlag; import com.plotsquared.core.plot.flag.implementations.VillagerInteractFlag;
import com.plotsquared.core.plot.flag.types.BlockTypeWrapper;
import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.MathMan;
@@ -79,9 +77,7 @@ import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.util.task.TaskTime; import com.plotsquared.core.util.task.TaskTime;
import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.util.Enums;
import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes;
import io.papermc.lib.PaperLib; import io.papermc.lib.PaperLib;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
@@ -92,8 +88,10 @@ import org.bukkit.Bukkit;
import org.bukkit.FluidCollisionMode; import org.bukkit.FluidCollisionMode;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState; import org.bukkit.block.BlockState;
import org.bukkit.block.Sign; import org.bukkit.block.Sign;
import org.bukkit.block.data.Waterlogged;
import org.bukkit.command.PluginCommand; import org.bukkit.command.PluginCommand;
import org.bukkit.entity.ArmorStand; import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Boat; import org.bukkit.entity.Boat;
@@ -156,12 +154,9 @@ import org.bukkit.util.Vector;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
@@ -185,17 +180,7 @@ public class PlayerEventListener implements Listener {
Material.WRITABLE_BOOK, Material.WRITABLE_BOOK,
Material.WRITTEN_BOOK Material.WRITTEN_BOOK
); );
/**
* The correct EntityType for End Crystal, determined once at class loading time.
* Tries END_CRYSTAL first (1.21+), falls back to ENDER_CRYSTAL (1.20.4 and older).
*/
private static final EntityType END_CRYSTAL_ENTITY_TYPE = Objects.requireNonNull(
Enums.findByValue(EntityType.class, "END_CRYSTAL", "ENDER_CRYSTAL")
);
private static final Set<String> DYES; private static final Set<String> DYES;
static { static {
Set<String> mutableDyes = new HashSet<>(Set.of( Set<String> mutableDyes = new HashSet<>(Set.of(
"WHITE_DYE", "WHITE_DYE",
@@ -548,14 +533,12 @@ public class PlayerEventListener implements Listener {
// Delayed // Delayed
// Async // Async
TaskManager.runTaskLaterAsync( TaskManager.runTaskLaterAsync(() -> {
() -> {
if (!player.hasPlayedBefore() && player.isOnline()) { if (!player.hasPlayedBefore() && player.isOnline()) {
player.saveData(); player.saveData();
} }
this.eventDispatcher.doJoinTask(pp); this.eventDispatcher.doJoinTask(pp);
}, TaskTime.seconds(1L) }, TaskTime.seconds(1L));
);
if (pp.hasPermission(Permission.PERMISSION_ADMIN_UPDATE_NOTIFICATION.toString()) && Settings.Enabled_Components.UPDATE_NOTIFICATIONS if (pp.hasPermission(Permission.PERMISSION_ADMIN_UPDATE_NOTIFICATION.toString()) && Settings.Enabled_Components.UPDATE_NOTIFICATIONS
&& PremiumVerification.isPremium() && UpdateUtility.hasUpdate) { && PremiumVerification.isPremium() && UpdateUtility.hasUpdate) {
@@ -600,7 +583,7 @@ public class PlayerEventListener implements Listener {
PlotArea area = location.getPlotArea(); PlotArea area = location.getPlotArea();
if (area == null) { if (area == null) {
if (lastPlot != null) { if (lastPlot != null) {
plotListener.plotExit(pp, lastPlot, null, null); plotListener.plotExit(pp, lastPlot);
lastPlotAccess.remove(); lastPlotAccess.remove();
} }
try (final MetaDataAccess<Location> lastLocationAccess = try (final MetaDataAccess<Location> lastLocationAccess =
@@ -610,20 +593,14 @@ public class PlayerEventListener implements Listener {
return; return;
} }
Plot plot = area.getPlot(location); Plot plot = area.getPlot(location);
if (plot != null && !plot.equals(lastPlot)) { if (plot != null) {
final boolean result = DenyTeleportFlag.allowsTeleport(pp, plot); final boolean result = DenyTeleportFlag.allowsTeleport(pp, plot);
// there is one possibility to still allow teleportation: // there is one possibility to still allow teleportation:
// to is identical to the plot's home location, and untrusted-visit is true // to is identical to the plot's home location, and untrusted-visit is true
// i.e. untrusted-visit can override deny-teleport // i.e. untrusted-visit can override deny-teleport
// this is acceptable, because otherwise it wouldn't make sense to have both flags set // this is acceptable, because otherwise it wouldn't make sense to have both flags set
if (result || (plot.getFlag(UntrustedVisitFlag.class) && plot if (result || (plot.getFlag(UntrustedVisitFlag.class) && plot.getHomeSynchronous().equals(BukkitUtil.adaptComplete(to)))) {
.getHomeSynchronous() plotListener.plotEntry(pp, plot);
.equals(BukkitUtil.adaptComplete(to)))) {
// returns false if the player is not allowed to enter the plot (if they are denied, for example)
// don't let the move event cancel the entry after teleport, but rather catch and cancel early (#4647)
if (!plotListener.plotEntry(pp, plot)) {
event.setCancelled(true);
}
} else { } else {
pp.sendMessage( pp.sendMessage(
TranslatableCaption.of("deny.no_enter"), TranslatableCaption.of("deny.no_enter"),
@@ -753,7 +730,7 @@ public class PlayerEventListener implements Listener {
if (now == null) { if (now == null) {
try (final MetaDataAccess<Boolean> kickAccess = try (final MetaDataAccess<Boolean> kickAccess =
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) { pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot, now, area) && this.tmpTeleport && !kickAccess.get().orElse( if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(
false)) { false)) {
pp.sendMessage( pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"), TranslatableCaption.of("permission.no_permission_event"),
@@ -847,7 +824,7 @@ public class PlayerEventListener implements Listener {
if (plot == null) { if (plot == null) {
try (final MetaDataAccess<Boolean> kickAccess = try (final MetaDataAccess<Boolean> kickAccess =
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) { pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot, null, area) && this.tmpTeleport && !kickAccess.get().orElse( if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(
false)) { false)) {
pp.sendMessage( pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"), TranslatableCaption.of("permission.no_permission_event"),
@@ -962,15 +939,12 @@ public class PlayerEventListener implements Listener {
builder.tag("plot_id", Tag.inserting(Component.text(id.toString()))); builder.tag("plot_id", Tag.inserting(Component.text(id.toString())));
builder.tag("sender", Tag.inserting(Component.text(sender))); builder.tag("sender", Tag.inserting(Component.text(sender)));
if (plotPlayer.hasPermission("plots.chat.color")) { if (plotPlayer.hasPermission("plots.chat.color")) {
builder.tag( builder.tag("msg", Tag.inserting(MiniMessage.miniMessage().deserialize(
"msg", Tag.inserting(MiniMessage.miniMessage().deserialize(
message, message,
TagResolver.resolver( TagResolver.resolver(StandardTags.color(), StandardTags.gradient(),
StandardTags.color(), StandardTags.gradient(),
StandardTags.rainbow(), StandardTags.decorations() StandardTags.rainbow(), StandardTags.decorations()
) )
)) )));
);
} else { } else {
builder.tag("msg", Tag.inserting(Component.text(message))); builder.tag("msg", Tag.inserting(Component.text(message)));
} }
@@ -1279,9 +1253,7 @@ public class PlayerEventListener implements Listener {
eventType = PlayerBlockEventType.INTERACT_BLOCK; eventType = PlayerBlockEventType.INTERACT_BLOCK;
blocktype1 = BukkitAdapter.asBlockType(block.getType()); blocktype1 = BukkitAdapter.asBlockType(block.getType());
if (INTERACTABLE_MATERIALS != null if (INTERACTABLE_MATERIALS != null ? INTERACTABLE_MATERIALS.contains(blockType.name()) : blockType.isInteractable()) {
? INTERACTABLE_MATERIALS.contains(blockType.name())
: blockType.isInteractable()) {
if (!player.isSneaking()) { if (!player.isSneaking()) {
break; break;
} }
@@ -1324,17 +1296,6 @@ public class PlayerEventListener implements Listener {
//Allow all players to eat while also allowing the block place event to be fired //Allow all players to eat while also allowing the block place event to be fired
return; return;
} }
// Process creature spawning of armor stands & end crystals here if spawned by the player in order to be able to
// reset the player's hand item if spawning needs to be cancelled.
if (type == Material.ARMOR_STAND || type == Material.END_CRYSTAL) {
Plot plot = location.getOwnedPlotAbs();
EntityType entityType = type == Material.ARMOR_STAND ? EntityType.ARMOR_STAND : END_CRYSTAL_ENTITY_TYPE;
if (BukkitEntityUtil.checkEntity(entityType, plot)) {
event.setCancelled(true);
break;
}
}
// Continue with normal place event checks
if (type == Material.ARMOR_STAND) { if (type == Material.ARMOR_STAND) {
location = BukkitUtil.adapt(block.getRelative(event.getBlockFace()).getLocation()); location = BukkitUtil.adapt(block.getRelative(event.getBlockFace()).getLocation());
eventType = PlayerBlockEventType.PLACE_MISC; eventType = PlayerBlockEventType.PLACE_MISC;
@@ -1409,7 +1370,22 @@ public class PlayerEventListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBucketEmpty(PlayerBucketEmptyEvent event) { public void onBucketEmpty(PlayerBucketEmptyEvent event) {
final Block block = event.getBlock(); BlockFace bf = event.getBlockFace();
// Note: a month after Bukkit 1.14.4 released, they added the API method
// PlayerBucketEmptyEvent#getBlock(), which returns the block the
// bucket contents is going to be placed at. Currently we determine this
// block ourselves to retain compatibility with 1.13.
final Block block;
// if the block can be waterlogged, the event might waterlog the block
// sometimes
if (event.getBlockClicked().getBlockData() instanceof Waterlogged waterlogged
&& !waterlogged.isWaterlogged() && event.getBucket() != Material.LAVA_BUCKET) {
block = event.getBlockClicked();
} else {
block = event.getBlockClicked().getLocation()
.add(bf.getModX(), bf.getModY(), bf.getModZ())
.getBlock();
}
Location location = BukkitUtil.adapt(block.getLocation()); Location location = BukkitUtil.adapt(block.getLocation());
PlotArea area = location.getPlotArea(); PlotArea area = location.getPlotArea();
if (area == null) { if (area == null) {
@@ -1417,16 +1393,6 @@ public class PlayerEventListener implements Listener {
} }
BukkitPlayer pp = BukkitUtil.adapt(event.getPlayer()); BukkitPlayer pp = BukkitUtil.adapt(event.getPlayer());
Plot plot = area.getPlot(location); Plot plot = area.getPlot(location);
final List<BlockTypeWrapper> use =
Optional.ofNullable(plot).map(p -> p.getFlag(UseFlag.class)).orElse(area.isRoadFlags() ?
area.getFlag(UseFlag.class) : Collections.emptyList());
BlockType type = BukkitAdapter.asBlockType(block.getType());
for (final BlockTypeWrapper blockTypeWrapper : use) {
if (blockTypeWrapper.accepts(BlockTypes.AIR) || blockTypeWrapper
.accepts(type)) {
return;
}
}
if (plot == null) { if (plot == null) {
if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) { if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
return; return;
@@ -1498,16 +1464,6 @@ public class PlayerEventListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
BukkitPlayer plotPlayer = BukkitUtil.adapt(player); BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
Plot plot = area.getPlot(location); Plot plot = area.getPlot(location);
final List<BlockTypeWrapper> use =
Optional.ofNullable(plot).map(p -> p.getFlag(UseFlag.class)).orElse(area.isRoadFlags() ?
area.getFlag(UseFlag.class) : Collections.emptyList());
BlockType type = BukkitAdapter.asBlockType(blockClicked.getType());
for (final BlockTypeWrapper blockTypeWrapper : use) {
if (blockTypeWrapper.accepts(BlockTypes.AIR) || blockTypeWrapper
.accepts(type)) {
return;
}
}
if (plot == null) { if (plot == null) {
if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) { if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
return; return;

View File

@@ -47,7 +47,6 @@ import org.bukkit.event.entity.LingeringPotionSplashEvent;
import org.bukkit.event.entity.PotionSplashEvent; import org.bukkit.event.entity.PotionSplashEvent;
import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.event.player.PlayerEggThrowEvent;
import org.bukkit.projectiles.BlockProjectileSource; import org.bukkit.projectiles.BlockProjectileSource;
import org.bukkit.projectiles.ProjectileSource; import org.bukkit.projectiles.ProjectileSource;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
@@ -158,26 +157,14 @@ public class ProjectileEventListener implements Listener {
@EventHandler @EventHandler
public void onProjectileHit(ProjectileHitEvent event) { public void onProjectileHit(ProjectileHitEvent event) {
if (cancelProjectileHit(event.getEntity())) { Projectile entity = event.getEntity();
event.setCancelled(true);
}
}
@EventHandler
public void onPlayerEggThrow(PlayerEggThrowEvent event) {
if (cancelProjectileHit(event.getEgg())) {
event.setHatching(false);
}
}
private boolean cancelProjectileHit(Projectile entity) {
Location location = BukkitUtil.adapt(entity.getLocation()); Location location = BukkitUtil.adapt(entity.getLocation());
if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) { if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) {
return false; return;
} }
PlotArea area = location.getPlotArea(); PlotArea area = location.getPlotArea();
if (area == null) { if (area == null) {
return false; return;
} }
Plot plot = area.getPlot(location); Plot plot = area.getPlot(location);
ProjectileSource shooter = entity.getShooter(); ProjectileSource shooter = entity.getShooter();
@@ -185,14 +172,15 @@ public class ProjectileEventListener implements Listener {
if (!((Player) shooter).isOnline()) { if (!((Player) shooter).isOnline()) {
if (plot != null) { if (plot != null) {
if (plot.isAdded(((Player) shooter).getUniqueId()) || plot.getFlag(ProjectilesFlag.class)) { if (plot.isAdded(((Player) shooter).getUniqueId()) || plot.getFlag(ProjectilesFlag.class)) {
return false; return;
} }
} else if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true)) { } else if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true)) {
return false; return;
} }
entity.remove(); entity.remove();
return true; event.setCancelled(true);
return;
} }
PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter); PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter);
@@ -201,36 +189,38 @@ public class ProjectileEventListener implements Listener {
Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED
)) { )) {
entity.remove(); entity.remove();
return true; event.setCancelled(true);
} }
return false; return;
} }
if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag( if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag(
ProjectilesFlag.class) || (entity instanceof FishHook && plot.getFlag( ProjectilesFlag.class) || (entity instanceof FishHook && plot.getFlag(
FishingFlag.class))) { FishingFlag.class))) {
return false; return;
} }
entity.remove(); entity.remove();
return true; event.setCancelled(true);
return;
} }
if (!(shooter instanceof Entity) && shooter != null) { if (!(shooter instanceof Entity) && shooter != null) {
if (plot == null) { if (plot == null) {
entity.remove(); entity.remove();
return true; event.setCancelled(true);
return;
} }
Location sLoc = Location sLoc =
BukkitUtil.adapt(((BlockProjectileSource) shooter).getBlock().getLocation()); BukkitUtil.adapt(((BlockProjectileSource) shooter).getBlock().getLocation());
if (!area.contains(sLoc.getX(), sLoc.getZ())) { if (!area.contains(sLoc.getX(), sLoc.getZ())) {
entity.remove(); entity.remove();
return true; event.setCancelled(true);
return;
} }
Plot sPlot = area.getOwnedPlotAbs(sLoc); Plot sPlot = area.getOwnedPlotAbs(sLoc);
if (sPlot == null || !PlotHandler.sameOwners(plot, sPlot)) { if (sPlot == null || !PlotHandler.sameOwners(plot, sPlot)) {
entity.remove(); entity.remove();
return true; event.setCancelled(true);
} }
} }
return false;
} }
} }

View File

@@ -44,7 +44,6 @@ import java.util.List;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer; import java.util.function.Consumer;
@@ -227,22 +226,16 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator {
loadingChunks.incrementAndGet(); loadingChunks.incrementAndGet();
PaperLib PaperLib
.getChunkAtAsync(this.bukkitWorld, chunk.getX(), chunk.getZ(), shouldGen, true) .getChunkAtAsync(this.bukkitWorld, chunk.getX(), chunk.getZ(), shouldGen, true)
.orTimeout(10L, TimeUnit.SECONDS) .completeOnTimeout(null, 10L, TimeUnit.SECONDS)
.whenComplete((chunkObject, throwable) -> { .whenComplete((chunkObject, throwable) -> {
loadingChunks.decrementAndGet(); loadingChunks.decrementAndGet();
if (throwable != null) { if (throwable != null) {
if (throwable instanceof TimeoutException) {
LOGGER.warn("Timed out awaiting chunk load {}", chunk);
this.requestedChunks.offer(chunk);
} else {
LOGGER.error("Failed to load chunk {}", chunk, throwable); LOGGER.error("Failed to load chunk {}", chunk, throwable);
// We want one less because this couldn't be processed // We want one less because this couldn't be processed
this.expectedSize.decrementAndGet(); this.expectedSize.decrementAndGet();
}
} else if (chunkObject == null) { } else if (chunkObject == null) {
if (shouldGen) { LOGGER.warn("Timed out awaiting chunk load {}", chunk);
LOGGER.error("Null chunk returned for chunk at {}", chunk); this.requestedChunks.offer(chunk);
}
} else if (PlotSquared.get().isMainThread(Thread.currentThread())) { } else if (PlotSquared.get().isMainThread(Thread.currentThread())) {
this.processChunk(chunkObject); this.processChunk(chunkObject);
} else { } else {

View File

@@ -354,17 +354,13 @@ public class BukkitEntityUtil {
} }
public static boolean checkEntity(Entity entity, Plot plot) { public static boolean checkEntity(Entity entity, Plot plot) {
return checkEntity(entity.getType(), plot);
}
public static boolean checkEntity(EntityType type, Plot plot) {
if (plot == null || !plot.hasOwner() || plot.getFlags().isEmpty() && plot.getArea() if (plot == null || !plot.hasOwner() || plot.getFlags().isEmpty() && plot.getArea()
.getFlagContainer().getFlagMap().isEmpty()) { .getFlagContainer().getFlagMap().isEmpty()) {
return false; return false;
} }
final com.sk89q.worldedit.world.entity.EntityType entityType = final com.sk89q.worldedit.world.entity.EntityType entityType =
BukkitAdapter.adapt(type); BukkitAdapter.adapt(entity.getType());
if (EntityCategories.PLAYER.contains(entityType)) { if (EntityCategories.PLAYER.contains(entityType)) {
return false; return false;

View File

@@ -67,8 +67,8 @@ tasks {
withType<Javadoc> { withType<Javadoc> {
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString() val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
val opt = options as StandardJavadocDocletOptions val opt = options as StandardJavadocDocletOptions
// opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString()) opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString())
// opt.links("https://jd.advntr.dev/api/" + libs.adventureApi.get().versionConstraint.toString()) opt.links("https://jd.advntr.dev/api/" + libs.adventureApi.get().versionConstraint.toString())
opt.links("https://jd.advntr.dev/text-minimessage/" + libs.adventureApi.get().versionConstraint.toString()) opt.links("https://jd.advntr.dev/text-minimessage/" + libs.adventureApi.get().versionConstraint.toString())
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/") opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
opt.links("https://checkerframework.org/api/") opt.links("https://checkerframework.org/api/")

View File

@@ -120,14 +120,6 @@ public interface PlotPlatform<P> extends LocaleHolder {
*/ */
@NonNull String serverImplementation(); @NonNull String serverImplementation();
/**
* Gets the server brand name
*
* @return server brand
* @since 7.5.3
*/
@NonNull String serverBrand();
/** /**
* Gets the native server code package prefix. * Gets the native server code package prefix.
* *

View File

@@ -713,8 +713,6 @@ public class PlotSquared {
case CREATION_DATE_TIMESTAMP -> toReturn.addAll(sortPlotsByTimestamp(map.get(area))); case CREATION_DATE_TIMESTAMP -> toReturn.addAll(sortPlotsByTimestamp(map.get(area)));
case DISTANCE_FROM_ORIGIN -> toReturn.addAll(sortPlotsByHash(map.get(area))); case DISTANCE_FROM_ORIGIN -> toReturn.addAll(sortPlotsByHash(map.get(area)));
case LAST_MODIFIED -> toReturn.addAll(sortPlotsByModified(map.get(area))); case LAST_MODIFIED -> toReturn.addAll(sortPlotsByModified(map.get(area)));
default -> {
}
} }
} }
return toReturn; return toReturn;

View File

@@ -18,8 +18,6 @@
*/ */
package com.plotsquared.core.backup; package com.plotsquared.core.backup;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
import java.io.IOException; import java.io.IOException;
@@ -32,14 +30,12 @@ import java.nio.file.Path;
*/ */
public class Backup { public class Backup {
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + Backup.class.getSimpleName());
private final BackupProfile owner; private final BackupProfile owner;
private final long creationTime; private final long creationTime;
@Nullable @Nullable
private final Path file; private final Path file;
Backup(final BackupProfile owner, final long creationTime, @Nullable final Path file) { Backup(final BackupProfile owner, final long creationTime, final Path file) {
this.owner = owner; this.owner = owner;
this.creationTime = creationTime; this.creationTime = creationTime;
this.file = file; this.file = file;
@@ -53,7 +49,7 @@ public class Backup {
try { try {
Files.deleteIfExists(file); Files.deleteIfExists(file);
} catch (final IOException e) { } catch (final IOException e) {
LOGGER.error("Error deleting backup at {}", file, e); e.printStackTrace();
} }
} }
} }

View File

@@ -21,15 +21,14 @@ package com.plotsquared.core.backup;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.Assisted;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.exception.PlotSquaredException; import com.plotsquared.core.player.ConsolePlayer;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.schematic.Schematic; import com.plotsquared.core.plot.schematic.Schematic;
import com.plotsquared.core.util.SchematicHandler; import com.plotsquared.core.util.SchematicHandler;
import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.RunnableVal;
import com.plotsquared.core.util.task.TaskManager; import com.plotsquared.core.util.task.TaskManager;
import org.apache.logging.log4j.LogManager; import net.kyori.adventure.text.minimessage.MiniMessage;
import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@@ -52,7 +51,7 @@ import java.util.concurrent.CompletableFuture;
*/ */
public class PlayerBackupProfile implements BackupProfile { public class PlayerBackupProfile implements BackupProfile {
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + PlayerBackupProfile.class.getSimpleName()); static final MiniMessage MINI_MESSAGE = MiniMessage.builder().build();
private final UUID owner; private final UUID owner;
private final Plot plot; private final Plot plot;
@@ -88,7 +87,7 @@ public class PlayerBackupProfile implements BackupProfile {
Files.createDirectory(path); Files.createDirectory(path);
} }
} catch (final Exception e) { } catch (final Exception e) {
LOGGER.error("Error resolving {} from {}", child, parent, e); e.printStackTrace();
} }
return path; return path;
} }
@@ -105,7 +104,7 @@ public class PlayerBackupProfile implements BackupProfile {
try { try {
Files.createDirectories(path); Files.createDirectories(path);
} catch (IOException e) { } catch (IOException e) {
LOGGER.error("Error creating directory {}", path, e); e.printStackTrace();
return Collections.emptyList(); return Collections.emptyList();
} }
} }
@@ -118,11 +117,11 @@ public class PlayerBackupProfile implements BackupProfile {
backups.add( backups.add(
new Backup(this, basicFileAttributes.creationTime().toMillis(), file)); new Backup(this, basicFileAttributes.creationTime().toMillis(), file));
} catch (IOException e) { } catch (IOException e) {
LOGGER.error("Error getting attributes for file {} to create backup", file, e); e.printStackTrace();
} }
}); });
} catch (IOException e) { } catch (IOException e) {
LOGGER.error("Error walking files from {}", path, e); e.printStackTrace();
} }
backups.sort(Comparator.comparingLong(Backup::getCreationTime).reversed()); backups.sort(Comparator.comparingLong(Backup::getCreationTime).reversed());
return (this.backupCache = backups); return (this.backupCache = backups);
@@ -134,7 +133,7 @@ public class PlayerBackupProfile implements BackupProfile {
public void destroy() { public void destroy() {
this.listBackups().whenCompleteAsync((backups, error) -> { this.listBackups().whenCompleteAsync((backups, error) -> {
if (error != null) { if (error != null) {
LOGGER.error("Error while listing backups", error); error.printStackTrace();
} }
backups.forEach(Backup::delete); backups.forEach(Backup::delete);
this.backupCache = null; this.backupCache = null;
@@ -142,12 +141,10 @@ public class PlayerBackupProfile implements BackupProfile {
} }
public @NonNull Path getBackupDirectory() { public @NonNull Path getBackupDirectory() {
return resolve( return resolve(resolve(
resolve(
resolve(backupManager.getBackupPath(), Objects.requireNonNull(plot.getArea().toString(), "plot area id")), resolve(backupManager.getBackupPath(), Objects.requireNonNull(plot.getArea().toString(), "plot area id")),
Objects.requireNonNull(plot.getId().toDashSeparatedString(), "plot id") Objects.requireNonNull(plot.getId().toDashSeparatedString(), "plot id")
), Objects.requireNonNull(owner.toString(), "owner") ), Objects.requireNonNull(owner.toString(), "owner"));
);
} }
@Override @Override
@@ -159,8 +156,7 @@ public class PlayerBackupProfile implements BackupProfile {
backups.get(backups.size() - 1).delete(); backups.get(backups.size() - 1).delete();
} }
final List<Plot> plots = Collections.singletonList(plot); final List<Plot> plots = Collections.singletonList(plot);
final boolean result = this.schematicHandler.exportAll( final boolean result = this.schematicHandler.exportAll(plots, getBackupDirectory().toFile(),
plots, getBackupDirectory().toFile(),
"%world%-%id%-" + System.currentTimeMillis(), () -> "%world%-%id%-" + System.currentTimeMillis(), () ->
future.complete(new Backup(this, System.currentTimeMillis(), null)) future.complete(new Backup(this, System.currentTimeMillis(), null))
); );
@@ -184,7 +180,7 @@ public class PlayerBackupProfile implements BackupProfile {
try { try {
schematic = this.schematicHandler.getSchematic(backup.getFile().toFile()); schematic = this.schematicHandler.getSchematic(backup.getFile().toFile());
} catch (SchematicHandler.UnsupportedFormatException e) { } catch (SchematicHandler.UnsupportedFormatException e) {
LOGGER.error("Unsupported format for backup {}", backup.getFile(), e); e.printStackTrace();
} }
if (schematic == null) { if (schematic == null) {
future.completeExceptionally(new IllegalArgumentException( future.completeExceptionally(new IllegalArgumentException(
@@ -204,9 +200,10 @@ public class PlayerBackupProfile implements BackupProfile {
if (value) { if (value) {
future.complete(null); future.complete(null);
} else { } else {
future.completeExceptionally(new PlotSquaredException( future.completeExceptionally(new RuntimeException(MINI_MESSAGE.escapeTags(
TranslatableCaption TranslatableCaption
.of("schematics.schematic_paste_failed"))); .of("schematics.schematic_paste_failed")
.getComponent(ConsolePlayer.getConsole()))));
} }
} }
} }

View File

@@ -32,8 +32,6 @@ import com.plotsquared.core.util.task.TaskManager;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag; import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@@ -49,7 +47,6 @@ import java.util.concurrent.TimeUnit;
@Singleton @Singleton
public class SimpleBackupManager implements BackupManager { public class SimpleBackupManager implements BackupManager {
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + SimpleBackupManager.class.getSimpleName());
private final Path backupPath; private final Path backupPath;
private final boolean automaticBackup; private final boolean automaticBackup;
private final int backupLimit; private final int backupLimit;
@@ -115,12 +112,7 @@ public class SimpleBackupManager implements BackupManager {
TagResolver.resolver("reason", Tag.inserting(Component.text(throwable.getMessage()))) TagResolver.resolver("reason", Tag.inserting(Component.text(throwable.getMessage())))
); );
} }
LOGGER.error( throwable.printStackTrace();
"Error creating backup for plot {};{} and player {}",
plot.getArea(),
plot.getId(),
player == null ? "null" : player.getName(), throwable
);
} else { } else {
if (player != null) { if (player != null) {
player.sendMessage(TranslatableCaption.of("backups.backup_automatic_finished")); player.sendMessage(TranslatableCaption.of("backups.backup_automatic_finished"));
@@ -136,7 +128,6 @@ public class SimpleBackupManager implements BackupManager {
return this.automaticBackup; return this.automaticBackup;
} }
@NonNull
public Path getBackupPath() { public Path getBackupPath() {
return this.backupPath; return this.backupPath;
} }

View File

@@ -23,8 +23,6 @@ import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.database.DBFunc;
import com.plotsquared.core.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
@@ -153,21 +151,8 @@ public class Add extends Command {
return; return;
} }
// Success // Success
confirm.run( confirm.run(this, () -> {
this, () -> {
for (UUID uuid : uuids) { for (UUID uuid : uuids) {
if (this.eventDispatcher.callPlayerAdd(
player,
plot,
uuid,
PlayerPlotAddRemoveEvent.Reason.COMMAND
).getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Add")))
);
continue;
}
if (uuid != DBFunc.EVERYONE) { if (uuid != DBFunc.EVERYONE) {
if (!plot.removeTrusted(uuid)) { if (!plot.removeTrusted(uuid)) {
if (plot.getDenied().contains(uuid)) { if (plot.getDenied().contains(uuid)) {
@@ -177,17 +162,9 @@ public class Add extends Command {
} }
plot.addMember(uuid); plot.addMember(uuid);
this.eventDispatcher.callMember(player, plot, uuid, true); this.eventDispatcher.callMember(player, plot, uuid, true);
this.eventDispatcher.callPostAdded(
player,
plot,
uuid,
false,
PlayerPlotAddRemoveEvent.Reason.COMMAND
);
player.sendMessage(TranslatableCaption.of("member.member_added")); player.sendMessage(TranslatableCaption.of("member.member_added"));
} }
}, null }, null);
);
} catch (final Throwable exception) { } catch (final Throwable exception) {
future.completeExceptionally(exception); future.completeExceptionally(exception);
return; return;

View File

@@ -21,6 +21,7 @@ package com.plotsquared.core.command;
import com.plotsquared.core.PlotSquared; import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
@@ -57,7 +58,8 @@ public class Alias extends SubCommand {
return false; return false;
} }
Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
Plot plot = location.getPlotAbs();
if (plot == null) { if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;

View File

@@ -24,7 +24,6 @@ import com.plotsquared.core.backup.BackupProfile;
import com.plotsquared.core.backup.NullBackupProfile; import com.plotsquared.core.backup.NullBackupProfile;
import com.plotsquared.core.backup.PlayerBackupProfile; import com.plotsquared.core.backup.PlayerBackupProfile;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.exception.PlotSquaredException;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
@@ -33,8 +32,6 @@ import com.plotsquared.core.util.task.RunnableVal3;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag; import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import java.nio.file.Files; import java.nio.file.Files;
@@ -60,8 +57,6 @@ import java.util.stream.Stream;
permission = "plots.backup") permission = "plots.backup")
public final class Backup extends Command { public final class Backup extends Command {
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + Backup.class.getSimpleName());
private final BackupManager backupManager; private final BackupManager backupManager;
@Inject @Inject
@@ -331,28 +326,19 @@ public final class Backup extends Command {
if (backupProfile instanceof NullBackupProfile) { if (backupProfile instanceof NullBackupProfile) {
player.sendMessage( player.sendMessage(
TranslatableCaption.of("backups.backup_impossible"), TranslatableCaption.of("backups.backup_impossible"),
TagResolver.resolver( TagResolver.resolver("plot", Tag.inserting(
"plot", Tag.inserting(
TranslatableCaption.of("generic.generic_other").toComponent(player) TranslatableCaption.of("generic.generic_other").toComponent(player)
) ))
)
); );
} else { } else {
backupProfile.listBackups().whenComplete((backups, throwable) -> { backupProfile.listBackups().whenComplete((backups, throwable) -> {
if (throwable != null) { if (throwable != null) {
Component reason;
if (throwable instanceof PlotSquaredException pe) {
reason = pe.getCaption().toComponent(player);
} else {
reason = Component.text(throwable.getMessage());
}
player.sendMessage( player.sendMessage(
TranslatableCaption.of("backups.backup_load_failure"), TranslatableCaption.of("backups.backup_load_failure"),
TagResolver.resolver("reason", Tag.inserting(reason)) TagResolver.resolver("reason", Tag.inserting(Component.text(throwable.getMessage())))
); );
LOGGER.error("Error loading player ({}) backup", player.getName(), throwable); throwable.printStackTrace();
return; } else {
}
if (number < 1 || number > backups.size()) { if (number < 1 || number > backups.size()) {
player.sendMessage( player.sendMessage(
TranslatableCaption.of("backups.backup_impossible"), TranslatableCaption.of("backups.backup_impossible"),
@@ -378,8 +364,7 @@ public final class Backup extends Command {
) )
); );
} else { } else {
CmdConfirm.addPending( CmdConfirm.addPending(player, "/plot backup load " + number,
player, "/plot backup load " + number,
() -> backupProfile.restoreBackup(backup, player) () -> backupProfile.restoreBackup(backup, player)
.whenComplete((n, error) -> { .whenComplete((n, error) -> {
if (error != null) { if (error != null) {
@@ -397,6 +382,7 @@ public final class Backup extends Command {
); );
} }
} }
}
}); });
} }
} }

View File

@@ -20,7 +20,6 @@ package com.plotsquared.core.command;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.plotsquared.core.PlotSquared; import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.events.PlayerBuyPlotEvent; import com.plotsquared.core.events.PlayerBuyPlotEvent;
import com.plotsquared.core.events.Result; import com.plotsquared.core.events.Result;
@@ -85,9 +84,8 @@ public class Buy extends Command {
checkTrue(plot.hasOwner(), TranslatableCaption.of("info.plot_unowned")); checkTrue(plot.hasOwner(), TranslatableCaption.of("info.plot_unowned"));
checkTrue(!plot.isOwner(player.getUUID()), TranslatableCaption.of("economy.cannot_buy_own")); checkTrue(!plot.isOwner(player.getUUID()), TranslatableCaption.of("economy.cannot_buy_own"));
Set<Plot> plots = plot.getConnectedPlots(); Set<Plot> plots = plot.getConnectedPlots();
int plotCount = Settings.Limit.GLOBAL ? player.getPlotCount() : player.getPlotCount(plot.getWorldName());
checkTrue( checkTrue(
plotCount + plots.size() <= player.getAllowedPlots(), player.getPlotCount() + plots.size() <= player.getAllowedPlots(),
TranslatableCaption.of("permission.cant_claim_more_plots"), TranslatableCaption.of("permission.cant_claim_more_plots"),
TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots()))) TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))
); );
@@ -146,7 +144,6 @@ public class Buy extends Command {
plot.getPlotModificationManager().setSign(player.getName()); plot.getPlotModificationManager().setSign(player.getName());
player.sendMessage( player.sendMessage(
TranslatableCaption.of("working.claimed"), TranslatableCaption.of("working.claimed"),
TagResolver.resolver("world", Tag.inserting(Component.text(plot.getArea().getWorldName()))),
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
); );
this.eventDispatcher.callPostPlayerBuyPlot(player, previousOwner, plot, price); this.eventDispatcher.callPostPlayerBuyPlot(player, previousOwner, plot, price);

View File

@@ -26,6 +26,7 @@ import com.plotsquared.core.events.PlayerClaimPlotEvent;
import com.plotsquared.core.events.PlotMergeEvent; import com.plotsquared.core.events.PlotMergeEvent;
import com.plotsquared.core.events.Result; import com.plotsquared.core.events.Result;
import com.plotsquared.core.location.Direction; import com.plotsquared.core.location.Direction;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.MetaDataAccess; import com.plotsquared.core.player.MetaDataAccess;
import com.plotsquared.core.player.PlayerMetaDataKeys; import com.plotsquared.core.player.PlayerMetaDataKeys;
@@ -71,7 +72,8 @@ public class Claim extends SubCommand {
if (args.length >= 1) { if (args.length >= 1) {
schematic = args[0]; schematic = args[0];
} }
Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
Plot plot = location.getPlotAbs();
if (plot == null) { if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;
@@ -88,7 +90,7 @@ public class Claim extends SubCommand {
boolean force = event.getEventResult() == Result.FORCE; boolean force = event.getEventResult() == Result.FORCE;
int currentPlots = Settings.Limit.GLOBAL ? int currentPlots = Settings.Limit.GLOBAL ?
player.getPlotCount() : player.getPlotCount() :
player.getPlotCount(plot.getWorldName()); player.getPlotCount(location.getWorldName());
final PlotArea area = plot.getArea(); final PlotArea area = plot.getArea();

View File

@@ -131,7 +131,6 @@ public class Clear extends Command {
player.sendMessage( player.sendMessage(
TranslatableCaption.of("working.clearing_done"), TranslatableCaption.of("working.clearing_done"),
TagResolver.builder() TagResolver.builder()
.tag("world", Tag.inserting(Component.text(plot.getArea().getWorldName())))
.tag("amount", Tag.inserting(Component.text(System.currentTimeMillis() - start))) .tag("amount", Tag.inserting(Component.text(System.currentTimeMillis() - start)))
.tag("plot", Tag.inserting(Component.text(plot.getId().toString()))) .tag("plot", Tag.inserting(Component.text(plot.getId().toString())))
.build() .build()

View File

@@ -24,7 +24,6 @@ import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -99,14 +98,6 @@ public enum CommandCategory implements Caption {
return MiniMessage.miniMessage().deserialize(getComponent(localeHolder)); return MiniMessage.miniMessage().deserialize(getComponent(localeHolder));
} }
@Override
public @NonNull Component toComponent(
@NonNull final LocaleHolder localeHolder,
final @NonNull TagResolver @NonNull ... tagResolvers
) {
return MiniMessage.miniMessage().deserialize(getComponent(localeHolder));
}
/** /**
* Checks if a player has access to this command category * Checks if a player has access to this command category
* *

View File

@@ -68,8 +68,8 @@ public class Continue extends SubCommand {
return false; return false;
} }
int size = plot.getConnectedPlots().size(); int size = plot.getConnectedPlots().size();
int plotCount = Settings.Limit.GLOBAL ? player.getPlotCount() : player.getPlotCount(plot.getWorldName()); if (!Settings.Done.COUNTS_TOWARDS_LIMIT && (player.getAllowedPlots()
if (!Settings.Done.COUNTS_TOWARDS_LIMIT && (player.getAllowedPlots() < plotCount + size)) { < player.getPlotCount() + size)) {
player.sendMessage( player.sendMessage(
TranslatableCaption.of("permission.cant_claim_more_plots"), TranslatableCaption.of("permission.cant_claim_more_plots"),
TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots()))) TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))

View File

@@ -19,6 +19,7 @@
package com.plotsquared.core.command; package com.plotsquared.core.command;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
@@ -36,7 +37,8 @@ public class Copy extends SubCommand {
@Override @Override
public boolean onCommand(final PlotPlayer<?> player, String[] args) { public boolean onCommand(final PlotPlayer<?> player, String[] args) {
Plot plot1 = player.getCurrentPlot(); Location location = player.getLocation();
Plot plot1 = location.getPlotAbs();
if (plot1 == null) { if (plot1 == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;

View File

@@ -22,6 +22,7 @@ import com.google.inject.Inject;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.generator.HybridPlotWorld; import com.plotsquared.core.generator.HybridPlotWorld;
import com.plotsquared.core.generator.HybridUtils; import com.plotsquared.core.generator.HybridUtils;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@@ -46,7 +47,8 @@ public class CreateRoadSchematic extends SubCommand {
@Override @Override
public boolean onCommand(PlotPlayer<?> player, String[] args) { public boolean onCommand(PlotPlayer<?> player, String[] args) {
Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
Plot plot = location.getPlotAbs();
if (plot == null) { if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;
@@ -55,7 +57,7 @@ public class CreateRoadSchematic extends SubCommand {
player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large")); player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large"));
return false; return false;
} }
if (!(plot.getArea() instanceof HybridPlotWorld)) { if (!(location.getPlotArea() instanceof HybridPlotWorld)) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
} }
this.hybridUtils.setupRoadSchematic(plot); this.hybridUtils.setupRoadSchematic(plot);

View File

@@ -86,8 +86,7 @@ public class DebugPaste extends SubCommand {
b.append("# WorldEdit implementation:\n"); b.append("# WorldEdit implementation:\n");
b.append(PlotSquared.platform().worldEditImplementations()).append("\n\n"); b.append(PlotSquared.platform().worldEditImplementations()).append("\n\n");
b.append("# Server Information\n"); b.append("# Server Information\n");
b.append("Server Version: ").append(PlotSquared.platform().serverBrand()).append(": ") b.append("Server Version: ").append(PlotSquared.platform().serverImplementation())
.append(PlotSquared.platform().serverImplementation()).append("\n")
.append("\n"); .append("\n");
b.append("online_mode: ").append(!Settings.UUID.OFFLINE).append(';') b.append("online_mode: ").append(!Settings.UUID.OFFLINE).append(';')
.append(!Settings.UUID.OFFLINE).append('\n'); .append(!Settings.UUID.OFFLINE).append('\n');

View File

@@ -22,6 +22,7 @@ import com.google.inject.Inject;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.generator.HybridPlotManager; import com.plotsquared.core.generator.HybridPlotManager;
import com.plotsquared.core.generator.HybridUtils; import com.plotsquared.core.generator.HybridUtils;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotArea;
@@ -56,7 +57,8 @@ public class DebugRoadRegen extends SubCommand {
@Override @Override
public boolean onCommand(PlotPlayer<?> player, String[] args) { public boolean onCommand(PlotPlayer<?> player, String[] args) {
Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
Plot plot = location.getPlotAbs();
if (args.length < 1) { if (args.length < 1) {
player.sendMessage( player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"), TranslatableCaption.of("commandconfig.command_syntax"),
@@ -90,7 +92,8 @@ public class DebugRoadRegen extends SubCommand {
} }
public boolean regenPlot(PlotPlayer<?> player) { public boolean regenPlot(PlotPlayer<?> player) {
PlotArea area = player.getContextualPlotArea(); Location location = player.getLocation();
PlotArea area = location.getPlotArea();
if (area == null) { if (area == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
return false; return false;
@@ -145,10 +148,10 @@ public class DebugRoadRegen extends SubCommand {
return false; return false;
} }
PlotArea area = player.getContextualPlotArea(); Location location = player.getLocation();
PlotArea area = location.getPlotArea();
if (area == null) { if (area == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
return false;
} }
Plot plot = player.getCurrentPlot(); Plot plot = player.getCurrentPlot();
PlotManager manager = area.getPlotManager(); PlotManager manager = area.getPlotManager();

View File

@@ -23,6 +23,7 @@ import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.events.Result; import com.plotsquared.core.events.Result;
import com.plotsquared.core.events.TeleportCause; import com.plotsquared.core.events.TeleportCause;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
@@ -60,7 +61,8 @@ public class Delete extends SubCommand {
@Override @Override
public boolean onCommand(final PlotPlayer<?> player, String[] args) { public boolean onCommand(final PlotPlayer<?> player, String[] args) {
final Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
final Plot plot = location.getPlotAbs();
if (plot == null) { if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;
@@ -90,7 +92,7 @@ public class Delete extends SubCommand {
final java.util.Set<Plot> plots = plot.getConnectedPlots(); final java.util.Set<Plot> plots = plot.getConnectedPlots();
final int currentPlots = Settings.Limit.GLOBAL ? final int currentPlots = Settings.Limit.GLOBAL ?
player.getPlotCount() : player.getPlotCount() :
player.getPlotCount(plot.getWorldName()); player.getPlotCount(location.getWorldName());
Runnable run = () -> { Runnable run = () -> {
if (plot.getRunning() > 0) { if (plot.getRunning() > 0) {
player.sendMessage(TranslatableCaption.of("errors.wait_for_timer")); player.sendMessage(TranslatableCaption.of("errors.wait_for_timer"));
@@ -122,7 +124,6 @@ public class Delete extends SubCommand {
"amount", "amount",
Tag.inserting(Component.text(String.valueOf(System.currentTimeMillis() - start))) Tag.inserting(Component.text(String.valueOf(System.currentTimeMillis() - start)))
), ),
TagResolver.resolver("world", Tag.inserting(Component.text(plotArea.getWorldName()))),
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
); );
eventDispatcher.callPostDelete(plot); eventDispatcher.callPostDelete(plot);

View File

@@ -23,8 +23,6 @@ import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.database.DBFunc;
import com.plotsquared.core.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.events.TeleportCause; import com.plotsquared.core.events.TeleportCause;
import com.plotsquared.core.location.Location; import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
@@ -72,7 +70,8 @@ public class Deny extends SubCommand {
@Override @Override
public boolean onCommand(PlotPlayer<?> player, String[] args) { public boolean onCommand(PlotPlayer<?> player, String[] args) {
final Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
final Plot plot = location.getPlotAbs();
if (plot == null) { if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;
@@ -126,29 +125,21 @@ public class Deny extends SubCommand {
); );
return; return;
} else { } else {
if (this.eventDispatcher
.callPlayerDeny(player, plot, uuid, PlayerPlotAddRemoveEvent.Reason.COMMAND)
.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Deny")))
);
continue;
}
if (uuid != DBFunc.EVERYONE) { if (uuid != DBFunc.EVERYONE) {
plot.removeMember(uuid); plot.removeMember(uuid);
plot.removeTrusted(uuid); plot.removeTrusted(uuid);
} }
plot.addDenied(uuid); plot.addDenied(uuid);
this.eventDispatcher.callDenied(player, plot, uuid, true); this.eventDispatcher.callDenied(player, plot, uuid, true);
this.eventDispatcher.callPostDenied(player, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.COMMAND);
if (!uuid.equals(DBFunc.EVERYONE)) { if (!uuid.equals(DBFunc.EVERYONE)) {
handleKick(PlotSquared.platform().playerManager().getPlayerIfExists(uuid), plot); handleKick(PlotSquared.platform().playerManager().getPlayerIfExists(uuid), plot);
} else { } else {
for (PlotPlayer<?> plotPlayer : plot.getPlayersInPlot()) { for (PlotPlayer<?> plotPlayer : plot.getPlayersInPlot()) {
if (plot.isDenied(plotPlayer.getUUID())) { // Ignore plot-owners
handleKick(plotPlayer, plot); if (plot.isAdded(plotPlayer.getUUID())) {
continue;
} }
handleKick(plotPlayer, plot);
} }
} }
} }

View File

@@ -26,6 +26,7 @@ import com.plotsquared.core.events.PlotDoneEvent;
import com.plotsquared.core.events.PlotFlagAddEvent; import com.plotsquared.core.events.PlotFlagAddEvent;
import com.plotsquared.core.events.Result; import com.plotsquared.core.events.Result;
import com.plotsquared.core.generator.HybridUtils; import com.plotsquared.core.generator.HybridUtils;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
@@ -60,7 +61,8 @@ public class Done extends SubCommand {
@Override @Override
public boolean onCommand(final PlotPlayer<?> player, String[] args) { public boolean onCommand(final PlotPlayer<?> player, String[] args) {
final Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
final Plot plot = location.getPlotAbs();
if ((plot == null) || !plot.hasOwner()) { if ((plot == null) || !plot.hasOwner()) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;

View File

@@ -73,7 +73,7 @@ public class Download extends SubCommand {
@Override @Override
public boolean onCommand(final PlotPlayer<?> player, String[] args) { public boolean onCommand(final PlotPlayer<?> player, String[] args) {
String world = player.getCurrentPlot().getWorldName(); String world = player.getLocation().getWorldName();
if (!this.plotAreaManager.hasPlotArea(world)) { if (!this.plotAreaManager.hasPlotArea(world)) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
return false; return false;

View File

@@ -27,6 +27,7 @@ import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.events.PlotFlagAddEvent; import com.plotsquared.core.events.PlotFlagAddEvent;
import com.plotsquared.core.events.PlotFlagRemoveEvent; import com.plotsquared.core.events.PlotFlagRemoveEvent;
import com.plotsquared.core.events.Result; import com.plotsquared.core.events.Result;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
@@ -178,7 +179,8 @@ public final class FlagCommand extends Command {
* @return {@code true} if the player is allowed to modify the flags at their current location * @return {@code true} if the player is allowed to modify the flags at their current location
*/ */
private static boolean checkRequirements(final @NonNull PlotPlayer<?> player) { private static boolean checkRequirements(final @NonNull PlotPlayer<?> player) {
final Plot plot = player.getCurrentPlot(); final Location location = player.getLocation();
final Plot plot = location.getPlotAbs();
if (plot == null) { if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;
@@ -342,7 +344,7 @@ public final class FlagCommand extends Command {
if (plotFlag == null) { if (plotFlag == null) {
return; return;
} }
Plot plot = player.getCurrentPlot(); Plot plot = player.getLocation().getPlotAbs();
PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, plot); PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, plot);
if (event.getEventResult() == Result.DENY) { if (event.getEventResult() == Result.DENY) {
player.sendMessage( player.sendMessage(
@@ -407,7 +409,7 @@ public final class FlagCommand extends Command {
if (plotFlag == null) { if (plotFlag == null) {
return; return;
} }
Plot plot = player.getCurrentPlot(); Plot plot = player.getLocation().getPlotAbs();
PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, plot); PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, plot);
if (event.getEventResult() == Result.DENY) { if (event.getEventResult() == Result.DENY) {
player.sendMessage( player.sendMessage(
@@ -417,7 +419,7 @@ public final class FlagCommand extends Command {
return; return;
} }
boolean force = event.getEventResult() == Result.FORCE; boolean force = event.getEventResult() == Result.FORCE;
final PlotFlag localFlag = player.getCurrentPlot().getFlagContainer() final PlotFlag localFlag = player.getLocation().getPlotAbs().getFlagContainer()
.getFlag(event.getFlag().getClass()); .getFlag(event.getFlag().getClass());
if (!force) { if (!force) {
for (String entry : args[1].split(",")) { for (String entry : args[1].split(",")) {
@@ -442,7 +444,7 @@ public final class FlagCommand extends Command {
return; return;
} }
boolean result = boolean result =
player.getCurrentPlot().setFlag(localFlag.merge(parsed.getValue())); player.getLocation().getPlotAbs().setFlag(localFlag.merge(parsed.getValue()));
if (!result) { if (!result) {
player.sendMessage(TranslatableCaption.of("flag.flag_not_added")); player.sendMessage(TranslatableCaption.of("flag.flag_not_added"));
return; return;
@@ -482,7 +484,7 @@ public final class FlagCommand extends Command {
if (flag == null) { if (flag == null) {
return; return;
} }
final Plot plot = player.getCurrentPlot(); final Plot plot = player.getLocation().getPlotAbs();
final PlotFlag<?, ?> flagWithOldValue = plot.getFlagContainer().getFlag(flag.getClass()); final PlotFlag<?, ?> flagWithOldValue = plot.getFlagContainer().getFlag(flag.getClass());
PlotFlagRemoveEvent event = eventDispatcher.callFlagRemove(flag, plot); PlotFlagRemoveEvent event = eventDispatcher.callFlagRemove(flag, plot);
if (event.getEventResult() == Result.DENY) { if (event.getEventResult() == Result.DENY) {
@@ -685,7 +687,7 @@ public final class FlagCommand extends Command {
.build() .build()
); );
// Default value // Default value
final String defaultValue = player.getCurrentPlot().getArea().getFlagContainer() final String defaultValue = player.getLocation().getPlotArea().getFlagContainer()
.getFlagErased(plotFlag.getClass()).toString(); .getFlagErased(plotFlag.getClass()).toString();
player.sendMessage( player.sendMessage(
TranslatableCaption.of("flag.flag_info_default_value"), TranslatableCaption.of("flag.flag_info_default_value"),

View File

@@ -101,10 +101,6 @@ public class Grant extends Command {
); );
} else { } else {
access.set(access.get().orElse(0) + 1); access.set(access.get().orElse(0) + 1);
player.sendMessage(
TranslatableCaption.of("grants.added"),
TagResolver.resolver("grants", Tag.inserting(Component.text(access.get().orElse(0))))
);
} }
} }
} else { } else {
@@ -177,14 +173,8 @@ public class Grant extends Command {
commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} else if (args.length == 2) {
final String subcommand = args[0].toLowerCase();
if ((subcommand.equals("add") && player.hasPermission(Permission.PERMISSION_GRANT_ADD)) ||
(subcommand.equals("check") && player.hasPermission(Permission.PERMISSION_GRANT_CHECK))) {
return TabCompletions.completePlayers(player, args[1], Collections.emptyList());
} }
} return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
return Collections.emptyList();
} }
} }

View File

@@ -113,34 +113,38 @@ public class Help extends Command {
} }
if (cat == null && page == 0) { if (cat == null && page == 0) {
TextComponent.Builder builder = Component.text(); TextComponent.Builder builder = Component.text();
builder.append(TranslatableCaption.of("help.help_header").toComponent(player)); builder.append(MINI_MESSAGE.deserialize(TranslatableCaption.of("help.help_header").getComponent(player)));
for (CommandCategory c : CommandCategory.values()) { for (CommandCategory c : CommandCategory.values()) {
if (!c.canAccess(player)) { if (!c.canAccess(player)) {
continue; continue;
} }
builder.append(Component.newline()); builder.append(Component.newline()).append(MINI_MESSAGE
builder.append(TranslatableCaption.of("help.help_info_item").toComponent( .deserialize(
player, TagResolver.builder() TranslatableCaption.of("help.help_info_item").getComponent(player),
TagResolver.builder()
.tag("command", Tag.inserting(Component.text("/plot help"))) .tag("command", Tag.inserting(Component.text("/plot help")))
.tag("category", Tag.inserting(Component.text(c.name().toLowerCase()))) .tag("category", Tag.inserting(Component.text(c.name().toLowerCase())))
.tag("category_desc", Tag.inserting(c.toComponent(player))) .tag("category_desc", Tag.inserting(c.toComponent(player)))
.build() .build()
)); ));
} }
builder.append(Component.newline()); builder.append(Component.newline()).append(MINI_MESSAGE
builder.append(TranslatableCaption.of("help.help_info_item").toComponent( .deserialize(
player, TagResolver.builder() TranslatableCaption.of("help.help_info_item").getComponent(player),
TagResolver.builder()
.tag("command", Tag.inserting(Component.text("/plot help"))) .tag("command", Tag.inserting(Component.text("/plot help")))
.tag("category", Tag.inserting(Component.text("all"))) .tag("category", Tag.inserting(Component.text("all")))
.tag( .tag(
"category_desc", Tag.inserting(TranslatableCaption "category_desc",
Tag.inserting(TranslatableCaption
.of("help.help_display_all_commands") .of("help.help_display_all_commands")
.toComponent(player)) .toComponent(player))
) )
.build() .build()
)); ));
builder.append(Component.newline()); builder.append(Component.newline()).append(MINI_MESSAGE.deserialize(TranslatableCaption
builder.append(TranslatableCaption.of("help.help_footer").toComponent(player)); .of("help.help_footer")
.getComponent(player)));
player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.asComponent()))); player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.asComponent())));
return true; return true;
} }

View File

@@ -20,6 +20,7 @@ package com.plotsquared.core.command;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.Caption; import com.plotsquared.core.configuration.caption.Caption;
import com.plotsquared.core.configuration.caption.StaticCaption;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.database.DBFunc;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
@@ -130,9 +131,13 @@ public class Info extends SubCommand {
info = getCaption(arg); info = getCaption(arg);
if (info == null) { if (info == null) {
if (Settings.Ratings.USE_LIKES) { if (Settings.Ratings.USE_LIKES) {
player.sendMessage(TranslatableCaption.of("info.plot_info_categories.use_likes")); player.sendMessage(StaticCaption.of(
"&6Categories&7: &amembers&7, &aalias&7, &abiome&7, &aseen&7, &adenied&7, &aflags&7, &aid&7, &asize&7, &atrusted&7, "
+ "&aowner&7, " + " &alikes"));
} else { } else {
player.sendMessage(TranslatableCaption.of("info.plot_info_categories.use_rating")); player.sendMessage(StaticCaption.of(
"&6Categories&7: &amembers&7, &aalias&7, &abiome&7, &aseen&7, &adenied&7, &aflags&7, &aid&7, &asize&7, &atrusted&7, "
+ "&aowner&7, " + " &arating"));
} }
return false; return false;
} }

View File

@@ -65,7 +65,8 @@ public class Kick extends SubCommand {
@Override @Override
public boolean onCommand(PlotPlayer<?> player, String[] args) { public boolean onCommand(PlotPlayer<?> player, String[] args) {
Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
Plot plot = location.getPlot();
if (plot == null) { if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;
@@ -123,7 +124,7 @@ public class Kick extends SubCommand {
); );
return; return;
} }
Location spawn = this.worldUtil.getSpawn(plot.getWorldName()); Location spawn = this.worldUtil.getSpawn(location.getWorldName());
player2.sendMessage(TranslatableCaption.of("kick.you_got_kicked")); player2.sendMessage(TranslatableCaption.of("kick.you_got_kicked"));
if (plot.equals(spawn.getPlot())) { if (plot.equals(spawn.getPlot())) {
Location newSpawn = this.worldUtil.getSpawn(this.plotAreaManager.getAllWorlds()[0]); Location newSpawn = this.worldUtil.getSpawn(this.plotAreaManager.getAllWorlds()[0]);
@@ -147,7 +148,8 @@ public class Kick extends SubCommand {
@Override @Override
public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) { public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
Plot plot = location.getPlotAbs();
if (plot == null) { if (plot == null) {
return Collections.emptyList(); return Collections.emptyList();
} }

View File

@@ -20,8 +20,6 @@ package com.plotsquared.core.command;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.EventDispatcher;
@@ -63,22 +61,11 @@ public class Leave extends Command {
} else { } else {
UUID uuid = player.getUUID(); UUID uuid = player.getUUID();
if (plot.isAdded(uuid)) { if (plot.isAdded(uuid)) {
if (this.eventDispatcher
.callPlayerRemove(player, plot, uuid, PlayerPlotAddRemoveEvent.Reason.COMMAND)
.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Leave")))
);
return CompletableFuture.completedFuture(true);
}
if (plot.removeTrusted(uuid)) { if (plot.removeTrusted(uuid)) {
this.eventDispatcher.callTrusted(player, plot, uuid, false); this.eventDispatcher.callTrusted(player, plot, uuid, false);
this.eventDispatcher.callPostTrusted(player, plot, uuid, false, PlayerPlotAddRemoveEvent.Reason.COMMAND);
} }
if (plot.removeMember(uuid)) { if (plot.removeMember(uuid)) {
this.eventDispatcher.callMember(player, plot, uuid, false); this.eventDispatcher.callMember(player, plot, uuid, false);
this.eventDispatcher.callPostAdded(player, plot, uuid, false, PlayerPlotAddRemoveEvent.Reason.COMMAND);
} }
player.sendMessage( player.sendMessage(
TranslatableCaption.of("member.plot_left"), TranslatableCaption.of("member.plot_left"),

View File

@@ -150,8 +150,8 @@ public class ListCmd extends SubCommand {
page = 0; page = 0;
} }
PlotArea area = player.getContextualPlotArea(); String world = player.getLocation().getWorldName();
String world = area != null ? area.getWorldName() : ""; PlotArea area = player.getApplicablePlotArea();
String arg = args[0].toLowerCase(); String arg = args[0].toLowerCase();
final boolean[] sort = new boolean[]{true}; final boolean[] sort = new boolean[]{true};

View File

@@ -68,6 +68,11 @@ public class Load extends SubCommand {
@Override @Override
public boolean onCommand(final PlotPlayer<?> player, final String[] args) { public boolean onCommand(final PlotPlayer<?> player, final String[] args) {
final String world = player.getLocation().getWorldName();
if (!this.plotAreaManager.hasPlotArea(world)) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
return false;
}
final Plot plot = player.getCurrentPlot(); final Plot plot = player.getCurrentPlot();
if (plot == null) { if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));

View File

@@ -44,13 +44,8 @@ import org.apache.logging.log4j.Logger;
import java.util.Arrays; import java.util.Arrays;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/** /**
* PlotSquared command class. * PlotSquared command class.
*/ */
@@ -152,7 +147,8 @@ public class MainCommand extends Command {
try { try {
injector.getInstance(command); injector.getInstance(command);
} catch (final Exception e) { } catch (final Exception e) {
LOGGER.error("Failed to register command {}", command.getCanonicalName(), e); LOGGER.error("Failed to register command {}", command.getCanonicalName());
e.printStackTrace();
} }
} }
@@ -240,179 +236,110 @@ public class MainCommand extends Command {
RunnableVal3<Command, Runnable, Runnable> confirm, RunnableVal3<Command, Runnable, Runnable> confirm,
RunnableVal2<Command, CommandResult> whenDone RunnableVal2<Command, CommandResult> whenDone
) { ) {
prepareArguments(new CommandExecutionData(player, args, confirm, whenDone, null)) // Optional command scope //
.thenCompose(executionData -> { Location location = null;
if (executionData.isEmpty()) { Plot plot = null;
boolean tp = false;
if (args.length >= 2) {
PlotArea area = player.getApplicablePlotArea();
Plot newPlot = Plot.fromString(area, args[0]);
if (newPlot != null && (player instanceof ConsolePlayer || newPlot.getArea()
.equals(area) || player.hasPermission(Permission.PERMISSION_ADMIN)
|| player.hasPermission(Permission.PERMISSION_ADMIN_AREA_SUDO))
&& !newPlot.isDenied(player.getUUID())) {
final Location newLoc;
if (newPlot.getArea() instanceof SinglePlotArea) {
newLoc = newPlot.isLoaded() ? newPlot.getCenterSynchronous() : Location.at("", 0, 0, 0);
} else {
newLoc = newPlot.getCenterSynchronous();
}
if (player.canTeleport(newLoc)) {
// Save meta
try (final MetaDataAccess<Location> locationMetaDataAccess
= player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LOCATION)) {
location = locationMetaDataAccess.get().orElse(null);
locationMetaDataAccess.set(newLoc);
}
try (final MetaDataAccess<Plot> plotMetaDataAccess
= player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
plot = plotMetaDataAccess.get().orElse(null);
plotMetaDataAccess.set(newPlot);
}
tp = true;
} else {
player.sendMessage(TranslatableCaption.of("border.denied"));
return CompletableFuture.completedFuture(false); return CompletableFuture.completedFuture(false);
} }
var data = executionData.get(); // Trim command
try { args = Arrays.copyOfRange(args, 1, args.length);
return super.execute(data.player(), data.args(), data.confirm(), data.whenDone());
} catch (CommandException e) {
throw e;
} catch (Throwable e) {
LOGGER.error("A error occurred while executing plot command", e);
String message = e.getMessage();
if (message != null) {
data.player().sendMessage(
TranslatableCaption.of("errors.error"),
TagResolver.resolver("value", Tag.inserting(Component.text(message)))
);
} else {
data.player().sendMessage(
TranslatableCaption.of("errors.error_console"));
} }
} finally { if (args.length >= 2 && !args[0].isEmpty() && args[0].charAt(0) == '-') {
if (data.postCommandData() != null) { if ("f".equals(args[0].substring(1))) {
resetCommandScope(data.player(), data.postCommandData()); confirm = new RunnableVal3<>() {
}
}
return CompletableFuture.completedFuture(true);
});
return CompletableFuture.completedFuture(true);
}
private CompletableFuture<Optional<CommandExecutionData>> prepareArguments(CommandExecutionData data) {
if (data.args().length >= 2) {
PlotArea area = data.player().getApplicablePlotArea();
Plot newPlot = Plot.fromString(area, data.args()[0], data.player());
return preparePlotArgument(newPlot, data, area)
.thenApply(d -> d.flatMap(x -> prepareFlagArgument(x, area)));
} else {
return CompletableFuture.completedFuture(Optional.of(data));
}
}
private CompletableFuture<Optional<CommandExecutionData>> preparePlotArgument(
@Nullable Plot newPlot,
@Nonnull CommandExecutionData data,
@Nullable PlotArea area
) {
if (newPlot == null) {
return CompletableFuture.completedFuture(Optional.of(data));
}
final PlotPlayer<?> player = data.player();
final boolean isAdmin = player instanceof ConsolePlayer || player.hasPermission(Permission.PERMISSION_ADMIN);
final boolean isDenied = newPlot.isDenied(player.getUUID());
if (!isAdmin) {
if (isDenied) {
throw new CommandException(TranslatableCaption.of("deny.cannot_interact"));
}
if (area != null && area.equals(newPlot.getArea()) && !player.hasPermission(Permission.PERMISSION_ADMIN_AREA_SUDO)) {
return CompletableFuture.completedFuture(Optional.of(data));
}
}
return fetchPlotCenterLocation(newPlot)
.thenApply(newLoc -> {
if (!player.canTeleport(newLoc)) {
player.sendMessage(TranslatableCaption.of("border.denied"));
return Optional.empty();
}
// Save meta
var originalCommandMeta = setCommandScope(player, new TemporaryCommandMeta(newLoc, newPlot));
return Optional.of(new CommandExecutionData(
player,
Arrays.copyOfRange(data.args(), 1, data.args().length), // Trimmed command
data.confirm(),
data.whenDone(),
originalCommandMeta
));
});
}
private Optional<CommandExecutionData> prepareFlagArgument(@Nonnull CommandExecutionData data, @Nonnull PlotArea area) {
if (data.args().length >= 2 && !data.args()[0].isEmpty() && data.args()[0].charAt(0) == '-') {
if ("f".equals(data.args()[0].substring(1))) {
return Optional.of(new CommandExecutionData(
data.player(),
Arrays.copyOfRange(data.args(), 1, data.args().length), // Trimmed command
createForcedConfirmation(data.player(), area),
data.whenDone(),
data.postCommandData()
));
} else {
data.player().sendMessage(TranslatableCaption.of("errors.invalid_command_flag"));
return Optional.empty();
}
}
return Optional.of(data);
}
private CompletableFuture<Location> fetchPlotCenterLocation(Plot plot) {
if (plot.getArea() instanceof SinglePlotArea && !plot.isLoaded()) {
return CompletableFuture.completedFuture(Location.at("", 0, 0, 0));
}
CompletableFuture<Location> future = new CompletableFuture<>();
plot.getCenter(future::complete);
return future;
}
private @Nonnull RunnableVal3<Command, Runnable, Runnable> createForcedConfirmation(@Nonnull PlotPlayer<?> player,
@Nullable PlotArea area) {
return new RunnableVal3<>() {
@Override @Override
public void run(Command cmd, Runnable success, Runnable failure) { public void run(Command cmd, Runnable success, Runnable failure) {
if (area != null && PlotSquared.platform().econHandler().isEnabled(area) if (area != null && PlotSquared.platform().econHandler().isEnabled(area)) {
&& Optional.of(area.getPrices().get(cmd.getFullId())) PlotExpression priceEval =
.map(priceEval -> priceEval.evaluate(0d)) area.getPrices().get(cmd.getFullId());
.filter(price -> price != 0d) double price = priceEval != null ? priceEval.evaluate(0d) : 0d;
.filter(price -> PlotSquared.platform().econHandler().getMoney(player) < price) if (price != 0d
.isPresent()) { && PlotSquared.platform().econHandler().getMoney(player) < price) {
if (failure != null) { if (failure != null) {
failure.run(); failure.run();
} }
return; return;
} }
}
if (success != null) { if (success != null) {
success.run(); success.run();
} }
} }
}; };
args = Arrays.copyOfRange(args, 1, args.length);
} else {
player.sendMessage(TranslatableCaption.of("errors.invalid_command_flag"));
return CompletableFuture.completedFuture(false);
} }
}
private @Nonnull TemporaryCommandMeta setCommandScope(@Nonnull PlotPlayer<?> player, @Nonnull TemporaryCommandMeta commandMeta) { }
Objects.requireNonNull(commandMeta.location()); try {
Objects.requireNonNull(commandMeta.plot()); super.execute(player, args, confirm, whenDone);
Location location; } catch (CommandException e) {
Plot plot; throw e;
} catch (Throwable e) {
e.printStackTrace();
String message = e.getMessage();
if (message != null) {
player.sendMessage(
TranslatableCaption.of("errors.error"),
TagResolver.resolver("value", Tag.inserting(Component.text(message)))
);
} else {
player.sendMessage(
TranslatableCaption.of("errors.error_console"));
}
}
// Reset command scope //
if (tp && !(player instanceof ConsolePlayer)) {
try (final MetaDataAccess<Location> locationMetaDataAccess try (final MetaDataAccess<Location> locationMetaDataAccess
= player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LOCATION)) { = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LOCATION)) {
location = locationMetaDataAccess.get().orElse(null); if (location == null) {
locationMetaDataAccess.set(commandMeta.location());
}
try (final MetaDataAccess<Plot> plotMetaDataAccess
= player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
plot = plotMetaDataAccess.get().orElse(null);
plotMetaDataAccess.set(commandMeta.plot());
}
return new TemporaryCommandMeta(location, plot);
}
private void resetCommandScope(@Nonnull PlotPlayer<?> player, @Nonnull TemporaryCommandMeta commandMeta) {
try (final MetaDataAccess<Location> locationMetaDataAccess
= player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LOCATION)) {
if (commandMeta.location() == null) {
locationMetaDataAccess.remove(); locationMetaDataAccess.remove();
} else { } else {
locationMetaDataAccess.set(commandMeta.location()); locationMetaDataAccess.set(location);
} }
} }
try (final MetaDataAccess<Plot> plotMetaDataAccess try (final MetaDataAccess<Plot> plotMetaDataAccess
= player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) { = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
if (commandMeta.plot() == null) { if (plot == null) {
plotMetaDataAccess.remove(); plotMetaDataAccess.remove();
} else { } else {
plotMetaDataAccess.set(commandMeta.plot()); plotMetaDataAccess.set(plot);
} }
} }
} }
return CompletableFuture.completedFuture(true);
private record CommandExecutionData(@Nonnull PlotPlayer<?> player, @Nonnull String[] args, }
@Nonnull RunnableVal3<Command, Runnable, Runnable> confirm,
@Nonnull RunnableVal2<Command, CommandResult> whenDone,
@Nullable TemporaryCommandMeta postCommandData) {}
private record TemporaryCommandMeta(@Nullable Location location, @Nullable Plot plot) {}
@Override @Override
public boolean canExecute(PlotPlayer<?> player, boolean message) { public boolean canExecute(PlotPlayer<?> player, boolean message) {

View File

@@ -20,6 +20,7 @@ package com.plotsquared.core.command;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.events.TeleportCause; import com.plotsquared.core.events.TeleportCause;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
@@ -35,7 +36,8 @@ public class Middle extends SubCommand {
@Override @Override
public boolean onCommand(PlotPlayer<?> player, String[] arguments) { public boolean onCommand(PlotPlayer<?> player, String[] arguments) {
Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
Plot plot = location.getPlot();
if (plot == null) { if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;

View File

@@ -20,6 +20,7 @@ package com.plotsquared.core.command;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
@@ -54,7 +55,8 @@ public class Move extends SubCommand {
RunnableVal3<Command, Runnable, Runnable> confirm, RunnableVal3<Command, Runnable, Runnable> confirm,
RunnableVal2<Command, CommandResult> whenDone RunnableVal2<Command, CommandResult> whenDone
) { ) {
Plot plot1 = player.getCurrentPlot(); Location location = player.getLocation();
Plot plot1 = location.getPlotAbs();
if (plot1 == null) { if (plot1 == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return CompletableFuture.completedFuture(false); return CompletableFuture.completedFuture(false);

View File

@@ -23,6 +23,7 @@ import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.events.PlotFlagAddEvent; import com.plotsquared.core.events.PlotFlagAddEvent;
import com.plotsquared.core.events.PlotFlagRemoveEvent; import com.plotsquared.core.events.PlotFlagRemoveEvent;
import com.plotsquared.core.events.Result; import com.plotsquared.core.events.Result;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
@@ -56,7 +57,7 @@ public class Music extends SubCommand {
"music_disc_far", "music_disc_mall", "music_disc_mellohi", "music_disc_stal", "music_disc_far", "music_disc_mall", "music_disc_mellohi", "music_disc_stal",
"music_disc_strad", "music_disc_ward", "music_disc_11", "music_disc_wait", "music_disc_otherside", "music_disc_strad", "music_disc_ward", "music_disc_11", "music_disc_wait", "music_disc_otherside",
"music_disc_pigstep", "music_disc_5", "music_disc_relic", "music_disc_creator", "music_disc_pigstep", "music_disc_5", "music_disc_relic", "music_disc_creator",
"music_disc_creator_music_box", "music_disc_precipice", "music_disc_tears", "music_disc_lava_chicken" "music_disc_creator_music_box", "music_disc_precipice"
); );
// make sure all discs and the bedrock ("cancel") fit into the inventory // make sure all discs and the bedrock ("cancel") fit into the inventory
@@ -73,7 +74,8 @@ public class Music extends SubCommand {
@Override @Override
public boolean onCommand(PlotPlayer<?> player, String[] args) { public boolean onCommand(PlotPlayer<?> player, String[] args) {
final Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
final Plot plot = location.getPlotAbs();
if (plot == null) { if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;

View File

@@ -21,8 +21,7 @@ package com.plotsquared.core.command;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.database.DBFunc;
import com.plotsquared.core.events.PlayerPlotAddRemoveEvent; import com.plotsquared.core.location.Location;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
@@ -57,7 +56,8 @@ public class Remove extends SubCommand {
@Override @Override
public boolean onCommand(PlotPlayer<?> player, String[] args) { public boolean onCommand(PlotPlayer<?> player, String[] args) {
Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
Plot plot = location.getPlotAbs();
if (plot == null) { if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;
@@ -84,48 +84,33 @@ public class Remove extends SubCommand {
return; return;
} else if (!uuids.isEmpty()) { } else if (!uuids.isEmpty()) {
for (UUID uuid : uuids) { for (UUID uuid : uuids) {
if (this.eventDispatcher
.callPlayerRemove(player, plot, uuid, PlayerPlotAddRemoveEvent.Reason.COMMAND)
.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Remove")))
);
continue;
}
if (plot.getTrusted().contains(uuid)) { if (plot.getTrusted().contains(uuid)) {
if (plot.removeTrusted(uuid)) { if (plot.removeTrusted(uuid)) {
this.eventDispatcher.callTrusted(player, plot, uuid, false); this.eventDispatcher.callTrusted(player, plot, uuid, false);
this.eventDispatcher.callPostTrusted(player, plot, uuid, false, PlayerPlotAddRemoveEvent.Reason.COMMAND);
count++; count++;
} }
} else if (plot.getMembers().contains(uuid)) { } else if (plot.getMembers().contains(uuid)) {
if (plot.removeMember(uuid)) { if (plot.removeMember(uuid)) {
this.eventDispatcher.callMember(player, plot, uuid, false); this.eventDispatcher.callMember(player, plot, uuid, false);
this.eventDispatcher.callPostAdded(player, plot, uuid, false, PlayerPlotAddRemoveEvent.Reason.COMMAND);
count++; count++;
} }
} else if (plot.getDenied().contains(uuid)) { } else if (plot.getDenied().contains(uuid)) {
if (plot.removeDenied(uuid)) { if (plot.removeDenied(uuid)) {
this.eventDispatcher.callDenied(player, plot, uuid, false); this.eventDispatcher.callDenied(player, plot, uuid, false);
this.eventDispatcher.callPostDenied(player, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.COMMAND);
count++; count++;
} }
} else if (uuid == DBFunc.EVERYONE) { } else if (uuid == DBFunc.EVERYONE) {
count += plot.getTrusted().size(); count += plot.getTrusted().size();
if (plot.removeTrusted(uuid)) { if (plot.removeTrusted(uuid)) {
this.eventDispatcher.callTrusted(player, plot, uuid, false); this.eventDispatcher.callTrusted(player, plot, uuid, false);
this.eventDispatcher.callPostTrusted(player, plot, uuid, false, PlayerPlotAddRemoveEvent.Reason.COMMAND);
} }
count += plot.getMembers().size(); count += plot.getMembers().size();
if (plot.removeMember(uuid)) { if (plot.removeMember(uuid)) {
this.eventDispatcher.callMember(player, plot, uuid, false); this.eventDispatcher.callMember(player, plot, uuid, false);
this.eventDispatcher.callPostAdded(player, plot, uuid, false, PlayerPlotAddRemoveEvent.Reason.COMMAND);
} }
count += plot.getDenied().size(); count += plot.getDenied().size();
if (plot.removeDenied(uuid)) { if (plot.removeDenied(uuid)) {
this.eventDispatcher.callDenied(player, plot, uuid, false); this.eventDispatcher.callDenied(player, plot, uuid, false);
this.eventDispatcher.callPostDenied(player, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.COMMAND);
} }
} }
} }
@@ -147,7 +132,8 @@ public class Remove extends SubCommand {
@Override @Override
public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) { public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
Plot plot = location.getPlotAbs();
if (plot == null) { if (plot == null) {
return Collections.emptyList(); return Collections.emptyList();
} }

View File

@@ -22,6 +22,7 @@ import com.google.common.collect.Lists;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.ConsolePlayer; import com.plotsquared.core.player.ConsolePlayer;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
@@ -101,7 +102,8 @@ public class SchematicCmd extends SubCommand {
); );
break; break;
} }
final Plot plot = player.getCurrentPlot(); Location loc = player.getLocation();
final Plot plot = loc.getPlotAbs();
if (plot == null) { if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;
@@ -245,7 +247,8 @@ public class SchematicCmd extends SubCommand {
player.sendMessage(TranslatableCaption.of("error.task_in_process")); player.sendMessage(TranslatableCaption.of("error.task_in_process"));
return false; return false;
} }
Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
Plot plot = location.getPlotAbs();
if (plot == null) { if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;

View File

@@ -78,7 +78,7 @@ public class Set extends SubCommand {
@Override @Override
public boolean set(PlotPlayer<?> player, final Plot plot, String value) { public boolean set(PlotPlayer<?> player, final Plot plot, String value) {
final PlotArea plotArea = player.getContextualPlotArea(); final PlotArea plotArea = player.getLocation().getPlotArea();
if (plotArea == null) { if (plotArea == null) {
return false; return false;
} }

View File

@@ -19,6 +19,7 @@
package com.plotsquared.core.command; package com.plotsquared.core.command;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
@@ -31,7 +32,8 @@ public abstract class SetCommand extends SubCommand {
@Override @Override
public boolean onCommand(PlotPlayer<?> player, String[] args) { public boolean onCommand(PlotPlayer<?> player, String[] args) {
Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
Plot plot = location.getPlotAbs();
if (plot == null) { if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;

View File

@@ -19,6 +19,7 @@
package com.plotsquared.core.command; package com.plotsquared.core.command;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
@@ -43,7 +44,8 @@ public class Swap extends SubCommand {
RunnableVal3<Command, Runnable, Runnable> confirm, RunnableVal3<Command, Runnable, Runnable> confirm,
RunnableVal2<Command, CommandResult> whenDone RunnableVal2<Command, CommandResult> whenDone
) { ) {
Plot plot1 = player.getCurrentPlot(); Location location = player.getLocation();
Plot plot1 = location.getPlotAbs();
if (plot1 == null) { if (plot1 == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return CompletableFuture.completedFuture(false); return CompletableFuture.completedFuture(false);
@@ -77,10 +79,8 @@ public class Swap extends SubCommand {
String p1 = plot1.toString(); String p1 = plot1.toString();
String p2 = plot2.toString(); String p2 = plot2.toString();
return plot1.getPlotModificationManager().move( return plot1.getPlotModificationManager().move(plot2, player, () -> {
plot2, player, () -> { }, true).thenApply(result -> {
}, true
).thenApply(result -> {
if (result) { if (result) {
player.sendMessage( player.sendMessage(
TranslatableCaption.of("swap.swap_success"), TranslatableCaption.of("swap.swap_success"),

View File

@@ -23,8 +23,6 @@ import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.database.DBFunc;
import com.plotsquared.core.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
@@ -152,19 +150,8 @@ public class Trust extends Command {
return; return;
} }
// Success // Success
confirm.run( confirm.run(this, () -> {
this, () -> {
for (UUID uuid : uuids) { for (UUID uuid : uuids) {
if (this.eventDispatcher
.callPlayerTrust(player, currentPlot, uuid, PlayerPlotAddRemoveEvent.Reason.COMMAND)
.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Trust")))
);
return;
}
if (uuid != DBFunc.EVERYONE) { if (uuid != DBFunc.EVERYONE) {
if (!currentPlot.removeMember(uuid)) { if (!currentPlot.removeMember(uuid)) {
if (currentPlot.getDenied().contains(uuid)) { if (currentPlot.getDenied().contains(uuid)) {
@@ -174,21 +161,12 @@ public class Trust extends Command {
} }
currentPlot.addTrusted(uuid); currentPlot.addTrusted(uuid);
this.eventDispatcher.callTrusted(player, currentPlot, uuid, true); this.eventDispatcher.callTrusted(player, currentPlot, uuid, true);
this.eventDispatcher.callPostTrusted(
player,
currentPlot,
uuid,
false,
PlayerPlotAddRemoveEvent.Reason.COMMAND
);
player.sendMessage(TranslatableCaption.of("trusted.trusted_added")); player.sendMessage(TranslatableCaption.of("trusted.trusted_added"));
} }
}, null }, null);
);
} }
future.complete(true); future.complete(true);
} });
);
return CompletableFuture.completedFuture(true); return CompletableFuture.completedFuture(true);
} }

View File

@@ -22,6 +22,7 @@ import com.google.inject.Inject;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.events.PlotUnlinkEvent; import com.plotsquared.core.events.PlotUnlinkEvent;
import com.plotsquared.core.events.Result; import com.plotsquared.core.events.Result;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
@@ -50,7 +51,8 @@ public class Unlink extends SubCommand {
@Override @Override
public boolean onCommand(final PlotPlayer<?> player, String[] args) { public boolean onCommand(final PlotPlayer<?> player, String[] args) {
final Plot plot = player.getCurrentPlot(); Location location = player.getLocation();
final Plot plot = location.getPlotAbs();
if (plot == null) { if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false; return false;

View File

@@ -67,13 +67,10 @@ public class Visit extends Command {
private void visit( private void visit(
final @NonNull PlotPlayer<?> player, final @NonNull PlotQuery query, final PlotArea sortByArea, final @NonNull PlotPlayer<?> player, final @NonNull PlotQuery query, final PlotArea sortByArea,
final RunnableVal3<Command, Runnable, Runnable> confirm, final RunnableVal2<Command, CommandResult> whenDone, int page final RunnableVal3<Command, Runnable, Runnable> confirm, final RunnableVal2<Command, CommandResult> whenDone,
int page, final boolean isQueryingBasePlot
) { ) {
// We get the query once, if (!isQueryingBasePlot && query.hasMinimumMatches(2)) {
// then we get it another time further on
final List<Plot> unsorted = query.asList();
if (unsorted.size() > 1) {
query.whereBasePlot(); query.whereBasePlot();
} }
@@ -237,7 +234,8 @@ public class Visit extends Command {
finalSortByArea, finalSortByArea,
confirm, confirm,
whenDone, whenDone,
finalPage1 finalPage1,
true
); );
} }
}); });
@@ -261,12 +259,9 @@ public class Visit extends Command {
if (throwable instanceof TimeoutException) { if (throwable instanceof TimeoutException) {
// The request timed out // The request timed out
player.sendMessage(TranslatableCaption.of("players.fetching_players_timeout")); player.sendMessage(TranslatableCaption.of("players.fetching_players_timeout"));
} else if (uuid != null && (Settings.Teleport.VISIT_MERGED_OWNERS return;
? !PlotQuery.newQuery().ownersInclude(uuid).anyMatch() }
: !PlotQuery.newQuery().ownedBy(uuid).anyMatch())) { if (uuid == null){
// It was a valid UUID but the player has no plots
player.sendMessage(TranslatableCaption.of("errors.player_no_plots"));
} else if (uuid == null) {
// player not found, so we assume it's an alias if no page was provided // player not found, so we assume it's an alias if no page was provided
if (finalPage == Integer.MIN_VALUE) { if (finalPage == Integer.MIN_VALUE) {
this.visit( this.visit(
@@ -275,7 +270,8 @@ public class Visit extends Command {
player.getApplicablePlotArea(), player.getApplicablePlotArea(),
confirm, confirm,
whenDone, whenDone,
1 1,
false
); );
} else { } else {
player.sendMessage( player.sendMessage(
@@ -283,24 +279,23 @@ public class Visit extends Command {
TagResolver.resolver("value", Tag.inserting(Component.text(finalArgs[0]))) TagResolver.resolver("value", Tag.inserting(Component.text(finalArgs[0])))
); );
} }
} else { return;
this.visit(
player,
Settings.Teleport.VISIT_MERGED_OWNERS
? PlotQuery.newQuery().ownersInclude(uuid).whereBasePlot()
: PlotQuery.newQuery().ownedBy(uuid).whereBasePlot(),
null,
confirm,
whenDone,
finalPage
);
} }
final PlotQuery query = Settings.Teleport.VISIT_MERGED_OWNERS
? PlotQuery.newQuery().ownersInclude(uuid)
: PlotQuery.newQuery().ownedBy(uuid);
if (!query.anyMatch()) {
// It was a valid UUID but the player has no plots
player.sendMessage(TranslatableCaption.of("errors.player_no_plots"));
return;
}
this.visit(player, query.whereBasePlot(), null, confirm, whenDone, finalPage, true);
}); });
} else { } else {
// Try to parse a plot // Try to parse a plot
final Plot plot = Plot.getPlotFromString(player, finalArgs[0], true); final Plot plot = Plot.getPlotFromString(player, finalArgs[0], true);
if (plot != null) { if (plot != null) {
this.visit(player, PlotQuery.newQuery().withPlot(plot), null, confirm, whenDone, 1); this.visit(player, PlotQuery.newQuery().withPlot(plot), null, confirm, whenDone, 1, false);
} }
} }
break; break;

View File

@@ -435,11 +435,6 @@ public class Settings extends Config {
public static String SCHEMATICS = "schematics"; public static String SCHEMATICS = "schematics";
public static String TEMPLATES = "templates"; public static String TEMPLATES = "templates";
@Comment({"If schematics used for generation should be searched for in the path.schematics location",
" - This setting exists and is `false` by default for backwards compatibility.",
" - If false then generation schematics must be located in `schematics`",
" - Schematics must still always be under GEN_ROAD_SCHEMATIC/<world> etc."})
public static boolean USE_SCHEMATICS_PATH_FOR_GEN_SCHEMATICS = false;
} }

View File

@@ -20,7 +20,6 @@ package com.plotsquared.core.configuration.caption;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike; import net.kyori.adventure.text.ComponentLike;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
/** /**
@@ -45,16 +44,6 @@ public interface Caption {
*/ */
@NonNull Component toComponent(@NonNull LocaleHolder localeHolder); @NonNull Component toComponent(@NonNull LocaleHolder localeHolder);
/**
* Get the Adventure {@link ComponentLike} for this caption while applying custom {@link TagResolver}
* (apart from the default {@code core.prefix})
* @param localeHolder Local holder
* @param tagResolvers custom tag resolvers to replace placeholders / parameters
* @return {@link ComponentLike}
* @since 7.5.4
*/
@NonNull Component toComponent(@NonNull LocaleHolder localeHolder, @NonNull TagResolver @NonNull... tagResolvers);
@NonNull String toString(); @NonNull String toString();
} }

View File

@@ -21,7 +21,6 @@ package com.plotsquared.core.configuration.caption;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
public final class StaticCaption implements Caption { public final class StaticCaption implements Caption {
@@ -52,14 +51,6 @@ public final class StaticCaption implements Caption {
return MiniMessage.miniMessage().deserialize(this.value); return MiniMessage.miniMessage().deserialize(this.value);
} }
@Override
public @NonNull Component toComponent(
@NonNull final LocaleHolder localeHolder,
final @NonNull TagResolver @NonNull ... tagResolvers
) {
return MiniMessage.miniMessage().deserialize(this.value, tagResolvers);
}
@Override @Override
public @NonNull String toString() { public @NonNull String toString() {
return "StaticCaption(" + value + ")"; return "StaticCaption(" + value + ")";

View File

@@ -27,7 +27,6 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@@ -97,23 +96,13 @@ public final class TranslatableCaption implements NamespacedCaption {
@Override @Override
public @NonNull Component toComponent(@NonNull final LocaleHolder localeHolder) { public @NonNull Component toComponent(@NonNull final LocaleHolder localeHolder) {
return this.toComponent(localeHolder, new TagResolver[0]);
}
@Override
public @NonNull Component toComponent(
@NonNull final LocaleHolder localeHolder,
final @NonNull TagResolver @NonNull ... tagResolvers
) {
if (getKey().equals("core.prefix")) { if (getKey().equals("core.prefix")) {
return MiniMessage.miniMessage().deserialize(getComponent(localeHolder)); return MiniMessage.miniMessage().deserialize(getComponent(localeHolder));
} }
TagResolver[] finalResolvers = Arrays.copyOf(tagResolvers, tagResolvers.length + 1); return MiniMessage.miniMessage().deserialize(getComponent(localeHolder), TagResolver.resolver(
finalResolvers[finalResolvers.length - 1] = TagResolver.resolver(
"prefix", "prefix",
Tag.inserting(TranslatableCaption.of("core.prefix").toComponent(localeHolder)) Tag.inserting(TranslatableCaption.of("core.prefix").toComponent(localeHolder))
); ));
return MiniMessage.miniMessage().deserialize(getComponent(localeHolder), finalResolvers);
} }
@Override @Override

View File

@@ -1,55 +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 com.plotsquared.core.plot.Plot;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.UUID;
/**
* Parent class for the varies events regarding a player being added/removed/denied/trusted
*
* @since TODO
*/
public class PlayerPlotAddRemoveCancellableEvent extends PlayerPlotAddRemoveEvent implements CancellablePlotEvent {
private Result eventResult;
protected PlayerPlotAddRemoveCancellableEvent(
final PlotPlayer<?> initiator,
Plot plot,
final UUID player,
final Reason reason
) {
super(initiator, plot, player, reason);
}
@Override
public @Nullable Result getEventResult() {
return eventResult;
}
@Override
public void setEventResult(@Nullable final Result eventResult) {
this.eventResult = eventResult;
}
}

View File

@@ -1,88 +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 com.plotsquared.core.plot.Plot;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.UUID;
/**
* Parent class for the varies events regarding a player being added/removed/denied/trusted
*
* @since TODO
*/
public class PlayerPlotAddRemoveEvent extends PlotEvent {
private final Reason reason;
private final PlotPlayer<?> initiator;
private final UUID player;
protected PlayerPlotAddRemoveEvent(final PlotPlayer<?> initiator, Plot plot, final UUID player, final Reason reason) {
super(plot);
this.initiator = initiator;
this.player = player;
this.reason = reason;
}
/**
* The player to be added/denied/removed/trusted.
*
* @return UUID
*/
public UUID getPlayer() {
return this.player;
}
/**
* The player initiating the action. May be null (if a player, or a {@link com.plotsquared.core.player.ConsolePlayer}.
*
* @return PlotPlayer
*/
@Nullable
public PlotPlayer<?> getInitiator() {
return this.initiator;
}
/**
* Get the reason the player is being added/removed/denied/trusted
*
* @return Reason
*/
public Reason getReason() {
return this.reason;
}
public enum Reason {
/**
* If a plot merge caused the player to be added/removed/denied/trusted
*/
MERGE,
/**
* If a command caused the player to be added/removed/denied/trusted
*/
COMMAND,
/**
* If something unknown caused the player to be added/removed/denied/trusted
*/
UNKNOWN
}
}

View File

@@ -23,10 +23,6 @@ import com.plotsquared.core.plot.Plot;
import java.util.UUID; import java.util.UUID;
/**
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotDeniedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public class PlayerPlotDeniedEvent extends PlotEvent { public class PlayerPlotDeniedEvent extends PlotEvent {
private final PlotPlayer<?> initiator; private final PlotPlayer<?> initiator;
@@ -40,9 +36,7 @@ public class PlayerPlotDeniedEvent extends PlotEvent {
* @param plot Plot in which the event occurred * @param plot Plot in which the event occurred
* @param player Player that was denied/un-denied * @param player Player that was denied/un-denied
* @param added {@code true} of add to deny list, {@code false} if removed * @param added {@code true} of add to deny list, {@code false} if removed
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotDeniedEvent}
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public PlayerPlotDeniedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) { public PlayerPlotDeniedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) {
super(plot); super(plot);
this.initiator = initiator; this.initiator = initiator;
@@ -54,9 +48,7 @@ public class PlayerPlotDeniedEvent extends PlotEvent {
* If a user was added. * If a user was added.
* *
* @return boolean * @return boolean
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotDeniedEvent}
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public boolean wasAdded() { public boolean wasAdded() {
return this.added; return this.added;
} }
@@ -65,9 +57,7 @@ public class PlayerPlotDeniedEvent extends PlotEvent {
* The player added/removed. * The player added/removed.
* *
* @return UUID * @return UUID
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotDeniedEvent}
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public UUID getPlayer() { public UUID getPlayer() {
return this.player; return this.player;
} }
@@ -76,9 +66,7 @@ public class PlayerPlotDeniedEvent extends PlotEvent {
* The player initiating the action. * The player initiating the action.
* *
* @return PlotPlayer * @return PlotPlayer
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotDeniedEvent}
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public PlotPlayer<?> getInitiator() { public PlotPlayer<?> getInitiator() {
return this.initiator; return this.initiator;
} }

View File

@@ -1,45 +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 com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* Called when a player is going to be denied from a plot
*
* @since TODO
*/
public class PlayerPlotDenyEvent extends PlayerPlotAddRemoveCancellableEvent {
/**
* Called when a player will be denied from a plot
*
* @param initiator Player that initiated the event
* @param plot Plot in which the event occurred
* @param player Player that will be denied
* @param reason The reason for the deny
*/
public PlayerPlotDenyEvent(PlotPlayer<?> initiator, Plot plot, UUID player, Reason reason) {
super(initiator, plot, player, reason);
}
}

View File

@@ -24,9 +24,8 @@ import com.plotsquared.core.plot.Plot;
import java.util.UUID; import java.util.UUID;
/** /**
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotAddedEvent} *
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public class PlayerPlotHelperEvent extends PlotEvent { public class PlayerPlotHelperEvent extends PlotEvent {
private final PlotPlayer<?> initiator; private final PlotPlayer<?> initiator;
@@ -40,9 +39,7 @@ public class PlayerPlotHelperEvent extends PlotEvent {
* @param plot Plot in which the event occurred * @param plot Plot in which the event occurred
* @param player Player that was added/removed from the helper list * @param player Player that was added/removed from the helper list
* @param added {@code true} if the player was added, {@code false} if the player was removed * @param added {@code true} if the player was added, {@code false} if the player was removed
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotAddedEvent}
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public PlayerPlotHelperEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) { public PlayerPlotHelperEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) {
super(plot); super(plot);
this.initiator = initiator; this.initiator = initiator;
@@ -54,9 +51,7 @@ public class PlayerPlotHelperEvent extends PlotEvent {
* If a player was added * If a player was added
* *
* @return boolean * @return boolean
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotAddedEvent}
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public boolean wasAdded() { public boolean wasAdded() {
return this.added; return this.added;
} }
@@ -65,9 +60,7 @@ public class PlayerPlotHelperEvent extends PlotEvent {
* The UUID added/removed * The UUID added/removed
* *
* @return UUID * @return UUID
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotAddedEvent}
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public UUID getPlayer() { public UUID getPlayer() {
return this.player; return this.player;
} }
@@ -76,9 +69,7 @@ public class PlayerPlotHelperEvent extends PlotEvent {
* The player initiating the action * The player initiating the action
* *
* @return PlotPlayer * @return PlotPlayer
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotAddedEvent}
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public PlotPlayer<?> getInitiator() { public PlotPlayer<?> getInitiator() {
return this.initiator; return this.initiator;
} }

View File

@@ -1,45 +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 com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* Called when a player is going to be removed from a plot (could be removed from added, trusted, or denied)
*
* @since TODO
*/
public class PlayerPlotRemoveEvent extends PlayerPlotAddRemoveCancellableEvent {
/**
* Called when a player is going to be removed from a plot (could be removed from added, trusted, or denied)
*
* @param initiator Player that initiated the event
* @param plot Plot in which the event occurred
* @param player Player that will be removed
* @param reason The reason for the remove
*/
public PlayerPlotRemoveEvent(PlotPlayer<?> initiator, Plot plot, UUID player, Reason reason) {
super(initiator, plot, player, reason);
}
}

View File

@@ -1,45 +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 com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* Called when a player is going to be trusted to a plot
*
* @since TODO
*/
public class PlayerPlotTrustEvent extends PlayerPlotAddRemoveCancellableEvent {
/**
* Called when a player will be trusted to a plot
*
* @param initiator Player that initiated the event
* @param plot Plot in which the event occurred
* @param player Player that will be trusted
* @param reason The reason for the trust
*/
public PlayerPlotTrustEvent(PlotPlayer<?> initiator, Plot plot, UUID player, Reason reason) {
super(initiator, plot, player, reason);
}
}

View File

@@ -23,10 +23,6 @@ import com.plotsquared.core.plot.Plot;
import java.util.UUID; import java.util.UUID;
/**
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotTrustedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public class PlayerPlotTrustedEvent extends PlotEvent { public class PlayerPlotTrustedEvent extends PlotEvent {
private final PlotPlayer<?> initiator; private final PlotPlayer<?> initiator;
@@ -40,9 +36,7 @@ public class PlayerPlotTrustedEvent extends PlotEvent {
* @param plot Plot in which the event occurred * @param plot Plot in which the event occurred
* @param player Player that was added/removed from the trusted list * @param player Player that was added/removed from the trusted list
* @param added {@code true} if the player was added, {@code false} if the player was removed * @param added {@code true} if the player was added, {@code false} if the player was removed
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotTrustedEvent}
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public PlayerPlotTrustedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) { public PlayerPlotTrustedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) {
super(plot); super(plot);
this.initiator = initiator; this.initiator = initiator;
@@ -54,9 +48,7 @@ public class PlayerPlotTrustedEvent extends PlotEvent {
* If a player was added * If a player was added
* *
* @return boolean * @return boolean
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotTrustedEvent}
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public boolean wasAdded() { public boolean wasAdded() {
return this.added; return this.added;
} }
@@ -65,9 +57,7 @@ public class PlayerPlotTrustedEvent extends PlotEvent {
* The UUID added/removed * The UUID added/removed
* *
* @return UUID * @return UUID
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotTrustedEvent}
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public UUID getPlayer() { public UUID getPlayer() {
return this.player; return this.player;
} }
@@ -76,9 +66,7 @@ public class PlayerPlotTrustedEvent extends PlotEvent {
* The player initiating the action * The player initiating the action
* *
* @return PlotPlayer * @return PlotPlayer
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotTrustedEvent}
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public PlotPlayer<?> getInitiator() { public PlotPlayer<?> getInitiator() {
return this.initiator; return this.initiator;
} }

View File

@@ -1,56 +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.post;
import com.plotsquared.core.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* Parent class for events covering players being added/removed to added/trusted/denied lists.
*
* @since TODO
*/
public sealed class PostPlayerPlotAddRemoveEvent extends PlayerPlotAddRemoveEvent permits PostPlayerPlotAddedEvent,
PostPlayerPlotDeniedEvent, PostPlayerPlotTrustedEvent {
private final boolean added;
protected PostPlayerPlotAddRemoveEvent(
final PlotPlayer<?> initiator,
final Plot plot,
final UUID player,
final Reason reason,
boolean added
) {
super(initiator, plot, player, reason);
this.added = added;
}
/**
* Get if the player was added to a list, or removed.
*/
public boolean added() {
return added;
}
}

View File

@@ -1,46 +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.post;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* Called when a player is added to a plot
*
* @since TODO
*/
public final class PostPlayerPlotAddedEvent extends PostPlayerPlotAddRemoveEvent {
/**
* PlayerPlotHelperEvent: Called when a player is added to a plot
*
* @param initiator Player that initiated the event
* @param plot Plot in which the event occurred
* @param player Player that was added/removed from the helper list
* @param added {@code true} if the player was added, {@code false} if the player was removed
* @param reason The reason for the add/remove
*/
public PostPlayerPlotAddedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added, Reason reason) {
super(initiator, plot, player, reason, added);
}
}

View File

@@ -1,46 +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.post;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* Called when a player is denied from a plot
*
* @since TODO
*/
public final class PostPlayerPlotDeniedEvent extends PostPlayerPlotAddRemoveEvent {
/**
* PlayerPlotDeniedEvent: Called when the denied UUID list is modified for a plot.
*
* @param initiator Player that initiated the event
* @param plot Plot in which the event occurred
* @param player Player that was denied/un-denied
* @param added {@code true} of add to deny list, {@code false} if removed
* @param reason The reason for the deny/remove
*/
public PostPlayerPlotDeniedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added, Reason reason) {
super(initiator, plot, player, reason, added);
}
}

View File

@@ -1,46 +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.post;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* Called when a plot trusted user is added/removed
*
* @since TODO
*/
public final class PostPlayerPlotTrustedEvent extends PostPlayerPlotAddRemoveEvent {
/**
* PlayerPlotTrustedEvent: Called when a plot trusted user is added/removed
*
* @param initiator Player that initiated the event
* @param plot Plot in which the event occurred
* @param player Player that was added/removed from the trusted list
* @param added {@code true} if the player was added, {@code false} if the player was removed
* @param reason The reason for the trust/remove
*/
public PostPlayerPlotTrustedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added, Reason reason) {
super(initiator, plot, player, reason, added);
}
}

View File

@@ -1,62 +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.exception;
import com.plotsquared.core.configuration.caption.Caption;
import com.plotsquared.core.configuration.caption.LocaleHolder;
/**
* Internal use only. Used to allow adventure captions to be used in an exception
*
* @since 7.5.7
*/
public final class PlotSquaredException extends RuntimeException {
private final Caption caption;
/**
* Create a new instance with the given caption
*
* @param caption caption
*/
public PlotSquaredException(Caption caption) {
this.caption = caption;
}
/**
* Create a new instance with the given caption and cause
*
* @param caption caption
* @param cause cause
*/
public PlotSquaredException(Caption caption, Exception cause) {
super(cause);
this.caption = caption;
}
@Override
public String getMessage() {
return caption.getComponent(LocaleHolder.console());
}
public Caption getCaption() {
return caption;
}
}

View File

@@ -140,8 +140,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
@NonNull @NonNull
@Override @Override
protected PlotManager createManager() { protected PlotManager createManager() {
return new HybridPlotManager( return new HybridPlotManager(this, PlotSquared.platform().regionManager(),
this, PlotSquared.platform().regionManager(),
PlotSquared.platform().injector().getInstance(ProgressSubscriberFactory.class) PlotSquared.platform().injector().getInstance(ProgressSubscriberFactory.class)
); );
} }
@@ -216,16 +215,15 @@ public class HybridPlotWorld extends ClassicPlotWorld {
// Try to determine root. This means that plot areas can have separate schematic // Try to determine root. This means that plot areas can have separate schematic
// directories // directories
String schematicFolder = Settings.Paths.USE_SCHEMATICS_PATH_FOR_GEN_SCHEMATICS ? Settings.Paths.SCHEMATICS : "schematics";
if (!(root = if (!(root =
FileUtils.getFile( FileUtils.getFile(
PlotSquared.platform().getDirectory(), PlotSquared.platform().getDirectory(),
schematicFolder + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + this.getWorldName() + File.separator + this.getId() "schematics/GEN_ROAD_SCHEMATIC/" + this.getWorldName() + "/" + this.getId()
)) ))
.exists()) { .exists()) {
root = FileUtils.getFile( root = FileUtils.getFile(
PlotSquared.platform().getDirectory(), PlotSquared.platform().getDirectory(),
schematicFolder + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + this.getWorldName() "schematics/GEN_ROAD_SCHEMATIC/" + this.getWorldName()
); );
} }

View File

@@ -164,7 +164,7 @@ public class PlotListener {
try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) { try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
Plot last = lastPlot.get().orElse(null); Plot last = lastPlot.get().orElse(null);
if ((last != null) && !last.getId().equals(plot.getId())) { if ((last != null) && !last.getId().equals(plot.getId())) {
plotExit(player, last, plot, plot.getArea()); plotExit(player, last);
} }
if (PlotSquared.platform().expireManager() != null) { if (PlotSquared.platform().expireManager() != null) {
PlotSquared.platform().expireManager().handleEntry(player, plot); PlotSquared.platform().expireManager().handleEntry(player, plot);
@@ -365,12 +365,7 @@ public class PlotListener {
return true; return true;
} }
public boolean plotExit( public boolean plotExit(final PlotPlayer<?> player, Plot plot) {
final PlotPlayer<?> player,
@NonNull Plot plot,
@Nullable Plot nextPlot,
@Nullable PlotArea nextArea
) {
try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) { try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
final Plot previous = lastPlot.remove(); final Plot previous = lastPlot.remove();
@@ -387,10 +382,8 @@ public class PlotListener {
if (plot.hasOwner()) { if (plot.hasOwner()) {
PlotArea pw = plot.getArea(); PlotArea pw = plot.getArea();
if (pw == null) { if (pw == null) {
if (nextPlot == null || nextPlot.getArea() == null) {
return true; return true;
} }
}
try (final MetaDataAccess<Boolean> kickAccess = try (final MetaDataAccess<Boolean> kickAccess =
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) { player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
if (plot.getFlag(DenyExitFlag.class) && !player.hasPermission(Permission.PERMISSION_ADMIN_EXIT_DENIED) && if (plot.getFlag(DenyExitFlag.class) && !player.hasPermission(Permission.PERMISSION_ADMIN_EXIT_DENIED) &&
@@ -447,17 +440,6 @@ public class PlotListener {
player.setFlight(value.get()); player.setFlight(value.get());
metaDataAccess.remove(); metaDataAccess.remove();
} else { } else {
FlyFlag.FlyStatus flight = FlyFlag.FlyStatus.DEFAULT;
if (nextPlot != null) {
flight = nextPlot.getFlag(FlyFlag.class);
} else if (nextArea != null) {
if (nextArea.isRoadFlags()) {
flight = nextArea.getRoadFlag(FlyFlag.class);
} else {
flight = nextArea.getFlag(FlyFlag.class);
}
}
if (flight != FlyFlag.FlyStatus.ENABLED) {
GameMode gameMode = player.getGameMode(); GameMode gameMode = player.getGameMode();
if (gameMode == GameModes.SURVIVAL || gameMode == GameModes.ADVENTURE) { if (gameMode == GameModes.SURVIVAL || gameMode == GameModes.ADVENTURE) {
player.setFlight(false); player.setFlight(false);
@@ -467,7 +449,6 @@ public class PlotListener {
} }
} }
} }
}
if (plot.getFlag(TimeFlag.class) != TimeFlag.TIME_DISABLED.getValue().longValue()) { if (plot.getFlag(TimeFlag.class) != TimeFlag.TIME_DISABLED.getValue().longValue()) {
player.setTime(Long.MAX_VALUE); player.setTime(Long.MAX_VALUE);

View File

@@ -290,7 +290,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
* *
* @return the plot the player is standing on or null if standing on a road or not in a {@link PlotArea} * @return the plot the player is standing on or null if standing on a road or not in a {@link PlotArea}
*/ */
public @Nullable Plot getCurrentPlot() { public Plot getCurrentPlot() {
try (final MetaDataAccess<Plot> lastPlotAccess = try (final MetaDataAccess<Plot> lastPlotAccess =
this.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) { this.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
if (lastPlotAccess.get().orElse(null) == null && !Settings.Enabled_Components.EVENTS) { if (lastPlotAccess.get().orElse(null) == null && !Settings.Enabled_Components.EVENTS) {
@@ -319,7 +319,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
*/ */
public int getPlotCount() { public int getPlotCount() {
if (!Settings.Limit.GLOBAL) { if (!Settings.Limit.GLOBAL) {
return getPlotCount(getContextualWorldName()); return getPlotCount(getLocation().getWorldName());
} }
final AtomicInteger count = new AtomicInteger(0); final AtomicInteger count = new AtomicInteger(0);
final UUID uuid = getUUID(); final UUID uuid = getUUID();
@@ -339,7 +339,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
public int getClusterCount() { public int getClusterCount() {
if (!Settings.Limit.GLOBAL) { if (!Settings.Limit.GLOBAL) {
return getClusterCount(getContextualWorldName()); return getClusterCount(getLocation().getWorldName());
} }
final AtomicInteger count = new AtomicInteger(0); final AtomicInteger count = new AtomicInteger(0);
this.plotAreaManager.forEachPlotArea(value -> { this.plotAreaManager.forEachPlotArea(value -> {
@@ -352,34 +352,6 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
return count.get(); return count.get();
} }
/**
* {@return the world name at the player's contextual position}
* The contextual position can be affected when using a command with
* an explicit plot override, e.g., {@code /plot <id> info}.
*/
private @NonNull String getContextualWorldName() {
Plot current = getCurrentPlot();
if (current != null) {
return current.getWorldName();
}
return getLocation().getWorldName();
}
/**
* {@return the plot area at the player's contextual position}
* The contextual position can be affected when using a command with
* an explicit plot override, e.g., {@code /plot <id> info}.
*
* @since 7.5.9
*/
public @Nullable PlotArea getContextualPlotArea() {
Plot current = getCurrentPlot();
if (current != null) {
return current.getArea();
}
return getLocation().getPlotArea();
}
/** /**
* Get the number of plots this player owns in the world. * Get the number of plots this player owns in the world.
* *
@@ -436,12 +408,8 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
} }
public PlotArea getApplicablePlotArea() { public PlotArea getApplicablePlotArea() {
Plot plot = getCurrentPlot();
if (plot == null) {
return this.plotAreaManager.getApplicablePlotArea(getLocation()); return this.plotAreaManager.getApplicablePlotArea(getLocation());
} }
return plot.getArea();
}
@Override @Override
public @NonNull RequiredType getSuperCaller() { public @NonNull RequiredType getSuperCaller() {
@@ -476,7 +444,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
/** /**
* Get this player's UUID. * Get this player's UUID.
* <p>=== !IMPORTANT ===</p> * === !IMPORTANT ===<br>
* The UUID is dependent on the mode chosen in the settings.yml and may not be the same as Bukkit has * The UUID is dependent on the mode chosen in the settings.yml and may not be the same as Bukkit has
* (especially if using an old version of Bukkit that does not support UUIDs) * (especially if using an old version of Bukkit that does not support UUIDs)
* *
@@ -646,16 +614,16 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
PlotId id = plot.getId(); PlotId id = plot.getId();
int x = id.getX(); int x = id.getX();
int z = id.getY(); int z = id.getY();
ByteBuffer buffer = ByteBuffer.allocate(14); ByteBuffer buffer = ByteBuffer.allocate(13);
buffer.putShort((short) x); buffer.putShort((short) x);
buffer.putShort((short) z); buffer.putShort((short) z);
Location location = getLocation(); Location location = getLocation();
buffer.putInt(location.getX()); buffer.putInt(location.getX());
buffer.putShort((short) location.getY()); buffer.put((byte) location.getY());
buffer.putInt(location.getZ()); buffer.putInt(location.getZ());
setPersistentMeta("quitLocV2", buffer.array()); setPersistentMeta("quitLoc", buffer.array());
} else if (hasPersistentMeta("quitLocV2")) { } else if (hasPersistentMeta("quitLoc")) {
removePersistentMeta("quitLocV2"); removePersistentMeta("quitLoc");
} }
if (plot != null) { if (plot != null) {
this.eventDispatcher.callLeave(this, plot); this.eventDispatcher.callLeave(this, plot);
@@ -710,8 +678,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
public void populatePersistentMetaMap() { public void populatePersistentMetaMap() {
if (Settings.Enabled_Components.PERSISTENT_META) { if (Settings.Enabled_Components.PERSISTENT_META) {
DBFunc.getPersistentMeta( DBFunc.getPersistentMeta(getUUID(), new RunnableVal<>() {
getUUID(), new RunnableVal<>() {
@Override @Override
public void run(Map<String, byte[]> value) { public void run(Map<String, byte[]> value) {
try { try {
@@ -733,18 +700,11 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
return; return;
} }
PlotArea area = ((SinglePlotAreaManager) manager).getArea(); PlotArea area = ((SinglePlotAreaManager) manager).getArea();
boolean V2 = false;
byte[] arr = PlotPlayer.this.getPersistentMeta("quitLoc"); byte[] arr = PlotPlayer.this.getPersistentMeta("quitLoc");
if (arr == null) {
arr = PlotPlayer.this.getPersistentMeta("quitLocV2");
if (arr == null) { if (arr == null) {
return; return;
} }
V2 = true;
removePersistentMeta("quitLocV2");
} else {
removePersistentMeta("quitLoc"); removePersistentMeta("quitLoc");
}
if (!getMeta("teleportOnLogin", true)) { if (!getMeta("teleportOnLogin", true)) {
return; return;
@@ -754,7 +714,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
final int plotZ = quitWorld.getShort(); final int plotZ = quitWorld.getShort();
PlotId id = PlotId.of(plotX, plotZ); PlotId id = PlotId.of(plotX, plotZ);
int x = quitWorld.getInt(); int x = quitWorld.getInt();
int y = V2 ? quitWorld.getShort() : (quitWorld.get() & 0xFF); int y = quitWorld.get() & 0xFF;
int z = quitWorld.getInt(); int z = quitWorld.getInt();
Plot plot = area.getOwnedPlot(id); Plot plot = area.getOwnedPlot(id);
@@ -788,11 +748,10 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
} }
} }
} catch (Throwable e) { } catch (Throwable e) {
LOGGER.error("Error populating persistent meta for player {}", PlotPlayer.this.getName(), e); e.printStackTrace();
} }
} }
} });
);
} }
} }
@@ -860,8 +819,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Nullable @Nullable <T> T getPersistentMeta(final @NonNull MetaDataKey<T> key) {
<T> T getPersistentMeta(final @NonNull MetaDataKey<T> key) {
final byte[] value = this.getPersistentMeta(key.toString()); final byte[] value = this.getPersistentMeta(key.toString());
if (value == null) { if (value == null) {
return null; return null;
@@ -1031,11 +989,9 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
if (throwable != null) { if (throwable != null) {
sendMessage( sendMessage(
TranslatableCaption.of("errors.error"), TranslatableCaption.of("errors.error"),
TagResolver.resolver( TagResolver.resolver("value", Tag.inserting(
"value", Tag.inserting(
Component.text("Failed to resolve asynchronous caption replacements") Component.text("Failed to resolve asynchronous caption replacements")
) ))
)
); );
LOGGER.error("Failed to resolve asynchronous tagresolver(s) for " + caption, throwable); LOGGER.error("Failed to resolve asynchronous tagresolver(s) for " + caption, throwable);
} else { } else {

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.StaticCaption;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.database.DBFunc;
import com.plotsquared.core.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.events.PlayerTeleportToPlotEvent; import com.plotsquared.core.events.PlayerTeleportToPlotEvent;
import com.plotsquared.core.events.Result; import com.plotsquared.core.events.Result;
import com.plotsquared.core.events.TeleportCause; import com.plotsquared.core.events.TeleportCause;
@@ -322,8 +321,7 @@ public class Plot {
} }
/** /**
* Get the plot from a string. Performs a check to ensure Plot#getBottomAbs is not outside world bounds * Get the plot from a string.
* (x/z +/- 30,000,000) to prevent crashes
* *
* @param player Provides a context for what world to search in. Prefixing the term with 'world_name;' will override this context. * @param player Provides a context for what world to search in. Prefixing the term with 'world_name;' will override this context.
* @param arg The search term * @param arg The search term
@@ -334,31 +332,6 @@ public class Plot {
final @Nullable PlotPlayer<?> player, final @Nullable PlotPlayer<?> player,
final @Nullable String arg, final @Nullable String arg,
final boolean message final boolean message
) {
Plot plot = getPlotFromStringUnchecked(player, arg, message);
if (plot != null && !WorldUtil.isValidLocation(plot.getBottomAbs())) {
if (message) {
(player == null ? ConsolePlayer.getConsole() : player).sendMessage(TranslatableCaption.of(
"invalid.world_location_plot"));
}
return null;
}
return plot;
}
/**
* Get the plot from a string. Does not perform a check on world bounds.
*
* @param player Provides a context for what world to search in. Prefixing the term with 'world_name;' will override this context.
* @param arg The search term
* @param message If a message should be sent to the player if a plot cannot be found
* @return The plot if only 1 result is found, or null
* @since 7.5.5
*/
public static @Nullable Plot getPlotFromStringUnchecked(
final @Nullable PlotPlayer<?> player,
final @Nullable String arg,
final boolean message
) { ) {
if (arg == null) { if (arg == null) {
if (player == null) { if (player == null) {
@@ -416,51 +389,13 @@ public class Plot {
} }
/** /**
* Gets a plot from a string e.g. [area];[id]. Performs a check to ensure Plot#getBottomAbs is not outside world bounds * Gets a plot from a string e.g. [area];[id]
* (x/z +/- 30,000,000) to prevent crashes
* *
* @param defaultArea if no area is specified * @param defaultArea if no area is specified
* @param string plot id/area + id * @param string plot id/area + id
* @return New or existing plot object * @return New or existing plot object
*/ */
public static @Nullable Plot fromString(final @Nullable PlotArea defaultArea, final @NonNull String string) { public static @Nullable Plot fromString(final @Nullable PlotArea defaultArea, final @NonNull String string) {
return fromString(defaultArea, string, null);
}
/**
* Gets a plot from a string e.g. [area];[id]. Performs a check to ensure Plot#getBottomAbs is not outside world bounds
* (x/z +/- 30,000,000) to prevent crashes
*
* @param defaultArea if no area is specified
* @param string plot id/area + id
* @param player {@link PlotPlayer} player to notify if plot is invalid (outside bounds)
* @return New or existing plot object
* @since 7.5.5
*/
public static @Nullable Plot fromString(
final @Nullable PlotArea defaultArea,
final @NonNull String string,
final @Nullable PlotPlayer<?> player
) {
Plot plot = fromStringUnchecked(defaultArea, string);
if (plot != null && !WorldUtil.isValidLocation(plot.getBottomAbs())) {
if (player != null) {
player.sendMessage(TranslatableCaption.of("invalid.world_location_plot"));
}
return null;
}
return plot;
}
/**
* Gets a plot from a string e.g. [area];[id]. Does not perform a check on world bounds.
*
* @param defaultArea if no area is specified
* @param string plot id/area + id
* @return New or existing plot object
* @since 7.5.5
*/
public static @Nullable Plot fromStringUnchecked(final @Nullable PlotArea defaultArea, final @NonNull String string) {
final String[] split = string.split("[;,]"); final String[] split = string.split("[;,]");
if (split.length == 2) { if (split.length == 2) {
if (defaultArea != null) { if (defaultArea != null) {
@@ -484,8 +419,7 @@ public class Plot {
} }
/** /**
* Return a new/cached plot object at a given location. Does not check world bounds for potential crashes, these should be * Return a new/cached plot object at a given location.
* performed before (or after) this method is used.
* *
* <p> * <p>
* Use {@link PlotPlayer#getCurrentPlot()} if a player is expected here. * Use {@link PlotPlayer#getCurrentPlot()} if a player is expected here.
@@ -542,7 +476,7 @@ public class Plot {
* *
* @return World name * @return World name
*/ */
public @NonNull String getWorldName() { public @Nullable String getWorldName() {
return area.getWorldName(); return area.getWorldName();
} }
@@ -975,10 +909,7 @@ public class Plot {
* Sets the denied users for this plot. * Sets the denied users for this plot.
* *
* @param uuids uuids to deny * @param uuids uuids to deny
* @deprecated Use {@link Plot#addDenied(UUID)} (UUID)} calling
* {@link EventDispatcher#callPlayerDeny(PlotPlayer, Plot, UUID, PlayerPlotAddRemoveEvent.Reason)} for each.
*/ */
@Deprecated
public void setDenied(final @NonNull Set<UUID> uuids) { public void setDenied(final @NonNull Set<UUID> uuids) {
boolean larger = uuids.size() > getDenied().size(); boolean larger = uuids.size() > getDenied().size();
HashSet<UUID> intersection; HashSet<UUID> intersection;
@@ -1019,10 +950,7 @@ public class Plot {
* Sets the trusted users for this plot. * Sets the trusted users for this plot.
* *
* @param uuids uuids to trust * @param uuids uuids to trust
* @deprecated Use {@link Plot#addTrusted(UUID)} calling
* {@link EventDispatcher#callPlayerTrust(PlotPlayer, Plot, UUID, PlayerPlotAddRemoveEvent.Reason)} for each.
*/ */
@Deprecated
public void setTrusted(final @NonNull Set<UUID> uuids) { public void setTrusted(final @NonNull Set<UUID> uuids) {
boolean larger = uuids.size() > getTrusted().size(); boolean larger = uuids.size() > getTrusted().size();
HashSet<UUID> intersection = new HashSet<>(larger ? getTrusted() : uuids); HashSet<UUID> intersection = new HashSet<>(larger ? getTrusted() : uuids);
@@ -1054,10 +982,7 @@ public class Plot {
* Sets the members for this plot. * Sets the members for this plot.
* *
* @param uuids uuids to set member status for * @param uuids uuids to set member status for
* @deprecated Use {@link Plot#addMember(UUID)} (UUID)} (UUID)} calling
* {@link EventDispatcher#callPlayerAdd(PlotPlayer, Plot, UUID, PlayerPlotAddRemoveEvent.Reason)} for each.
*/ */
@Deprecated
public void setMembers(final @NonNull Set<UUID> uuids) { public void setMembers(final @NonNull Set<UUID> uuids) {
boolean larger = uuids.size() > getMembers().size(); boolean larger = uuids.size() > getMembers().size();
HashSet<UUID> intersection = new HashSet<>(larger ? getMembers() : uuids); HashSet<UUID> intersection = new HashSet<>(larger ? getMembers() : uuids);
@@ -1350,7 +1275,7 @@ public class Plot {
for (Plot current : getConnectedPlots()) { for (Plot current : getConnectedPlots()) {
List<PlotPlayer<?>> players = current.getPlayersInPlot(); List<PlotPlayer<?>> players = current.getPlayersInPlot();
for (PlotPlayer<?> pp : players) { for (PlotPlayer<?> pp : players) {
this.plotListener.plotExit(pp, current, null, area); this.plotListener.plotExit(pp, current);
} }
if (Settings.Backup.DELETE_ON_UNCLAIM) { if (Settings.Backup.DELETE_ON_UNCLAIM) {
@@ -1792,7 +1717,6 @@ public class Plot {
} }
player.sendMessage( player.sendMessage(
TranslatableCaption.of("working.claimed"), TranslatableCaption.of("working.claimed"),
TagResolver.resolver("world", Tag.inserting(Component.text(this.getWorldName()))),
TagResolver.resolver("plot", Tag.inserting(Component.text(this.getId().toString()))) TagResolver.resolver("plot", Tag.inserting(Component.text(this.getId().toString())))
); );
if (teleport) { if (teleport) {
@@ -2312,53 +2236,23 @@ public class Plot {
this.setAlias(plot.getAlias()); this.setAlias(plot.getAlias());
} }
for (UUID uuid : this.getTrusted()) { for (UUID uuid : this.getTrusted()) {
if (eventDispatcher
.callPlayerTrust(null, plot, uuid, PlayerPlotAddRemoveEvent.Reason.MERGE)
.getEventResult() != Result.DENY) {
plot.addTrusted(uuid); plot.addTrusted(uuid);
eventDispatcher.callPostTrusted(null, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
} }
for (UUID uuid : plot.getTrusted()) { for (UUID uuid : plot.getTrusted()) {
if (eventDispatcher
.callPlayerTrust(null, this, uuid, PlayerPlotAddRemoveEvent.Reason.MERGE)
.getEventResult() != Result.DENY) {
this.addTrusted(uuid); this.addTrusted(uuid);
eventDispatcher.callPostTrusted(null, this, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
} }
for (UUID uuid : this.getMembers()) { for (UUID uuid : this.getMembers()) {
if (eventDispatcher
.callPlayerAdd(null, plot, uuid, PlayerPlotAddRemoveEvent.Reason.MERGE)
.getEventResult() != Result.DENY) {
plot.addMember(uuid); plot.addMember(uuid);
eventDispatcher.callPostAdded(null, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
} }
for (UUID uuid : plot.getMembers()) { for (UUID uuid : plot.getMembers()) {
if (eventDispatcher
.callPlayerAdd(null, this, uuid, PlayerPlotAddRemoveEvent.Reason.MERGE)
.getEventResult() != Result.DENY) {
this.addMember(uuid); this.addMember(uuid);
eventDispatcher.callPostAdded(null, this, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
} }
for (UUID uuid : this.getDenied()) { for (UUID uuid : this.getDenied()) {
if (eventDispatcher
.callPlayerDeny(null, plot, uuid, PlayerPlotAddRemoveEvent.Reason.MERGE)
.getEventResult() != Result.DENY) {
plot.addDenied(uuid); plot.addDenied(uuid);
eventDispatcher.callPostDenied(null, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
} }
for (UUID uuid : plot.getDenied()) { for (UUID uuid : plot.getDenied()) {
if (eventDispatcher
.callPlayerDeny(null, this, uuid, PlayerPlotAddRemoveEvent.Reason.MERGE)
.getEventResult() != Result.DENY) {
this.addDenied(uuid); this.addDenied(uuid);
eventDispatcher.callPostDenied(null, this, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
} }
} }
@@ -2634,7 +2528,7 @@ public class Plot {
public void reEnter() { public void reEnter() {
TaskManager.runTaskLater(() -> { TaskManager.runTaskLater(() -> {
for (PlotPlayer<?> pp : Plot.this.getPlayersInPlot()) { for (PlotPlayer<?> pp : Plot.this.getPlayersInPlot()) {
this.plotListener.plotExit(pp, Plot.this, Plot.this, area); this.plotListener.plotExit(pp, Plot.this);
this.plotListener.plotEntry(pp, Plot.this); this.plotListener.plotEntry(pp, Plot.this);
} }
}, TaskTime.ticks(1L)); }, TaskTime.ticks(1L));

View File

@@ -21,7 +21,6 @@ package com.plotsquared.core.plot;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.inject.Inject;
import com.plotsquared.core.PlotSquared; import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.collection.QuadMap; import com.plotsquared.core.collection.QuadMap;
import com.plotsquared.core.configuration.ConfigurationNode; import com.plotsquared.core.configuration.ConfigurationNode;
@@ -30,8 +29,6 @@ import com.plotsquared.core.configuration.ConfigurationUtil;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.configuration.file.YamlConfiguration; import com.plotsquared.core.configuration.file.YamlConfiguration;
import com.plotsquared.core.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.generator.GridPlotWorld; import com.plotsquared.core.generator.GridPlotWorld;
import com.plotsquared.core.generator.IndependentPlotGenerator; import com.plotsquared.core.generator.IndependentPlotGenerator;
import com.plotsquared.core.inject.annotations.WorldConfig; import com.plotsquared.core.inject.annotations.WorldConfig;
@@ -50,7 +47,6 @@ import com.plotsquared.core.plot.flag.PlotFlag;
import com.plotsquared.core.plot.flag.implementations.DoneFlag; import com.plotsquared.core.plot.flag.implementations.DoneFlag;
import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.queue.GlobalBlockQueue;
import com.plotsquared.core.queue.QueueCoordinator; import com.plotsquared.core.queue.QueueCoordinator;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.PlotExpression; import com.plotsquared.core.util.PlotExpression;
import com.plotsquared.core.util.RegionUtil; import com.plotsquared.core.util.RegionUtil;
@@ -159,9 +155,6 @@ public abstract class PlotArea implements ComponentLike {
private QuadMap<PlotCluster> clusters; private QuadMap<PlotCluster> clusters;
private String signMaterial = "OAK_WALL_SIGN"; private String signMaterial = "OAK_WALL_SIGN";
private String legacySignMaterial = "WALL_SIGN"; private String legacySignMaterial = "WALL_SIGN";
// These will be injected
@Inject
private EventDispatcher eventDispatcher;
public PlotArea( public PlotArea(
final @NonNull String worldName, final @Nullable String id, final @NonNull String worldName, final @Nullable String id,
@@ -1111,44 +1104,9 @@ public abstract class PlotArea implements ComponentLike {
final PlotId id = PlotId.of(x, y); final PlotId id = PlotId.of(x, y);
final Plot plot = getPlotAbs(id); final Plot plot = getPlotAbs(id);
Set<UUID> currentlyTrusted = plot.getTrusted(); plot.setTrusted(trusted);
trusted.forEach(uuid -> { plot.setMembers(members);
if (!currentlyTrusted.contains(uuid) && eventDispatcher.callPlayerTrust( plot.setDenied(denied);
null,
plot,
uuid,
PlayerPlotAddRemoveEvent.Reason.MERGE
).getEventResult() != Result.DENY) {
plot.addTrusted(uuid);
eventDispatcher.callPostTrusted(null, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
});
Set<UUID> currentlyAdded = plot.getMembers();
members.forEach(uuid -> {
if (!currentlyAdded.contains(uuid) && eventDispatcher.callPlayerAdd(
null,
plot,
uuid,
PlayerPlotAddRemoveEvent.Reason.MERGE
).getEventResult() != Result.DENY) {
plot.addMember(uuid);
eventDispatcher.callPostAdded(null, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
});
Set<UUID> currentlyDenied = plot.getDenied();
denied.forEach(uuid -> {
if (!currentlyDenied.contains(uuid) && eventDispatcher.callPlayerDeny(
null,
plot,
uuid,
PlayerPlotAddRemoveEvent.Reason.MERGE
).getEventResult() != Result.DENY) {
plot.addDenied(uuid);
eventDispatcher.callPostDenied(null, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
});
Plot plot2; Plot plot2;
if (lx) { if (lx) {

View File

@@ -371,7 +371,8 @@ public final class PlotModificationManager {
manager.createRoadSouthEast(current, queue); manager.createRoadSouthEast(current, queue);
} }
} }
} else if (current.isMerged(Direction.SOUTH)) { }
if (current.isMerged(Direction.SOUTH)) {
manager.createRoadSouth(current, queue); manager.createRoadSouth(current, queue);
} }
} }

View File

@@ -63,18 +63,4 @@ public class PlotTitle {
return subtitle; return subtitle;
} }
/**
* Provides a string representation of this plot title value (used in placeholders).
*
* @return the plot title representation in the format {@code "<title>" "<subtitle>"}
* @since 7.5.5
*/
@Override
public String toString() {
return "\"%s\" \"%s\"".formatted(
this.title != null ? this.title : "",
this.subtitle != null ? this.subtitle : ""
);
}
} }

View File

@@ -58,7 +58,7 @@ public class SinglePlot extends Plot {
} }
@Override @Override
public @NonNull String getWorldName() { public String getWorldName() {
return getId().toUnderscoreSeparatedString(); return getId().toUnderscoreSeparatedString();
} }

View File

@@ -29,14 +29,9 @@ import com.plotsquared.core.events.PlayerBuyPlotEvent;
import com.plotsquared.core.events.PlayerClaimPlotEvent; import com.plotsquared.core.events.PlayerClaimPlotEvent;
import com.plotsquared.core.events.PlayerEnterPlotEvent; import com.plotsquared.core.events.PlayerEnterPlotEvent;
import com.plotsquared.core.events.PlayerLeavePlotEvent; import com.plotsquared.core.events.PlayerLeavePlotEvent;
import com.plotsquared.core.events.PlayerPlotAddEvent;
import com.plotsquared.core.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.events.PlayerPlotDeniedEvent; import com.plotsquared.core.events.PlayerPlotDeniedEvent;
import com.plotsquared.core.events.PlayerPlotDenyEvent;
import com.plotsquared.core.events.PlayerPlotHelperEvent; import com.plotsquared.core.events.PlayerPlotHelperEvent;
import com.plotsquared.core.events.PlayerPlotLimitEvent; import com.plotsquared.core.events.PlayerPlotLimitEvent;
import com.plotsquared.core.events.PlayerPlotRemoveEvent;
import com.plotsquared.core.events.PlayerPlotTrustEvent;
import com.plotsquared.core.events.PlayerPlotTrustedEvent; import com.plotsquared.core.events.PlayerPlotTrustedEvent;
import com.plotsquared.core.events.PlayerTeleportToPlotEvent; import com.plotsquared.core.events.PlayerTeleportToPlotEvent;
import com.plotsquared.core.events.PlotAutoMergeEvent; import com.plotsquared.core.events.PlotAutoMergeEvent;
@@ -56,9 +51,6 @@ import com.plotsquared.core.events.RemoveRoadEntityEvent;
import com.plotsquared.core.events.TeleportCause; import com.plotsquared.core.events.TeleportCause;
import com.plotsquared.core.events.post.PostPlayerAutoPlotEvent; import com.plotsquared.core.events.post.PostPlayerAutoPlotEvent;
import com.plotsquared.core.events.post.PostPlayerBuyPlotEvent; import com.plotsquared.core.events.post.PostPlayerBuyPlotEvent;
import com.plotsquared.core.events.post.PostPlayerPlotAddedEvent;
import com.plotsquared.core.events.post.PostPlayerPlotDeniedEvent;
import com.plotsquared.core.events.post.PostPlayerPlotTrustedEvent;
import com.plotsquared.core.events.post.PostPlotChangeOwnerEvent; import com.plotsquared.core.events.post.PostPlotChangeOwnerEvent;
import com.plotsquared.core.events.post.PostPlotClearEvent; import com.plotsquared.core.events.post.PostPlotClearEvent;
import com.plotsquared.core.events.post.PostPlotDeleteEvent; import com.plotsquared.core.events.post.PostPlotDeleteEvent;
@@ -266,7 +258,6 @@ public class EventDispatcher {
return event; return event;
} }
@Deprecated(forRemoval = true, since = "TODO")
public PlayerPlotDeniedEvent callDenied( public PlayerPlotDeniedEvent callDenied(
PlotPlayer<?> initiator, Plot plot, UUID player, PlotPlayer<?> initiator, Plot plot, UUID player,
boolean added boolean added
@@ -276,7 +267,6 @@ public class EventDispatcher {
return event; return event;
} }
@Deprecated(forRemoval = true, since = "TODO")
public PlayerPlotTrustedEvent callTrusted( public PlayerPlotTrustedEvent callTrusted(
PlotPlayer<?> initiator, Plot plot, UUID player, PlotPlayer<?> initiator, Plot plot, UUID player,
boolean added boolean added
@@ -286,7 +276,6 @@ public class EventDispatcher {
return event; return event;
} }
@Deprecated(forRemoval = true, since = "TODO")
public PlayerPlotHelperEvent callMember( public PlayerPlotHelperEvent callMember(
PlotPlayer<?> initiator, Plot plot, UUID player, PlotPlayer<?> initiator, Plot plot, UUID player,
boolean added boolean added
@@ -296,62 +285,6 @@ public class EventDispatcher {
return event; return event;
} }
public PostPlayerPlotDeniedEvent callPostDenied(
PlotPlayer<?> initiator, Plot plot, UUID player, boolean added, PlayerPlotAddRemoveEvent.Reason reason
) {
PostPlayerPlotDeniedEvent event = new PostPlayerPlotDeniedEvent(initiator, plot, player, added, reason);
callEvent(event);
return event;
}
public PostPlayerPlotTrustedEvent callPostTrusted(
PlotPlayer<?> initiator, Plot plot, UUID player, boolean added, PlayerPlotAddRemoveEvent.Reason reason
) {
PostPlayerPlotTrustedEvent event = new PostPlayerPlotTrustedEvent(initiator, plot, player, added, reason);
callEvent(event);
return event;
}
public PostPlayerPlotAddedEvent callPostAdded(
PlotPlayer<?> initiator, Plot plot, UUID player, boolean added, PlayerPlotAddRemoveEvent.Reason reason
) {
PostPlayerPlotAddedEvent event = new PostPlayerPlotAddedEvent(initiator, plot, player, added, reason);
callEvent(event);
return event;
}
public PlayerPlotDenyEvent callPlayerDeny(
PlotPlayer<?> initiator, Plot plot, UUID player, PlayerPlotAddRemoveEvent.Reason reason
) {
PlayerPlotDenyEvent event = new PlayerPlotDenyEvent(initiator, plot, player, reason);
callEvent(event);
return event;
}
public PlayerPlotTrustEvent callPlayerTrust(
PlotPlayer<?> initiator, Plot plot, UUID player, PlayerPlotAddRemoveEvent.Reason reason
) {
PlayerPlotTrustEvent event = new PlayerPlotTrustEvent(initiator, plot, player, reason);
callEvent(event);
return event;
}
public PlayerPlotAddEvent callPlayerAdd(
PlotPlayer<?> initiator, Plot plot, UUID player, PlayerPlotAddRemoveEvent.Reason reason
) {
PlayerPlotAddEvent event = new PlayerPlotAddEvent(initiator, plot, player, reason);
callEvent(event);
return event;
}
public PlayerPlotRemoveEvent callPlayerRemove(
PlotPlayer<?> initiator, Plot plot, UUID player, PlayerPlotAddRemoveEvent.Reason reason
) {
PlayerPlotRemoveEvent event = new PlayerPlotRemoveEvent(initiator, plot, player, reason);
callEvent(event);
return event;
}
public PlotChangeOwnerEvent callOwnerChange( public PlotChangeOwnerEvent callOwnerChange(
PlotPlayer<?> initiator, Plot plot, UUID oldOwner, PlotPlayer<?> initiator, Plot plot, UUID oldOwner,
UUID newOwner, boolean hasOldOwner UUID newOwner, boolean hasOldOwner

View File

@@ -135,7 +135,6 @@ public abstract class SchematicHandler {
} }
final String filename; final String filename;
final String website; final String website;
final @Nullable UUID finalUuid = uuid;
if (uuid == null) { if (uuid == null) {
uuid = UUID.randomUUID(); uuid = UUID.randomUUID();
website = Settings.Web.URL + "upload.php?" + uuid; website = Settings.Web.URL + "upload.php?" + uuid;
@@ -145,11 +144,10 @@ public abstract class SchematicHandler {
filename = file + '.' + extension; filename = file + '.' + extension;
} }
final URL url; final URL url;
String uri = Settings.Web.URL + "?key=" + uuid + "&type=" + extension;
try { try {
url = URI.create(uri).toURL(); url = URI.create(Settings.Web.URL + "?key=" + uuid + "&type=" + extension).toURL();
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
LOGGER.error("Malformed URI `{}`", uri, e); e.printStackTrace();
whenDone.run(); whenDone.run();
return; return;
} }
@@ -195,7 +193,7 @@ public abstract class SchematicHandler {
} }
TaskManager.runTask(whenDone); TaskManager.runTask(whenDone);
} catch (IOException e) { } catch (IOException e) {
LOGGER.error("Error while uploading schematic for UUID {}", finalUuid, e); e.printStackTrace();
TaskManager.runTask(whenDone); TaskManager.runTask(whenDone);
} }
}); });
@@ -390,14 +388,8 @@ public abstract class SchematicHandler {
} }
queue.enqueue(); queue.enqueue();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
TaskManager.runTask(whenDone); TaskManager.runTask(whenDone);
LOGGER.error(
"Error pasting schematic to plot {};{} for player {}",
plot.getArea(),
plot.getId(),
actor == null ? "null" : actor.getName(),
e
);
} }
} }
@@ -464,7 +456,7 @@ public abstract class SchematicHandler {
Clipboard clip = reader.read(); Clipboard clip = reader.read();
return new Schematic(clip); return new Schematic(clip);
} catch (IOException e) { } catch (IOException e) {
LOGGER.error("Error reading schematic from file {}", file.getAbsolutePath(), e); e.printStackTrace();
} }
} else { } else {
throw new UnsupportedFormatException("This schematic format is not recognised or supported."); throw new UnsupportedFormatException("This schematic format is not recognised or supported.");
@@ -478,7 +470,7 @@ public abstract class SchematicHandler {
InputStream inputStream = Channels.newInputStream(readableByteChannel); InputStream inputStream = Channels.newInputStream(readableByteChannel);
return getSchematic(inputStream); return getSchematic(inputStream);
} catch (IOException e) { } catch (IOException e) {
LOGGER.error("Error reading schematic from {}", url, e); e.printStackTrace();
} }
return null; return null;
} }
@@ -494,7 +486,7 @@ public abstract class SchematicHandler {
Clipboard clip = schematicReader.read(); Clipboard clip = schematicReader.read();
return new Schematic(clip); return new Schematic(clip);
} catch (IOException e) { } catch (IOException e) {
LOGGER.error("Error reading schematic", e); e.printStackTrace();
} }
} }
return null; return null;
@@ -523,7 +515,7 @@ public abstract class SchematicHandler {
} }
return schematics; return schematics;
} catch (JsonParseException | IOException e) { } catch (JsonParseException | IOException e) {
LOGGER.error("Error retrieving saves for UUID {}", uuid, e); e.printStackTrace();
} }
return null; return null;
} }
@@ -540,7 +532,7 @@ public abstract class SchematicHandler {
try (NBTOutputStream nos = new NBTOutputStream(new GZIPOutputStream(output, true))) { try (NBTOutputStream nos = new NBTOutputStream(new GZIPOutputStream(output, true))) {
nos.writeNamedTag("Schematic", tag); nos.writeNamedTag("Schematic", tag);
} catch (IOException e1) { } catch (IOException e1) {
LOGGER.error("Error uploading schematic for UUID {}", uuid, e1); e1.printStackTrace();
} }
} }
}, whenDone); }, whenDone);
@@ -564,9 +556,9 @@ public abstract class SchematicHandler {
nbtStream.writeNamedTag("Schematic", tag); nbtStream.writeNamedTag("Schematic", tag);
} }
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
LOGGER.error("Error saving schematic at {}", path, e); e.printStackTrace();
} catch (IOException e) { } catch (IOException e) {
LOGGER.error("Error saving schematic at {}", path, e); e.printStackTrace();
return false; return false;
} }
return true; return true;
@@ -589,7 +581,7 @@ public abstract class SchematicHandler {
schematic.put("BlockData", new ByteArrayTag(buffer.toByteArray())); schematic.put("BlockData", new ByteArrayTag(buffer.toByteArray()));
schematic.put("BlockEntities", new ListTag(CompoundTag.class, tileEntities)); schematic.put("BlockEntities", new ListTag(CompoundTag.class, tileEntities));
if (biomeBuffer.size() == 0 || biomePalette.isEmpty()) { if (biomeBuffer.size() == 0 || biomePalette.size() == 0) {
return; return;
} }
@@ -741,7 +733,10 @@ public abstract class SchematicHandler {
} }
BaseBlock block = aabb.getWorld().getFullBlock(point); BaseBlock block = aabb.getWorld().getFullBlock(point);
if (block.getNbtData() != null) { if (block.getNbtData() != null) {
Map<String, Tag> values = new HashMap<>(block.getNbtData().getValue()); Map<String, Tag> values = new HashMap<>();
for (Map.Entry<String, Tag> entry : block.getNbtData().getValue().entrySet()) {
values.put(entry.getKey(), entry.getValue());
}
// Positions are kept in NBT, we don't want that. // Positions are kept in NBT, we don't want that.
values.remove("x"); values.remove("x");

View File

@@ -0,0 +1,50 @@
/*
* 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.comparator;
import com.plotsquared.core.plot.Plot;
import java.util.Comparator;
/**
* Sort plots by {@link Plot#temp} (being the auto increment id in database) in natural order for {@code temp > 0}.
* For {@code temp < 1} sort by {@link Plot#hashCode()}
*/
public class PlotByCreationDateComparator implements Comparator<Plot> {
public static final Comparator<Plot> INSTANCE = new PlotByCreationDateComparator();
private PlotByCreationDateComparator() {
}
@Override
@SuppressWarnings("deprecation") // Plot#temp
public int compare(final Plot first, final Plot second) {
if (first.temp > 0 && second.temp > 0) {
return Integer.compare(first.temp, second.temp);
}
// second is implicitly `< 1` (due to previous condition)
if (first.temp > 0) {
return 1;
}
// sort dangling plots (temp < 1) by their hashcode
return Integer.compare(first.hashCode(), second.hashCode());
}
}

View File

@@ -0,0 +1,52 @@
/*
* 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.comparator;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
import com.plotsquared.core.util.MathMan;
import java.util.Comparator;
/**
* Sort plots by their {@link DoneFlag} in reverse numeric natural order. (more recent "finished plots" first)
* <br>
* Non-finished plots last, unsorted.
*/
public class PlotByDoneComparator implements Comparator<Plot> {
public static final PlotByDoneComparator INSTANCE = new PlotByDoneComparator();
private PlotByDoneComparator() {
}
@Override
public int compare(final Plot first, final Plot second) {
String firstDone = first.getFlag(DoneFlag.class);
String lastDone = second.getFlag(DoneFlag.class);
if (MathMan.isInteger(firstDone)) {
if (MathMan.isInteger(lastDone)) {
return Integer.parseInt(lastDone) - Integer.parseInt(firstDone);
}
return -1; // only "first" is finished, so sort "second" after "first"
}
return 0; // neither is finished
}
}

View File

@@ -0,0 +1,61 @@
/*
* 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.comparator;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.Rating;
import java.util.Comparator;
import java.util.Map;
import java.util.UUID;
public class PlotByRatingComparator implements Comparator<Plot> {
public static final PlotByRatingComparator INSTANCE = new PlotByRatingComparator();
PlotByRatingComparator() {
}
@Override
public int compare(final Plot p1, final Plot p2) {
double v1 = 0;
int p1s = p1.getSettings().getRatings().size();
int p2s = p2.getRatings().size();
if (!p1.getSettings().getRatings().isEmpty()) {
v1 = p1.getRatings().values().stream().mapToDouble(Rating::getAverageRating)
.map(av -> av * av).sum();
v1 /= p1s;
v1 += p1s;
}
double v2 = 0;
if (!p2.getSettings().getRatings().isEmpty()) {
for (Map.Entry<UUID, Rating> entry : p2.getRatings().entrySet()) {
double av = entry.getValue().getAverageRating();
v2 += av * av;
}
v2 /= p2s;
v2 += p2s;
}
if (v2 == v1 && v2 != 0) {
return p2s - p1s;
}
return (int) Math.signum(v2 - v1);
}
}

View File

@@ -16,30 +16,34 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.plotsquared.core.events; package com.plotsquared.core.util.comparator;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea;
import java.util.UUID; import javax.annotation.Nullable;
import java.util.Comparator;
/** public class PlotInPrioritizedAreaComparator implements Comparator<Plot> {
* Called when a player is going to be added to a plot
*
* @since TODO
*/
public class PlayerPlotAddEvent extends PlayerPlotAddRemoveCancellableEvent {
/** private final PlotArea priorityArea;
* Called when a player will be added to a plot
* public PlotInPrioritizedAreaComparator(@Nullable final PlotArea area) {
* @param initiator Player that initiated the event this.priorityArea = area;
* @param plot Plot in which the event occurred }
* @param player Player that will be added
* @param reason The reason for the add @Override
*/ public int compare(final Plot first, final Plot second) {
public PlayerPlotAddEvent(PlotPlayer<?> initiator, Plot plot, UUID player, Reason reason) { if (this.priorityArea == null) {
super(initiator, plot, player, reason); return 0; // no defined priority? don't sort
}
if (this.priorityArea.equals(first.getArea())) {
return -1;
}
if (this.priorityArea.equals(second.getArea())) {
return 1;
}
return 0; // same area, don't sort
} }
} }

View File

@@ -25,16 +25,21 @@ import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.StringMan;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike; 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.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class HelpObject implements ComponentLike { public class HelpObject implements ComponentLike {
static final MiniMessage MINI_MESSAGE = MiniMessage.miniMessage();
private final Component rendered; private final Component rendered;
public HelpObject(final Command command, final String label, final PlotPlayer<?> audience) { public HelpObject(final Command command, final String label, final PlotPlayer<?> audience) {
this.rendered = TranslatableCaption.of("help.help_item").toComponent(audience, TagResolver.builder() rendered = MINI_MESSAGE.deserialize(
TranslatableCaption.of("help.help_item").getComponent(audience),
TagResolver.builder()
.tag("usage", Tag.inserting(Component.text(command.getUsage().replace("{label}", label)))) .tag("usage", Tag.inserting(Component.text(command.getUsage().replace("{label}", label))))
.tag("alias", Tag.inserting(Component.text( .tag("alias", Tag.inserting(Component.text(
command.getAliases().isEmpty() ? "" : StringMan.join(command.getAliases(), " | ") command.getAliases().isEmpty() ? "" : StringMan.join(command.getAliases(), " | ")
@@ -42,7 +47,8 @@ public class HelpObject implements ComponentLike {
.tag("desc", Tag.inserting(command.getDescription().toComponent(audience))) .tag("desc", Tag.inserting(command.getDescription().toComponent(audience)))
.tag("arguments", Tag.inserting(Component.text(buildArgumentList(command.getRequiredArguments())))) .tag("arguments", Tag.inserting(Component.text(buildArgumentList(command.getRequiredArguments()))))
.tag("label", Tag.inserting(Component.text(label))) .tag("label", Tag.inserting(Component.text(label)))
.build()); .build()
);
} }
private String buildArgumentList(final Argument<?>[] arguments) { private String buildArgumentList(final Argument<?>[] arguments) {

View File

@@ -49,12 +49,10 @@ import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.BiFunction; import java.util.function.BiFunction;
import java.util.stream.Collectors;
/** /**
* Registry that contains {@link Placeholder placeholders} * Registry that contains {@link Placeholder placeholders}
@@ -129,22 +127,6 @@ public final class PlaceholderRegistry {
} }
return legacyComponent(TranslatableCaption.of("info.unknown"), player); return legacyComponent(TranslatableCaption.of("info.unknown"), player);
}); });
this.createPlaceholder("currentplot_owners", (player, plot) -> {
if (plot.getFlag(ServerPlotFlag.class)) {
return legacyComponent(TranslatableCaption.of("info.server"), player);
}
final Set<UUID> plotOwners = plot.getOwners();
if (plotOwners.isEmpty()) {
return legacyComponent(TranslatableCaption.of("generic.generic_unowned"), player);
}
return plotOwners.stream().map(PlotSquared.platform().playerManager()::getUsernameCaption).map(f -> {
try {
return f.get(Settings.UUID.BLOCKING_TIMEOUT, TimeUnit.MILLISECONDS).getComponent(player);
} catch (final Exception ignored) {
return legacyComponent(TranslatableCaption.of("info.unknown"), player);
}
}).collect(Collectors.joining(", "));
});
this.createPlaceholder("currentplot_members", (player, plot) -> { this.createPlaceholder("currentplot_members", (player, plot) -> {
if (plot.getMembers().isEmpty() && plot.getTrusted().isEmpty()) { if (plot.getMembers().isEmpty() && plot.getTrusted().isEmpty()) {
return legacyComponent(TranslatableCaption.of("info.none"), player); return legacyComponent(TranslatableCaption.of("info.none"), player);
@@ -204,9 +186,6 @@ public final class PlaceholderRegistry {
this.createPlaceholder("currentplot_x", (player, plot) -> Integer.toString(plot.getId().getX())); this.createPlaceholder("currentplot_x", (player, plot) -> Integer.toString(plot.getId().getX()));
this.createPlaceholder("currentplot_y", (player, plot) -> Integer.toString(plot.getId().getY())); this.createPlaceholder("currentplot_y", (player, plot) -> Integer.toString(plot.getId().getY()));
this.createPlaceholder("currentplot_xy", (player, plot) -> plot.getId().toString()); this.createPlaceholder("currentplot_xy", (player, plot) -> plot.getId().toString());
this.createPlaceholder("currentplot_abs_x", (player, plot) -> Integer.toString(plot.getId().getX()), true);
this.createPlaceholder("currentplot_abs_y", (player, plot) -> Integer.toString(plot.getId().getY()), true);
this.createPlaceholder("currentplot_abs_xy", (player, plot) -> plot.getId().toString(), true);
this.createPlaceholder("currentplot_rating", (player, plot) -> { this.createPlaceholder("currentplot_rating", (player, plot) -> {
if (Double.isNaN(plot.getAverageRating())) { if (Double.isNaN(plot.getAverageRating())) {
return legacyComponent(TranslatableCaption.of("placeholder.nan"), player); return legacyComponent(TranslatableCaption.of("placeholder.nan"), player);
@@ -256,23 +235,7 @@ public final class PlaceholderRegistry {
final @NonNull String key, final @NonNull String key,
final @NonNull BiFunction<PlotPlayer<?>, Plot, String> placeholderFunction final @NonNull BiFunction<PlotPlayer<?>, Plot, String> placeholderFunction
) { ) {
this.createPlaceholder(key, placeholderFunction, false); this.registerPlaceholder(new PlotSpecificPlaceholder(key) {
}
/**
* Create a functional placeholder
*
* @param key Placeholder key
* @param placeholderFunction Placeholder generator. Cannot return null
* @param requireAbsolute If the plot given to the placeholder should be the absolute (not base) plot
* @since 7.5.9
*/
public void createPlaceholder(
final @NonNull String key,
final @NonNull BiFunction<PlotPlayer<?>, Plot, String> placeholderFunction,
final boolean requireAbsolute
) {
this.registerPlaceholder(new PlotSpecificPlaceholder(key, requireAbsolute) {
@Override @Override
public @NonNull String getValue(final @NonNull PlotPlayer<?> player, final @NonNull Plot plot) { public @NonNull String getValue(final @NonNull PlotPlayer<?> player, final @NonNull Plot plot) {
return placeholderFunction.apply(player, plot); return placeholderFunction.apply(player, plot);

View File

@@ -27,28 +27,14 @@ import org.checkerframework.checker.nullness.qual.NonNull;
*/ */
public abstract class PlotSpecificPlaceholder extends Placeholder { public abstract class PlotSpecificPlaceholder extends Placeholder {
private final boolean requireAbsolute;
public PlotSpecificPlaceholder(final @NonNull String key) { public PlotSpecificPlaceholder(final @NonNull String key) {
this(key, false);
}
/**
* Create a functional placeholder
*
* @param key Placeholder key
* @param requireAbsolute If the plot given to the placeholder should be the absolute (not base) plot
* @since 7.5.9
*/
public PlotSpecificPlaceholder(final @NonNull String key, final boolean requireAbsolute) {
super(key); super(key);
this.requireAbsolute = requireAbsolute;
} }
@Override @Override
public @NonNull public @NonNull
final String getValue(final @NonNull PlotPlayer<?> player) { final String getValue(final @NonNull PlotPlayer<?> player) {
final Plot plot = requireAbsolute ? player.getLocation().getPlotAbs() : player.getCurrentPlot(); final Plot plot = player.getCurrentPlot();
if (plot == null) { if (plot == null) {
return ""; return "";
} }

View File

@@ -24,6 +24,7 @@ import com.plotsquared.core.plot.PlotArea;
import java.util.Collection; import java.util.Collection;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.stream.Stream;
class AreaLimitedPlotProvider implements PlotProvider { class AreaLimitedPlotProvider implements PlotProvider {
@@ -42,4 +43,9 @@ class AreaLimitedPlotProvider implements PlotProvider {
return plots; return plots;
} }
@Override
public Stream<Plot> streamPlots() {
return streamPlotsInPlotAreas(this.areas.toArray(PlotArea[]::new));
}
} }

View File

@@ -22,6 +22,7 @@ import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import java.util.Collection; import java.util.Collection;
import java.util.stream.Stream;
class ExpiredPlotProvider implements PlotProvider { class ExpiredPlotProvider implements PlotProvider {
@@ -30,4 +31,9 @@ class ExpiredPlotProvider implements PlotProvider {
return PlotSquared.platform().expireManager().getPendingExpired(); return PlotSquared.platform().expireManager().getPendingExpired();
} }
@Override
public Stream<Plot> streamPlots() {
return getPlots().stream();
}
} }

View File

@@ -23,6 +23,7 @@ import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.stream.Stream;
class FixedPlotProvider implements PlotProvider { class FixedPlotProvider implements PlotProvider {
@@ -37,4 +38,9 @@ class FixedPlotProvider implements PlotProvider {
return Collections.singleton(plot); return Collections.singleton(plot);
} }
@Override
public Stream<Plot> streamPlots() {
return Stream.of(plot);
}
} }

View File

@@ -26,6 +26,7 @@ import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.stream.Stream;
class GlobalPlotProvider implements PlotProvider { class GlobalPlotProvider implements PlotProvider {
@@ -44,4 +45,9 @@ class GlobalPlotProvider implements PlotProvider {
return plots; return plots;
} }
@Override
public Stream<Plot> streamPlots() {
return streamPlotsInPlotAreas(this.plotAreaManager.getAllPlotAreas());
}
} }

View File

@@ -22,6 +22,7 @@ import com.plotsquared.core.plot.Plot;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.stream.Stream;
class NullProvider implements PlotProvider { class NullProvider implements PlotProvider {
@@ -30,4 +31,9 @@ class NullProvider implements PlotProvider {
return Collections.emptyList(); return Collections.emptyList();
} }
@Override
public Stream<Plot> streamPlots() {
return Stream.empty();
}
} }

View File

@@ -23,17 +23,11 @@ import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.UUID; import java.util.UUID;
class OwnersIncludeFilter implements PlotFilter { record OwnersIncludeFilter(UUID owner) implements PlotFilter {
private final UUID owner;
OwnersIncludeFilter(final @NonNull UUID owner) {
this.owner = owner;
}
@Override @Override
public boolean accepts(final @NonNull Plot plot) { public boolean accepts(final @NonNull Plot plot) {
return plot.isBasePlot() && plot.getOwners().size() > 0 && plot.getOwners().contains(owner); return plot.isBasePlot() && plot.isOwner(owner);
} }
} }

Some files were not shown because too many files have changed in this diff Show More