mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2025-07-04 06:34:42 +02:00
Compare commits
2 Commits
feature/cl
...
fix/stop-i
Author | SHA1 | Date | |
---|---|---|---|
e2bb8a4b32 | |||
c523feeb79 |
7
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
7
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -7,8 +7,8 @@ body:
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to fill out this bug report for PlotSquared! Fill out the following form to your best ability to help us fix the problem.
|
||||
Only use this if you're absolutely sure that you found a bug and can reproduce it. For anything else, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.gitbook.io/plotsquared/).
|
||||
Do NOT use the public issue tracker to report security vulnerabilities! They are disclosed using [this](https://github.com/IntellectualSites/PlotSquared/security/policy) GitHub form!
|
||||
Only use this if you're absolutely sure that you found a bug and can reproduce it. For anything else, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.github.io/plotsquared-documentation/).
|
||||
Do NOT use the public issue tracker to report security vulnerabilities! They are disclosed using [this](https://forms.gle/btgdRn9yhGtzEiGW8) form!
|
||||
|
||||
- type: dropdown
|
||||
attributes:
|
||||
@ -27,9 +27,6 @@ body:
|
||||
description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first.
|
||||
multiple: false
|
||||
options:
|
||||
- '1.20.4'
|
||||
- '1.20'
|
||||
- '1.19.4'
|
||||
- '1.19.3'
|
||||
- '1.19.2'
|
||||
- '1.19.1'
|
||||
|
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@ -4,5 +4,5 @@ contact_links:
|
||||
url: https://discord.gg/intellectualsites
|
||||
about: Our support Discord, please ask questions and seek support here.
|
||||
- name: PlotSquared Wiki
|
||||
url: https://intellectualsites.gitbook.io/plotsquared/
|
||||
url: https://intellectualsites.github.io/plotsquared-documentation/
|
||||
about: Take a look at the wiki page for instructions how to setup PlotSquared and use its commands.
|
||||
|
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@ -7,7 +7,7 @@ body:
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to fill out this feature request for PlotSquared! Fill out the following form to your best ability to help us understand your feature request and greately improve the change of it getting added.
|
||||
For anything else than a feature request, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.gitbook.io/plotsquared/).
|
||||
For anything else than a feature request, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.github.io/plotsquared-documentation/).
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
|
19
.github/renovate.json
vendored
19
.github/renovate.json
vendored
@ -1,19 +0,0 @@
|
||||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": [
|
||||
"config:base",
|
||||
":semanticCommitsDisabled"
|
||||
],
|
||||
"automerge": true,
|
||||
"labels": [
|
||||
"dependencies"
|
||||
],
|
||||
"rebaseWhen": "conflicted",
|
||||
"schedule": ["on the first day of the month"],
|
||||
"ignoreDeps": [
|
||||
"com.google.code.gson:gson",
|
||||
"com.google.guava:guava",
|
||||
"org.yaml:snakeyaml",
|
||||
"org.apache.logging.log4j:log4j-api"
|
||||
]
|
||||
}
|
4
.github/workflows/build-pr.yml
vendored
4
.github/workflows/build-pr.yml
vendored
@ -9,11 +9,11 @@ jobs:
|
||||
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v3
|
||||
- name: Validate Gradle Wrapper
|
||||
uses: gradle/wrapper-validation-action@v1
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@v4
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: 17
|
||||
|
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@ -9,11 +9,11 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v3
|
||||
- name: Validate Gradle Wrapper
|
||||
uses: gradle/wrapper-validation-action@v1
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@v4
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: 17
|
||||
|
13
.github/workflows/codeql.yml
vendored
13
.github/workflows/codeql.yml
vendored
@ -20,17 +20,12 @@ jobs:
|
||||
language: [ 'java' ]
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: 17
|
||||
uses: actions/checkout@v3
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
uses: github/codeql-action/init@v2
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v3
|
||||
uses: github/codeql-action/autobuild@v2
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v3
|
||||
uses: github/codeql-action/analyze@v2
|
||||
|
23
.github/workflows/label-merge-conflicts.yaml
vendored
23
.github/workflows/label-merge-conflicts.yaml
vendored
@ -1,23 +0,0 @@
|
||||
name: "Label conflicting PRs"
|
||||
on:
|
||||
push:
|
||||
pull_request_target:
|
||||
types: [ synchronize ]
|
||||
pull_request:
|
||||
types: [ synchronize ]
|
||||
|
||||
permissions:
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
main:
|
||||
if: github.event.pull_request.user.login != 'dependabot[bot]'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Label conflicting PRs
|
||||
uses: eps1lon/actions-label-merge-conflict@v2.1.0
|
||||
with:
|
||||
dirtyLabel: "unresolved-merge-conflict"
|
||||
repoToken: "${{ secrets.GITHUB_TOKEN }}"
|
||||
commentOnDirty: "Please take a moment and address the merge conflicts of your pull request. Thanks!"
|
||||
continueOnMissingPermissions: true
|
5
.gitignore
vendored
5
.gitignore
vendored
@ -138,5 +138,6 @@ build/
|
||||
|
||||
.DS_Store
|
||||
# Ignore run folders
|
||||
run-[0-9].[0-9][0-9]/
|
||||
run-[0-9].[0-9][0-9].[0-9]/
|
||||
run-[0-0].[0-9]/
|
||||
run-[0-0].[0-9].[0-9]/
|
||||
|
||||
|
@ -18,23 +18,23 @@ repositories {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
api(projects.plotsquaredCore)
|
||||
api(projects.plotSquaredCore)
|
||||
|
||||
// Metrics
|
||||
implementation(libs.bstatsBukkit)
|
||||
implementation("org.bstats:bstats-bukkit")
|
||||
|
||||
// Paper
|
||||
compileOnly(libs.paper)
|
||||
implementation(libs.paperlib)
|
||||
compileOnly("io.papermc.paper:paper-api")
|
||||
implementation("io.papermc:paperlib")
|
||||
|
||||
// Plugins
|
||||
compileOnly(libs.worldeditBukkit) {
|
||||
exclude(group = "org.bukkit")
|
||||
exclude(group = "org.spigotmc")
|
||||
}
|
||||
compileOnly(libs.faweBukkit) { isTransitive = false }
|
||||
testImplementation(libs.faweBukkit) { isTransitive = false }
|
||||
compileOnly(libs.vault) {
|
||||
compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false }
|
||||
testImplementation("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false }
|
||||
compileOnly("com.github.MilkBowl:VaultAPI") {
|
||||
exclude(group = "org.bukkit")
|
||||
}
|
||||
compileOnly(libs.placeholderapi)
|
||||
@ -44,18 +44,15 @@ dependencies {
|
||||
|
||||
// Other libraries
|
||||
implementation(libs.squirrelid) { isTransitive = false }
|
||||
implementation(libs.serverlib)
|
||||
implementation("dev.notmyfault.serverlib:ServerLib")
|
||||
|
||||
// Our libraries
|
||||
implementation(libs.arkitektonika)
|
||||
implementation(libs.paster)
|
||||
implementation(libs.informativeAnnotations)
|
||||
implementation("com.intellectualsites.paster:Paster")
|
||||
implementation("com.intellectualsites.informative-annotations:informative-annotations")
|
||||
|
||||
// Adventure
|
||||
implementation(libs.adventureBukkit)
|
||||
|
||||
// Cloud
|
||||
implementation(libs.cloudPaper)
|
||||
implementation("net.kyori:adventure-platform-bukkit")
|
||||
}
|
||||
|
||||
tasks.processResources {
|
||||
@ -65,12 +62,10 @@ tasks.processResources {
|
||||
}
|
||||
|
||||
tasks.named<ShadowJar>("shadowJar") {
|
||||
dependsOn(":plotsquared-core:shadowJar")
|
||||
dependencies {
|
||||
exclude(dependency("org.checkerframework:"))
|
||||
}
|
||||
|
||||
relocate("net.kyori.option", "com.plotsquared.core.configuration.option")
|
||||
relocate("net.kyori.adventure", "com.plotsquared.core.configuration.adventure")
|
||||
relocate("net.kyori.examination", "com.plotsquared.core.configuration.examination")
|
||||
relocate("io.papermc.lib", "com.plotsquared.bukkit.paperlib")
|
||||
@ -80,7 +75,6 @@ tasks.named<ShadowJar>("shadowJar") {
|
||||
relocate("com.google.inject", "com.plotsquared.google")
|
||||
relocate("org.aopalliance", "com.plotsquared.core.aopalliance")
|
||||
relocate("cloud.commandframework.services", "com.plotsquared.core.services")
|
||||
relocate("cloud.commandframework", "com.plotsquared.commands")
|
||||
relocate("io.leangen.geantyref", "com.plotsquared.core.geantyref")
|
||||
relocate("com.intellectualsites.arkitektonika", "com.plotsquared.core.arkitektonika")
|
||||
relocate("com.intellectualsites.http", "com.plotsquared.core.http")
|
||||
@ -105,12 +99,12 @@ tasks {
|
||||
withType<Javadoc> {
|
||||
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
|
||||
val opt = options as StandardJavadocDocletOptions
|
||||
opt.links("https://jd.papermc.io/paper/1.20/")
|
||||
opt.links("https://jd.papermc.io/paper/1.19/")
|
||||
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
|
||||
opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/")
|
||||
opt.links("https://jd.advntr.dev/api/4.14.0/")
|
||||
opt.links("https://jd.advntr.dev/api/4.12.0/")
|
||||
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
|
||||
// opt.links("https://checkerframework.org/api/")
|
||||
opt.links("https://checkerframework.org/api/")
|
||||
opt.isLinkSource = true
|
||||
opt.bottom(File("$rootDir/javadocfooter.html").readText())
|
||||
opt.isUse = true
|
||||
|
@ -28,7 +28,6 @@ import com.google.inject.TypeLiteral;
|
||||
import com.plotsquared.bukkit.generator.BukkitPlotGenerator;
|
||||
import com.plotsquared.bukkit.inject.BackupModule;
|
||||
import com.plotsquared.bukkit.inject.BukkitModule;
|
||||
import com.plotsquared.bukkit.inject.CloudModule;
|
||||
import com.plotsquared.bukkit.inject.PermissionModule;
|
||||
import com.plotsquared.bukkit.inject.WorldManagerModule;
|
||||
import com.plotsquared.bukkit.listener.BlockEventListener;
|
||||
@ -38,7 +37,6 @@ import com.plotsquared.bukkit.listener.EntityEventListener;
|
||||
import com.plotsquared.bukkit.listener.EntitySpawnListener;
|
||||
import com.plotsquared.bukkit.listener.PaperListener;
|
||||
import com.plotsquared.bukkit.listener.PlayerEventListener;
|
||||
import com.plotsquared.bukkit.listener.PlayerEventListener1201;
|
||||
import com.plotsquared.bukkit.listener.ProjectileEventListener;
|
||||
import com.plotsquared.bukkit.listener.ServerListener;
|
||||
import com.plotsquared.bukkit.listener.SingleWorldListener;
|
||||
@ -65,7 +63,6 @@ import com.plotsquared.bukkit.uuid.SquirrelIdUUIDService;
|
||||
import com.plotsquared.core.PlotPlatform;
|
||||
import com.plotsquared.core.PlotSquared;
|
||||
import com.plotsquared.core.backup.BackupManager;
|
||||
import com.plotsquared.core.commands.PlotSquaredCommandManager;
|
||||
import com.plotsquared.core.components.ComponentPresetManager;
|
||||
import com.plotsquared.core.configuration.ConfigurationNode;
|
||||
import com.plotsquared.core.configuration.ConfigurationSection;
|
||||
@ -85,7 +82,6 @@ import com.plotsquared.core.inject.annotations.DefaultGenerator;
|
||||
import com.plotsquared.core.inject.annotations.ImpromptuPipeline;
|
||||
import com.plotsquared.core.inject.annotations.WorldConfig;
|
||||
import com.plotsquared.core.inject.annotations.WorldFile;
|
||||
import com.plotsquared.core.inject.modules.CommandModule;
|
||||
import com.plotsquared.core.inject.modules.PlotSquaredModule;
|
||||
import com.plotsquared.core.listener.PlotListener;
|
||||
import com.plotsquared.core.listener.WESubscriber;
|
||||
@ -139,7 +135,6 @@ import org.bukkit.generator.ChunkGenerator;
|
||||
import org.bukkit.metadata.FixedMetadataValue;
|
||||
import org.bukkit.metadata.MetadataValue;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
@ -257,7 +252,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation") // Paper deprecation
|
||||
public void onEnable() {
|
||||
this.pluginName = getDescription().getName();
|
||||
|
||||
@ -296,8 +290,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
||||
new PermissionModule(),
|
||||
new WorldManagerModule(),
|
||||
new PlotSquaredModule(),
|
||||
new CommandModule(),
|
||||
new CloudModule(this),
|
||||
new BukkitModule(this),
|
||||
new BackupModule()
|
||||
);
|
||||
@ -365,9 +357,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
||||
|
||||
if (Settings.Enabled_Components.EVENTS) {
|
||||
getServer().getPluginManager().registerEvents(injector().getInstance(PlayerEventListener.class), this);
|
||||
if ((serverVersion()[1] == 20 && serverVersion()[2] >= 1) || serverVersion()[1] > 20) {
|
||||
getServer().getPluginManager().registerEvents(injector().getInstance(PlayerEventListener1201.class), this);
|
||||
}
|
||||
getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener.class), this);
|
||||
if (serverVersion()[1] >= 17) {
|
||||
getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener117.class), this);
|
||||
@ -393,8 +382,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
||||
// Commands
|
||||
if (Settings.Enabled_Components.COMMANDS) {
|
||||
this.registerCommands();
|
||||
// Register the commands.
|
||||
this.injector().getInstance(PlotSquaredCommandManager.class).registerDefaultCommands();
|
||||
}
|
||||
|
||||
// Permissions
|
||||
@ -563,7 +550,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
||||
this.startMetrics();
|
||||
|
||||
if (Settings.Enabled_Components.WORLDS) {
|
||||
TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(10L));
|
||||
TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(1L));
|
||||
try {
|
||||
singleWorldListener = injector().getInstance(SingleWorldListener.class);
|
||||
Bukkit.getPluginManager().registerEvents(singleWorldListener, this);
|
||||
@ -825,7 +812,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
||||
case "MINECART_MOB_SPAWNER":
|
||||
case "ENDER_CRYSTAL":
|
||||
case "MINECART_TNT":
|
||||
case "CHEST_BOAT":
|
||||
case "BOAT":
|
||||
if (Settings.Enabled_Components.KILL_ROAD_VEHICLES) {
|
||||
com.plotsquared.core.location.Location location = BukkitUtil.adapt(entity.getLocation());
|
||||
@ -1174,7 +1160,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
||||
return new BukkitPlotGenerator(world, generator, this.plotAreaManager);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation") // Paper deprecation
|
||||
@Override
|
||||
public @NonNull String pluginsFormatted() {
|
||||
StringBuilder msg = new StringBuilder();
|
||||
@ -1191,23 +1176,12 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
||||
.append(" • Load Before: ").append(p.getDescription().getLoadBefore()).append("\n")
|
||||
.append(" • Dependencies: ").append(p.getDescription().getDepend()).append("\n")
|
||||
.append(" • Soft Dependencies: ").append(p.getDescription().getSoftDepend()).append("\n");
|
||||
List<RegisteredServiceProvider<?>> providers = Bukkit.getServicesManager().getRegistrations(p);
|
||||
if (!providers.isEmpty()) {
|
||||
msg.append(" • Provided Services: \n");
|
||||
for (RegisteredServiceProvider<?> provider : providers) {
|
||||
msg.append(" • ")
|
||||
.append(provider.getService().getName()).append(" = ")
|
||||
.append(provider.getProvider().getClass().getName())
|
||||
.append(" (priority: ").append(provider.getPriority()).append(")")
|
||||
.append("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
return msg.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings({"ConstantConditions", "deprecation"}) // Paper deprecation
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
public @NonNull String worldEditImplementations() {
|
||||
StringBuilder msg = new StringBuilder();
|
||||
if (Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit") != null) {
|
||||
|
@ -1,50 +0,0 @@
|
||||
/*
|
||||
* PlotSquared, a land and world management plugin for Minecraft.
|
||||
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
||||
* Copyright (C) IntellectualSites team and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.plotsquared.bukkit.commands;
|
||||
|
||||
import com.plotsquared.bukkit.util.BukkitUtil;
|
||||
import com.plotsquared.core.player.ConsolePlayer;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.SenderMapper;
|
||||
|
||||
/**
|
||||
* Mapper between {@link CommandSender} and {@link PlotPlayer}.
|
||||
*/
|
||||
public final class BukkitSenderMapper implements SenderMapper<CommandSender, PlotPlayer<?>> {
|
||||
|
||||
@Override
|
||||
public @NonNull PlotPlayer<?> map(final @NonNull CommandSender base) {
|
||||
if (base instanceof Player player) {
|
||||
return BukkitUtil.adapt(player);
|
||||
}
|
||||
return ConsolePlayer.getConsole();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull CommandSender reverse(final @NonNull PlotPlayer<?> mapped) {
|
||||
if (mapped instanceof ConsolePlayer) {
|
||||
return Bukkit.getConsoleSender();
|
||||
}
|
||||
return (Player) mapped.getPlatformPlayer();
|
||||
}
|
||||
}
|
@ -33,7 +33,6 @@ import org.bukkit.entity.Ageable;
|
||||
import org.bukkit.entity.ArmorStand;
|
||||
import org.bukkit.entity.Bat;
|
||||
import org.bukkit.entity.Boat;
|
||||
import org.bukkit.entity.Breedable;
|
||||
import org.bukkit.entity.ChestedHorse;
|
||||
import org.bukkit.entity.EnderDragon;
|
||||
import org.bukkit.entity.Entity;
|
||||
@ -75,7 +74,6 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
||||
private HorseStats horse;
|
||||
private boolean noGravity;
|
||||
|
||||
@SuppressWarnings("deprecation") // Deprecation exists since 1.20, while we support 1.16 onwards
|
||||
public ReplicatingEntityWrapper(Entity entity, short depth) {
|
||||
super(entity);
|
||||
|
||||
@ -166,7 +164,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
||||
//this.horse.style = horse.getStyle();
|
||||
//this.horse.color = horse.getColor();
|
||||
storeTameable(horse);
|
||||
storeBreedable(horse);
|
||||
storeAgeable(horse);
|
||||
storeLiving(horse);
|
||||
storeInventory(horse);
|
||||
return;
|
||||
@ -174,7 +172,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
||||
// END INVENTORY HOLDER //
|
||||
case "WOLF", "OCELOT" -> {
|
||||
storeTameable((Tameable) entity);
|
||||
storeBreedable((Breedable) entity);
|
||||
storeAgeable((Ageable) entity);
|
||||
storeLiving((LivingEntity) entity);
|
||||
return;
|
||||
}
|
||||
@ -188,18 +186,18 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
||||
this.dataByte = (byte) 0;
|
||||
}
|
||||
this.dataByte2 = sheep.getColor().getDyeData();
|
||||
storeBreedable(sheep);
|
||||
storeAgeable(sheep);
|
||||
storeLiving(sheep);
|
||||
return;
|
||||
}
|
||||
case "VILLAGER", "CHICKEN", "COW", "MUSHROOM_COW", "PIG", "TURTLE", "POLAR_BEAR" -> {
|
||||
storeBreedable((Breedable) entity);
|
||||
storeAgeable((Ageable) entity);
|
||||
storeLiving((LivingEntity) entity);
|
||||
return;
|
||||
}
|
||||
case "RABBIT" -> {
|
||||
this.dataByte = getOrdinal(Rabbit.Type.values(), ((Rabbit) entity).getRabbitType());
|
||||
storeBreedable((Breedable) entity);
|
||||
storeAgeable((Ageable) entity);
|
||||
storeLiving((LivingEntity) entity);
|
||||
return;
|
||||
}
|
||||
@ -383,11 +381,6 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use {@link #restoreBreedable(Breedable)} instead
|
||||
* @since 7.1.0
|
||||
*/
|
||||
@Deprecated(forRemoval = true, since = "7.1.0")
|
||||
private void restoreAgeable(Ageable entity) {
|
||||
if (!this.aged.adult) {
|
||||
entity.setBaby();
|
||||
@ -398,11 +391,6 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use {@link #storeBreedable(Breedable)} instead
|
||||
* @since 7.1.0
|
||||
*/
|
||||
@Deprecated(forRemoval = true, since = "7.1.0")
|
||||
public void storeAgeable(Ageable aged) {
|
||||
this.aged = new AgeableStats();
|
||||
this.aged.age = aged.getAge();
|
||||
@ -410,29 +398,6 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
||||
this.aged.adult = aged.isAdult();
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 7.1.0
|
||||
*/
|
||||
private void restoreBreedable(Breedable entity) {
|
||||
if (!this.aged.adult) {
|
||||
entity.setBaby();
|
||||
}
|
||||
entity.setAgeLock(this.aged.locked);
|
||||
if (this.aged.age > 0) {
|
||||
entity.setAge(this.aged.age);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 7.1.0
|
||||
*/
|
||||
private void storeBreedable(Breedable breedable) {
|
||||
this.aged = new AgeableStats();
|
||||
this.aged.age = breedable.getAge();
|
||||
this.aged.locked = breedable.getAgeLock();
|
||||
this.aged.adult = breedable.isAdult();
|
||||
}
|
||||
|
||||
public void storeTameable(Tameable tamed) {
|
||||
this.tamed = new TameableStats();
|
||||
this.tamed.owner = tamed.getOwner();
|
||||
@ -536,7 +501,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
||||
//horse.setStyle(this.horse.style);
|
||||
//horse.setColor(this.horse.color);
|
||||
restoreTameable(horse);
|
||||
restoreBreedable(horse);
|
||||
restoreAgeable(horse);
|
||||
restoreLiving(horse);
|
||||
restoreInventory(horse);
|
||||
return entity;
|
||||
@ -544,7 +509,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
||||
// END INVENTORY HOLDER //
|
||||
case "WOLF", "OCELOT" -> {
|
||||
restoreTameable((Tameable) entity);
|
||||
restoreBreedable((Breedable) entity);
|
||||
restoreAgeable((Ageable) entity);
|
||||
restoreLiving((LivingEntity) entity);
|
||||
return entity;
|
||||
}
|
||||
@ -557,12 +522,12 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
||||
if (this.dataByte2 != 0) {
|
||||
sheep.setColor(DyeColor.getByDyeData(this.dataByte2));
|
||||
}
|
||||
restoreBreedable(sheep);
|
||||
restoreAgeable(sheep);
|
||||
restoreLiving(sheep);
|
||||
return sheep;
|
||||
}
|
||||
case "VILLAGER", "CHICKEN", "COW", "TURTLE", "POLAR_BEAR", "MUSHROOM_COW", "PIG" -> {
|
||||
restoreBreedable((Breedable) entity);
|
||||
restoreAgeable((Ageable) entity);
|
||||
restoreLiving((LivingEntity) entity);
|
||||
return entity;
|
||||
}
|
||||
@ -571,7 +536,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
||||
if (this.dataByte != 0) {
|
||||
((Rabbit) entity).setRabbitType(Rabbit.Type.values()[this.dataByte]);
|
||||
}
|
||||
restoreBreedable((Breedable) entity);
|
||||
restoreAgeable((Ageable) entity);
|
||||
restoreLiving((LivingEntity) entity);
|
||||
return entity;
|
||||
}
|
||||
|
@ -34,12 +34,9 @@ import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
|
||||
import com.plotsquared.core.util.ChunkManager;
|
||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||
import com.sk89q.worldedit.math.BlockVector2;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.bukkit.HeightMap;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.Registry;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.generator.BiomeProvider;
|
||||
@ -51,14 +48,10 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
|
||||
import static java.util.function.Predicate.not;
|
||||
|
||||
public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrapper<ChunkGenerator> {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitPlotGenerator.class.getSimpleName());
|
||||
@ -291,7 +284,7 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
|
||||
*/
|
||||
@SuppressWarnings("deprecation") // The entire method is deprecated, but kept for compatibility with <=1.16.2
|
||||
@Override
|
||||
@Deprecated(since = "7.0.0")
|
||||
@Deprecated(since = "TODO")
|
||||
public @NonNull ChunkData generateChunkData(
|
||||
@NonNull World world, @NonNull Random random, int x, int z, @NonNull BiomeGrid biome
|
||||
) {
|
||||
@ -421,11 +414,7 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
|
||||
if (lastPlotArea != null && name.equals(this.levelName) && chunkX == lastChunkX && chunkZ == lastChunkZ) {
|
||||
return lastPlotArea;
|
||||
}
|
||||
BlockVector3 loc = BlockVector3.at(chunkX << 4, 0, chunkZ << 4);
|
||||
if (lastPlotArea != null && lastPlotArea.getRegion().contains(loc) && lastPlotArea.getRegion().contains(loc)) {
|
||||
return lastPlotArea;
|
||||
}
|
||||
PlotArea area = UncheckedWorldLocation.at(name, loc).getPlotArea();
|
||||
PlotArea area = UncheckedWorldLocation.at(name, chunkX << 4, 0, chunkZ << 4).getPlotArea();
|
||||
if (area == null) {
|
||||
throw new IllegalStateException(String.format(
|
||||
"Cannot generate chunk that does not belong to a plot area. World: %s",
|
||||
@ -445,16 +434,9 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
|
||||
private static final List<Biome> BIOMES;
|
||||
|
||||
static {
|
||||
Set<Biome> disabledBiomes = EnumSet.of(Biome.CUSTOM);
|
||||
if (PlotSquared.platform().serverVersion()[1] <= 19) {
|
||||
final Biome cherryGrove = Registry.BIOME.get(NamespacedKey.minecraft("cherry_grove"));
|
||||
if (cherryGrove != null) {
|
||||
disabledBiomes.add(cherryGrove);
|
||||
}
|
||||
}
|
||||
BIOMES = Arrays.stream(Biome.values())
|
||||
.filter(not(disabledBiomes::contains))
|
||||
.toList();
|
||||
ArrayList<Biome> biomes = new ArrayList<>(List.of(Biome.values()));
|
||||
biomes.remove(Biome.CUSTOM);
|
||||
BIOMES = List.copyOf(biomes);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -23,13 +23,13 @@ import com.google.inject.Provides;
|
||||
import com.google.inject.Singleton;
|
||||
import com.google.inject.assistedinject.FactoryModuleBuilder;
|
||||
import com.plotsquared.bukkit.BukkitPlatform;
|
||||
import com.plotsquared.bukkit.listener.ServerListener;
|
||||
import com.plotsquared.bukkit.listener.SingleWorldListener;
|
||||
import com.plotsquared.bukkit.player.BukkitPlayerManager;
|
||||
import com.plotsquared.bukkit.queue.BukkitChunkCoordinator;
|
||||
import com.plotsquared.bukkit.queue.BukkitQueueCoordinator;
|
||||
import com.plotsquared.bukkit.schematic.BukkitSchematicHandler;
|
||||
import com.plotsquared.bukkit.util.BukkitChunkManager;
|
||||
import com.plotsquared.bukkit.util.BukkitEconHandler;
|
||||
import com.plotsquared.bukkit.util.BukkitInventoryUtil;
|
||||
import com.plotsquared.bukkit.util.BukkitRegionManager;
|
||||
import com.plotsquared.bukkit.util.BukkitSetupUtils;
|
||||
@ -47,9 +47,6 @@ import com.plotsquared.core.inject.factory.ChunkCoordinatorBuilderFactory;
|
||||
import com.plotsquared.core.inject.factory.ChunkCoordinatorFactory;
|
||||
import com.plotsquared.core.inject.factory.HybridPlotWorldFactory;
|
||||
import com.plotsquared.core.inject.factory.ProgressSubscriberFactory;
|
||||
import com.plotsquared.core.player.OfflinePlotPlayer;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.plot.PlotArea;
|
||||
import com.plotsquared.core.plot.world.DefaultPlotAreaManager;
|
||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||
import com.plotsquared.core.plot.world.SinglePlotAreaManager;
|
||||
@ -75,8 +72,6 @@ import org.bukkit.command.ConsoleCommandSender;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class BukkitModule extends AbstractModule {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitModule.class.getSimpleName());
|
||||
@ -133,64 +128,21 @@ public class BukkitModule extends AbstractModule {
|
||||
@Provides
|
||||
@Singleton
|
||||
@NonNull EconHandler provideEconHandler() {
|
||||
if (!Settings.Enabled_Components.ECONOMY || !Bukkit.getPluginManager().isPluginEnabled("Vault")) {
|
||||
if (!Settings.Enabled_Components.ECONOMY) {
|
||||
return EconHandler.nullEconHandler();
|
||||
}
|
||||
// Guice eagerly initializes singletons, so we need to bring the laziness ourselves
|
||||
return new LazyEconHandler();
|
||||
}
|
||||
|
||||
private static final class LazyEconHandler extends EconHandler implements ServerListener.MutableEconHandler {
|
||||
private volatile EconHandler implementation;
|
||||
|
||||
public void setImplementation(EconHandler econHandler) {
|
||||
this.implementation = econHandler;
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("Vault")) {
|
||||
try {
|
||||
BukkitEconHandler econHandler = new BukkitEconHandler();
|
||||
if (!econHandler.init()) {
|
||||
LOGGER.warn("Economy is enabled but no plugin is providing an economy service. Falling back...");
|
||||
return EconHandler.nullEconHandler();
|
||||
}
|
||||
return econHandler;
|
||||
} catch (final Exception ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean init() {
|
||||
return get().init();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getBalance(final PlotPlayer<?> player) {
|
||||
return get().getBalance(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void withdrawMoney(final PlotPlayer<?> player, final double amount) {
|
||||
get().withdrawMoney(player, amount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void depositMoney(final PlotPlayer<?> player, final double amount) {
|
||||
get().depositMoney(player, amount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void depositMoney(final OfflinePlotPlayer player, final double amount) {
|
||||
get().depositMoney(player, amount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled(final PlotArea plotArea) {
|
||||
return get().isEnabled(plotArea);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull String format(final double balance) {
|
||||
return get().format(balance);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupported() {
|
||||
return get().isSupported();
|
||||
}
|
||||
|
||||
private EconHandler get() {
|
||||
return Objects.requireNonNull(this.implementation, "EconHandler not ready yet.");
|
||||
}
|
||||
|
||||
return EconHandler.nullEconHandler();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,99 +0,0 @@
|
||||
/*
|
||||
* PlotSquared, a land and world management plugin for Minecraft.
|
||||
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
||||
* Copyright (C) IntellectualSites team and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.plotsquared.bukkit.inject;
|
||||
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Key;
|
||||
import com.google.inject.TypeLiteral;
|
||||
import com.plotsquared.bukkit.BukkitPlatform;
|
||||
import com.plotsquared.bukkit.commands.BukkitSenderMapper;
|
||||
import com.plotsquared.bukkit.util.BukkitUtil;
|
||||
import com.plotsquared.core.commands.CommandRequirement;
|
||||
import com.plotsquared.core.commands.PlotSquaredCaptionProvider;
|
||||
import com.plotsquared.core.commands.PlotSquaredRequirementFailureHandler;
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.player.ConsolePlayer;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.CommandManager;
|
||||
import org.incendo.cloud.bukkit.CloudBukkitCapabilities;
|
||||
import org.incendo.cloud.execution.ExecutionCoordinator;
|
||||
import org.incendo.cloud.minecraft.extras.MinecraftExceptionHandler;
|
||||
import org.incendo.cloud.paper.PaperCommandManager;
|
||||
import org.incendo.cloud.processors.requirements.RequirementPostprocessor;
|
||||
|
||||
public class CloudModule extends AbstractModule {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + CloudModule.class.getSimpleName());
|
||||
|
||||
private static @NonNull CommandSender convert(final @NonNull PlotPlayer<?> player) {
|
||||
if (player instanceof ConsolePlayer) {
|
||||
return Bukkit.getConsoleSender();
|
||||
}
|
||||
return (Player) player.getPlatformPlayer();
|
||||
}
|
||||
|
||||
private static @NonNull PlotPlayer<?> convert (final @NonNull CommandSender sender) {
|
||||
if (sender instanceof Player player) {
|
||||
return BukkitUtil.adapt(player);
|
||||
}
|
||||
return ConsolePlayer.getConsole();
|
||||
}
|
||||
|
||||
private final BukkitPlatform bukkitPlatform;
|
||||
|
||||
public CloudModule(final @NonNull BukkitPlatform bukkitPlatform) {
|
||||
this.bukkitPlatform = bukkitPlatform;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
final PaperCommandManager<PlotPlayer<?>> commandManager = new PaperCommandManager<PlotPlayer<?>>(
|
||||
this.bukkitPlatform,
|
||||
ExecutionCoordinator.asyncCoordinator(),
|
||||
new BukkitSenderMapper()
|
||||
);
|
||||
commandManager.captionRegistry().registerProvider(new PlotSquaredCaptionProvider());
|
||||
|
||||
if (commandManager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) {
|
||||
commandManager.registerBrigadier();
|
||||
} else if (commandManager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) {
|
||||
commandManager.registerAsynchronousCompletions();
|
||||
}
|
||||
|
||||
final RequirementPostprocessor<PlotPlayer<?>, CommandRequirement> requirementPostprocessor =
|
||||
RequirementPostprocessor.of(CommandRequirement.REQUIREMENTS_KEY, new PlotSquaredRequirementFailureHandler());
|
||||
commandManager.registerCommandPostProcessor(requirementPostprocessor);
|
||||
|
||||
// TODO(City): Override parsing errors using MM parsing.
|
||||
MinecraftExceptionHandler.<PlotPlayer<?>>create(PlotPlayer::getAudience)
|
||||
.defaultHandlers()
|
||||
.decorator((ctx, component) -> TranslatableCaption.of("core.prefix").
|
||||
toComponent(ctx.context().sender())
|
||||
.append(component))
|
||||
.registerTo(commandManager);
|
||||
|
||||
bind(Key.get(new TypeLiteral<CommandManager<PlotPlayer<?>>>() {})).toInstance(commandManager);
|
||||
}
|
||||
}
|
@ -33,7 +33,6 @@ import com.plotsquared.core.plot.PlotArea;
|
||||
import com.plotsquared.core.plot.flag.implementations.BlockBurnFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.BreakFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.ConcreteHardenFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.CoralDryFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.CropGrowFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
|
||||
@ -261,10 +260,7 @@ public class BlockEventListener implements Listener {
|
||||
final BlockFace facing = piston.getFacing();
|
||||
location = location.add(facing.getModX(), facing.getModY(), facing.getModZ());
|
||||
Plot newPlot = area.getOwnedPlotAbs(location);
|
||||
if (plot.equals(newPlot)) {
|
||||
return;
|
||||
}
|
||||
if (!plot.isMerged() || !plot.getConnectedPlots().contains(newPlot)) {
|
||||
if (!plot.equals(newPlot)) {
|
||||
event.setCancelled(true);
|
||||
plot.debug("Prevented piston update because of invalid edge piston detection");
|
||||
}
|
||||
@ -590,12 +586,6 @@ public class BlockEventListener implements Listener {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
if (event.getNewState().getType().toString().endsWith("CONCRETE")) {
|
||||
if (!plot.getFlag(ConcreteHardenFlag.class)) {
|
||||
plot.debug("Concrete powder could not harden because concrete-harden = false");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
@ -1126,7 +1116,6 @@ public class BlockEventListener implements Listener {
|
||||
if (plot != null) {
|
||||
plot.debug("Explosion was cancelled because explosion = false");
|
||||
}
|
||||
return;
|
||||
}
|
||||
event.blockList().removeIf(blox -> !plot.equals(area.getOwnedPlot(BukkitUtil.adapt(blox.getLocation()))));
|
||||
}
|
||||
|
@ -26,7 +26,6 @@ import com.plotsquared.core.plot.Plot;
|
||||
import com.plotsquared.core.plot.PlotArea;
|
||||
import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.SculkSensorInteractFlag;
|
||||
import com.plotsquared.core.util.PlotFlagUtil;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
@ -97,12 +96,12 @@ public class BlockEventListener117 implements Listener {
|
||||
area,
|
||||
MiscInteractFlag.class,
|
||||
true
|
||||
) || plot != null && (!plot.getFlag(MiscInteractFlag.class) || !plot.getFlag(SculkSensorInteractFlag.class))) {
|
||||
) || plot != null && !plot.getFlag(
|
||||
MiscInteractFlag.class)) {
|
||||
if (plotPlayer != null) {
|
||||
if (plot != null) {
|
||||
if (!plot.isAdded(plotPlayer.getUUID())) {
|
||||
plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because both " +
|
||||
"sculk-sensor-interact and misc-interact = false");
|
||||
plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because misc-interact = false");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
@ -113,15 +112,13 @@ public class BlockEventListener117 implements Listener {
|
||||
if (plot != null) {
|
||||
if (itemThrower == null && (itemThrower = item.getOwner()) == null) {
|
||||
plot.debug(
|
||||
"A thrown item couldn't trigger sculk sensors because both sculk-sensor-interact and " +
|
||||
"misc-interact = false and the item's owner could not be resolved.");
|
||||
"A thrown item couldn't trigger sculk sensors because misc-interact = false and the item's owner could not be resolved.");
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
if (!plot.isAdded(itemThrower)) {
|
||||
if (!plot.isAdded(itemThrower)) {
|
||||
plot.debug("A thrown item couldn't trigger sculk sensors because both sculk-sensor-interact and " +
|
||||
"misc-interact = false");
|
||||
plot.debug("A thrown item couldn't trigger sculk sensors because misc-interact = false");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
@ -140,6 +137,7 @@ public class BlockEventListener117 implements Listener {
|
||||
if (area == null) {
|
||||
for (int i = blocks.size() - 1; i >= 0; i--) {
|
||||
Location blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
|
||||
blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
|
||||
if (blockLocation.isPlotArea()) {
|
||||
blocks.remove(i);
|
||||
}
|
||||
|
@ -26,7 +26,6 @@ import com.plotsquared.core.plot.Plot;
|
||||
import com.plotsquared.core.plot.PlotArea;
|
||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||
import com.plotsquared.core.plot.world.SinglePlotArea;
|
||||
import com.plotsquared.core.util.ReflectionUtils;
|
||||
import com.plotsquared.core.util.ReflectionUtils.RefClass;
|
||||
import com.plotsquared.core.util.ReflectionUtils.RefField;
|
||||
import com.plotsquared.core.util.ReflectionUtils.RefMethod;
|
||||
@ -65,11 +64,9 @@ public class ChunkListener implements Listener {
|
||||
private final PlotAreaManager plotAreaManager;
|
||||
private final int version;
|
||||
|
||||
private RefMethod methodSetUnsaved;
|
||||
private RefMethod methodGetHandleChunk;
|
||||
private RefMethod methodGetHandleWorld;
|
||||
private RefField mustNotSave;
|
||||
private Object objChunkStatusFull = null;
|
||||
private RefField mustSave;
|
||||
/*
|
||||
private RefMethod methodGetFullChunk;
|
||||
private RefMethod methodGetBukkitChunk;
|
||||
@ -82,6 +79,7 @@ public class ChunkListener implements Listener {
|
||||
*/
|
||||
private Chunk lastChunk;
|
||||
private boolean ignoreUnload = false;
|
||||
private boolean isTrueForNotSave = true;
|
||||
|
||||
@Inject
|
||||
public ChunkListener(final @NonNull PlotAreaManager plotAreaManager) {
|
||||
@ -92,27 +90,22 @@ public class ChunkListener implements Listener {
|
||||
}
|
||||
try {
|
||||
RefClass classCraftWorld = getRefClass("{cb}.CraftWorld");
|
||||
this.methodGetHandleWorld = classCraftWorld.getMethod("getHandle");
|
||||
RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
|
||||
ReflectionUtils.RefClass classChunkAccess = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
|
||||
this.methodSetUnsaved = classChunkAccess.getMethod("a", boolean.class);
|
||||
try {
|
||||
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle");
|
||||
} catch (NoSuchMethodException ignored) {
|
||||
try {
|
||||
RefClass classChunkStatus = getRefClass("net.minecraft.world.level.chunk.ChunkStatus");
|
||||
this.objChunkStatusFull = classChunkStatus.getRealClass().getField("n").get(null);
|
||||
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle", classChunkStatus.getRealClass());
|
||||
} catch (NoSuchMethodException ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
}
|
||||
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle");
|
||||
try {
|
||||
if (version < 17) {
|
||||
RefClass classChunk = getRefClass("{nms}.Chunk");
|
||||
this.mustNotSave = classChunk.getField("mustNotSave");
|
||||
if (version == 13) {
|
||||
this.mustSave = classChunk.getField("mustSave");
|
||||
this.isTrueForNotSave = false;
|
||||
} else {
|
||||
this.mustSave = classChunk.getField("mustNotSave");
|
||||
}
|
||||
} else {
|
||||
RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
|
||||
this.mustNotSave = classChunk.getField("mustNotSave");
|
||||
this.mustSave = classChunk.getField("mustNotSave");
|
||||
|
||||
}
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
@ -174,13 +167,10 @@ public class ChunkListener implements Listener {
|
||||
if (safe && shouldSave(world, chunk.getX(), chunk.getZ())) {
|
||||
return false;
|
||||
}
|
||||
Object c = objChunkStatusFull != null
|
||||
? this.methodGetHandleChunk.of(chunk).call(objChunkStatusFull)
|
||||
: this.methodGetHandleChunk.of(chunk).call();
|
||||
RefField.RefExecutor field = this.mustNotSave.of(c);
|
||||
methodSetUnsaved.of(c).call(false);
|
||||
if (!((Boolean) field.get())) {
|
||||
field.set(true);
|
||||
Object c = this.methodGetHandleChunk.of(chunk).call();
|
||||
RefField.RefExecutor field = this.mustSave.of(c);
|
||||
if ((Boolean) field.get() != isTrueForNotSave) {
|
||||
field.set(isTrueForNotSave);
|
||||
if (chunk.isLoaded()) {
|
||||
ignoreUnload = true;
|
||||
chunk.unload(false);
|
||||
|
@ -35,7 +35,6 @@ import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.EntityChangeBlockFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.ExplosionFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.InvincibleFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.ProjectileChangeBlockFlag;
|
||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||
import com.plotsquared.core.util.EventDispatcher;
|
||||
import com.plotsquared.core.util.PlotFlagUtil;
|
||||
@ -144,10 +143,6 @@ public class EntityEventListener implements Listener {
|
||||
if (area == null) {
|
||||
return;
|
||||
}
|
||||
// Armour-stands are handled elsewhere and should not be handled by area-wide entity-spawn options
|
||||
if (entity.getType() == EntityType.ARMOR_STAND) {
|
||||
return;
|
||||
}
|
||||
CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason();
|
||||
switch (reason.toString()) {
|
||||
case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> {
|
||||
@ -157,8 +152,7 @@ public class EntityEventListener implements Listener {
|
||||
}
|
||||
}
|
||||
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
|
||||
"TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL",
|
||||
"DUPLICATION", "FROZEN", "SPELL", "DEFAULT" -> {
|
||||
"TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> {
|
||||
if (!area.isMobSpawning()) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
@ -171,7 +165,7 @@ public class EntityEventListener implements Listener {
|
||||
}
|
||||
}
|
||||
case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
|
||||
if (!area.isSpawnCustom()) {
|
||||
if (!area.isSpawnCustom() && entity.getType() != EntityType.ARMOR_STAND) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
@ -359,13 +353,13 @@ public class EntityEventListener implements Listener {
|
||||
if (shooter instanceof Player) {
|
||||
PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter);
|
||||
if (plot == null) {
|
||||
if (area.isRoadFlags() && !area.getRoadFlag(ProjectileChangeBlockFlag.class) && !pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
|
||||
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
|
||||
entity.remove();
|
||||
event.setCancelled(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (plot.isAdded(pp.getUUID()) || plot.getFlag(ProjectileChangeBlockFlag.class) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
|
||||
if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
|
||||
return;
|
||||
}
|
||||
entity.remove();
|
||||
|
@ -124,7 +124,7 @@ public class PaperListener implements Listener {
|
||||
}
|
||||
Slime slime = event.getEntity();
|
||||
|
||||
Block b = slime.getTargetBlockExact(4);
|
||||
Block b = slime.getTargetBlock(4);
|
||||
if (b == null) {
|
||||
return;
|
||||
}
|
||||
@ -166,16 +166,12 @@ public class PaperListener implements Listener {
|
||||
}
|
||||
Location location = BukkitUtil.adapt(event.getSpawnLocation());
|
||||
PlotArea area = location.getPlotArea();
|
||||
if (area == null) {
|
||||
if (!location.isPlotArea()) {
|
||||
return;
|
||||
}
|
||||
// Armour-stands are handled elsewhere and should not be handled by area-wide entity-spawn options
|
||||
if (event.getType() == EntityType.ARMOR_STAND) {
|
||||
return;
|
||||
}
|
||||
// If entities are spawning... the chunk should be loaded?
|
||||
//If entities are spawning... the chunk should be loaded?
|
||||
Entity[] entities = event.getSpawnLocation().getChunk().getEntities();
|
||||
if (entities.length >= Settings.Chunk_Processor.MAX_ENTITIES) {
|
||||
if (entities.length > Settings.Chunk_Processor.MAX_ENTITIES) {
|
||||
event.setShouldAbortSpawn(true);
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
@ -204,7 +200,7 @@ public class PaperListener implements Listener {
|
||||
}
|
||||
}
|
||||
case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
|
||||
if (!area.isSpawnCustom()) {
|
||||
if (!area.isSpawnCustom() && event.getType() != EntityType.ARMOR_STAND) {
|
||||
event.setShouldAbortSpawn(true);
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
|
@ -50,7 +50,6 @@ import com.plotsquared.core.plot.flag.implementations.DenyPortalsFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.DenyTeleportFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.DropProtectionFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.EditSignFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.HangingBreakFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.HangingPlaceFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.HostileInteractFlag;
|
||||
@ -88,7 +87,6 @@ import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.block.data.Waterlogged;
|
||||
import org.bukkit.command.PluginCommand;
|
||||
import org.bukkit.entity.ArmorStand;
|
||||
@ -177,33 +175,6 @@ public class PlayerEventListener implements Listener {
|
||||
Material.WRITABLE_BOOK,
|
||||
Material.WRITTEN_BOOK
|
||||
);
|
||||
private static final Set<String> DYES;
|
||||
static {
|
||||
Set<String> mutableDyes = new HashSet<>(Set.of(
|
||||
"WHITE_DYE",
|
||||
"LIGHT_GRAY_DYE",
|
||||
"GRAY_DYE",
|
||||
"BLACK_DYE",
|
||||
"BROWN_DYE",
|
||||
"RED_DYE",
|
||||
"ORANGE_DYE",
|
||||
"YELLOW_DYE",
|
||||
"LIME_DYE",
|
||||
"GREEN_DYE",
|
||||
"CYAN_DYE",
|
||||
"LIGHT_BLUE_DYE",
|
||||
"BLUE_DYE",
|
||||
"PURPLE_DYE",
|
||||
"MAGENTA_DYE",
|
||||
"PINK_DYE",
|
||||
"GLOW_INK_SAC"
|
||||
));
|
||||
int[] version = PlotSquared.platform().serverVersion();
|
||||
if (version[1] >= 20 && version[2] >= 1) {
|
||||
mutableDyes.add("HONEYCOMB");
|
||||
}
|
||||
DYES = Set.copyOf(mutableDyes);
|
||||
}
|
||||
private final EventDispatcher eventDispatcher;
|
||||
private final WorldEdit worldEdit;
|
||||
private final PlotAreaManager plotAreaManager;
|
||||
@ -236,40 +207,6 @@ public class PlayerEventListener implements Listener {
|
||||
this.plotListener = plotListener;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onPlayerDyeSign(PlayerInteractEvent event) {
|
||||
ItemStack itemStack = event.getItem();
|
||||
if (itemStack == null) {
|
||||
return;
|
||||
}
|
||||
Block block = event.getClickedBlock();
|
||||
if (block != null && block.getState() instanceof Sign) {
|
||||
if (DYES.contains(itemStack.getType().toString())) {
|
||||
Location location = BukkitUtil.adapt(block.getLocation());
|
||||
PlotArea area = location.getPlotArea();
|
||||
if (area == null) {
|
||||
return;
|
||||
}
|
||||
Plot plot = location.getOwnedPlot();
|
||||
if (plot == null) {
|
||||
if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, EditSignFlag.class, false)
|
||||
&& !event.getPlayer().hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString())) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (plot.isAdded(event.getPlayer().getUniqueId())) {
|
||||
return; // allow for added players
|
||||
}
|
||||
if (!plot.getFlag(EditSignFlag.class)
|
||||
&& !event.getPlayer().hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER.toString())) {
|
||||
plot.debug(event.getPlayer().getName() + " could not color the sign because of edit-sign = false");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onEffect(@NonNull EntityPotionEffectEvent event) {
|
||||
if (Settings.Enabled_Components.DISABLE_BEACON_EFFECT_OVERFLOW ||
|
||||
@ -432,7 +369,6 @@ public class PlayerEventListener implements Listener {
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
@SuppressWarnings("deprecation") // Paper deprecation
|
||||
public void onConnect(PlayerJoinEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
PlotSquared.platform().playerManager().removePlayer(player.getUniqueId());
|
||||
@ -671,7 +607,7 @@ public class PlayerEventListener implements Listener {
|
||||
this.tmpTeleport = true;
|
||||
return;
|
||||
}
|
||||
int border = area.getBorder(true);
|
||||
int border = area.getBorder();
|
||||
int x1;
|
||||
if (x2 > border && this.tmpTeleport) {
|
||||
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
|
||||
@ -766,7 +702,7 @@ public class PlayerEventListener implements Listener {
|
||||
this.tmpTeleport = true;
|
||||
return;
|
||||
}
|
||||
int border = area.getBorder(true);
|
||||
int border = area.getBorder();
|
||||
int z1;
|
||||
if (z2 > border && this.tmpTeleport) {
|
||||
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
|
||||
@ -797,7 +733,6 @@ public class PlayerEventListener implements Listener {
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
@SuppressWarnings("deprecation") // Paper deprecation
|
||||
public void onChat(AsyncPlayerChatEvent event) {
|
||||
if (event.isCancelled()) {
|
||||
return;
|
||||
@ -1128,7 +1063,6 @@ public class PlayerEventListener implements Listener {
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
@SuppressWarnings("deprecation") // Paper deprecation
|
||||
public void onCancelledInteract(PlayerInteractEvent event) {
|
||||
if (event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_AIR) {
|
||||
Player player = event.getPlayer();
|
||||
@ -1233,7 +1167,7 @@ public class PlayerEventListener implements Listener {
|
||||
}
|
||||
}
|
||||
if (type.isEdible()) {
|
||||
//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 ot be fired
|
||||
return;
|
||||
}
|
||||
if (type == Material.ARMOR_STAND) {
|
||||
|
@ -1,66 +0,0 @@
|
||||
/*
|
||||
* PlotSquared, a land and world management plugin for Minecraft.
|
||||
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
||||
* Copyright (C) IntellectualSites team and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.plotsquared.bukkit.listener;
|
||||
|
||||
import com.plotsquared.bukkit.util.BukkitUtil;
|
||||
import com.plotsquared.core.location.Location;
|
||||
import com.plotsquared.core.permissions.Permission;
|
||||
import com.plotsquared.core.plot.Plot;
|
||||
import com.plotsquared.core.plot.PlotArea;
|
||||
import com.plotsquared.core.plot.flag.implementations.EditSignFlag;
|
||||
import com.plotsquared.core.util.PlotFlagUtil;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerSignOpenEvent;
|
||||
|
||||
/**
|
||||
* For events since 1.20.1
|
||||
* @since 7.2.1
|
||||
*/
|
||||
public class PlayerEventListener1201 implements Listener {
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
@SuppressWarnings({"removal", "UnstableApiUsage"}) // thanks Paper, thanks Spigot
|
||||
public void onPlayerSignOpenEvent(PlayerSignOpenEvent event) {
|
||||
Sign sign = event.getSign();
|
||||
Location location = BukkitUtil.adapt(sign.getLocation());
|
||||
PlotArea area = location.getPlotArea();
|
||||
if (area == null) {
|
||||
return;
|
||||
}
|
||||
Plot plot = location.getOwnedPlot();
|
||||
if (plot == null) {
|
||||
if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, EditSignFlag.class, false)
|
||||
&& !event.getPlayer().hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString())) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (plot.isAdded(event.getPlayer().getUniqueId())) {
|
||||
return; // allow for added players
|
||||
}
|
||||
if (!plot.getFlag(EditSignFlag.class)
|
||||
&& !event.getPlayer().hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER.toString())) {
|
||||
plot.debug(event.getPlayer().getName() + " could not edit the sign because of edit-sign = false");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -21,14 +21,9 @@ package com.plotsquared.bukkit.listener;
|
||||
import com.google.inject.Inject;
|
||||
import com.plotsquared.bukkit.BukkitPlatform;
|
||||
import com.plotsquared.bukkit.placeholder.MVdWPlaceholders;
|
||||
import com.plotsquared.bukkit.util.BukkitEconHandler;
|
||||
import com.plotsquared.core.PlotSquared;
|
||||
import com.plotsquared.core.configuration.Settings;
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.player.ConsolePlayer;
|
||||
import com.plotsquared.core.util.EconHandler;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
@ -37,8 +32,6 @@ import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
|
||||
public class ServerListener implements Listener {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ServerListener.class.getSimpleName());
|
||||
|
||||
private final BukkitPlatform plugin;
|
||||
|
||||
@Inject
|
||||
@ -52,29 +45,6 @@ public class ServerListener implements Listener {
|
||||
new MVdWPlaceholders(this.plugin, this.plugin.placeholderRegistry());
|
||||
ConsolePlayer.getConsole().sendMessage(TranslatableCaption.of("placeholder.hooked"));
|
||||
}
|
||||
if (Settings.Enabled_Components.ECONOMY && Bukkit.getPluginManager().isPluginEnabled("Vault")) {
|
||||
EconHandler econHandler = new BukkitEconHandler();
|
||||
try {
|
||||
if (!econHandler.init()) {
|
||||
LOGGER.warn("Economy is enabled but no plugin is providing an economy service. Falling back...");
|
||||
econHandler = EconHandler.nullEconHandler();
|
||||
}
|
||||
} catch (final Exception ignored) {
|
||||
econHandler = EconHandler.nullEconHandler();
|
||||
}
|
||||
if (PlotSquared.platform().econHandler() instanceof MutableEconHandler meh) {
|
||||
meh.setImplementation(econHandler);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal use only. Required to implement lazy econ loading using Guice.
|
||||
*
|
||||
* @since 7.2.0
|
||||
*/
|
||||
public interface MutableEconHandler {
|
||||
void setImplementation(EconHandler econHandler);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -31,39 +31,45 @@ import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.world.ChunkEvent;
|
||||
import org.bukkit.event.world.ChunkLoadEvent;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
|
||||
|
||||
public class SingleWorldListener implements Listener {
|
||||
|
||||
private final Method methodSetUnsaved;
|
||||
private Method methodGetHandleChunk;
|
||||
private Object objChunkStatusFull = null;
|
||||
private final Method methodGetHandleChunk;
|
||||
private Field shouldSave = null;
|
||||
|
||||
public SingleWorldListener() throws Exception {
|
||||
ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
|
||||
ReflectionUtils.RefClass classChunkAccess = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
|
||||
this.methodSetUnsaved = classChunkAccess.getMethod("a", boolean.class).getRealMethod();
|
||||
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod();
|
||||
try {
|
||||
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod();
|
||||
} catch (NoSuchMethodException ignored) {
|
||||
try {
|
||||
ReflectionUtils.RefClass classChunkStatus = getRefClass("net.minecraft.world.level.chunk.ChunkStatus");
|
||||
this.objChunkStatusFull = classChunkStatus.getRealClass().getField("n").get(null);
|
||||
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle", classChunkStatus.getRealClass()).getRealMethod();
|
||||
} catch (NoSuchMethodException ex) {
|
||||
throw new RuntimeException(ex);
|
||||
if (PlotSquared.platform().serverVersion()[1] < 17) {
|
||||
ReflectionUtils.RefClass classChunk = getRefClass("{nms}.Chunk");
|
||||
if (PlotSquared.platform().serverVersion()[1] == 13) {
|
||||
this.shouldSave = classChunk.getField("mustSave").getRealField();
|
||||
} else {
|
||||
this.shouldSave = classChunk.getField("s").getRealField();
|
||||
}
|
||||
} else if (PlotSquared.platform().serverVersion()[1] == 17) {
|
||||
ReflectionUtils.RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
|
||||
this.shouldSave = classChunk.getField("r").getRealField();
|
||||
} else if (PlotSquared.platform().serverVersion()[1] == 18) {
|
||||
ReflectionUtils.RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
|
||||
this.shouldSave = classChunk.getField("b").getRealField();
|
||||
}
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void markChunkAsClean(Chunk chunk) {
|
||||
try {
|
||||
Object nmsChunk = objChunkStatusFull != null
|
||||
? this.methodGetHandleChunk.invoke(chunk, objChunkStatusFull)
|
||||
: this.methodGetHandleChunk.invoke(chunk);
|
||||
methodSetUnsaved.invoke(nmsChunk, false);
|
||||
Object nmsChunk = methodGetHandleChunk.invoke(chunk);
|
||||
if (shouldSave != null) {
|
||||
this.shouldSave.set(nmsChunk, false);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@ -79,12 +85,7 @@ public class SingleWorldListener implements Listener {
|
||||
if (!SinglePlotArea.isSinglePlotWorld(name)) {
|
||||
return;
|
||||
}
|
||||
int x = event.getChunk().getX();
|
||||
int z = event.getChunk().getZ();
|
||||
if (x < 16 && x > -16 && z < 16 && z > -16) {
|
||||
// Allow spawn to generate
|
||||
return;
|
||||
}
|
||||
|
||||
markChunkAsClean(event.getChunk());
|
||||
}
|
||||
|
||||
|
@ -158,7 +158,6 @@ public class BukkitPlayer extends PlotPlayer<Player> {
|
||||
}
|
||||
final String[] nodes = stub.split("\\.");
|
||||
final StringBuilder n = new StringBuilder();
|
||||
// Wildcard check from less specific permission to more specific permission
|
||||
for (int i = 0; i < (nodes.length - 1); i++) {
|
||||
n.append(nodes[i]).append(".");
|
||||
if (!stub.equals(n + Permission.PERMISSION_STAR.toString())) {
|
||||
@ -167,11 +166,9 @@ public class BukkitPlayer extends PlotPlayer<Player> {
|
||||
}
|
||||
}
|
||||
}
|
||||
// Wildcard check for the full permission
|
||||
if (hasPermission(stub + ".*")) {
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
// Permission value cache for iterative check
|
||||
int max = 0;
|
||||
if (CHECK_EFFECTIVE) {
|
||||
boolean hasAny = false;
|
||||
|
@ -44,7 +44,6 @@ import java.util.stream.IntStream;
|
||||
@Singleton
|
||||
public class BukkitInventoryUtil extends InventoryUtil {
|
||||
|
||||
@SuppressWarnings("deprecation") // Paper deprecation
|
||||
private static @Nullable ItemStack getItem(PlotItemStack item) {
|
||||
if (item == null) {
|
||||
return null;
|
||||
|
@ -67,7 +67,6 @@ public class BukkitSetupUtils extends SetupUtils {
|
||||
this.worldFile = worldFile;
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation") // Paper deprecation
|
||||
@Override
|
||||
public void updateGenerators(final boolean force) {
|
||||
if (loaded && !SetupUtils.generators.isEmpty() && !force) {
|
||||
|
@ -28,58 +28,24 @@ import java.nio.file.Paths;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* This is a helper class which replaces older syntax no longer supported by MiniMessage with replacements in messages_%.json.
|
||||
* This is a helper class which replaces occurrences of 'suggest_command' with 'run_command' in messages_%.json.
|
||||
* MiniMessage changed the syntax between major releases. To warrant a smooth upgrade, we attempt to replace any occurrences
|
||||
* while loading PlotSquared.
|
||||
*
|
||||
* @since 7.0.0
|
||||
* @since TODO
|
||||
*/
|
||||
@NotPublic
|
||||
public class TranslationUpdateManager {
|
||||
|
||||
public static void upgradeTranslationFile() throws IOException {
|
||||
String suggestCommand = "suggest_command";
|
||||
String suggestCommandReplacement = "run_command";
|
||||
String minHeight = "minHeight";
|
||||
String minheightReplacement = "minheight";
|
||||
String maxHeight = "maxHeight";
|
||||
String maxheightReplacement = "maxheight";
|
||||
String usedGrants = "usedGrants";
|
||||
String usedGrantsReplacement = "used_grants";
|
||||
String remainingGrants = "remainingGrants";
|
||||
String remainingGrantsReplacement = "remaining_grants";
|
||||
String minimumRadius = "minimumRadius";
|
||||
String minimumRadiusReplacement = "minimum_radius";
|
||||
String maximumMoves = "maximumMoves";
|
||||
String maximumMovesReplacement = "maximum_moves";
|
||||
String userMove = "userMove";
|
||||
String userMoveReplacement = "user_move";
|
||||
|
||||
// tag opening / closing characters are important, as the locale keys exist as well, which should not be replaced
|
||||
String listInfoUnknown = "<info.unknown>";
|
||||
String listInfoUnknownReplacement = "<unknown>";
|
||||
String listInfoServer = "<info.server>";
|
||||
String listInfoServerReplacement = "<server>";
|
||||
String listInfoEveryone = "<info.everyone>";
|
||||
String listInfoEveryoneReplacement = "<everyone>";
|
||||
String searchText = "suggest_command";
|
||||
String replacementText = "run_command";
|
||||
|
||||
try (Stream<Path> paths = Files.walk(Paths.get(PlotSquared.platform().getDirectory().toPath().resolve("lang").toUri()))) {
|
||||
paths
|
||||
.filter(Files::isRegularFile)
|
||||
.filter(p -> p.getFileName().toString().matches("messages_[a-z]{2}\\.json"))
|
||||
.forEach(p -> {
|
||||
replaceInFile(p, suggestCommand, suggestCommandReplacement);
|
||||
replaceInFile(p, minHeight, minheightReplacement);
|
||||
replaceInFile(p, maxHeight, maxheightReplacement);
|
||||
replaceInFile(p, usedGrants, usedGrantsReplacement);
|
||||
replaceInFile(p, remainingGrants, remainingGrantsReplacement);
|
||||
replaceInFile(p, minimumRadius, minimumRadiusReplacement);
|
||||
replaceInFile(p, maximumMoves, maximumMovesReplacement);
|
||||
replaceInFile(p, userMove, userMoveReplacement);
|
||||
replaceInFile(p, listInfoUnknown, listInfoUnknownReplacement);
|
||||
replaceInFile(p, listInfoServer, listInfoServerReplacement);
|
||||
replaceInFile(p, listInfoEveryone, listInfoEveryoneReplacement);
|
||||
});
|
||||
.forEach(p -> replaceInFile(p, searchText, replacementText));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,7 @@ import org.bukkit.scheduler.BukkitTask;
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
|
||||
public class UpdateUtility implements Listener {
|
||||
|
||||
@ -59,9 +59,8 @@ public class UpdateUtility implements Listener {
|
||||
public void updateChecker() {
|
||||
task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> {
|
||||
try {
|
||||
HttpsURLConnection connection = (HttpsURLConnection) URI.create(
|
||||
"https://api.spigotmc.org/simple/0.2/index.php?action=getResource&id=77506")
|
||||
.toURL()
|
||||
HttpsURLConnection connection = (HttpsURLConnection) new URL(
|
||||
"https://api.spigotmc.org/simple/0.1/index.php?action=getResource&id=77506")
|
||||
.openConnection();
|
||||
connection.setRequestMethod("GET");
|
||||
JsonObject result = new JsonParser()
|
||||
|
76
CODE_OF_CONDUCT.md
Normal file
76
CODE_OF_CONDUCT.md
Normal file
@ -0,0 +1,76 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, sex characteristics, gender identity and expression,
|
||||
level of experience, education, socio-economic status, nationality, personal
|
||||
appearance, race, religion, or sexual identity and orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||
advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic
|
||||
address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable
|
||||
behavior and are expected to take appropriate and fair corrective action in
|
||||
response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or
|
||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community. Examples of
|
||||
representing a project or community include using an official project e-mail
|
||||
address, posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event. Representation of a project may be
|
||||
further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting the project team at contact<at>intellectualsites.com. All
|
||||
complaints will be reviewed and investigated and will result in a response that
|
||||
is deemed necessary and appropriate to the circumstances. The project team is
|
||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||
Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||
faith may face temporary or permanent repercussions as determined by other
|
||||
members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see
|
||||
https://www.contributor-covenant.org/faq
|
@ -2,23 +2,18 @@ import java.time.format.DateTimeFormatter
|
||||
|
||||
dependencies {
|
||||
// Expected everywhere.
|
||||
compileOnlyApi(libs.checkerqual)
|
||||
compileOnlyApi("org.checkerframework:checker-qual")
|
||||
|
||||
// Minecraft expectations
|
||||
compileOnlyApi(libs.gson)
|
||||
compileOnly(libs.guava)
|
||||
compileOnlyApi("com.google.code.gson:gson")
|
||||
compileOnly("com.google.guava:guava")
|
||||
|
||||
// Platform expectations
|
||||
compileOnlyApi(libs.snakeyaml)
|
||||
compileOnlyApi("org.yaml:snakeyaml")
|
||||
|
||||
// Adventure
|
||||
api(libs.adventureApi)
|
||||
api(libs.adventureMiniMessage)
|
||||
|
||||
// Cloud
|
||||
api(libs.cloud)
|
||||
api(libs.cloudMinecraftExtras)
|
||||
api(libs.cloudRequirements)
|
||||
api("net.kyori:adventure-api")
|
||||
api("net.kyori:adventure-text-minimessage")
|
||||
|
||||
// Guice
|
||||
api(libs.guice) {
|
||||
@ -36,19 +31,19 @@ dependencies {
|
||||
exclude(group = "dummypermscompat")
|
||||
}
|
||||
testImplementation(libs.worldeditCore)
|
||||
compileOnly(libs.faweBukkit) { isTransitive = false }
|
||||
testImplementation(libs.faweCore) { isTransitive = false }
|
||||
compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Core") { isTransitive = false }
|
||||
testImplementation("com.fastasyncworldedit:FastAsyncWorldEdit-Core") { isTransitive = false }
|
||||
|
||||
// Logging
|
||||
compileOnlyApi(libs.log4j)
|
||||
compileOnlyApi("org.apache.logging.log4j:log4j-api")
|
||||
|
||||
// Other libraries
|
||||
api(libs.prtree)
|
||||
api(libs.aopalliance)
|
||||
api(libs.cloudServices)
|
||||
api(libs.arkitektonika)
|
||||
api(libs.paster)
|
||||
api(libs.informativeAnnotations)
|
||||
api("com.intellectualsites.paster:Paster")
|
||||
api("com.intellectualsites.informative-annotations:informative-annotations")
|
||||
}
|
||||
|
||||
tasks.processResources {
|
||||
@ -62,8 +57,8 @@ tasks.processResources {
|
||||
|
||||
doLast {
|
||||
copy {
|
||||
from(layout.buildDirectory.file("$rootDir/LICENSE"))
|
||||
into(layout.buildDirectory.dir("resources/main"))
|
||||
from(File("$rootDir/LICENSE"))
|
||||
into("$buildDir/resources/main/")
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -73,10 +68,11 @@ tasks {
|
||||
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
|
||||
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://jd.advntr.dev/api/4.14.0/")
|
||||
opt.links("https://jd.advntr.dev/text-minimessage/4.14.0/")
|
||||
opt.links("https://jd.advntr.dev/api/4.12.0/")
|
||||
opt.links("https://jd.advntr.dev/text-minimessage/4.12.0/")
|
||||
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
|
||||
// opt.links("https://checkerframework.org/api/")
|
||||
opt.links("https://checkerframework.org/api/")
|
||||
opt.links("https://javadoc.io/doc/com.intellectualsites.informative-annotations/informative-annotations/latest/")
|
||||
opt.isLinkSource = true
|
||||
opt.bottom(File("$rootDir/javadocfooter.html").readText())
|
||||
opt.isUse = true
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
package com.plotsquared.core;
|
||||
|
||||
import cloud.commandframework.services.ServicePipeline;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Key;
|
||||
import com.google.inject.TypeLiteral;
|
||||
@ -46,7 +47,6 @@ import net.kyori.adventure.audience.Audience;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
import org.incendo.cloud.services.ServicePipeline;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
|
@ -84,7 +84,7 @@ import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.net.URI;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Files;
|
||||
@ -210,10 +210,9 @@ public class PlotSquared {
|
||||
try {
|
||||
URL logurl = PlotSquared.class.getProtectionDomain().getCodeSource().getLocation();
|
||||
this.jarFile = new File(
|
||||
URI.create(
|
||||
logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file"))
|
||||
.getPath());
|
||||
} catch (URISyntaxException | SecurityException e) {
|
||||
new URL(logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file"))
|
||||
.toURI().getPath());
|
||||
} catch (MalformedURLException | URISyntaxException | SecurityException e) {
|
||||
e.printStackTrace();
|
||||
this.jarFile = new File(this.platform.getDirectory().getParentFile(), "PlotSquared.jar");
|
||||
if (!this.jarFile.exists()) {
|
||||
@ -1282,7 +1281,7 @@ public class PlotSquared {
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up the database connection.
|
||||
* Setup the database connection.
|
||||
*/
|
||||
public void setupDatabase() {
|
||||
try {
|
||||
|
@ -19,7 +19,6 @@
|
||||
package com.plotsquared.core.command;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.plotsquared.core.PlotSquared;
|
||||
import com.plotsquared.core.configuration.Settings;
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.database.DBFunc;
|
||||
@ -102,14 +101,9 @@ public class Add extends Command {
|
||||
Permission.PERMISSION_ADMIN_COMMAND_TRUST))) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("errors.invalid_player"),
|
||||
PlotSquared
|
||||
.platform()
|
||||
.playerManager()
|
||||
.getUsernameCaption(uuid)
|
||||
.thenApply(caption -> TagResolver.resolver(
|
||||
"value",
|
||||
Tag.inserting(caption.toComponent(player))
|
||||
))
|
||||
TagResolver.resolver("value", Tag.inserting(
|
||||
PlayerManager.resolveName(uuid).toComponent(player)
|
||||
))
|
||||
);
|
||||
iterator.remove();
|
||||
continue;
|
||||
@ -117,11 +111,9 @@ public class Add extends Command {
|
||||
if (plot.isOwner(uuid)) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("member.already_added"),
|
||||
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||
.thenApply(caption -> TagResolver.resolver(
|
||||
"player",
|
||||
Tag.inserting(caption.toComponent(player))
|
||||
))
|
||||
TagResolver.resolver("player", Tag.inserting(
|
||||
PlayerManager.resolveName(uuid).toComponent(player)
|
||||
))
|
||||
);
|
||||
iterator.remove();
|
||||
continue;
|
||||
@ -129,11 +121,9 @@ public class Add extends Command {
|
||||
if (plot.getMembers().contains(uuid)) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("member.already_added"),
|
||||
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||
.thenApply(caption -> TagResolver.resolver(
|
||||
"player",
|
||||
Tag.inserting(caption.toComponent(player))
|
||||
))
|
||||
TagResolver.resolver("player", Tag.inserting(
|
||||
PlayerManager.resolveName(uuid).toComponent(player)
|
||||
))
|
||||
);
|
||||
iterator.remove();
|
||||
continue;
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
package com.plotsquared.core.command;
|
||||
|
||||
import cloud.commandframework.services.ServicePipeline;
|
||||
import com.google.inject.Inject;
|
||||
import com.plotsquared.core.PlotSquared;
|
||||
import com.plotsquared.core.configuration.Settings;
|
||||
@ -48,7 +49,6 @@ import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
import org.incendo.cloud.services.ServicePipeline;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
@ -131,8 +131,8 @@ public class Auto extends SubCommand {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("economy.removed_granted_plot"),
|
||||
TagResolver.builder()
|
||||
.tag("used_grants", Tag.inserting(Component.text(grantedPlots - left)))
|
||||
.tag("remaining_grants", Tag.inserting(Component.text(left)))
|
||||
.tag("usedGrants", Tag.inserting(Component.text(grantedPlots - left)))
|
||||
.tag("remainingGrants", Tag.inserting(Component.text(left)))
|
||||
.build()
|
||||
);
|
||||
}
|
||||
@ -294,15 +294,12 @@ public class Auto extends SubCommand {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (this.econHandler != null && plotarea.useEconomy() && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
|
||||
if (this.econHandler != null && plotarea.useEconomy()) {
|
||||
PlotExpression costExp = plotarea.getPrices().get("claim");
|
||||
PlotExpression mergeCostExp = plotarea.getPrices().get("merge");
|
||||
int size = sizeX * sizeZ;
|
||||
double mergeCost = size <= 1 || mergeCostExp == null ? 0d : mergeCostExp.evaluate(size);
|
||||
double cost = costExp.evaluate(Settings.Limit.GLOBAL ?
|
||||
player.getPlotCount() :
|
||||
player.getPlotCount(plotarea.getWorldName()));
|
||||
cost = size * cost + mergeCost;
|
||||
cost = (sizeX * sizeZ) * cost;
|
||||
if (cost > 0d) {
|
||||
if (!this.econHandler.isSupported()) {
|
||||
player.sendMessage(TranslatableCaption.of("economy.vault_or_consumer_null"));
|
||||
@ -332,7 +329,7 @@ public class Auto extends SubCommand {
|
||||
List<Plot> plots = this.servicePipeline
|
||||
.pump(new AutoQuery(player, null, sizeX, sizeZ, plotarea))
|
||||
.through(AutoService.class)
|
||||
.complete();
|
||||
.getResult();
|
||||
|
||||
plots = this.eventDispatcher.callAutoPlotsChosen(player, plots).getPlots();
|
||||
|
||||
|
@ -141,7 +141,7 @@ public class Claim extends SubCommand {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.econHandler.isEnabled(area) && !force && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
|
||||
if (this.econHandler.isEnabled(area) && !force) {
|
||||
PlotExpression costExr = area.getPrices().get("claim");
|
||||
double cost = costExr.evaluate(currentPlots);
|
||||
if (cost > 0d) {
|
||||
@ -186,14 +186,14 @@ public class Claim extends SubCommand {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("economy.removed_granted_plot"),
|
||||
TagResolver.builder()
|
||||
.tag("used_grants", Tag.inserting(Component.text(grants - 1)))
|
||||
.tag("remaining_grants", Tag.inserting(Component.text(grants)))
|
||||
.tag("usedGrants", Tag.inserting(Component.text(grants - 1)))
|
||||
.tag("remainingGrants", Tag.inserting(Component.text(grants)))
|
||||
.build()
|
||||
);
|
||||
}
|
||||
}
|
||||
if (!player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
|
||||
int border = area.getBorder(false);
|
||||
int border = area.getBorder();
|
||||
if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border && !force) {
|
||||
player.sendMessage(TranslatableCaption.of("border.denied"));
|
||||
return false;
|
||||
|
@ -25,7 +25,6 @@ import com.plotsquared.core.player.PlotPlayer;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* CommandCategory.
|
||||
@ -83,7 +82,7 @@ public enum CommandCategory implements Caption {
|
||||
// TODO this method shouldn't be invoked
|
||||
@Deprecated
|
||||
@Override
|
||||
public @NotNull String toString() {
|
||||
public String toString() {
|
||||
return this.caption.getComponent(LocaleHolder.console());
|
||||
}
|
||||
|
||||
@ -109,5 +108,4 @@ public enum CommandCategory implements Caption {
|
||||
return !MainCommand.getInstance().getCommands(this, player).isEmpty();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -256,11 +256,11 @@ public class Condense extends SubCommand {
|
||||
player.sendMessage(TranslatableCaption.of("condense.default_eval"));
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("condense.minimum_radius"),
|
||||
TagResolver.resolver("minimum_radius", Tag.inserting(Component.text(minimumRadius)))
|
||||
TagResolver.resolver("minimumRadius", Tag.inserting(Component.text(minimumRadius)))
|
||||
);
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("condense.maximum_moved"),
|
||||
TagResolver.resolver("maximum_moves", Tag.inserting(Component.text(maxMove)))
|
||||
TagResolver.resolver("maxMove", Tag.inserting(Component.text(maxMove)))
|
||||
);
|
||||
player.sendMessage(TranslatableCaption.of("condense.input_eval"));
|
||||
player.sendMessage(
|
||||
@ -269,7 +269,7 @@ public class Condense extends SubCommand {
|
||||
);
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("condense.estimated_moves"),
|
||||
TagResolver.resolver("user_move", Tag.inserting(Component.text(userMove)))
|
||||
TagResolver.resolver("userMove", Tag.inserting(Component.text(userMove)))
|
||||
);
|
||||
player.sendMessage(TranslatableCaption.of("condense.eta"));
|
||||
player.sendMessage(TranslatableCaption.of("condense.radius_measured"));
|
||||
|
@ -29,6 +29,7 @@ import com.plotsquared.core.util.WorldUtil;
|
||||
import com.plotsquared.core.util.entity.EntityCategories;
|
||||
import com.plotsquared.core.util.entity.EntityCategory;
|
||||
import com.plotsquared.core.util.query.PlotQuery;
|
||||
import com.plotsquared.core.util.task.TaskManager;
|
||||
import com.plotsquared.core.uuid.UUIDMapping;
|
||||
import com.sk89q.worldedit.world.entity.EntityType;
|
||||
import net.kyori.adventure.text.Component;
|
||||
@ -70,7 +71,7 @@ public class Debug extends SubCommand {
|
||||
TranslatableCaption.of("commandconfig.command_syntax"),
|
||||
TagResolver.resolver(
|
||||
"value",
|
||||
Tag.inserting(Component.text("/plot debug <player | debug-players | entitytypes | msg>"))
|
||||
Tag.inserting(Component.text("/plot debug <loadedchunks | player | debug-players | entitytypes | msg>"))
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -84,6 +85,16 @@ public class Debug extends SubCommand {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (args.length > 0 && "loadedchunks".equalsIgnoreCase(args[0])) {
|
||||
final long start = System.currentTimeMillis();
|
||||
player.sendMessage(TranslatableCaption.of("debug.fetching_loaded_chunks"));
|
||||
TaskManager.runTaskAsync(() -> player.sendMessage(StaticCaption
|
||||
.of("Loaded chunks: " + this.worldUtil
|
||||
.getChunkChunks(player.getLocation().getWorldName())
|
||||
.size() + " (" + (System.currentTimeMillis()
|
||||
- start) + "ms) using thread: " + Thread.currentThread().getName())));
|
||||
return true;
|
||||
}
|
||||
if (args.length > 0 && "uuids".equalsIgnoreCase(args[0])) {
|
||||
final Collection<UUIDMapping> mappings = PlotSquared.get().getImpromptuUUIDPipeline().getAllImmediately();
|
||||
player.sendMessage(
|
||||
@ -185,7 +196,7 @@ public class Debug extends SubCommand {
|
||||
|
||||
@Override
|
||||
public Collection<Command> tab(final PlotPlayer<?> player, String[] args, boolean space) {
|
||||
return Stream.of("debug-players", "entitytypes")
|
||||
return Stream.of("loadedchunks", "debug-players", "entitytypes")
|
||||
.filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH)))
|
||||
.map(value -> new Command(null, false, value, "plots.admin", RequiredType.NONE, null) {
|
||||
}).collect(Collectors.toList());
|
||||
|
@ -96,7 +96,6 @@ public class DebugRoadRegen extends SubCommand {
|
||||
PlotArea area = location.getPlotArea();
|
||||
if (area == null) {
|
||||
player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
|
||||
return false;
|
||||
}
|
||||
Plot plot = player.getCurrentPlot();
|
||||
if (plot == null) {
|
||||
|
@ -117,11 +117,10 @@ public class Deny extends SubCommand {
|
||||
} else if (plot.getDenied().contains(uuid)) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("member.already_added"),
|
||||
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||
.thenApply(caption -> TagResolver.resolver(
|
||||
TagResolver.resolver(
|
||||
"player",
|
||||
Tag.inserting(caption.toComponent(player))
|
||||
))
|
||||
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
|
||||
)
|
||||
);
|
||||
return;
|
||||
} else {
|
||||
|
@ -94,7 +94,7 @@ public class Done extends SubCommand {
|
||||
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
|
||||
);
|
||||
final Settings.Auto_Clear doneRequirements = Settings.AUTO_CLEAR.get("done");
|
||||
if (PlotSquared.platform().expireManager() == null || doneRequirements == null || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DONE)) {
|
||||
if (PlotSquared.platform().expireManager() == null || doneRequirements == null) {
|
||||
finish(plot, player, true);
|
||||
plot.removeRunning();
|
||||
} else {
|
||||
|
@ -136,9 +136,7 @@ public class Download extends SubCommand {
|
||||
}
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("web.generation_link_success_legacy_world"),
|
||||
TagResolver.builder()
|
||||
.tag("url", Tag.preProcessParsed(url.toString()))
|
||||
.build()
|
||||
TagResolver.resolver("url", Tag.inserting(Component.text(url.toString())))
|
||||
);
|
||||
}
|
||||
});
|
||||
|
@ -103,10 +103,9 @@ public final class FlagCommand extends Command {
|
||||
if (flag instanceof IntegerFlag && MathMan.isInteger(value)) {
|
||||
try {
|
||||
int numeric = Integer.parseInt(value);
|
||||
// Getting full permission without ".<amount>" at the end
|
||||
perm = perm.substring(0, perm.length() - value.length() - 1);
|
||||
boolean result = false;
|
||||
if (numeric >= 0) {
|
||||
if (numeric > 0) {
|
||||
int checkRange = PlotSquared.get().getPlatform().equalsIgnoreCase("bukkit") ?
|
||||
numeric :
|
||||
Settings.Limit.MAX_PLOTS;
|
||||
|
@ -112,15 +112,15 @@ public class Kick extends SubCommand {
|
||||
for (PlotPlayer<?> player2 : players) {
|
||||
if (!plot.equals(player2.getCurrentPlot())) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("kick.player_not_in_plot"),
|
||||
TagResolver.resolver("player", Tag.inserting(Component.text(player2.getName())))
|
||||
TranslatableCaption.of("errors.invalid_player"),
|
||||
TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (player2.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_DENIED)) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("kick.cannot_kick_player"),
|
||||
TagResolver.resolver("player", Tag.inserting(Component.text(player2.getName())))
|
||||
TranslatableCaption.of("cluster.cannot_kick_player"),
|
||||
TagResolver.resolver("name", Tag.inserting(Component.text(player2.getName())))
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
@ -465,7 +465,7 @@ public class ListCmd extends SubCommand {
|
||||
TextComponent.Builder builder = Component.text();
|
||||
if (plot.getFlag(ServerPlotFlag.class)) {
|
||||
TagResolver serverResolver = TagResolver.resolver(
|
||||
"server",
|
||||
"info.server",
|
||||
Tag.inserting(TranslatableCaption.of("info.server").toComponent(player))
|
||||
);
|
||||
builder.append(MINI_MESSAGE.deserialize(server, serverResolver));
|
||||
@ -483,13 +483,13 @@ public class ListCmd extends SubCommand {
|
||||
builder.append(MINI_MESSAGE.deserialize(online, resolver));
|
||||
} else if (uuidMapping.username().equalsIgnoreCase("unknown")) {
|
||||
TagResolver unknownResolver = TagResolver.resolver(
|
||||
"unknown",
|
||||
"info.unknown",
|
||||
Tag.inserting(TranslatableCaption.of("info.unknown").toComponent(player))
|
||||
);
|
||||
builder.append(MINI_MESSAGE.deserialize(unknown, unknownResolver));
|
||||
} else if (uuidMapping.uuid().equals(DBFunc.EVERYONE)) {
|
||||
TagResolver everyoneResolver = TagResolver.resolver(
|
||||
"everyone",
|
||||
"info.everyone",
|
||||
Tag.inserting(TranslatableCaption.of("info.everyone").toComponent(player))
|
||||
);
|
||||
builder.append(MINI_MESSAGE.deserialize(everyone, everyoneResolver));
|
||||
@ -517,7 +517,6 @@ public class ListCmd extends SubCommand {
|
||||
}
|
||||
}
|
||||
finalResolver.tag("players", Tag.inserting(builder.asComponent()));
|
||||
finalResolver.tag("size", Tag.inserting(Component.text(plot.getConnectedPlots().size())));
|
||||
caption.set(TranslatableCaption.of("info.plot_list_item"));
|
||||
caption.setTagResolvers(finalResolver.build());
|
||||
}
|
||||
|
@ -41,7 +41,6 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
@ -117,7 +116,7 @@ public class Load extends SubCommand {
|
||||
}
|
||||
final URL url;
|
||||
try {
|
||||
url = URI.create(Settings.Web.URL + "saves/" + player.getUUID() + '/' + schematic).toURL();
|
||||
url = new URL(Settings.Web.URL + "saves/" + player.getUUID() + '/' + schematic);
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
player.sendMessage(TranslatableCaption.of("web.load_failed"));
|
||||
|
@ -183,7 +183,7 @@ public class MainCommand extends Command {
|
||||
if (cmd.hasConfirmation(player)) {
|
||||
CmdConfirm.addPending(player, cmd.getUsage(), () -> {
|
||||
PlotArea area = player.getApplicablePlotArea();
|
||||
if (area != null && econHandler.isEnabled(area) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
|
||||
if (area != null && econHandler.isEnabled(area)) {
|
||||
PlotExpression priceEval =
|
||||
area.getPrices().get(cmd.getFullId());
|
||||
double price = priceEval != null ? priceEval.evaluate(0d) : 0d;
|
||||
@ -201,7 +201,7 @@ public class MainCommand extends Command {
|
||||
return;
|
||||
}
|
||||
PlotArea area = player.getApplicablePlotArea();
|
||||
if (area != null && econHandler.isEnabled(area) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
|
||||
if (area != null && econHandler.isEnabled(area)) {
|
||||
PlotExpression priceEval = area.getPrices().get(cmd.getFullId());
|
||||
double price = priceEval != null ? priceEval.evaluate(0d) : 0d;
|
||||
if (price != 0d && econHandler.getMoney(player) < price) {
|
||||
|
@ -109,7 +109,7 @@ public class Merge extends SubCommand {
|
||||
}
|
||||
}
|
||||
if (direction == null && (args[0].equalsIgnoreCase("all") || args[0]
|
||||
.equalsIgnoreCase("auto")) && player.hasPermission(Permission.PERMISSION_MERGE_ALL)) {
|
||||
.equalsIgnoreCase("auto"))) {
|
||||
direction = Direction.ALL;
|
||||
}
|
||||
}
|
||||
@ -178,7 +178,7 @@ public class Merge extends SubCommand {
|
||||
return true;
|
||||
}
|
||||
if (plot.getPlotModificationManager().autoMerge(Direction.ALL, maxSize, uuid, player, terrain)) {
|
||||
if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
|
||||
if (this.econHandler.isEnabled(plotArea) && price > 0d) {
|
||||
this.econHandler.withdrawMoney(player, price);
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("economy.removed_balance"),
|
||||
@ -196,8 +196,8 @@ public class Merge extends SubCommand {
|
||||
player.sendMessage(TranslatableCaption.of("merge.no_available_automerge"));
|
||||
return false;
|
||||
}
|
||||
if (!force && this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d && this.econHandler.getMoney(
|
||||
player) < price) {
|
||||
if (!force && this.econHandler.isEnabled(plotArea) && price > 0d
|
||||
&& this.econHandler.getMoney(player) < price) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("economy.cannot_afford_merge"),
|
||||
TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price))))
|
||||
@ -218,7 +218,7 @@ public class Merge extends SubCommand {
|
||||
return true;
|
||||
}
|
||||
if (plot.getPlotModificationManager().autoMerge(direction, maxSize - size, uuid, player, terrain)) {
|
||||
if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
|
||||
if (this.econHandler.isEnabled(plotArea) && price > 0d) {
|
||||
this.econHandler.withdrawMoney(player, price);
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("economy.removed_balance"),
|
||||
@ -259,7 +259,7 @@ public class Merge extends SubCommand {
|
||||
accepter.sendMessage(TranslatableCaption.of("merge.merge_not_valid"));
|
||||
return;
|
||||
}
|
||||
if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
|
||||
if (this.econHandler.isEnabled(plotArea) && price > 0d) {
|
||||
if (!force && this.econHandler.getMoney(player) < price) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("economy.cannot_afford_merge"),
|
||||
@ -303,7 +303,7 @@ public class Merge extends SubCommand {
|
||||
player,
|
||||
terrain
|
||||
)) {
|
||||
if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
|
||||
if (this.econHandler.isEnabled(plotArea) && price > 0d) {
|
||||
if (!force && this.econHandler.getMoney(player) < price) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("economy.cannot_afford_merge"),
|
||||
|
@ -56,7 +56,7 @@ public class Music extends SubCommand {
|
||||
.asList("music_disc_13", "music_disc_cat", "music_disc_blocks", "music_disc_chirp",
|
||||
"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_pigstep", "music_disc_5", "music_disc_relic"
|
||||
"music_disc_pigstep", "music_disc_5"
|
||||
);
|
||||
|
||||
private final InventoryUtil inventoryUtil;
|
||||
|
@ -31,6 +31,7 @@ import com.plotsquared.core.player.PlayerMetaDataKeys;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.plot.Plot;
|
||||
import com.plotsquared.core.util.EventDispatcher;
|
||||
import com.plotsquared.core.util.PlayerManager;
|
||||
import com.plotsquared.core.util.TabCompletions;
|
||||
import com.plotsquared.core.util.task.TaskManager;
|
||||
import net.kyori.adventure.text.Component;
|
||||
@ -135,11 +136,10 @@ public class Owner extends SetCommand {
|
||||
if (plot.isOwner(uuid)) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("member.already_owner"),
|
||||
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||
.thenApply(caption -> TagResolver.resolver(
|
||||
TagResolver.resolver(
|
||||
"player",
|
||||
Tag.inserting(caption.toComponent(player))
|
||||
))
|
||||
Tag.inserting(PlayerManager.resolveName(uuid, false).toComponent(player))
|
||||
)
|
||||
);
|
||||
return;
|
||||
}
|
||||
@ -147,11 +147,10 @@ public class Owner extends SetCommand {
|
||||
if (other == null) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("errors.invalid_player_offline"),
|
||||
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||
.thenApply(caption -> TagResolver.resolver(
|
||||
TagResolver.resolver(
|
||||
"player",
|
||||
Tag.inserting(caption.toComponent(player))
|
||||
))
|
||||
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
|
||||
)
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ public class PluginCmd extends SubCommand {
|
||||
player.sendMessage(StaticCaption.of(
|
||||
"<gray>>> </gray><gold><bold>Authors<reset><gray>: </gray><gold>Citymonstret </gold><gray>& </gray><gold>Empire92 </gold><gray>& </gray><gold>MattBDev </gold><gray>& </gray><gold>dordsor21 </gold><gray>& </gray><gold>NotMyFault </gold><gray>& </gray><gold>SirYwell</gold>"));
|
||||
player.sendMessage(StaticCaption.of(
|
||||
"<gray>>> </gray><gold><bold>Wiki<reset><gray>: </gray><gold><click:open_url:https://intellectualsites.gitbook.io/plotsquared/>https://intellectualsites.gitbook.io/plotsquared/</gold>"));
|
||||
"<gray>>> </gray><gold><bold>Wiki<reset><gray>: </gray><gold><click:open_url:https://intellectualsites.github.io/plotsquared-documentation/>https://intellectualsites.github.io/plotsquared-documentation/</gold>"));
|
||||
player.sendMessage(StaticCaption.of(
|
||||
"<gray>>> </gray><gold><bold>Discord<reset><gray>: </gray><gold><click:open_url:https://discord.gg/intellectualsites>https://discord.gg/intellectualsites</gold>"));
|
||||
player.sendMessage(
|
||||
|
@ -100,17 +100,15 @@ public class Remove extends SubCommand {
|
||||
count++;
|
||||
}
|
||||
} else if (uuid == DBFunc.EVERYONE) {
|
||||
count += plot.getTrusted().size();
|
||||
if (plot.removeTrusted(uuid)) {
|
||||
this.eventDispatcher.callTrusted(player, plot, uuid, false);
|
||||
}
|
||||
count += plot.getMembers().size();
|
||||
if (plot.removeMember(uuid)) {
|
||||
count++;
|
||||
} else if (plot.removeMember(uuid)) {
|
||||
this.eventDispatcher.callMember(player, plot, uuid, false);
|
||||
}
|
||||
count += plot.getDenied().size();
|
||||
if (plot.removeDenied(uuid)) {
|
||||
count++;
|
||||
} else if (plot.removeDenied(uuid)) {
|
||||
this.eventDispatcher.callDenied(player, plot, uuid, false);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -40,7 +40,6 @@ import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
@ -131,7 +130,8 @@ public class SchematicCmd extends SubCommand {
|
||||
if (location.startsWith("url:")) {
|
||||
try {
|
||||
UUID uuid = UUID.fromString(location.substring(4));
|
||||
URL url = URI.create(Settings.Web.URL + "uploads/" + uuid + ".schematic").toURL();
|
||||
URL base = new URL(Settings.Web.URL);
|
||||
URL url = new URL(base, "uploads/" + uuid + ".schematic");
|
||||
schematic = this.schematicHandler.getSchematic(url);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
|
@ -19,7 +19,6 @@
|
||||
package com.plotsquared.core.command;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.plotsquared.core.PlotSquared;
|
||||
import com.plotsquared.core.configuration.Settings;
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.database.DBFunc;
|
||||
@ -104,11 +103,10 @@ public class Trust extends Command {
|
||||
player.hasPermission(Permission.PERMISSION_TRUST_EVERYONE) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_TRUST))) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("errors.invalid_player"),
|
||||
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||
.thenApply(caption -> TagResolver.resolver(
|
||||
TagResolver.resolver(
|
||||
"value",
|
||||
Tag.inserting(caption.toComponent(player))
|
||||
))
|
||||
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
|
||||
)
|
||||
);
|
||||
iterator.remove();
|
||||
continue;
|
||||
@ -116,11 +114,10 @@ public class Trust extends Command {
|
||||
if (currentPlot.isOwner(uuid)) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("member.already_added"),
|
||||
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||
.thenApply(caption -> TagResolver.resolver(
|
||||
"player",
|
||||
Tag.inserting(caption.toComponent(player))
|
||||
))
|
||||
TagResolver.resolver(
|
||||
"value",
|
||||
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
|
||||
)
|
||||
);
|
||||
iterator.remove();
|
||||
continue;
|
||||
@ -128,11 +125,10 @@ public class Trust extends Command {
|
||||
if (currentPlot.getTrusted().contains(uuid)) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("member.already_added"),
|
||||
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||
.thenApply(caption -> TagResolver.resolver(
|
||||
"player",
|
||||
Tag.inserting(caption.toComponent(player))
|
||||
))
|
||||
TagResolver.resolver(
|
||||
"value",
|
||||
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
|
||||
)
|
||||
);
|
||||
iterator.remove();
|
||||
continue;
|
||||
|
@ -1,98 +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.commands;
|
||||
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.permissions.Permission;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import io.leangen.geantyref.TypeToken;
|
||||
import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.context.CommandContext;
|
||||
import org.incendo.cloud.key.CloudKey;
|
||||
import org.incendo.cloud.processors.requirements.Requirement;
|
||||
import org.incendo.cloud.processors.requirements.Requirements;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Something that is required for a command to be executed.
|
||||
*/
|
||||
public interface CommandRequirement extends Requirement<PlotPlayer<?>, CommandRequirement> {
|
||||
|
||||
/**
|
||||
* The key used to store the requirements in the {@link org.incendo.cloud.meta.CommandMeta}.
|
||||
*/
|
||||
CloudKey<Requirements<PlotPlayer<?>, CommandRequirement>> REQUIREMENTS_KEY = CloudKey.of(
|
||||
"requirements",
|
||||
new TypeToken<Requirements<PlotPlayer<?>, CommandRequirement>>() {
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* Returns the caption sent when the requirement is not met.
|
||||
*
|
||||
* @return the caption
|
||||
*/
|
||||
@NonNull TranslatableCaption failureCaption();
|
||||
|
||||
/**
|
||||
* Returns the placeholder values.
|
||||
*
|
||||
* @return placeholder values
|
||||
*/
|
||||
default @NonNull TagResolver @NonNull[] tagResolvers() {
|
||||
return new TagResolver[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a requirement that evaluates to {@code true} if the sender has the given {@code permission} or if
|
||||
* this requirement evaluates to {@code true}.
|
||||
*
|
||||
* @param permission the override permission
|
||||
* @return the new requirement
|
||||
*/
|
||||
default @NonNull CommandRequirement withPermissionOverride(final @NonNull Permission permission) {
|
||||
final CommandRequirement thisRequirement = this;
|
||||
return new CommandRequirement() {
|
||||
@Override
|
||||
public @NonNull TranslatableCaption failureCaption() {
|
||||
return TranslatableCaption.of("permission.no_permission");
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull TagResolver @NonNull [] tagResolvers() {
|
||||
return new TagResolver[] {
|
||||
TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_SET_FLAG_OTHER))
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull List<@NonNull CommandRequirement> parents() {
|
||||
return thisRequirement.parents();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean evaluateRequirement(final @NonNull CommandContext<PlotPlayer<?>> context) {
|
||||
return context.sender().hasPermission(permission) || thisRequirement.evaluateRequirement(context);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
@ -1,81 +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.commands;
|
||||
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.context.CommandContext;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
/**
|
||||
* Common {@link CommandRequirement command requirements}.
|
||||
*/
|
||||
public enum CommonCommandRequirement implements CommandRequirement {
|
||||
/**
|
||||
* Requires that the command sender is currently in a plot.
|
||||
*/
|
||||
REQUIRES_PLOT(TranslatableCaption.of("errors.not_in_plot"), ctx -> ctx.sender().getCurrentPlot() != null),
|
||||
/**
|
||||
* Requires that the command sender is in a claimed plot.
|
||||
*/
|
||||
REQUIRES_OWNER(TranslatableCaption.of("working.plot_not_claimed"),
|
||||
ctx -> ctx.sender().getCurrentPlot().hasOwner(),
|
||||
REQUIRES_PLOT
|
||||
),
|
||||
/**
|
||||
* Requires that the command sender is the plot owner.
|
||||
*/
|
||||
IS_OWNER(TranslatableCaption.of("permission.no_plot_perms"),
|
||||
ctx -> ctx.sender().getCurrentPlot().isOwner(ctx.sender().getUUID()),
|
||||
REQUIRES_OWNER
|
||||
)
|
||||
;
|
||||
|
||||
private final TranslatableCaption failureCaption;
|
||||
private final Predicate<CommandContext<PlotPlayer<?>>> predicate;
|
||||
private final List<@NonNull CommandRequirement> parents;
|
||||
|
||||
CommonCommandRequirement(
|
||||
final @NonNull TranslatableCaption failureCaption,
|
||||
final @NonNull Predicate<CommandContext<PlotPlayer<?>>> predicate,
|
||||
final @NonNull CommandRequirement @NonNull... parents
|
||||
) {
|
||||
this.failureCaption = failureCaption;
|
||||
this.predicate = predicate;
|
||||
this.parents = Arrays.asList(parents);
|
||||
}
|
||||
|
||||
public @NonNull TranslatableCaption failureCaption() {
|
||||
return this.failureCaption;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull List<@NonNull CommandRequirement> parents() {
|
||||
return this.parents;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean evaluateRequirement(final @NonNull CommandContext<PlotPlayer<?>> context) {
|
||||
return this.predicate.test(context);
|
||||
}
|
||||
}
|
@ -1,50 +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.commands;
|
||||
|
||||
import com.plotsquared.core.PlotSquared;
|
||||
import com.plotsquared.core.configuration.caption.CaptionMap;
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
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.Nullable;
|
||||
import org.incendo.cloud.caption.Caption;
|
||||
import org.incendo.cloud.caption.CaptionProvider;
|
||||
|
||||
/**
|
||||
* {@link CaptionProvider} that retrieves caption values from the {@link CaptionMap caption map}.
|
||||
*/
|
||||
public final class PlotSquaredCaptionProvider implements CaptionProvider<PlotPlayer<?>> {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + PlotSquaredCaptionProvider.class.getSimpleName());
|
||||
|
||||
@Override
|
||||
public @Nullable String provide(final @NonNull Caption caption, final @NonNull PlotPlayer<?> recipient) {
|
||||
try {
|
||||
return PlotSquared.get()
|
||||
.getCaptionMap(TranslatableCaption.DEFAULT_NAMESPACE)
|
||||
.getMessage(TranslatableCaption.of(caption.key()), recipient);
|
||||
} catch (final CaptionMap.NoSuchCaptionException ignored) {
|
||||
LOGGER.warn("Missing caption '{}', will attempt to fall back on Cloud defaults", caption.key());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,78 +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.commands;
|
||||
|
||||
import com.plotsquared.core.command.CommandCategory;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.Command;
|
||||
import org.incendo.cloud.bean.CommandBean;
|
||||
import org.incendo.cloud.bean.CommandProperties;
|
||||
import org.incendo.cloud.processors.requirements.RequirementApplicable;
|
||||
import org.incendo.cloud.processors.requirements.Requirements;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public abstract class PlotSquaredCommandBean extends CommandBean<PlotPlayer<?>> {
|
||||
|
||||
private final RequirementApplicable.RequirementApplicableFactory<PlotPlayer<?>, CommandRequirement>
|
||||
requirementApplicableFactory = RequirementApplicable.factory(CommandRequirement.REQUIREMENTS_KEY);
|
||||
|
||||
/**
|
||||
* Returns the category of the command.
|
||||
*
|
||||
* @return the category
|
||||
*/
|
||||
public abstract @NonNull CommandCategory category();
|
||||
|
||||
/**
|
||||
* Returns the requirements for the command to be executable.
|
||||
*
|
||||
* @return the requirements
|
||||
*/
|
||||
public abstract @NonNull List<@NonNull CommandRequirement> requirements();
|
||||
|
||||
/**
|
||||
* Prepares the given {@code builder}.
|
||||
*
|
||||
* <p>This should be implemented by abstract classes that extend {@link PlotSquaredCommandBean} to offer shared behavior
|
||||
* for a subset of plot commands.</p>
|
||||
*
|
||||
* @param builder the builder
|
||||
* @return the prepared builder
|
||||
*/
|
||||
protected Command.@NonNull Builder<PlotPlayer<?>> prepare(final Command.@NonNull Builder<PlotPlayer<?>> builder) {
|
||||
return builder;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final @NonNull CommandProperties properties() {
|
||||
return CommandProperties.of("platsquared", "plat");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final Command.@NonNull Builder<PlotPlayer<?>> configure(final Command.@NonNull Builder<PlotPlayer<?>> builder) {
|
||||
return this.configurePlotCommand(this.prepare(builder.meta(PlotSquaredCommandMeta.META_CATEGORY, this.category())))
|
||||
.apply(this.requirementApplicableFactory.create(Requirements.of(this.requirements())));
|
||||
}
|
||||
|
||||
protected abstract Command.@NonNull Builder<PlotPlayer<?>> configurePlotCommand(
|
||||
Command.@NonNull Builder<PlotPlayer<?>> builder
|
||||
);
|
||||
}
|
@ -1,74 +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.commands;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Key;
|
||||
import com.google.inject.Singleton;
|
||||
import com.google.inject.TypeLiteral;
|
||||
import com.plotsquared.core.commands.injection.PlotInjector;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.plot.Plot;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.CommandManager;
|
||||
import org.incendo.cloud.injection.GuiceInjectionService;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
@Singleton
|
||||
public final class PlotSquaredCommandManager {
|
||||
|
||||
private final CommandManager<PlotPlayer<?>> commandManager;
|
||||
private final Injector injector;
|
||||
|
||||
@Inject
|
||||
public PlotSquaredCommandManager(
|
||||
final @NonNull CommandManager<PlotPlayer<?>> commandManager,
|
||||
final @NonNull Injector injector
|
||||
) {
|
||||
this.commandManager = commandManager;
|
||||
this.injector = injector;
|
||||
this.registerInjectors();
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers the commands that are shipped with PlotSquared.
|
||||
*/
|
||||
public void registerDefaultCommands() {
|
||||
final Set<PlotSquaredCommandBean> commands =
|
||||
this.injector.getInstance(Key.get(new TypeLiteral<Set<PlotSquaredCommandBean>>() {}));
|
||||
commands.forEach(command -> this.commandManager().command(command));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the command manager.
|
||||
*
|
||||
* @return the command manager
|
||||
*/
|
||||
public @NonNull CommandManager<PlotPlayer<?>> commandManager() {
|
||||
return this.commandManager;
|
||||
}
|
||||
|
||||
private void registerInjectors() {
|
||||
this.commandManager.parameterInjectorRegistry().registerInjector(Plot.class,
|
||||
this.injector.getInstance(PlotInjector.class));
|
||||
this.commandManager.parameterInjectorRegistry().registerInjectionService(GuiceInjectionService.create(this.injector));
|
||||
}
|
||||
}
|
@ -1,36 +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.commands;
|
||||
|
||||
import com.plotsquared.core.command.CommandCategory;
|
||||
import org.incendo.cloud.key.CloudKey;
|
||||
|
||||
/**
|
||||
* Shared {@link org.incendo.cloud.meta.CommandMeta command meta} keys.
|
||||
*/
|
||||
public final class PlotSquaredCommandMeta {
|
||||
|
||||
/**
|
||||
* Key that determines what {@link CommandCategory category} a command belongs to.
|
||||
*/
|
||||
public static final CloudKey<CommandCategory> META_CATEGORY = CloudKey.of("category", CommandCategory.class);
|
||||
|
||||
private PlotSquaredCommandMeta() {
|
||||
}
|
||||
}
|
@ -1,35 +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.commands;
|
||||
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.context.CommandContext;
|
||||
import org.incendo.cloud.processors.requirements.RequirementFailureHandler;
|
||||
|
||||
public final class PlotSquaredRequirementFailureHandler implements RequirementFailureHandler<PlotPlayer<?>, CommandRequirement> {
|
||||
|
||||
@Override
|
||||
public void handleFailure(
|
||||
final @NonNull CommandContext<PlotPlayer<?>> context,
|
||||
final @NonNull CommandRequirement requirement
|
||||
) {
|
||||
context.sender().sendMessage(requirement.failureCaption(), requirement.tagResolvers());
|
||||
}
|
||||
}
|
@ -1,120 +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.commands.command.setting.flag;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.plotsquared.core.commands.parser.PlotFlagParser;
|
||||
import com.plotsquared.core.commands.suggestions.FlagValueSuggestionProvider;
|
||||
import com.plotsquared.core.configuration.caption.CaptionUtility;
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.events.PlotFlagAddEvent;
|
||||
import com.plotsquared.core.events.Result;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.plot.Plot;
|
||||
import com.plotsquared.core.plot.flag.FlagParseException;
|
||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||
import com.plotsquared.core.util.EventDispatcher;
|
||||
import io.leangen.geantyref.TypeToken;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.Command;
|
||||
import org.incendo.cloud.context.CommandContext;
|
||||
import org.incendo.cloud.key.CloudKey;
|
||||
|
||||
import static com.plotsquared.core.commands.parser.PlotFlagParser.plotFlagParser;
|
||||
import static org.incendo.cloud.parser.standard.StringParser.greedyStringParser;
|
||||
|
||||
public final class FlagAddCommand extends FlagCommandBean {
|
||||
|
||||
private static final CloudKey<PlotFlag<?, ?>> COMPONENT_FLAG = CloudKey.of("flag", new TypeToken<PlotFlag<?, ?>>() {});
|
||||
private static final CloudKey<String> COMPONENT_VALUE = CloudKey.of("value", String.class);
|
||||
|
||||
private final EventDispatcher eventDispatcher;
|
||||
|
||||
@Inject
|
||||
public FlagAddCommand(final @NonNull EventDispatcher eventDispatcher) {
|
||||
this.eventDispatcher = eventDispatcher;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Command.@NonNull Builder<PlotPlayer<?>> configurePlotCommand(
|
||||
final Command.@NonNull Builder<PlotPlayer<?>> builder
|
||||
) {
|
||||
return builder.literal("add")
|
||||
.required(COMPONENT_FLAG, plotFlagParser(PlotFlagParser.FlagSource.GLOBAL))
|
||||
.required(COMPONENT_VALUE, greedyStringParser(), new FlagValueSuggestionProvider(COMPONENT_FLAG));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final @NonNull CommandContext<PlotPlayer<?>> commandContext) {
|
||||
final PlotPlayer<?> player = commandContext.sender();
|
||||
final Plot plot = commandContext.inject(Plot.class).orElseThrow();
|
||||
final PlotFlag<?, ?> flag = commandContext.get(COMPONENT_FLAG);
|
||||
final String flagValue = commandContext.get(COMPONENT_VALUE);
|
||||
|
||||
final PlotFlagAddEvent event = this.eventDispatcher.callFlagAdd(flag, plot);
|
||||
if (event.getEventResult() == Result.DENY) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("events.event_denied"),
|
||||
TagResolver.resolver("value", Tag.inserting(Component.text("Flag set")))
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (event.getEventResult() != Result.FORCE) {
|
||||
final String[] split = flagValue.split(",");
|
||||
for (final String entry : split) {
|
||||
if (!checkPermValue(player, flag, flag.getName(), entry)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final String sanitizedValue = CaptionUtility.stripClickEvents(flag, flagValue);
|
||||
final PlotFlag<?, ?> parsedFlag;
|
||||
try {
|
||||
parsedFlag = flag.parse(flagValue);
|
||||
} catch (final FlagParseException e) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("flag.flag_parse_error"),
|
||||
TagResolver.builder()
|
||||
.tag("flag_name", Tag.inserting(Component.text(flag.getName())))
|
||||
.tag("flag_value", Tag.inserting(Component.text(e.getValue())))
|
||||
.tag("error", Tag.inserting(e.getErrorMessage().toComponent(player)))
|
||||
.build()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
final boolean result = plot.setFlag(plot.getFlagContainer().getFlag(flag.getClass()).merge(parsedFlag.getValue()));
|
||||
if (!result) {
|
||||
player.sendMessage(TranslatableCaption.of("flag.flag_not_added"));
|
||||
return;
|
||||
}
|
||||
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("flag.flag_added"),
|
||||
TagResolver.builder()
|
||||
.tag("flag", Tag.inserting(Component.text(flag.getName())))
|
||||
.tag("value", Tag.inserting(Component.text(parsedFlag.toString())))
|
||||
.build()
|
||||
);
|
||||
}
|
||||
}
|
@ -1,139 +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.commands.command.setting.flag;
|
||||
|
||||
import com.plotsquared.core.PlotSquared;
|
||||
import com.plotsquared.core.command.CommandCategory;
|
||||
import com.plotsquared.core.commands.CommandRequirement;
|
||||
import com.plotsquared.core.commands.CommonCommandRequirement;
|
||||
import com.plotsquared.core.commands.PlotSquaredCommandBean;
|
||||
import com.plotsquared.core.configuration.Settings;
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.permissions.Permission;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.plot.flag.FlagParseException;
|
||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||
import com.plotsquared.core.plot.flag.types.IntegerFlag;
|
||||
import com.plotsquared.core.plot.flag.types.ListFlag;
|
||||
import com.plotsquared.core.util.MathMan;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.Command;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public abstract class FlagCommandBean extends PlotSquaredCommandBean {
|
||||
|
||||
protected static boolean checkPermValue(
|
||||
final @NonNull PlotPlayer<?> player,
|
||||
final @NonNull PlotFlag<?, ?> flag, @NonNull String key, @NonNull String value
|
||||
) {
|
||||
key = key.toLowerCase();
|
||||
value = value.toLowerCase();
|
||||
String perm = Permission.PERMISSION_SET_FLAG_KEY_VALUE.format(key.toLowerCase(), value.toLowerCase());
|
||||
if (flag instanceof IntegerFlag && MathMan.isInteger(value)) {
|
||||
try {
|
||||
int numeric = Integer.parseInt(value);
|
||||
// Getting full permission without ".<amount>" at the end
|
||||
perm = perm.substring(0, perm.length() - value.length() - 1);
|
||||
boolean result = false;
|
||||
if (numeric >= 0) {
|
||||
int checkRange = PlotSquared.get().getPlatform().equalsIgnoreCase("bukkit") ?
|
||||
numeric :
|
||||
Settings.Limit.MAX_PLOTS;
|
||||
result = player.hasPermissionRange(perm, checkRange) >= numeric;
|
||||
}
|
||||
if (!result) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("permission.no_permission"),
|
||||
TagResolver.resolver(
|
||||
"node",
|
||||
Tag.inserting(Component.text(perm + "." + numeric))
|
||||
)
|
||||
);
|
||||
}
|
||||
return result;
|
||||
} catch (NumberFormatException ignore) {
|
||||
}
|
||||
} else if (flag instanceof final ListFlag<?, ?> listFlag) {
|
||||
try {
|
||||
PlotFlag<? extends List<?>, ?> parsedFlag = listFlag.parse(value);
|
||||
for (final Object entry : parsedFlag.getValue()) {
|
||||
final String permission = Permission.PERMISSION_SET_FLAG_KEY_VALUE.format(
|
||||
key.toLowerCase(),
|
||||
entry.toString().toLowerCase()
|
||||
);
|
||||
final boolean result = player.hasPermission(permission);
|
||||
if (!result) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("permission.no_permission"),
|
||||
TagResolver.resolver("node", Tag.inserting(Component.text(permission)))
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} catch (final FlagParseException e) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("flag.flag_parse_error"),
|
||||
TagResolver.builder()
|
||||
.tag("flag_name", Tag.inserting(Component.text(flag.getName())))
|
||||
.tag("flag_value", Tag.inserting(Component.text(e.getValue())))
|
||||
.tag("error", Tag.inserting(e.getErrorMessage().toComponent(player)))
|
||||
.build()
|
||||
);
|
||||
return false;
|
||||
} catch (final Exception e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
boolean result;
|
||||
String basePerm = Permission.PERMISSION_SET_FLAG_KEY.format(key.toLowerCase());
|
||||
if (flag.isValuedPermission()) {
|
||||
result = player.hasKeyedPermission(basePerm, value);
|
||||
} else {
|
||||
result = player.hasPermission(basePerm);
|
||||
perm = basePerm;
|
||||
}
|
||||
if (!result) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("permission.no_permission"),
|
||||
TagResolver.resolver("node", Tag.inserting(Component.text(perm)))
|
||||
);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final @NonNull CommandCategory category() {
|
||||
return CommandCategory.SETTINGS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull List<@NonNull CommandRequirement> requirements() {
|
||||
return List.of(CommonCommandRequirement.IS_OWNER.withPermissionOverride(Permission.PERMISSION_SET_FLAG_OTHER));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final Command.@NonNull Builder<PlotPlayer<?>> prepare(final Command.@NonNull Builder<PlotPlayer<?>> builder) {
|
||||
return builder.literal("flag");
|
||||
}
|
||||
}
|
@ -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.commands.command.setting.flag;
|
||||
|
||||
import com.plotsquared.core.commands.parser.PlotFlagParser;
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||
import io.leangen.geantyref.TypeToken;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.Command;
|
||||
import org.incendo.cloud.context.CommandContext;
|
||||
import org.incendo.cloud.key.CloudKey;
|
||||
|
||||
import static com.plotsquared.core.commands.parser.PlotFlagParser.plotFlagParser;
|
||||
|
||||
public final class FlagInfoCommand extends FlagCommandBean {
|
||||
|
||||
private static final CloudKey<PlotFlag<?, ?>> COMPONENT_FLAG = CloudKey.of("flag", new TypeToken<PlotFlag<?, ?>>() {});
|
||||
|
||||
@Override
|
||||
protected Command.@NonNull Builder<PlotPlayer<?>> configurePlotCommand(final Command.@NonNull Builder<PlotPlayer<?>> builder) {
|
||||
return builder.literal("info")
|
||||
.required(COMPONENT_FLAG, plotFlagParser(PlotFlagParser.FlagSource.GLOBAL));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final @NonNull CommandContext<PlotPlayer<?>> commandContext) {
|
||||
final PlotFlag<?, ?> plotFlag = commandContext.get(COMPONENT_FLAG);
|
||||
final PlotPlayer<?> player = commandContext.sender();
|
||||
|
||||
player.sendMessage(TranslatableCaption.of("flag.flag_info_header"));
|
||||
// Flag name
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("flag.flag_info_name"),
|
||||
TagResolver.resolver("flag", Tag.inserting(Component.text(plotFlag.getName())))
|
||||
);
|
||||
// Flag category
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("flag.flag_info_category"),
|
||||
TagResolver.resolver(
|
||||
"value",
|
||||
Tag.inserting(plotFlag.getFlagCategory().toComponent(player))
|
||||
)
|
||||
);
|
||||
// Flag description
|
||||
// TODO maybe merge and \n instead?
|
||||
player.sendMessage(TranslatableCaption.of("flag.flag_info_description"));
|
||||
player.sendMessage(plotFlag.getFlagDescription());
|
||||
// Flag example
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("flag.flag_info_example"),
|
||||
TagResolver.builder()
|
||||
.tag("command", Tag.preProcessParsed("/plot flag set"))
|
||||
.tag("flag", Tag.preProcessParsed(plotFlag.getName()))
|
||||
.tag("value", Tag.preProcessParsed(plotFlag.getExample()))
|
||||
.build()
|
||||
);
|
||||
// Default value
|
||||
final String defaultValue = player.getLocation().getPlotArea().getFlagContainer()
|
||||
.getFlagErased(plotFlag.getClass()).toString();
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("flag.flag_info_default_value"),
|
||||
TagResolver.resolver("value", Tag.inserting(Component.text(defaultValue)))
|
||||
);
|
||||
// Footer. Done this way to prevent the duplicate-message-thingy from catching it
|
||||
player.sendMessage(TranslatableCaption.of("flag.flag_info_footer"));
|
||||
}
|
||||
}
|
@ -1,93 +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.commands.command.setting.flag;
|
||||
|
||||
import com.plotsquared.core.configuration.caption.StaticCaption;
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.plot.flag.GlobalFlagContainer;
|
||||
import com.plotsquared.core.plot.flag.InternalFlag;
|
||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import net.kyori.adventure.text.format.Style;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.Command;
|
||||
import org.incendo.cloud.context.CommandContext;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
public final class FlagListCommand extends FlagCommandBean {
|
||||
|
||||
private static final MiniMessage MINI_MESSAGE = MiniMessage.builder().build();
|
||||
|
||||
@Override
|
||||
protected Command.@NonNull Builder<PlotPlayer<?>> configurePlotCommand(
|
||||
final Command.@NonNull Builder<PlotPlayer<?>> builder
|
||||
) {
|
||||
return builder.literal("list");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final @NonNull CommandContext<PlotPlayer<?>> commandContext) {
|
||||
final PlotPlayer<?> player = commandContext.sender();
|
||||
|
||||
final Map<Component, ArrayList<String>> flags = new HashMap<>();
|
||||
for (PlotFlag<?, ?> plotFlag : GlobalFlagContainer.getInstance().getRecognizedPlotFlags()) {
|
||||
if (plotFlag instanceof InternalFlag) {
|
||||
continue;
|
||||
}
|
||||
final Component category = plotFlag.getFlagCategory().toComponent(player);
|
||||
final Collection<String> flagList = flags.computeIfAbsent(category, k -> new ArrayList<>());
|
||||
flagList.add(plotFlag.getName());
|
||||
}
|
||||
|
||||
for (final Map.Entry<Component, ArrayList<String>> entry : flags.entrySet()) {
|
||||
Collections.sort(entry.getValue());
|
||||
Component category =
|
||||
MINI_MESSAGE.deserialize(
|
||||
TranslatableCaption.of("flag.flag_list_categories").getComponent(player),
|
||||
TagResolver.resolver("category", Tag.inserting(entry.getKey().style(Style.empty())))
|
||||
);
|
||||
TextComponent.Builder builder = Component.text().append(category);
|
||||
final Iterator<String> flagIterator = entry.getValue().iterator();
|
||||
while (flagIterator.hasNext()) {
|
||||
final String flag = flagIterator.next();
|
||||
builder.append(MINI_MESSAGE
|
||||
.deserialize(
|
||||
TranslatableCaption.of("flag.flag_list_flag").getComponent(player),
|
||||
TagResolver.builder()
|
||||
.tag("command", Tag.preProcessParsed("/plat flag info " + flag))
|
||||
.tag("flag", Tag.inserting(Component.text(flag)))
|
||||
.tag("suffix", Tag.inserting(Component.text(flagIterator.hasNext() ? ", " : "")))
|
||||
.build()
|
||||
));
|
||||
}
|
||||
player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.build())));
|
||||
}
|
||||
}
|
||||
}
|
@ -1,171 +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.commands.command.setting.flag;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.plotsquared.core.commands.parser.PlotFlagParser;
|
||||
import com.plotsquared.core.commands.suggestions.FlagValueSuggestionProvider;
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.events.PlotFlagAddEvent;
|
||||
import com.plotsquared.core.events.PlotFlagRemoveEvent;
|
||||
import com.plotsquared.core.events.Result;
|
||||
import com.plotsquared.core.permissions.Permission;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.plot.Plot;
|
||||
import com.plotsquared.core.plot.flag.FlagParseException;
|
||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||
import com.plotsquared.core.plot.flag.types.ListFlag;
|
||||
import com.plotsquared.core.util.EventDispatcher;
|
||||
import io.leangen.geantyref.TypeToken;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.Command;
|
||||
import org.incendo.cloud.context.CommandContext;
|
||||
import org.incendo.cloud.key.CloudKey;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import static com.plotsquared.core.commands.parser.PlotFlagParser.plotFlagParser;
|
||||
import static org.incendo.cloud.parser.standard.StringParser.greedyStringParser;
|
||||
|
||||
public final class FlagRemoveCommand extends FlagCommandBean {
|
||||
|
||||
private static final CloudKey<PlotFlag<?, ?>> COMPONENT_FLAG = CloudKey.of("flag", new TypeToken<PlotFlag<?, ?>>() {});
|
||||
private static final CloudKey<String> COMPONENT_VALUE = CloudKey.of("value", String.class);
|
||||
|
||||
private final EventDispatcher eventDispatcher;
|
||||
|
||||
@Inject
|
||||
public FlagRemoveCommand(final @NonNull EventDispatcher eventDispatcher) {
|
||||
this.eventDispatcher = eventDispatcher;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Command.@NonNull Builder<PlotPlayer<?>> configurePlotCommand(
|
||||
final Command.@NonNull Builder<PlotPlayer<?>> builder
|
||||
) {
|
||||
return builder.literal("remove")
|
||||
.required(COMPONENT_FLAG, plotFlagParser(PlotFlagParser.FlagSource.PLOT))
|
||||
.optional(COMPONENT_VALUE, greedyStringParser(), new FlagValueSuggestionProvider(COMPONENT_FLAG));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final @NonNull CommandContext<PlotPlayer<?>> commandContext) {
|
||||
final PlotPlayer<?> player = commandContext.sender();
|
||||
final Plot plot = commandContext.inject(Plot.class).orElseThrow();
|
||||
final PlotFlag<?, ?> flag = commandContext.get(COMPONENT_FLAG);
|
||||
final String flagValue = commandContext.getOrDefault(COMPONENT_VALUE, null);
|
||||
|
||||
final PlotFlagRemoveEvent event = this.eventDispatcher.callFlagRemove(flag, plot);
|
||||
if (event.getEventResult() == Result.DENY) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("events.event_denied"),
|
||||
TagResolver.resolver("value", Tag.inserting(Component.text("Flag set")))
|
||||
);
|
||||
return;
|
||||
}
|
||||
final String flagKey = flag.getName().toLowerCase(Locale.ENGLISH);
|
||||
if (event.getEventResult() != Result.FORCE
|
||||
&& !player.hasPermission(Permission.PERMISSION_SET_FLAG_KEY.format(flagKey))) {
|
||||
if (flagValue == null) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("permission.no_permission"),
|
||||
TagResolver.resolver(
|
||||
"node",
|
||||
Tag.inserting(Component.text(Permission.PERMISSION_SET_FLAG_KEY.format(flagKey)))
|
||||
)
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (flagValue != null && flag instanceof ListFlag<?,?> listFlag) {
|
||||
final List<?> list = new ArrayList<>(plot.getFlag(listFlag));
|
||||
final PlotFlag parsedFlag;
|
||||
try {
|
||||
parsedFlag = listFlag.parse(flagValue);
|
||||
} catch (final FlagParseException e) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("flag.flag_parse_error"),
|
||||
TagResolver.builder()
|
||||
.tag("flag_name", Tag.inserting(Component.text(flag.getName())))
|
||||
.tag("flag_value", Tag.inserting(Component.text(e.getValue())))
|
||||
.tag("error", Tag.inserting(e.getErrorMessage().toComponent(player)))
|
||||
.build()
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (((List<?>) parsedFlag.getValue()).isEmpty()) {
|
||||
player.sendMessage(TranslatableCaption.of("flag.flag_not_removed"));
|
||||
return;
|
||||
}
|
||||
if (list.removeAll((List) parsedFlag.getValue())) {
|
||||
if (list.isEmpty()) {
|
||||
if (plot.removeFlag(flag)) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("flag.flag_removed"),
|
||||
TagResolver.builder()
|
||||
.tag("flag", Tag.inserting(Component.text(flagKey)))
|
||||
.tag("value", Tag.inserting(Component.text(flag.toString())))
|
||||
.build()
|
||||
);
|
||||
return;
|
||||
} else {
|
||||
player.sendMessage(TranslatableCaption.of("flag.flag_not_removed"));
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
PlotFlag<?, ?> plotFlag = parsedFlag.createFlagInstance(list);
|
||||
PlotFlagAddEvent addEvent = eventDispatcher.callFlagAdd(plotFlag, plot);
|
||||
if (addEvent.getEventResult() == Result.DENY) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("events.event_denied"),
|
||||
TagResolver.resolver(
|
||||
"value",
|
||||
Tag.inserting(Component.text("Re-addition of " + plotFlag.getName()))
|
||||
)
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (plot.setFlag(addEvent.getFlag())) {
|
||||
player.sendMessage(TranslatableCaption.of("flag.flag_partially_removed"));
|
||||
return;
|
||||
} else {
|
||||
player.sendMessage(TranslatableCaption.of("flag.flag_not_removed"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (!plot.removeFlag(flag)) {
|
||||
player.sendMessage(TranslatableCaption.of("flag.flag_not_removed"));
|
||||
return;
|
||||
}
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("flag.flag_removed"),
|
||||
TagResolver.builder()
|
||||
.tag("flag", Tag.inserting(Component.text(flagKey)))
|
||||
.tag("value", Tag.inserting(Component.text(flag.toString())))
|
||||
.build()
|
||||
);
|
||||
}
|
||||
}
|
@ -1,110 +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.commands.command.setting.flag;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.plotsquared.core.commands.parser.PlotFlagParser;
|
||||
import com.plotsquared.core.commands.suggestions.FlagValueSuggestionProvider;
|
||||
import com.plotsquared.core.configuration.caption.CaptionUtility;
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.events.PlotFlagAddEvent;
|
||||
import com.plotsquared.core.events.Result;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.plot.Plot;
|
||||
import com.plotsquared.core.plot.flag.FlagParseException;
|
||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||
import com.plotsquared.core.util.EventDispatcher;
|
||||
import io.leangen.geantyref.TypeToken;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.Command;
|
||||
import org.incendo.cloud.context.CommandContext;
|
||||
import org.incendo.cloud.key.CloudKey;
|
||||
|
||||
import static com.plotsquared.core.commands.parser.PlotFlagParser.plotFlagParser;
|
||||
import static org.incendo.cloud.parser.standard.StringParser.greedyStringParser;
|
||||
|
||||
public final class FlagSetCommand extends FlagCommandBean {
|
||||
|
||||
private static final CloudKey<PlotFlag<?, ?>> COMPONENT_FLAG = CloudKey.of("flag", new TypeToken<PlotFlag<?, ?>>() {});
|
||||
private static final CloudKey<String> COMPONENT_VALUE = CloudKey.of("value", String.class);
|
||||
|
||||
private final EventDispatcher eventDispatcher;
|
||||
|
||||
@Inject
|
||||
public FlagSetCommand(final @NonNull EventDispatcher eventDispatcher) {
|
||||
this.eventDispatcher = eventDispatcher;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Command.@NonNull Builder<PlotPlayer<?>> configurePlotCommand(
|
||||
final Command.@NonNull Builder<PlotPlayer<?>> builder
|
||||
) {
|
||||
return builder.literal("set")
|
||||
.required(COMPONENT_FLAG, plotFlagParser(PlotFlagParser.FlagSource.GLOBAL))
|
||||
.required(COMPONENT_VALUE, greedyStringParser(), new FlagValueSuggestionProvider(COMPONENT_FLAG));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final @NonNull CommandContext<PlotPlayer<?>> commandContext) {
|
||||
final PlotPlayer<?> player = commandContext.sender();
|
||||
final Plot plot = commandContext.inject(Plot.class).orElseThrow();
|
||||
final PlotFlag<?, ?> flag = commandContext.get(COMPONENT_FLAG);
|
||||
final String flagValue = commandContext.get(COMPONENT_VALUE);
|
||||
|
||||
final PlotFlagAddEvent event = this.eventDispatcher.callFlagAdd(flag, plot);
|
||||
if (event.getEventResult() == Result.DENY) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("events.event_denied"),
|
||||
TagResolver.resolver("value", Tag.inserting(Component.text("Flag set")))
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (event.getEventResult() != Result.FORCE && !checkPermValue(player, flag, flag.getName(), flagValue)) {
|
||||
return;
|
||||
}
|
||||
|
||||
final String sanitizedValue = CaptionUtility.stripClickEvents(flag, flagValue);
|
||||
final PlotFlag<?, ?> parsedFlag;
|
||||
try {
|
||||
parsedFlag = flag.parse(flagValue);
|
||||
} catch (final FlagParseException e) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("flag.flag_parse_error"),
|
||||
TagResolver.builder()
|
||||
.tag("flag_name", Tag.inserting(Component.text(flag.getName())))
|
||||
.tag("flag_value", Tag.inserting(Component.text(e.getValue())))
|
||||
.tag("error", Tag.inserting(e.getErrorMessage().toComponent(player)))
|
||||
.build()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
plot.setFlag(parsedFlag);
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("flag.flag_added"),
|
||||
TagResolver.builder()
|
||||
.tag("flag", Tag.inserting(Component.text(flag.getName())))
|
||||
.tag("value", Tag.inserting(Component.text(parsedFlag.toString())))
|
||||
.build()
|
||||
);
|
||||
}
|
||||
}
|
@ -1,42 +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.commands.injection;
|
||||
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.plot.Plot;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
import org.incendo.cloud.context.CommandContext;
|
||||
import org.incendo.cloud.injection.ParameterInjector;
|
||||
import org.incendo.cloud.util.annotation.AnnotationAccessor;
|
||||
|
||||
/**
|
||||
* {@link ParameterInjector} that returns the current plot of the player.
|
||||
*/
|
||||
public final class PlotInjector implements ParameterInjector<PlotPlayer<?>, Plot> {
|
||||
|
||||
@Override
|
||||
public @Nullable Plot create(
|
||||
final @NonNull CommandContext<PlotPlayer<?>> context,
|
||||
final @NonNull AnnotationAccessor annotationAccessor
|
||||
) {
|
||||
// TODO: Allow for overriding for console.
|
||||
return context.sender().getCurrentPlot();
|
||||
}
|
||||
}
|
@ -1,158 +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.commands.parser;
|
||||
|
||||
import com.plotsquared.core.configuration.caption.LocaleHolder;
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.plot.Plot;
|
||||
import com.plotsquared.core.plot.flag.FlagContainer;
|
||||
import com.plotsquared.core.plot.flag.GlobalFlagContainer;
|
||||
import com.plotsquared.core.plot.flag.InternalFlag;
|
||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||
import io.leangen.geantyref.TypeToken;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.util.ComponentMessageThrowable;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.context.CommandContext;
|
||||
import org.incendo.cloud.context.CommandInput;
|
||||
import org.incendo.cloud.exception.parsing.ParserException;
|
||||
import org.incendo.cloud.parser.ArgumentParseResult;
|
||||
import org.incendo.cloud.parser.ArgumentParser;
|
||||
import org.incendo.cloud.parser.ParserDescriptor;
|
||||
import org.incendo.cloud.suggestion.BlockingSuggestionProvider;
|
||||
import org.incendo.cloud.suggestion.Suggestion;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* Parser that parses and suggests {@link PlotFlag plot flags}.
|
||||
*/
|
||||
public final class PlotFlagParser implements ArgumentParser<PlotPlayer<?>, PlotFlag<?, ?>>,
|
||||
BlockingSuggestionProvider<PlotPlayer<?>> {
|
||||
|
||||
/**
|
||||
* Returns a new parser that parses {@link PlotFlag plot flags}.
|
||||
*
|
||||
* @param source the source of available flag values
|
||||
* @return the parser
|
||||
*/
|
||||
public static @NonNull ParserDescriptor<PlotPlayer<?>, PlotFlag<?, ?>> plotFlagParser(final @NonNull FlagSource source) {
|
||||
return ParserDescriptor.of(new PlotFlagParser(source), new TypeToken<PlotFlag<?, ?>>() {
|
||||
});
|
||||
}
|
||||
|
||||
private final FlagSource flagSource;
|
||||
|
||||
private PlotFlagParser(final @NonNull FlagSource flagSource) {
|
||||
this.flagSource = flagSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull ArgumentParseResult<@NonNull PlotFlag<?, ?>> parse(
|
||||
final @NonNull CommandContext<@NonNull PlotPlayer<?>> commandContext,
|
||||
final @NonNull CommandInput commandInput
|
||||
) {
|
||||
final String flagName = commandInput.readString();
|
||||
final PlotFlag<?, ?> flag = GlobalFlagContainer.getInstance().getFlagFromString(flagName);
|
||||
if (flag == null) {
|
||||
return ArgumentParseResult.failure(new PlotFlagParseException(commandContext));
|
||||
}
|
||||
return ArgumentParseResult.success(flag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull Iterable<@NonNull Suggestion> suggestions(
|
||||
final @NonNull CommandContext<PlotPlayer<?>> context,
|
||||
final @NonNull CommandInput input
|
||||
) {
|
||||
return this.flagSource.flags(context.sender())
|
||||
.stream()
|
||||
.filter(flag -> (!(flag instanceof InternalFlag)))
|
||||
.map(PlotFlag::getName)
|
||||
.map(Suggestion::simple)
|
||||
.toList();
|
||||
}
|
||||
|
||||
public enum FlagSource {
|
||||
/**
|
||||
* All recognized flags.
|
||||
*/
|
||||
GLOBAL(player -> GlobalFlagContainer.getInstance(), false),
|
||||
/**
|
||||
* All flags that have been configured in the current plot.
|
||||
*/
|
||||
PLOT(player -> {
|
||||
final Plot plot = player.getCurrentPlot();
|
||||
if (plot == null) {
|
||||
return GlobalFlagContainer.getInstance();
|
||||
}
|
||||
return plot.getFlagContainer();
|
||||
}, true);
|
||||
|
||||
private final Function<PlotPlayer<?>, FlagContainer> containerFunction;
|
||||
private final boolean storedOnly;
|
||||
|
||||
FlagSource(final @NonNull Function<PlotPlayer<?>, FlagContainer> containerFunction, final boolean storedOnly) {
|
||||
this.containerFunction = containerFunction;
|
||||
this.storedOnly = storedOnly;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the flag container.
|
||||
*
|
||||
* @param player the player to get the container for
|
||||
* @return the container
|
||||
*/
|
||||
public @NonNull FlagContainer flagContainer(final @NonNull PlotPlayer<?> player) {
|
||||
return this.containerFunction.apply(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the flags from this source.
|
||||
*
|
||||
* @param player the player to get the flags for
|
||||
* @return the flags
|
||||
*/
|
||||
public @NonNull Collection<@NonNull PlotFlag<?, ?>> flags(final @NonNull PlotPlayer<?> player) {
|
||||
final FlagContainer container = this.flagContainer(player);
|
||||
if (this.storedOnly) {
|
||||
return container.getFlagMap().values();
|
||||
}
|
||||
return container.getRecognizedPlotFlags();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Exception thrown when an invalid flag name is supplied.
|
||||
*/
|
||||
public static final class PlotFlagParseException extends ParserException implements ComponentMessageThrowable {
|
||||
|
||||
private PlotFlagParseException(final @NonNull CommandContext<?> context) {
|
||||
super(PlotFlagParser.class, context, TranslatableCaption.of("flag.not_valid_flag"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull Component componentMessage() {
|
||||
// TODO(City): This sucks...
|
||||
return ((TranslatableCaption) this.errorCaption()).toComponent(LocaleHolder.console());
|
||||
}
|
||||
}
|
||||
}
|
@ -1,86 +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.commands.suggestions;
|
||||
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||
import com.plotsquared.core.plot.flag.types.ListFlag;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.context.CommandContext;
|
||||
import org.incendo.cloud.context.CommandInput;
|
||||
import org.incendo.cloud.key.CloudKey;
|
||||
import org.incendo.cloud.suggestion.BlockingSuggestionProvider;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Suggestion provider that provides context-aware {@link PlotFlag plot flag} value suggestions using
|
||||
* {@link PlotFlag#getTabCompletions()}.
|
||||
*/
|
||||
public final class FlagValueSuggestionProvider implements BlockingSuggestionProvider.Strings<PlotPlayer<?>> {
|
||||
|
||||
private final CloudKey<PlotFlag<?, ?>> flagKey;
|
||||
|
||||
/**
|
||||
* Creates a new suggestion provider.
|
||||
*
|
||||
* @param flagKey the key of the argument that contains the flag to provide value suggestions for
|
||||
*/
|
||||
public FlagValueSuggestionProvider(final @NonNull CloudKey<PlotFlag<?, ?>> flagKey) {
|
||||
this.flagKey = Objects.requireNonNull(flagKey, "flagKey");
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull Iterable<@NonNull String> stringSuggestions(
|
||||
@NonNull final CommandContext<PlotPlayer<?>> context,
|
||||
@NonNull final CommandInput input
|
||||
) {
|
||||
final PlotFlag<?, ?> plotFlag = context.getOrDefault(this.flagKey, null);
|
||||
if (plotFlag == null) {
|
||||
return List.of();
|
||||
}
|
||||
final Collection<String> completions = plotFlag.getTabCompletions();
|
||||
if (plotFlag instanceof ListFlag<?,?> && input.peekString().contains(",")) {
|
||||
final String[] split = input.peekString().split(",");
|
||||
final List<String> existingValues = new ArrayList<>(Arrays.asList(split));
|
||||
|
||||
final String completingValue;
|
||||
if (!input.peekString().endsWith(",")) {
|
||||
// In this case we want to complete the value we're currently typing.
|
||||
completingValue = split[split.length - 1];
|
||||
existingValues.remove(existingValues.size() - 1);
|
||||
} else {
|
||||
completingValue = null;
|
||||
}
|
||||
|
||||
final String prefix = existingValues.stream().collect(Collectors.joining(",", "", ","));
|
||||
return completions.stream()
|
||||
.filter(value -> !existingValues.contains(value))
|
||||
.filter(value -> completingValue == null || value.startsWith(completingValue))
|
||||
.map(value -> prefix + value)
|
||||
.toList();
|
||||
}
|
||||
return completions;
|
||||
}
|
||||
}
|
@ -206,7 +206,7 @@ public class ComponentPresetManager {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (componentPreset.cost() > 0.0D && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
|
||||
if (componentPreset.cost() > 0.0D) {
|
||||
if (!econHandler.isEnabled(plot.getArea())) {
|
||||
getPlayer().sendMessage(
|
||||
TranslatableCaption.of("preset.economy_disabled"),
|
||||
|
@ -194,7 +194,7 @@ public class Settings extends Config {
|
||||
public List<String> WORLDS = new ArrayList<>(Collections.singletonList("*"));
|
||||
|
||||
|
||||
@Comment("See: https://intellectualsites.gitbook.io/plotsquared/optimization/plot-analysis for a description of each value.")
|
||||
@Comment("See: https://intellectualsites.github.io/plotsquared-documentation/optimization/plot-analysis for a description of each value.")
|
||||
public static final class CALIBRATION {
|
||||
|
||||
public int VARIETY = 0;
|
||||
@ -214,7 +214,7 @@ public class Settings extends Config {
|
||||
|
||||
|
||||
@Comment({"Chunk processor related settings",
|
||||
"See https://intellectualsites.gitbook.io/plotsquared/optimization/chunk-processor for more information."})
|
||||
"See https://intellectualsites.github.io/plotsquared-documentation/optimization/chunk-processor for more information."})
|
||||
public static class Chunk_Processor {
|
||||
|
||||
@Comment("Auto trim will not save chunks which aren't claimed")
|
||||
@ -280,7 +280,7 @@ public class Settings extends Config {
|
||||
@Comment("Always show explosion Particles, even if explosion flag is set to false")
|
||||
public static boolean ALWAYS_SHOW_EXPLOSIONS = false;
|
||||
@Comment({"Blocks that may not be used in plot components",
|
||||
"Checkout the wiki article regarding plot components before modifying: https://intellectualsites.gitbook.io/plotsquared/customization/plot-components"})
|
||||
"Checkout the wiki article regarding plot components before modifying: https://intellectualsites.github.io/plotsquared-documentation/customization/plot-components"})
|
||||
public static List<String>
|
||||
INVALID_BLOCKS = Arrays.asList(
|
||||
// Acacia Stuff
|
||||
@ -402,7 +402,7 @@ public class Settings extends Config {
|
||||
|
||||
|
||||
@Comment({"Schematic Settings",
|
||||
"See https://intellectualsites.gitbook.io/plotsquared/schematics/schematic-on-claim for more information."})
|
||||
"See https://intellectualsites.github.io/plotsquared-documentation/schematics/schematic-on-claim for more information."})
|
||||
public static final class Schematics {
|
||||
|
||||
@Comment(
|
||||
@ -522,7 +522,7 @@ public class Settings extends Config {
|
||||
@Comment("Should the limit be global (over multiple worlds)")
|
||||
public static boolean GLOBAL =
|
||||
false;
|
||||
@Comment({"The max range of integer permissions to check for, e.g. 'plots.plot.127' or 'plots.set.flag.mob-cap.127'",
|
||||
@Comment({"The max range of permissions to check for, e.g. plots.plot.127",
|
||||
"The value covers the permission range to check, you need to assign the permission to players/groups still",
|
||||
"Modifying the value does NOT change the amount of plots players can claim"})
|
||||
public static int MAX_PLOTS = 127;
|
||||
@ -531,7 +531,7 @@ public class Settings extends Config {
|
||||
|
||||
|
||||
@Comment({"Backup related settings",
|
||||
"See https://intellectualsites.gitbook.io/plotsquared/plot-backups for more information."})
|
||||
"See https://intellectualsites.github.io/plotsquared-documentation/plot-backups for more information."})
|
||||
public static final class Backup {
|
||||
|
||||
@Comment("Automatically backup plots when destructive commands are performed, e.g. /plot clear")
|
||||
@ -783,7 +783,7 @@ public class Settings extends Config {
|
||||
public static boolean
|
||||
PERSISTENT_ROAD_REGEN = true;
|
||||
@Comment({"Enable the `/plot component` preset GUI",
|
||||
"Read more about components here: https://intellectualsites.gitbook.io/plotsquared/customization/plot-components"})
|
||||
"Read more about components here: https://intellectualsites.github.io/plotsquared-documentation/customization/plot-components"})
|
||||
public static boolean COMPONENT_PRESETS = true;
|
||||
@Comment("Enable per user locale")
|
||||
public static boolean PER_USER_LOCALE = false;
|
||||
|
@ -40,10 +40,8 @@ public interface Caption {
|
||||
*
|
||||
* @param localeHolder Locale holder
|
||||
* @return {@link ComponentLike}
|
||||
* @since 7.0.0
|
||||
* @since TODO
|
||||
*/
|
||||
@NonNull Component toComponent(@NonNull LocaleHolder localeHolder);
|
||||
|
||||
@NonNull String toString();
|
||||
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ public class CaptionHolder {
|
||||
* Get the {@link TagResolver}s to use when resolving tags in the {@link Caption}.
|
||||
*
|
||||
* @return The tag resolvers to use.
|
||||
* @since 7.0.0
|
||||
* @since TODO
|
||||
*/
|
||||
public TagResolver[] getTagResolvers() {
|
||||
return this.tagResolvers;
|
||||
@ -61,7 +61,7 @@ public class CaptionHolder {
|
||||
* Set the {@link TagResolver}s to use when resolving tags in the {@link Caption}.
|
||||
*
|
||||
* @param tagResolvers The tag resolvers to use.
|
||||
* @since 7.0.0
|
||||
* @since TODO
|
||||
*/
|
||||
public void setTagResolvers(TagResolver... tagResolvers) {
|
||||
this.tagResolvers = tagResolvers;
|
||||
|
@ -28,20 +28,16 @@ import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.event.ClickEvent;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.minimessage.ParsingException;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static com.plotsquared.core.configuration.caption.ComponentTransform.nested;
|
||||
import static com.plotsquared.core.configuration.caption.ComponentTransform.stripClicks;
|
||||
|
||||
public class CaptionUtility {
|
||||
|
||||
private static final Pattern LEGACY_FORMATTING = Pattern.compile("§[a-gklmnor0-9]");
|
||||
|
||||
// flags which values are parsed by minimessage
|
||||
private static final Set<Class<? extends PlotFlag<?, ?>>> MINI_MESSAGE_FLAGS = Set.of(
|
||||
GreetingFlag.class,
|
||||
@ -104,14 +100,7 @@ public class CaptionUtility {
|
||||
*/
|
||||
public static String stripClickEvents(final @NonNull String miniMessageString) {
|
||||
// parse, transform and serialize again
|
||||
Component component;
|
||||
try {
|
||||
component = MiniMessage.miniMessage().deserialize(miniMessageString);
|
||||
} catch (ParsingException e) {
|
||||
// if the String cannot be parsed, we try stripping legacy colors
|
||||
String legacyStripped = LEGACY_FORMATTING.matcher(miniMessageString).replaceAll("");
|
||||
component = MiniMessage.miniMessage().deserialize(legacyStripped);
|
||||
}
|
||||
Component component = MiniMessage.miniMessage().deserialize(miniMessageString);
|
||||
component = CLICK_STRIP_TRANSFORM.transform(component);
|
||||
return MiniMessage.miniMessage().serialize(component);
|
||||
}
|
||||
|
@ -51,9 +51,4 @@ public final class StaticCaption implements Caption {
|
||||
return MiniMessage.miniMessage().deserialize(this.value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull String toString() {
|
||||
return "StaticCaption(" + value + ")";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -25,8 +25,6 @@ import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.incendo.cloud.caption.Caption;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.regex.Pattern;
|
||||
@ -34,7 +32,7 @@ import java.util.regex.Pattern;
|
||||
/**
|
||||
* Caption that is user modifiable
|
||||
*/
|
||||
public final class TranslatableCaption implements NamespacedCaption, Caption {
|
||||
public final class TranslatableCaption implements NamespacedCaption {
|
||||
|
||||
/**
|
||||
* Default caption namespace
|
||||
@ -73,11 +71,6 @@ public final class TranslatableCaption implements NamespacedCaption, Caption {
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull String key() {
|
||||
return this.getKey();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a new {@link TranslatableCaption} instance
|
||||
*
|
||||
@ -139,9 +132,4 @@ public final class TranslatableCaption implements NamespacedCaption, Caption {
|
||||
return Objects.hashCode(this.getNamespace(), this.getKey());
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String toString() {
|
||||
return "TranslatableCaption(" + getNamespace() + ":" + getKey() + ")";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -19,7 +19,6 @@
|
||||
package com.plotsquared.core.configuration.file;
|
||||
|
||||
import com.plotsquared.core.configuration.serialization.ConfigurationSerialization;
|
||||
import org.yaml.snakeyaml.LoaderOptions;
|
||||
import org.yaml.snakeyaml.constructor.SafeConstructor;
|
||||
import org.yaml.snakeyaml.error.YAMLException;
|
||||
import org.yaml.snakeyaml.nodes.Node;
|
||||
@ -31,7 +30,6 @@ import java.util.Map;
|
||||
public class YamlConstructor extends SafeConstructor {
|
||||
|
||||
YamlConstructor() {
|
||||
super(new LoaderOptions());
|
||||
yamlConstructors.put(Tag.MAP, new ConstructCustomObject());
|
||||
}
|
||||
|
||||
|
@ -21,7 +21,6 @@ package com.plotsquared.core.configuration.file;
|
||||
import com.plotsquared.core.configuration.ConfigurationSection;
|
||||
import com.plotsquared.core.configuration.serialization.ConfigurationSerializable;
|
||||
import com.plotsquared.core.configuration.serialization.ConfigurationSerialization;
|
||||
import org.yaml.snakeyaml.DumperOptions;
|
||||
import org.yaml.snakeyaml.nodes.Node;
|
||||
import org.yaml.snakeyaml.representer.Representer;
|
||||
|
||||
@ -31,7 +30,6 @@ import java.util.Map;
|
||||
class YamlRepresenter extends Representer {
|
||||
|
||||
YamlRepresenter() {
|
||||
super(new DumperOptions());
|
||||
this.multiRepresenters.put(ConfigurationSection.class, new RepresentConfigurationSection());
|
||||
this.multiRepresenters
|
||||
.put(ConfigurationSerializable.class, new RepresentConfigurationSerializable());
|
||||
|
@ -130,7 +130,6 @@ public class SQLManager implements AbstractDB {
|
||||
public volatile ConcurrentHashMap<PlotCluster, Queue<UniqueStatement>> clusterTasks;
|
||||
// Private
|
||||
private Connection connection;
|
||||
private boolean supportsGetGeneratedKeys;
|
||||
private boolean closed = false;
|
||||
|
||||
/**
|
||||
@ -155,8 +154,6 @@ public class SQLManager implements AbstractDB {
|
||||
this.worldConfiguration = worldConfiguration;
|
||||
this.database = database;
|
||||
this.connection = database.openConnection();
|
||||
final DatabaseMetaData databaseMetaData = this.connection.getMetaData();
|
||||
this.supportsGetGeneratedKeys = databaseMetaData.supportsGetGeneratedKeys();
|
||||
this.mySQL = database instanceof MySQL;
|
||||
this.globalTasks = new ConcurrentLinkedQueue<>();
|
||||
this.notifyTasks = new ConcurrentLinkedQueue<>();
|
||||
@ -164,14 +161,6 @@ public class SQLManager implements AbstractDB {
|
||||
this.playerTasks = new ConcurrentHashMap<>();
|
||||
this.clusterTasks = new ConcurrentHashMap<>();
|
||||
this.prefix = prefix;
|
||||
|
||||
if (mySQL && !supportsGetGeneratedKeys) {
|
||||
String driver = databaseMetaData.getDriverName();
|
||||
String driverVersion = databaseMetaData.getDriverVersion();
|
||||
throw new SQLException("Database Driver for MySQL does not support Statement#getGeneratedKeys - which breaks " +
|
||||
"PlotSquared functionality (Using " + driver + ":" + driverVersion + ")");
|
||||
}
|
||||
|
||||
this.SET_OWNER = "UPDATE `" + this.prefix
|
||||
+ "plot` SET `owner` = ? WHERE `plot_id_x` = ? AND `plot_id_z` = ? AND `world` = ?";
|
||||
this.GET_ALL_PLOTS =
|
||||
@ -182,32 +171,20 @@ public class SQLManager implements AbstractDB {
|
||||
"INSERT INTO `" + this.prefix + "plot_settings` (`plot_plot_id`) values ";
|
||||
this.CREATE_TIERS =
|
||||
"INSERT INTO `" + this.prefix + "plot_%tier%` (`plot_plot_id`, `user_uuid`) values ";
|
||||
String tempCreatePlot = "INSERT INTO `" + this.prefix
|
||||
this.CREATE_PLOT = "INSERT INTO `" + this.prefix
|
||||
+ "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) VALUES(?, ?, ?, ?, ?)";
|
||||
if (!supportsGetGeneratedKeys) {
|
||||
tempCreatePlot += " RETURNING `id`";
|
||||
}
|
||||
this.CREATE_PLOT = tempCreatePlot;
|
||||
|
||||
if (mySQL) {
|
||||
this.CREATE_PLOT_SAFE = "INSERT IGNORE INTO `" + this.prefix
|
||||
+ "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) SELECT ?, ?, ?, ?, ? FROM DUAL WHERE NOT EXISTS (SELECT null FROM `"
|
||||
+ this.prefix + "plot` WHERE `world` = ? AND `plot_id_x` = ? AND `plot_id_z` = ?)";
|
||||
} else {
|
||||
String tempCreatePlotSafe = "INSERT INTO `" + this.prefix
|
||||
this.CREATE_PLOT_SAFE = "INSERT INTO `" + this.prefix
|
||||
+ "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) SELECT ?, ?, ?, ?, ? WHERE NOT EXISTS (SELECT null FROM `"
|
||||
+ this.prefix + "plot` WHERE `world` = ? AND `plot_id_x` = ? AND `plot_id_z` = ?)";
|
||||
if (!supportsGetGeneratedKeys) {
|
||||
tempCreatePlotSafe += " RETURNING `id`";
|
||||
}
|
||||
this.CREATE_PLOT_SAFE = tempCreatePlotSafe;
|
||||
}
|
||||
String tempCreateCluster = "INSERT INTO `" + this.prefix
|
||||
this.CREATE_CLUSTER = "INSERT INTO `" + this.prefix
|
||||
+ "cluster`(`pos1_x`, `pos1_z`, `pos2_x`, `pos2_z`, `owner`, `world`) VALUES(?, ?, ?, ?, ?, ?)";
|
||||
if (!supportsGetGeneratedKeys) {
|
||||
tempCreateCluster += " RETURNING `id`";
|
||||
}
|
||||
this.CREATE_CLUSTER = tempCreateCluster;
|
||||
|
||||
try {
|
||||
createTables();
|
||||
} catch (SQLException e) {
|
||||
@ -1096,8 +1073,9 @@ public class SQLManager implements AbstractDB {
|
||||
|
||||
@Override
|
||||
public void addBatch(PreparedStatement statement) throws SQLException {
|
||||
if (statement.execute() || statement.getUpdateCount() > 0) {
|
||||
try (ResultSet keys = supportsGetGeneratedKeys ? statement.getGeneratedKeys() : statement.getResultSet()) {
|
||||
int inserted = statement.executeUpdate();
|
||||
if (inserted > 0) {
|
||||
try (ResultSet keys = statement.getGeneratedKeys()) {
|
||||
if (keys.next()) {
|
||||
plot.temp = keys.getInt(1);
|
||||
addPlotTask(plot, new UniqueStatement(
|
||||
@ -1167,8 +1145,8 @@ public class SQLManager implements AbstractDB {
|
||||
|
||||
@Override
|
||||
public void addBatch(PreparedStatement statement) throws SQLException {
|
||||
statement.execute();
|
||||
try (ResultSet keys = supportsGetGeneratedKeys ? statement.getGeneratedKeys() : statement.getResultSet()) {
|
||||
statement.executeUpdate();
|
||||
try (ResultSet keys = statement.getGeneratedKeys()) {
|
||||
if (keys.next()) {
|
||||
plot.temp = keys.getInt(1);
|
||||
}
|
||||
@ -3080,8 +3058,8 @@ public class SQLManager implements AbstractDB {
|
||||
|
||||
@Override
|
||||
public void addBatch(PreparedStatement statement) throws SQLException {
|
||||
statement.execute();
|
||||
try (ResultSet keys = supportsGetGeneratedKeys ? statement.getGeneratedKeys() : statement.getResultSet()) {
|
||||
statement.executeUpdate();
|
||||
try (ResultSet keys = statement.getGeneratedKeys()) {
|
||||
if (keys.next()) {
|
||||
cluster.temp = keys.getInt(1);
|
||||
}
|
||||
|
@ -1,77 +0,0 @@
|
||||
/*
|
||||
* PlotSquared, a land and world management plugin for Minecraft.
|
||||
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
||||
* Copyright (C) IntellectualSites team and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.plotsquared.core.events;
|
||||
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import org.checkerframework.checker.index.qual.NonNegative;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
|
||||
/**
|
||||
* Called every time after PlotSquared calculated a players plot limit based on their permission.
|
||||
* <p>
|
||||
* May be used to grant a player more plots based on another rank or bought feature.
|
||||
*
|
||||
* @since 7.3.0
|
||||
*/
|
||||
public class PlayerPlotLimitEvent {
|
||||
|
||||
private final PlotPlayer<?> player;
|
||||
|
||||
private int limit;
|
||||
|
||||
public PlayerPlotLimitEvent(@NonNull final PlotPlayer<?> player, @NonNegative final int limit) {
|
||||
this.player = player;
|
||||
this.limit = limit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Overrides the previously calculated or set plot limit for {@link #player()}.
|
||||
*
|
||||
* @param limit The amount of plots a player may claim. Must be {@code 0} or greater.
|
||||
* @since 7.3.0
|
||||
*/
|
||||
public void limit(@NonNegative final int limit) {
|
||||
if (limit < 0) {
|
||||
throw new IllegalArgumentException("Player plot limit must be greater or equal 0");
|
||||
}
|
||||
this.limit = limit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the previous set limit, if none was overridden before this event handler the default limit based on the players
|
||||
* permissions node is returned.
|
||||
*
|
||||
* @return The currently defined plot limit of this player.
|
||||
* @since 7.3.0
|
||||
*/
|
||||
public @NonNegative int limit() {
|
||||
return limit;
|
||||
}
|
||||
|
||||
/**
|
||||
* The player for which the limit is queried.
|
||||
*
|
||||
* @return the player.
|
||||
* @since 7.3.0
|
||||
*/
|
||||
public @NonNull PlotPlayer<?> player() {
|
||||
return player;
|
||||
}
|
||||
|
||||
}
|
@ -21,26 +21,21 @@ package com.plotsquared.core.events;
|
||||
import com.plotsquared.core.location.Location;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.plot.Plot;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
import java.util.function.UnaryOperator;
|
||||
|
||||
/**
|
||||
* Called when a player teleports to a plot
|
||||
*/
|
||||
public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements CancellablePlotEvent {
|
||||
|
||||
private final Location from;
|
||||
private final TeleportCause cause;
|
||||
private Result eventResult;
|
||||
private final Location from;
|
||||
private UnaryOperator<Location> locationTransformer;
|
||||
|
||||
|
||||
/**
|
||||
* PlayerTeleportToPlotEvent: Called when a player teleports to a plot
|
||||
*
|
||||
* @param player That was teleported
|
||||
* @param from The origin location, from where the teleport was triggered (players location most likely)
|
||||
* @param from Start location
|
||||
* @param plot Plot to which the player was teleported
|
||||
* @param cause Why the teleport is being completed
|
||||
* @since 6.1.0
|
||||
@ -62,8 +57,7 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the location, from where the teleport was triggered
|
||||
* (the players current location when executing the home command for example)
|
||||
* Get the from location
|
||||
*
|
||||
* @return Location
|
||||
*/
|
||||
@ -71,27 +65,6 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
|
||||
return this.from;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the currently applied {@link UnaryOperator<Location> transformer} or null, if none was set
|
||||
*
|
||||
* @return LocationTransformer
|
||||
* @since 7.2.1
|
||||
*/
|
||||
public @Nullable UnaryOperator<Location> getLocationTransformer() {
|
||||
return this.locationTransformer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the {@link UnaryOperator<Location> transformer} to mutate the location where the player will be teleported to.
|
||||
* May be {@code null}, if any previous set transformations should be discarded.
|
||||
*
|
||||
* @param locationTransformer The new transformer
|
||||
* @since 7.2.1
|
||||
*/
|
||||
public void setLocationTransformer(@Nullable UnaryOperator<Location> locationTransformer) {
|
||||
this.locationTransformer = locationTransformer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result getEventResult() {
|
||||
return eventResult;
|
||||
|
@ -379,11 +379,10 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
}
|
||||
}
|
||||
|
||||
int yStart = classicPlotWorld.getMinBuildHeight() + (classicPlotWorld.PLOT_BEDROCK ? 1 : 0);
|
||||
if (!plot.isMerged(Direction.NORTH)) {
|
||||
int z = bot.getZ();
|
||||
for (int x = bot.getX(); x < top.getX(); x++) {
|
||||
for (int y = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
queue.setBlock(x, y, z, blocks);
|
||||
}
|
||||
}
|
||||
@ -391,7 +390,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
if (!plot.isMerged(Direction.WEST)) {
|
||||
int x = bot.getX();
|
||||
for (int z = bot.getZ(); z < top.getZ(); z++) {
|
||||
for (int y = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
queue.setBlock(x, y, z, blocks);
|
||||
}
|
||||
}
|
||||
@ -399,7 +398,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
if (!plot.isMerged(Direction.SOUTH)) {
|
||||
int z = top.getZ();
|
||||
for (int x = bot.getX(); x < top.getX() + (plot.isMerged(Direction.EAST) ? 0 : 1); x++) {
|
||||
for (int y = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
queue.setBlock(x, y, z, blocks);
|
||||
}
|
||||
}
|
||||
@ -407,7 +406,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
if (!plot.isMerged(Direction.EAST)) {
|
||||
int x = top.getX();
|
||||
for (int z = bot.getZ(); z < top.getZ() + (plot.isMerged(Direction.SOUTH) ? 0 : 1); z++) {
|
||||
for (int y = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
queue.setBlock(x, y, z, blocks);
|
||||
}
|
||||
}
|
||||
|
@ -69,8 +69,8 @@ public class HybridGen extends IndependentPlotGenerator {
|
||||
EnumSet<SchematicFeature> features
|
||||
) {
|
||||
int minY; // Math.min(world.PLOT_HEIGHT, world.ROAD_HEIGHT);
|
||||
boolean isRoad = features.contains(SchematicFeature.ROAD);
|
||||
if ((isRoad && Settings.Schematics.PASTE_ROAD_ON_TOP) || (!isRoad && Settings.Schematics.PASTE_ON_TOP)) {
|
||||
if ((features.contains(SchematicFeature.ROAD) && Settings.Schematics.PASTE_ROAD_ON_TOP)
|
||||
|| (!features.contains(SchematicFeature.ROAD) && Settings.Schematics.PASTE_ON_TOP)) {
|
||||
minY = world.SCHEM_Y;
|
||||
} else {
|
||||
minY = world.getMinBuildHeight();
|
||||
|
@ -162,7 +162,6 @@ public class HybridPlotManager extends ClassicPlotManager {
|
||||
} else {
|
||||
minY = hybridPlotWorld.getMinBuildHeight();
|
||||
}
|
||||
int schemYDiff = (isRoad ? hybridPlotWorld.getRoadYStart() : hybridPlotWorld.getPlotYStart()) - minY;
|
||||
BaseBlock airBlock = BlockTypes.AIR.getDefaultState().toBaseBlock();
|
||||
for (int x = pos1.getX(); x <= pos2.getX(); x++) {
|
||||
short absX = (short) ((x - hybridPlotWorld.ROAD_OFFSET_X) % size);
|
||||
@ -179,14 +178,10 @@ public class HybridPlotManager extends ClassicPlotManager {
|
||||
for (int y = 0; y < blocks.length; y++) {
|
||||
if (blocks[y] != null) {
|
||||
queue.setBlock(x, minY + y, z, blocks[y]);
|
||||
} else if (y > schemYDiff) {
|
||||
// This is necessary, otherwise any blocks not specified in the schematic will remain after a clear.
|
||||
// This should only be done where the schematic has actually "started"
|
||||
} else if (!isRoad) {
|
||||
// This is necessary, otherwise any blocks not specified in the schematic will remain after a clear
|
||||
// Do not set air for road as this may cause cavernous roads when debugroadregen is used
|
||||
queue.setBlock(x, minY + y, z, airBlock);
|
||||
} else if (isRoad) {
|
||||
queue.setBlock(x, minY + y, z, hybridPlotWorld.ROAD_BLOCK.toPattern());
|
||||
} else {
|
||||
queue.setBlock(x, minY + y, z, hybridPlotWorld.MAIN_BLOCK.toPattern());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -76,9 +76,6 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
||||
* The Y level at which schematic generation will start, lowest of either road or plot schematic generation.
|
||||
*/
|
||||
public int SCHEM_Y;
|
||||
|
||||
private int plotY;
|
||||
private int roadY;
|
||||
private Location SIGN_LOCATION;
|
||||
private File root = null;
|
||||
private int lastOverlayHeightError = Integer.MIN_VALUE;
|
||||
@ -189,7 +186,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
||||
}
|
||||
Object value;
|
||||
try {
|
||||
final boolean accessible = field.canAccess(this);
|
||||
final boolean accessible = field.isAccessible();
|
||||
field.setAccessible(true);
|
||||
value = field.get(this);
|
||||
field.setAccessible(accessible);
|
||||
@ -255,60 +252,68 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
||||
|
||||
SCHEM_Y = schematicStartHeight();
|
||||
|
||||
// plotY and roadY are important to allow plot and/or road schematic "overflow" into each other
|
||||
// without causing AIOOB exceptions when attempting either to set blocks to, or get block from G_SCH
|
||||
// plotY and roadY are important to allow plot and/or road schematic "overflow" into each other without causing AIOOB
|
||||
// exceptions when attempting either to set blocks to, or get block from G_SCH
|
||||
// Default plot schematic start height, normalized to the minimum height schematics are pasted from.
|
||||
plotY = PLOT_HEIGHT - SCHEM_Y;
|
||||
int plotY = PLOT_HEIGHT - SCHEM_Y;
|
||||
int minRoadWall = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ? Math.min(ROAD_HEIGHT, WALL_HEIGHT) : ROAD_HEIGHT;
|
||||
// Default road schematic start height, normalized to the minimum height schematics are pasted from.
|
||||
roadY = minRoadWall - SCHEM_Y;
|
||||
int roadY = minRoadWall - SCHEM_Y;
|
||||
|
||||
int worldGenHeight = getMaxGenHeight() - getMinGenHeight() + 1;
|
||||
|
||||
int maxSchematicHeight = 0;
|
||||
int plotSchemHeight = 0;
|
||||
|
||||
// SCHEM_Y should be normalised to the plot "start" height
|
||||
if (schematic3 != null) {
|
||||
plotSchemHeight = schematic3.getClipboard().getDimensions().getY();
|
||||
if (plotSchemHeight == worldGenHeight) {
|
||||
plotSchemHeight = maxSchematicHeight = schematic3.getClipboard().getDimensions().getY();
|
||||
if (maxSchematicHeight == worldGenHeight) {
|
||||
SCHEM_Y = getMinGenHeight();
|
||||
plotY = 0;
|
||||
} else if (!Settings.Schematics.PASTE_ON_TOP) {
|
||||
SCHEM_Y = getMinGenHeight();
|
||||
SCHEM_Y = getMinBuildHeight();
|
||||
plotY = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int roadSchemHeight = 0;
|
||||
int roadSchemHeight;
|
||||
|
||||
if (schematic1 != null) {
|
||||
roadSchemHeight = Math.max(
|
||||
schematic1.getClipboard().getDimensions().getY(),
|
||||
schematic2.getClipboard().getDimensions().getY()
|
||||
);
|
||||
if (roadSchemHeight == worldGenHeight) {
|
||||
maxSchematicHeight = Math.max(roadSchemHeight, maxSchematicHeight);
|
||||
if (maxSchematicHeight == worldGenHeight) {
|
||||
SCHEM_Y = getMinGenHeight();
|
||||
roadY = 0; // Road is the lowest schematic
|
||||
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldGenHeight) {
|
||||
// Road is the lowest schematic. Normalize plotY to it.
|
||||
if (Settings.Schematics.PASTE_ON_TOP) {
|
||||
plotY = PLOT_HEIGHT - getMinGenHeight();
|
||||
} else {
|
||||
plotY = getMinBuildHeight() - getMinGenHeight();
|
||||
}
|
||||
}
|
||||
} else if (!Settings.Schematics.PASTE_ROAD_ON_TOP) {
|
||||
roadY = 0;
|
||||
SCHEM_Y = getMinGenHeight();
|
||||
if (schematic3 != null) {
|
||||
if (SCHEM_Y == getMinGenHeight()) { // Only possible if plot schematic is enabled
|
||||
// Plot is still the lowest schematic, normalize roadY to it
|
||||
roadY = getMinBuildHeight() - getMinGenHeight();
|
||||
} else if (schematic3 != null) {
|
||||
SCHEM_Y = getMinBuildHeight();
|
||||
roadY = 0;// Road is the lowest schematic
|
||||
if (Settings.Schematics.PASTE_ON_TOP) {
|
||||
// Road is the lowest schematic. Normalize plotY to it.
|
||||
plotY = PLOT_HEIGHT - SCHEM_Y;
|
||||
plotY = PLOT_HEIGHT - getMinBuildHeight();
|
||||
}
|
||||
maxSchematicHeight = Math.max(maxSchematicHeight, plotY + plotSchemHeight);
|
||||
}
|
||||
} else {
|
||||
roadY = minRoadWall - SCHEM_Y;
|
||||
maxSchematicHeight = Math.max(maxSchematicHeight, roadY + roadSchemHeight);
|
||||
}
|
||||
}
|
||||
int maxSchematicHeight = Math.max(plotY + plotSchemHeight, roadY + roadSchemHeight);
|
||||
|
||||
if (schematic3 != null) {
|
||||
this.PLOT_SCHEMATIC = true;
|
||||
@ -549,24 +554,4 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
||||
return this.root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the y value where the plot schematic should be pasted from.
|
||||
*
|
||||
* @return plot schematic y start value
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public int getPlotYStart() {
|
||||
return SCHEM_Y + plotY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the y value where the road schematic should be pasted from.
|
||||
*
|
||||
* @return road schematic y start value
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public int getRoadYStart() {
|
||||
return SCHEM_Y + roadY;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -77,10 +77,6 @@ public class HybridUtils {
|
||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + HybridUtils.class.getSimpleName());
|
||||
private static final BlockState AIR = BlockTypes.AIR.getDefaultState();
|
||||
|
||||
/**
|
||||
* Deprecated and likely to be removed in a future release.
|
||||
*/
|
||||
@Deprecated(forRemoval = true, since = "7.0.0")
|
||||
public static HybridUtils manager;
|
||||
public static Set<BlockVector2> regions;
|
||||
public static int height;
|
||||
@ -533,7 +529,7 @@ public class HybridUtils {
|
||||
Math.min(plotworld.PLOT_HEIGHT, Math.min(plotworld.WALL_HEIGHT, plotworld.ROAD_HEIGHT)) : plotworld.ROAD_HEIGHT;
|
||||
int sx = bot.getX() - plotworld.ROAD_WIDTH + 1;
|
||||
int sz = bot.getZ() + 1;
|
||||
int sy = Settings.Schematics.PASTE_ROAD_ON_TOP ? schemY : plot.getArea().getMinGenHeight();
|
||||
int sy = Settings.Schematics.PASTE_ROAD_ON_TOP ? schemY : plot.getArea().getMinBuildHeight();
|
||||
int ex = bot.getX();
|
||||
int ez = top.getZ();
|
||||
int ey = get_ey(plotworld, queue, sx, ex, sz, ez, sy);
|
||||
@ -672,7 +668,7 @@ public class HybridUtils {
|
||||
}
|
||||
if (condition) {
|
||||
BaseBlock[] blocks = plotWorld.G_SCH.get(MathMan.pair(absX, absZ));
|
||||
int minY = plotWorld.getRoadYStart();
|
||||
int minY = Settings.Schematics.PASTE_ROAD_ON_TOP ? plotWorld.SCHEM_Y : area.getMinGenHeight() + 1;
|
||||
int maxDy = Math.max(extend, blocks.length);
|
||||
for (int dy = 0; dy < maxDy; dy++) {
|
||||
if (dy > blocks.length - 1) {
|
||||
|
@ -46,7 +46,7 @@ public abstract class IndependentPlotGenerator {
|
||||
* @param result Queue to write to
|
||||
* @param settings PlotArea (settings)
|
||||
* @param biomes If biomes should be generated
|
||||
* @since 7.0.0
|
||||
* @since TODO
|
||||
*/
|
||||
public abstract void generateChunk(ZeroedDelegateScopedQueueCoordinator result, PlotArea settings, boolean biomes);
|
||||
|
||||
@ -55,7 +55,7 @@ public abstract class IndependentPlotGenerator {
|
||||
*
|
||||
* @param result Queue to write to
|
||||
* @param setting PlotArea (settings)
|
||||
* @since 7.0.0
|
||||
* @since TODO
|
||||
*/
|
||||
public void populateChunk(ZeroedDelegateScopedQueueCoordinator result, PlotArea setting) {
|
||||
}
|
||||
@ -108,7 +108,7 @@ public abstract class IndependentPlotGenerator {
|
||||
* @param y World y position
|
||||
* @param z World z position
|
||||
* @return Biome type to be generated
|
||||
* @since 7.0.0
|
||||
* @since TODO
|
||||
*/
|
||||
public abstract BiomeType getBiome(PlotArea settings, int x, int y, int z);
|
||||
|
||||
|
@ -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.inject.modules;
|
||||
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Scopes;
|
||||
import com.google.inject.multibindings.Multibinder;
|
||||
import com.plotsquared.core.commands.PlotSquaredCommandBean;
|
||||
import com.plotsquared.core.commands.command.setting.flag.FlagAddCommand;
|
||||
import com.plotsquared.core.commands.command.setting.flag.FlagInfoCommand;
|
||||
import com.plotsquared.core.commands.command.setting.flag.FlagListCommand;
|
||||
import com.plotsquared.core.commands.command.setting.flag.FlagRemoveCommand;
|
||||
import com.plotsquared.core.commands.command.setting.flag.FlagSetCommand;
|
||||
|
||||
public final class CommandModule extends AbstractModule {
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
final Multibinder<PlotSquaredCommandBean> commands = Multibinder.newSetBinder(
|
||||
this.binder(),
|
||||
PlotSquaredCommandBean.class
|
||||
);
|
||||
|
||||
commands.addBinding().to(FlagAddCommand.class).in(Scopes.SINGLETON);
|
||||
commands.addBinding().to(FlagInfoCommand.class).in(Scopes.SINGLETON);
|
||||
commands.addBinding().to(FlagListCommand.class).in(Scopes.SINGLETON);
|
||||
commands.addBinding().to(FlagRemoveCommand.class).in(Scopes.SINGLETON);
|
||||
commands.addBinding().to(FlagSetCommand.class).in(Scopes.SINGLETON);
|
||||
}
|
||||
}
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
package com.plotsquared.core.inject.modules;
|
||||
|
||||
import cloud.commandframework.services.ServicePipeline;
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.plotsquared.core.PlotSquared;
|
||||
import com.plotsquared.core.configuration.file.YamlConfiguration;
|
||||
@ -30,7 +31,6 @@ import com.plotsquared.core.listener.PlotListener;
|
||||
import com.plotsquared.core.util.EventDispatcher;
|
||||
import com.plotsquared.core.uuid.UUIDPipeline;
|
||||
import com.sk89q.worldedit.WorldEdit;
|
||||
import org.incendo.cloud.services.ServicePipeline;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
|
@ -55,6 +55,7 @@ import com.plotsquared.core.plot.flag.implementations.TitlesFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.WeatherFlag;
|
||||
import com.plotsquared.core.plot.flag.types.TimedFlag;
|
||||
import com.plotsquared.core.util.EventDispatcher;
|
||||
import com.plotsquared.core.util.PlayerManager;
|
||||
import com.plotsquared.core.util.task.TaskManager;
|
||||
import com.plotsquared.core.util.task.TaskTime;
|
||||
import com.sk89q.worldedit.world.gamemode.GameMode;
|
||||
@ -62,6 +63,7 @@ import com.sk89q.worldedit.world.gamemode.GameModes;
|
||||
import com.sk89q.worldedit.world.item.ItemType;
|
||||
import com.sk89q.worldedit.world.item.ItemTypes;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.ComponentLike;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
@ -75,7 +77,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public class PlotListener {
|
||||
|
||||
@ -320,27 +321,22 @@ public class PlotListener {
|
||||
}
|
||||
if ((lastPlot != null) && plot.getId().equals(lastPlot.getId()) && plot.hasOwner()) {
|
||||
final UUID plotOwner = plot.getOwnerAbs();
|
||||
ComponentLike owner = PlayerManager.resolveName(plotOwner, true).toComponent(player);
|
||||
Caption header = fromFlag ? StaticCaption.of(title) : TranslatableCaption.of("titles" +
|
||||
".title_entered_plot");
|
||||
Caption subHeader = fromFlag ? StaticCaption.of(subtitle) : TranslatableCaption.of("titles" +
|
||||
".title_entered_plot_sub");
|
||||
|
||||
CompletableFuture<TagResolver> future = PlotSquared.platform().playerManager()
|
||||
.getUsernameCaption(plotOwner).thenApply(caption -> TagResolver.builder()
|
||||
.tag("owner", Tag.inserting(caption.toComponent(player)))
|
||||
.tag("plot", Tag.inserting(Component.text(lastPlot.getId().toString())))
|
||||
.tag("world", Tag.inserting(Component.text(player.getLocation().getWorldName())))
|
||||
.tag("alias", Tag.inserting(Component.text(plot.getAlias())))
|
||||
.build()
|
||||
);
|
||||
|
||||
future.whenComplete((tagResolver, throwable) -> {
|
||||
if (Settings.Titles.TITLES_AS_ACTIONBAR) {
|
||||
player.sendActionBar(header, tagResolver);
|
||||
} else {
|
||||
player.sendTitle(header, subHeader, tagResolver);
|
||||
}
|
||||
});
|
||||
TagResolver resolver = TagResolver.builder()
|
||||
.tag("plot", Tag.inserting(Component.text(lastPlot.getId().toString())))
|
||||
.tag("world", Tag.inserting(Component.text(player.getLocation().getWorldName())))
|
||||
.tag("owner", Tag.inserting(owner))
|
||||
.tag("alias", Tag.inserting(Component.text(plot.getAlias())))
|
||||
.build();
|
||||
if (Settings.Titles.TITLES_AS_ACTIONBAR) {
|
||||
player.sendActionBar(header, resolver);
|
||||
} else {
|
||||
player.sendTitle(header, subHeader, resolver);
|
||||
}
|
||||
}
|
||||
}, TaskTime.seconds(1L));
|
||||
}
|
||||
@ -364,6 +360,7 @@ public class PlotListener {
|
||||
public boolean plotExit(final PlotPlayer<?> player, Plot plot) {
|
||||
try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||
final Plot previous = lastPlot.remove();
|
||||
this.eventDispatcher.callLeave(player, plot);
|
||||
|
||||
List<StatusEffect> effects = playerEffects.remove(player.getUUID());
|
||||
if (effects != null) {
|
||||
@ -466,8 +463,6 @@ public class PlotListener {
|
||||
feedRunnable.remove(player.getUUID());
|
||||
healRunnable.remove(player.getUUID());
|
||||
}
|
||||
} finally {
|
||||
this.eventDispatcher.callLeave(player, plot);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -55,25 +55,6 @@ public enum Direction {
|
||||
return NORTH;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return the opposite direction}
|
||||
* If this is {@link Direction#ALL}, then {@link Direction#ALL} is returned.
|
||||
* @since 7.2.0
|
||||
*/
|
||||
public Direction opposite() {
|
||||
return switch (this) {
|
||||
case ALL -> ALL;
|
||||
case NORTH -> SOUTH;
|
||||
case EAST -> WEST;
|
||||
case SOUTH -> NORTH;
|
||||
case WEST -> EAST;
|
||||
case NORTHEAST -> SOUTHWEST;
|
||||
case SOUTHEAST -> NORTHWEST;
|
||||
case SOUTHWEST -> NORTHEAST;
|
||||
case NORTHWEST -> SOUTHEAST;
|
||||
};
|
||||
}
|
||||
|
||||
public int getIndex() {
|
||||
return index;
|
||||
}
|
||||
|
@ -60,19 +60,6 @@ public final class UncheckedWorldLocation extends Location {
|
||||
return new UncheckedWorldLocation(world, x, y, z);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a new location with yaw and pitch equal to 0
|
||||
*
|
||||
* @param world World
|
||||
* @param loc Coordinates
|
||||
* @return New location
|
||||
* @since 7.0.0
|
||||
*/
|
||||
@DoNotUse
|
||||
public static @NonNull UncheckedWorldLocation at(final @NonNull String world, BlockVector3 loc) {
|
||||
return new UncheckedWorldLocation(world, loc.getX(), loc.getY(), loc.getZ());
|
||||
}
|
||||
|
||||
@Override
|
||||
@DoNotUse
|
||||
public @NonNull String getWorldName() {
|
||||
|
@ -45,7 +45,6 @@ public enum Permission implements ComponentLike {
|
||||
PERMISSION_ADMIN_ENTRY_FORCEFIELD("plots.admin.entry.forcefield"),
|
||||
PERMISSION_ADMIN_COMMANDS_CHATSPY("plots.admin.command.chatspy"),
|
||||
PERMISSION_MERGE("plots.merge"),
|
||||
PERMISSION_MERGE_ALL("plots.merge.all"),
|
||||
PERMISSION_MERGE_OTHER("plots.merge.other"),
|
||||
PERMISSION_MERGE_KEEP_ROAD("plots.merge.keeproad"),
|
||||
PERMISSION_ADMIN_CAPS_OTHER("plots.admin.caps.other"),
|
||||
@ -59,9 +58,6 @@ public enum Permission implements ComponentLike {
|
||||
PERMISSION_ADMIN_DESTROY_VEHICLE_UNOWNED("plots.admin.vehicle.break.unowned"),
|
||||
PERMISSION_ADMIN_DESTROY_VEHICLE_OTHER("plots.admin.vehicle.break.other"),
|
||||
PERMISSION_ADMIN_PVE("plots.admin.pve"),
|
||||
PERMISSION_ADMIN_PLACE_VEHICLE_ROAD("plots.admin.vehicle.place.road"),
|
||||
PERMISSION_ADMIN_PLACE_VEHICLE_UNOWNED("plots.admin.vehicle.place.unowned"),
|
||||
PERMISSION_ADMIN_PLACE_VEHICLE_OTHER("plots.admin.vehicle.place.other"),
|
||||
PERMISSION_ADMIN_PVP("plots.admin.pvp"),
|
||||
PERMISSION_ADMIN_BUILD_ROAD("plots.admin.build.road"),
|
||||
PERMISSION_ADMIN_PROJECTILE_ROAD("plots.admin.projectile.road"),
|
||||
@ -204,8 +200,7 @@ public enum Permission implements ComponentLike {
|
||||
PERMISSION_RATE("plots.rate"),
|
||||
PERMISSION_ADMIN_FLIGHT("plots.admin.flight"),
|
||||
PERMISSION_ADMIN_COMPONENTS_OTHER("plots.admin.component.other"),
|
||||
PERMISSION_ADMIN_BYPASS_BORDER("plots.admin.border.bypass"),
|
||||
PERMISSION_ADMIN_BYPASS_ECON("plots.admin.econ.bypass");
|
||||
PERMISSION_ADMIN_BYPASS_BORDER("plots.admin.border.bypass");
|
||||
//</editor-fold>
|
||||
|
||||
private final String text;
|
||||
|
@ -100,7 +100,6 @@ public interface PermissionHolder {
|
||||
}
|
||||
String[] nodes = stub.split("\\.");
|
||||
StringBuilder builder = new StringBuilder();
|
||||
// Wildcard check from less specific permission to more specific permission
|
||||
for (int i = 0; i < (nodes.length - 1); i++) {
|
||||
builder.append(nodes[i]).append(".");
|
||||
if (!stub.equals(builder + Permission.PERMISSION_STAR.toString())) {
|
||||
@ -109,7 +108,6 @@ public interface PermissionHolder {
|
||||
}
|
||||
}
|
||||
}
|
||||
// Wildcard check for the full permission
|
||||
if (hasPermission(stub + ".*")) {
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
|
@ -25,9 +25,9 @@ import java.util.UUID;
|
||||
public interface OfflinePlotPlayer extends PermissionHolder {
|
||||
|
||||
/**
|
||||
* Returns the UUID of the player.
|
||||
* Gets the {@code UUID} of this player
|
||||
*
|
||||
* @return the UUID of the player
|
||||
* @return the player {@link UUID}
|
||||
*/
|
||||
UUID getUUID();
|
||||
|
||||
@ -39,9 +39,9 @@ public interface OfflinePlotPlayer extends PermissionHolder {
|
||||
long getLastPlayed();
|
||||
|
||||
/**
|
||||
* Returns the name of the player.
|
||||
* Gets the name of this player.
|
||||
*
|
||||
* @return the name of the player
|
||||
* @return the player name
|
||||
*/
|
||||
String getName();
|
||||
|
||||
|
@ -80,7 +80,6 @@ import java.util.Map;
|
||||
import java.util.Queue;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
@ -274,9 +273,8 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
||||
return this.meta == null ? null : this.meta.remove(key);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the name of the player.
|
||||
* This player's name.
|
||||
*
|
||||
* @return the name of the player
|
||||
*/
|
||||
@ -306,8 +304,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
||||
* @return number of allowed plots within the scope (globally, or in the player's current world as defined in the settings.yml)
|
||||
*/
|
||||
public int getAllowedPlots() {
|
||||
final int calculatedLimit = hasPermissionRange("plots.plot", Settings.Limit.MAX_PLOTS);
|
||||
return this.eventDispatcher.callPlayerPlotLimit(this, calculatedLimit).limit();
|
||||
return hasPermissionRange("plots.plot", Settings.Limit.MAX_PLOTS);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -883,7 +880,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
||||
final Component titleComponent = MiniMessage.miniMessage().deserialize(title.getComponent(this), replacements);
|
||||
final Component subtitleComponent =
|
||||
MiniMessage.miniMessage().deserialize(subtitle.getComponent(this), replacements);
|
||||
final Title.Times times = Title.Times.times(
|
||||
final Title.Times times = Title.Times.of(
|
||||
Duration.of(Settings.Titles.TITLES_FADE_IN * 50L, ChronoUnit.MILLIS),
|
||||
Duration.of(Settings.Titles.TITLES_STAY * 50L, ChronoUnit.MILLIS),
|
||||
Duration.of(Settings.Titles.TITLES_FADE_OUT * 50L, ChronoUnit.MILLIS)
|
||||
@ -955,54 +952,6 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a message to the command caller, when the future is resolved
|
||||
*
|
||||
* @param caption Caption to send
|
||||
* @param asyncReplacement Async variable replacement
|
||||
* @return A Future to be resolved, after the message was sent
|
||||
* @since 7.1.0
|
||||
*/
|
||||
public final CompletableFuture<Void> sendMessage(
|
||||
@NonNull Caption caption,
|
||||
CompletableFuture<@NonNull TagResolver> asyncReplacement
|
||||
) {
|
||||
return sendMessage(caption, new CompletableFuture[]{asyncReplacement});
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a message to the command caller, when all futures are resolved
|
||||
*
|
||||
* @param caption Caption to send
|
||||
* @param asyncReplacements Async variable replacements
|
||||
* @param replacements Sync variable replacements
|
||||
* @return A Future to be resolved, after the message was sent
|
||||
* @since 7.1.0
|
||||
*/
|
||||
public final CompletableFuture<Void> sendMessage(
|
||||
@NonNull Caption caption,
|
||||
CompletableFuture<@NonNull TagResolver>[] asyncReplacements,
|
||||
@NonNull TagResolver... replacements
|
||||
) {
|
||||
return CompletableFuture.allOf(asyncReplacements).whenComplete((unused, throwable) -> {
|
||||
Set<TagResolver> resolvers = new HashSet<>(Arrays.asList(replacements));
|
||||
if (throwable != null) {
|
||||
sendMessage(
|
||||
TranslatableCaption.of("errors.error"),
|
||||
TagResolver.resolver("value", Tag.inserting(
|
||||
Component.text("Failed to resolve asynchronous caption replacements")
|
||||
))
|
||||
);
|
||||
LOGGER.error("Failed to resolve asynchronous tagresolver(s) for " + caption, throwable);
|
||||
} else {
|
||||
for (final CompletableFuture<TagResolver> asyncReplacement : asyncReplacements) {
|
||||
resolvers.add(asyncReplacement.join());
|
||||
}
|
||||
}
|
||||
sendMessage(caption, resolvers.toArray(TagResolver[]::new));
|
||||
});
|
||||
}
|
||||
|
||||
// Redefine from PermissionHolder as it's required from CommandCaller
|
||||
@Override
|
||||
public boolean hasPermission(@NonNull String permission) {
|
||||
|
@ -29,7 +29,6 @@ import com.plotsquared.core.configuration.caption.CaptionUtility;
|
||||
import com.plotsquared.core.configuration.caption.StaticCaption;
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.database.DBFunc;
|
||||
import com.plotsquared.core.events.PlayerTeleportToPlotEvent;
|
||||
import com.plotsquared.core.events.Result;
|
||||
import com.plotsquared.core.events.TeleportCause;
|
||||
import com.plotsquared.core.generator.ClassicPlotWorld;
|
||||
@ -86,7 +85,6 @@ import java.util.ArrayDeque;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Deque;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
@ -2285,8 +2283,8 @@ public class Plot {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a set of plots connected (and including) this plot.
|
||||
* The returned set is immutable.
|
||||
* Gets a set of plots connected (and including) this plot<br>
|
||||
* - This result is cached globally
|
||||
*
|
||||
* @return a Set of Plots connected to this Plot
|
||||
*/
|
||||
@ -2297,73 +2295,115 @@ public class Plot {
|
||||
if (!this.isMerged()) {
|
||||
return Collections.singleton(this);
|
||||
}
|
||||
Plot basePlot = getBasePlot(false);
|
||||
if (this.connectedCache == null && this != basePlot) {
|
||||
// share cache between connected plots
|
||||
Set<Plot> connectedPlots = basePlot.getConnectedPlots();
|
||||
this.connectedCache = connectedPlots;
|
||||
return connectedPlots;
|
||||
}
|
||||
if (this.connectedCache != null && this.connectedCache.contains(this)) {
|
||||
return this.connectedCache;
|
||||
}
|
||||
|
||||
Set<Plot> tmpSet = new HashSet<>();
|
||||
HashSet<Plot> tmpSet = new HashSet<>();
|
||||
tmpSet.add(this);
|
||||
HashSet<Plot> queueCache = new HashSet<>();
|
||||
Plot tmp;
|
||||
HashSet<Object> queuecache = new HashSet<>();
|
||||
ArrayDeque<Plot> frontier = new ArrayDeque<>();
|
||||
computeDirectMerged(queueCache, frontier, Direction.NORTH);
|
||||
computeDirectMerged(queueCache, frontier, Direction.EAST);
|
||||
computeDirectMerged(queueCache, frontier, Direction.SOUTH);
|
||||
computeDirectMerged(queueCache, frontier, Direction.WEST);
|
||||
if (this.isMerged(Direction.NORTH)) {
|
||||
tmp = this.area.getPlotAbs(this.id.getRelative(Direction.NORTH));
|
||||
if (!tmp.isMerged(Direction.SOUTH)) {
|
||||
// invalid merge
|
||||
if (tmp.isOwnerAbs(this.getOwnerAbs())) {
|
||||
tmp.getSettings().setMerged(Direction.SOUTH, true);
|
||||
DBFunc.setMerged(tmp, tmp.getSettings().getMerged());
|
||||
} else {
|
||||
this.getSettings().setMerged(Direction.NORTH, false);
|
||||
DBFunc.setMerged(this, this.getSettings().getMerged());
|
||||
}
|
||||
}
|
||||
queuecache.add(tmp);
|
||||
frontier.add(tmp);
|
||||
}
|
||||
if (this.isMerged(Direction.EAST)) {
|
||||
tmp = this.area.getPlotAbs(this.id.getRelative(Direction.EAST));
|
||||
assert tmp != null;
|
||||
if (!tmp.isMerged(Direction.WEST)) {
|
||||
// invalid merge
|
||||
if (tmp.isOwnerAbs(this.getOwnerAbs())) {
|
||||
tmp.getSettings().setMerged(Direction.WEST, true);
|
||||
DBFunc.setMerged(tmp, tmp.getSettings().getMerged());
|
||||
} else {
|
||||
this.getSettings().setMerged(Direction.EAST, false);
|
||||
DBFunc.setMerged(this, this.getSettings().getMerged());
|
||||
}
|
||||
}
|
||||
queuecache.add(tmp);
|
||||
frontier.add(tmp);
|
||||
}
|
||||
if (this.isMerged(Direction.SOUTH)) {
|
||||
tmp = this.area.getPlotAbs(this.id.getRelative(Direction.SOUTH));
|
||||
assert tmp != null;
|
||||
if (!tmp.isMerged(Direction.NORTH)) {
|
||||
// invalid merge
|
||||
if (tmp.isOwnerAbs(this.getOwnerAbs())) {
|
||||
tmp.getSettings().setMerged(Direction.NORTH, true);
|
||||
DBFunc.setMerged(tmp, tmp.getSettings().getMerged());
|
||||
} else {
|
||||
this.getSettings().setMerged(Direction.SOUTH, false);
|
||||
DBFunc.setMerged(this, this.getSettings().getMerged());
|
||||
}
|
||||
}
|
||||
queuecache.add(tmp);
|
||||
frontier.add(tmp);
|
||||
}
|
||||
if (this.isMerged(Direction.WEST)) {
|
||||
tmp = this.area.getPlotAbs(this.id.getRelative(Direction.WEST));
|
||||
if (!tmp.isMerged(Direction.EAST)) {
|
||||
// invalid merge
|
||||
if (tmp.isOwnerAbs(this.getOwnerAbs())) {
|
||||
tmp.getSettings().setMerged(Direction.EAST, true);
|
||||
DBFunc.setMerged(tmp, tmp.getSettings().getMerged());
|
||||
} else {
|
||||
this.getSettings().setMerged(Direction.WEST, false);
|
||||
DBFunc.setMerged(this, this.getSettings().getMerged());
|
||||
}
|
||||
}
|
||||
queuecache.add(tmp);
|
||||
frontier.add(tmp);
|
||||
}
|
||||
Plot current;
|
||||
while ((current = frontier.poll()) != null) {
|
||||
if (!current.hasOwner() || current.settings == null) {
|
||||
continue;
|
||||
}
|
||||
tmpSet.add(current);
|
||||
queueCache.remove(current);
|
||||
addIfIncluded(current, Direction.NORTH, queueCache, tmpSet, frontier);
|
||||
addIfIncluded(current, Direction.EAST, queueCache, tmpSet, frontier);
|
||||
addIfIncluded(current, Direction.SOUTH, queueCache, tmpSet, frontier);
|
||||
addIfIncluded(current, Direction.WEST, queueCache, tmpSet, frontier);
|
||||
}
|
||||
tmpSet = Set.copyOf(tmpSet);
|
||||
this.connectedCache = tmpSet;
|
||||
return tmpSet;
|
||||
}
|
||||
|
||||
private void computeDirectMerged(Set<Plot> queueCache, Deque<Plot> frontier, Direction direction) {
|
||||
if (this.isMerged(direction)) {
|
||||
Plot tmp = this.area.getPlotAbs(this.id.getRelative(direction));
|
||||
assert tmp != null;
|
||||
if (!tmp.isMerged(direction.opposite())) {
|
||||
// invalid merge
|
||||
if (tmp.isOwnerAbs(this.getOwnerAbs())) {
|
||||
tmp.getSettings().setMerged(direction.opposite(), true);
|
||||
DBFunc.setMerged(tmp, tmp.getSettings().getMerged());
|
||||
} else {
|
||||
this.getSettings().setMerged(direction, false);
|
||||
DBFunc.setMerged(this, this.getSettings().getMerged());
|
||||
queuecache.remove(current);
|
||||
if (current.isMerged(Direction.NORTH)) {
|
||||
tmp = current.area.getPlotAbs(current.id.getRelative(Direction.NORTH));
|
||||
if (tmp != null && !queuecache.contains(tmp) && !tmpSet.contains(tmp)) {
|
||||
queuecache.add(tmp);
|
||||
frontier.add(tmp);
|
||||
}
|
||||
}
|
||||
if (current.isMerged(Direction.EAST)) {
|
||||
tmp = current.area.getPlotAbs(current.id.getRelative(Direction.EAST));
|
||||
if (tmp != null && !queuecache.contains(tmp) && !tmpSet.contains(tmp)) {
|
||||
queuecache.add(tmp);
|
||||
frontier.add(tmp);
|
||||
}
|
||||
}
|
||||
if (current.isMerged(Direction.SOUTH)) {
|
||||
tmp = current.area.getPlotAbs(current.id.getRelative(Direction.SOUTH));
|
||||
if (tmp != null && !queuecache.contains(tmp) && !tmpSet.contains(tmp)) {
|
||||
queuecache.add(tmp);
|
||||
frontier.add(tmp);
|
||||
}
|
||||
}
|
||||
if (current.isMerged(Direction.WEST)) {
|
||||
tmp = current.area.getPlotAbs(current.id.getRelative(Direction.WEST));
|
||||
if (tmp != null && !queuecache.contains(tmp) && !tmpSet.contains(tmp)) {
|
||||
queuecache.add(tmp);
|
||||
frontier.add(tmp);
|
||||
}
|
||||
}
|
||||
queueCache.add(tmp);
|
||||
frontier.add(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
private void addIfIncluded(
|
||||
Plot current, Direction
|
||||
direction, Set<Plot> queueCache, Set<Plot> tmpSet, Deque<Plot> frontier
|
||||
) {
|
||||
if (!current.isMerged(direction)) {
|
||||
return;
|
||||
}
|
||||
Plot tmp = current.area.getPlotAbs(current.id.getRelative(direction));
|
||||
if (tmp != null && !queueCache.contains(tmp) && !tmpSet.contains(tmp)) {
|
||||
queueCache.add(tmp);
|
||||
frontier.add(tmp);
|
||||
}
|
||||
this.connectedCache = tmpSet;
|
||||
return tmpSet;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2574,9 +2614,8 @@ public class Plot {
|
||||
*/
|
||||
public void teleportPlayer(final PlotPlayer<?> player, TeleportCause cause, Consumer<Boolean> resultConsumer) {
|
||||
Plot plot = this.getBasePlot(false);
|
||||
|
||||
PlayerTeleportToPlotEvent event = this.eventDispatcher.callTeleport(player, player.getLocation(), plot, cause);
|
||||
if (event.getEventResult() == Result.DENY) {
|
||||
Result result = this.eventDispatcher.callTeleport(player, player.getLocation(), plot, cause).getEventResult();
|
||||
if (result == Result.DENY) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("events.event_denied"),
|
||||
TagResolver.resolver("value", Tag.inserting(Component.text("Teleport")))
|
||||
@ -2584,10 +2623,7 @@ public class Plot {
|
||||
resultConsumer.accept(false);
|
||||
return;
|
||||
}
|
||||
|
||||
final Consumer<Location> locationConsumer = calculatedLocation -> {
|
||||
Location location = event.getLocationTransformer() == null ? calculatedLocation :
|
||||
Objects.requireNonNullElse(event.getLocationTransformer().apply(calculatedLocation), calculatedLocation);
|
||||
final Consumer<Location> locationConsumer = location -> {
|
||||
if (Settings.Teleport.DELAY == 0 || player.hasPermission("plots.teleport.delay.bypass")) {
|
||||
player.sendMessage(TranslatableCaption.of("teleport.teleported_to_plot"));
|
||||
player.teleport(location, cause);
|
||||
@ -2643,11 +2679,6 @@ public class Plot {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the maximum distance of the plot from x=0, z=0.
|
||||
*
|
||||
* @return max block distance from 0,0
|
||||
*/
|
||||
public int getDistanceFromOrigin() {
|
||||
Location bot = getManager().getPlotBottomLocAbs(id);
|
||||
Location top = getManager().getPlotTopLocAbs(id);
|
||||
@ -2661,7 +2692,7 @@ public class Plot {
|
||||
* Expands the world border to include this plot if it is beyond the current border.
|
||||
*/
|
||||
public void updateWorldBorder() {
|
||||
int border = this.area.getBorder(false);
|
||||
int border = this.area.getBorder();
|
||||
if (border == Integer.MAX_VALUE) {
|
||||
return;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user