mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2025-07-03 06:04:43 +02:00
Compare commits
235 Commits
fix/missin
...
fix/killRo
Author | SHA1 | Date | |
---|---|---|---|
6ad120b86f | |||
99858c3275 | |||
895cf0da66 | |||
05811d80ce | |||
4de9967ef4 | |||
034bd866eb | |||
98aab56616 | |||
8f980c726b | |||
7f59c03f06 | |||
480a5925b6 | |||
cee4493723 | |||
b8ac1a22c1 | |||
67e69e3fc1 | |||
670f5a802e | |||
c4bd6b6500 | |||
161e3ffdc7 | |||
be8f07c556 | |||
215053e364 | |||
4839a83279 | |||
0649ef33f0 | |||
1590a4b6eb | |||
c793b4454a | |||
7ab1a3eafb | |||
c65c9e7827 | |||
f88ea94bfe | |||
c8e8eb919f | |||
83fe761fe4 | |||
a7447c9d75 | |||
5867cc51a7 | |||
86e21f3e1a | |||
d7d884ad6d | |||
1c45e01a14 | |||
6ef1163325 | |||
c57d784df7 | |||
c239908aa3 | |||
a6412581a6 | |||
f20c5f46e3 | |||
4db5954490 | |||
9f68654614 | |||
2e4c6199e5 | |||
7edca600fd | |||
bc1cc074b8 | |||
d383187c6e | |||
125a3f6772 | |||
faca8c2da0 | |||
0ad5ef4f94 | |||
5e8d8629c2 | |||
9f4f213a8c | |||
ce14036949 | |||
2dbb6ee025 | |||
0da1d9f17a | |||
f1f41b0523 | |||
fe324d3ea9 | |||
ff83868cbc | |||
111ea7029e | |||
9be2eedf7f | |||
82f868ae7d | |||
e46dbd826c | |||
809ddce2b3 | |||
1b40cea51f | |||
022e0fc224 | |||
b32137a650 | |||
17c41c0494 | |||
1ee76bf2d9 | |||
2321831044 | |||
25e98618b9 | |||
5344efd1b7 | |||
68701b6201 | |||
64c610ef37 | |||
931bb90600 | |||
1dfa3b4e66 | |||
8f236a56a6 | |||
e51121960d | |||
cc011de032 | |||
28298ffdd6 | |||
499d3c39bc | |||
3d56937f14 | |||
0f1c2cb4e4 | |||
7b233c944a | |||
d9537ee9df | |||
0de6887526 | |||
a2e3274215 | |||
b369683b9c | |||
7f1f1e025e | |||
59787fe7f3 | |||
6783d5ece6 | |||
d9aa2a496c | |||
809ed6778c | |||
2fe44053a2 | |||
c36b87ca14 | |||
5aec7653b6 | |||
cc5d01e225 | |||
448577774a | |||
966c878a72 | |||
5021f5b379 | |||
76ea9e0d3c | |||
951f08bc8b | |||
ae941e67a4 | |||
9566af5fda | |||
fccc146053 | |||
a1d94af242 | |||
6371cd4c5a | |||
e4613cfc62 | |||
8c44b2d2d2 | |||
449af2f3a4 | |||
ead7acdd76 | |||
1991142d48 | |||
63ae11b3d3 | |||
86fe3c6846 | |||
a90e179338 | |||
a6ae287908 | |||
1a33997099 | |||
6edd4b8220 | |||
9b0d1e484c | |||
6971fa4c10 | |||
3c818f3e33 | |||
31be2e5eb3 | |||
945a8ad306 | |||
c6b0b99cd6 | |||
dbfc43e3cd | |||
c8b4a2fa39 | |||
d851e27aed | |||
4a45729c9e | |||
7931c0864e | |||
1456b29d93 | |||
761477b76d | |||
e61bcf905f | |||
85bec710df | |||
d130794453 | |||
f5f875eb11 | |||
89511f07f9 | |||
1a18adcd95 | |||
65858c5f3e | |||
5c7520b5f5 | |||
f3b9cd5ded | |||
8a3eb25805 | |||
48bbd3c018 | |||
bf85013f70 | |||
d36a2d236b | |||
79f111ec0a | |||
31ae62b62c | |||
cdb44d4884 | |||
eb63e4351d | |||
ba7880241b | |||
be6838f29e | |||
dc73116401 | |||
b6a87df072 | |||
8195afaa2f | |||
561eac2fbd | |||
fdc887850c | |||
e3bfd9b8bf | |||
e689337188 | |||
ee6ae6cba0 | |||
dc8d7809bd | |||
dcd63ed4d9 | |||
3cc770970f | |||
1c3776b605 | |||
95c7f621fb | |||
15b4cbdb0f | |||
812eac18d3 | |||
16a4ee835c | |||
c013b92e62 | |||
b00a46b286 | |||
44b1127181 | |||
c7bfd48a21 | |||
dc13783db8 | |||
0a390ab342 | |||
d111740f64 | |||
28e97e8441 | |||
a30cdb37d6 | |||
f848162066 | |||
40c70aa98d | |||
0d2b36bac8 | |||
d7e5bcdaa5 | |||
fc783574a3 | |||
5f7bb784f0 | |||
26c55a318f | |||
ee68bc3d9e | |||
a3bc3968a5 | |||
79454da1a6 | |||
12a4c92ad9 | |||
167692d464 | |||
ae26e8155c | |||
286ea62a21 | |||
d95c74d8c9 | |||
c1555ddbc7 | |||
4fe0c586d9 | |||
aae6ea4fee | |||
385d018504 | |||
f4def082c1 | |||
69c9f1df83 | |||
e138dc0267 | |||
ca50b53f94 | |||
f705487055 | |||
b7c9453a1a | |||
1aa370d562 | |||
d3dab0d736 | |||
764156b267 | |||
665f5251bf | |||
7c328095d7 | |||
7884c91d52 | |||
e9a19e0821 | |||
022847fc4b | |||
1ee673be58 | |||
3c2aa99e86 | |||
11fac3f060 | |||
3e57e524b9 | |||
f582ec03c5 | |||
893be136f0 | |||
b74ba30281 | |||
ba9dab1f73 | |||
8e60fdb477 | |||
443fe8dd47 | |||
e56e52ba4f | |||
cd008bed9b | |||
d4c90283d6 | |||
dc04ec955a | |||
72f511ce99 | |||
0d63c2bdb6 | |||
49e13384cf | |||
1ddc19ff69 | |||
a6d436e841 | |||
9b0b39ac2e | |||
638f0bd078 | |||
c27b838dad | |||
e0cb2949df | |||
59be582c28 | |||
f6cbb3792f | |||
a68918f830 | |||
1a7ded864e | |||
cbc8bc8879 | |||
21f79d1c13 | |||
293d7acf2d | |||
d876d3722a | |||
dffb7672ff |
16
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
16
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -7,7 +7,7 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
value: |
|
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.
|
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.github.io/plotsquared-documentation/).
|
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!
|
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!
|
||||||
|
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
@ -24,20 +24,14 @@ body:
|
|||||||
- type: dropdown
|
- type: dropdown
|
||||||
attributes:
|
attributes:
|
||||||
label: Server Version
|
label: Server Version
|
||||||
description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first.
|
description: Which server version are you using? If your server version is not listed, it is not supported. Update to a supported version first.
|
||||||
multiple: false
|
multiple: false
|
||||||
options:
|
options:
|
||||||
- '1.20.1'
|
- '1.21'
|
||||||
|
- '1.20.6'
|
||||||
|
- '1.20.4'
|
||||||
- '1.20'
|
- '1.20'
|
||||||
- '1.19.4'
|
- '1.19.4'
|
||||||
- '1.19.3'
|
|
||||||
- '1.19.2'
|
|
||||||
- '1.19.1'
|
|
||||||
- '1.19'
|
|
||||||
- '1.18.2'
|
|
||||||
- '1.18.1'
|
|
||||||
- '1.17.1'
|
|
||||||
- '1.16.5'
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
|
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
|
url: https://discord.gg/intellectualsites
|
||||||
about: Our support Discord, please ask questions and seek support here.
|
about: Our support Discord, please ask questions and seek support here.
|
||||||
- name: PlotSquared Wiki
|
- name: PlotSquared Wiki
|
||||||
url: https://intellectualsites.github.io/plotsquared-documentation/
|
url: https://intellectualsites.gitbook.io/plotsquared/
|
||||||
about: Take a look at the wiki page for instructions how to setup PlotSquared and use its commands.
|
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:
|
attributes:
|
||||||
value: |
|
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.
|
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.github.io/plotsquared-documentation/).
|
For anything else than a feature request, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.gitbook.io/plotsquared/).
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
|
7
.github/renovate.json
vendored
7
.github/renovate.json
vendored
@ -9,5 +9,10 @@
|
|||||||
"dependencies"
|
"dependencies"
|
||||||
],
|
],
|
||||||
"rebaseWhen": "conflicted",
|
"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"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
6
.github/workflows/build-pr.yml
vendored
6
.github/workflows/build-pr.yml
vendored
@ -9,11 +9,11 @@ jobs:
|
|||||||
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Validate Gradle Wrapper
|
- name: Validate Gradle Wrapper
|
||||||
uses: gradle/wrapper-validation-action@v1
|
uses: gradle/actions/wrapper-validation@v4
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
distribution: temurin
|
distribution: temurin
|
||||||
java-version: 17
|
java-version: 17
|
||||||
|
10
.github/workflows/build.yml
vendored
10
.github/workflows/build.yml
vendored
@ -9,11 +9,11 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Validate Gradle Wrapper
|
- name: Validate Gradle Wrapper
|
||||||
uses: gradle/wrapper-validation-action@v1
|
uses: gradle/actions/wrapper-validation@v4
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
distribution: temurin
|
distribution: temurin
|
||||||
java-version: 17
|
java-version: 17
|
||||||
@ -42,7 +42,7 @@ jobs:
|
|||||||
ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
|
ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
|
||||||
ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }}
|
ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }}
|
||||||
- name: Publish core javadoc
|
- name: Publish core javadoc
|
||||||
# if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
|
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
|
||||||
uses: cpina/github-action-push-to-another-repository@main
|
uses: cpina/github-action-push-to-another-repository@main
|
||||||
env:
|
env:
|
||||||
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
||||||
@ -54,7 +54,7 @@ jobs:
|
|||||||
target-branch: main
|
target-branch: main
|
||||||
target-directory: v7/core
|
target-directory: v7/core
|
||||||
- name: Publish bukkit javadoc
|
- name: Publish bukkit javadoc
|
||||||
# if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
|
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
|
||||||
uses: cpina/github-action-push-to-another-repository@main
|
uses: cpina/github-action-push-to-another-repository@main
|
||||||
env:
|
env:
|
||||||
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
||||||
|
10
.github/workflows/codeql.yml
vendored
10
.github/workflows/codeql.yml
vendored
@ -20,17 +20,17 @@ jobs:
|
|||||||
language: [ 'java' ]
|
language: [ 'java' ]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
distribution: temurin
|
distribution: temurin
|
||||||
java-version: 17
|
java-version: 17
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v2
|
uses: github/codeql-action/init@v3
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v2
|
uses: github/codeql-action/autobuild@v3
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v2
|
uses: github/codeql-action/analyze@v3
|
||||||
|
23
.github/workflows/label-merge-conflicts.yaml
vendored
Normal file
23
.github/workflows/label-merge-conflicts.yaml
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
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@v3.0.2
|
||||||
|
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
|
2
.github/workflows/release-drafter.yml
vendored
2
.github/workflows/release-drafter.yml
vendored
@ -12,6 +12,6 @@ jobs:
|
|||||||
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
|
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: release-drafter/release-drafter@v5
|
- uses: release-drafter/release-drafter@v6
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
5
.gitignore
vendored
5
.gitignore
vendored
@ -138,6 +138,5 @@ build/
|
|||||||
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
# Ignore run folders
|
# Ignore run folders
|
||||||
run-[0-0].[0-9]/
|
run-[0-9].[0-9][0-9]/
|
||||||
run-[0-0].[0-9].[0-9]/
|
run-[0-9].[0-9][0-9].[0-9]/
|
||||||
|
|
||||||
|
@ -21,20 +21,20 @@ dependencies {
|
|||||||
api(projects.plotsquaredCore)
|
api(projects.plotsquaredCore)
|
||||||
|
|
||||||
// Metrics
|
// Metrics
|
||||||
implementation("org.bstats:bstats-bukkit")
|
implementation(libs.bstatsBukkit)
|
||||||
|
|
||||||
// Paper
|
// Paper
|
||||||
compileOnly("io.papermc.paper:paper-api")
|
compileOnly(libs.paper)
|
||||||
implementation("io.papermc:paperlib")
|
implementation(libs.paperlib)
|
||||||
|
|
||||||
// Plugins
|
// Plugins
|
||||||
compileOnly(libs.worldeditBukkit) {
|
compileOnly(libs.worldeditBukkit) {
|
||||||
exclude(group = "org.bukkit")
|
exclude(group = "org.bukkit")
|
||||||
exclude(group = "org.spigotmc")
|
exclude(group = "org.spigotmc")
|
||||||
}
|
}
|
||||||
compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false }
|
compileOnly(libs.faweBukkit) { isTransitive = false }
|
||||||
testImplementation("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false }
|
testImplementation(libs.faweBukkit) { isTransitive = false }
|
||||||
compileOnly("com.github.MilkBowl:VaultAPI") {
|
compileOnly(libs.vault) {
|
||||||
exclude(group = "org.bukkit")
|
exclude(group = "org.bukkit")
|
||||||
}
|
}
|
||||||
compileOnly(libs.placeholderapi)
|
compileOnly(libs.placeholderapi)
|
||||||
@ -44,15 +44,15 @@ dependencies {
|
|||||||
|
|
||||||
// Other libraries
|
// Other libraries
|
||||||
implementation(libs.squirrelid) { isTransitive = false }
|
implementation(libs.squirrelid) { isTransitive = false }
|
||||||
implementation("dev.notmyfault.serverlib:ServerLib")
|
implementation(libs.serverlib)
|
||||||
|
|
||||||
// Our libraries
|
// Our libraries
|
||||||
implementation(libs.arkitektonika)
|
implementation(libs.arkitektonika)
|
||||||
implementation("com.intellectualsites.paster:Paster")
|
implementation(libs.paster)
|
||||||
implementation("com.intellectualsites.informative-annotations:informative-annotations")
|
implementation(libs.informativeAnnotations)
|
||||||
|
|
||||||
// Adventure
|
// Adventure
|
||||||
implementation("net.kyori:adventure-platform-bukkit")
|
implementation(libs.adventureBukkit)
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.processResources {
|
tasks.processResources {
|
||||||
@ -67,6 +67,7 @@ tasks.named<ShadowJar>("shadowJar") {
|
|||||||
exclude(dependency("org.checkerframework:"))
|
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.adventure", "com.plotsquared.core.configuration.adventure")
|
||||||
relocate("net.kyori.examination", "com.plotsquared.core.configuration.examination")
|
relocate("net.kyori.examination", "com.plotsquared.core.configuration.examination")
|
||||||
relocate("io.papermc.lib", "com.plotsquared.bukkit.paperlib")
|
relocate("io.papermc.lib", "com.plotsquared.bukkit.paperlib")
|
||||||
@ -100,17 +101,18 @@ tasks {
|
|||||||
withType<Javadoc> {
|
withType<Javadoc> {
|
||||||
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
|
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
|
||||||
val opt = options as StandardJavadocDocletOptions
|
val opt = options as StandardJavadocDocletOptions
|
||||||
opt.links("https://jd.papermc.io/paper/1.19/")
|
opt.links("https://jd.papermc.io/paper/1.20/")
|
||||||
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
|
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
|
||||||
opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/")
|
opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/")
|
||||||
opt.links("https://jd.advntr.dev/api/4.14.0/")
|
opt.links("https://jd.advntr.dev/api/4.14.0/")
|
||||||
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
|
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
|
||||||
opt.links("https://checkerframework.org/api/")
|
// opt.links("https://checkerframework.org/api/")
|
||||||
opt.isLinkSource = true
|
opt.isLinkSource = true
|
||||||
opt.bottom(File("$rootDir/javadocfooter.html").readText())
|
opt.bottom(File("$rootDir/javadocfooter.html").readText())
|
||||||
opt.isUse = true
|
opt.isUse = true
|
||||||
opt.encoding("UTF-8")
|
opt.encoding("UTF-8")
|
||||||
opt.keyWords()
|
opt.keyWords()
|
||||||
opt.addStringOption("-since", isRelease)
|
opt.addStringOption("-since", isRelease)
|
||||||
|
opt.noTimestamp()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,6 @@ import com.google.inject.Injector;
|
|||||||
import com.google.inject.Key;
|
import com.google.inject.Key;
|
||||||
import com.google.inject.Singleton;
|
import com.google.inject.Singleton;
|
||||||
import com.google.inject.Stage;
|
import com.google.inject.Stage;
|
||||||
import com.google.inject.TypeLiteral;
|
|
||||||
import com.plotsquared.bukkit.generator.BukkitPlotGenerator;
|
import com.plotsquared.bukkit.generator.BukkitPlotGenerator;
|
||||||
import com.plotsquared.bukkit.inject.BackupModule;
|
import com.plotsquared.bukkit.inject.BackupModule;
|
||||||
import com.plotsquared.bukkit.inject.BukkitModule;
|
import com.plotsquared.bukkit.inject.BukkitModule;
|
||||||
@ -35,8 +34,10 @@ import com.plotsquared.bukkit.listener.BlockEventListener117;
|
|||||||
import com.plotsquared.bukkit.listener.ChunkListener;
|
import com.plotsquared.bukkit.listener.ChunkListener;
|
||||||
import com.plotsquared.bukkit.listener.EntityEventListener;
|
import com.plotsquared.bukkit.listener.EntityEventListener;
|
||||||
import com.plotsquared.bukkit.listener.EntitySpawnListener;
|
import com.plotsquared.bukkit.listener.EntitySpawnListener;
|
||||||
|
import com.plotsquared.bukkit.listener.HighFreqBlockEventListener;
|
||||||
import com.plotsquared.bukkit.listener.PaperListener;
|
import com.plotsquared.bukkit.listener.PaperListener;
|
||||||
import com.plotsquared.bukkit.listener.PlayerEventListener;
|
import com.plotsquared.bukkit.listener.PlayerEventListener;
|
||||||
|
import com.plotsquared.bukkit.listener.PlayerEventListener1201;
|
||||||
import com.plotsquared.bukkit.listener.ProjectileEventListener;
|
import com.plotsquared.bukkit.listener.ProjectileEventListener;
|
||||||
import com.plotsquared.bukkit.listener.ServerListener;
|
import com.plotsquared.bukkit.listener.ServerListener;
|
||||||
import com.plotsquared.bukkit.listener.SingleWorldListener;
|
import com.plotsquared.bukkit.listener.SingleWorldListener;
|
||||||
@ -44,12 +45,12 @@ import com.plotsquared.bukkit.listener.SpigotListener;
|
|||||||
import com.plotsquared.bukkit.listener.WorldEvents;
|
import com.plotsquared.bukkit.listener.WorldEvents;
|
||||||
import com.plotsquared.bukkit.placeholder.PAPIPlaceholders;
|
import com.plotsquared.bukkit.placeholder.PAPIPlaceholders;
|
||||||
import com.plotsquared.bukkit.placeholder.PlaceholderFormatter;
|
import com.plotsquared.bukkit.placeholder.PlaceholderFormatter;
|
||||||
import com.plotsquared.bukkit.player.BukkitPlayer;
|
|
||||||
import com.plotsquared.bukkit.player.BukkitPlayerManager;
|
import com.plotsquared.bukkit.player.BukkitPlayerManager;
|
||||||
import com.plotsquared.bukkit.util.BukkitUtil;
|
import com.plotsquared.bukkit.util.BukkitUtil;
|
||||||
import com.plotsquared.bukkit.util.BukkitWorld;
|
import com.plotsquared.bukkit.util.BukkitWorld;
|
||||||
import com.plotsquared.bukkit.util.SetGenCB;
|
import com.plotsquared.bukkit.util.SetGenCB;
|
||||||
import com.plotsquared.bukkit.util.TranslationUpdateManager;
|
import com.plotsquared.bukkit.util.TranslationUpdateManager;
|
||||||
|
import com.plotsquared.bukkit.util.UpdateUtility;
|
||||||
import com.plotsquared.bukkit.util.task.BukkitTaskManager;
|
import com.plotsquared.bukkit.util.task.BukkitTaskManager;
|
||||||
import com.plotsquared.bukkit.util.task.PaperTimeConverter;
|
import com.plotsquared.bukkit.util.task.PaperTimeConverter;
|
||||||
import com.plotsquared.bukkit.util.task.SpigotTimeConverter;
|
import com.plotsquared.bukkit.util.task.SpigotTimeConverter;
|
||||||
@ -134,6 +135,7 @@ import org.bukkit.generator.ChunkGenerator;
|
|||||||
import org.bukkit.metadata.FixedMetadataValue;
|
import org.bukkit.metadata.FixedMetadataValue;
|
||||||
import org.bukkit.metadata.MetadataValue;
|
import org.bukkit.metadata.MetadataValue;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
|
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
@ -251,6 +253,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation") // Paper deprecation
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
this.pluginName = getDescription().getName();
|
this.pluginName = getDescription().getName();
|
||||||
|
|
||||||
@ -302,11 +305,9 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
|
|
||||||
this.serverLocale = Locale.forLanguageTag(Settings.Enabled_Components.DEFAULT_LOCALE);
|
this.serverLocale = Locale.forLanguageTag(Settings.Enabled_Components.DEFAULT_LOCALE);
|
||||||
|
|
||||||
/* TODO Enable update checker before v7 is released to GA
|
|
||||||
if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) {
|
if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) {
|
||||||
injector.getInstance(UpdateUtility.class).updateChecker();
|
injector.getInstance(UpdateUtility.class).updateChecker();
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
if (PremiumVerification.isPremium()) {
|
if (PremiumVerification.isPremium()) {
|
||||||
LOGGER.info("PlotSquared version licensed to Spigot user {}", getUserID());
|
LOGGER.info("PlotSquared version licensed to Spigot user {}", getUserID());
|
||||||
@ -358,7 +359,13 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
|
|
||||||
if (Settings.Enabled_Components.EVENTS) {
|
if (Settings.Enabled_Components.EVENTS) {
|
||||||
getServer().getPluginManager().registerEvents(injector().getInstance(PlayerEventListener.class), this);
|
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);
|
getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener.class), this);
|
||||||
|
if (Settings.HIGH_FREQUENCY_LISTENER) {
|
||||||
|
getServer().getPluginManager().registerEvents(injector().getInstance(HighFreqBlockEventListener.class), this);
|
||||||
|
}
|
||||||
if (serverVersion()[1] >= 17) {
|
if (serverVersion()[1] >= 17) {
|
||||||
getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener117.class), this);
|
getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener117.class), this);
|
||||||
}
|
}
|
||||||
@ -551,7 +558,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
this.startMetrics();
|
this.startMetrics();
|
||||||
|
|
||||||
if (Settings.Enabled_Components.WORLDS) {
|
if (Settings.Enabled_Components.WORLDS) {
|
||||||
TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(1L));
|
TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(10L));
|
||||||
try {
|
try {
|
||||||
singleWorldListener = injector().getInstance(SingleWorldListener.class);
|
singleWorldListener = injector().getInstance(SingleWorldListener.class);
|
||||||
Bukkit.getPluginManager().registerEvents(singleWorldListener, this);
|
Bukkit.getPluginManager().registerEvents(singleWorldListener, this);
|
||||||
@ -774,6 +781,14 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
Iterator<Entity> iterator = entities.iterator();
|
Iterator<Entity> iterator = entities.iterator();
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
Entity entity = iterator.next();
|
Entity entity = iterator.next();
|
||||||
|
//noinspection ConstantValue - getEntitySpawnReason annotated as NotNull, but is not NotNull. lol.
|
||||||
|
if (PaperLib.isPaper() && entity.getEntitySpawnReason() != null && "CUSTOM".equals(entity.getEntitySpawnReason().name())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Fallback for Spigot not having Entity#getEntitySpawnReason
|
||||||
|
if (entity.getMetadata("ps_custom_spawned").stream().anyMatch(MetadataValue::asBoolean)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
switch (entity.getType().toString()) {
|
switch (entity.getType().toString()) {
|
||||||
case "EGG":
|
case "EGG":
|
||||||
case "FISHING_HOOK":
|
case "FISHING_HOOK":
|
||||||
@ -807,12 +822,19 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
// Temporarily classify as vehicle
|
// Temporarily classify as vehicle
|
||||||
case "MINECART":
|
case "MINECART":
|
||||||
case "MINECART_CHEST":
|
case "MINECART_CHEST":
|
||||||
|
case "CHEST_MINECART":
|
||||||
case "MINECART_COMMAND":
|
case "MINECART_COMMAND":
|
||||||
|
case "COMMAND_BLOCK_MINECART":
|
||||||
case "MINECART_FURNACE":
|
case "MINECART_FURNACE":
|
||||||
|
case "FURNACE_MINECART":
|
||||||
case "MINECART_HOPPER":
|
case "MINECART_HOPPER":
|
||||||
|
case "HOPPER_MINECART":
|
||||||
case "MINECART_MOB_SPAWNER":
|
case "MINECART_MOB_SPAWNER":
|
||||||
|
case "SPAWNER_MINECART":
|
||||||
case "ENDER_CRYSTAL":
|
case "ENDER_CRYSTAL":
|
||||||
case "MINECART_TNT":
|
case "MINECART_TNT":
|
||||||
|
case "TNT_MINECART":
|
||||||
|
case "CHEST_BOAT":
|
||||||
case "BOAT":
|
case "BOAT":
|
||||||
if (Settings.Enabled_Components.KILL_ROAD_VEHICLES) {
|
if (Settings.Enabled_Components.KILL_ROAD_VEHICLES) {
|
||||||
com.plotsquared.core.location.Location location = BukkitUtil.adapt(entity.getLocation());
|
com.plotsquared.core.location.Location location = BukkitUtil.adapt(entity.getLocation());
|
||||||
@ -861,8 +883,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
if (livingEntity.isLeashed() && !Settings.Enabled_Components.KILL_OWNED_ROAD_MOBS) {
|
if (livingEntity.isLeashed() && !Settings.Enabled_Components.KILL_OWNED_ROAD_MOBS) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
List<MetadataValue> keep = entity.getMetadata("keep");
|
if (entity.hasMetadata("keep")) {
|
||||||
if (!keep.isEmpty()) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1161,6 +1182,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
return new BukkitPlotGenerator(world, generator, this.plotAreaManager);
|
return new BukkitPlotGenerator(world, generator, this.plotAreaManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // Paper deprecation
|
||||||
@Override
|
@Override
|
||||||
public @NonNull String pluginsFormatted() {
|
public @NonNull String pluginsFormatted() {
|
||||||
StringBuilder msg = new StringBuilder();
|
StringBuilder msg = new StringBuilder();
|
||||||
@ -1177,12 +1199,23 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
.append(" • Load Before: ").append(p.getDescription().getLoadBefore()).append("\n")
|
.append(" • Load Before: ").append(p.getDescription().getLoadBefore()).append("\n")
|
||||||
.append(" • Dependencies: ").append(p.getDescription().getDepend()).append("\n")
|
.append(" • Dependencies: ").append(p.getDescription().getDepend()).append("\n")
|
||||||
.append(" • Soft Dependencies: ").append(p.getDescription().getSoftDepend()).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();
|
return msg.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("ConstantConditions")
|
@SuppressWarnings({"ConstantConditions", "deprecation"}) // Paper deprecation
|
||||||
public @NonNull String worldEditImplementations() {
|
public @NonNull String worldEditImplementations() {
|
||||||
StringBuilder msg = new StringBuilder();
|
StringBuilder msg = new StringBuilder();
|
||||||
if (Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit") != null) {
|
if (Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit") != null) {
|
||||||
@ -1246,15 +1279,13 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NonNull PlatformWorldManager<?> worldManager() {
|
public @NonNull PlatformWorldManager<?> worldManager() {
|
||||||
return injector().getInstance(Key.get(new TypeLiteral<PlatformWorldManager<World>>() {
|
return this.worldManager;
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NonNull
|
@NonNull
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public PlayerManager<? extends PlotPlayer<Player>, ? extends Player> playerManager() {
|
public PlayerManager<? extends PlotPlayer<Player>, ? extends Player> playerManager() {
|
||||||
return (PlayerManager<BukkitPlayer, Player>) injector().getInstance(PlayerManager.class);
|
return this.playerManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -33,6 +33,7 @@ import org.bukkit.entity.Ageable;
|
|||||||
import org.bukkit.entity.ArmorStand;
|
import org.bukkit.entity.ArmorStand;
|
||||||
import org.bukkit.entity.Bat;
|
import org.bukkit.entity.Bat;
|
||||||
import org.bukkit.entity.Boat;
|
import org.bukkit.entity.Boat;
|
||||||
|
import org.bukkit.entity.Breedable;
|
||||||
import org.bukkit.entity.ChestedHorse;
|
import org.bukkit.entity.ChestedHorse;
|
||||||
import org.bukkit.entity.EnderDragon;
|
import org.bukkit.entity.EnderDragon;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
@ -74,6 +75,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
private HorseStats horse;
|
private HorseStats horse;
|
||||||
private boolean noGravity;
|
private boolean noGravity;
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // Deprecation exists since 1.20, while we support 1.16 onwards
|
||||||
public ReplicatingEntityWrapper(Entity entity, short depth) {
|
public ReplicatingEntityWrapper(Entity entity, short depth) {
|
||||||
super(entity);
|
super(entity);
|
||||||
|
|
||||||
@ -164,7 +166,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
//this.horse.style = horse.getStyle();
|
//this.horse.style = horse.getStyle();
|
||||||
//this.horse.color = horse.getColor();
|
//this.horse.color = horse.getColor();
|
||||||
storeTameable(horse);
|
storeTameable(horse);
|
||||||
storeAgeable(horse);
|
storeBreedable(horse);
|
||||||
storeLiving(horse);
|
storeLiving(horse);
|
||||||
storeInventory(horse);
|
storeInventory(horse);
|
||||||
return;
|
return;
|
||||||
@ -172,7 +174,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
// END INVENTORY HOLDER //
|
// END INVENTORY HOLDER //
|
||||||
case "WOLF", "OCELOT" -> {
|
case "WOLF", "OCELOT" -> {
|
||||||
storeTameable((Tameable) entity);
|
storeTameable((Tameable) entity);
|
||||||
storeAgeable((Ageable) entity);
|
storeBreedable((Breedable) entity);
|
||||||
storeLiving((LivingEntity) entity);
|
storeLiving((LivingEntity) entity);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -186,18 +188,18 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
this.dataByte = (byte) 0;
|
this.dataByte = (byte) 0;
|
||||||
}
|
}
|
||||||
this.dataByte2 = sheep.getColor().getDyeData();
|
this.dataByte2 = sheep.getColor().getDyeData();
|
||||||
storeAgeable(sheep);
|
storeBreedable(sheep);
|
||||||
storeLiving(sheep);
|
storeLiving(sheep);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case "VILLAGER", "CHICKEN", "COW", "MUSHROOM_COW", "PIG", "TURTLE", "POLAR_BEAR" -> {
|
case "VILLAGER", "CHICKEN", "COW", "MUSHROOM_COW", "PIG", "TURTLE", "POLAR_BEAR" -> {
|
||||||
storeAgeable((Ageable) entity);
|
storeBreedable((Breedable) entity);
|
||||||
storeLiving((LivingEntity) entity);
|
storeLiving((LivingEntity) entity);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case "RABBIT" -> {
|
case "RABBIT" -> {
|
||||||
this.dataByte = getOrdinal(Rabbit.Type.values(), ((Rabbit) entity).getRabbitType());
|
this.dataByte = getOrdinal(Rabbit.Type.values(), ((Rabbit) entity).getRabbitType());
|
||||||
storeAgeable((Ageable) entity);
|
storeBreedable((Breedable) entity);
|
||||||
storeLiving((LivingEntity) entity);
|
storeLiving((LivingEntity) entity);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -381,6 +383,11 @@ 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) {
|
private void restoreAgeable(Ageable entity) {
|
||||||
if (!this.aged.adult) {
|
if (!this.aged.adult) {
|
||||||
entity.setBaby();
|
entity.setBaby();
|
||||||
@ -391,6 +398,11 @@ 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) {
|
public void storeAgeable(Ageable aged) {
|
||||||
this.aged = new AgeableStats();
|
this.aged = new AgeableStats();
|
||||||
this.aged.age = aged.getAge();
|
this.aged.age = aged.getAge();
|
||||||
@ -398,6 +410,29 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
this.aged.adult = aged.isAdult();
|
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) {
|
public void storeTameable(Tameable tamed) {
|
||||||
this.tamed = new TameableStats();
|
this.tamed = new TameableStats();
|
||||||
this.tamed.owner = tamed.getOwner();
|
this.tamed.owner = tamed.getOwner();
|
||||||
@ -501,7 +536,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
//horse.setStyle(this.horse.style);
|
//horse.setStyle(this.horse.style);
|
||||||
//horse.setColor(this.horse.color);
|
//horse.setColor(this.horse.color);
|
||||||
restoreTameable(horse);
|
restoreTameable(horse);
|
||||||
restoreAgeable(horse);
|
restoreBreedable(horse);
|
||||||
restoreLiving(horse);
|
restoreLiving(horse);
|
||||||
restoreInventory(horse);
|
restoreInventory(horse);
|
||||||
return entity;
|
return entity;
|
||||||
@ -509,7 +544,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
// END INVENTORY HOLDER //
|
// END INVENTORY HOLDER //
|
||||||
case "WOLF", "OCELOT" -> {
|
case "WOLF", "OCELOT" -> {
|
||||||
restoreTameable((Tameable) entity);
|
restoreTameable((Tameable) entity);
|
||||||
restoreAgeable((Ageable) entity);
|
restoreBreedable((Breedable) entity);
|
||||||
restoreLiving((LivingEntity) entity);
|
restoreLiving((LivingEntity) entity);
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
@ -522,12 +557,12 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
if (this.dataByte2 != 0) {
|
if (this.dataByte2 != 0) {
|
||||||
sheep.setColor(DyeColor.getByDyeData(this.dataByte2));
|
sheep.setColor(DyeColor.getByDyeData(this.dataByte2));
|
||||||
}
|
}
|
||||||
restoreAgeable(sheep);
|
restoreBreedable(sheep);
|
||||||
restoreLiving(sheep);
|
restoreLiving(sheep);
|
||||||
return sheep;
|
return sheep;
|
||||||
}
|
}
|
||||||
case "VILLAGER", "CHICKEN", "COW", "TURTLE", "POLAR_BEAR", "MUSHROOM_COW", "PIG" -> {
|
case "VILLAGER", "CHICKEN", "COW", "TURTLE", "POLAR_BEAR", "MUSHROOM_COW", "PIG" -> {
|
||||||
restoreAgeable((Ageable) entity);
|
restoreBreedable((Breedable) entity);
|
||||||
restoreLiving((LivingEntity) entity);
|
restoreLiving((LivingEntity) entity);
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
@ -536,7 +571,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
if (this.dataByte != 0) {
|
if (this.dataByte != 0) {
|
||||||
((Rabbit) entity).setRabbitType(Rabbit.Type.values()[this.dataByte]);
|
((Rabbit) entity).setRabbitType(Rabbit.Type.values()[this.dataByte]);
|
||||||
}
|
}
|
||||||
restoreAgeable((Ageable) entity);
|
restoreBreedable((Breedable) entity);
|
||||||
restoreLiving((LivingEntity) entity);
|
restoreLiving((LivingEntity) entity);
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
@ -23,13 +23,13 @@ import com.google.inject.Provides;
|
|||||||
import com.google.inject.Singleton;
|
import com.google.inject.Singleton;
|
||||||
import com.google.inject.assistedinject.FactoryModuleBuilder;
|
import com.google.inject.assistedinject.FactoryModuleBuilder;
|
||||||
import com.plotsquared.bukkit.BukkitPlatform;
|
import com.plotsquared.bukkit.BukkitPlatform;
|
||||||
|
import com.plotsquared.bukkit.listener.ServerListener;
|
||||||
import com.plotsquared.bukkit.listener.SingleWorldListener;
|
import com.plotsquared.bukkit.listener.SingleWorldListener;
|
||||||
import com.plotsquared.bukkit.player.BukkitPlayerManager;
|
import com.plotsquared.bukkit.player.BukkitPlayerManager;
|
||||||
import com.plotsquared.bukkit.queue.BukkitChunkCoordinator;
|
import com.plotsquared.bukkit.queue.BukkitChunkCoordinator;
|
||||||
import com.plotsquared.bukkit.queue.BukkitQueueCoordinator;
|
import com.plotsquared.bukkit.queue.BukkitQueueCoordinator;
|
||||||
import com.plotsquared.bukkit.schematic.BukkitSchematicHandler;
|
import com.plotsquared.bukkit.schematic.BukkitSchematicHandler;
|
||||||
import com.plotsquared.bukkit.util.BukkitChunkManager;
|
import com.plotsquared.bukkit.util.BukkitChunkManager;
|
||||||
import com.plotsquared.bukkit.util.BukkitEconHandler;
|
|
||||||
import com.plotsquared.bukkit.util.BukkitInventoryUtil;
|
import com.plotsquared.bukkit.util.BukkitInventoryUtil;
|
||||||
import com.plotsquared.bukkit.util.BukkitRegionManager;
|
import com.plotsquared.bukkit.util.BukkitRegionManager;
|
||||||
import com.plotsquared.bukkit.util.BukkitSetupUtils;
|
import com.plotsquared.bukkit.util.BukkitSetupUtils;
|
||||||
@ -47,6 +47,9 @@ import com.plotsquared.core.inject.factory.ChunkCoordinatorBuilderFactory;
|
|||||||
import com.plotsquared.core.inject.factory.ChunkCoordinatorFactory;
|
import com.plotsquared.core.inject.factory.ChunkCoordinatorFactory;
|
||||||
import com.plotsquared.core.inject.factory.HybridPlotWorldFactory;
|
import com.plotsquared.core.inject.factory.HybridPlotWorldFactory;
|
||||||
import com.plotsquared.core.inject.factory.ProgressSubscriberFactory;
|
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.DefaultPlotAreaManager;
|
||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||||
import com.plotsquared.core.plot.world.SinglePlotAreaManager;
|
import com.plotsquared.core.plot.world.SinglePlotAreaManager;
|
||||||
@ -72,6 +75,8 @@ import org.bukkit.command.ConsoleCommandSender;
|
|||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
public class BukkitModule extends AbstractModule {
|
public class BukkitModule extends AbstractModule {
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitModule.class.getSimpleName());
|
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitModule.class.getSimpleName());
|
||||||
@ -128,21 +133,64 @@ public class BukkitModule extends AbstractModule {
|
|||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
@NonNull EconHandler provideEconHandler() {
|
@NonNull EconHandler provideEconHandler() {
|
||||||
if (!Settings.Enabled_Components.ECONOMY) {
|
if (!Settings.Enabled_Components.ECONOMY || !Bukkit.getPluginManager().isPluginEnabled("Vault")) {
|
||||||
return EconHandler.nullEconHandler();
|
return EconHandler.nullEconHandler();
|
||||||
}
|
}
|
||||||
if (Bukkit.getPluginManager().isPluginEnabled("Vault")) {
|
// Guice eagerly initializes singletons, so we need to bring the laziness ourselves
|
||||||
try {
|
return new LazyEconHandler();
|
||||||
BukkitEconHandler econHandler = new BukkitEconHandler();
|
}
|
||||||
if (!econHandler.init()) {
|
|
||||||
LOGGER.warn("Economy is enabled but no plugin is providing an economy service. Falling back...");
|
private static final class LazyEconHandler extends EconHandler implements ServerListener.MutableEconHandler {
|
||||||
return EconHandler.nullEconHandler();
|
private volatile EconHandler implementation;
|
||||||
}
|
|
||||||
return econHandler;
|
public void setImplementation(EconHandler econHandler) {
|
||||||
} catch (final Exception ignored) {
|
this.implementation = econHandler;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return EconHandler.nullEconHandler();
|
|
||||||
|
@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.");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,6 @@ import com.plotsquared.bukkit.util.BukkitUtil;
|
|||||||
import com.plotsquared.core.PlotSquared;
|
import com.plotsquared.core.PlotSquared;
|
||||||
import com.plotsquared.core.configuration.Settings;
|
import com.plotsquared.core.configuration.Settings;
|
||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
import com.plotsquared.core.database.DBFunc;
|
|
||||||
import com.plotsquared.core.location.Location;
|
import com.plotsquared.core.location.Location;
|
||||||
import com.plotsquared.core.permissions.Permission;
|
import com.plotsquared.core.permissions.Permission;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
@ -33,6 +32,7 @@ import com.plotsquared.core.plot.PlotArea;
|
|||||||
import com.plotsquared.core.plot.flag.implementations.BlockBurnFlag;
|
import com.plotsquared.core.plot.flag.implementations.BlockBurnFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag;
|
import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.BreakFlag;
|
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.CoralDryFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.CropGrowFlag;
|
import com.plotsquared.core.plot.flag.implementations.CropGrowFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
|
import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
|
||||||
@ -47,7 +47,6 @@ import com.plotsquared.core.plot.flag.implementations.LeafDecayFlag;
|
|||||||
import com.plotsquared.core.plot.flag.implementations.LiquidFlowFlag;
|
import com.plotsquared.core.plot.flag.implementations.LiquidFlowFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.MycelGrowFlag;
|
import com.plotsquared.core.plot.flag.implementations.MycelGrowFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.PlaceFlag;
|
import com.plotsquared.core.plot.flag.implementations.PlaceFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.RedstoneFlag;
|
|
||||||
import com.plotsquared.core.plot.flag.implementations.SnowFormFlag;
|
import com.plotsquared.core.plot.flag.implementations.SnowFormFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.SnowMeltFlag;
|
import com.plotsquared.core.plot.flag.implementations.SnowMeltFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.SoilDryFlag;
|
import com.plotsquared.core.plot.flag.implementations.SoilDryFlag;
|
||||||
@ -61,7 +60,6 @@ import com.plotsquared.core.util.task.TaskTime;
|
|||||||
import com.sk89q.worldedit.WorldEdit;
|
import com.sk89q.worldedit.WorldEdit;
|
||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||||
import com.sk89q.worldedit.world.block.BlockType;
|
import com.sk89q.worldedit.world.block.BlockType;
|
||||||
import net.kyori.adventure.text.Component;
|
|
||||||
import net.kyori.adventure.text.minimessage.tag.Tag;
|
import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@ -91,11 +89,9 @@ import org.bukkit.event.block.BlockFromToEvent;
|
|||||||
import org.bukkit.event.block.BlockGrowEvent;
|
import org.bukkit.event.block.BlockGrowEvent;
|
||||||
import org.bukkit.event.block.BlockIgniteEvent;
|
import org.bukkit.event.block.BlockIgniteEvent;
|
||||||
import org.bukkit.event.block.BlockMultiPlaceEvent;
|
import org.bukkit.event.block.BlockMultiPlaceEvent;
|
||||||
import org.bukkit.event.block.BlockPhysicsEvent;
|
|
||||||
import org.bukkit.event.block.BlockPistonExtendEvent;
|
import org.bukkit.event.block.BlockPistonExtendEvent;
|
||||||
import org.bukkit.event.block.BlockPistonRetractEvent;
|
import org.bukkit.event.block.BlockPistonRetractEvent;
|
||||||
import org.bukkit.event.block.BlockPlaceEvent;
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
import org.bukkit.event.block.BlockRedstoneEvent;
|
|
||||||
import org.bukkit.event.block.BlockSpreadEvent;
|
import org.bukkit.event.block.BlockSpreadEvent;
|
||||||
import org.bukkit.event.block.CauldronLevelChangeEvent;
|
import org.bukkit.event.block.CauldronLevelChangeEvent;
|
||||||
import org.bukkit.event.block.EntityBlockFormEvent;
|
import org.bukkit.event.block.EntityBlockFormEvent;
|
||||||
@ -111,7 +107,6 @@ import java.util.Iterator;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
@ -122,14 +117,6 @@ import static org.bukkit.Tag.WALL_CORALS;
|
|||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public class BlockEventListener implements Listener {
|
public class BlockEventListener implements Listener {
|
||||||
|
|
||||||
private static final Set<Material> PISTONS = Set.of(
|
|
||||||
Material.PISTON,
|
|
||||||
Material.STICKY_PISTON
|
|
||||||
);
|
|
||||||
private static final Set<Material> PHYSICS_BLOCKS = Set.of(
|
|
||||||
Material.TURTLE_EGG,
|
|
||||||
Material.TURTLE_SPAWN_EGG
|
|
||||||
);
|
|
||||||
private static final Set<Material> SNOW = Stream.of(Material.values()) // needed as Tag.SNOW isn't present in 1.16.5
|
private static final Set<Material> SNOW = Stream.of(Material.values()) // needed as Tag.SNOW isn't present in 1.16.5
|
||||||
.filter(material -> material.name().contains("SNOW"))
|
.filter(material -> material.name().contains("SNOW"))
|
||||||
.filter(Material::isBlock)
|
.filter(Material::isBlock)
|
||||||
@ -163,111 +150,6 @@ public class BlockEventListener implements Listener {
|
|||||||
}, TaskTime.ticks(3L));
|
}, TaskTime.ticks(3L));
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onRedstoneEvent(BlockRedstoneEvent event) {
|
|
||||||
Block block = event.getBlock();
|
|
||||||
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, RedstoneFlag.class, false)) {
|
|
||||||
event.setNewCurrent(0);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!plot.getFlag(RedstoneFlag.class)) {
|
|
||||||
event.setNewCurrent(0);
|
|
||||||
plot.debug("Redstone event was cancelled because redstone = false");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (Settings.Redstone.DISABLE_OFFLINE) {
|
|
||||||
boolean disable = false;
|
|
||||||
if (!DBFunc.SERVER.equals(plot.getOwner())) {
|
|
||||||
if (plot.isMerged()) {
|
|
||||||
disable = true;
|
|
||||||
for (UUID owner : plot.getOwners()) {
|
|
||||||
if (PlotSquared.platform().playerManager().getPlayerIfExists(owner) != null) {
|
|
||||||
disable = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
disable = PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwnerAbs()) == null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (disable) {
|
|
||||||
for (UUID trusted : plot.getTrusted()) {
|
|
||||||
if (PlotSquared.platform().playerManager().getPlayerIfExists(trusted) != null) {
|
|
||||||
disable = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (disable) {
|
|
||||||
event.setNewCurrent(0);
|
|
||||||
plot.debug("Redstone event was cancelled because no trusted player was in the plot");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Settings.Redstone.DISABLE_UNOCCUPIED) {
|
|
||||||
for (final PlotPlayer<?> player : PlotSquared.platform().playerManager().getPlayers()) {
|
|
||||||
if (plot.equals(player.getCurrentPlot())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
event.setNewCurrent(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
|
|
||||||
public void onPhysicsEvent(BlockPhysicsEvent event) {
|
|
||||||
Block block = event.getBlock();
|
|
||||||
Location location = BukkitUtil.adapt(block.getLocation());
|
|
||||||
PlotArea area = location.getPlotArea();
|
|
||||||
if (area == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Plot plot = area.getOwnedPlotAbs(location);
|
|
||||||
if (plot == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (event.getChangedType().hasGravity() && plot.getFlag(DisablePhysicsFlag.class)) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
sendBlockChange(event.getBlock().getLocation(), event.getBlock().getBlockData());
|
|
||||||
plot.debug("Prevented block physics and resent block change because disable-physics = true");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (event.getChangedType() == Material.COMPARATOR) {
|
|
||||||
if (!plot.getFlag(RedstoneFlag.class)) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
plot.debug("Prevented comparator update because redstone = false");
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (PHYSICS_BLOCKS.contains(event.getChangedType())) {
|
|
||||||
if (plot.getFlag(DisablePhysicsFlag.class)) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
plot.debug("Prevented block physics because disable-physics = true");
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (Settings.Redstone.DETECT_INVALID_EDGE_PISTONS) {
|
|
||||||
if (PISTONS.contains(block.getType())) {
|
|
||||||
org.bukkit.block.data.Directional piston = (org.bukkit.block.data.Directional) block.getBlockData();
|
|
||||||
final BlockFace facing = piston.getFacing();
|
|
||||||
location = location.add(facing.getModX(), facing.getModY(), facing.getModZ());
|
|
||||||
Plot newPlot = area.getOwnedPlotAbs(location);
|
|
||||||
if (!plot.equals(newPlot)) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
plot.debug("Prevented piston update because of invalid edge piston detection");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
public void blockCreate(BlockPlaceEvent event) {
|
public void blockCreate(BlockPlaceEvent event) {
|
||||||
Location location = BukkitUtil.adapt(event.getBlock().getLocation());
|
Location location = BukkitUtil.adapt(event.getBlock().getLocation());
|
||||||
@ -281,13 +163,6 @@ public class BlockEventListener implements Listener {
|
|||||||
if (plot != null) {
|
if (plot != null) {
|
||||||
if (area.notifyIfOutsideBuildArea(pp, location.getY())) {
|
if (area.notifyIfOutsideBuildArea(pp, location.getY())) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
pp.sendMessage(
|
|
||||||
TranslatableCaption.of("height.height_limit"),
|
|
||||||
TagResolver.builder()
|
|
||||||
.tag("minheight", Tag.inserting(Component.text(area.getMinBuildHeight())))
|
|
||||||
.tag("maxheight", Tag.inserting(Component.text(area.getMaxBuildHeight())))
|
|
||||||
.build()
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!plot.hasOwner()) {
|
if (!plot.hasOwner()) {
|
||||||
@ -379,13 +254,6 @@ public class BlockEventListener implements Listener {
|
|||||||
}
|
}
|
||||||
} else if (area.notifyIfOutsideBuildArea(plotPlayer, location.getY())) {
|
} else if (area.notifyIfOutsideBuildArea(plotPlayer, location.getY())) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
plotPlayer.sendMessage(
|
|
||||||
TranslatableCaption.of("height.height_limit"),
|
|
||||||
TagResolver.builder()
|
|
||||||
.tag("minheight", Tag.inserting(Component.text(area.getMinBuildHeight())))
|
|
||||||
.tag("maxheight", Tag.inserting(Component.text(area.getMaxBuildHeight())))
|
|
||||||
.build()
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!plot.hasOwner()) {
|
if (!plot.hasOwner()) {
|
||||||
@ -586,6 +454,12 @@ public class BlockEventListener implements Listener {
|
|||||||
event.setCancelled(true);
|
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)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
@ -660,7 +534,11 @@ public class BlockEventListener implements Listener {
|
|||||||
BlockBreakEvent call = new BlockBreakEvent(block, player);
|
BlockBreakEvent call = new BlockBreakEvent(block, player);
|
||||||
Bukkit.getServer().getPluginManager().callEvent(call);
|
Bukkit.getServer().getPluginManager().callEvent(call);
|
||||||
if (!call.isCancelled()) {
|
if (!call.isCancelled()) {
|
||||||
event.getBlock().breakNaturally();
|
if (Settings.Flags.INSTABREAK_CONSIDER_TOOL) {
|
||||||
|
block.breakNaturally(event.getItemInHand());
|
||||||
|
} else {
|
||||||
|
block.breakNaturally();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// == rather than <= as we only care about the "ground level" not being destroyed
|
// == rather than <= as we only care about the "ground level" not being destroyed
|
||||||
@ -1331,18 +1209,9 @@ public class BlockEventListener implements Listener {
|
|||||||
if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
|
if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (currentLocation.getY() >= area.getMaxBuildHeight() || currentLocation.getY() < area.getMinBuildHeight()) {
|
if (area.notifyIfOutsideBuildArea(pp, currentLocation.getY())) {
|
||||||
pp.sendMessage(
|
event.setCancelled(true);
|
||||||
TranslatableCaption.of("height.height_limit"),
|
break;
|
||||||
TagResolver.builder()
|
|
||||||
.tag("minheight", Tag.inserting(Component.text(area.getMinBuildHeight())))
|
|
||||||
.tag("maxheight", Tag.inserting(Component.text(area.getMaxBuildHeight())))
|
|
||||||
.build()
|
|
||||||
);
|
|
||||||
if (area.notifyIfOutsideBuildArea(pp, currentLocation.getY())) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ import com.plotsquared.core.plot.Plot;
|
|||||||
import com.plotsquared.core.plot.PlotArea;
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||||
import com.plotsquared.core.plot.world.SinglePlotArea;
|
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.RefClass;
|
||||||
import com.plotsquared.core.util.ReflectionUtils.RefField;
|
import com.plotsquared.core.util.ReflectionUtils.RefField;
|
||||||
import com.plotsquared.core.util.ReflectionUtils.RefMethod;
|
import com.plotsquared.core.util.ReflectionUtils.RefMethod;
|
||||||
@ -64,9 +65,11 @@ public class ChunkListener implements Listener {
|
|||||||
private final PlotAreaManager plotAreaManager;
|
private final PlotAreaManager plotAreaManager;
|
||||||
private final int version;
|
private final int version;
|
||||||
|
|
||||||
|
private RefMethod methodSetUnsaved;
|
||||||
private RefMethod methodGetHandleChunk;
|
private RefMethod methodGetHandleChunk;
|
||||||
private RefMethod methodGetHandleWorld;
|
private RefMethod methodGetHandleWorld;
|
||||||
private RefField mustSave;
|
private RefField mustNotSave;
|
||||||
|
private Object objChunkStatusFull = null;
|
||||||
/*
|
/*
|
||||||
private RefMethod methodGetFullChunk;
|
private RefMethod methodGetFullChunk;
|
||||||
private RefMethod methodGetBukkitChunk;
|
private RefMethod methodGetBukkitChunk;
|
||||||
@ -79,7 +82,6 @@ public class ChunkListener implements Listener {
|
|||||||
*/
|
*/
|
||||||
private Chunk lastChunk;
|
private Chunk lastChunk;
|
||||||
private boolean ignoreUnload = false;
|
private boolean ignoreUnload = false;
|
||||||
private boolean isTrueForNotSave = true;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public ChunkListener(final @NonNull PlotAreaManager plotAreaManager) {
|
public ChunkListener(final @NonNull PlotAreaManager plotAreaManager) {
|
||||||
@ -90,22 +92,27 @@ public class ChunkListener implements Listener {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
RefClass classCraftWorld = getRefClass("{cb}.CraftWorld");
|
RefClass classCraftWorld = getRefClass("{cb}.CraftWorld");
|
||||||
this.methodGetHandleWorld = classCraftWorld.getMethod("getHandle");
|
|
||||||
RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
|
RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
|
||||||
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle");
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
if (version < 17) {
|
if (version < 17) {
|
||||||
RefClass classChunk = getRefClass("{nms}.Chunk");
|
RefClass classChunk = getRefClass("{nms}.Chunk");
|
||||||
if (version == 13) {
|
this.mustNotSave = classChunk.getField("mustNotSave");
|
||||||
this.mustSave = classChunk.getField("mustSave");
|
|
||||||
this.isTrueForNotSave = false;
|
|
||||||
} else {
|
|
||||||
this.mustSave = classChunk.getField("mustNotSave");
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
|
RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
|
||||||
this.mustSave = classChunk.getField("mustNotSave");
|
this.mustNotSave = classChunk.getField("mustNotSave");
|
||||||
|
|
||||||
}
|
}
|
||||||
} catch (NoSuchFieldException e) {
|
} catch (NoSuchFieldException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -167,10 +174,13 @@ public class ChunkListener implements Listener {
|
|||||||
if (safe && shouldSave(world, chunk.getX(), chunk.getZ())) {
|
if (safe && shouldSave(world, chunk.getX(), chunk.getZ())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Object c = this.methodGetHandleChunk.of(chunk).call();
|
Object c = objChunkStatusFull != null
|
||||||
RefField.RefExecutor field = this.mustSave.of(c);
|
? this.methodGetHandleChunk.of(chunk).call(objChunkStatusFull)
|
||||||
if ((Boolean) field.get() != isTrueForNotSave) {
|
: this.methodGetHandleChunk.of(chunk).call();
|
||||||
field.set(isTrueForNotSave);
|
RefField.RefExecutor field = this.mustNotSave.of(c);
|
||||||
|
methodSetUnsaved.of(c).call(false);
|
||||||
|
if (!((Boolean) field.get())) {
|
||||||
|
field.set(true);
|
||||||
if (chunk.isLoaded()) {
|
if (chunk.isLoaded()) {
|
||||||
ignoreUnload = true;
|
ignoreUnload = true;
|
||||||
chunk.unload(false);
|
chunk.unload(false);
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
package com.plotsquared.bukkit.listener;
|
package com.plotsquared.bukkit.listener;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
|
import com.plotsquared.bukkit.BukkitPlatform;
|
||||||
import com.plotsquared.bukkit.player.BukkitPlayer;
|
import com.plotsquared.bukkit.player.BukkitPlayer;
|
||||||
import com.plotsquared.bukkit.util.BukkitEntityUtil;
|
import com.plotsquared.bukkit.util.BukkitEntityUtil;
|
||||||
import com.plotsquared.bukkit.util.BukkitUtil;
|
import com.plotsquared.bukkit.util.BukkitUtil;
|
||||||
@ -35,11 +36,13 @@ import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
|
|||||||
import com.plotsquared.core.plot.flag.implementations.EntityChangeBlockFlag;
|
import com.plotsquared.core.plot.flag.implementations.EntityChangeBlockFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.ExplosionFlag;
|
import com.plotsquared.core.plot.flag.implementations.ExplosionFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.InvincibleFlag;
|
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.plot.world.PlotAreaManager;
|
||||||
import com.plotsquared.core.util.EventDispatcher;
|
import com.plotsquared.core.util.EventDispatcher;
|
||||||
import com.plotsquared.core.util.PlotFlagUtil;
|
import com.plotsquared.core.util.PlotFlagUtil;
|
||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||||
import com.sk89q.worldedit.world.block.BlockType;
|
import com.sk89q.worldedit.world.block.BlockType;
|
||||||
|
import io.papermc.lib.PaperLib;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.Particle;
|
import org.bukkit.Particle;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
@ -53,6 +56,7 @@ import org.bukkit.entity.Player;
|
|||||||
import org.bukkit.entity.Projectile;
|
import org.bukkit.entity.Projectile;
|
||||||
import org.bukkit.entity.TNTPrimed;
|
import org.bukkit.entity.TNTPrimed;
|
||||||
import org.bukkit.entity.Vehicle;
|
import org.bukkit.entity.Vehicle;
|
||||||
|
import org.bukkit.event.Cancellable;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
@ -77,52 +81,43 @@ import java.util.List;
|
|||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public class EntityEventListener implements Listener {
|
public class EntityEventListener implements Listener {
|
||||||
|
|
||||||
|
private final BukkitPlatform platform;
|
||||||
private final PlotAreaManager plotAreaManager;
|
private final PlotAreaManager plotAreaManager;
|
||||||
private final EventDispatcher eventDispatcher;
|
private final EventDispatcher eventDispatcher;
|
||||||
private float lastRadius;
|
private float lastRadius;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public EntityEventListener(
|
public EntityEventListener(
|
||||||
|
final @NonNull BukkitPlatform platform,
|
||||||
final @NonNull PlotAreaManager plotAreaManager,
|
final @NonNull PlotAreaManager plotAreaManager,
|
||||||
final @NonNull EventDispatcher eventDispatcher
|
final @NonNull EventDispatcher eventDispatcher
|
||||||
) {
|
) {
|
||||||
|
this.platform = platform;
|
||||||
this.plotAreaManager = plotAreaManager;
|
this.plotAreaManager = plotAreaManager;
|
||||||
this.eventDispatcher = eventDispatcher;
|
this.eventDispatcher = eventDispatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST)
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
public void onEntityCombustByEntity(EntityCombustByEntityEvent event) {
|
public void onEntityCombustByEntity(EntityCombustByEntityEvent event) {
|
||||||
EntityDamageByEntityEvent eventChange =
|
onEntityDamageByEntityCommon(event.getCombuster(), event.getEntity(), EntityDamageEvent.DamageCause.FIRE_TICK, event);
|
||||||
new EntityDamageByEntityEvent(
|
|
||||||
event.getCombuster(),
|
|
||||||
event.getEntity(),
|
|
||||||
EntityDamageEvent.DamageCause.FIRE_TICK,
|
|
||||||
event.getDuration()
|
|
||||||
);
|
|
||||||
onEntityDamageByEntityEvent(eventChange);
|
|
||||||
if (eventChange.isCancelled()) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST)
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) {
|
public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) {
|
||||||
Entity damager = event.getDamager();
|
onEntityDamageByEntityCommon(event.getDamager(), event.getEntity(), event.getCause(), event);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onEntityDamageByEntityCommon(
|
||||||
|
final Entity damager,
|
||||||
|
final Entity victim,
|
||||||
|
final EntityDamageEvent.DamageCause cause,
|
||||||
|
final Cancellable event
|
||||||
|
) {
|
||||||
Location location = BukkitUtil.adapt(damager.getLocation());
|
Location location = BukkitUtil.adapt(damager.getLocation());
|
||||||
if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) {
|
if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Entity victim = event.getEntity();
|
if (!BukkitEntityUtil.entityDamage(damager, victim, cause)) {
|
||||||
/*
|
|
||||||
if (victim.getType().equals(EntityType.ITEM_FRAME)) {
|
|
||||||
Plot plot = BukkitUtil.getLocation(victim).getPlot();
|
|
||||||
if (plot != null && !plot.isAdded(damager.getUniqueId())) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
if (!BukkitEntityUtil.entityDamage(damager, victim, event.getCause())) {
|
|
||||||
if (event.isCancelled()) {
|
if (event.isCancelled()) {
|
||||||
if (victim instanceof Ageable ageable) {
|
if (victim instanceof Ageable ageable) {
|
||||||
if (ageable.getAge() == -24000) {
|
if (ageable.getAge() == -24000) {
|
||||||
@ -143,6 +138,10 @@ public class EntityEventListener implements Listener {
|
|||||||
if (area == null) {
|
if (area == null) {
|
||||||
return;
|
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();
|
CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason();
|
||||||
switch (reason.toString()) {
|
switch (reason.toString()) {
|
||||||
case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> {
|
case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> {
|
||||||
@ -152,20 +151,32 @@ public class EntityEventListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
|
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
|
||||||
"TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> {
|
"TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL",
|
||||||
|
"FROZEN", "SPELL", "DEFAULT" -> {
|
||||||
if (!area.isMobSpawning()) {
|
if (!area.isMobSpawning()) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case "BREEDING" -> {
|
case "BREEDING", "DUPLICATION" -> {
|
||||||
if (!area.isSpawnBreeding()) {
|
if (!area.isSpawnBreeding()) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
|
case "CUSTOM" -> {
|
||||||
if (!area.isSpawnCustom() && entity.getType() != EntityType.ARMOR_STAND) {
|
if (!area.isSpawnCustom()) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// No need to clutter metadata if running paper
|
||||||
|
if (!PaperLib.isPaper()) {
|
||||||
|
entity.setMetadata("ps_custom_spawned", new FixedMetadataValue(this.platform, true));
|
||||||
|
}
|
||||||
|
return; // Don't cancel if mob spawning is disabled
|
||||||
|
}
|
||||||
|
case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER" -> {
|
||||||
|
if (!area.isSpawnCustom()) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -353,13 +364,13 @@ public class EntityEventListener implements Listener {
|
|||||||
if (shooter instanceof Player) {
|
if (shooter instanceof Player) {
|
||||||
PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter);
|
PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter);
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
|
if (area.isRoadFlags() && !area.getRoadFlag(ProjectileChangeBlockFlag.class) && !pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
|
||||||
entity.remove();
|
entity.remove();
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
|
if (plot.isAdded(pp.getUUID()) || plot.getFlag(ProjectileChangeBlockFlag.class) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
entity.remove();
|
entity.remove();
|
||||||
|
@ -120,9 +120,15 @@ public class EntitySpawnListener implements Listener {
|
|||||||
Entity entity = event.getEntity();
|
Entity entity = event.getEntity();
|
||||||
Location location = BukkitUtil.adapt(entity.getLocation());
|
Location location = BukkitUtil.adapt(entity.getLocation());
|
||||||
PlotArea area = location.getPlotArea();
|
PlotArea area = location.getPlotArea();
|
||||||
if (!location.isPlotArea()) {
|
if (!location.isPlotArea() || area == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (PaperLib.isPaper()) {
|
||||||
|
//noinspection ConstantValue - getEntitySpawnReason annotated as NotNull, but is not NotNull. lol.
|
||||||
|
if (area.isSpawnCustom() && entity.getEntitySpawnReason() != null && "CUSTOM".equals(entity.getEntitySpawnReason().name())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
Plot plot = location.getOwnedPlotAbs();
|
Plot plot = location.getOwnedPlotAbs();
|
||||||
EntityType type = entity.getType();
|
EntityType type = entity.getType();
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
@ -148,7 +154,7 @@ public class EntitySpawnListener implements Listener {
|
|||||||
if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
|
if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
if (type == EntityType.ENDER_CRYSTAL) {
|
if (type == EntityType.ENDER_CRYSTAL || type == EntityType.ARMOR_STAND) {
|
||||||
if (BukkitEntityUtil.checkEntity(entity, plot)) {
|
if (BukkitEntityUtil.checkEntity(entity, plot)) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,201 @@
|
|||||||
|
/*
|
||||||
|
* 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.google.inject.Inject;
|
||||||
|
import com.plotsquared.bukkit.player.BukkitPlayer;
|
||||||
|
import com.plotsquared.bukkit.util.BukkitUtil;
|
||||||
|
import com.plotsquared.core.PlotSquared;
|
||||||
|
import com.plotsquared.core.configuration.Settings;
|
||||||
|
import com.plotsquared.core.database.DBFunc;
|
||||||
|
import com.plotsquared.core.location.Location;
|
||||||
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
|
import com.plotsquared.core.plot.Plot;
|
||||||
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.RedstoneFlag;
|
||||||
|
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||||
|
import com.plotsquared.core.util.PlotFlagUtil;
|
||||||
|
import com.plotsquared.core.util.task.TaskManager;
|
||||||
|
import com.plotsquared.core.util.task.TaskTime;
|
||||||
|
import com.sk89q.worldedit.WorldEdit;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.BlockPhysicsEvent;
|
||||||
|
import org.bukkit.event.block.BlockRedstoneEvent;
|
||||||
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public class HighFreqBlockEventListener implements Listener {
|
||||||
|
|
||||||
|
private static final Set<Material> PISTONS = Set.of(
|
||||||
|
Material.PISTON,
|
||||||
|
Material.STICKY_PISTON
|
||||||
|
);
|
||||||
|
private static final Set<Material> PHYSICS_BLOCKS = Set.of(
|
||||||
|
Material.TURTLE_EGG,
|
||||||
|
Material.TURTLE_SPAWN_EGG
|
||||||
|
);
|
||||||
|
|
||||||
|
private final PlotAreaManager plotAreaManager;
|
||||||
|
private final WorldEdit worldEdit;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public HighFreqBlockEventListener(final @NonNull PlotAreaManager plotAreaManager, final @NonNull WorldEdit worldEdit) {
|
||||||
|
this.plotAreaManager = plotAreaManager;
|
||||||
|
this.worldEdit = worldEdit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendBlockChange(final org.bukkit.Location bloc, final BlockData data) {
|
||||||
|
TaskManager.runTaskLater(() -> {
|
||||||
|
String world = bloc.getWorld().getName();
|
||||||
|
int x = bloc.getBlockX();
|
||||||
|
int z = bloc.getBlockZ();
|
||||||
|
int distance = Bukkit.getViewDistance() * 16;
|
||||||
|
|
||||||
|
for (final PlotPlayer<?> player : PlotSquared.platform().playerManager().getPlayers()) {
|
||||||
|
Location location = player.getLocation();
|
||||||
|
if (location.getWorldName().equals(world)) {
|
||||||
|
if (16 * Math.abs(location.getX() - x) / 16 > distance || 16 * Math.abs(location.getZ() - z) / 16 > distance) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
((BukkitPlayer) player).player.sendBlockChange(bloc, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, TaskTime.ticks(3L));
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onRedstoneEvent(BlockRedstoneEvent event) {
|
||||||
|
Block block = event.getBlock();
|
||||||
|
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, RedstoneFlag.class, false)) {
|
||||||
|
event.setNewCurrent(0);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!plot.getFlag(RedstoneFlag.class)) {
|
||||||
|
event.setNewCurrent(0);
|
||||||
|
plot.debug("Redstone event was cancelled because redstone = false");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Settings.Redstone.DISABLE_OFFLINE) {
|
||||||
|
boolean disable = false;
|
||||||
|
if (!DBFunc.SERVER.equals(plot.getOwner())) {
|
||||||
|
if (plot.isMerged()) {
|
||||||
|
disable = true;
|
||||||
|
for (UUID owner : plot.getOwners()) {
|
||||||
|
if (PlotSquared.platform().playerManager().getPlayerIfExists(owner) != null) {
|
||||||
|
disable = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
disable = PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwnerAbs()) == null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (disable) {
|
||||||
|
for (UUID trusted : plot.getTrusted()) {
|
||||||
|
if (PlotSquared.platform().playerManager().getPlayerIfExists(trusted) != null) {
|
||||||
|
disable = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (disable) {
|
||||||
|
event.setNewCurrent(0);
|
||||||
|
plot.debug("Redstone event was cancelled because no trusted player was in the plot");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Settings.Redstone.DISABLE_UNOCCUPIED) {
|
||||||
|
for (final PlotPlayer<?> player : PlotSquared.platform().playerManager().getPlayers()) {
|
||||||
|
if (plot.equals(player.getCurrentPlot())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
event.setNewCurrent(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
|
||||||
|
public void onPhysicsEvent(BlockPhysicsEvent event) {
|
||||||
|
Block block = event.getBlock();
|
||||||
|
Location location = BukkitUtil.adapt(block.getLocation());
|
||||||
|
PlotArea area = location.getPlotArea();
|
||||||
|
if (area == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Plot plot = area.getOwnedPlotAbs(location);
|
||||||
|
if (plot == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (event.getChangedType().hasGravity() && plot.getFlag(DisablePhysicsFlag.class)) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
sendBlockChange(event.getBlock().getLocation(), event.getBlock().getBlockData());
|
||||||
|
plot.debug("Prevented block physics and resent block change because disable-physics = true");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (event.getChangedType() == Material.COMPARATOR) {
|
||||||
|
if (!plot.getFlag(RedstoneFlag.class)) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
plot.debug("Prevented comparator update because redstone = false");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (PHYSICS_BLOCKS.contains(event.getChangedType())) {
|
||||||
|
if (plot.getFlag(DisablePhysicsFlag.class)) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
plot.debug("Prevented block physics because disable-physics = true");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Settings.Redstone.DETECT_INVALID_EDGE_PISTONS) {
|
||||||
|
if (PISTONS.contains(block.getType())) {
|
||||||
|
org.bukkit.block.data.Directional piston = (org.bukkit.block.data.Directional) block.getBlockData();
|
||||||
|
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)) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
plot.debug("Prevented piston update because of invalid edge piston detection");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -19,6 +19,7 @@
|
|||||||
package com.plotsquared.bukkit.listener;
|
package com.plotsquared.bukkit.listener;
|
||||||
|
|
||||||
import com.destroystokyo.paper.event.block.BeaconEffectEvent;
|
import com.destroystokyo.paper.event.block.BeaconEffectEvent;
|
||||||
|
import com.destroystokyo.paper.event.block.BlockDestroyEvent;
|
||||||
import com.destroystokyo.paper.event.entity.EntityPathfindEvent;
|
import com.destroystokyo.paper.event.entity.EntityPathfindEvent;
|
||||||
import com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent;
|
import com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent;
|
||||||
import com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent;
|
import com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent;
|
||||||
@ -40,7 +41,9 @@ import com.plotsquared.core.plot.PlotArea;
|
|||||||
import com.plotsquared.core.plot.flag.FlagContainer;
|
import com.plotsquared.core.plot.flag.FlagContainer;
|
||||||
import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag;
|
import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.FishingFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
|
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.TileDropFlag;
|
||||||
import com.plotsquared.core.plot.flag.types.BooleanFlag;
|
import com.plotsquared.core.plot.flag.types.BooleanFlag;
|
||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||||
import com.plotsquared.core.util.PlotFlagUtil;
|
import com.plotsquared.core.util.PlotFlagUtil;
|
||||||
@ -83,6 +86,19 @@ public class PaperListener implements Listener {
|
|||||||
this.plotAreaManager = plotAreaManager;
|
this.plotAreaManager = plotAreaManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
|
||||||
|
public void onBlockDestroy(final BlockDestroyEvent event) {
|
||||||
|
Location location = BukkitUtil.adapt(event.getBlock().getLocation());
|
||||||
|
PlotArea area = location.getPlotArea();
|
||||||
|
if (area == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Plot plot = area.getPlot(location);
|
||||||
|
if (plot != null) {
|
||||||
|
event.setWillDrop(plot.getFlag(TileDropFlag.class));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onEntityPathfind(EntityPathfindEvent event) {
|
public void onEntityPathfind(EntityPathfindEvent event) {
|
||||||
if (!Settings.Paper_Components.ENTITY_PATHING) {
|
if (!Settings.Paper_Components.ENTITY_PATHING) {
|
||||||
@ -124,7 +140,7 @@ public class PaperListener implements Listener {
|
|||||||
}
|
}
|
||||||
Slime slime = event.getEntity();
|
Slime slime = event.getEntity();
|
||||||
|
|
||||||
Block b = slime.getTargetBlock(4);
|
Block b = slime.getTargetBlockExact(4);
|
||||||
if (b == null) {
|
if (b == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -166,12 +182,16 @@ public class PaperListener implements Listener {
|
|||||||
}
|
}
|
||||||
Location location = BukkitUtil.adapt(event.getSpawnLocation());
|
Location location = BukkitUtil.adapt(event.getSpawnLocation());
|
||||||
PlotArea area = location.getPlotArea();
|
PlotArea area = location.getPlotArea();
|
||||||
if (!location.isPlotArea()) {
|
if (area == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//If entities are spawning... the chunk should be loaded?
|
// 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?
|
||||||
Entity[] entities = event.getSpawnLocation().getChunk().getEntities();
|
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.setShouldAbortSpawn(true);
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
@ -200,7 +220,7 @@ public class PaperListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
|
case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
|
||||||
if (!area.isSpawnCustom() && event.getType() != EntityType.ARMOR_STAND) {
|
if (!area.isSpawnCustom()) {
|
||||||
event.setShouldAbortSpawn(true);
|
event.setShouldAbortSpawn(true);
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
@ -344,6 +364,11 @@ public class PaperListener implements Listener {
|
|||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
} else if (!plot.isAdded(pp.getUUID())) {
|
} else if (!plot.isAdded(pp.getUUID())) {
|
||||||
|
if (entity.getType().equals(EntityType.FISHING_HOOK)) {
|
||||||
|
if (plot.getFlag(FishingFlag.class)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!plot.getFlag(ProjectilesFlag.class)) {
|
if (!plot.getFlag(ProjectilesFlag.class)) {
|
||||||
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
|
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
|
||||||
pp.sendMessage(
|
pp.sendMessage(
|
||||||
|
@ -50,6 +50,7 @@ import com.plotsquared.core.plot.flag.implementations.DenyPortalsFlag;
|
|||||||
import com.plotsquared.core.plot.flag.implementations.DenyTeleportFlag;
|
import com.plotsquared.core.plot.flag.implementations.DenyTeleportFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.DropProtectionFlag;
|
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.HangingBreakFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.HangingPlaceFlag;
|
import com.plotsquared.core.plot.flag.implementations.HangingPlaceFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.HostileInteractFlag;
|
import com.plotsquared.core.plot.flag.implementations.HostileInteractFlag;
|
||||||
@ -60,6 +61,7 @@ import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag;
|
|||||||
import com.plotsquared.core.plot.flag.implementations.PlayerInteractFlag;
|
import com.plotsquared.core.plot.flag.implementations.PlayerInteractFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag;
|
import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.TamedInteractFlag;
|
import com.plotsquared.core.plot.flag.implementations.TamedInteractFlag;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.TileDropFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.UntrustedVisitFlag;
|
import com.plotsquared.core.plot.flag.implementations.UntrustedVisitFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.VehicleBreakFlag;
|
import com.plotsquared.core.plot.flag.implementations.VehicleBreakFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.VehicleUseFlag;
|
import com.plotsquared.core.plot.flag.implementations.VehicleUseFlag;
|
||||||
@ -87,6 +89,7 @@ import org.bukkit.Material;
|
|||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
import org.bukkit.block.BlockState;
|
import org.bukkit.block.BlockState;
|
||||||
|
import org.bukkit.block.Sign;
|
||||||
import org.bukkit.block.data.Waterlogged;
|
import org.bukkit.block.data.Waterlogged;
|
||||||
import org.bukkit.command.PluginCommand;
|
import org.bukkit.command.PluginCommand;
|
||||||
import org.bukkit.entity.ArmorStand;
|
import org.bukkit.entity.ArmorStand;
|
||||||
@ -105,6 +108,7 @@ import org.bukkit.event.EventHandler;
|
|||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.block.Action;
|
import org.bukkit.event.block.Action;
|
||||||
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
import org.bukkit.event.entity.EntityPickupItemEvent;
|
import org.bukkit.event.entity.EntityPickupItemEvent;
|
||||||
import org.bukkit.event.entity.EntityPlaceEvent;
|
import org.bukkit.event.entity.EntityPlaceEvent;
|
||||||
import org.bukkit.event.entity.EntityPotionEffectEvent;
|
import org.bukkit.event.entity.EntityPotionEffectEvent;
|
||||||
@ -175,6 +179,33 @@ public class PlayerEventListener implements Listener {
|
|||||||
Material.WRITABLE_BOOK,
|
Material.WRITABLE_BOOK,
|
||||||
Material.WRITTEN_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 EventDispatcher eventDispatcher;
|
||||||
private final WorldEdit worldEdit;
|
private final WorldEdit worldEdit;
|
||||||
private final PlotAreaManager plotAreaManager;
|
private final PlotAreaManager plotAreaManager;
|
||||||
@ -207,6 +238,53 @@ public class PlayerEventListener implements Listener {
|
|||||||
this.plotListener = plotListener;
|
this.plotListener = plotListener;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
|
||||||
|
public void onBlockBreak(final BlockBreakEvent event) {
|
||||||
|
Location location = BukkitUtil.adapt(event.getBlock().getLocation());
|
||||||
|
PlotArea area = location.getPlotArea();
|
||||||
|
if (area == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Plot plot = area.getPlot(location);
|
||||||
|
if (plot != null) {
|
||||||
|
event.setDropItems(plot.getFlag(TileDropFlag.class));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@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)
|
@EventHandler(ignoreCancelled = true)
|
||||||
public void onEffect(@NonNull EntityPotionEffectEvent event) {
|
public void onEffect(@NonNull EntityPotionEffectEvent event) {
|
||||||
if (Settings.Enabled_Components.DISABLE_BEACON_EFFECT_OVERFLOW ||
|
if (Settings.Enabled_Components.DISABLE_BEACON_EFFECT_OVERFLOW ||
|
||||||
@ -369,6 +447,7 @@ public class PlayerEventListener implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
|
@SuppressWarnings("deprecation") // Paper deprecation
|
||||||
public void onConnect(PlayerJoinEvent event) {
|
public void onConnect(PlayerJoinEvent event) {
|
||||||
final Player player = event.getPlayer();
|
final Player player = event.getPlayer();
|
||||||
PlotSquared.platform().playerManager().removePlayer(player.getUniqueId());
|
PlotSquared.platform().playerManager().removePlayer(player.getUniqueId());
|
||||||
@ -454,9 +533,9 @@ public class PlayerEventListener implements Listener {
|
|||||||
// to is identical to the plot's home location, and untrusted-visit is true
|
// to is identical to the plot's home location, and untrusted-visit is true
|
||||||
// i.e. untrusted-visit can override deny-teleport
|
// i.e. untrusted-visit can override deny-teleport
|
||||||
// this is acceptable, because otherwise it wouldn't make sense to have both flags set
|
// this is acceptable, because otherwise it wouldn't make sense to have both flags set
|
||||||
if (!result && !(plot.getFlag(UntrustedVisitFlag.class) && plot
|
if (result || (plot.getFlag(UntrustedVisitFlag.class) && plot.getHomeSynchronous().equals(BukkitUtil.adaptComplete(to)))) {
|
||||||
.getHomeSynchronous()
|
plotListener.plotEntry(pp, plot);
|
||||||
.equals(BukkitUtil.adaptComplete(to)))) {
|
} else {
|
||||||
pp.sendMessage(
|
pp.sendMessage(
|
||||||
TranslatableCaption.of("deny.no_enter"),
|
TranslatableCaption.of("deny.no_enter"),
|
||||||
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.toString())))
|
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.toString())))
|
||||||
@ -469,6 +548,19 @@ public class PlayerEventListener implements Listener {
|
|||||||
playerMove(event);
|
playerMove(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
|
public void onWorldChanged(PlayerChangedWorldEvent event) {
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
BukkitPlayer pp = BukkitUtil.adapt(player);
|
||||||
|
if (this.worldEdit != null) {
|
||||||
|
if (!pp.hasPermission(Permission.PERMISSION_WORLDEDIT_BYPASS)) {
|
||||||
|
if (pp.getAttribute("worldedit")) {
|
||||||
|
pp.removeAttribute("worldedit");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
public void vehicleMove(VehicleMoveEvent event)
|
public void vehicleMove(VehicleMoveEvent event)
|
||||||
throws IllegalAccessException {
|
throws IllegalAccessException {
|
||||||
@ -607,7 +699,7 @@ public class PlayerEventListener implements Listener {
|
|||||||
this.tmpTeleport = true;
|
this.tmpTeleport = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int border = area.getBorder();
|
int border = area.getBorder(true);
|
||||||
int x1;
|
int x1;
|
||||||
if (x2 > border && this.tmpTeleport) {
|
if (x2 > border && this.tmpTeleport) {
|
||||||
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
|
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
|
||||||
@ -702,7 +794,7 @@ public class PlayerEventListener implements Listener {
|
|||||||
this.tmpTeleport = true;
|
this.tmpTeleport = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int border = area.getBorder();
|
int border = area.getBorder(true);
|
||||||
int z1;
|
int z1;
|
||||||
if (z2 > border && this.tmpTeleport) {
|
if (z2 > border && this.tmpTeleport) {
|
||||||
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
|
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
|
||||||
@ -733,6 +825,7 @@ public class PlayerEventListener implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOW)
|
@EventHandler(priority = EventPriority.LOW)
|
||||||
|
@SuppressWarnings("deprecation") // Paper deprecation
|
||||||
public void onChat(AsyncPlayerChatEvent event) {
|
public void onChat(AsyncPlayerChatEvent event) {
|
||||||
if (event.isCancelled()) {
|
if (event.isCancelled()) {
|
||||||
return;
|
return;
|
||||||
@ -807,40 +900,6 @@ public class PlayerEventListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
|
||||||
public void onWorldChanged(PlayerChangedWorldEvent event) {
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
BukkitPlayer pp = BukkitUtil.adapt(player);
|
|
||||||
// Delete last location
|
|
||||||
Plot plot;
|
|
||||||
try (final MetaDataAccess<Plot> lastPlotAccess =
|
|
||||||
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
|
||||||
plot = lastPlotAccess.remove();
|
|
||||||
}
|
|
||||||
try (final MetaDataAccess<Location> lastLocationAccess =
|
|
||||||
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LOCATION)) {
|
|
||||||
lastLocationAccess.remove();
|
|
||||||
}
|
|
||||||
if (plot != null) {
|
|
||||||
plotListener.plotExit(pp, plot);
|
|
||||||
}
|
|
||||||
if (this.worldEdit != null) {
|
|
||||||
if (!pp.hasPermission(Permission.PERMISSION_WORLDEDIT_BYPASS)) {
|
|
||||||
if (pp.getAttribute("worldedit")) {
|
|
||||||
pp.removeAttribute("worldedit");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Location location = pp.getLocation();
|
|
||||||
PlotArea area = location.getPlotArea();
|
|
||||||
if (location.isPlotArea()) {
|
|
||||||
plot = location.getPlot();
|
|
||||||
if (plot != null) {
|
|
||||||
plotListener.plotEntry(pp, plot);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
public void onInventoryClick(InventoryClickEvent event) {
|
public void onInventoryClick(InventoryClickEvent event) {
|
||||||
@ -1063,6 +1122,7 @@ public class PlayerEventListener implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOW)
|
@EventHandler(priority = EventPriority.LOW)
|
||||||
|
@SuppressWarnings("deprecation") // Paper deprecation
|
||||||
public void onCancelledInteract(PlayerInteractEvent event) {
|
public void onCancelledInteract(PlayerInteractEvent event) {
|
||||||
if (event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_AIR) {
|
if (event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_AIR) {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
@ -1855,7 +1915,9 @@ public class PlayerEventListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerTakeLecternBook(PlayerTakeLecternBookEvent event) {
|
public void onPlayerTakeLecternBook(PlayerTakeLecternBookEvent event) {
|
||||||
Location location = BukkitUtil.adapt(event.getPlayer().getLocation());
|
Player player = event.getPlayer();
|
||||||
|
BukkitPlayer pp = BukkitUtil.adapt(player);
|
||||||
|
Location location = pp.getLocation();
|
||||||
PlotArea area = location.getPlotArea();
|
PlotArea area = location.getPlotArea();
|
||||||
if (area == null) {
|
if (area == null) {
|
||||||
return;
|
return;
|
||||||
@ -1867,9 +1929,11 @@ public class PlayerEventListener implements Listener {
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (plot.getFlag(LecternReadBookFlag.class)) {
|
if (!plot.isAdded(pp.getUUID())) {
|
||||||
plot.debug(event.getPlayer().getName() + " could not take the book because of lectern-read-book = true");
|
if (plot.getFlag(LecternReadBookFlag.class)) {
|
||||||
event.setCancelled(true);
|
plot.debug(event.getPlayer().getName() + " could not take the book because of lectern-read-book = true");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -28,12 +28,14 @@ import com.plotsquared.core.player.PlotPlayer;
|
|||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.plot.PlotArea;
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
import com.plotsquared.core.plot.PlotHandler;
|
import com.plotsquared.core.plot.PlotHandler;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.FishingFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
|
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
|
||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||||
import com.plotsquared.core.util.PlotFlagUtil;
|
import com.plotsquared.core.util.PlotFlagUtil;
|
||||||
import net.kyori.adventure.text.minimessage.tag.Tag;
|
import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.entity.Projectile;
|
import org.bukkit.entity.Projectile;
|
||||||
@ -132,6 +134,11 @@ public class ProjectileEventListener implements Listener {
|
|||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
} else if (!plot.isAdded(pp.getUUID())) {
|
} else if (!plot.isAdded(pp.getUUID())) {
|
||||||
|
if (entity.getType().equals(EntityType.FISHING_HOOK)) {
|
||||||
|
if (plot.getFlag(FishingFlag.class)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!plot.getFlag(ProjectilesFlag.class)) {
|
if (!plot.getFlag(ProjectilesFlag.class)) {
|
||||||
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
|
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
|
||||||
pp.sendMessage(
|
pp.sendMessage(
|
||||||
@ -187,7 +194,8 @@ public class ProjectileEventListener implements Listener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag(
|
if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag(
|
||||||
ProjectilesFlag.class)) {
|
ProjectilesFlag.class) || (entity.getType().equals(EntityType.FISHING_HOOK) && plot.getFlag(
|
||||||
|
FishingFlag.class))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
entity.remove();
|
entity.remove();
|
||||||
|
@ -21,9 +21,14 @@ package com.plotsquared.bukkit.listener;
|
|||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.plotsquared.bukkit.BukkitPlatform;
|
import com.plotsquared.bukkit.BukkitPlatform;
|
||||||
import com.plotsquared.bukkit.placeholder.MVdWPlaceholders;
|
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.Settings;
|
||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
import com.plotsquared.core.player.ConsolePlayer;
|
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.Bukkit;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
@ -32,6 +37,8 @@ import org.checkerframework.checker.nullness.qual.NonNull;
|
|||||||
|
|
||||||
public class ServerListener implements Listener {
|
public class ServerListener implements Listener {
|
||||||
|
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ServerListener.class.getSimpleName());
|
||||||
|
|
||||||
private final BukkitPlatform plugin;
|
private final BukkitPlatform plugin;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@ -45,6 +52,29 @@ public class ServerListener implements Listener {
|
|||||||
new MVdWPlaceholders(this.plugin, this.plugin.placeholderRegistry());
|
new MVdWPlaceholders(this.plugin, this.plugin.placeholderRegistry());
|
||||||
ConsolePlayer.getConsole().sendMessage(TranslatableCaption.of("placeholder.hooked"));
|
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,45 +31,39 @@ import org.bukkit.event.Listener;
|
|||||||
import org.bukkit.event.world.ChunkEvent;
|
import org.bukkit.event.world.ChunkEvent;
|
||||||
import org.bukkit.event.world.ChunkLoadEvent;
|
import org.bukkit.event.world.ChunkLoadEvent;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
|
import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
|
||||||
|
|
||||||
public class SingleWorldListener implements Listener {
|
public class SingleWorldListener implements Listener {
|
||||||
|
|
||||||
private final Method methodGetHandleChunk;
|
private final Method methodSetUnsaved;
|
||||||
private Field shouldSave = null;
|
private Method methodGetHandleChunk;
|
||||||
|
private Object objChunkStatusFull = null;
|
||||||
|
|
||||||
public SingleWorldListener() throws Exception {
|
public SingleWorldListener() throws Exception {
|
||||||
ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
|
ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
|
||||||
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod();
|
ReflectionUtils.RefClass classChunkAccess = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
|
||||||
|
this.methodSetUnsaved = classChunkAccess.getMethod("a", boolean.class).getRealMethod();
|
||||||
try {
|
try {
|
||||||
if (PlotSquared.platform().serverVersion()[1] < 17) {
|
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod();
|
||||||
ReflectionUtils.RefClass classChunk = getRefClass("{nms}.Chunk");
|
} catch (NoSuchMethodException ignored) {
|
||||||
if (PlotSquared.platform().serverVersion()[1] == 13) {
|
try {
|
||||||
this.shouldSave = classChunk.getField("mustSave").getRealField();
|
ReflectionUtils.RefClass classChunkStatus = getRefClass("net.minecraft.world.level.chunk.ChunkStatus");
|
||||||
} else {
|
this.objChunkStatusFull = classChunkStatus.getRealClass().getField("n").get(null);
|
||||||
this.shouldSave = classChunk.getField("s").getRealField();
|
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle", classChunkStatus.getRealClass()).getRealMethod();
|
||||||
}
|
} catch (NoSuchMethodException ex) {
|
||||||
} else if (PlotSquared.platform().serverVersion()[1] == 17) {
|
throw new RuntimeException(ex);
|
||||||
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) {
|
public void markChunkAsClean(Chunk chunk) {
|
||||||
try {
|
try {
|
||||||
Object nmsChunk = methodGetHandleChunk.invoke(chunk);
|
Object nmsChunk = objChunkStatusFull != null
|
||||||
if (shouldSave != null) {
|
? this.methodGetHandleChunk.invoke(chunk, objChunkStatusFull)
|
||||||
this.shouldSave.set(nmsChunk, false);
|
: this.methodGetHandleChunk.invoke(chunk);
|
||||||
}
|
methodSetUnsaved.invoke(nmsChunk, false);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@ -85,7 +79,12 @@ public class SingleWorldListener implements Listener {
|
|||||||
if (!SinglePlotArea.isSinglePlotWorld(name)) {
|
if (!SinglePlotArea.isSinglePlotWorld(name)) {
|
||||||
return;
|
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());
|
markChunkAsClean(event.getChunk());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,7 +95,8 @@ public class SingleWorldListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOWEST)
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
public void onChunkLoad(ChunkLoadEvent event) {
|
public void onChunkLoad(ChunkLoadEvent event) {
|
||||||
handle(event);
|
// disable this for now, should address https://github.com/IntellectualSites/PlotSquared/issues/4413
|
||||||
|
// handle(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,8 @@ package com.plotsquared.bukkit.placeholder;
|
|||||||
|
|
||||||
import com.plotsquared.core.PlotSquared;
|
import com.plotsquared.core.PlotSquared;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
||||||
|
import com.plotsquared.core.util.query.PlotQuery;
|
||||||
import me.clip.placeholderapi.PlaceholderAPIPlugin;
|
import me.clip.placeholderapi.PlaceholderAPIPlugin;
|
||||||
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
|
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@ -83,6 +85,20 @@ public class PAPIPlaceholders extends PlaceholderExpansion {
|
|||||||
return String.valueOf(pl.getPlotCount(identifier));
|
return String.valueOf(pl.getPlotCount(identifier));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (identifier.startsWith("base_plot_count_")) {
|
||||||
|
identifier = identifier.substring("base_plot_count_".length());
|
||||||
|
if (identifier.isEmpty()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return String.valueOf(PlotQuery.newQuery()
|
||||||
|
.ownedBy(pl)
|
||||||
|
.inWorld(identifier)
|
||||||
|
.whereBasePlot()
|
||||||
|
.thatPasses(plot -> !DoneFlag.isDone(plot))
|
||||||
|
.count());
|
||||||
|
}
|
||||||
|
|
||||||
// PlotSquared placeholders
|
// PlotSquared placeholders
|
||||||
return PlotSquared.platform().placeholderRegistry().getPlaceholderValue(identifier, pl);
|
return PlotSquared.platform().placeholderRegistry().getPlaceholderValue(identifier, pl);
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@ import com.plotsquared.core.plot.PlotWeather;
|
|||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||||
import com.plotsquared.core.util.EventDispatcher;
|
import com.plotsquared.core.util.EventDispatcher;
|
||||||
import com.plotsquared.core.util.MathMan;
|
import com.plotsquared.core.util.MathMan;
|
||||||
|
import com.plotsquared.core.util.WorldUtil;
|
||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||||
import com.sk89q.worldedit.extension.platform.Actor;
|
import com.sk89q.worldedit.extension.platform.Actor;
|
||||||
import com.sk89q.worldedit.world.item.ItemType;
|
import com.sk89q.worldedit.world.item.ItemType;
|
||||||
@ -40,6 +41,7 @@ import io.papermc.lib.PaperLib;
|
|||||||
import net.kyori.adventure.audience.Audience;
|
import net.kyori.adventure.audience.Audience;
|
||||||
import org.bukkit.GameMode;
|
import org.bukkit.GameMode;
|
||||||
import org.bukkit.Sound;
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.SoundCategory;
|
||||||
import org.bukkit.WeatherType;
|
import org.bukkit.WeatherType;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
@ -51,7 +53,6 @@ import org.bukkit.potion.PotionEffectType;
|
|||||||
import org.checkerframework.checker.index.qual.NonNegative;
|
import org.checkerframework.checker.index.qual.NonNegative;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@ -120,6 +121,9 @@ public class BukkitPlayer extends PlotPlayer<Player> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canTeleport(final @NonNull Location location) {
|
public boolean canTeleport(final @NonNull Location location) {
|
||||||
|
if (!WorldUtil.isValidLocation(location)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
final org.bukkit.Location to = BukkitUtil.adapt(location);
|
final org.bukkit.Location to = BukkitUtil.adapt(location);
|
||||||
final org.bukkit.Location from = player.getLocation();
|
final org.bukkit.Location from = player.getLocation();
|
||||||
PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to);
|
PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to);
|
||||||
@ -158,6 +162,7 @@ public class BukkitPlayer extends PlotPlayer<Player> {
|
|||||||
}
|
}
|
||||||
final String[] nodes = stub.split("\\.");
|
final String[] nodes = stub.split("\\.");
|
||||||
final StringBuilder n = new StringBuilder();
|
final StringBuilder n = new StringBuilder();
|
||||||
|
// Wildcard check from less specific permission to more specific permission
|
||||||
for (int i = 0; i < (nodes.length - 1); i++) {
|
for (int i = 0; i < (nodes.length - 1); i++) {
|
||||||
n.append(nodes[i]).append(".");
|
n.append(nodes[i]).append(".");
|
||||||
if (!stub.equals(n + Permission.PERMISSION_STAR.toString())) {
|
if (!stub.equals(n + Permission.PERMISSION_STAR.toString())) {
|
||||||
@ -166,9 +171,11 @@ public class BukkitPlayer extends PlotPlayer<Player> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Wildcard check for the full permission
|
||||||
if (hasPermission(stub + ".*")) {
|
if (hasPermission(stub + ".*")) {
|
||||||
return Integer.MAX_VALUE;
|
return Integer.MAX_VALUE;
|
||||||
}
|
}
|
||||||
|
// Permission value cache for iterative check
|
||||||
int max = 0;
|
int max = 0;
|
||||||
if (CHECK_EFFECTIVE) {
|
if (CHECK_EFFECTIVE) {
|
||||||
boolean hasAny = false;
|
boolean hasAny = false;
|
||||||
@ -218,7 +225,7 @@ public class BukkitPlayer extends PlotPlayer<Player> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void teleport(final @NonNull Location location, final @NonNull TeleportCause cause) {
|
public void teleport(final @NonNull Location location, final @NonNull TeleportCause cause) {
|
||||||
if (Math.abs(location.getX()) >= 30000000 || Math.abs(location.getZ()) >= 30000000) {
|
if (!WorldUtil.isValidLocation(location)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final org.bukkit.Location bukkitLocation =
|
final org.bukkit.Location bukkitLocation =
|
||||||
@ -306,18 +313,21 @@ public class BukkitPlayer extends PlotPlayer<Player> {
|
|||||||
@Override
|
@Override
|
||||||
public void playMusic(final @NonNull Location location, final @NonNull ItemType id) {
|
public void playMusic(final @NonNull Location location, final @NonNull ItemType id) {
|
||||||
if (id == ItemTypes.AIR) {
|
if (id == ItemTypes.AIR) {
|
||||||
// Let's just stop all the discs because why not?
|
if (PlotSquared.platform().serverVersion()[1] >= 19) {
|
||||||
for (final Sound sound : Arrays.stream(Sound.values())
|
player.stopSound(SoundCategory.MUSIC);
|
||||||
.filter(sound -> sound.name().contains("DISC")).toList()) {
|
return;
|
||||||
player.stopSound(sound);
|
|
||||||
}
|
}
|
||||||
// this.player.playEffect(BukkitUtil.getLocation(location), Effect.RECORD_PLAY, Material.AIR);
|
// 1.18 and downwards require a specific Sound to stop (even tho the packet does not??)
|
||||||
} else {
|
for (final Sound sound : Sound.values()) {
|
||||||
// this.player.playEffect(BukkitUtil.getLocation(location), Effect.RECORD_PLAY, id.to(Material.class));
|
if (sound.name().startsWith("MUSIC_DISC")) {
|
||||||
this.player.playSound(BukkitUtil.adapt(location),
|
this.player.stopSound(sound, SoundCategory.MUSIC);
|
||||||
Sound.valueOf(BukkitAdapter.adapt(id).name()), Float.MAX_VALUE, 1f
|
}
|
||||||
);
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
this.player.playSound(BukkitUtil.adapt(location), Sound.valueOf(BukkitAdapter.adapt(id).name()),
|
||||||
|
SoundCategory.MUSIC, Float.MAX_VALUE, 1f
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation") // Needed for Spigot compatibility
|
@SuppressWarnings("deprecation") // Needed for Spigot compatibility
|
||||||
|
@ -44,6 +44,7 @@ import java.util.stream.IntStream;
|
|||||||
@Singleton
|
@Singleton
|
||||||
public class BukkitInventoryUtil extends InventoryUtil {
|
public class BukkitInventoryUtil extends InventoryUtil {
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // Paper deprecation
|
||||||
private static @Nullable ItemStack getItem(PlotItemStack item) {
|
private static @Nullable ItemStack getItem(PlotItemStack item) {
|
||||||
if (item == null) {
|
if (item == null) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -67,6 +67,7 @@ public class BukkitSetupUtils extends SetupUtils {
|
|||||||
this.worldFile = worldFile;
|
this.worldFile = worldFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // Paper deprecation
|
||||||
@Override
|
@Override
|
||||||
public void updateGenerators(final boolean force) {
|
public void updateGenerators(final boolean force) {
|
||||||
if (loaded && !SetupUtils.generators.isEmpty() && !force) {
|
if (loaded && !SetupUtils.generators.isEmpty() && !force) {
|
||||||
|
@ -23,11 +23,15 @@ import com.plotsquared.core.location.World;
|
|||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
|
import java.lang.ref.SoftReference;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class BukkitWorld implements World<org.bukkit.World> {
|
public class BukkitWorld implements World<org.bukkit.World> {
|
||||||
|
|
||||||
private static final Map<String, BukkitWorld> worldMap = Maps.newHashMap();
|
// Upon world unload we should probably have the P2 BukkitWorld be GCed relatively eagerly, thus freeing the bukkit world.
|
||||||
|
// We also want to avoid circumstances where a bukkit world has been GCed, but a P2 BukkitWorld has not
|
||||||
|
private static final Map<String, WeakReference<BukkitWorld>> worldMap = Maps.newHashMap();
|
||||||
private static final boolean HAS_MIN_Y;
|
private static final boolean HAS_MIN_Y;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
@ -41,10 +45,11 @@ public class BukkitWorld implements World<org.bukkit.World> {
|
|||||||
HAS_MIN_Y = temp;
|
HAS_MIN_Y = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
private final org.bukkit.World world;
|
// We want to allow GC to remove bukkit worlds, but not too eagerly
|
||||||
|
private final SoftReference<org.bukkit.World> world;
|
||||||
|
|
||||||
private BukkitWorld(final org.bukkit.World world) {
|
private BukkitWorld(final org.bukkit.World world) {
|
||||||
this.world = world;
|
this.world = new SoftReference<>(world);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -68,12 +73,13 @@ public class BukkitWorld implements World<org.bukkit.World> {
|
|||||||
* @return World instance
|
* @return World instance
|
||||||
*/
|
*/
|
||||||
public static @NonNull BukkitWorld of(final org.bukkit.World world) {
|
public static @NonNull BukkitWorld of(final org.bukkit.World world) {
|
||||||
BukkitWorld bukkitWorld = worldMap.get(world.getName());
|
WeakReference<BukkitWorld> bukkitWorldRef = worldMap.get(world.getName());
|
||||||
if (bukkitWorld != null && bukkitWorld.getPlatformWorld().equals(world)) {
|
BukkitWorld bukkitWorld;
|
||||||
|
if (bukkitWorldRef != null && (bukkitWorld = bukkitWorldRef.get()) != null && world.equals(bukkitWorld.world.get())) {
|
||||||
return bukkitWorld;
|
return bukkitWorld;
|
||||||
}
|
}
|
||||||
bukkitWorld = new BukkitWorld(world);
|
bukkitWorld = new BukkitWorld(world);
|
||||||
worldMap.put(world.getName(), bukkitWorld);
|
worldMap.put(world.getName(), new WeakReference<>(bukkitWorld));
|
||||||
return bukkitWorld;
|
return bukkitWorld;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,22 +103,26 @@ public class BukkitWorld implements World<org.bukkit.World> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public org.bukkit.World getPlatformWorld() {
|
public org.bukkit.World getPlatformWorld() {
|
||||||
return this.world;
|
org.bukkit.World world = this.world.get();
|
||||||
|
if (world == null) {
|
||||||
|
throw new IllegalStateException("Bukkit platform world was unloaded from memory");
|
||||||
|
}
|
||||||
|
return world;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NonNull String getName() {
|
public @NonNull String getName() {
|
||||||
return this.world.getName();
|
return this.getPlatformWorld().getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMinHeight() {
|
public int getMinHeight() {
|
||||||
return getMinWorldHeight(world);
|
return getMinWorldHeight(getPlatformWorld());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMaxHeight() {
|
public int getMaxHeight() {
|
||||||
return getMaxWorldHeight(world) - 1;
|
return getMaxWorldHeight(getPlatformWorld()) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -44,6 +44,24 @@ public class TranslationUpdateManager {
|
|||||||
String minheightReplacement = "minheight";
|
String minheightReplacement = "minheight";
|
||||||
String maxHeight = "maxHeight";
|
String maxHeight = "maxHeight";
|
||||||
String maxheightReplacement = "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>";
|
||||||
|
|
||||||
try (Stream<Path> paths = Files.walk(Paths.get(PlotSquared.platform().getDirectory().toPath().resolve("lang").toUri()))) {
|
try (Stream<Path> paths = Files.walk(Paths.get(PlotSquared.platform().getDirectory().toPath().resolve("lang").toUri()))) {
|
||||||
paths
|
paths
|
||||||
@ -53,6 +71,14 @@ public class TranslationUpdateManager {
|
|||||||
replaceInFile(p, suggestCommand, suggestCommandReplacement);
|
replaceInFile(p, suggestCommand, suggestCommandReplacement);
|
||||||
replaceInFile(p, minHeight, minheightReplacement);
|
replaceInFile(p, minHeight, minheightReplacement);
|
||||||
replaceInFile(p, maxHeight, maxheightReplacement);
|
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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ import org.bukkit.scheduler.BukkitTask;
|
|||||||
import javax.net.ssl.HttpsURLConnection;
|
import javax.net.ssl.HttpsURLConnection;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.net.URL;
|
import java.net.URI;
|
||||||
|
|
||||||
public class UpdateUtility implements Listener {
|
public class UpdateUtility implements Listener {
|
||||||
|
|
||||||
@ -59,8 +59,9 @@ public class UpdateUtility implements Listener {
|
|||||||
public void updateChecker() {
|
public void updateChecker() {
|
||||||
task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> {
|
task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> {
|
||||||
try {
|
try {
|
||||||
HttpsURLConnection connection = (HttpsURLConnection) new URL(
|
HttpsURLConnection connection = (HttpsURLConnection) URI.create(
|
||||||
"https://api.spigotmc.org/simple/0.1/index.php?action=getResource&id=77506")
|
"https://api.spigotmc.org/simple/0.2/index.php?action=getResource&id=77506")
|
||||||
|
.toURL()
|
||||||
.openConnection();
|
.openConnection();
|
||||||
connection.setRequestMethod("GET");
|
connection.setRequestMethod("GET");
|
||||||
JsonObject result = new JsonParser()
|
JsonObject result = new JsonParser()
|
||||||
|
@ -37,7 +37,9 @@ import com.sk89q.worldedit.regions.CuboidRegion;
|
|||||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class FaweRegionManager extends BukkitRegionManager {
|
public class FaweRegionManager extends BukkitRegionManager {
|
||||||
@ -59,7 +61,10 @@ public class FaweRegionManager extends BukkitRegionManager {
|
|||||||
@Nullable PlotPlayer<?> actor,
|
@Nullable PlotPlayer<?> actor,
|
||||||
@Nullable QueueCoordinator queue
|
@Nullable QueueCoordinator queue
|
||||||
) {
|
) {
|
||||||
return delegate.setCuboids(area, regions, blocks, minY, maxY, queue.getCompleteTask());
|
return delegate.setCuboids(
|
||||||
|
area, regions, blocks, minY, maxY,
|
||||||
|
Objects.requireNonNullElseGet(queue, area::getQueue).getCompleteTask()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -111,7 +116,7 @@ public class FaweRegionManager extends BukkitRegionManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean regenerateRegion(final Location pos1, final Location pos2, boolean ignore, final Runnable whenDone) {
|
public boolean regenerateRegion(final @NotNull Location pos1, final @NotNull Location pos2, boolean ignore, final Runnable whenDone) {
|
||||||
return delegate.regenerateRegion(pos1, pos2, ignore, whenDone);
|
return delegate.regenerateRegion(pos1, pos2, ignore, whenDone);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,76 +0,0 @@
|
|||||||
# 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,18 +2,18 @@ import java.time.format.DateTimeFormatter
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
// Expected everywhere.
|
// Expected everywhere.
|
||||||
compileOnlyApi("org.checkerframework:checker-qual")
|
compileOnlyApi(libs.checkerqual)
|
||||||
|
|
||||||
// Minecraft expectations
|
// Minecraft expectations
|
||||||
compileOnlyApi("com.google.code.gson:gson")
|
compileOnlyApi(libs.gson)
|
||||||
compileOnly("com.google.guava:guava")
|
compileOnly(libs.guava)
|
||||||
|
|
||||||
// Platform expectations
|
// Platform expectations
|
||||||
compileOnlyApi("org.yaml:snakeyaml")
|
compileOnlyApi(libs.snakeyaml)
|
||||||
|
|
||||||
// Adventure
|
// Adventure
|
||||||
api("net.kyori:adventure-api")
|
api(libs.adventureApi)
|
||||||
api("net.kyori:adventure-text-minimessage")
|
api(libs.adventureMiniMessage)
|
||||||
|
|
||||||
// Guice
|
// Guice
|
||||||
api(libs.guice) {
|
api(libs.guice) {
|
||||||
@ -31,19 +31,19 @@ dependencies {
|
|||||||
exclude(group = "dummypermscompat")
|
exclude(group = "dummypermscompat")
|
||||||
}
|
}
|
||||||
testImplementation(libs.worldeditCore)
|
testImplementation(libs.worldeditCore)
|
||||||
compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Core") { isTransitive = false }
|
compileOnly(libs.faweBukkit) { isTransitive = false }
|
||||||
testImplementation("com.fastasyncworldedit:FastAsyncWorldEdit-Core") { isTransitive = false }
|
testImplementation(libs.faweCore) { isTransitive = false }
|
||||||
|
|
||||||
// Logging
|
// Logging
|
||||||
compileOnlyApi("org.apache.logging.log4j:log4j-api")
|
compileOnlyApi(libs.log4j)
|
||||||
|
|
||||||
// Other libraries
|
// Other libraries
|
||||||
api(libs.prtree)
|
api(libs.prtree)
|
||||||
api(libs.aopalliance)
|
api(libs.aopalliance)
|
||||||
api(libs.cloudServices)
|
api(libs.cloudServices)
|
||||||
api(libs.arkitektonika)
|
api(libs.arkitektonika)
|
||||||
api("com.intellectualsites.paster:Paster")
|
api(libs.paster)
|
||||||
api("com.intellectualsites.informative-annotations:informative-annotations")
|
api(libs.informativeAnnotations)
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.processResources {
|
tasks.processResources {
|
||||||
@ -57,8 +57,8 @@ tasks.processResources {
|
|||||||
|
|
||||||
doLast {
|
doLast {
|
||||||
copy {
|
copy {
|
||||||
from(File("$rootDir/LICENSE"))
|
from(layout.buildDirectory.file("$rootDir/LICENSE"))
|
||||||
into("$buildDir/resources/main/")
|
into(layout.buildDirectory.dir("resources/main"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -71,13 +71,13 @@ tasks {
|
|||||||
opt.links("https://jd.advntr.dev/api/4.14.0/")
|
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/text-minimessage/4.14.0/")
|
||||||
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
|
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
|
||||||
opt.links("https://checkerframework.org/api/")
|
// opt.links("https://checkerframework.org/api/")
|
||||||
opt.links("https://javadoc.io/doc/com.intellectualsites.informative-annotations/informative-annotations/latest/")
|
|
||||||
opt.isLinkSource = true
|
opt.isLinkSource = true
|
||||||
opt.bottom(File("$rootDir/javadocfooter.html").readText())
|
opt.bottom(File("$rootDir/javadocfooter.html").readText())
|
||||||
opt.isUse = true
|
opt.isUse = true
|
||||||
opt.encoding("UTF-8")
|
opt.encoding("UTF-8")
|
||||||
opt.keyWords()
|
opt.keyWords()
|
||||||
opt.addStringOption("-since", isRelease)
|
opt.addStringOption("-since", isRelease)
|
||||||
|
opt.noTimestamp()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,7 @@ import java.io.InputStream;
|
|||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.io.ObjectInputStream;
|
import java.io.ObjectInputStream;
|
||||||
import java.io.ObjectOutputStream;
|
import java.io.ObjectOutputStream;
|
||||||
import java.net.MalformedURLException;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
@ -210,9 +210,10 @@ public class PlotSquared {
|
|||||||
try {
|
try {
|
||||||
URL logurl = PlotSquared.class.getProtectionDomain().getCodeSource().getLocation();
|
URL logurl = PlotSquared.class.getProtectionDomain().getCodeSource().getLocation();
|
||||||
this.jarFile = new File(
|
this.jarFile = new File(
|
||||||
new URL(logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file"))
|
URI.create(
|
||||||
.toURI().getPath());
|
logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file"))
|
||||||
} catch (MalformedURLException | URISyntaxException | SecurityException e) {
|
.getPath());
|
||||||
|
} catch (URISyntaxException | SecurityException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
this.jarFile = new File(this.platform.getDirectory().getParentFile(), "PlotSquared.jar");
|
this.jarFile = new File(this.platform.getDirectory().getParentFile(), "PlotSquared.jar");
|
||||||
if (!this.jarFile.exists()) {
|
if (!this.jarFile.exists()) {
|
||||||
@ -1281,7 +1282,7 @@ public class PlotSquared {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup the database connection.
|
* Set up the database connection.
|
||||||
*/
|
*/
|
||||||
public void setupDatabase() {
|
public void setupDatabase() {
|
||||||
try {
|
try {
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
package com.plotsquared.core.command;
|
package com.plotsquared.core.command;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
|
import com.plotsquared.core.PlotSquared;
|
||||||
import com.plotsquared.core.configuration.Settings;
|
import com.plotsquared.core.configuration.Settings;
|
||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
import com.plotsquared.core.database.DBFunc;
|
import com.plotsquared.core.database.DBFunc;
|
||||||
@ -101,9 +102,14 @@ public class Add extends Command {
|
|||||||
Permission.PERMISSION_ADMIN_COMMAND_TRUST))) {
|
Permission.PERMISSION_ADMIN_COMMAND_TRUST))) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("errors.invalid_player"),
|
TranslatableCaption.of("errors.invalid_player"),
|
||||||
TagResolver.resolver("value", Tag.inserting(
|
PlotSquared
|
||||||
PlayerManager.resolveName(uuid).toComponent(player)
|
.platform()
|
||||||
))
|
.playerManager()
|
||||||
|
.getUsernameCaption(uuid)
|
||||||
|
.thenApply(caption -> TagResolver.resolver(
|
||||||
|
"value",
|
||||||
|
Tag.inserting(caption.toComponent(player))
|
||||||
|
))
|
||||||
);
|
);
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
continue;
|
continue;
|
||||||
@ -111,9 +117,11 @@ public class Add extends Command {
|
|||||||
if (plot.isOwner(uuid)) {
|
if (plot.isOwner(uuid)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("member.already_added"),
|
TranslatableCaption.of("member.already_added"),
|
||||||
TagResolver.resolver("player", Tag.inserting(
|
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||||
PlayerManager.resolveName(uuid).toComponent(player)
|
.thenApply(caption -> TagResolver.resolver(
|
||||||
))
|
"player",
|
||||||
|
Tag.inserting(caption.toComponent(player))
|
||||||
|
))
|
||||||
);
|
);
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
continue;
|
continue;
|
||||||
@ -121,9 +129,11 @@ public class Add extends Command {
|
|||||||
if (plot.getMembers().contains(uuid)) {
|
if (plot.getMembers().contains(uuid)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("member.already_added"),
|
TranslatableCaption.of("member.already_added"),
|
||||||
TagResolver.resolver("player", Tag.inserting(
|
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||||
PlayerManager.resolveName(uuid).toComponent(player)
|
.thenApply(caption -> TagResolver.resolver(
|
||||||
))
|
"player",
|
||||||
|
Tag.inserting(caption.toComponent(player))
|
||||||
|
))
|
||||||
);
|
);
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
continue;
|
continue;
|
||||||
|
@ -131,8 +131,8 @@ public class Auto extends SubCommand {
|
|||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("economy.removed_granted_plot"),
|
TranslatableCaption.of("economy.removed_granted_plot"),
|
||||||
TagResolver.builder()
|
TagResolver.builder()
|
||||||
.tag("usedGrants", Tag.inserting(Component.text(grantedPlots - left)))
|
.tag("used_grants", Tag.inserting(Component.text(grantedPlots - left)))
|
||||||
.tag("remainingGrants", Tag.inserting(Component.text(left)))
|
.tag("remaining_grants", Tag.inserting(Component.text(left)))
|
||||||
.build()
|
.build()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -294,7 +294,7 @@ public class Auto extends SubCommand {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.econHandler != null && plotarea.useEconomy()) {
|
if (this.econHandler != null && plotarea.useEconomy() && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
|
||||||
PlotExpression costExp = plotarea.getPrices().get("claim");
|
PlotExpression costExp = plotarea.getPrices().get("claim");
|
||||||
PlotExpression mergeCostExp = plotarea.getPrices().get("merge");
|
PlotExpression mergeCostExp = plotarea.getPrices().get("merge");
|
||||||
int size = sizeX * sizeZ;
|
int size = sizeX * sizeZ;
|
||||||
|
@ -21,8 +21,9 @@ package com.plotsquared.core.command;
|
|||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.plotsquared.core.PlotSquared;
|
import com.plotsquared.core.PlotSquared;
|
||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
import com.plotsquared.core.events.PlotFlagRemoveEvent;
|
import com.plotsquared.core.events.PlayerBuyPlotEvent;
|
||||||
import com.plotsquared.core.events.Result;
|
import com.plotsquared.core.events.Result;
|
||||||
|
import com.plotsquared.core.player.OfflinePlotPlayer;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.plot.PlotArea;
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
@ -88,22 +89,30 @@ public class Buy extends Command {
|
|||||||
TranslatableCaption.of("permission.cant_claim_more_plots"),
|
TranslatableCaption.of("permission.cant_claim_more_plots"),
|
||||||
TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))
|
TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))
|
||||||
);
|
);
|
||||||
double price = plot.getFlag(PriceFlag.class);
|
double priceFlag = plot.getFlag(PriceFlag.class);
|
||||||
if (price <= 0) {
|
if (priceFlag <= 0) {
|
||||||
throw new CommandException(TranslatableCaption.of("economy.not_for_sale"));
|
throw new CommandException(TranslatableCaption.of("economy.not_for_sale"));
|
||||||
}
|
}
|
||||||
checkTrue(
|
checkTrue(
|
||||||
this.econHandler.isSupported(),
|
this.econHandler.isSupported(),
|
||||||
TranslatableCaption.of("economy.vault_or_consumer_null")
|
TranslatableCaption.of("economy.vault_or_consumer_null")
|
||||||
);
|
);
|
||||||
checkTrue(
|
|
||||||
this.econHandler.getMoney(player) >= price,
|
PlayerBuyPlotEvent event = this.eventDispatcher.callPlayerBuyPlot(player, plot, priceFlag);
|
||||||
TranslatableCaption.of("economy.cannot_afford_plot"),
|
if (event.getEventResult() == Result.DENY) {
|
||||||
TagResolver.builder()
|
throw new CommandException(TranslatableCaption.of("economy.cannot_buy_blocked"));
|
||||||
.tag("money", Tag.inserting(Component.text(this.econHandler.format(price))))
|
}
|
||||||
.tag("balance", Tag.inserting(Component.text(this.econHandler.format(this.econHandler.getMoney(player)))))
|
|
||||||
.build()
|
double price = event.getEventResult() == Result.FORCE ? 0 : event.price();
|
||||||
);
|
if (this.econHandler.getMoney(player) < price) {
|
||||||
|
throw new CommandException(
|
||||||
|
TranslatableCaption.of("economy.cannot_afford_plot"),
|
||||||
|
TagResolver.builder()
|
||||||
|
.tag("money", Tag.inserting(Component.text(this.econHandler.format(price))))
|
||||||
|
.tag("balance", Tag.inserting(Component.text(this.econHandler.format(this.econHandler.getMoney(player)))))
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
}
|
||||||
this.econHandler.withdrawMoney(player, price);
|
this.econHandler.withdrawMoney(player, price);
|
||||||
// Failure
|
// Failure
|
||||||
// Success
|
// Success
|
||||||
@ -113,7 +122,8 @@ public class Buy extends Command {
|
|||||||
TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price))))
|
TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price))))
|
||||||
);
|
);
|
||||||
|
|
||||||
this.econHandler.depositMoney(PlotSquared.platform().playerManager().getOfflinePlayer(plot.getOwnerAbs()), price);
|
OfflinePlotPlayer previousOwner = PlotSquared.platform().playerManager().getOfflinePlayer(plot.getOwnerAbs());
|
||||||
|
this.econHandler.depositMoney(previousOwner, price);
|
||||||
|
|
||||||
PlotPlayer<?> owner = PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwnerAbs());
|
PlotPlayer<?> owner = PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwnerAbs());
|
||||||
if (owner != null) {
|
if (owner != null) {
|
||||||
@ -127,9 +137,8 @@ public class Buy extends Command {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(PriceFlag.class);
|
PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(PriceFlag.class);
|
||||||
PlotFlagRemoveEvent event = this.eventDispatcher.callFlagRemove(plotFlag, plot);
|
if (this.eventDispatcher.callFlagRemove(plotFlag, plot).getEventResult() != Result.DENY) {
|
||||||
if (event.getEventResult() != Result.DENY) {
|
plot.removeFlag(plotFlag);
|
||||||
plot.removeFlag(event.getFlag());
|
|
||||||
}
|
}
|
||||||
plot.setOwner(player.getUUID());
|
plot.setOwner(player.getUUID());
|
||||||
plot.getPlotModificationManager().setSign(player.getName());
|
plot.getPlotModificationManager().setSign(player.getName());
|
||||||
@ -137,6 +146,7 @@ public class Buy extends Command {
|
|||||||
TranslatableCaption.of("working.claimed"),
|
TranslatableCaption.of("working.claimed"),
|
||||||
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
|
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
|
||||||
);
|
);
|
||||||
|
this.eventDispatcher.callPostPlayerBuyPlot(player, previousOwner, plot, price);
|
||||||
whenDone.run(Buy.this, CommandResult.SUCCESS);
|
whenDone.run(Buy.this, CommandResult.SUCCESS);
|
||||||
}, () -> {
|
}, () -> {
|
||||||
this.econHandler.depositMoney(player, price);
|
this.econHandler.depositMoney(player, price);
|
||||||
|
@ -141,7 +141,7 @@ public class Claim extends SubCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.econHandler.isEnabled(area) && !force) {
|
if (this.econHandler.isEnabled(area) && !force && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
|
||||||
PlotExpression costExr = area.getPrices().get("claim");
|
PlotExpression costExr = area.getPrices().get("claim");
|
||||||
double cost = costExr.evaluate(currentPlots);
|
double cost = costExr.evaluate(currentPlots);
|
||||||
if (cost > 0d) {
|
if (cost > 0d) {
|
||||||
@ -186,14 +186,14 @@ public class Claim extends SubCommand {
|
|||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("economy.removed_granted_plot"),
|
TranslatableCaption.of("economy.removed_granted_plot"),
|
||||||
TagResolver.builder()
|
TagResolver.builder()
|
||||||
.tag("usedGrants", Tag.inserting(Component.text(grants - 1)))
|
.tag("used_grants", Tag.inserting(Component.text(grants - 1)))
|
||||||
.tag("remainingGrants", Tag.inserting(Component.text(grants)))
|
.tag("remaining_grants", Tag.inserting(Component.text(grants)))
|
||||||
.build()
|
.build()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
|
if (!player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
|
||||||
int border = area.getBorder();
|
int border = area.getBorder(false);
|
||||||
if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border && !force) {
|
if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border && !force) {
|
||||||
player.sendMessage(TranslatableCaption.of("border.denied"));
|
player.sendMessage(TranslatableCaption.of("border.denied"));
|
||||||
return false;
|
return false;
|
||||||
|
@ -135,6 +135,7 @@ public class Clear extends Command {
|
|||||||
.tag("plot", Tag.inserting(Component.text(plot.getId().toString())))
|
.tag("plot", Tag.inserting(Component.text(plot.getId().toString())))
|
||||||
.build()
|
.build()
|
||||||
);
|
);
|
||||||
|
this.eventDispatcher.callPostPlotClear(player, plot);
|
||||||
}));
|
}));
|
||||||
if (!result) {
|
if (!result) {
|
||||||
player.sendMessage(TranslatableCaption.of("errors.wait_for_timer"));
|
player.sendMessage(TranslatableCaption.of("errors.wait_for_timer"));
|
||||||
|
@ -25,6 +25,7 @@ import com.plotsquared.core.player.PlotPlayer;
|
|||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CommandCategory.
|
* CommandCategory.
|
||||||
@ -82,7 +83,7 @@ public enum CommandCategory implements Caption {
|
|||||||
// TODO this method shouldn't be invoked
|
// TODO this method shouldn't be invoked
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public @NotNull String toString() {
|
||||||
return this.caption.getComponent(LocaleHolder.console());
|
return this.caption.getComponent(LocaleHolder.console());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,4 +109,5 @@ public enum CommandCategory implements Caption {
|
|||||||
return !MainCommand.getInstance().getCommands(this, player).isEmpty();
|
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.default_eval"));
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("condense.minimum_radius"),
|
TranslatableCaption.of("condense.minimum_radius"),
|
||||||
TagResolver.resolver("minimumRadius", Tag.inserting(Component.text(minimumRadius)))
|
TagResolver.resolver("minimum_radius", Tag.inserting(Component.text(minimumRadius)))
|
||||||
);
|
);
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("condense.maximum_moved"),
|
TranslatableCaption.of("condense.maximum_moved"),
|
||||||
TagResolver.resolver("maxMove", Tag.inserting(Component.text(maxMove)))
|
TagResolver.resolver("maximum_moves", Tag.inserting(Component.text(maxMove)))
|
||||||
);
|
);
|
||||||
player.sendMessage(TranslatableCaption.of("condense.input_eval"));
|
player.sendMessage(TranslatableCaption.of("condense.input_eval"));
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
@ -269,7 +269,7 @@ public class Condense extends SubCommand {
|
|||||||
);
|
);
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("condense.estimated_moves"),
|
TranslatableCaption.of("condense.estimated_moves"),
|
||||||
TagResolver.resolver("userMove", Tag.inserting(Component.text(userMove)))
|
TagResolver.resolver("user_move", Tag.inserting(Component.text(userMove)))
|
||||||
);
|
);
|
||||||
player.sendMessage(TranslatableCaption.of("condense.eta"));
|
player.sendMessage(TranslatableCaption.of("condense.eta"));
|
||||||
player.sendMessage(TranslatableCaption.of("condense.radius_measured"));
|
player.sendMessage(TranslatableCaption.of("condense.radius_measured"));
|
||||||
|
@ -29,7 +29,6 @@ import com.plotsquared.core.util.WorldUtil;
|
|||||||
import com.plotsquared.core.util.entity.EntityCategories;
|
import com.plotsquared.core.util.entity.EntityCategories;
|
||||||
import com.plotsquared.core.util.entity.EntityCategory;
|
import com.plotsquared.core.util.entity.EntityCategory;
|
||||||
import com.plotsquared.core.util.query.PlotQuery;
|
import com.plotsquared.core.util.query.PlotQuery;
|
||||||
import com.plotsquared.core.util.task.TaskManager;
|
|
||||||
import com.plotsquared.core.uuid.UUIDMapping;
|
import com.plotsquared.core.uuid.UUIDMapping;
|
||||||
import com.sk89q.worldedit.world.entity.EntityType;
|
import com.sk89q.worldedit.world.entity.EntityType;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
@ -71,7 +70,7 @@ public class Debug extends SubCommand {
|
|||||||
TranslatableCaption.of("commandconfig.command_syntax"),
|
TranslatableCaption.of("commandconfig.command_syntax"),
|
||||||
TagResolver.resolver(
|
TagResolver.resolver(
|
||||||
"value",
|
"value",
|
||||||
Tag.inserting(Component.text("/plot debug <loadedchunks | player | debug-players | entitytypes | msg>"))
|
Tag.inserting(Component.text("/plot debug <player | debug-players | entitytypes | msg>"))
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -85,16 +84,6 @@ public class Debug extends SubCommand {
|
|||||||
return true;
|
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])) {
|
if (args.length > 0 && "uuids".equalsIgnoreCase(args[0])) {
|
||||||
final Collection<UUIDMapping> mappings = PlotSquared.get().getImpromptuUUIDPipeline().getAllImmediately();
|
final Collection<UUIDMapping> mappings = PlotSquared.get().getImpromptuUUIDPipeline().getAllImmediately();
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
@ -196,7 +185,7 @@ public class Debug extends SubCommand {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<Command> tab(final PlotPlayer<?> player, String[] args, boolean space) {
|
public Collection<Command> tab(final PlotPlayer<?> player, String[] args, boolean space) {
|
||||||
return Stream.of("loadedchunks", "debug-players", "entitytypes")
|
return Stream.of("debug-players", "entitytypes")
|
||||||
.filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH)))
|
.filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH)))
|
||||||
.map(value -> new Command(null, false, value, "plots.admin", RequiredType.NONE, null) {
|
.map(value -> new Command(null, false, value, "plots.admin", RequiredType.NONE, null) {
|
||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
|
@ -96,6 +96,7 @@ public class DebugRoadRegen extends SubCommand {
|
|||||||
PlotArea area = location.getPlotArea();
|
PlotArea area = location.getPlotArea();
|
||||||
if (area == null) {
|
if (area == null) {
|
||||||
player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
|
player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
Plot plot = player.getCurrentPlot();
|
Plot plot = player.getCurrentPlot();
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
|
@ -117,10 +117,11 @@ public class Deny extends SubCommand {
|
|||||||
} else if (plot.getDenied().contains(uuid)) {
|
} else if (plot.getDenied().contains(uuid)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("member.already_added"),
|
TranslatableCaption.of("member.already_added"),
|
||||||
TagResolver.resolver(
|
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||||
|
.thenApply(caption -> TagResolver.resolver(
|
||||||
"player",
|
"player",
|
||||||
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
|
Tag.inserting(caption.toComponent(player))
|
||||||
)
|
))
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
|
@ -94,7 +94,7 @@ public class Done extends SubCommand {
|
|||||||
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
|
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
|
||||||
);
|
);
|
||||||
final Settings.Auto_Clear doneRequirements = Settings.AUTO_CLEAR.get("done");
|
final Settings.Auto_Clear doneRequirements = Settings.AUTO_CLEAR.get("done");
|
||||||
if (PlotSquared.platform().expireManager() == null || doneRequirements == null) {
|
if (PlotSquared.platform().expireManager() == null || doneRequirements == null || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DONE)) {
|
||||||
finish(plot, player, true);
|
finish(plot, player, true);
|
||||||
plot.removeRunning();
|
plot.removeRunning();
|
||||||
} else {
|
} else {
|
||||||
|
@ -20,7 +20,6 @@ package com.plotsquared.core.command;
|
|||||||
|
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.plotsquared.core.configuration.Settings;
|
import com.plotsquared.core.configuration.Settings;
|
||||||
import com.plotsquared.core.configuration.caption.StaticCaption;
|
|
||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
import com.plotsquared.core.permissions.Permission;
|
import com.plotsquared.core.permissions.Permission;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
@ -136,7 +135,9 @@ public class Download extends SubCommand {
|
|||||||
}
|
}
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("web.generation_link_success_legacy_world"),
|
TranslatableCaption.of("web.generation_link_success_legacy_world"),
|
||||||
TagResolver.resolver("url", Tag.inserting(Component.text(url.toString())))
|
TagResolver.builder()
|
||||||
|
.tag("url", Tag.preProcessParsed(url.toString()))
|
||||||
|
.build()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -200,7 +201,6 @@ public class Download extends SubCommand {
|
|||||||
.tag("delete", Tag.preProcessParsed("Not available"))
|
.tag("delete", Tag.preProcessParsed("Not available"))
|
||||||
.build()
|
.build()
|
||||||
);
|
);
|
||||||
player.sendMessage(StaticCaption.of(value.toString()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
));
|
));
|
||||||
|
@ -103,9 +103,10 @@ public final class FlagCommand extends Command {
|
|||||||
if (flag instanceof IntegerFlag && MathMan.isInteger(value)) {
|
if (flag instanceof IntegerFlag && MathMan.isInteger(value)) {
|
||||||
try {
|
try {
|
||||||
int numeric = Integer.parseInt(value);
|
int numeric = Integer.parseInt(value);
|
||||||
|
// Getting full permission without ".<amount>" at the end
|
||||||
perm = perm.substring(0, perm.length() - value.length() - 1);
|
perm = perm.substring(0, perm.length() - value.length() - 1);
|
||||||
boolean result = false;
|
boolean result = false;
|
||||||
if (numeric > 0) {
|
if (numeric >= 0) {
|
||||||
int checkRange = PlotSquared.get().getPlatform().equalsIgnoreCase("bukkit") ?
|
int checkRange = PlotSquared.get().getPlatform().equalsIgnoreCase("bukkit") ?
|
||||||
numeric :
|
numeric :
|
||||||
Settings.Limit.MAX_PLOTS;
|
Settings.Limit.MAX_PLOTS;
|
||||||
|
@ -465,7 +465,7 @@ public class ListCmd extends SubCommand {
|
|||||||
TextComponent.Builder builder = Component.text();
|
TextComponent.Builder builder = Component.text();
|
||||||
if (plot.getFlag(ServerPlotFlag.class)) {
|
if (plot.getFlag(ServerPlotFlag.class)) {
|
||||||
TagResolver serverResolver = TagResolver.resolver(
|
TagResolver serverResolver = TagResolver.resolver(
|
||||||
"info.server",
|
"server",
|
||||||
Tag.inserting(TranslatableCaption.of("info.server").toComponent(player))
|
Tag.inserting(TranslatableCaption.of("info.server").toComponent(player))
|
||||||
);
|
);
|
||||||
builder.append(MINI_MESSAGE.deserialize(server, serverResolver));
|
builder.append(MINI_MESSAGE.deserialize(server, serverResolver));
|
||||||
@ -483,13 +483,13 @@ public class ListCmd extends SubCommand {
|
|||||||
builder.append(MINI_MESSAGE.deserialize(online, resolver));
|
builder.append(MINI_MESSAGE.deserialize(online, resolver));
|
||||||
} else if (uuidMapping.username().equalsIgnoreCase("unknown")) {
|
} else if (uuidMapping.username().equalsIgnoreCase("unknown")) {
|
||||||
TagResolver unknownResolver = TagResolver.resolver(
|
TagResolver unknownResolver = TagResolver.resolver(
|
||||||
"info.unknown",
|
"unknown",
|
||||||
Tag.inserting(TranslatableCaption.of("info.unknown").toComponent(player))
|
Tag.inserting(TranslatableCaption.of("info.unknown").toComponent(player))
|
||||||
);
|
);
|
||||||
builder.append(MINI_MESSAGE.deserialize(unknown, unknownResolver));
|
builder.append(MINI_MESSAGE.deserialize(unknown, unknownResolver));
|
||||||
} else if (uuidMapping.uuid().equals(DBFunc.EVERYONE)) {
|
} else if (uuidMapping.uuid().equals(DBFunc.EVERYONE)) {
|
||||||
TagResolver everyoneResolver = TagResolver.resolver(
|
TagResolver everyoneResolver = TagResolver.resolver(
|
||||||
"info.everyone",
|
"everyone",
|
||||||
Tag.inserting(TranslatableCaption.of("info.everyone").toComponent(player))
|
Tag.inserting(TranslatableCaption.of("info.everyone").toComponent(player))
|
||||||
);
|
);
|
||||||
builder.append(MINI_MESSAGE.deserialize(everyone, everyoneResolver));
|
builder.append(MINI_MESSAGE.deserialize(everyone, everyoneResolver));
|
||||||
@ -517,6 +517,7 @@ public class ListCmd extends SubCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
finalResolver.tag("players", Tag.inserting(builder.asComponent()));
|
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.set(TranslatableCaption.of("info.plot_list_item"));
|
||||||
caption.setTagResolvers(finalResolver.build());
|
caption.setTagResolvers(finalResolver.build());
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,7 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
|||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URI;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -116,7 +117,7 @@ public class Load extends SubCommand {
|
|||||||
}
|
}
|
||||||
final URL url;
|
final URL url;
|
||||||
try {
|
try {
|
||||||
url = new URL(Settings.Web.URL + "saves/" + player.getUUID() + '/' + schematic);
|
url = URI.create(Settings.Web.URL + "saves/" + player.getUUID() + '/' + schematic).toURL();
|
||||||
} catch (MalformedURLException e) {
|
} catch (MalformedURLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
player.sendMessage(TranslatableCaption.of("web.load_failed"));
|
player.sendMessage(TranslatableCaption.of("web.load_failed"));
|
||||||
|
@ -183,7 +183,7 @@ public class MainCommand extends Command {
|
|||||||
if (cmd.hasConfirmation(player)) {
|
if (cmd.hasConfirmation(player)) {
|
||||||
CmdConfirm.addPending(player, cmd.getUsage(), () -> {
|
CmdConfirm.addPending(player, cmd.getUsage(), () -> {
|
||||||
PlotArea area = player.getApplicablePlotArea();
|
PlotArea area = player.getApplicablePlotArea();
|
||||||
if (area != null && econHandler.isEnabled(area)) {
|
if (area != null && econHandler.isEnabled(area) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
|
||||||
PlotExpression priceEval =
|
PlotExpression priceEval =
|
||||||
area.getPrices().get(cmd.getFullId());
|
area.getPrices().get(cmd.getFullId());
|
||||||
double price = priceEval != null ? priceEval.evaluate(0d) : 0d;
|
double price = priceEval != null ? priceEval.evaluate(0d) : 0d;
|
||||||
@ -201,7 +201,7 @@ public class MainCommand extends Command {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
PlotArea area = player.getApplicablePlotArea();
|
PlotArea area = player.getApplicablePlotArea();
|
||||||
if (area != null && econHandler.isEnabled(area)) {
|
if (area != null && econHandler.isEnabled(area) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
|
||||||
PlotExpression priceEval = area.getPrices().get(cmd.getFullId());
|
PlotExpression priceEval = area.getPrices().get(cmd.getFullId());
|
||||||
double price = priceEval != null ? priceEval.evaluate(0d) : 0d;
|
double price = priceEval != null ? priceEval.evaluate(0d) : 0d;
|
||||||
if (price != 0d && econHandler.getMoney(player) < price) {
|
if (price != 0d && econHandler.getMoney(player) < price) {
|
||||||
@ -268,6 +268,7 @@ public class MainCommand extends Command {
|
|||||||
tp = true;
|
tp = true;
|
||||||
} else {
|
} else {
|
||||||
player.sendMessage(TranslatableCaption.of("border.denied"));
|
player.sendMessage(TranslatableCaption.of("border.denied"));
|
||||||
|
return CompletableFuture.completedFuture(false);
|
||||||
}
|
}
|
||||||
// Trim command
|
// Trim command
|
||||||
args = Arrays.copyOfRange(args, 1, args.length);
|
args = Arrays.copyOfRange(args, 1, args.length);
|
||||||
|
@ -109,7 +109,7 @@ public class Merge extends SubCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (direction == null && (args[0].equalsIgnoreCase("all") || args[0]
|
if (direction == null && (args[0].equalsIgnoreCase("all") || args[0]
|
||||||
.equalsIgnoreCase("auto"))) {
|
.equalsIgnoreCase("auto")) && player.hasPermission(Permission.PERMISSION_MERGE_ALL)) {
|
||||||
direction = Direction.ALL;
|
direction = Direction.ALL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -178,7 +178,7 @@ public class Merge extends SubCommand {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (plot.getPlotModificationManager().autoMerge(Direction.ALL, maxSize, uuid, player, terrain)) {
|
if (plot.getPlotModificationManager().autoMerge(Direction.ALL, maxSize, uuid, player, terrain)) {
|
||||||
if (this.econHandler.isEnabled(plotArea) && price > 0d) {
|
if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
|
||||||
this.econHandler.withdrawMoney(player, price);
|
this.econHandler.withdrawMoney(player, price);
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("economy.removed_balance"),
|
TranslatableCaption.of("economy.removed_balance"),
|
||||||
@ -196,8 +196,8 @@ public class Merge extends SubCommand {
|
|||||||
player.sendMessage(TranslatableCaption.of("merge.no_available_automerge"));
|
player.sendMessage(TranslatableCaption.of("merge.no_available_automerge"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!force && this.econHandler.isEnabled(plotArea) && price > 0d
|
if (!force && this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d && this.econHandler.getMoney(
|
||||||
&& this.econHandler.getMoney(player) < price) {
|
player) < price) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("economy.cannot_afford_merge"),
|
TranslatableCaption.of("economy.cannot_afford_merge"),
|
||||||
TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price))))
|
TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price))))
|
||||||
@ -218,7 +218,7 @@ public class Merge extends SubCommand {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (plot.getPlotModificationManager().autoMerge(direction, maxSize - size, uuid, player, terrain)) {
|
if (plot.getPlotModificationManager().autoMerge(direction, maxSize - size, uuid, player, terrain)) {
|
||||||
if (this.econHandler.isEnabled(plotArea) && price > 0d) {
|
if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
|
||||||
this.econHandler.withdrawMoney(player, price);
|
this.econHandler.withdrawMoney(player, price);
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("economy.removed_balance"),
|
TranslatableCaption.of("economy.removed_balance"),
|
||||||
@ -259,7 +259,7 @@ public class Merge extends SubCommand {
|
|||||||
accepter.sendMessage(TranslatableCaption.of("merge.merge_not_valid"));
|
accepter.sendMessage(TranslatableCaption.of("merge.merge_not_valid"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (this.econHandler.isEnabled(plotArea) && price > 0d) {
|
if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
|
||||||
if (!force && this.econHandler.getMoney(player) < price) {
|
if (!force && this.econHandler.getMoney(player) < price) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("economy.cannot_afford_merge"),
|
TranslatableCaption.of("economy.cannot_afford_merge"),
|
||||||
@ -303,7 +303,7 @@ public class Merge extends SubCommand {
|
|||||||
player,
|
player,
|
||||||
terrain
|
terrain
|
||||||
)) {
|
)) {
|
||||||
if (this.econHandler.isEnabled(plotArea) && price > 0d) {
|
if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
|
||||||
if (!force && this.econHandler.getMoney(player) < price) {
|
if (!force && this.econHandler.getMoney(player) < price) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("economy.cannot_afford_merge"),
|
TranslatableCaption.of("economy.cannot_afford_merge"),
|
||||||
|
@ -31,7 +31,6 @@ import com.plotsquared.core.player.PlayerMetaDataKeys;
|
|||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.util.EventDispatcher;
|
import com.plotsquared.core.util.EventDispatcher;
|
||||||
import com.plotsquared.core.util.PlayerManager;
|
|
||||||
import com.plotsquared.core.util.TabCompletions;
|
import com.plotsquared.core.util.TabCompletions;
|
||||||
import com.plotsquared.core.util.task.TaskManager;
|
import com.plotsquared.core.util.task.TaskManager;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
@ -136,10 +135,11 @@ public class Owner extends SetCommand {
|
|||||||
if (plot.isOwner(uuid)) {
|
if (plot.isOwner(uuid)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("member.already_owner"),
|
TranslatableCaption.of("member.already_owner"),
|
||||||
TagResolver.resolver(
|
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||||
|
.thenApply(caption -> TagResolver.resolver(
|
||||||
"player",
|
"player",
|
||||||
Tag.inserting(PlayerManager.resolveName(uuid, false).toComponent(player))
|
Tag.inserting(caption.toComponent(player))
|
||||||
)
|
))
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -147,10 +147,11 @@ public class Owner extends SetCommand {
|
|||||||
if (other == null) {
|
if (other == null) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("errors.invalid_player_offline"),
|
TranslatableCaption.of("errors.invalid_player_offline"),
|
||||||
TagResolver.resolver(
|
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||||
|
.thenApply(caption -> TagResolver.resolver(
|
||||||
"player",
|
"player",
|
||||||
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
|
Tag.inserting(caption.toComponent(player))
|
||||||
)
|
))
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ public class PluginCmd extends SubCommand {
|
|||||||
player.sendMessage(StaticCaption.of(
|
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>"));
|
"<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(
|
player.sendMessage(StaticCaption.of(
|
||||||
"<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>"));
|
"<gray>>> </gray><gold><bold>Wiki<reset><gray>: </gray><gold><click:open_url:https://intellectualsites.gitbook.io/plotsquared/>https://intellectualsites.gitbook.io/plotsquared/</gold>"));
|
||||||
player.sendMessage(StaticCaption.of(
|
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>"));
|
"<gray>>> </gray><gold><bold>Discord<reset><gray>: </gray><gold><click:open_url:https://discord.gg/intellectualsites>https://discord.gg/intellectualsites</gold>"));
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
|
@ -100,15 +100,17 @@ public class Remove extends SubCommand {
|
|||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
} else if (uuid == DBFunc.EVERYONE) {
|
} else if (uuid == DBFunc.EVERYONE) {
|
||||||
|
count += plot.getTrusted().size();
|
||||||
if (plot.removeTrusted(uuid)) {
|
if (plot.removeTrusted(uuid)) {
|
||||||
this.eventDispatcher.callTrusted(player, plot, uuid, false);
|
this.eventDispatcher.callTrusted(player, plot, uuid, false);
|
||||||
count++;
|
}
|
||||||
} else if (plot.removeMember(uuid)) {
|
count += plot.getMembers().size();
|
||||||
|
if (plot.removeMember(uuid)) {
|
||||||
this.eventDispatcher.callMember(player, plot, uuid, false);
|
this.eventDispatcher.callMember(player, plot, uuid, false);
|
||||||
count++;
|
}
|
||||||
} else if (plot.removeDenied(uuid)) {
|
count += plot.getDenied().size();
|
||||||
|
if (plot.removeDenied(uuid)) {
|
||||||
this.eventDispatcher.callDenied(player, plot, uuid, false);
|
this.eventDispatcher.callDenied(player, plot, uuid, false);
|
||||||
count++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,7 @@ import net.kyori.adventure.text.minimessage.tag.Tag;
|
|||||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -130,8 +131,7 @@ public class SchematicCmd extends SubCommand {
|
|||||||
if (location.startsWith("url:")) {
|
if (location.startsWith("url:")) {
|
||||||
try {
|
try {
|
||||||
UUID uuid = UUID.fromString(location.substring(4));
|
UUID uuid = UUID.fromString(location.substring(4));
|
||||||
URL base = new URL(Settings.Web.URL);
|
URL url = URI.create(Settings.Web.URL + "uploads/" + uuid + ".schematic").toURL();
|
||||||
URL url = new URL(base, "uploads/" + uuid + ".schematic");
|
|
||||||
schematic = this.schematicHandler.getSchematic(url);
|
schematic = this.schematicHandler.getSchematic(url);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
package com.plotsquared.core.command;
|
package com.plotsquared.core.command;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
|
import com.plotsquared.core.PlotSquared;
|
||||||
import com.plotsquared.core.configuration.Settings;
|
import com.plotsquared.core.configuration.Settings;
|
||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
import com.plotsquared.core.database.DBFunc;
|
import com.plotsquared.core.database.DBFunc;
|
||||||
@ -103,10 +104,11 @@ public class Trust extends Command {
|
|||||||
player.hasPermission(Permission.PERMISSION_TRUST_EVERYONE) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_TRUST))) {
|
player.hasPermission(Permission.PERMISSION_TRUST_EVERYONE) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_TRUST))) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("errors.invalid_player"),
|
TranslatableCaption.of("errors.invalid_player"),
|
||||||
TagResolver.resolver(
|
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||||
|
.thenApply(caption -> TagResolver.resolver(
|
||||||
"value",
|
"value",
|
||||||
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
|
Tag.inserting(caption.toComponent(player))
|
||||||
)
|
))
|
||||||
);
|
);
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
continue;
|
continue;
|
||||||
@ -114,10 +116,11 @@ public class Trust extends Command {
|
|||||||
if (currentPlot.isOwner(uuid)) {
|
if (currentPlot.isOwner(uuid)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("member.already_added"),
|
TranslatableCaption.of("member.already_added"),
|
||||||
TagResolver.resolver(
|
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||||
"value",
|
.thenApply(caption -> TagResolver.resolver(
|
||||||
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
|
"player",
|
||||||
)
|
Tag.inserting(caption.toComponent(player))
|
||||||
|
))
|
||||||
);
|
);
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
continue;
|
continue;
|
||||||
@ -125,10 +128,11 @@ public class Trust extends Command {
|
|||||||
if (currentPlot.getTrusted().contains(uuid)) {
|
if (currentPlot.getTrusted().contains(uuid)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("member.already_added"),
|
TranslatableCaption.of("member.already_added"),
|
||||||
TagResolver.resolver(
|
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
|
||||||
"value",
|
.thenApply(caption -> TagResolver.resolver(
|
||||||
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
|
"player",
|
||||||
)
|
Tag.inserting(caption.toComponent(player))
|
||||||
|
))
|
||||||
);
|
);
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
continue;
|
continue;
|
||||||
|
@ -77,6 +77,7 @@ public class Visit extends Command {
|
|||||||
query.whereBasePlot();
|
query.whereBasePlot();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// without specified argument
|
||||||
if (page == Integer.MIN_VALUE) {
|
if (page == Integer.MIN_VALUE) {
|
||||||
page = 1;
|
page = 1;
|
||||||
}
|
}
|
||||||
@ -94,10 +95,15 @@ public class Visit extends Command {
|
|||||||
|
|
||||||
final List<Plot> plots = query.asList();
|
final List<Plot> plots = query.asList();
|
||||||
|
|
||||||
|
// Conversion of reversed page argument
|
||||||
|
if (page < 0) {
|
||||||
|
page = (plots.size() + 1) + page;
|
||||||
|
}
|
||||||
|
|
||||||
if (plots.isEmpty()) {
|
if (plots.isEmpty()) {
|
||||||
player.sendMessage(TranslatableCaption.of("invalid.found_no_plots"));
|
player.sendMessage(TranslatableCaption.of("invalid.found_no_plots"));
|
||||||
return;
|
return;
|
||||||
} else if (plots.size() < page || page < 1) {
|
} else if (page > plots.size() || page < 1) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("invalid.number_not_in_range"),
|
TranslatableCaption.of("invalid.number_not_in_range"),
|
||||||
TagResolver.builder()
|
TagResolver.builder()
|
||||||
@ -188,34 +194,22 @@ public class Visit extends Command {
|
|||||||
int page = Integer.MIN_VALUE;
|
int page = Integer.MIN_VALUE;
|
||||||
|
|
||||||
switch (args.length) {
|
switch (args.length) {
|
||||||
// /p v <user> <area> <page>
|
// /p v <player> <area> <page>
|
||||||
case 3:
|
case 3:
|
||||||
if (!MathMan.isInteger(args[2])) {
|
if (isInvalidPageNr(args[2])) {
|
||||||
player.sendMessage(
|
sendInvalidPageNrMsg(player);
|
||||||
TranslatableCaption.of("invalid.not_valid_number"),
|
|
||||||
TagResolver.resolver("value", Tag.inserting(Component.text("(1, ∞)")))
|
|
||||||
);
|
|
||||||
player.sendMessage(
|
|
||||||
TranslatableCaption.of("commandconfig.command_syntax"),
|
|
||||||
TagResolver.resolver("value", Tag.inserting(Component.text(getUsage())))
|
|
||||||
);
|
|
||||||
return CompletableFuture.completedFuture(false);
|
return CompletableFuture.completedFuture(false);
|
||||||
}
|
}
|
||||||
page = Integer.parseInt(args[2]);
|
page = getPageNr(args[2]);
|
||||||
// /p v <name> <area> [page]
|
// /p v <player> <area> [page]
|
||||||
// /p v <name> [page]
|
// /p v <player> [page]
|
||||||
case 2:
|
case 2:
|
||||||
if (page != Integer.MIN_VALUE || !MathMan.isInteger(args[1])) {
|
// If "case 3" is already through or the argument is not a page number:
|
||||||
|
// -> /p v <player> <area> [page]
|
||||||
|
if (page != Integer.MIN_VALUE || isInvalidPageNr(args[1])) {
|
||||||
sortByArea = this.plotAreaManager.getPlotAreaByString(args[1]);
|
sortByArea = this.plotAreaManager.getPlotAreaByString(args[1]);
|
||||||
if (sortByArea == null) {
|
if (sortByArea == null) {
|
||||||
player.sendMessage(
|
sendInvalidPageNrMsg(player);
|
||||||
TranslatableCaption.of("invalid.not_valid_number"),
|
|
||||||
TagResolver.resolver("value", Tag.inserting(Component.text("(1, ∞)")))
|
|
||||||
);
|
|
||||||
player.sendMessage(
|
|
||||||
TranslatableCaption.of("commandconfig.command_syntax"),
|
|
||||||
TagResolver.resolver("value", Tag.inserting(Component.text(getUsage())))
|
|
||||||
);
|
|
||||||
return CompletableFuture.completedFuture(false);
|
return CompletableFuture.completedFuture(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -249,16 +243,13 @@ public class Visit extends Command {
|
|||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
try {
|
// -> /p v <player> <page>
|
||||||
page = Integer.parseInt(args[1]);
|
if (isInvalidPageNr(args[1])) {
|
||||||
} catch (NumberFormatException ignored) {
|
sendInvalidPageNrMsg(player);
|
||||||
player.sendMessage(
|
|
||||||
TranslatableCaption.of("invalid.not_a_number"),
|
|
||||||
TagResolver.resolver("value", Tag.inserting(Component.text(args[1])))
|
|
||||||
);
|
|
||||||
return CompletableFuture.completedFuture(false);
|
return CompletableFuture.completedFuture(false);
|
||||||
}
|
}
|
||||||
// /p v <name> [page]
|
page = getPageNr(args[1]);
|
||||||
|
// /p v <player> [page]
|
||||||
// /p v <uuid> [page]
|
// /p v <uuid> [page]
|
||||||
// /p v <plot> [page]
|
// /p v <plot> [page]
|
||||||
// /p v <alias>
|
// /p v <alias>
|
||||||
@ -326,6 +317,35 @@ public class Visit extends Command {
|
|||||||
return CompletableFuture.completedFuture(true);
|
return CompletableFuture.completedFuture(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isInvalidPageNr(String arg) {
|
||||||
|
if (MathMan.isInteger(arg)) {
|
||||||
|
return false;
|
||||||
|
} else if (arg.equals("last") || arg.equals("n")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getPageNr(String arg) {
|
||||||
|
if (MathMan.isInteger(arg)) {
|
||||||
|
return Integer.parseInt(arg);
|
||||||
|
} else if (arg.equals("last") || arg.equals("n")) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return Integer.MIN_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendInvalidPageNrMsg(PlotPlayer<?> player) {
|
||||||
|
player.sendMessage(
|
||||||
|
TranslatableCaption.of("invalid.not_valid_number"),
|
||||||
|
TagResolver.resolver("value", Tag.inserting(Component.text("(1, ∞)")))
|
||||||
|
);
|
||||||
|
player.sendMessage(
|
||||||
|
TranslatableCaption.of("commandconfig.command_syntax"),
|
||||||
|
TagResolver.resolver("value", Tag.inserting(Component.text(getUsage())))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
|
public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
|
||||||
final List<Command> completions = new ArrayList<>();
|
final List<Command> completions = new ArrayList<>();
|
||||||
@ -334,6 +354,7 @@ public class Visit extends Command {
|
|||||||
case 1 -> {
|
case 1 -> {
|
||||||
completions.addAll(
|
completions.addAll(
|
||||||
TabCompletions.completeAreas(args[1]));
|
TabCompletions.completeAreas(args[1]));
|
||||||
|
completions.addAll(TabCompletions.asCompletions("last"));
|
||||||
if (args[1].isEmpty()) {
|
if (args[1].isEmpty()) {
|
||||||
// if no input is given, only suggest 1 - 3
|
// if no input is given, only suggest 1 - 3
|
||||||
completions.addAll(
|
completions.addAll(
|
||||||
@ -344,6 +365,7 @@ public class Visit extends Command {
|
|||||||
TabCompletions.completeNumbers(args[1], 10, 999));
|
TabCompletions.completeNumbers(args[1], 10, 999));
|
||||||
}
|
}
|
||||||
case 2 -> {
|
case 2 -> {
|
||||||
|
completions.addAll(TabCompletions.asCompletions("last"));
|
||||||
if (args[2].isEmpty()) {
|
if (args[2].isEmpty()) {
|
||||||
// if no input is given, only suggest 1 - 3
|
// if no input is given, only suggest 1 - 3
|
||||||
completions.addAll(
|
completions.addAll(
|
||||||
|
@ -206,7 +206,7 @@ public class ComponentPresetManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (componentPreset.cost() > 0.0D) {
|
if (componentPreset.cost() > 0.0D && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
|
||||||
if (!econHandler.isEnabled(plot.getArea())) {
|
if (!econHandler.isEnabled(plot.getArea())) {
|
||||||
getPlayer().sendMessage(
|
getPlayer().sendMessage(
|
||||||
TranslatableCaption.of("preset.economy_disabled"),
|
TranslatableCaption.of("preset.economy_disabled"),
|
||||||
|
@ -43,6 +43,11 @@ public class Settings extends Config {
|
|||||||
"Leave it off if you don't need it, it can spam your console."})
|
"Leave it off if you don't need it, it can spam your console."})
|
||||||
public static boolean DEBUG = true;
|
public static boolean DEBUG = true;
|
||||||
|
|
||||||
|
@Comment({"The activity of high-frequency event listener can be deactivated here to improve the server performance. ",
|
||||||
|
"Affected settings: 'redstone' settings here below. Affected flags: 'disable-physics', 'redstone'. ",
|
||||||
|
"Only deactivate this setting if you do not need any of the mentioned settings or flags."})
|
||||||
|
public static boolean HIGH_FREQUENCY_LISTENER = true;
|
||||||
|
|
||||||
@Create // This value will be generated automatically
|
@Create // This value will be generated automatically
|
||||||
public static ConfigBlock<Auto_Clear> AUTO_CLEAR = null;
|
public static ConfigBlock<Auto_Clear> AUTO_CLEAR = null;
|
||||||
// A ConfigBlock is a section that can have multiple instances e.g. multiple expiry tasks
|
// A ConfigBlock is a section that can have multiple instances e.g. multiple expiry tasks
|
||||||
@ -194,7 +199,7 @@ public class Settings extends Config {
|
|||||||
public List<String> WORLDS = new ArrayList<>(Collections.singletonList("*"));
|
public List<String> WORLDS = new ArrayList<>(Collections.singletonList("*"));
|
||||||
|
|
||||||
|
|
||||||
@Comment("See: https://intellectualsites.github.io/plotsquared-documentation/optimization/plot-analysis for a description of each value.")
|
@Comment("See: https://intellectualsites.gitbook.io/plotsquared/optimization/plot-analysis for a description of each value.")
|
||||||
public static final class CALIBRATION {
|
public static final class CALIBRATION {
|
||||||
|
|
||||||
public int VARIETY = 0;
|
public int VARIETY = 0;
|
||||||
@ -214,7 +219,7 @@ public class Settings extends Config {
|
|||||||
|
|
||||||
|
|
||||||
@Comment({"Chunk processor related settings",
|
@Comment({"Chunk processor related settings",
|
||||||
"See https://intellectualsites.github.io/plotsquared-documentation/optimization/chunk-processor for more information."})
|
"See https://intellectualsites.gitbook.io/plotsquared/optimization/chunk-processor for more information."})
|
||||||
public static class Chunk_Processor {
|
public static class Chunk_Processor {
|
||||||
|
|
||||||
@Comment("Auto trim will not save chunks which aren't claimed")
|
@Comment("Auto trim will not save chunks which aren't claimed")
|
||||||
@ -280,7 +285,7 @@ public class Settings extends Config {
|
|||||||
@Comment("Always show explosion Particles, even if explosion flag is set to false")
|
@Comment("Always show explosion Particles, even if explosion flag is set to false")
|
||||||
public static boolean ALWAYS_SHOW_EXPLOSIONS = false;
|
public static boolean ALWAYS_SHOW_EXPLOSIONS = false;
|
||||||
@Comment({"Blocks that may not be used in plot components",
|
@Comment({"Blocks that may not be used in plot components",
|
||||||
"Checkout the wiki article regarding plot components before modifying: https://intellectualsites.github.io/plotsquared-documentation/customization/plot-components"})
|
"Checkout the wiki article regarding plot components before modifying: https://intellectualsites.gitbook.io/plotsquared/customization/plot-components"})
|
||||||
public static List<String>
|
public static List<String>
|
||||||
INVALID_BLOCKS = Arrays.asList(
|
INVALID_BLOCKS = Arrays.asList(
|
||||||
// Acacia Stuff
|
// Acacia Stuff
|
||||||
@ -402,7 +407,7 @@ public class Settings extends Config {
|
|||||||
|
|
||||||
|
|
||||||
@Comment({"Schematic Settings",
|
@Comment({"Schematic Settings",
|
||||||
"See https://intellectualsites.github.io/plotsquared-documentation/schematics/schematic-on-claim for more information."})
|
"See https://intellectualsites.gitbook.io/plotsquared/schematics/schematic-on-claim for more information."})
|
||||||
public static final class Schematics {
|
public static final class Schematics {
|
||||||
|
|
||||||
@Comment(
|
@Comment(
|
||||||
@ -522,7 +527,7 @@ public class Settings extends Config {
|
|||||||
@Comment("Should the limit be global (over multiple worlds)")
|
@Comment("Should the limit be global (over multiple worlds)")
|
||||||
public static boolean GLOBAL =
|
public static boolean GLOBAL =
|
||||||
false;
|
false;
|
||||||
@Comment({"The max range of permissions to check for, e.g. plots.plot.127",
|
@Comment({"The max range of integer permissions to check for, e.g. 'plots.plot.127' or 'plots.set.flag.mob-cap.127'",
|
||||||
"The value covers the permission range to check, you need to assign the permission to players/groups still",
|
"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"})
|
"Modifying the value does NOT change the amount of plots players can claim"})
|
||||||
public static int MAX_PLOTS = 127;
|
public static int MAX_PLOTS = 127;
|
||||||
@ -531,7 +536,7 @@ public class Settings extends Config {
|
|||||||
|
|
||||||
|
|
||||||
@Comment({"Backup related settings",
|
@Comment({"Backup related settings",
|
||||||
"See https://intellectualsites.github.io/plotsquared-documentation/plot-backups for more information."})
|
"See https://intellectualsites.gitbook.io/plotsquared/plot-backups for more information."})
|
||||||
public static final class Backup {
|
public static final class Backup {
|
||||||
|
|
||||||
@Comment("Automatically backup plots when destructive commands are performed, e.g. /plot clear")
|
@Comment("Automatically backup plots when destructive commands are performed, e.g. /plot clear")
|
||||||
@ -723,6 +728,12 @@ public class Settings extends Config {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Comment("Settings related to flags")
|
||||||
|
public static final class Flags {
|
||||||
|
|
||||||
|
@Comment("If \"instabreak\" should consider the used tool.")
|
||||||
|
public static boolean INSTABREAK_CONSIDER_TOOL = false;
|
||||||
|
}
|
||||||
|
|
||||||
@Comment({"Enable or disable parts of the plugin",
|
@Comment({"Enable or disable parts of the plugin",
|
||||||
"Note: A cache will use some memory if enabled"})
|
"Note: A cache will use some memory if enabled"})
|
||||||
@ -783,7 +794,7 @@ public class Settings extends Config {
|
|||||||
public static boolean
|
public static boolean
|
||||||
PERSISTENT_ROAD_REGEN = true;
|
PERSISTENT_ROAD_REGEN = true;
|
||||||
@Comment({"Enable the `/plot component` preset GUI",
|
@Comment({"Enable the `/plot component` preset GUI",
|
||||||
"Read more about components here: https://intellectualsites.github.io/plotsquared-documentation/customization/plot-components"})
|
"Read more about components here: https://intellectualsites.gitbook.io/plotsquared/customization/plot-components"})
|
||||||
public static boolean COMPONENT_PRESETS = true;
|
public static boolean COMPONENT_PRESETS = true;
|
||||||
@Comment("Enable per user locale")
|
@Comment("Enable per user locale")
|
||||||
public static boolean PER_USER_LOCALE = false;
|
public static boolean PER_USER_LOCALE = false;
|
||||||
|
@ -44,4 +44,6 @@ public interface Caption {
|
|||||||
*/
|
*/
|
||||||
@NonNull Component toComponent(@NonNull LocaleHolder localeHolder);
|
@NonNull Component toComponent(@NonNull LocaleHolder localeHolder);
|
||||||
|
|
||||||
|
@NonNull String toString();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -51,4 +51,9 @@ public final class StaticCaption implements Caption {
|
|||||||
return MiniMessage.miniMessage().deserialize(this.value);
|
return MiniMessage.miniMessage().deserialize(this.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NonNull String toString() {
|
||||||
|
return "StaticCaption(" + value + ")";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ import net.kyori.adventure.text.minimessage.MiniMessage;
|
|||||||
import net.kyori.adventure.text.minimessage.tag.Tag;
|
import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@ -132,4 +133,9 @@ public final class TranslatableCaption implements NamespacedCaption {
|
|||||||
return Objects.hashCode(this.getNamespace(), this.getKey());
|
return Objects.hashCode(this.getNamespace(), this.getKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull String toString() {
|
||||||
|
return "TranslatableCaption(" + getNamespace() + ":" + getKey() + ")";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -130,6 +130,7 @@ public class SQLManager implements AbstractDB {
|
|||||||
public volatile ConcurrentHashMap<PlotCluster, Queue<UniqueStatement>> clusterTasks;
|
public volatile ConcurrentHashMap<PlotCluster, Queue<UniqueStatement>> clusterTasks;
|
||||||
// Private
|
// Private
|
||||||
private Connection connection;
|
private Connection connection;
|
||||||
|
private boolean supportsGetGeneratedKeys;
|
||||||
private boolean closed = false;
|
private boolean closed = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -154,6 +155,8 @@ public class SQLManager implements AbstractDB {
|
|||||||
this.worldConfiguration = worldConfiguration;
|
this.worldConfiguration = worldConfiguration;
|
||||||
this.database = database;
|
this.database = database;
|
||||||
this.connection = database.openConnection();
|
this.connection = database.openConnection();
|
||||||
|
final DatabaseMetaData databaseMetaData = this.connection.getMetaData();
|
||||||
|
this.supportsGetGeneratedKeys = databaseMetaData.supportsGetGeneratedKeys();
|
||||||
this.mySQL = database instanceof MySQL;
|
this.mySQL = database instanceof MySQL;
|
||||||
this.globalTasks = new ConcurrentLinkedQueue<>();
|
this.globalTasks = new ConcurrentLinkedQueue<>();
|
||||||
this.notifyTasks = new ConcurrentLinkedQueue<>();
|
this.notifyTasks = new ConcurrentLinkedQueue<>();
|
||||||
@ -161,6 +164,14 @@ public class SQLManager implements AbstractDB {
|
|||||||
this.playerTasks = new ConcurrentHashMap<>();
|
this.playerTasks = new ConcurrentHashMap<>();
|
||||||
this.clusterTasks = new ConcurrentHashMap<>();
|
this.clusterTasks = new ConcurrentHashMap<>();
|
||||||
this.prefix = prefix;
|
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
|
this.SET_OWNER = "UPDATE `" + this.prefix
|
||||||
+ "plot` SET `owner` = ? WHERE `plot_id_x` = ? AND `plot_id_z` = ? AND `world` = ?";
|
+ "plot` SET `owner` = ? WHERE `plot_id_x` = ? AND `plot_id_z` = ? AND `world` = ?";
|
||||||
this.GET_ALL_PLOTS =
|
this.GET_ALL_PLOTS =
|
||||||
@ -171,20 +182,32 @@ public class SQLManager implements AbstractDB {
|
|||||||
"INSERT INTO `" + this.prefix + "plot_settings` (`plot_plot_id`) values ";
|
"INSERT INTO `" + this.prefix + "plot_settings` (`plot_plot_id`) values ";
|
||||||
this.CREATE_TIERS =
|
this.CREATE_TIERS =
|
||||||
"INSERT INTO `" + this.prefix + "plot_%tier%` (`plot_plot_id`, `user_uuid`) values ";
|
"INSERT INTO `" + this.prefix + "plot_%tier%` (`plot_plot_id`, `user_uuid`) values ";
|
||||||
this.CREATE_PLOT = "INSERT INTO `" + this.prefix
|
String tempCreatePlot = "INSERT INTO `" + this.prefix
|
||||||
+ "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) VALUES(?, ?, ?, ?, ?)";
|
+ "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) VALUES(?, ?, ?, ?, ?)";
|
||||||
|
if (!supportsGetGeneratedKeys) {
|
||||||
|
tempCreatePlot += " RETURNING `id`";
|
||||||
|
}
|
||||||
|
this.CREATE_PLOT = tempCreatePlot;
|
||||||
if (mySQL) {
|
if (mySQL) {
|
||||||
this.CREATE_PLOT_SAFE = "INSERT IGNORE INTO `" + this.prefix
|
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 `"
|
+ "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` = ?)";
|
+ this.prefix + "plot` WHERE `world` = ? AND `plot_id_x` = ? AND `plot_id_z` = ?)";
|
||||||
} else {
|
} else {
|
||||||
this.CREATE_PLOT_SAFE = "INSERT INTO `" + this.prefix
|
String tempCreatePlotSafe = "INSERT INTO `" + this.prefix
|
||||||
+ "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) SELECT ?, ?, ?, ?, ? WHERE NOT EXISTS (SELECT null FROM `"
|
+ "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` = ?)";
|
+ this.prefix + "plot` WHERE `world` = ? AND `plot_id_x` = ? AND `plot_id_z` = ?)";
|
||||||
|
if (!supportsGetGeneratedKeys) {
|
||||||
|
tempCreatePlotSafe += " RETURNING `id`";
|
||||||
|
}
|
||||||
|
this.CREATE_PLOT_SAFE = tempCreatePlotSafe;
|
||||||
}
|
}
|
||||||
this.CREATE_CLUSTER = "INSERT INTO `" + this.prefix
|
String tempCreateCluster = "INSERT INTO `" + this.prefix
|
||||||
+ "cluster`(`pos1_x`, `pos1_z`, `pos2_x`, `pos2_z`, `owner`, `world`) VALUES(?, ?, ?, ?, ?, ?)";
|
+ "cluster`(`pos1_x`, `pos1_z`, `pos2_x`, `pos2_z`, `owner`, `world`) VALUES(?, ?, ?, ?, ?, ?)";
|
||||||
|
if (!supportsGetGeneratedKeys) {
|
||||||
|
tempCreateCluster += " RETURNING `id`";
|
||||||
|
}
|
||||||
|
this.CREATE_CLUSTER = tempCreateCluster;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
createTables();
|
createTables();
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
@ -1073,9 +1096,8 @@ public class SQLManager implements AbstractDB {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addBatch(PreparedStatement statement) throws SQLException {
|
public void addBatch(PreparedStatement statement) throws SQLException {
|
||||||
int inserted = statement.executeUpdate();
|
if (statement.execute() || statement.getUpdateCount() > 0) {
|
||||||
if (inserted > 0) {
|
try (ResultSet keys = supportsGetGeneratedKeys ? statement.getGeneratedKeys() : statement.getResultSet()) {
|
||||||
try (ResultSet keys = statement.getGeneratedKeys()) {
|
|
||||||
if (keys.next()) {
|
if (keys.next()) {
|
||||||
plot.temp = keys.getInt(1);
|
plot.temp = keys.getInt(1);
|
||||||
addPlotTask(plot, new UniqueStatement(
|
addPlotTask(plot, new UniqueStatement(
|
||||||
@ -1145,8 +1167,8 @@ public class SQLManager implements AbstractDB {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addBatch(PreparedStatement statement) throws SQLException {
|
public void addBatch(PreparedStatement statement) throws SQLException {
|
||||||
statement.executeUpdate();
|
statement.execute();
|
||||||
try (ResultSet keys = statement.getGeneratedKeys()) {
|
try (ResultSet keys = supportsGetGeneratedKeys ? statement.getGeneratedKeys() : statement.getResultSet()) {
|
||||||
if (keys.next()) {
|
if (keys.next()) {
|
||||||
plot.temp = keys.getInt(1);
|
plot.temp = keys.getInt(1);
|
||||||
}
|
}
|
||||||
@ -2379,7 +2401,8 @@ public class SQLManager implements AbstractDB {
|
|||||||
addPlotTask(plot, new UniqueStatement("setPosition") {
|
addPlotTask(plot, new UniqueStatement("setPosition") {
|
||||||
@Override
|
@Override
|
||||||
public void set(PreparedStatement statement) throws SQLException {
|
public void set(PreparedStatement statement) throws SQLException {
|
||||||
statement.setString(1, position == null ? "" : position);
|
// Please see the table creation statement. There is the default value of "default"
|
||||||
|
statement.setString(1, position == null ? "DEFAULT" : position);
|
||||||
statement.setInt(2, getId(plot));
|
statement.setInt(2, getId(plot));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3058,8 +3081,8 @@ public class SQLManager implements AbstractDB {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addBatch(PreparedStatement statement) throws SQLException {
|
public void addBatch(PreparedStatement statement) throws SQLException {
|
||||||
statement.executeUpdate();
|
statement.execute();
|
||||||
try (ResultSet keys = statement.getGeneratedKeys()) {
|
try (ResultSet keys = supportsGetGeneratedKeys ? statement.getGeneratedKeys() : statement.getResultSet()) {
|
||||||
if (keys.next()) {
|
if (keys.next()) {
|
||||||
cluster.temp = keys.getInt(1);
|
cluster.temp = keys.getInt(1);
|
||||||
}
|
}
|
||||||
|
@ -18,17 +18,34 @@
|
|||||||
*/
|
*/
|
||||||
package com.plotsquared.core.events;
|
package com.plotsquared.core.events;
|
||||||
|
|
||||||
|
|
||||||
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PlotSquared event with {@link Result} to cancel, force, or allow.
|
* PlotSquared event with {@link Result} to cancel, force, or allow.
|
||||||
*/
|
*/
|
||||||
public interface CancellablePlotEvent {
|
public interface CancellablePlotEvent {
|
||||||
|
|
||||||
Result getEventResult();
|
/**
|
||||||
|
* The currently set {@link Result} for this event (as set by potential previous event listeners).
|
||||||
|
*
|
||||||
|
* @return the current result.
|
||||||
|
*/
|
||||||
|
@Nullable Result getEventResult();
|
||||||
|
|
||||||
void setEventResult(Result eventResult);
|
/**
|
||||||
|
* Set the {@link Result} for this event.
|
||||||
|
*
|
||||||
|
* @param eventResult the new result.
|
||||||
|
*/
|
||||||
|
void setEventResult(@Nullable Result eventResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated No usage and not null-safe
|
||||||
|
*/
|
||||||
|
@Deprecated(since = "7.3.2")
|
||||||
default int getEventResultRaw() {
|
default int getEventResultRaw() {
|
||||||
return getEventResult().getValue();
|
return getEventResult() != null ? getEventResult().getValue() : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* PlotSquared, a land and world management plugin for Minecraft.
|
||||||
|
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
||||||
|
* Copyright (C) IntellectualSites team and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.plotsquared.core.events;
|
||||||
|
|
||||||
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
|
import com.plotsquared.core.plot.Plot;
|
||||||
|
import org.checkerframework.checker.index.qual.NonNegative;
|
||||||
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a user attempts to buy a plot.
|
||||||
|
* <p>
|
||||||
|
* Setting the {@link #setEventResult(Result) Result} to {@link Result#FORCE} ignores the price and players account balance and does not charge the
|
||||||
|
* player anything. {@link Result#DENY} blocks the purchase completely, {@link Result#ACCEPT} and {@code null} do not modify
|
||||||
|
* the behaviour.
|
||||||
|
* <p>
|
||||||
|
* Setting the {@link #setPrice(double) price} to {@code 0} makes the plot practically free.
|
||||||
|
*
|
||||||
|
* @since 7.3.2
|
||||||
|
*/
|
||||||
|
public class PlayerBuyPlotEvent extends PlotPlayerEvent implements CancellablePlotEvent {
|
||||||
|
|
||||||
|
private Result result;
|
||||||
|
private double price;
|
||||||
|
|
||||||
|
public PlayerBuyPlotEvent(final PlotPlayer<?> plotPlayer, final Plot plot, @NonNegative final double price) {
|
||||||
|
super(plotPlayer, plot);
|
||||||
|
this.price = price;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the price required to buy the plot.
|
||||||
|
*
|
||||||
|
* @param price the new price.
|
||||||
|
* @since 7.3.2
|
||||||
|
*/
|
||||||
|
public void setPrice(@NonNegative final double price) {
|
||||||
|
//noinspection ConstantValue - the annotation does not ensure a non-negative runtime value
|
||||||
|
if (price < 0) {
|
||||||
|
throw new IllegalArgumentException("price must be non-negative");
|
||||||
|
}
|
||||||
|
this.price = price;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the currently set price required to buy the plot.
|
||||||
|
*
|
||||||
|
* @return the price.
|
||||||
|
* @since 7.3.2
|
||||||
|
*/
|
||||||
|
public @NonNegative double price() {
|
||||||
|
return price;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setEventResult(@Nullable final Result eventResult) {
|
||||||
|
this.result = eventResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public @Nullable Result getEventResult() {
|
||||||
|
return this.result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -24,7 +24,7 @@ import com.plotsquared.core.plot.Plot;
|
|||||||
public class PlayerEnterPlotEvent extends PlotPlayerEvent {
|
public class PlayerEnterPlotEvent extends PlotPlayerEvent {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a player leaves a plot.
|
* PlayerEnterPlotEvent: Called when a player enters a plot
|
||||||
*
|
*
|
||||||
* @param player Player that entered the plot
|
* @param player Player that entered the plot
|
||||||
* @param plot Plot that was entered
|
* @param plot Plot that was entered
|
||||||
|
@ -0,0 +1,77 @@
|
|||||||
|
/*
|
||||||
|
* PlotSquared, a land and world management plugin for Minecraft.
|
||||||
|
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
||||||
|
* Copyright (C) IntellectualSites team and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.plotsquared.core.events;
|
||||||
|
|
||||||
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
|
import org.checkerframework.checker.index.qual.NonNegative;
|
||||||
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called every time after PlotSquared calculated a players plot limit based on their permission.
|
||||||
|
* <p>
|
||||||
|
* May be used to grant a player more plots based on another rank or bought feature.
|
||||||
|
*
|
||||||
|
* @since 7.3.0
|
||||||
|
*/
|
||||||
|
public class PlayerPlotLimitEvent {
|
||||||
|
|
||||||
|
private final PlotPlayer<?> player;
|
||||||
|
|
||||||
|
private int limit;
|
||||||
|
|
||||||
|
public PlayerPlotLimitEvent(@NonNull final PlotPlayer<?> player, @NonNegative final int limit) {
|
||||||
|
this.player = player;
|
||||||
|
this.limit = limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overrides the previously calculated or set plot limit for {@link #player()}.
|
||||||
|
*
|
||||||
|
* @param limit The amount of plots a player may claim. Must be {@code 0} or greater.
|
||||||
|
* @since 7.3.0
|
||||||
|
*/
|
||||||
|
public void limit(@NonNegative final int limit) {
|
||||||
|
if (limit < 0) {
|
||||||
|
throw new IllegalArgumentException("Player plot limit must be greater or equal 0");
|
||||||
|
}
|
||||||
|
this.limit = limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the previous set limit, if none was overridden before this event handler the default limit based on the players
|
||||||
|
* permissions node is returned.
|
||||||
|
*
|
||||||
|
* @return The currently defined plot limit of this player.
|
||||||
|
* @since 7.3.0
|
||||||
|
*/
|
||||||
|
public @NonNegative int limit() {
|
||||||
|
return limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The player for which the limit is queried.
|
||||||
|
*
|
||||||
|
* @return the player.
|
||||||
|
* @since 7.3.0
|
||||||
|
*/
|
||||||
|
public @NonNull PlotPlayer<?> player() {
|
||||||
|
return player;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -21,21 +21,26 @@ package com.plotsquared.core.events;
|
|||||||
import com.plotsquared.core.location.Location;
|
import com.plotsquared.core.location.Location;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
|
import java.util.function.UnaryOperator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a player teleports to a plot
|
* Called when a player teleports to a plot
|
||||||
*/
|
*/
|
||||||
public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements CancellablePlotEvent {
|
public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements CancellablePlotEvent {
|
||||||
|
|
||||||
private final Location from;
|
|
||||||
private final TeleportCause cause;
|
private final TeleportCause cause;
|
||||||
private Result eventResult;
|
private Result eventResult;
|
||||||
|
private final Location from;
|
||||||
|
private UnaryOperator<Location> locationTransformer;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PlayerTeleportToPlotEvent: Called when a player teleports to a plot
|
* PlayerTeleportToPlotEvent: Called when a player teleports to a plot
|
||||||
*
|
*
|
||||||
* @param player That was teleported
|
* @param player That was teleported
|
||||||
* @param from Start location
|
* @param from The origin location, from where the teleport was triggered (players location most likely)
|
||||||
* @param plot Plot to which the player was teleported
|
* @param plot Plot to which the player was teleported
|
||||||
* @param cause Why the teleport is being completed
|
* @param cause Why the teleport is being completed
|
||||||
* @since 6.1.0
|
* @since 6.1.0
|
||||||
@ -57,7 +62,8 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the from location
|
* Get the location, from where the teleport was triggered
|
||||||
|
* (the players current location when executing the home command for example)
|
||||||
*
|
*
|
||||||
* @return Location
|
* @return Location
|
||||||
*/
|
*/
|
||||||
@ -65,6 +71,27 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
|
|||||||
return this.from;
|
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
|
@Override
|
||||||
public Result getEventResult() {
|
public Result getEventResult() {
|
||||||
return eventResult;
|
return eventResult;
|
||||||
|
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* PlotSquared, a land and world management plugin for Minecraft.
|
||||||
|
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
||||||
|
* Copyright (C) IntellectualSites team and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.plotsquared.core.events.post;
|
||||||
|
|
||||||
|
import com.plotsquared.core.events.PlotPlayerEvent;
|
||||||
|
import com.plotsquared.core.player.OfflinePlotPlayer;
|
||||||
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
|
import com.plotsquared.core.plot.Plot;
|
||||||
|
import org.checkerframework.checker.index.qual.NonNegative;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called after a player has successfully bought a plot.
|
||||||
|
*
|
||||||
|
* @since 7.3.2
|
||||||
|
*/
|
||||||
|
public class PostPlayerBuyPlotEvent extends PlotPlayerEvent {
|
||||||
|
|
||||||
|
private final OfflinePlotPlayer previousOwner;
|
||||||
|
private final double price;
|
||||||
|
|
||||||
|
public PostPlayerBuyPlotEvent(
|
||||||
|
final PlotPlayer<?> plotPlayer, final OfflinePlotPlayer previousOwner, final Plot plot,
|
||||||
|
@NonNegative final double price
|
||||||
|
) {
|
||||||
|
super(plotPlayer, plot);
|
||||||
|
this.previousOwner = previousOwner;
|
||||||
|
this.price = price;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The previous owner of the bought plot.
|
||||||
|
*
|
||||||
|
* @return the previous owner.
|
||||||
|
*/
|
||||||
|
public OfflinePlotPlayer previousOwner() {
|
||||||
|
return previousOwner;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the price after potential modifications by {@link com.plotsquared.core.events.PlayerBuyPlotEvent}.
|
||||||
|
*
|
||||||
|
* @return the price the player had to pay to buy the plot.
|
||||||
|
*/
|
||||||
|
public double price() {
|
||||||
|
return price;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* PlotSquared, a land and world management plugin for Minecraft.
|
||||||
|
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
||||||
|
* Copyright (C) IntellectualSites team and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.plotsquared.core.events.post;
|
||||||
|
|
||||||
|
import com.plotsquared.core.events.PlotPlayerEvent;
|
||||||
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
|
import com.plotsquared.core.plot.Plot;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called after a {@link Plot} was cleared.
|
||||||
|
*
|
||||||
|
* @since 7.3.2
|
||||||
|
*/
|
||||||
|
public class PostPlotClearEvent extends PlotPlayerEvent {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiate a new PostPlotClearEvent.
|
||||||
|
*
|
||||||
|
* @param plotPlayer The {@link PlotPlayer} that initiated the clear.
|
||||||
|
* @param plot The clearing plot.
|
||||||
|
*/
|
||||||
|
public PostPlotClearEvent(final PlotPlayer<?> plotPlayer, final Plot plot) {
|
||||||
|
super(plotPlayer, plot);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -143,7 +143,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
classicPlotWorld,
|
classicPlotWorld,
|
||||||
plot.getRegions(),
|
plot.getRegions(),
|
||||||
blocks,
|
blocks,
|
||||||
classicPlotWorld.getMinBuildHeight(),
|
classicPlotWorld.getMinComponentHeight(),
|
||||||
classicPlotWorld.getMaxBuildHeight() - 1,
|
classicPlotWorld.getMaxBuildHeight() - 1,
|
||||||
actor,
|
actor,
|
||||||
queue
|
queue
|
||||||
@ -204,7 +204,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
classicPlotWorld,
|
classicPlotWorld,
|
||||||
plot.getRegions(),
|
plot.getRegions(),
|
||||||
blocks,
|
blocks,
|
||||||
classicPlotWorld.getMinBuildHeight(),
|
classicPlotWorld.getMinComponentHeight(),
|
||||||
classicPlotWorld.PLOT_HEIGHT - 1,
|
classicPlotWorld.PLOT_HEIGHT - 1,
|
||||||
actor,
|
actor,
|
||||||
queue
|
queue
|
||||||
@ -379,7 +379,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int yStart = classicPlotWorld.getMinBuildHeight() + (classicPlotWorld.PLOT_BEDROCK ? 1 : 0);
|
int yStart = classicPlotWorld.getMinComponentHeight();
|
||||||
if (!plot.isMerged(Direction.NORTH)) {
|
if (!plot.isMerged(Direction.NORTH)) {
|
||||||
int z = bot.getZ();
|
int z = bot.getZ();
|
||||||
for (int x = bot.getX(); x < top.getX(); x++) {
|
for (int x = bot.getX(); x < top.getX(); x++) {
|
||||||
|
@ -52,6 +52,7 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
|
|||||||
public BlockBucket ROAD_BLOCK = new BlockBucket(BlockTypes.QUARTZ_BLOCK);
|
public BlockBucket ROAD_BLOCK = new BlockBucket(BlockTypes.QUARTZ_BLOCK);
|
||||||
public boolean PLOT_BEDROCK = true;
|
public boolean PLOT_BEDROCK = true;
|
||||||
public boolean PLACE_TOP_BLOCK = true;
|
public boolean PLACE_TOP_BLOCK = true;
|
||||||
|
public boolean COMPONENT_BELOW_BEDROCK = false;
|
||||||
|
|
||||||
public ClassicPlotWorld(
|
public ClassicPlotWorld(
|
||||||
final @NonNull String worldName,
|
final @NonNull String worldName,
|
||||||
@ -129,6 +130,9 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
|
|||||||
),
|
),
|
||||||
new ConfigurationNode("plot.bedrock", this.PLOT_BEDROCK, TranslatableCaption.of("setup.bedrock_boolean"),
|
new ConfigurationNode("plot.bedrock", this.PLOT_BEDROCK, TranslatableCaption.of("setup.bedrock_boolean"),
|
||||||
ConfigurationUtil.BOOLEAN
|
ConfigurationUtil.BOOLEAN
|
||||||
|
),
|
||||||
|
new ConfigurationNode("world.component_below_bedrock", this.COMPONENT_BELOW_BEDROCK, TranslatableCaption.of(
|
||||||
|
"setup.component_below_bedrock_boolean"), ConfigurationUtil.BOOLEAN
|
||||||
)};
|
)};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -150,6 +154,14 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
|
|||||||
this.PLACE_TOP_BLOCK = config.getBoolean("wall.place_top_block");
|
this.PLACE_TOP_BLOCK = config.getBoolean("wall.place_top_block");
|
||||||
this.WALL_HEIGHT = Math.min(getMaxGenHeight() - (PLACE_TOP_BLOCK ? 1 : 0), config.getInt("wall.height"));
|
this.WALL_HEIGHT = Math.min(getMaxGenHeight() - (PLACE_TOP_BLOCK ? 1 : 0), config.getInt("wall.height"));
|
||||||
this.CLAIMED_WALL_BLOCK = createCheckedBlockBucket(config.getString("wall.block_claimed"), CLAIMED_WALL_BLOCK);
|
this.CLAIMED_WALL_BLOCK = createCheckedBlockBucket(config.getString("wall.block_claimed"), CLAIMED_WALL_BLOCK);
|
||||||
|
this.COMPONENT_BELOW_BEDROCK = config.getBoolean("world.component_below_bedrock");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMinComponentHeight() {
|
||||||
|
return COMPONENT_BELOW_BEDROCK && getMinGenHeight() >= getMinBuildHeight()
|
||||||
|
? getMinGenHeight() + (PLOT_BEDROCK ? 1 : 0)
|
||||||
|
: getMinBuildHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
int schematicStartHeight() {
|
int schematicStartHeight() {
|
||||||
|
@ -189,7 +189,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
}
|
}
|
||||||
Object value;
|
Object value;
|
||||||
try {
|
try {
|
||||||
final boolean accessible = field.isAccessible();
|
final boolean accessible = field.canAccess(this);
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
value = field.get(this);
|
value = field.get(this);
|
||||||
field.setAccessible(accessible);
|
field.setAccessible(accessible);
|
||||||
@ -265,7 +265,6 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
|
|
||||||
int worldGenHeight = getMaxGenHeight() - getMinGenHeight() + 1;
|
int worldGenHeight = getMaxGenHeight() - getMinGenHeight() + 1;
|
||||||
|
|
||||||
int maxSchematicHeight = 0;
|
|
||||||
int plotSchemHeight = 0;
|
int plotSchemHeight = 0;
|
||||||
|
|
||||||
// SCHEM_Y should be normalised to the plot "start" height
|
// SCHEM_Y should be normalised to the plot "start" height
|
||||||
@ -275,49 +274,41 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
SCHEM_Y = getMinGenHeight();
|
SCHEM_Y = getMinGenHeight();
|
||||||
plotY = 0;
|
plotY = 0;
|
||||||
} else if (!Settings.Schematics.PASTE_ON_TOP) {
|
} else if (!Settings.Schematics.PASTE_ON_TOP) {
|
||||||
SCHEM_Y = getMinBuildHeight();
|
SCHEM_Y = getMinGenHeight();
|
||||||
plotY = 0;
|
plotY = 0;
|
||||||
}
|
}
|
||||||
maxSchematicHeight = plotY + plotSchemHeight;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int roadSchemHeight;
|
int roadSchemHeight = 0;
|
||||||
|
|
||||||
if (schematic1 != null) {
|
if (schematic1 != null) {
|
||||||
roadSchemHeight = Math.max(
|
roadSchemHeight = Math.max(
|
||||||
schematic1.getClipboard().getDimensions().getY(),
|
schematic1.getClipboard().getDimensions().getY(),
|
||||||
schematic2.getClipboard().getDimensions().getY()
|
schematic2.getClipboard().getDimensions().getY()
|
||||||
);
|
);
|
||||||
maxSchematicHeight = Math.max(roadSchemHeight, maxSchematicHeight);
|
if (roadSchemHeight == worldGenHeight) {
|
||||||
if (maxSchematicHeight == worldGenHeight) {
|
|
||||||
SCHEM_Y = getMinGenHeight();
|
SCHEM_Y = getMinGenHeight();
|
||||||
roadY = 0; // Road is the lowest schematic
|
roadY = 0; // Road is the lowest schematic
|
||||||
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldGenHeight) {
|
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldGenHeight) {
|
||||||
// Road is the lowest schematic. Normalize plotY to it.
|
// Road is the lowest schematic. Normalize plotY to it.
|
||||||
if (Settings.Schematics.PASTE_ON_TOP) {
|
if (Settings.Schematics.PASTE_ON_TOP) {
|
||||||
plotY = PLOT_HEIGHT - getMinGenHeight();
|
plotY = PLOT_HEIGHT - getMinGenHeight();
|
||||||
} else {
|
|
||||||
plotY = getMinBuildHeight() - getMinGenHeight();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (!Settings.Schematics.PASTE_ROAD_ON_TOP) {
|
} else if (!Settings.Schematics.PASTE_ROAD_ON_TOP) {
|
||||||
if (SCHEM_Y == getMinGenHeight()) { // Only possible if plot schematic is enabled
|
roadY = 0;
|
||||||
// Plot is still the lowest schematic, normalize roadY to it
|
SCHEM_Y = getMinGenHeight();
|
||||||
roadY = getMinBuildHeight() - getMinGenHeight();
|
if (schematic3 != null) {
|
||||||
} else if (schematic3 != null) {
|
|
||||||
SCHEM_Y = getMinBuildHeight();
|
|
||||||
roadY = 0;// Road is the lowest schematic
|
|
||||||
if (Settings.Schematics.PASTE_ON_TOP) {
|
if (Settings.Schematics.PASTE_ON_TOP) {
|
||||||
// Road is the lowest schematic. Normalize plotY to it.
|
// Road is the lowest schematic. Normalize plotY to it.
|
||||||
plotY = PLOT_HEIGHT - getMinBuildHeight();
|
plotY = PLOT_HEIGHT - SCHEM_Y;
|
||||||
}
|
}
|
||||||
maxSchematicHeight = Math.max(maxSchematicHeight, plotY + plotSchemHeight);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
roadY = minRoadWall - SCHEM_Y;
|
roadY = minRoadWall - SCHEM_Y;
|
||||||
maxSchematicHeight = Math.max(maxSchematicHeight, roadY + roadSchemHeight);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
int maxSchematicHeight = Math.max(plotY + plotSchemHeight, roadY + roadSchemHeight);
|
||||||
|
|
||||||
if (schematic3 != null) {
|
if (schematic3 != null) {
|
||||||
this.PLOT_SCHEMATIC = true;
|
this.PLOT_SCHEMATIC = true;
|
||||||
@ -562,7 +553,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
* Get the y value where the plot schematic should be pasted from.
|
* Get the y value where the plot schematic should be pasted from.
|
||||||
*
|
*
|
||||||
* @return plot schematic y start value
|
* @return plot schematic y start value
|
||||||
* @since TODO
|
* @since 7.0.0
|
||||||
*/
|
*/
|
||||||
public int getPlotYStart() {
|
public int getPlotYStart() {
|
||||||
return SCHEM_Y + plotY;
|
return SCHEM_Y + plotY;
|
||||||
@ -572,7 +563,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
* Get the y value where the road schematic should be pasted from.
|
* Get the y value where the road schematic should be pasted from.
|
||||||
*
|
*
|
||||||
* @return road schematic y start value
|
* @return road schematic y start value
|
||||||
* @since TODO
|
* @since 7.0.0
|
||||||
*/
|
*/
|
||||||
public int getRoadYStart() {
|
public int getRoadYStart() {
|
||||||
return SCHEM_Y + roadY;
|
return SCHEM_Y + roadY;
|
||||||
|
@ -77,6 +77,10 @@ public class HybridUtils {
|
|||||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + HybridUtils.class.getSimpleName());
|
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + HybridUtils.class.getSimpleName());
|
||||||
private static final BlockState AIR = BlockTypes.AIR.getDefaultState();
|
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 HybridUtils manager;
|
||||||
public static Set<BlockVector2> regions;
|
public static Set<BlockVector2> regions;
|
||||||
public static int height;
|
public static int height;
|
||||||
@ -529,7 +533,7 @@ public class HybridUtils {
|
|||||||
Math.min(plotworld.PLOT_HEIGHT, Math.min(plotworld.WALL_HEIGHT, plotworld.ROAD_HEIGHT)) : plotworld.ROAD_HEIGHT;
|
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 sx = bot.getX() - plotworld.ROAD_WIDTH + 1;
|
||||||
int sz = bot.getZ() + 1;
|
int sz = bot.getZ() + 1;
|
||||||
int sy = Settings.Schematics.PASTE_ROAD_ON_TOP ? schemY : plot.getArea().getMinBuildHeight();
|
int sy = Settings.Schematics.PASTE_ROAD_ON_TOP ? schemY : plot.getArea().getMinGenHeight();
|
||||||
int ex = bot.getX();
|
int ex = bot.getX();
|
||||||
int ez = top.getZ();
|
int ez = top.getZ();
|
||||||
int ey = get_ey(plotworld, queue, sx, ex, sz, ez, sy);
|
int ey = get_ey(plotworld, queue, sx, ex, sz, ez, sy);
|
||||||
|
@ -55,7 +55,6 @@ import com.plotsquared.core.plot.flag.implementations.TitlesFlag;
|
|||||||
import com.plotsquared.core.plot.flag.implementations.WeatherFlag;
|
import com.plotsquared.core.plot.flag.implementations.WeatherFlag;
|
||||||
import com.plotsquared.core.plot.flag.types.TimedFlag;
|
import com.plotsquared.core.plot.flag.types.TimedFlag;
|
||||||
import com.plotsquared.core.util.EventDispatcher;
|
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.TaskManager;
|
||||||
import com.plotsquared.core.util.task.TaskTime;
|
import com.plotsquared.core.util.task.TaskTime;
|
||||||
import com.sk89q.worldedit.world.gamemode.GameMode;
|
import com.sk89q.worldedit.world.gamemode.GameMode;
|
||||||
@ -63,7 +62,6 @@ import com.sk89q.worldedit.world.gamemode.GameModes;
|
|||||||
import com.sk89q.worldedit.world.item.ItemType;
|
import com.sk89q.worldedit.world.item.ItemType;
|
||||||
import com.sk89q.worldedit.world.item.ItemTypes;
|
import com.sk89q.worldedit.world.item.ItemTypes;
|
||||||
import net.kyori.adventure.text.Component;
|
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.MiniMessage;
|
||||||
import net.kyori.adventure.text.minimessage.tag.Tag;
|
import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||||
@ -77,6 +75,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
public class PlotListener {
|
public class PlotListener {
|
||||||
|
|
||||||
@ -107,6 +106,10 @@ public class PlotListener {
|
|||||||
iterator.remove();
|
iterator.remove();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
// Don't attempt to heal dead players - they will get stuck in the abyss (#4406)
|
||||||
|
if (PlotSquared.platform().worldUtil().getHealth(player) <= 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
double level = PlotSquared.platform().worldUtil().getHealth(player);
|
double level = PlotSquared.platform().worldUtil().getHealth(player);
|
||||||
if (level != value.max) {
|
if (level != value.max) {
|
||||||
PlotSquared.platform().worldUtil().setHealth(player, Math.min(level + value.amount, value.max));
|
PlotSquared.platform().worldUtil().setHealth(player, Math.min(level + value.amount, value.max));
|
||||||
@ -321,22 +324,27 @@ public class PlotListener {
|
|||||||
}
|
}
|
||||||
if ((lastPlot != null) && plot.getId().equals(lastPlot.getId()) && plot.hasOwner()) {
|
if ((lastPlot != null) && plot.getId().equals(lastPlot.getId()) && plot.hasOwner()) {
|
||||||
final UUID plotOwner = plot.getOwnerAbs();
|
final UUID plotOwner = plot.getOwnerAbs();
|
||||||
ComponentLike owner = PlayerManager.resolveName(plotOwner, true).toComponent(player);
|
|
||||||
Caption header = fromFlag ? StaticCaption.of(title) : TranslatableCaption.of("titles" +
|
Caption header = fromFlag ? StaticCaption.of(title) : TranslatableCaption.of("titles" +
|
||||||
".title_entered_plot");
|
".title_entered_plot");
|
||||||
Caption subHeader = fromFlag ? StaticCaption.of(subtitle) : TranslatableCaption.of("titles" +
|
Caption subHeader = fromFlag ? StaticCaption.of(subtitle) : TranslatableCaption.of("titles" +
|
||||||
".title_entered_plot_sub");
|
".title_entered_plot_sub");
|
||||||
TagResolver resolver = TagResolver.builder()
|
|
||||||
.tag("plot", Tag.inserting(Component.text(lastPlot.getId().toString())))
|
CompletableFuture<TagResolver> future = PlotSquared.platform().playerManager()
|
||||||
.tag("world", Tag.inserting(Component.text(player.getLocation().getWorldName())))
|
.getUsernameCaption(plotOwner).thenApply(caption -> TagResolver.builder()
|
||||||
.tag("owner", Tag.inserting(owner))
|
.tag("owner", Tag.inserting(caption.toComponent(player)))
|
||||||
.tag("alias", Tag.inserting(Component.text(plot.getAlias())))
|
.tag("plot", Tag.inserting(Component.text(lastPlot.getId().toString())))
|
||||||
.build();
|
.tag("world", Tag.inserting(Component.text(player.getLocation().getWorldName())))
|
||||||
if (Settings.Titles.TITLES_AS_ACTIONBAR) {
|
.tag("alias", Tag.inserting(Component.text(plot.getAlias())))
|
||||||
player.sendActionBar(header, resolver);
|
.build()
|
||||||
} else {
|
);
|
||||||
player.sendTitle(header, subHeader, resolver);
|
|
||||||
}
|
future.whenComplete((tagResolver, throwable) -> {
|
||||||
|
if (Settings.Titles.TITLES_AS_ACTIONBAR) {
|
||||||
|
player.sendActionBar(header, tagResolver);
|
||||||
|
} else {
|
||||||
|
player.sendTitle(header, subHeader, tagResolver);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}, TaskTime.seconds(1L));
|
}, TaskTime.seconds(1L));
|
||||||
}
|
}
|
||||||
@ -360,7 +368,6 @@ public class PlotListener {
|
|||||||
public boolean plotExit(final PlotPlayer<?> player, Plot plot) {
|
public boolean plotExit(final PlotPlayer<?> player, Plot plot) {
|
||||||
try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
final Plot previous = lastPlot.remove();
|
final Plot previous = lastPlot.remove();
|
||||||
this.eventDispatcher.callLeave(player, plot);
|
|
||||||
|
|
||||||
List<StatusEffect> effects = playerEffects.remove(player.getUUID());
|
List<StatusEffect> effects = playerEffects.remove(player.getUUID());
|
||||||
if (effects != null) {
|
if (effects != null) {
|
||||||
@ -463,6 +470,8 @@ public class PlotListener {
|
|||||||
feedRunnable.remove(player.getUUID());
|
feedRunnable.remove(player.getUUID());
|
||||||
healRunnable.remove(player.getUUID());
|
healRunnable.remove(player.getUUID());
|
||||||
}
|
}
|
||||||
|
} finally {
|
||||||
|
this.eventDispatcher.callLeave(player, plot);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -55,6 +55,25 @@ public enum Direction {
|
|||||||
return NORTH;
|
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() {
|
public int getIndex() {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ public final class UncheckedWorldLocation extends Location {
|
|||||||
* @param world World
|
* @param world World
|
||||||
* @param loc Coordinates
|
* @param loc Coordinates
|
||||||
* @return New location
|
* @return New location
|
||||||
* @since 6.9.0
|
* @since 7.0.0
|
||||||
*/
|
*/
|
||||||
@DoNotUse
|
@DoNotUse
|
||||||
public static @NonNull UncheckedWorldLocation at(final @NonNull String world, BlockVector3 loc) {
|
public static @NonNull UncheckedWorldLocation at(final @NonNull String world, BlockVector3 loc) {
|
||||||
|
@ -45,6 +45,7 @@ public enum Permission implements ComponentLike {
|
|||||||
PERMISSION_ADMIN_ENTRY_FORCEFIELD("plots.admin.entry.forcefield"),
|
PERMISSION_ADMIN_ENTRY_FORCEFIELD("plots.admin.entry.forcefield"),
|
||||||
PERMISSION_ADMIN_COMMANDS_CHATSPY("plots.admin.command.chatspy"),
|
PERMISSION_ADMIN_COMMANDS_CHATSPY("plots.admin.command.chatspy"),
|
||||||
PERMISSION_MERGE("plots.merge"),
|
PERMISSION_MERGE("plots.merge"),
|
||||||
|
PERMISSION_MERGE_ALL("plots.merge.all"),
|
||||||
PERMISSION_MERGE_OTHER("plots.merge.other"),
|
PERMISSION_MERGE_OTHER("plots.merge.other"),
|
||||||
PERMISSION_MERGE_KEEP_ROAD("plots.merge.keeproad"),
|
PERMISSION_MERGE_KEEP_ROAD("plots.merge.keeproad"),
|
||||||
PERMISSION_ADMIN_CAPS_OTHER("plots.admin.caps.other"),
|
PERMISSION_ADMIN_CAPS_OTHER("plots.admin.caps.other"),
|
||||||
@ -58,6 +59,9 @@ public enum Permission implements ComponentLike {
|
|||||||
PERMISSION_ADMIN_DESTROY_VEHICLE_UNOWNED("plots.admin.vehicle.break.unowned"),
|
PERMISSION_ADMIN_DESTROY_VEHICLE_UNOWNED("plots.admin.vehicle.break.unowned"),
|
||||||
PERMISSION_ADMIN_DESTROY_VEHICLE_OTHER("plots.admin.vehicle.break.other"),
|
PERMISSION_ADMIN_DESTROY_VEHICLE_OTHER("plots.admin.vehicle.break.other"),
|
||||||
PERMISSION_ADMIN_PVE("plots.admin.pve"),
|
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_PVP("plots.admin.pvp"),
|
||||||
PERMISSION_ADMIN_BUILD_ROAD("plots.admin.build.road"),
|
PERMISSION_ADMIN_BUILD_ROAD("plots.admin.build.road"),
|
||||||
PERMISSION_ADMIN_PROJECTILE_ROAD("plots.admin.projectile.road"),
|
PERMISSION_ADMIN_PROJECTILE_ROAD("plots.admin.projectile.road"),
|
||||||
@ -200,7 +204,8 @@ public enum Permission implements ComponentLike {
|
|||||||
PERMISSION_RATE("plots.rate"),
|
PERMISSION_RATE("plots.rate"),
|
||||||
PERMISSION_ADMIN_FLIGHT("plots.admin.flight"),
|
PERMISSION_ADMIN_FLIGHT("plots.admin.flight"),
|
||||||
PERMISSION_ADMIN_COMPONENTS_OTHER("plots.admin.component.other"),
|
PERMISSION_ADMIN_COMPONENTS_OTHER("plots.admin.component.other"),
|
||||||
PERMISSION_ADMIN_BYPASS_BORDER("plots.admin.border.bypass");
|
PERMISSION_ADMIN_BYPASS_BORDER("plots.admin.border.bypass"),
|
||||||
|
PERMISSION_ADMIN_BYPASS_ECON("plots.admin.econ.bypass");
|
||||||
//</editor-fold>
|
//</editor-fold>
|
||||||
|
|
||||||
private final String text;
|
private final String text;
|
||||||
|
@ -100,6 +100,7 @@ public interface PermissionHolder {
|
|||||||
}
|
}
|
||||||
String[] nodes = stub.split("\\.");
|
String[] nodes = stub.split("\\.");
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
|
// Wildcard check from less specific permission to more specific permission
|
||||||
for (int i = 0; i < (nodes.length - 1); i++) {
|
for (int i = 0; i < (nodes.length - 1); i++) {
|
||||||
builder.append(nodes[i]).append(".");
|
builder.append(nodes[i]).append(".");
|
||||||
if (!stub.equals(builder + Permission.PERMISSION_STAR.toString())) {
|
if (!stub.equals(builder + Permission.PERMISSION_STAR.toString())) {
|
||||||
@ -108,6 +109,7 @@ public interface PermissionHolder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Wildcard check for the full permission
|
||||||
if (hasPermission(stub + ".*")) {
|
if (hasPermission(stub + ".*")) {
|
||||||
return Integer.MAX_VALUE;
|
return Integer.MAX_VALUE;
|
||||||
}
|
}
|
||||||
|
@ -25,9 +25,9 @@ import java.util.UUID;
|
|||||||
public interface OfflinePlotPlayer extends PermissionHolder {
|
public interface OfflinePlotPlayer extends PermissionHolder {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the {@code UUID} of this player
|
* Returns the UUID of the player.
|
||||||
*
|
*
|
||||||
* @return the player {@link UUID}
|
* @return the UUID of the player
|
||||||
*/
|
*/
|
||||||
UUID getUUID();
|
UUID getUUID();
|
||||||
|
|
||||||
@ -39,9 +39,9 @@ public interface OfflinePlotPlayer extends PermissionHolder {
|
|||||||
long getLastPlayed();
|
long getLastPlayed();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the name of this player.
|
* Returns the name of the player.
|
||||||
*
|
*
|
||||||
* @return the player name
|
* @return the name of the player
|
||||||
*/
|
*/
|
||||||
String getName();
|
String getName();
|
||||||
|
|
||||||
|
@ -80,6 +80,7 @@ import java.util.Map;
|
|||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
@ -273,8 +274,9 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
|||||||
return this.meta == null ? null : this.meta.remove(key);
|
return this.meta == null ? null : this.meta.remove(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This player's name.
|
* Returns the name of the player.
|
||||||
*
|
*
|
||||||
* @return the name of the player
|
* @return the name of the player
|
||||||
*/
|
*/
|
||||||
@ -304,7 +306,8 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
|||||||
* @return number of allowed plots within the scope (globally, or in the player's current world as defined in the settings.yml)
|
* @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() {
|
public int getAllowedPlots() {
|
||||||
return hasPermissionRange("plots.plot", Settings.Limit.MAX_PLOTS);
|
final int calculatedLimit = hasPermissionRange("plots.plot", Settings.Limit.MAX_PLOTS);
|
||||||
|
return this.eventDispatcher.callPlayerPlotLimit(this, calculatedLimit).limit();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -880,7 +883,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
|||||||
final Component titleComponent = MiniMessage.miniMessage().deserialize(title.getComponent(this), replacements);
|
final Component titleComponent = MiniMessage.miniMessage().deserialize(title.getComponent(this), replacements);
|
||||||
final Component subtitleComponent =
|
final Component subtitleComponent =
|
||||||
MiniMessage.miniMessage().deserialize(subtitle.getComponent(this), replacements);
|
MiniMessage.miniMessage().deserialize(subtitle.getComponent(this), replacements);
|
||||||
final Title.Times times = Title.Times.of(
|
final Title.Times times = Title.Times.times(
|
||||||
Duration.of(Settings.Titles.TITLES_FADE_IN * 50L, ChronoUnit.MILLIS),
|
Duration.of(Settings.Titles.TITLES_FADE_IN * 50L, ChronoUnit.MILLIS),
|
||||||
Duration.of(Settings.Titles.TITLES_STAY * 50L, ChronoUnit.MILLIS),
|
Duration.of(Settings.Titles.TITLES_STAY * 50L, ChronoUnit.MILLIS),
|
||||||
Duration.of(Settings.Titles.TITLES_FADE_OUT * 50L, ChronoUnit.MILLIS)
|
Duration.of(Settings.Titles.TITLES_FADE_OUT * 50L, ChronoUnit.MILLIS)
|
||||||
@ -952,6 +955,54 @@ 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
|
// Redefine from PermissionHolder as it's required from CommandCaller
|
||||||
@Override
|
@Override
|
||||||
public boolean hasPermission(@NonNull String permission) {
|
public boolean hasPermission(@NonNull String permission) {
|
||||||
|
@ -29,6 +29,7 @@ import com.plotsquared.core.configuration.caption.CaptionUtility;
|
|||||||
import com.plotsquared.core.configuration.caption.StaticCaption;
|
import com.plotsquared.core.configuration.caption.StaticCaption;
|
||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
import com.plotsquared.core.database.DBFunc;
|
import com.plotsquared.core.database.DBFunc;
|
||||||
|
import com.plotsquared.core.events.PlayerTeleportToPlotEvent;
|
||||||
import com.plotsquared.core.events.Result;
|
import com.plotsquared.core.events.Result;
|
||||||
import com.plotsquared.core.events.TeleportCause;
|
import com.plotsquared.core.events.TeleportCause;
|
||||||
import com.plotsquared.core.generator.ClassicPlotWorld;
|
import com.plotsquared.core.generator.ClassicPlotWorld;
|
||||||
@ -85,6 +86,7 @@ import java.util.ArrayDeque;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Deque;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -641,35 +643,22 @@ public class Plot {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a immutable set of owner UUIDs for a plot (supports multi-owner mega-plots).
|
* Gets an immutable set of owner UUIDs for a plot (supports multi-owner mega-plots).
|
||||||
* <p>
|
* <p>
|
||||||
* This method cannot be used to add or remove owners from a plot.
|
* This method cannot be used to add or remove owners from a plot.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @return Immutable view of plot owners
|
* @return Immutable set of plot owners
|
||||||
*/
|
*/
|
||||||
public @NonNull Set<UUID> getOwners() {
|
public @NonNull Set<UUID> getOwners() {
|
||||||
if (this.getOwner() == null) {
|
ImmutableSet.Builder<UUID> owners = ImmutableSet.builder();
|
||||||
return ImmutableSet.of();
|
for (Plot plot : getConnectedPlots()) {
|
||||||
}
|
UUID owner = plot.getOwner();
|
||||||
if (isMerged()) {
|
if (owner != null) {
|
||||||
Set<Plot> plots = getConnectedPlots();
|
owners.add(owner);
|
||||||
Plot[] array = plots.toArray(new Plot[0]);
|
|
||||||
ImmutableSet.Builder<UUID> owners = ImmutableSet.builder();
|
|
||||||
UUID last = this.getOwner();
|
|
||||||
owners.add(this.getOwner());
|
|
||||||
for (final Plot current : array) {
|
|
||||||
if (current.getOwner() == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (last == null || current.getOwner().getMostSignificantBits() != last.getMostSignificantBits()) {
|
|
||||||
owners.add(current.getOwner());
|
|
||||||
last = current.getOwner();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return owners.build();
|
|
||||||
}
|
}
|
||||||
return ImmutableSet.of(this.getOwner());
|
return owners.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1481,7 +1470,7 @@ public class Plot {
|
|||||||
*/
|
*/
|
||||||
public void setHome(BlockLoc location) {
|
public void setHome(BlockLoc location) {
|
||||||
Plot plot = this.getBasePlot(false);
|
Plot plot = this.getBasePlot(false);
|
||||||
if (BlockLoc.ZERO.equals(location) || BlockLoc.MINY.equals(location)) {
|
if (location != null && (BlockLoc.ZERO.equals(location) || BlockLoc.MINY.equals(location))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
plot.getSettings().setPosition(location);
|
plot.getSettings().setPosition(location);
|
||||||
@ -2283,8 +2272,8 @@ public class Plot {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a set of plots connected (and including) this plot<br>
|
* Gets a set of plots connected (and including) this plot.
|
||||||
* - This result is cached globally
|
* The returned set is immutable.
|
||||||
*
|
*
|
||||||
* @return a Set of Plots connected to this Plot
|
* @return a Set of Plots connected to this Plot
|
||||||
*/
|
*/
|
||||||
@ -2295,117 +2284,75 @@ public class Plot {
|
|||||||
if (!this.isMerged()) {
|
if (!this.isMerged()) {
|
||||||
return Collections.singleton(this);
|
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)) {
|
if (this.connectedCache != null && this.connectedCache.contains(this)) {
|
||||||
return this.connectedCache;
|
return this.connectedCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
HashSet<Plot> tmpSet = new HashSet<>();
|
Set<Plot> tmpSet = new HashSet<>();
|
||||||
tmpSet.add(this);
|
tmpSet.add(this);
|
||||||
Plot tmp;
|
HashSet<Plot> queueCache = new HashSet<>();
|
||||||
HashSet<Object> queuecache = new HashSet<>();
|
|
||||||
ArrayDeque<Plot> frontier = new ArrayDeque<>();
|
ArrayDeque<Plot> frontier = new ArrayDeque<>();
|
||||||
if (this.isMerged(Direction.NORTH)) {
|
computeDirectMerged(queueCache, frontier, Direction.NORTH);
|
||||||
tmp = this.area.getPlotAbs(this.id.getRelative(Direction.NORTH));
|
computeDirectMerged(queueCache, frontier, Direction.EAST);
|
||||||
if (!tmp.isMerged(Direction.SOUTH)) {
|
computeDirectMerged(queueCache, frontier, Direction.SOUTH);
|
||||||
// invalid merge
|
computeDirectMerged(queueCache, frontier, Direction.WEST);
|
||||||
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;
|
Plot current;
|
||||||
while ((current = frontier.poll()) != null) {
|
while ((current = frontier.poll()) != null) {
|
||||||
if (!current.hasOwner() || current.settings == null) {
|
if (!current.hasOwner() || current.settings == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
tmpSet.add(current);
|
tmpSet.add(current);
|
||||||
queuecache.remove(current);
|
queueCache.remove(current);
|
||||||
if (current.isMerged(Direction.NORTH)) {
|
addIfIncluded(current, Direction.NORTH, queueCache, tmpSet, frontier);
|
||||||
tmp = current.area.getPlotAbs(current.id.getRelative(Direction.NORTH));
|
addIfIncluded(current, Direction.EAST, queueCache, tmpSet, frontier);
|
||||||
if (tmp != null && !queuecache.contains(tmp) && !tmpSet.contains(tmp)) {
|
addIfIncluded(current, Direction.SOUTH, queueCache, tmpSet, frontier);
|
||||||
queuecache.add(tmp);
|
addIfIncluded(current, Direction.WEST, queueCache, tmpSet, frontier);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
tmpSet = Set.copyOf(tmpSet);
|
||||||
this.connectedCache = tmpSet;
|
this.connectedCache = tmpSet;
|
||||||
return 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.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 will combine each plot into effective rectangular regions<br>
|
* This will combine each plot into effective rectangular regions<br>
|
||||||
* - This result is cached globally<br>
|
* - This result is cached globally<br>
|
||||||
@ -2614,8 +2561,15 @@ public class Plot {
|
|||||||
*/
|
*/
|
||||||
public void teleportPlayer(final PlotPlayer<?> player, TeleportCause cause, Consumer<Boolean> resultConsumer) {
|
public void teleportPlayer(final PlotPlayer<?> player, TeleportCause cause, Consumer<Boolean> resultConsumer) {
|
||||||
Plot plot = this.getBasePlot(false);
|
Plot plot = this.getBasePlot(false);
|
||||||
Result result = this.eventDispatcher.callTeleport(player, player.getLocation(), plot, cause).getEventResult();
|
if ((getArea() == null || !(getArea() instanceof SinglePlotArea)) && !WorldUtil.isValidLocation(plot.getBottomAbs())) {
|
||||||
if (result == Result.DENY) {
|
// prevent from teleporting into unsafe regions
|
||||||
|
player.sendMessage(TranslatableCaption.of("border.denied"));
|
||||||
|
resultConsumer.accept(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
PlayerTeleportToPlotEvent event = this.eventDispatcher.callTeleport(player, player.getLocation(), plot, cause);
|
||||||
|
if (event.getEventResult() == Result.DENY) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("events.event_denied"),
|
TranslatableCaption.of("events.event_denied"),
|
||||||
TagResolver.resolver("value", Tag.inserting(Component.text("Teleport")))
|
TagResolver.resolver("value", Tag.inserting(Component.text("Teleport")))
|
||||||
@ -2623,7 +2577,10 @@ public class Plot {
|
|||||||
resultConsumer.accept(false);
|
resultConsumer.accept(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final Consumer<Location> locationConsumer = location -> {
|
|
||||||
|
final Consumer<Location> locationConsumer = calculatedLocation -> {
|
||||||
|
Location location = event.getLocationTransformer() == null ? calculatedLocation :
|
||||||
|
Objects.requireNonNullElse(event.getLocationTransformer().apply(calculatedLocation), calculatedLocation);
|
||||||
if (Settings.Teleport.DELAY == 0 || player.hasPermission("plots.teleport.delay.bypass")) {
|
if (Settings.Teleport.DELAY == 0 || player.hasPermission("plots.teleport.delay.bypass")) {
|
||||||
player.sendMessage(TranslatableCaption.of("teleport.teleported_to_plot"));
|
player.sendMessage(TranslatableCaption.of("teleport.teleported_to_plot"));
|
||||||
player.teleport(location, cause);
|
player.teleport(location, cause);
|
||||||
@ -2679,6 +2636,11 @@ public class Plot {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the maximum distance of the plot from x=0, z=0.
|
||||||
|
*
|
||||||
|
* @return max block distance from 0,0
|
||||||
|
*/
|
||||||
public int getDistanceFromOrigin() {
|
public int getDistanceFromOrigin() {
|
||||||
Location bot = getManager().getPlotBottomLocAbs(id);
|
Location bot = getManager().getPlotBottomLocAbs(id);
|
||||||
Location top = getManager().getPlotTopLocAbs(id);
|
Location top = getManager().getPlotTopLocAbs(id);
|
||||||
@ -2692,7 +2654,7 @@ public class Plot {
|
|||||||
* Expands the world border to include this plot if it is beyond the current border.
|
* Expands the world border to include this plot if it is beyond the current border.
|
||||||
*/
|
*/
|
||||||
public void updateWorldBorder() {
|
public void updateWorldBorder() {
|
||||||
int border = this.area.getBorder();
|
int border = this.area.getBorder(false);
|
||||||
if (border == Integer.MAX_VALUE) {
|
if (border == Integer.MAX_VALUE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,8 @@ import com.plotsquared.core.util.MathMan;
|
|||||||
import com.plotsquared.core.util.PlotExpression;
|
import com.plotsquared.core.util.PlotExpression;
|
||||||
import com.plotsquared.core.util.RegionUtil;
|
import com.plotsquared.core.util.RegionUtil;
|
||||||
import com.plotsquared.core.util.StringMan;
|
import com.plotsquared.core.util.StringMan;
|
||||||
|
import com.plotsquared.core.util.task.TaskManager;
|
||||||
|
import com.plotsquared.core.util.task.TaskTime;
|
||||||
import com.sk89q.worldedit.math.BlockVector2;
|
import com.sk89q.worldedit.math.BlockVector2;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||||
@ -145,6 +147,7 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
private Map<String, PlotExpression> prices = new HashMap<>();
|
private Map<String, PlotExpression> prices = new HashMap<>();
|
||||||
private List<String> schematics = new ArrayList<>();
|
private List<String> schematics = new ArrayList<>();
|
||||||
private boolean worldBorder = false;
|
private boolean worldBorder = false;
|
||||||
|
private int borderSize = 1;
|
||||||
private boolean useEconomy = false;
|
private boolean useEconomy = false;
|
||||||
private int hash;
|
private int hash;
|
||||||
private CuboidRegion region;
|
private CuboidRegion region;
|
||||||
@ -180,8 +183,7 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
this.worldConfiguration = worldConfiguration;
|
this.worldConfiguration = worldConfiguration;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Collection<PlotFlag<?, ?>> parseFlags(List<String> flagStrings) {
|
private static void parseFlags(FlagContainer flagContainer, List<String> flagStrings) {
|
||||||
final Collection<PlotFlag<?, ?>> flags = new ArrayList<>();
|
|
||||||
for (final String key : flagStrings) {
|
for (final String key : flagStrings) {
|
||||||
final String[] split;
|
final String[] split;
|
||||||
if (key.contains(";")) {
|
if (key.contains(";")) {
|
||||||
@ -193,7 +195,7 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
GlobalFlagContainer.getInstance().getFlagFromString(split[0]);
|
GlobalFlagContainer.getInstance().getFlagFromString(split[0]);
|
||||||
if (flagInstance != null) {
|
if (flagInstance != null) {
|
||||||
try {
|
try {
|
||||||
flags.add(flagInstance.parse(split[1]));
|
flagContainer.addFlag(flagInstance.parse(split[1]));
|
||||||
} catch (final FlagParseException e) {
|
} catch (final FlagParseException e) {
|
||||||
LOGGER.warn(
|
LOGGER.warn(
|
||||||
"Failed to parse default flag with key '{}' and value '{}'. "
|
"Failed to parse default flag with key '{}' and value '{}'. "
|
||||||
@ -204,9 +206,10 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
);
|
);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
flagContainer.addUnknownFlag(split[0], split[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return flags;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@ -354,6 +357,7 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
this.plotChat = config.getBoolean("chat.enabled");
|
this.plotChat = config.getBoolean("chat.enabled");
|
||||||
this.forcingPlotChat = config.getBoolean("chat.forced");
|
this.forcingPlotChat = config.getBoolean("chat.forced");
|
||||||
this.worldBorder = config.getBoolean("world.border");
|
this.worldBorder = config.getBoolean("world.border");
|
||||||
|
this.borderSize = config.getInt("world.border_size");
|
||||||
this.maxBuildHeight = config.getInt("world.max_height");
|
this.maxBuildHeight = config.getInt("world.max_height");
|
||||||
this.minBuildHeight = config.getInt("world.min_height");
|
this.minBuildHeight = config.getInt("world.min_height");
|
||||||
this.minGenHeight = config.getInt("world.min_gen_height");
|
this.minGenHeight = config.getInt("world.min_gen_height");
|
||||||
@ -391,6 +395,28 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.spawnEggs = config.getBoolean("event.spawn.egg");
|
||||||
|
this.spawnCustom = config.getBoolean("event.spawn.custom");
|
||||||
|
this.spawnBreeding = config.getBoolean("event.spawn.breeding");
|
||||||
|
|
||||||
|
if (PlotSquared.get().isWeInitialised()) {
|
||||||
|
loadFlags(config);
|
||||||
|
} else {
|
||||||
|
ConsolePlayer.getConsole().sendMessage(
|
||||||
|
TranslatableCaption.of("flags.delaying_loading_area_flags"),
|
||||||
|
TagResolver.resolver("area", Tag.inserting(Component.text(this.id == null ? this.worldName : this.id)))
|
||||||
|
);
|
||||||
|
TaskManager.runTaskLater(() -> loadFlags(config), TaskTime.ticks(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
loadConfiguration(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadFlags(ConfigurationSection config) {
|
||||||
|
ConsolePlayer.getConsole().sendMessage(
|
||||||
|
TranslatableCaption.of("flags.loading_area_flags"),
|
||||||
|
TagResolver.resolver("area", Tag.inserting(Component.text(this.id == null ? this.worldName : this.id)))
|
||||||
|
);
|
||||||
List<String> flags = config.getStringList("flags.default");
|
List<String> flags = config.getStringList("flags.default");
|
||||||
if (flags.isEmpty()) {
|
if (flags.isEmpty()) {
|
||||||
flags = config.getStringList("flags");
|
flags = config.getStringList("flags");
|
||||||
@ -405,16 +431,12 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.getFlagContainer().addAll(parseFlags(flags));
|
parseFlags(this.getFlagContainer(), flags);
|
||||||
ConsolePlayer.getConsole().sendMessage(
|
ConsolePlayer.getConsole().sendMessage(
|
||||||
TranslatableCaption.of("flags.area_flags"),
|
TranslatableCaption.of("flags.area_flags"),
|
||||||
TagResolver.resolver("flags", Tag.inserting(Component.text(flags.toString())))
|
TagResolver.resolver("flags", Tag.inserting(Component.text(flags.toString())))
|
||||||
);
|
);
|
||||||
|
|
||||||
this.spawnEggs = config.getBoolean("event.spawn.egg");
|
|
||||||
this.spawnCustom = config.getBoolean("event.spawn.custom");
|
|
||||||
this.spawnBreeding = config.getBoolean("event.spawn.breeding");
|
|
||||||
|
|
||||||
List<String> roadflags = config.getStringList("road.flags");
|
List<String> roadflags = config.getStringList("road.flags");
|
||||||
if (roadflags.isEmpty()) {
|
if (roadflags.isEmpty()) {
|
||||||
roadflags = new ArrayList<>();
|
roadflags = new ArrayList<>();
|
||||||
@ -426,14 +448,12 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.roadFlags = roadflags.size() > 0;
|
this.roadFlags = !roadflags.isEmpty();
|
||||||
this.getRoadFlagContainer().addAll(parseFlags(roadflags));
|
parseFlags(this.getRoadFlagContainer(), roadflags);
|
||||||
ConsolePlayer.getConsole().sendMessage(
|
ConsolePlayer.getConsole().sendMessage(
|
||||||
TranslatableCaption.of("flags.road_flags"),
|
TranslatableCaption.of("flags.road_flags"),
|
||||||
TagResolver.resolver("flags", Tag.inserting(Component.text(roadflags.toString())))
|
TagResolver.resolver("flags", Tag.inserting(Component.text(roadflags.toString())))
|
||||||
);
|
);
|
||||||
|
|
||||||
loadConfiguration(config);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void loadConfiguration(ConfigurationSection config);
|
public abstract void loadConfiguration(ConfigurationSection config);
|
||||||
@ -471,6 +491,7 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
options.put("event.spawn.custom", this.isSpawnCustom());
|
options.put("event.spawn.custom", this.isSpawnCustom());
|
||||||
options.put("event.spawn.breeding", this.isSpawnBreeding());
|
options.put("event.spawn.breeding", this.isSpawnBreeding());
|
||||||
options.put("world.border", this.hasWorldBorder());
|
options.put("world.border", this.hasWorldBorder());
|
||||||
|
options.put("world.border_size", this.getBorderSize());
|
||||||
options.put("home.default", "side");
|
options.put("home.default", "side");
|
||||||
String position = config.getString(
|
String position = config.getString(
|
||||||
"home.nonmembers",
|
"home.nonmembers",
|
||||||
@ -658,10 +679,8 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
TranslatableCaption.of("height.height_limit"),
|
TranslatableCaption.of("height.height_limit"),
|
||||||
TagResolver.builder()
|
TagResolver.builder()
|
||||||
.tag("minheight", Tag.inserting(Component.text(minBuildHeight)))
|
.tag("minheight", Tag.inserting(Component.text(minBuildHeight)))
|
||||||
.tag(
|
.tag("maxheight", Tag.inserting(Component.text(maxBuildHeight)))
|
||||||
"maxheight",
|
.build()
|
||||||
Tag.inserting(Component.text(maxBuildHeight))
|
|
||||||
).build()
|
|
||||||
);
|
);
|
||||||
// Return true if "failed" as the method will always be inverted otherwise
|
// Return true if "failed" as the method will always be inverted otherwise
|
||||||
return true;
|
return true;
|
||||||
@ -919,7 +938,9 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
* Get the plot border distance for a world<br>
|
* Get the plot border distance for a world<br>
|
||||||
*
|
*
|
||||||
* @return The border distance or Integer.MAX_VALUE if no border is set
|
* @return The border distance or Integer.MAX_VALUE if no border is set
|
||||||
|
* @deprecated Use {@link PlotArea#getBorder(boolean)}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(forRemoval = true, since = "7.2.0")
|
||||||
public int getBorder() {
|
public int getBorder() {
|
||||||
final Integer meta = (Integer) getMeta("worldBorder");
|
final Integer meta = (Integer) getMeta("worldBorder");
|
||||||
if (meta != null) {
|
if (meta != null) {
|
||||||
@ -933,6 +954,27 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
return Integer.MAX_VALUE;
|
return Integer.MAX_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the plot border distance for a world, specifying whether the returned value should include the world.border-size
|
||||||
|
* value. This is a player-traversable area, where plots cannot be claimed
|
||||||
|
*
|
||||||
|
* @param getExtended If the extra border given by world.border-size should be included
|
||||||
|
* @return Border distance of Integer.MAX_VALUE if no border is set
|
||||||
|
* @since 7.2.0
|
||||||
|
*/
|
||||||
|
public int getBorder(boolean getExtended) {
|
||||||
|
final Integer meta = (Integer) getMeta("worldBorder");
|
||||||
|
if (meta != null) {
|
||||||
|
int border = meta + 1;
|
||||||
|
if (border == 0) {
|
||||||
|
return Integer.MAX_VALUE;
|
||||||
|
} else {
|
||||||
|
return getExtended ? border + borderSize : border;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Integer.MAX_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup the plot border for a world (usually done when the world is created).
|
* Setup the plot border for a world (usually done when the world is created).
|
||||||
*/
|
*/
|
||||||
@ -1192,6 +1234,16 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
return worldBorder;
|
return worldBorder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the "extra border" size of the plot area.
|
||||||
|
*
|
||||||
|
* @return Plot area extra border size
|
||||||
|
* @since 7.2.0
|
||||||
|
*/
|
||||||
|
public int getBorderSize() {
|
||||||
|
return borderSize;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get whether plot signs are allowed or not.
|
* Get whether plot signs are allowed or not.
|
||||||
*
|
*
|
||||||
@ -1398,6 +1450,24 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
this.defaultHome = defaultHome;
|
this.defaultHome = defaultHome;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the maximum height that changes to plot components (wall filling, air, all etc.) may operate to
|
||||||
|
*
|
||||||
|
* @since 7.3.4
|
||||||
|
*/
|
||||||
|
public int getMaxComponentHeight() {
|
||||||
|
return this.maxBuildHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the minimum height that changes to plot components (wall filling, air, all etc.) may operate to
|
||||||
|
*
|
||||||
|
* @since 7.3.4
|
||||||
|
*/
|
||||||
|
public int getMinComponentHeight() {
|
||||||
|
return this.minBuildHeight;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the maximum height players may build in. Exclusive.
|
* Get the maximum height players may build in. Exclusive.
|
||||||
*/
|
*/
|
||||||
|
@ -26,8 +26,8 @@ import java.util.Iterator;
|
|||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Plot (X,Y) tuples for plot locations
|
* The PlotId class represents a Plot's x and y coordinates within a {@link PlotArea}. PlotId x,y values do not correspond to Block locations.
|
||||||
* within a plot area
|
* A PlotId instance can be created using the {@link #of(int, int)} method or parsed from a string using the {@link #fromString(String)} method.
|
||||||
*/
|
*/
|
||||||
public final class PlotId {
|
public final class PlotId {
|
||||||
|
|
||||||
@ -36,10 +36,10 @@ public final class PlotId {
|
|||||||
private final int hash;
|
private final int hash;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PlotId class (PlotId x,y values do not correspond to Block locations)
|
* Constructs a new PlotId with the given x and y coordinates.
|
||||||
*
|
*
|
||||||
* @param x The plot x coordinate
|
* @param x the x-coordinate of the plot
|
||||||
* @param y The plot y coordinate
|
* @param y the y-coordinate of the plot
|
||||||
*/
|
*/
|
||||||
private PlotId(final int x, final int y) {
|
private PlotId(final int x, final int y) {
|
||||||
this.x = x;
|
this.x = x;
|
||||||
@ -48,11 +48,11 @@ public final class PlotId {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new plot ID instance
|
* Returns a new PlotId instance with the specified x and y coordinates.
|
||||||
*
|
*
|
||||||
* @param x The plot x coordinate
|
* @param x the x-coordinate of the plot
|
||||||
* @param y The plot y coordinate
|
* @param y the y-coordinate of the plot
|
||||||
* @return a new PlotId at x,y
|
* @return a new PlotId instance with the specified x and y coordinates
|
||||||
*/
|
*/
|
||||||
public static @NonNull PlotId of(final int x, final int y) {
|
public static @NonNull PlotId of(final int x, final int y) {
|
||||||
return new PlotId(x, y);
|
return new PlotId(x, y);
|
||||||
@ -74,10 +74,13 @@ public final class PlotId {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempt to parse a plot ID from a string
|
* Returns a PlotId object from the given string, or null if the string is invalid.
|
||||||
|
* The string should be in the format "x;y" where x and y are integers.
|
||||||
|
* The string can also contain any combination of the characters ";_,."
|
||||||
|
* as delimiters.
|
||||||
*
|
*
|
||||||
* @param string ID string
|
* @param string the string to parse
|
||||||
* @return Plot ID, or {@code null} if none could be parsed
|
* @return a PlotId object parsed from the given string, or null if the string is invalid
|
||||||
*/
|
*/
|
||||||
public static @Nullable PlotId fromStringOrNull(final @NonNull String string) {
|
public static @Nullable PlotId fromStringOrNull(final @NonNull String string) {
|
||||||
final String[] parts = string.split("[;_,.]");
|
final String[] parts = string.split("[;_,.]");
|
||||||
@ -95,39 +98,39 @@ public final class PlotId {
|
|||||||
return of(x, y);
|
return of(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the PlotId from the HashCode<br>
|
* Returns a new PlotId instance from the given hash.
|
||||||
* Note: Only accurate for small x,z values (short)
|
|
||||||
*
|
*
|
||||||
* @param hash ID hash
|
* @param hash the hash to unpair
|
||||||
* @return Plot ID
|
* @return a new PlotId instance
|
||||||
*/
|
*/
|
||||||
public static @NonNull PlotId unpair(final int hash) {
|
public static @NonNull PlotId unpair(final int hash) {
|
||||||
return PlotId.of(hash >> 16, hash & 0xFFFF);
|
return PlotId.of(hash >> 16, hash & 0xFFFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the ID X component
|
* Returns the x-coordinate of this Plot ID.
|
||||||
*
|
*
|
||||||
* @return X component
|
* @return the x-coordinate of this Plot ID
|
||||||
*/
|
*/
|
||||||
public int getX() {
|
public int getX() {
|
||||||
return this.x;
|
return this.x;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the ID Y component
|
* Returns the y-coordinate of this Plot ID.
|
||||||
*
|
*
|
||||||
* @return Y component
|
* @return the y-coordinate of this Plot ID
|
||||||
*/
|
*/
|
||||||
public int getY() {
|
public int getY() {
|
||||||
return this.y;
|
return this.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the next plot ID for claiming purposes
|
* Returns the next Plot ID for claiming purposes based on the current Plot ID.
|
||||||
*
|
*
|
||||||
* @return Next plot ID
|
* @return the next Plot ID
|
||||||
*/
|
*/
|
||||||
public @NonNull PlotId getNextId() {
|
public @NonNull PlotId getNextId() {
|
||||||
final int absX = Math.abs(x);
|
final int absX = Math.abs(x);
|
||||||
@ -159,10 +162,11 @@ public final class PlotId {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the PlotId in a relative direction
|
* Returns a new Plot ID in the specified relative direction based on the
|
||||||
|
* current Plot ID.
|
||||||
*
|
*
|
||||||
* @param direction Direction
|
* @param direction the direction in which to get the relative Plot ID
|
||||||
* @return Relative plot ID
|
* @return the relative Plot ID
|
||||||
*/
|
*/
|
||||||
public @NonNull PlotId getRelative(final @NonNull Direction direction) {
|
public @NonNull PlotId getRelative(final @NonNull Direction direction) {
|
||||||
return switch (direction) {
|
return switch (direction) {
|
||||||
@ -193,10 +197,11 @@ public final class PlotId {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a String representation of the plot ID where the
|
* Returns a string representation of this Plot ID in the format "x;y".
|
||||||
* components are separated by ";"
|
|
||||||
*
|
*
|
||||||
* @return {@code x + ";" + y}
|
* <p> The format is {@code x + ";" + y}
|
||||||
|
*
|
||||||
|
* @return a string representation of this Plot ID
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public @NonNull String toString() {
|
public @NonNull String toString() {
|
||||||
@ -204,41 +209,40 @@ public final class PlotId {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a String representation of the plot ID where the
|
* Returns a string representation of this Plot ID with the specified separator.
|
||||||
* components are separated by a specified string
|
* <p>
|
||||||
|
* The format is {@code x + separator + y}
|
||||||
*
|
*
|
||||||
* @param separator Separator
|
* @param separator the separator to use between the X and Y coordinates
|
||||||
* @return {@code x + separator + y}
|
* @return a string representation of this Plot ID with the specified separator
|
||||||
*/
|
*/
|
||||||
public @NonNull String toSeparatedString(String separator) {
|
public @NonNull String toSeparatedString(String separator) {
|
||||||
return this.getX() + separator + this.getY();
|
return this.getX() + separator + this.getY();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a String representation of the plot ID where the
|
* Returns a string representation of this Plot ID in the format "x,y".
|
||||||
* components are separated by ","
|
|
||||||
*
|
*
|
||||||
* @return {@code x + "," + y}
|
* @return a string representation of this Plot ID
|
||||||
*/
|
*/
|
||||||
public @NonNull String toCommaSeparatedString() {
|
public @NonNull String toCommaSeparatedString() {
|
||||||
return this.getX() + "," + this.getY();
|
return this.getX() + "," + this.getY();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a String representation of the plot ID where the
|
* Returns a string representation of this Plot ID in the format "x_y".
|
||||||
* components are separated by "_"
|
|
||||||
*
|
*
|
||||||
* @return {@code x + "_" + y}
|
* @return a string representation of this Plot ID
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public @NonNull String toUnderscoreSeparatedString() {
|
public @NonNull String toUnderscoreSeparatedString() {
|
||||||
return this.getX() + "_" + this.getY();
|
return this.getX() + "_" + this.getY();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a String representation of the plot ID where the
|
* Returns a string representation of this Plot ID in the format "x-y".
|
||||||
* components are separated by "-"
|
|
||||||
*
|
*
|
||||||
* @return {@code x + "-" + y}
|
* @return a string representation of this Plot ID
|
||||||
*/
|
*/
|
||||||
public @NonNull String toDashSeparatedString() {
|
public @NonNull String toDashSeparatedString() {
|
||||||
return this.getX() + "-" + this.getY();
|
return this.getX() + "-" + this.getY();
|
||||||
@ -250,6 +254,10 @@ public final class PlotId {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An iterator that iterates over a range of {@link PlotId}s.
|
||||||
|
* The range is defined by a start and end {@link PlotId}.
|
||||||
|
*/
|
||||||
public static final class PlotRangeIterator implements Iterator<PlotId>, Iterable<PlotId> {
|
public static final class PlotRangeIterator implements Iterator<PlotId>, Iterable<PlotId> {
|
||||||
|
|
||||||
private final PlotId start;
|
private final PlotId start;
|
||||||
@ -265,6 +273,13 @@ public final class PlotId {
|
|||||||
this.y = this.start.getY();
|
this.y = this.start.getY();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new {@link PlotRangeIterator} that iterates over the range of Plots between the specified start and end Plots (inclusive).
|
||||||
|
*
|
||||||
|
* @param start the starting Plot of the range
|
||||||
|
* @param end the ending Plot of the range
|
||||||
|
* @return a new {@link PlotRangeIterator} that iterates over the range of Plots between the specified start and end Plots (inclusive)
|
||||||
|
*/
|
||||||
public static PlotRangeIterator range(final @NonNull PlotId start, final @NonNull PlotId end) {
|
public static PlotRangeIterator range(final @NonNull PlotId start, final @NonNull PlotId end) {
|
||||||
return new PlotRangeIterator(start, end);
|
return new PlotRangeIterator(start, end);
|
||||||
}
|
}
|
||||||
|
@ -67,14 +67,25 @@ public class PlotItemStack {
|
|||||||
return this.type;
|
return this.type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of items in this stack.
|
||||||
|
* Valid values range from 1-255.
|
||||||
|
*
|
||||||
|
* @return the amount of items in this stack
|
||||||
|
*/
|
||||||
public int getAmount() {
|
public int getAmount() {
|
||||||
return amount;
|
return amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the given name of this stack of items. The name is displayed when
|
||||||
|
* hovering over the item.
|
||||||
|
*
|
||||||
|
* @return the given name of this stack of items
|
||||||
|
*/
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String[] getLore() {
|
public String[] getLore() {
|
||||||
return lore;
|
return lore;
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,6 @@ import com.plotsquared.core.location.Location;
|
|||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||||
import com.plotsquared.core.queue.QueueCoordinator;
|
import com.plotsquared.core.queue.QueueCoordinator;
|
||||||
import com.plotsquared.core.util.PlayerManager;
|
|
||||||
import com.plotsquared.core.util.task.TaskManager;
|
import com.plotsquared.core.util.task.TaskManager;
|
||||||
import com.plotsquared.core.util.task.TaskTime;
|
import com.plotsquared.core.util.task.TaskTime;
|
||||||
import com.sk89q.worldedit.function.pattern.Pattern;
|
import com.sk89q.worldedit.function.pattern.Pattern;
|
||||||
@ -59,6 +58,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
@ -383,13 +383,17 @@ public final class PlotModificationManager {
|
|||||||
}
|
}
|
||||||
if (createSign) {
|
if (createSign) {
|
||||||
queue.setCompleteTask(() -> TaskManager.runTaskAsync(() -> {
|
queue.setCompleteTask(() -> TaskManager.runTaskAsync(() -> {
|
||||||
for (Plot current : plots) {
|
List<CompletableFuture<Void>> tasks = plots.stream().map(current -> PlotSquared.platform().playerManager()
|
||||||
current.getPlotModificationManager().setSign(PlayerManager.resolveName(current.getOwnerAbs()).getComponent(
|
.getUsernameCaption(current.getOwnerAbs())
|
||||||
LocaleHolder.console()));
|
.thenAccept(caption -> current
|
||||||
}
|
.getPlotModificationManager()
|
||||||
if (whenDone != null) {
|
.setSign(caption.getComponent(LocaleHolder.console()))))
|
||||||
TaskManager.runTask(whenDone);
|
.toList();
|
||||||
}
|
CompletableFuture.allOf(tasks.toArray(CompletableFuture[]::new)).whenComplete((unused, throwable) -> {
|
||||||
|
if (whenDone != null) {
|
||||||
|
TaskManager.runTask(whenDone);
|
||||||
|
}
|
||||||
|
});
|
||||||
}));
|
}));
|
||||||
} else if (whenDone != null) {
|
} else if (whenDone != null) {
|
||||||
queue.setCompleteTask(whenDone);
|
queue.setCompleteTask(whenDone);
|
||||||
@ -891,7 +895,6 @@ public final class PlotModificationManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* /**
|
|
||||||
* Sets components such as border, wall, floor.
|
* Sets components such as border, wall, floor.
|
||||||
* (components are generator specific)
|
* (components are generator specific)
|
||||||
*
|
*
|
||||||
|
@ -18,9 +18,25 @@
|
|||||||
*/
|
*/
|
||||||
package com.plotsquared.core.plot;
|
package com.plotsquared.core.plot;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The different types of weather that can be set for a Plot.
|
||||||
|
*/
|
||||||
public enum PlotWeather {
|
public enum PlotWeather {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rainy weather conditions
|
||||||
|
*/
|
||||||
RAIN,
|
RAIN,
|
||||||
|
/**
|
||||||
|
* Clear weather conditions
|
||||||
|
*/
|
||||||
CLEAR,
|
CLEAR,
|
||||||
|
/**
|
||||||
|
* Use the weather of the world the plot is in
|
||||||
|
*/
|
||||||
WORLD,
|
WORLD,
|
||||||
|
/**
|
||||||
|
* Turn off weather for the plot
|
||||||
|
*/
|
||||||
OFF
|
OFF
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag;
|
|||||||
import com.plotsquared.core.plot.flag.implementations.BlockedCmdsFlag;
|
import com.plotsquared.core.plot.flag.implementations.BlockedCmdsFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.BreakFlag;
|
import com.plotsquared.core.plot.flag.implementations.BreakFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.ChatFlag;
|
import com.plotsquared.core.plot.flag.implementations.ChatFlag;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.ConcreteHardenFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag;
|
import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.CoralDryFlag;
|
import com.plotsquared.core.plot.flag.implementations.CoralDryFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.CropGrowFlag;
|
import com.plotsquared.core.plot.flag.implementations.CropGrowFlag;
|
||||||
@ -41,11 +42,13 @@ import com.plotsquared.core.plot.flag.implementations.DeviceInteractFlag;
|
|||||||
import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
|
import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.DropProtectionFlag;
|
import com.plotsquared.core.plot.flag.implementations.DropProtectionFlag;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.EditSignFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.EntityCapFlag;
|
import com.plotsquared.core.plot.flag.implementations.EntityCapFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.EntityChangeBlockFlag;
|
import com.plotsquared.core.plot.flag.implementations.EntityChangeBlockFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.ExplosionFlag;
|
import com.plotsquared.core.plot.flag.implementations.ExplosionFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.FarewellFlag;
|
import com.plotsquared.core.plot.flag.implementations.FarewellFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.FeedFlag;
|
import com.plotsquared.core.plot.flag.implementations.FeedFlag;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.FishingFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.FlyFlag;
|
import com.plotsquared.core.plot.flag.implementations.FlyFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.ForcefieldFlag;
|
import com.plotsquared.core.plot.flag.implementations.ForcefieldFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.GamemodeFlag;
|
import com.plotsquared.core.plot.flag.implementations.GamemodeFlag;
|
||||||
@ -87,6 +90,7 @@ import com.plotsquared.core.plot.flag.implementations.PlayerInteractFlag;
|
|||||||
import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag;
|
import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag;
|
import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.PriceFlag;
|
import com.plotsquared.core.plot.flag.implementations.PriceFlag;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.ProjectileChangeBlockFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
|
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.PveFlag;
|
import com.plotsquared.core.plot.flag.implementations.PveFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.PvpFlag;
|
import com.plotsquared.core.plot.flag.implementations.PvpFlag;
|
||||||
@ -98,6 +102,7 @@ import com.plotsquared.core.plot.flag.implementations.SnowMeltFlag;
|
|||||||
import com.plotsquared.core.plot.flag.implementations.SoilDryFlag;
|
import com.plotsquared.core.plot.flag.implementations.SoilDryFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.TamedAttackFlag;
|
import com.plotsquared.core.plot.flag.implementations.TamedAttackFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.TamedInteractFlag;
|
import com.plotsquared.core.plot.flag.implementations.TamedInteractFlag;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.TileDropFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.TimeFlag;
|
import com.plotsquared.core.plot.flag.implementations.TimeFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.TitlesFlag;
|
import com.plotsquared.core.plot.flag.implementations.TitlesFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.UntrustedVisitFlag;
|
import com.plotsquared.core.plot.flag.implementations.UntrustedVisitFlag;
|
||||||
@ -142,6 +147,7 @@ public final class GlobalFlagContainer extends FlagContainer {
|
|||||||
this.addFlag(BeaconEffectsFlag.BEACON_EFFECT_TRUE);
|
this.addFlag(BeaconEffectsFlag.BEACON_EFFECT_TRUE);
|
||||||
this.addFlag(BlockIgnitionFlag.BLOCK_IGNITION_TRUE);
|
this.addFlag(BlockIgnitionFlag.BLOCK_IGNITION_TRUE);
|
||||||
this.addFlag(ChatFlag.CHAT_FLAG_TRUE);
|
this.addFlag(ChatFlag.CHAT_FLAG_TRUE);
|
||||||
|
this.addFlag(ConcreteHardenFlag.CONCRETE_HARDEN_TRUE);
|
||||||
this.addFlag(CopperOxideFlag.COPPER_OXIDE_FALSE);
|
this.addFlag(CopperOxideFlag.COPPER_OXIDE_FALSE);
|
||||||
this.addFlag(CoralDryFlag.CORAL_DRY_FALSE);
|
this.addFlag(CoralDryFlag.CORAL_DRY_FALSE);
|
||||||
this.addFlag(CropGrowFlag.CROP_GROW_TRUE);
|
this.addFlag(CropGrowFlag.CROP_GROW_TRUE);
|
||||||
@ -151,8 +157,10 @@ public final class GlobalFlagContainer extends FlagContainer {
|
|||||||
this.addFlag(DeviceInteractFlag.DEVICE_INTERACT_FALSE);
|
this.addFlag(DeviceInteractFlag.DEVICE_INTERACT_FALSE);
|
||||||
this.addFlag(DisablePhysicsFlag.DISABLE_PHYSICS_FALSE);
|
this.addFlag(DisablePhysicsFlag.DISABLE_PHYSICS_FALSE);
|
||||||
this.addFlag(DropProtectionFlag.DROP_PROTECTION_FALSE);
|
this.addFlag(DropProtectionFlag.DROP_PROTECTION_FALSE);
|
||||||
|
this.addFlag(EditSignFlag.EDIT_SIGN_FALSE);
|
||||||
this.addFlag(EntityChangeBlockFlag.ENTITY_CHANGE_BLOCK_FALSE);
|
this.addFlag(EntityChangeBlockFlag.ENTITY_CHANGE_BLOCK_FALSE);
|
||||||
this.addFlag(ExplosionFlag.EXPLOSION_FALSE);
|
this.addFlag(ExplosionFlag.EXPLOSION_FALSE);
|
||||||
|
this.addFlag(FishingFlag.FISHING_FALSE);
|
||||||
this.addFlag(ForcefieldFlag.FORCEFIELD_FALSE);
|
this.addFlag(ForcefieldFlag.FORCEFIELD_FALSE);
|
||||||
this.addFlag(GrassGrowFlag.GRASS_GROW_TRUE);
|
this.addFlag(GrassGrowFlag.GRASS_GROW_TRUE);
|
||||||
this.addFlag(HangingBreakFlag.HANGING_BREAK_FALSE);
|
this.addFlag(HangingBreakFlag.HANGING_BREAK_FALSE);
|
||||||
@ -181,6 +189,7 @@ public final class GlobalFlagContainer extends FlagContainer {
|
|||||||
this.addFlag(NoWorldeditFlag.NO_WORLDEDIT_FALSE);
|
this.addFlag(NoWorldeditFlag.NO_WORLDEDIT_FALSE);
|
||||||
this.addFlag(PlayerInteractFlag.PLAYER_INTERACT_FALSE);
|
this.addFlag(PlayerInteractFlag.PLAYER_INTERACT_FALSE);
|
||||||
this.addFlag(PreventCreativeCopyFlag.PREVENT_CREATIVE_COPY_FALSE);
|
this.addFlag(PreventCreativeCopyFlag.PREVENT_CREATIVE_COPY_FALSE);
|
||||||
|
this.addFlag(ProjectileChangeBlockFlag.PROJECTILE_CHANGE_BLOCK_FALSE);
|
||||||
this.addFlag(PveFlag.PVE_FALSE);
|
this.addFlag(PveFlag.PVE_FALSE);
|
||||||
this.addFlag(PvpFlag.PVP_FALSE);
|
this.addFlag(PvpFlag.PVP_FALSE);
|
||||||
this.addFlag(RedstoneFlag.REDSTONE_TRUE);
|
this.addFlag(RedstoneFlag.REDSTONE_TRUE);
|
||||||
@ -190,6 +199,7 @@ public final class GlobalFlagContainer extends FlagContainer {
|
|||||||
this.addFlag(SoilDryFlag.SOIL_DRY_FALSE);
|
this.addFlag(SoilDryFlag.SOIL_DRY_FALSE);
|
||||||
this.addFlag(TamedAttackFlag.TAMED_ATTACK_FALSE);
|
this.addFlag(TamedAttackFlag.TAMED_ATTACK_FALSE);
|
||||||
this.addFlag(TamedInteractFlag.TAMED_INTERACT_FALSE);
|
this.addFlag(TamedInteractFlag.TAMED_INTERACT_FALSE);
|
||||||
|
this.addFlag(TileDropFlag.TILE_DROP_TRUE);
|
||||||
this.addFlag(UntrustedVisitFlag.UNTRUSTED_VISIT_FLAG_TRUE);
|
this.addFlag(UntrustedVisitFlag.UNTRUSTED_VISIT_FLAG_TRUE);
|
||||||
this.addFlag(VehicleBreakFlag.VEHICLE_BREAK_FALSE);
|
this.addFlag(VehicleBreakFlag.VEHICLE_BREAK_FALSE);
|
||||||
this.addFlag(VehiclePlaceFlag.VEHICLE_PLACE_FALSE);
|
this.addFlag(VehiclePlaceFlag.VEHICLE_PLACE_FALSE);
|
||||||
|
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* PlotSquared, a land and world management plugin for Minecraft.
|
||||||
|
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
||||||
|
* Copyright (C) IntellectualSites team and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.plotsquared.core.plot.flag.implementations;
|
||||||
|
|
||||||
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
|
import com.plotsquared.core.plot.flag.types.BooleanFlag;
|
||||||
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
|
public class ConcreteHardenFlag extends BooleanFlag<ConcreteHardenFlag> {
|
||||||
|
|
||||||
|
public static final ConcreteHardenFlag CONCRETE_HARDEN_TRUE = new ConcreteHardenFlag(true);
|
||||||
|
public static final ConcreteHardenFlag CONCRETE_HARDEN_FALSE = new ConcreteHardenFlag(false);
|
||||||
|
|
||||||
|
private ConcreteHardenFlag(boolean value) {
|
||||||
|
super(value, TranslatableCaption.of("flags.flag_description_concrete_harden"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ConcreteHardenFlag flagOf(@NonNull Boolean value) {
|
||||||
|
return value ? CONCRETE_HARDEN_TRUE : CONCRETE_HARDEN_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* PlotSquared, a land and world management plugin for Minecraft.
|
||||||
|
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
||||||
|
* Copyright (C) IntellectualSites team and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.plotsquared.core.plot.flag.implementations;
|
||||||
|
|
||||||
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
|
import com.plotsquared.core.plot.flag.types.BooleanFlag;
|
||||||
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 7.2.1
|
||||||
|
*/
|
||||||
|
public class EditSignFlag extends BooleanFlag<EditSignFlag> {
|
||||||
|
public static final EditSignFlag EDIT_SIGN_TRUE = new EditSignFlag(true);
|
||||||
|
public static final EditSignFlag EDIT_SIGN_FALSE = new EditSignFlag(false);
|
||||||
|
|
||||||
|
private EditSignFlag(final boolean value) {
|
||||||
|
super(value, TranslatableCaption.of("flags.flag_description_edit_sign"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected EditSignFlag flagOf(@NonNull final Boolean value) {
|
||||||
|
return value ? EDIT_SIGN_TRUE : EDIT_SIGN_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* PlotSquared, a land and world management plugin for Minecraft.
|
||||||
|
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
||||||
|
* Copyright (C) IntellectualSites team and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.plotsquared.core.plot.flag.implementations;
|
||||||
|
|
||||||
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
|
import com.plotsquared.core.plot.flag.types.BooleanFlag;
|
||||||
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
|
public class FishingFlag extends BooleanFlag<FishingFlag> {
|
||||||
|
|
||||||
|
public static final FishingFlag FISHING_TRUE = new FishingFlag(true);
|
||||||
|
public static final FishingFlag FISHING_FALSE = new FishingFlag(false);
|
||||||
|
|
||||||
|
private FishingFlag(boolean value) {
|
||||||
|
super(value, TranslatableCaption.of("flags.flag_description_fishing"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected FishingFlag flagOf(@NonNull final Boolean value) {
|
||||||
|
return value ? FISHING_TRUE : FISHING_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* PlotSquared, a land and world management plugin for Minecraft.
|
||||||
|
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
||||||
|
* Copyright (C) IntellectualSites team and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.plotsquared.core.plot.flag.implementations;
|
||||||
|
|
||||||
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
|
import com.plotsquared.core.plot.flag.types.BooleanFlag;
|
||||||
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
|
public class ProjectileChangeBlockFlag extends BooleanFlag<ProjectileChangeBlockFlag> {
|
||||||
|
|
||||||
|
public static final ProjectileChangeBlockFlag PROJECTILE_CHANGE_BLOCK_TRUE = new ProjectileChangeBlockFlag(true);
|
||||||
|
public static final ProjectileChangeBlockFlag PROJECTILE_CHANGE_BLOCK_FALSE = new ProjectileChangeBlockFlag(false);
|
||||||
|
|
||||||
|
private ProjectileChangeBlockFlag(boolean value) {
|
||||||
|
super(value, TranslatableCaption.of("flags.flag_description_projectile_change_block"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ProjectileChangeBlockFlag flagOf(@NonNull Boolean value) {
|
||||||
|
return value ? PROJECTILE_CHANGE_BLOCK_TRUE : PROJECTILE_CHANGE_BLOCK_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* PlotSquared, a land and world management plugin for Minecraft.
|
||||||
|
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
||||||
|
* Copyright (C) IntellectualSites team and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.plotsquared.core.plot.flag.implementations;
|
||||||
|
|
||||||
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
|
import com.plotsquared.core.plot.flag.types.BooleanFlag;
|
||||||
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 7.3.7
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class TileDropFlag extends BooleanFlag<TileDropFlag> {
|
||||||
|
|
||||||
|
public static final TileDropFlag TILE_DROP_TRUE = new TileDropFlag(true);
|
||||||
|
public static final TileDropFlag TILE_DROP_FALSE = new TileDropFlag(false);
|
||||||
|
|
||||||
|
private TileDropFlag(boolean value) {
|
||||||
|
super(value, TranslatableCaption.of("flags.flag_description_tile_drop"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected TileDropFlag flagOf(@NonNull Boolean value) {
|
||||||
|
return value ? TILE_DROP_TRUE : TILE_DROP_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -37,7 +37,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public class SinglePlotManager extends PlotManager {
|
public class SinglePlotManager extends PlotManager {
|
||||||
|
|
||||||
private static final int MAX_COORDINATE = 30000000;
|
private static final int MAX_COORDINATE = 20000000;
|
||||||
|
|
||||||
public SinglePlotManager(final @NonNull PlotArea plotArea) {
|
public SinglePlotManager(final @NonNull PlotArea plotArea) {
|
||||||
super(plotArea);
|
super(plotArea);
|
||||||
|
@ -183,7 +183,7 @@ public class ChunkCoordinatorBuilder {
|
|||||||
* Set whether the chunks should be allow to unload after being accessed. This should only be used where the chunks are read from
|
* Set whether the chunks should be allow to unload after being accessed. This should only be used where the chunks are read from
|
||||||
* and then written to from a separate queue where they're consequently unloaded.
|
* and then written to from a separate queue where they're consequently unloaded.
|
||||||
*
|
*
|
||||||
* @param unloadAfter if to unload chuns afterwards
|
* @param unloadAfter if to unload chunks afterwards
|
||||||
* @return this ChunkCoordinatorBuilder instance
|
* @return this ChunkCoordinatorBuilder instance
|
||||||
*/
|
*/
|
||||||
public @NonNull ChunkCoordinatorBuilder unloadAfter(final boolean unloadAfter) {
|
public @NonNull ChunkCoordinatorBuilder unloadAfter(final boolean unloadAfter) {
|
||||||
|
@ -31,6 +31,8 @@ import com.sk89q.worldedit.world.registry.LegacyMapper;
|
|||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link BlockState} related utility methods
|
* {@link BlockState} related utility methods
|
||||||
*/
|
*/
|
||||||
@ -43,7 +45,8 @@ public final class BlockUtil {
|
|||||||
PARSER_CONTEXT.setRestricted(false);
|
PARSER_CONTEXT.setRestricted(false);
|
||||||
PARSER_CONTEXT.setPreferringWildcard(false);
|
PARSER_CONTEXT.setPreferringWildcard(false);
|
||||||
PARSER_CONTEXT.setTryLegacy(true);
|
PARSER_CONTEXT.setTryLegacy(true);
|
||||||
PARSER = WorldEdit.getInstance().getBlockFactory().getParsers().get(0);
|
List<InputParser<BaseBlock>> parsers = WorldEdit.getInstance().getBlockFactory().getParsers();
|
||||||
|
PARSER = parsers.get(parsers.size() - 1); // Default parser is always at the end
|
||||||
}
|
}
|
||||||
|
|
||||||
private BlockUtil() {
|
private BlockUtil() {
|
||||||
|
@ -42,28 +42,14 @@ public class EntityUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static int capNumeral(final @NonNull String flagName) {
|
private static int capNumeral(final @NonNull String flagName) {
|
||||||
int i;
|
return switch (flagName) {
|
||||||
switch (flagName) {
|
case "mob-cap" -> CAP_MOB;
|
||||||
case "mob-cap":
|
case "hostile-cap" -> CAP_MONSTER;
|
||||||
i = CAP_MOB;
|
case "animal-cap" -> CAP_ANIMAL;
|
||||||
break;
|
case "vehicle-cap" -> CAP_VEHICLE;
|
||||||
case "hostile-cap":
|
case "misc-cap" -> CAP_MISC;
|
||||||
i = CAP_MONSTER;
|
default -> CAP_ENTITY;
|
||||||
break;
|
};
|
||||||
case "animal-cap":
|
|
||||||
i = CAP_ANIMAL;
|
|
||||||
break;
|
|
||||||
case "vehicle-cap":
|
|
||||||
i = CAP_VEHICLE;
|
|
||||||
break;
|
|
||||||
case "misc-cap":
|
|
||||||
i = CAP_MISC;
|
|
||||||
break;
|
|
||||||
case "entity-cap":
|
|
||||||
default:
|
|
||||||
i = CAP_ENTITY;
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
@ -25,11 +25,13 @@ import com.plotsquared.core.configuration.Settings;
|
|||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
import com.plotsquared.core.events.PlayerAutoPlotEvent;
|
import com.plotsquared.core.events.PlayerAutoPlotEvent;
|
||||||
import com.plotsquared.core.events.PlayerAutoPlotsChosenEvent;
|
import com.plotsquared.core.events.PlayerAutoPlotsChosenEvent;
|
||||||
|
import com.plotsquared.core.events.PlayerBuyPlotEvent;
|
||||||
import com.plotsquared.core.events.PlayerClaimPlotEvent;
|
import com.plotsquared.core.events.PlayerClaimPlotEvent;
|
||||||
import com.plotsquared.core.events.PlayerEnterPlotEvent;
|
import com.plotsquared.core.events.PlayerEnterPlotEvent;
|
||||||
import com.plotsquared.core.events.PlayerLeavePlotEvent;
|
import com.plotsquared.core.events.PlayerLeavePlotEvent;
|
||||||
import com.plotsquared.core.events.PlayerPlotDeniedEvent;
|
import com.plotsquared.core.events.PlayerPlotDeniedEvent;
|
||||||
import com.plotsquared.core.events.PlayerPlotHelperEvent;
|
import com.plotsquared.core.events.PlayerPlotHelperEvent;
|
||||||
|
import com.plotsquared.core.events.PlayerPlotLimitEvent;
|
||||||
import com.plotsquared.core.events.PlayerPlotTrustedEvent;
|
import com.plotsquared.core.events.PlayerPlotTrustedEvent;
|
||||||
import com.plotsquared.core.events.PlayerTeleportToPlotEvent;
|
import com.plotsquared.core.events.PlayerTeleportToPlotEvent;
|
||||||
import com.plotsquared.core.events.PlotAutoMergeEvent;
|
import com.plotsquared.core.events.PlotAutoMergeEvent;
|
||||||
@ -48,7 +50,9 @@ import com.plotsquared.core.events.PlotUnlinkEvent;
|
|||||||
import com.plotsquared.core.events.RemoveRoadEntityEvent;
|
import com.plotsquared.core.events.RemoveRoadEntityEvent;
|
||||||
import com.plotsquared.core.events.TeleportCause;
|
import com.plotsquared.core.events.TeleportCause;
|
||||||
import com.plotsquared.core.events.post.PostPlayerAutoPlotEvent;
|
import com.plotsquared.core.events.post.PostPlayerAutoPlotEvent;
|
||||||
|
import com.plotsquared.core.events.post.PostPlayerBuyPlotEvent;
|
||||||
import com.plotsquared.core.events.post.PostPlotChangeOwnerEvent;
|
import com.plotsquared.core.events.post.PostPlotChangeOwnerEvent;
|
||||||
|
import com.plotsquared.core.events.post.PostPlotClearEvent;
|
||||||
import com.plotsquared.core.events.post.PostPlotDeleteEvent;
|
import com.plotsquared.core.events.post.PostPlotDeleteEvent;
|
||||||
import com.plotsquared.core.events.post.PostPlotMergeEvent;
|
import com.plotsquared.core.events.post.PostPlotMergeEvent;
|
||||||
import com.plotsquared.core.events.post.PostPlotUnlinkEvent;
|
import com.plotsquared.core.events.post.PostPlotUnlinkEvent;
|
||||||
@ -56,6 +60,7 @@ import com.plotsquared.core.listener.PlayerBlockEventType;
|
|||||||
import com.plotsquared.core.location.Direction;
|
import com.plotsquared.core.location.Direction;
|
||||||
import com.plotsquared.core.location.Location;
|
import com.plotsquared.core.location.Location;
|
||||||
import com.plotsquared.core.permissions.Permission;
|
import com.plotsquared.core.permissions.Permission;
|
||||||
|
import com.plotsquared.core.player.OfflinePlotPlayer;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.plot.PlotArea;
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
@ -63,6 +68,7 @@ import com.plotsquared.core.plot.PlotId;
|
|||||||
import com.plotsquared.core.plot.Rating;
|
import com.plotsquared.core.plot.Rating;
|
||||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.DeviceInteractFlag;
|
import com.plotsquared.core.plot.flag.implementations.DeviceInteractFlag;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.EditSignFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.MiscPlaceFlag;
|
import com.plotsquared.core.plot.flag.implementations.MiscPlaceFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.MobPlaceFlag;
|
import com.plotsquared.core.plot.flag.implementations.MobPlaceFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.PlaceFlag;
|
import com.plotsquared.core.plot.flag.implementations.PlaceFlag;
|
||||||
@ -74,6 +80,7 @@ import com.plotsquared.core.util.task.TaskManager;
|
|||||||
import com.sk89q.worldedit.WorldEdit;
|
import com.sk89q.worldedit.WorldEdit;
|
||||||
import com.sk89q.worldedit.entity.Entity;
|
import com.sk89q.worldedit.entity.Entity;
|
||||||
import com.sk89q.worldedit.function.pattern.Pattern;
|
import com.sk89q.worldedit.function.pattern.Pattern;
|
||||||
|
import com.sk89q.worldedit.world.block.BlockCategories;
|
||||||
import com.sk89q.worldedit.world.block.BlockType;
|
import com.sk89q.worldedit.world.block.BlockType;
|
||||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
@ -176,6 +183,12 @@ public class EventDispatcher {
|
|||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PostPlotClearEvent callPostPlotClear(PlotPlayer<?> player, Plot plot) {
|
||||||
|
PostPlotClearEvent event = new PostPlotClearEvent(player, plot);
|
||||||
|
callEvent(event);
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
|
||||||
public PlotDeleteEvent callDelete(Plot plot) {
|
public PlotDeleteEvent callDelete(Plot plot) {
|
||||||
PlotDeleteEvent event = new PlotDeleteEvent(plot);
|
PlotDeleteEvent event = new PlotDeleteEvent(plot);
|
||||||
callEvent(event);
|
callEvent(event);
|
||||||
@ -306,6 +319,23 @@ public class EventDispatcher {
|
|||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PlayerPlotLimitEvent callPlayerPlotLimit(PlotPlayer<?> player, int calculatedLimit) {
|
||||||
|
PlayerPlotLimitEvent event = new PlayerPlotLimitEvent(player, calculatedLimit);
|
||||||
|
eventBus.post(event);
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PlayerBuyPlotEvent callPlayerBuyPlot(PlotPlayer<?> player, Plot plot, double price) {
|
||||||
|
PlayerBuyPlotEvent event = new PlayerBuyPlotEvent(player, plot, price);
|
||||||
|
eventBus.post(event);
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void callPostPlayerBuyPlot(PlotPlayer<?> player, OfflinePlotPlayer previousOwner, Plot plot,
|
||||||
|
double price) {
|
||||||
|
eventBus.post(new PostPlayerBuyPlotEvent(player, previousOwner, plot, price));
|
||||||
|
}
|
||||||
|
|
||||||
public void doJoinTask(final PlotPlayer<?> player) {
|
public void doJoinTask(final PlotPlayer<?> player) {
|
||||||
if (player == null) {
|
if (player == null) {
|
||||||
return; //possible future warning message to figure out where we are retrieving null
|
return; //possible future warning message to figure out where we are retrieving null
|
||||||
@ -373,14 +403,10 @@ public class EventDispatcher {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return player.hasPermission(
|
return player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD, notifyPerms);
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString(), notifyPerms
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (!plot.hasOwner()) {
|
if (!plot.hasOwner()) {
|
||||||
return player.hasPermission(
|
return player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED, notifyPerms);
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_UNOWNED.toString(), notifyPerms
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
final List<BlockTypeWrapper> use = plot.getFlag(UseFlag.class);
|
final List<BlockTypeWrapper> use = plot.getFlag(UseFlag.class);
|
||||||
for (final BlockTypeWrapper blockTypeWrapper : use) {
|
for (final BlockTypeWrapper blockTypeWrapper : use) {
|
||||||
@ -389,7 +415,13 @@ public class EventDispatcher {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER.toString(), false)) {
|
if (player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER, false)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// we check for the EditSignFlag in the PlayerSignOpenEvent again, but we must not cancel the interact event
|
||||||
|
// or send a message if the flag is true
|
||||||
|
if (BlockCategories.ALL_SIGNS != null && BlockCategories.ALL_SIGNS.contains(blockType)
|
||||||
|
&& plot.getFlag(EditSignFlag.class)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (notifyPerms) {
|
if (notifyPerms) {
|
||||||
@ -408,14 +440,10 @@ public class EventDispatcher {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return player.hasPermission(
|
return player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD, false);
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString(), false
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (!plot.hasOwner()) {
|
if (!plot.hasOwner()) {
|
||||||
return player.hasPermission(
|
return player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED, false);
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_UNOWNED.toString(), false
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (plot.getFlag(DeviceInteractFlag.class)) {
|
if (plot.getFlag(DeviceInteractFlag.class)) {
|
||||||
return true;
|
return true;
|
||||||
@ -427,21 +455,14 @@ public class EventDispatcher {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return player.hasPermission(
|
return player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER, false);
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_OTHER.toString(),
|
|
||||||
false
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
case SPAWN_MOB -> {
|
case SPAWN_MOB -> {
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
return player.hasPermission(
|
return player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD, notifyPerms);
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString(), notifyPerms
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (!plot.hasOwner()) {
|
if (!plot.hasOwner()) {
|
||||||
return player.hasPermission(
|
return player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED, notifyPerms);
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_UNOWNED.toString(), notifyPerms
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (plot.getFlag(MobPlaceFlag.class)) {
|
if (plot.getFlag(MobPlaceFlag.class)) {
|
||||||
return true;
|
return true;
|
||||||
@ -453,10 +474,7 @@ public class EventDispatcher {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (player.hasPermission(
|
if (player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER, false)) {
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_OTHER.toString(),
|
|
||||||
false
|
|
||||||
)) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (notifyPerms) {
|
if (notifyPerms) {
|
||||||
@ -476,14 +494,10 @@ public class EventDispatcher {
|
|||||||
}
|
}
|
||||||
case PLACE_MISC -> {
|
case PLACE_MISC -> {
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
return player.hasPermission(
|
return player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD, notifyPerms);
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString(), notifyPerms
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (!plot.hasOwner()) {
|
if (!plot.hasOwner()) {
|
||||||
return player.hasPermission(
|
return player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED, notifyPerms);
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_UNOWNED.toString(), notifyPerms
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (plot.getFlag(MiscPlaceFlag.class)) {
|
if (plot.getFlag(MiscPlaceFlag.class)) {
|
||||||
return true;
|
return true;
|
||||||
@ -495,10 +509,7 @@ public class EventDispatcher {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (player.hasPermission(
|
if (player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER, false)) {
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_OTHER.toString(),
|
|
||||||
false
|
|
||||||
)) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (notifyPerms) {
|
if (notifyPerms) {
|
||||||
@ -518,16 +529,29 @@ public class EventDispatcher {
|
|||||||
}
|
}
|
||||||
case PLACE_VEHICLE -> {
|
case PLACE_VEHICLE -> {
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
return player.hasPermission(
|
return player.hasPermission(Permission.PERMISSION_ADMIN_PLACE_VEHICLE_ROAD, notifyPerms);
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString(), notifyPerms
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (!plot.hasOwner()) {
|
if (!plot.hasOwner()) {
|
||||||
return player.hasPermission(
|
return player.hasPermission(Permission.PERMISSION_ADMIN_PLACE_VEHICLE_UNOWNED, notifyPerms);
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_UNOWNED.toString(), notifyPerms
|
}
|
||||||
|
if (plot.getFlag(VehiclePlaceFlag.class)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (player.hasPermission(Permission.PERMISSION_ADMIN_PLACE_VEHICLE_OTHER, false)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (notifyPerms) {
|
||||||
|
player.sendMessage(
|
||||||
|
TranslatableCaption.of("commandconfig.flag_tutorial_usage"),
|
||||||
|
TagResolver.resolver(
|
||||||
|
"flag",
|
||||||
|
Tag.inserting(
|
||||||
|
PlotFlag.getFlagNameComponent(VehiclePlaceFlag.class)
|
||||||
|
)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return plot.getFlag(VehiclePlaceFlag.class);
|
return false;
|
||||||
}
|
}
|
||||||
default -> {
|
default -> {
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user