mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2025-07-03 06:04:43 +02:00
Compare commits
150 Commits
recordiniz
...
feature/co
Author | SHA1 | Date | |
---|---|---|---|
a5c1f1a74b | |||
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 | |||
f867867a42 | |||
59eefd6865 | |||
587a286d05 | |||
e10caf6aa0 | |||
08b325e37d | |||
c394108ba6 | |||
31e89019f1 | |||
3a7075e28d | |||
8373b7874e | |||
fe13882b97 | |||
f45064c4c4 | |||
af32399dd2 | |||
f3c03348d9 | |||
a53330e39b | |||
e2ba93dab9 | |||
9d43434e40 | |||
4f421167d1 | |||
94f4619c2c | |||
9885d3e506 | |||
a54276d3b2 | |||
cbb284b0fd | |||
ed22b22e9c | |||
444ccda807 | |||
db361cc420 | |||
079dc02cfe | |||
e98791c865 | |||
7c3112f30f | |||
c01f5f5c7d | |||
95caa19505 | |||
b8055201df | |||
81daefae4a | |||
02437a8c72 | |||
958c66b28f | |||
c656190e14 | |||
e914cb210e | |||
94c6af74d2 | |||
ebb82bd66d | |||
66f907eb5d | |||
9ffede2c5c | |||
97172df0dc | |||
c9746b182c | |||
10a2b80ffc | |||
ca0f38255d | |||
0484ac73af | |||
1a712ad3c1 | |||
2d1f483469 | |||
91830e233b | |||
561edb83bf | |||
0e09cf223a | |||
d78360d6eb | |||
1464804c11 | |||
8629eae5fc | |||
7b8ba7c3ac | |||
77c7466c17 | |||
82fe76fd37 | |||
3f81ea4ef8 | |||
745b06a008 | |||
77b2bd166a | |||
8e02336c44 | |||
3adfbde45a | |||
e6db8e2750 | |||
9cd0ee9b49 | |||
d455d1fcd7 | |||
ea19ff783f | |||
447e4c7d58 | |||
89031447f2 | |||
4210a3a555 | |||
42e146b8c7 | |||
a5fdcda673 | |||
52823f5024 | |||
1326c257a0 | |||
fc3137cd96 | |||
a5c53a96d1 | |||
c46cc73f52 |
7
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
7
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -7,8 +7,8 @@ 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://forms.gle/btgdRn9yhGtzEiGW8) 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
|
||||||
attributes:
|
attributes:
|
||||||
@ -27,6 +27,9 @@ body:
|
|||||||
description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first.
|
description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first.
|
||||||
multiple: false
|
multiple: false
|
||||||
options:
|
options:
|
||||||
|
- '1.20.2'
|
||||||
|
- '1.20'
|
||||||
|
- '1.19.4'
|
||||||
- '1.19.3'
|
- '1.19.3'
|
||||||
- '1.19.2'
|
- '1.19.2'
|
||||||
- '1.19.1'
|
- '1.19.1'
|
||||||
|
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@ -4,5 +4,5 @@ contact_links:
|
|||||||
url: https://discord.gg/intellectualsites
|
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:
|
||||||
|
19
.github/renovate.json
vendored
Normal file
19
.github/renovate.json
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||||
|
"extends": [
|
||||||
|
"config:base",
|
||||||
|
":semanticCommitsDisabled"
|
||||||
|
],
|
||||||
|
"automerge": true,
|
||||||
|
"labels": [
|
||||||
|
"dependencies"
|
||||||
|
],
|
||||||
|
"rebaseWhen": "conflicted",
|
||||||
|
"schedule": ["on the first day of the month"],
|
||||||
|
"ignoreDeps": [
|
||||||
|
"com.google.code.gson:gson",
|
||||||
|
"com.google.guava:guava",
|
||||||
|
"org.yaml:snakeyaml",
|
||||||
|
"org.apache.logging.log4j:log4j-api",
|
||||||
|
]
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
name: Announce release on discord
|
name: Announce release on discord
|
||||||
on:
|
on:
|
||||||
release:
|
release:
|
||||||
types: [published]
|
types: [ published ]
|
||||||
jobs:
|
jobs:
|
||||||
send_announcement:
|
send_announcement:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -11,7 +11,7 @@ jobs:
|
|||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
||||||
DISCORD_USERNAME: PlotSquared Release
|
DISCORD_USERNAME: PlotSquared Release
|
||||||
DISCORD_AVATAR: https://raw.githubusercontent.com/IntellectualSites/Assets/main/plugins/PlotSquared/PlotSquared.png
|
DISCORD_AVATAR: https://raw.githubusercontent.com/IntellectualSites/Assets/main/plugins/PlotSquared/PlotSquared.png
|
||||||
uses: Ilshidur/action-discord@0c4b27844ba47cb1c7bee539c8eead5284ce9fa9 # ratchet:Ilshidur/action-discord@0.3.2
|
uses: Ilshidur/action-discord@0.3.2
|
||||||
with:
|
with:
|
||||||
args: |
|
args: |
|
||||||
"<@&525015541815967744> <@&679322738552471574> <@&699293353862496266>"
|
"<@&525015541815967744> <@&679322738552471574> <@&699293353862496266>"
|
||||||
|
8
.github/workflows/build-pr.yml
vendored
8
.github/workflows/build-pr.yml
vendored
@ -1,17 +1,17 @@
|
|||||||
name: Build PR
|
name: Build PR
|
||||||
on: [pull_request]
|
on: [ pull_request ]
|
||||||
jobs:
|
jobs:
|
||||||
build_pr:
|
build_pr:
|
||||||
if: github.repository_owner == 'IntellectualSites'
|
if: github.repository_owner == 'IntellectualSites'
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
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@55e685c48d84285a5b0418cd094606e199cca3b6 # v1
|
uses: gradle/wrapper-validation-action@v1
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
|
23
.github/workflows/build.yml
vendored
23
.github/workflows/build.yml
vendored
@ -2,16 +2,16 @@ name: build
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- v7
|
- main
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
if: github.repository_owner == 'IntellectualSites'
|
if: github.repository_owner == 'IntellectualSites'
|
||||||
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@55e685c48d84285a5b0418cd094606e199cca3b6 # v1
|
uses: gradle/wrapper-validation-action@v1
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
@ -28,7 +28,7 @@ jobs:
|
|||||||
echo "STATUS=release" >> $GITHUB_ENV
|
echo "STATUS=release" >> $GITHUB_ENV
|
||||||
fi
|
fi
|
||||||
- name: Publish Release
|
- name: Publish Release
|
||||||
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v7'}}
|
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
|
||||||
run: ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository
|
run: ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository
|
||||||
env:
|
env:
|
||||||
ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
|
ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
|
||||||
@ -36,20 +36,14 @@ jobs:
|
|||||||
ORG_GRADLE_PROJECT_signingKey: ${{ secrets.SIGNING_KEY }}
|
ORG_GRADLE_PROJECT_signingKey: ${{ secrets.SIGNING_KEY }}
|
||||||
ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.SIGNING_PASSWORD }}
|
ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.SIGNING_PASSWORD }}
|
||||||
- name: Publish Snapshot
|
- name: Publish Snapshot
|
||||||
if: ${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v7' }}
|
if: ${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main' }}
|
||||||
run: ./gradlew publishToSonatype
|
run: ./gradlew publishToSonatype
|
||||||
env:
|
env:
|
||||||
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
|
||||||
<<<<<<< HEAD
|
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/v7'}}
|
|
||||||
if: ${{ runner.os == 'Linux' && env.STATUS == 'snapshot' && github.event_name == 'push' && github.ref == 'refs/heads/v7'}}
|
|
||||||
uses: cpina/github-action-push-to-another-repository@main
|
uses: cpina/github-action-push-to-another-repository@main
|
||||||
=======
|
|
||||||
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v6'}}
|
|
||||||
uses: cpina/github-action-push-to-another-repository@0a14457bb28b04dfa1652e0ffdfda866d2845c73 # main
|
|
||||||
>>>>>>> v6
|
|
||||||
env:
|
env:
|
||||||
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
||||||
with:
|
with:
|
||||||
@ -60,9 +54,8 @@ 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/v7'}}
|
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
|
||||||
if: ${{ runner.os == 'Linux' && env.STATUS == 'snapshot' && github.event_name == 'push' && github.ref == 'refs/heads/v7'}}
|
uses: cpina/github-action-push-to-another-repository@main
|
||||||
uses: cpina/github-action-push-to-another-repository@0a14457bb28b04dfa1652e0ffdfda866d2845c73 # main
|
|
||||||
env:
|
env:
|
||||||
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
||||||
with:
|
with:
|
||||||
|
19
.github/workflows/codeql.yml
vendored
19
.github/workflows/codeql.yml
vendored
@ -1,10 +1,10 @@
|
|||||||
name: "CodeQL"
|
name: "CodeQL"
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ v7 ]
|
branches: [ main ]
|
||||||
pull_request:
|
pull_request:
|
||||||
# The branches below must be a subset of the branches above
|
# The branches below must be a subset of the branches above
|
||||||
branches: [ v7 ]
|
branches: [ main ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
analyze:
|
analyze:
|
||||||
@ -17,15 +17,20 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
language: ['java']
|
language: [ 'java' ]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
- name: Setup Java
|
||||||
|
uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
distribution: temurin
|
||||||
|
java-version: 17
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@32dc499307d133bb5085bae78498c0ac2cf762d5 # v2
|
uses: github/codeql-action/init@v2
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@32dc499307d133bb5085bae78498c0ac2cf762d5 # v2
|
uses: github/codeql-action/autobuild@v2
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@32dc499307d133bb5085bae78498c0ac2cf762d5 # v2
|
uses: github/codeql-action/analyze@v2
|
||||||
|
6
.github/workflows/release-drafter.yml
vendored
6
.github/workflows/release-drafter.yml
vendored
@ -2,11 +2,11 @@ name: draft release
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- v6
|
- main
|
||||||
pull_request:
|
pull_request:
|
||||||
types: [opened, reopened, synchronize]
|
types: [ opened, reopened, synchronize ]
|
||||||
pull_request_target:
|
pull_request_target:
|
||||||
types: [opened, reopened, synchronize]
|
types: [ opened, reopened, synchronize ]
|
||||||
jobs:
|
jobs:
|
||||||
update_release_draft:
|
update_release_draft:
|
||||||
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 }}
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -137,3 +137,6 @@ docs/
|
|||||||
build/
|
build/
|
||||||
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
# Ignore run folders
|
||||||
|
run-[0-9].[0-9][0-9]/
|
||||||
|
run-[0-9].[0-9][0-9].[0-9]/
|
||||||
|
154
.idea/icon.svg
generated
154
.idea/icon.svg
generated
@ -1,48 +1,144 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" id="svg2" xml:space="preserve" width="4000" height="3333.3333" viewBox="0 0 4000 3333.3333" sodipodi:docname="PlotSquared.ai">
|
<svg
|
||||||
<metadata id="metadata8">
|
version="1.1"
|
||||||
|
id="svg2"
|
||||||
|
xml:space="preserve"
|
||||||
|
width="512"
|
||||||
|
height="512"
|
||||||
|
viewBox="0 0 512 512.00001"
|
||||||
|
sodipodi:docname="icon.svg"
|
||||||
|
inkscape:version="1.1.2 (b8e25be8, 2022-02-05)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||||
|
<metadata
|
||||||
|
id="metadata8">
|
||||||
<rdf:RDF>
|
<rdf:RDF>
|
||||||
<cc:Work rdf:about="">
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
<defs id="defs6">
|
<defs
|
||||||
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath18">
|
id="defs6">
|
||||||
<path d="M 0,2500 H 3000 V 0 H 0 Z" id="path16" />
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath18">
|
||||||
|
<path
|
||||||
|
d="M 0,2500 H 3000 V 0 H 0 Z"
|
||||||
|
id="path16" />
|
||||||
</clipPath>
|
</clipPath>
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="640" inkscape:window-height="480" id="namedview4" />
|
<sodipodi:namedview
|
||||||
<g id="g10" inkscape:groupmode="layer" inkscape:label="PlotSquared" transform="matrix(1.3333333,0,0,-1.3333333,0,3333.3333)">
|
pagecolor="#ffffff"
|
||||||
<g id="g12">
|
bordercolor="#666666"
|
||||||
<g id="g14" clip-path="url(#clipPath18)">
|
borderopacity="1"
|
||||||
<g id="g20" transform="translate(1486.1511,2242.6453)">
|
objecttolerance="10"
|
||||||
<path d="m 0,0 c 16.533,10.846 33.211,21.453 50.104,31.699 78.972,-48.281 153.985,-102.704 227.269,-159.144 148.61,-115.422 287.884,-243.01 414.393,-382.333 111.39,-122.861 212.751,-255.152 298.898,-396.971 52.744,-87.322 100.544,-177.884 139.514,-272.214 -11.638,-3.551 -23.108,-7.655 -34.362,-12.286 l -0.24,0.288 c -11.135,12.982 -24.141,24.212 -34.915,37.506 -22.557,23.013 -45.425,45.737 -68.03,68.678 -19.725,20.253 -40.601,39.45 -58.958,60.974 -36.355,36.451 -72.517,73.093 -108.944,109.471 -22.628,26.013 -48.064,49.385 -71.965,74.197 -19.029,19.485 -38.706,38.346 -57.519,57.999 -12.166,14.998 -26.684,27.716 -39.93,41.658 -27.668,27.524 -54.903,55.479 -82.571,82.979 -23.924,27.956 -51.664,52.264 -76.692,79.164 -4.68,4.487 -8.855,10.774 -15.886,11.326 -22.34,34.027 -58.311,57.327 -97.377,67.502 -104.312,99.153 -215.487,191.202 -332.661,274.782 -117.942,-83.94 -229.476,-176.781 -334.484,-276.39 -26.684,-0.024 -53.368,0.024 -80.076,-0.024 0.024,-26.564 0.048,-53.104 0,-79.668 -72.229,-73.021 -139.491,-150.937 -202.385,-232.092 -63.758,-82.619 -121.973,-169.51 -173.541,-260.264 131.932,-69.061 257.864,-149.521 375.926,-240.275 0.096,-26.444 -0.12,-52.888 0.096,-79.332 l 0.744,-0.984 c 20.109,-24.14 43.409,-45.233 65.126,-67.861 15.118,-15.382 30.571,-30.404 45.569,-45.881 17.565,-20.733 37.698,-39.042 56.607,-58.503 19.917,-20.781 41.25,-40.218 59.967,-62.151 29.156,-29.299 58.167,-58.815 87.515,-87.922 29.155,-33.043 61.502,-63.111 92.169,-94.738 13.726,-12.67 25.124,-27.571 38.634,-40.457 25.029,-25.365 50.129,-50.657 75.325,-75.853 -37.914,-51.208 -73.741,-103.952 -107.192,-158.183 -167.83,273.317 -397.235,507.305 -662.37,687.158 -81.875,55.335 -167.23,105.584 -255.681,149.641 -52.815,26.276 -106.831,50.248 -162.239,70.381 99.393,233.628 242.795,446.715 410.289,636.79 93.562,106.088 194.634,205.433 301.466,298.13 C -217.335,-155.808 -111.439,-73.789 0,0" style="fill:#062f4c;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path22" />
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1440"
|
||||||
|
inkscape:window-height="900"
|
||||||
|
id="namedview4"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="0.1632"
|
||||||
|
inkscape:cx="1087.6225"
|
||||||
|
inkscape:cy="1666.6666"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="g10" />
|
||||||
|
<g
|
||||||
|
id="g10"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
inkscape:label="PlotSquared"
|
||||||
|
transform="matrix(1.3333333,0,0,-1.3333333,0,3333.3333)">
|
||||||
|
<g
|
||||||
|
id="g12"
|
||||||
|
transform="matrix(0.16955078,0,0,0.16955078,-68.456969,2101.8529)">
|
||||||
|
<g
|
||||||
|
id="g14"
|
||||||
|
clip-path="url(#clipPath18)">
|
||||||
|
<g
|
||||||
|
id="g20"
|
||||||
|
transform="translate(1486.1511,2242.6453)">
|
||||||
|
<path
|
||||||
|
d="m 0,0 c 16.533,10.846 33.211,21.453 50.104,31.699 78.972,-48.281 153.985,-102.704 227.269,-159.144 148.61,-115.422 287.884,-243.01 414.393,-382.333 111.39,-122.861 212.751,-255.152 298.898,-396.971 52.744,-87.322 100.544,-177.884 139.514,-272.214 -11.638,-3.551 -23.108,-7.655 -34.362,-12.286 l -0.24,0.288 c -11.135,12.982 -24.141,24.212 -34.915,37.506 -22.557,23.013 -45.425,45.737 -68.03,68.678 -19.725,20.253 -40.601,39.45 -58.958,60.974 -36.355,36.451 -72.517,73.093 -108.944,109.471 -22.628,26.013 -48.064,49.385 -71.965,74.197 -19.029,19.485 -38.706,38.346 -57.519,57.999 -12.166,14.998 -26.684,27.716 -39.93,41.658 -27.668,27.524 -54.903,55.479 -82.571,82.979 -23.924,27.956 -51.664,52.264 -76.692,79.164 -4.68,4.487 -8.855,10.774 -15.886,11.326 -22.34,34.027 -58.311,57.327 -97.377,67.502 -104.312,99.153 -215.487,191.202 -332.661,274.782 -117.942,-83.94 -229.476,-176.781 -334.484,-276.39 -26.684,-0.024 -53.368,0.024 -80.076,-0.024 0.024,-26.564 0.048,-53.104 0,-79.668 -72.229,-73.021 -139.491,-150.937 -202.385,-232.092 -63.758,-82.619 -121.973,-169.51 -173.541,-260.264 131.932,-69.061 257.864,-149.521 375.926,-240.275 0.096,-26.444 -0.12,-52.888 0.096,-79.332 l 0.744,-0.984 c 20.109,-24.14 43.409,-45.233 65.126,-67.861 15.118,-15.382 30.571,-30.404 45.569,-45.881 17.565,-20.733 37.698,-39.042 56.607,-58.503 19.917,-20.781 41.25,-40.218 59.967,-62.151 29.156,-29.299 58.167,-58.815 87.515,-87.922 29.155,-33.043 61.502,-63.111 92.169,-94.738 13.726,-12.67 25.124,-27.571 38.634,-40.457 25.029,-25.365 50.129,-50.657 75.325,-75.853 -37.914,-51.208 -73.741,-103.952 -107.192,-158.183 -167.83,273.317 -397.235,507.305 -662.37,687.158 -81.875,55.335 -167.23,105.584 -255.681,149.641 -52.815,26.276 -106.831,50.248 -162.239,70.381 99.393,233.628 242.795,446.715 410.289,636.79 93.562,106.088 194.634,205.433 301.466,298.13 C -217.335,-155.808 -111.439,-73.789 0,0"
|
||||||
|
style="fill:#062f4c;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
id="path22" />
|
||||||
</g>
|
</g>
|
||||||
<g id="g24" transform="translate(1201.7948,1741.5303)">
|
<g
|
||||||
<path d="M 0,0 C 105.008,99.609 216.543,192.45 334.485,276.39 451.659,192.81 562.833,100.76 667.146,1.608 c -34.987,8.83 -71.51,9.718 -107.264,6.431 -41.202,-4.296 -82.907,-19.077 -112.543,-48.953 -33.019,-32.155 -49.456,-77.604 -55.311,-122.501 -28.124,27.908 -56.104,55.983 -84.035,84.083 -2.976,2.976 -6.839,4.823 -10.391,6.911 -19.029,26.348 -45.953,46.673 -76.62,57.495 C 187.555,-2.472 151.513,-0.12 116.166,0 Z" style="fill:#4c8fcc;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path26" />
|
id="g24"
|
||||||
|
transform="translate(1201.7948,1741.5303)">
|
||||||
|
<path
|
||||||
|
d="M 0,0 C 105.008,99.609 216.543,192.45 334.485,276.39 451.659,192.81 562.833,100.76 667.146,1.608 c -34.987,8.83 -71.51,9.718 -107.264,6.431 -41.202,-4.296 -82.907,-19.077 -112.543,-48.953 -33.019,-32.155 -49.456,-77.604 -55.311,-122.501 -28.124,27.908 -56.104,55.983 -84.035,84.083 -2.976,2.976 -6.839,4.823 -10.391,6.911 -19.029,26.348 -45.953,46.673 -76.62,57.495 C 187.555,-2.472 151.513,-0.12 116.166,0 Z"
|
||||||
|
style="fill:#4c8fcc;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
id="path26" />
|
||||||
</g>
|
</g>
|
||||||
<g id="g28" transform="translate(919.3342,1429.7462)">
|
<g
|
||||||
<path d="m 0,0 c 62.894,81.156 130.156,159.072 202.385,232.092 0.048,-244.21 0.024,-488.421 0,-732.631 C 84.323,-409.785 -41.61,-329.325 -173.541,-260.264 -121.973,-169.51 -63.758,-82.619 0,0" style="fill:#4c8fcc;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path30" />
|
id="g28"
|
||||||
|
transform="translate(919.3342,1429.7462)">
|
||||||
|
<path
|
||||||
|
d="m 0,0 c 62.894,81.156 130.156,159.072 202.385,232.092 0.048,-244.21 0.024,-488.421 0,-732.631 C 84.323,-409.785 -41.61,-329.325 -173.541,-260.264 -121.973,-169.51 -63.758,-82.619 0,0"
|
||||||
|
style="fill:#4c8fcc;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
id="path30" />
|
||||||
</g>
|
</g>
|
||||||
<g id="g32" transform="translate(1649.134,1700.6166)">
|
<g
|
||||||
<path d="m 0,0 c 29.635,29.875 71.341,44.657 112.543,48.952 35.754,3.288 72.277,2.4 107.263,-6.431 39.066,-10.174 75.037,-33.474 97.377,-67.501 11.879,-17.661 20.181,-37.411 26.42,-57.687 10.871,-38.802 11.95,-79.356 11.446,-119.358 -44.345,-0.072 -88.69,0.048 -133.035,-0.072 -1.032,30.907 3.263,63.686 -10.175,92.626 -9.526,20.325 -32.107,31.243 -53.751,32.131 -21.453,1.44 -45.065,-4.32 -59.175,-21.597 -12.79,-15.861 -15.382,-37.002 -16.558,-56.655 -1.295,-29.132 3.696,-59.031 17.518,-84.923 16.821,-30.619 39.378,-57.783 64.526,-81.9 31.387,-32.634 67.501,-60.374 97.857,-94.041 27.332,-28.988 51.256,-61.479 68.005,-97.785 20.541,-41.13 26.972,-87.827 25.82,-133.372 -0.912,-32.107 -5.231,-64.406 -16.149,-94.737 -11.59,-31.699 -31.123,-61.047 -58.335,-81.371 -25.124,-19.125 -55.696,-29.852 -86.651,-34.771 -49.552,-6.743 -101.888,-4.847 -148.465,14.854 -35.227,14.829 -64.238,42.689 -81.708,76.548 -20.996,40.242 -27.115,86.339 -27.259,131.212 0.048,17.829 0,35.658 0.048,53.463 44.345,0.048 88.69,-0.023 133.059,0.048 1.728,-35.538 -4.055,-72.06 5.663,-106.807 5.783,-22.173 26.204,-37.794 48.185,-41.754 20.733,-3.431 43.577,-2.015 61.622,9.791 15.502,9.43 23.949,26.78 26.78,44.225 5.903,35.922 1.872,74.293 -15.381,106.688 -16.918,30.595 -39.474,57.711 -64.55,81.899 -33.187,34.099 -71.173,63.254 -102.585,99.081 -26.756,28.867 -49.408,61.646 -65.486,97.641 -24.572,52.48 -26.731,112.422 -20.18,169.102 C -49.456,-77.604 -33.019,-32.155 0,0" style="fill:#feeeee;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path34" />
|
id="g32"
|
||||||
|
transform="translate(1649.134,1700.6166)">
|
||||||
|
<path
|
||||||
|
d="m 0,0 c 29.635,29.875 71.341,44.657 112.543,48.952 35.754,3.288 72.277,2.4 107.263,-6.431 39.066,-10.174 75.037,-33.474 97.377,-67.501 11.879,-17.661 20.181,-37.411 26.42,-57.687 10.871,-38.802 11.95,-79.356 11.446,-119.358 -44.345,-0.072 -88.69,0.048 -133.035,-0.072 -1.032,30.907 3.263,63.686 -10.175,92.626 -9.526,20.325 -32.107,31.243 -53.751,32.131 -21.453,1.44 -45.065,-4.32 -59.175,-21.597 -12.79,-15.861 -15.382,-37.002 -16.558,-56.655 -1.295,-29.132 3.696,-59.031 17.518,-84.923 16.821,-30.619 39.378,-57.783 64.526,-81.9 31.387,-32.634 67.501,-60.374 97.857,-94.041 27.332,-28.988 51.256,-61.479 68.005,-97.785 20.541,-41.13 26.972,-87.827 25.82,-133.372 -0.912,-32.107 -5.231,-64.406 -16.149,-94.737 -11.59,-31.699 -31.123,-61.047 -58.335,-81.371 -25.124,-19.125 -55.696,-29.852 -86.651,-34.771 -49.552,-6.743 -101.888,-4.847 -148.465,14.854 -35.227,14.829 -64.238,42.689 -81.708,76.548 -20.996,40.242 -27.115,86.339 -27.259,131.212 0.048,17.829 0,35.658 0.048,53.463 44.345,0.048 88.69,-0.023 133.059,0.048 1.728,-35.538 -4.055,-72.06 5.663,-106.807 5.783,-22.173 26.204,-37.794 48.185,-41.754 20.733,-3.431 43.577,-2.015 61.622,9.791 15.502,9.43 23.949,26.78 26.78,44.225 5.903,35.922 1.872,74.293 -15.381,106.688 -16.918,30.595 -39.474,57.711 -64.55,81.899 -33.187,34.099 -71.173,63.254 -102.585,99.081 -26.756,28.867 -49.408,61.646 -65.486,97.641 -24.572,52.48 -26.731,112.422 -20.18,169.102 C -49.456,-77.604 -33.019,-32.155 0,0"
|
||||||
|
style="fill:#feeeee;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
id="path34" />
|
||||||
</g>
|
</g>
|
||||||
<g id="g36" transform="translate(1262.7214,1613.126)">
|
<g
|
||||||
<path d="m 0,0 v -301.13 c 23.204,0.024 46.409,-0.048 69.613,0.024 18.525,0.288 38.202,6.575 50.153,21.429 12.43,17.277 13.917,39.522 14.613,60.111 0.024,43.985 -0.048,87.994 0.024,131.979 -0.48,23.637 -0.983,50.369 -17.277,69.23 C 104.864,-5.711 86.867,-0.24 69.589,0 46.385,0.048 23.204,0.024 0,0 m -141.002,128.38 c 26.708,0.048 53.392,0 80.075,0.024 H 55.24 c 35.346,-0.12 71.389,-2.471 104.815,-14.925 30.668,-10.823 57.592,-31.148 76.621,-57.496 26.852,-39.09 36.69,-87.202 38.058,-133.947 0.024,-48.833 0.096,-97.689 -0.024,-146.521 -1.728,-47.993 -11.974,-97.953 -41.514,-136.971 -22.748,-30.644 -57.495,-50.801 -94.281,-59.583 -45.377,-11.878 -92.578,-6.791 -138.891,-7.847 -0.072,-111.799 0,-223.574 -0.024,-335.373 -13.942,0 -27.86,0.024 -41.778,-0.024 -32.802,0.072 -65.605,0 -98.384,0.048 l -0.744,0.984 c -0.216,26.444 0,52.888 -0.096,79.332 0.024,244.211 0.048,488.421 0,732.632 0.048,26.563 0.024,53.103 0,79.667" style="fill:#feeeee;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path38" />
|
id="g36"
|
||||||
|
transform="translate(1262.7214,1613.126)">
|
||||||
|
<path
|
||||||
|
d="m 0,0 v -301.13 c 23.204,0.024 46.409,-0.048 69.613,0.024 18.525,0.288 38.202,6.575 50.153,21.429 12.43,17.277 13.917,39.522 14.613,60.111 0.024,43.985 -0.048,87.994 0.024,131.979 -0.48,23.637 -0.983,50.369 -17.277,69.23 C 104.864,-5.711 86.867,-0.24 69.589,0 46.385,0.048 23.204,0.024 0,0 m -141.002,128.38 c 26.708,0.048 53.392,0 80.075,0.024 H 55.24 c 35.346,-0.12 71.389,-2.471 104.815,-14.925 30.668,-10.823 57.592,-31.148 76.621,-57.496 26.852,-39.09 36.69,-87.202 38.058,-133.947 0.024,-48.833 0.096,-97.689 -0.024,-146.521 -1.728,-47.993 -11.974,-97.953 -41.514,-136.971 -22.748,-30.644 -57.495,-50.801 -94.281,-59.583 -45.377,-11.878 -92.578,-6.791 -138.891,-7.847 -0.072,-111.799 0,-223.574 -0.024,-335.373 -13.942,0 -27.86,0.024 -41.778,-0.024 -32.802,0.072 -65.605,0 -98.384,0.048 l -0.744,0.984 c -0.216,26.444 0,52.888 -0.096,79.332 0.024,244.211 0.048,488.421 0,732.632 0.048,26.563 0.024,53.103 0,79.667"
|
||||||
|
style="fill:#feeeee;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
id="path38" />
|
||||||
</g>
|
</g>
|
||||||
<g id="g40" transform="translate(1966.3174,1675.6364)">
|
<g
|
||||||
<path d="m 0,0 c 7.031,-0.552 11.206,-6.839 15.885,-11.326 25.029,-26.9 52.768,-51.208 76.693,-79.164 27.667,-27.5 54.903,-55.456 82.571,-82.979 13.246,-13.942 27.764,-26.66 39.93,-41.658 18.813,-19.653 38.49,-38.514 57.519,-57.999 23.9,-24.812 49.337,-48.185 71.965,-74.197 36.427,-36.378 72.589,-73.02 108.943,-109.471 18.358,-21.524 39.234,-40.722 58.959,-60.974 22.605,-22.941 45.473,-45.665 68.03,-68.678 10.774,-13.294 23.78,-24.524 34.914,-37.506 -103.904,-41.97 -203.488,-94.114 -298.922,-152.761 -246.994,-152.28 -466.224,-350.298 -639.333,-583.398 -25.197,25.196 -50.297,50.488 -75.325,75.852 -13.51,12.886 -24.908,27.788 -38.634,40.458 -30.667,31.627 -63.014,61.695 -92.17,94.738 -29.347,29.107 -58.359,58.623 -87.514,87.922 -18.717,21.933 -40.05,41.37 -59.967,62.151 -18.909,19.461 -39.042,37.77 -56.607,58.503 -14.998,15.477 -30.452,30.499 -45.569,45.88 -21.717,22.629 -45.017,43.722 -65.126,67.862 32.779,-0.048 65.582,0.024 98.384,-0.048 114.391,-98.097 220.407,-205.984 315.384,-322.99 92.914,114.318 196.242,220.022 307.753,316.271 30.955,4.919 61.526,15.646 86.65,34.771 27.212,20.325 46.745,49.672 58.335,81.371 107.312,77.988 219.327,149.929 337.509,210.376 -35.299,64.67 -75.829,126.437 -118.254,186.643 C 176.253,-228.037 104.24,-140.115 26.42,-57.687 20.181,-37.41 11.878,-17.661 0,0" style="fill:#042338;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path42" />
|
id="g40"
|
||||||
|
transform="translate(1966.3174,1675.6364)">
|
||||||
|
<path
|
||||||
|
d="m 0,0 c 7.031,-0.552 11.206,-6.839 15.885,-11.326 25.029,-26.9 52.768,-51.208 76.693,-79.164 27.667,-27.5 54.903,-55.456 82.571,-82.979 13.246,-13.942 27.764,-26.66 39.93,-41.658 18.813,-19.653 38.49,-38.514 57.519,-57.999 23.9,-24.812 49.337,-48.185 71.965,-74.197 36.427,-36.378 72.589,-73.02 108.943,-109.471 18.358,-21.524 39.234,-40.722 58.959,-60.974 22.605,-22.941 45.473,-45.665 68.03,-68.678 10.774,-13.294 23.78,-24.524 34.914,-37.506 -103.904,-41.97 -203.488,-94.114 -298.922,-152.761 -246.994,-152.28 -466.224,-350.298 -639.333,-583.398 -25.197,25.196 -50.297,50.488 -75.325,75.852 -13.51,12.886 -24.908,27.788 -38.634,40.458 -30.667,31.627 -63.014,61.695 -92.17,94.738 -29.347,29.107 -58.359,58.623 -87.514,87.922 -18.717,21.933 -40.05,41.37 -59.967,62.151 -18.909,19.461 -39.042,37.77 -56.607,58.503 -14.998,15.477 -30.452,30.499 -45.569,45.88 -21.717,22.629 -45.017,43.722 -65.126,67.862 32.779,-0.048 65.582,0.024 98.384,-0.048 114.391,-98.097 220.407,-205.984 315.384,-322.99 92.914,114.318 196.242,220.022 307.753,316.271 30.955,4.919 61.526,15.646 86.65,34.771 27.212,20.325 46.745,49.672 58.335,81.371 107.312,77.988 219.327,149.929 337.509,210.376 -35.299,64.67 -75.829,126.437 -118.254,186.643 C 176.253,-228.037 104.24,-140.115 26.42,-57.687 20.181,-37.41 11.878,-17.661 0,0"
|
||||||
|
style="fill:#042338;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
id="path42" />
|
||||||
</g>
|
</g>
|
||||||
<g id="g44" transform="translate(1499.3971,1669.1094)">
|
<g
|
||||||
<path d="m 0,0 c 3.551,-2.088 7.415,-3.935 10.39,-6.911 27.932,-28.1 55.912,-56.175 84.036,-84.083 -6.551,-56.679 -4.392,-116.622 20.18,-169.102 16.078,-35.994 38.73,-68.774 65.486,-97.641 31.412,-35.826 69.398,-64.982 102.585,-99.081 25.076,-24.188 47.632,-51.304 64.55,-81.899 17.253,-32.395 21.284,-70.765 15.381,-106.688 -2.831,-17.445 -11.278,-34.794 -26.78,-44.225 -18.045,-11.806 -40.889,-13.222 -61.622,-9.79 -21.981,3.959 -42.402,19.58 -48.185,41.753 -9.718,34.747 -3.935,71.269 -5.663,106.808 -44.369,-0.072 -88.714,0 -133.059,-0.048 -0.048,-17.806 0,-35.635 -0.048,-53.464 0.144,-44.873 6.263,-90.97 27.259,-131.212 17.47,-33.859 46.481,-61.718 81.708,-76.548 46.577,-19.701 98.913,-21.597 148.465,-14.854 -111.511,-96.249 -214.839,-201.953 -307.753,-316.271 -94.977,117.006 -200.993,224.893 -315.383,322.99 13.918,0.048 27.836,0.024 41.777,0.024 0.024,111.799 -0.048,223.574 0.024,335.372 46.313,1.056 93.514,-4.031 138.891,7.847 36.786,8.783 71.533,28.94 94.282,59.583 29.539,39.018 39.785,88.978 41.513,136.971 0.12,48.833 0.048,97.689 0.024,146.522 C 36.69,-87.203 26.852,-39.09 0,0" style="fill:#1c72ba;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path46" />
|
id="g44"
|
||||||
|
transform="translate(1499.3971,1669.1094)">
|
||||||
|
<path
|
||||||
|
d="m 0,0 c 3.551,-2.088 7.415,-3.935 10.39,-6.911 27.932,-28.1 55.912,-56.175 84.036,-84.083 -6.551,-56.679 -4.392,-116.622 20.18,-169.102 16.078,-35.994 38.73,-68.774 65.486,-97.641 31.412,-35.826 69.398,-64.982 102.585,-99.081 25.076,-24.188 47.632,-51.304 64.55,-81.899 17.253,-32.395 21.284,-70.765 15.381,-106.688 -2.831,-17.445 -11.278,-34.794 -26.78,-44.225 -18.045,-11.806 -40.889,-13.222 -61.622,-9.79 -21.981,3.959 -42.402,19.58 -48.185,41.753 -9.718,34.747 -3.935,71.269 -5.663,106.808 -44.369,-0.072 -88.714,0 -133.059,-0.048 -0.048,-17.806 0,-35.635 -0.048,-53.464 0.144,-44.873 6.263,-90.97 27.259,-131.212 17.47,-33.859 46.481,-61.718 81.708,-76.548 46.577,-19.701 98.913,-21.597 148.465,-14.854 -111.511,-96.249 -214.839,-201.953 -307.753,-316.271 -94.977,117.006 -200.993,224.893 -315.383,322.99 13.918,0.048 27.836,0.024 41.777,0.024 0.024,111.799 -0.048,223.574 0.024,335.372 46.313,1.056 93.514,-4.031 138.891,7.847 36.786,8.783 71.533,28.94 94.282,59.583 29.539,39.018 39.785,88.978 41.513,136.971 0.12,48.833 0.048,97.689 0.024,146.522 C 36.69,-87.203 26.852,-39.09 0,0"
|
||||||
|
style="fill:#1c72ba;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
id="path46" />
|
||||||
</g>
|
</g>
|
||||||
<g id="g48" transform="translate(1748.0469,1601.6797)">
|
<g
|
||||||
<path d="M 0,0 C 14.11,17.277 37.722,23.036 59.175,21.597 80.82,20.709 103.4,9.791 112.927,-10.534 c 13.438,-28.94 9.142,-61.719 10.174,-92.626 44.345,0.12 88.691,0 133.036,0.072 0.504,40.002 -0.576,80.556 -11.447,119.358 77.82,-82.428 149.833,-170.35 215.583,-262.664 42.426,-60.207 82.956,-121.973 118.254,-186.643 -118.182,-60.447 -230.196,-132.388 -337.508,-210.376 10.918,30.331 15.238,62.63 16.149,94.737 1.152,45.545 -5.279,92.242 -25.82,133.372 -16.749,36.306 -40.673,68.797 -68.005,97.785 -30.355,33.667 -66.47,61.406 -97.857,94.041 -25.148,24.117 -47.705,51.28 -64.526,81.9 -13.822,25.892 -18.813,55.791 -17.517,84.923 C -15.382,-37.002 -12.79,-15.862 0,0" style="fill:#1c72ba;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path50" />
|
id="g48"
|
||||||
|
transform="translate(1748.0469,1601.6797)">
|
||||||
|
<path
|
||||||
|
d="M 0,0 C 14.11,17.277 37.722,23.036 59.175,21.597 80.82,20.709 103.4,9.791 112.927,-10.534 c 13.438,-28.94 9.142,-61.719 10.174,-92.626 44.345,0.12 88.691,0 133.036,0.072 0.504,40.002 -0.576,80.556 -11.447,119.358 77.82,-82.428 149.833,-170.35 215.583,-262.664 42.426,-60.207 82.956,-121.973 118.254,-186.643 -118.182,-60.447 -230.196,-132.388 -337.508,-210.376 10.918,30.331 15.238,62.63 16.149,94.737 1.152,45.545 -5.279,92.242 -25.82,133.372 -16.749,36.306 -40.673,68.797 -68.005,97.785 -30.355,33.667 -66.47,61.406 -97.857,94.041 -25.148,24.117 -47.705,51.28 -64.526,81.9 -13.822,25.892 -18.813,55.791 -17.517,84.923 C -15.382,-37.002 -12.79,-15.862 0,0"
|
||||||
|
style="fill:#1c72ba;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
id="path50" />
|
||||||
</g>
|
</g>
|
||||||
<g id="g52" transform="translate(1262.7214,1613.126)">
|
<g
|
||||||
<path d="m 0,0 c 23.204,0.024 46.385,0.048 69.589,0 17.278,-0.24 35.275,-5.711 47.537,-18.357 16.294,-18.861 16.797,-45.593 17.277,-69.23 -0.072,-43.985 0,-87.994 -0.024,-131.979 -0.696,-20.589 -2.183,-42.834 -14.613,-60.111 -11.951,-14.854 -31.628,-21.141 -50.153,-21.429 -23.204,-0.072 -46.409,0 -69.613,-0.024 z" style="fill:#1c72ba;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path54" />
|
id="g52"
|
||||||
|
transform="translate(1262.7214,1613.126)">
|
||||||
|
<path
|
||||||
|
d="m 0,0 c 23.204,0.024 46.385,0.048 69.589,0 17.278,-0.24 35.275,-5.711 47.537,-18.357 16.294,-18.861 16.797,-45.593 17.277,-69.23 -0.072,-43.985 0,-87.994 -0.024,-131.979 -0.696,-20.589 -2.183,-42.834 -14.613,-60.111 -11.951,-14.854 -31.628,-21.141 -50.153,-21.429 -23.204,-0.072 -46.409,0 -69.613,-0.024 z"
|
||||||
|
style="fill:#1c72ba;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
id="path54" />
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 12 KiB |
@ -18,23 +18,23 @@ repositories {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
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 {
|
||||||
@ -62,6 +62,7 @@ tasks.processResources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
tasks.named<ShadowJar>("shadowJar") {
|
tasks.named<ShadowJar>("shadowJar") {
|
||||||
|
dependsOn(":plotsquared-core:shadowJar")
|
||||||
dependencies {
|
dependencies {
|
||||||
exclude(dependency("org.checkerframework:"))
|
exclude(dependency("org.checkerframework:"))
|
||||||
}
|
}
|
||||||
@ -88,6 +89,8 @@ tasks.named<ShadowJar>("shadowJar") {
|
|||||||
relocate("net.jcip", "com.plotsquared.core.annotations.jcip")
|
relocate("net.jcip", "com.plotsquared.core.annotations.jcip")
|
||||||
relocate("edu.umd.cs.findbugs", "com.plotsquared.core.annotations.findbugs")
|
relocate("edu.umd.cs.findbugs", "com.plotsquared.core.annotations.findbugs")
|
||||||
relocate("com.intellectualsites.annotations", "com.plotsquared.core.annotations.informative")
|
relocate("com.intellectualsites.annotations", "com.plotsquared.core.annotations.informative")
|
||||||
|
relocate("org.jdbi.v3", "com.plotsquared.core.jdbi")
|
||||||
|
relocate("com.zaxxer.hikari", "com.plotsquared.core.hikari")
|
||||||
|
|
||||||
// Get rid of all the libs which are 100% unused.
|
// Get rid of all the libs which are 100% unused.
|
||||||
minimize()
|
minimize()
|
||||||
@ -99,10 +102,10 @@ 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.adventure.kyori.net/api/4.12.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
|
||||||
|
@ -49,8 +49,8 @@ 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.UpdateUtility;
|
|
||||||
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;
|
||||||
@ -82,6 +82,8 @@ import com.plotsquared.core.inject.annotations.DefaultGenerator;
|
|||||||
import com.plotsquared.core.inject.annotations.ImpromptuPipeline;
|
import com.plotsquared.core.inject.annotations.ImpromptuPipeline;
|
||||||
import com.plotsquared.core.inject.annotations.WorldConfig;
|
import com.plotsquared.core.inject.annotations.WorldConfig;
|
||||||
import com.plotsquared.core.inject.annotations.WorldFile;
|
import com.plotsquared.core.inject.annotations.WorldFile;
|
||||||
|
import com.plotsquared.core.inject.modules.DatabaseModule;
|
||||||
|
import com.plotsquared.core.inject.modules.JdbiModule;
|
||||||
import com.plotsquared.core.inject.modules.PlotSquaredModule;
|
import com.plotsquared.core.inject.modules.PlotSquaredModule;
|
||||||
import com.plotsquared.core.listener.PlotListener;
|
import com.plotsquared.core.listener.PlotListener;
|
||||||
import com.plotsquared.core.listener.WESubscriber;
|
import com.plotsquared.core.listener.WESubscriber;
|
||||||
@ -140,6 +142,7 @@ import org.checkerframework.checker.nullness.qual.NonNull;
|
|||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
import org.incendo.serverlib.ServerLib;
|
import org.incendo.serverlib.ServerLib;
|
||||||
|
|
||||||
|
import javax.xml.crypto.Data;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
@ -252,6 +255,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();
|
||||||
|
|
||||||
@ -291,7 +295,9 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
new WorldManagerModule(),
|
new WorldManagerModule(),
|
||||||
new PlotSquaredModule(),
|
new PlotSquaredModule(),
|
||||||
new BukkitModule(this),
|
new BukkitModule(this),
|
||||||
new BackupModule()
|
new BackupModule(),
|
||||||
|
new JdbiModule(),
|
||||||
|
new DatabaseModule()
|
||||||
);
|
);
|
||||||
this.injector.injectMembers(this);
|
this.injector.injectMembers(this);
|
||||||
|
|
||||||
@ -366,7 +372,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
getServer().getPluginManager().registerEvents(injector().getInstance(ServerListener.class), this);
|
getServer().getPluginManager().registerEvents(injector().getInstance(ServerListener.class), this);
|
||||||
getServer().getPluginManager().registerEvents(injector().getInstance(EntitySpawnListener.class), this);
|
getServer().getPluginManager().registerEvents(injector().getInstance(EntitySpawnListener.class), this);
|
||||||
if (PaperLib.isPaper() && Settings.Paper_Components.PAPER_LISTENERS) {
|
if (PaperLib.isPaper() && Settings.Paper_Components.PAPER_LISTENERS) {
|
||||||
getServer().getPluginManager().registerEvents(injector().getInstance(PaperListener.class), this);
|
getServer().getPluginManager().registerEvents(injector().getInstance(PaperListener.class), this);
|
||||||
} else {
|
} else {
|
||||||
getServer().getPluginManager().registerEvents(injector().getInstance(SpigotListener.class), this);
|
getServer().getPluginManager().registerEvents(injector().getInstance(SpigotListener.class), this);
|
||||||
}
|
}
|
||||||
@ -550,7 +556,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);
|
||||||
@ -1160,6 +1166,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();
|
||||||
@ -1181,13 +1188,21 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
}
|
}
|
||||||
|
|
||||||
@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) {
|
||||||
msg.append("FastAsyncWorldEdit: ").append(Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit").getDescription().getVersion());
|
msg.append("FastAsyncWorldEdit: ").append(Bukkit
|
||||||
|
.getPluginManager()
|
||||||
|
.getPlugin("FastAsyncWorldEdit")
|
||||||
|
.getDescription()
|
||||||
|
.getVersion());
|
||||||
} else if (Bukkit.getPluginManager().getPlugin("AsyncWorldEdit") != null) {
|
} else if (Bukkit.getPluginManager().getPlugin("AsyncWorldEdit") != null) {
|
||||||
msg.append("AsyncWorldEdit: ").append(Bukkit.getPluginManager().getPlugin("AsyncWorldEdit").getDescription().getVersion()).append("\n");
|
msg.append("AsyncWorldEdit: ").append(Bukkit
|
||||||
|
.getPluginManager()
|
||||||
|
.getPlugin("AsyncWorldEdit")
|
||||||
|
.getDescription()
|
||||||
|
.getVersion()).append("\n");
|
||||||
msg.append("WorldEdit: ").append(Bukkit.getPluginManager().getPlugin("WorldEdit").getDescription().getVersion());
|
msg.append("WorldEdit: ").append(Bukkit.getPluginManager().getPlugin("WorldEdit").getDescription().getVersion());
|
||||||
} else {
|
} else {
|
||||||
msg.append("WorldEdit: ").append(Bukkit.getPluginManager().getPlugin("WorldEdit").getDescription().getVersion());
|
msg.append("WorldEdit: ").append(Bukkit.getPluginManager().getPlugin("WorldEdit").getDescription().getVersion());
|
||||||
|
@ -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);
|
||||||
|
|
||||||
@ -101,50 +103,26 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
this.noGravity = true;
|
this.noGravity = true;
|
||||||
}
|
}
|
||||||
switch (entity.getType().toString()) {
|
switch (entity.getType().toString()) {
|
||||||
case "BOAT":
|
case "BOAT" -> {
|
||||||
Boat boat = (Boat) entity;
|
Boat boat = (Boat) entity;
|
||||||
this.dataByte = getOrdinal(TreeSpecies.values(), boat.getWoodType());
|
this.dataByte = getOrdinal(TreeSpecies.values(), boat.getWoodType());
|
||||||
return;
|
return;
|
||||||
case "ARROW":
|
}
|
||||||
case "EGG":
|
case "ARROW", "EGG", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "EXPERIENCE_ORB", "FALLING_BLOCK", "FIREBALL",
|
||||||
case "ENDER_CRYSTAL":
|
"FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND", "MINECART_MOB_SPAWNER",
|
||||||
case "ENDER_PEARL":
|
"MINECART_TNT", "PLAYER", "PRIMED_TNT", "SLIME", "SMALL_FIREBALL", "SNOWBALL", "MINECART_FURNACE", "SPLASH_POTION",
|
||||||
case "ENDER_SIGNAL":
|
"THROWN_EXP_BOTTLE", "WITHER_SKULL", "UNKNOWN", "SPECTRAL_ARROW", "SHULKER_BULLET", "DRAGON_FIREBALL", "AREA_EFFECT_CLOUD",
|
||||||
case "EXPERIENCE_ORB":
|
"TRIDENT", "LLAMA_SPIT" -> {
|
||||||
case "FALLING_BLOCK":
|
|
||||||
case "FIREBALL":
|
|
||||||
case "FIREWORK":
|
|
||||||
case "FISHING_HOOK":
|
|
||||||
case "LEASH_HITCH":
|
|
||||||
case "LIGHTNING":
|
|
||||||
case "MINECART":
|
|
||||||
case "MINECART_COMMAND":
|
|
||||||
case "MINECART_MOB_SPAWNER":
|
|
||||||
case "MINECART_TNT":
|
|
||||||
case "PLAYER":
|
|
||||||
case "PRIMED_TNT":
|
|
||||||
case "SLIME":
|
|
||||||
case "SMALL_FIREBALL":
|
|
||||||
case "SNOWBALL":
|
|
||||||
case "MINECART_FURNACE":
|
|
||||||
case "SPLASH_POTION":
|
|
||||||
case "THROWN_EXP_BOTTLE":
|
|
||||||
case "WITHER_SKULL":
|
|
||||||
case "UNKNOWN":
|
|
||||||
case "SPECTRAL_ARROW":
|
|
||||||
case "SHULKER_BULLET":
|
|
||||||
case "DRAGON_FIREBALL":
|
|
||||||
case "AREA_EFFECT_CLOUD":
|
|
||||||
case "TRIDENT":
|
|
||||||
case "LLAMA_SPIT":
|
|
||||||
// Do this stuff later
|
// Do this stuff later
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
// MISC //
|
// MISC //
|
||||||
case "DROPPED_ITEM":
|
case "DROPPED_ITEM" -> {
|
||||||
Item item = (Item) entity;
|
Item item = (Item) entity;
|
||||||
this.stack = item.getItemStack();
|
this.stack = item.getItemStack();
|
||||||
return;
|
return;
|
||||||
case "ITEM_FRAME":
|
}
|
||||||
|
case "ITEM_FRAME" -> {
|
||||||
this.x = Math.floor(this.getX());
|
this.x = Math.floor(this.getX());
|
||||||
this.y = Math.floor(this.getY());
|
this.y = Math.floor(this.getY());
|
||||||
this.z = Math.floor(this.getZ());
|
this.z = Math.floor(this.getZ());
|
||||||
@ -152,7 +130,8 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
this.dataByte = getOrdinal(Rotation.values(), itemFrame.getRotation());
|
this.dataByte = getOrdinal(Rotation.values(), itemFrame.getRotation());
|
||||||
this.stack = itemFrame.getItem().clone();
|
this.stack = itemFrame.getItem().clone();
|
||||||
return;
|
return;
|
||||||
case "PAINTING":
|
}
|
||||||
|
case "PAINTING" -> {
|
||||||
this.x = Math.floor(this.getX());
|
this.x = Math.floor(this.getX());
|
||||||
this.y = Math.floor(this.getY());
|
this.y = Math.floor(this.getY());
|
||||||
this.z = Math.floor(this.getZ());
|
this.z = Math.floor(this.getZ());
|
||||||
@ -165,20 +144,17 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
}
|
}
|
||||||
this.dataString = art.name();
|
this.dataString = art.name();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
// END MISC //
|
// END MISC //
|
||||||
// INVENTORY HOLDER //
|
// INVENTORY HOLDER //
|
||||||
case "MINECART_CHEST":
|
case "MINECART_CHEST", "MINECART_HOPPER" -> {
|
||||||
case "MINECART_HOPPER":
|
|
||||||
storeInventory((InventoryHolder) entity);
|
storeInventory((InventoryHolder) entity);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
// START LIVING ENTITY //
|
// START LIVING ENTITY //
|
||||||
// START AGEABLE //
|
// START AGEABLE //
|
||||||
// START TAMEABLE //
|
// START TAMEABLE //
|
||||||
case "HORSE":
|
case "HORSE", "DONKEY", "LLAMA", "MULE", "SKELETON_HORSE" -> {
|
||||||
case "DONKEY":
|
|
||||||
case "LLAMA":
|
|
||||||
case "MULE":
|
|
||||||
case "SKELETON_HORSE":
|
|
||||||
AbstractHorse horse = (AbstractHorse) entity;
|
AbstractHorse horse = (AbstractHorse) entity;
|
||||||
this.horse = new HorseStats();
|
this.horse = new HorseStats();
|
||||||
this.horse.jump = horse.getJumpStrength();
|
this.horse.jump = horse.getJumpStrength();
|
||||||
@ -190,20 +166,21 @@ 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;
|
||||||
|
}
|
||||||
// END INVENTORY HOLDER //
|
// END INVENTORY HOLDER //
|
||||||
case "WOLF":
|
case "WOLF", "OCELOT" -> {
|
||||||
case "OCELOT":
|
|
||||||
storeTameable((Tameable) entity);
|
storeTameable((Tameable) entity);
|
||||||
storeAgeable((Ageable) entity);
|
storeBreedable((Breedable) entity);
|
||||||
storeLiving((LivingEntity) entity);
|
storeLiving((LivingEntity) entity);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
// END TAMEABLE //
|
// END TAMEABLE //
|
||||||
//todo fix sheep
|
//todo fix sheep
|
||||||
case "SHEEP":
|
case "SHEEP" -> {
|
||||||
Sheep sheep = (Sheep) entity;
|
Sheep sheep = (Sheep) entity;
|
||||||
if (sheep.isSheared()) {
|
if (sheep.isSheared()) {
|
||||||
this.dataByte = (byte) 1;
|
this.dataByte = (byte) 1;
|
||||||
@ -211,26 +188,23 @@ 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":
|
}
|
||||||
case "CHICKEN":
|
case "VILLAGER", "CHICKEN", "COW", "MUSHROOM_COW", "PIG", "TURTLE", "POLAR_BEAR" -> {
|
||||||
case "COW":
|
storeBreedable((Breedable) entity);
|
||||||
case "MUSHROOM_COW":
|
|
||||||
case "PIG":
|
|
||||||
case "TURTLE":
|
|
||||||
case "POLAR_BEAR":
|
|
||||||
storeAgeable((Ageable) 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;
|
||||||
|
}
|
||||||
// END AGEABLE //
|
// END AGEABLE //
|
||||||
case "ARMOR_STAND":
|
case "ARMOR_STAND" -> {
|
||||||
ArmorStand stand = (ArmorStand) entity;
|
ArmorStand stand = (ArmorStand) entity;
|
||||||
this.inventory =
|
this.inventory =
|
||||||
new ItemStack[]{stand.getItemInHand().clone(), stand.getHelmet().clone(),
|
new ItemStack[]{stand.getItemInHand().clone(), stand.getHelmet().clone(),
|
||||||
@ -238,37 +212,30 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
stand.getBoots().clone()};
|
stand.getBoots().clone()};
|
||||||
storeLiving(stand);
|
storeLiving(stand);
|
||||||
this.stand = new ArmorStandStats();
|
this.stand = new ArmorStandStats();
|
||||||
|
|
||||||
EulerAngle head = stand.getHeadPose();
|
EulerAngle head = stand.getHeadPose();
|
||||||
this.stand.head[0] = (float) head.getX();
|
this.stand.head[0] = (float) head.getX();
|
||||||
this.stand.head[1] = (float) head.getY();
|
this.stand.head[1] = (float) head.getY();
|
||||||
this.stand.head[2] = (float) head.getZ();
|
this.stand.head[2] = (float) head.getZ();
|
||||||
|
|
||||||
EulerAngle body = stand.getBodyPose();
|
EulerAngle body = stand.getBodyPose();
|
||||||
this.stand.body[0] = (float) body.getX();
|
this.stand.body[0] = (float) body.getX();
|
||||||
this.stand.body[1] = (float) body.getY();
|
this.stand.body[1] = (float) body.getY();
|
||||||
this.stand.body[2] = (float) body.getZ();
|
this.stand.body[2] = (float) body.getZ();
|
||||||
|
|
||||||
EulerAngle leftLeg = stand.getLeftLegPose();
|
EulerAngle leftLeg = stand.getLeftLegPose();
|
||||||
this.stand.leftLeg[0] = (float) leftLeg.getX();
|
this.stand.leftLeg[0] = (float) leftLeg.getX();
|
||||||
this.stand.leftLeg[1] = (float) leftLeg.getY();
|
this.stand.leftLeg[1] = (float) leftLeg.getY();
|
||||||
this.stand.leftLeg[2] = (float) leftLeg.getZ();
|
this.stand.leftLeg[2] = (float) leftLeg.getZ();
|
||||||
|
|
||||||
EulerAngle rightLeg = stand.getRightLegPose();
|
EulerAngle rightLeg = stand.getRightLegPose();
|
||||||
this.stand.rightLeg[0] = (float) rightLeg.getX();
|
this.stand.rightLeg[0] = (float) rightLeg.getX();
|
||||||
this.stand.rightLeg[1] = (float) rightLeg.getY();
|
this.stand.rightLeg[1] = (float) rightLeg.getY();
|
||||||
this.stand.rightLeg[2] = (float) rightLeg.getZ();
|
this.stand.rightLeg[2] = (float) rightLeg.getZ();
|
||||||
|
|
||||||
EulerAngle leftArm = stand.getLeftArmPose();
|
EulerAngle leftArm = stand.getLeftArmPose();
|
||||||
this.stand.leftArm[0] = (float) leftArm.getX();
|
this.stand.leftArm[0] = (float) leftArm.getX();
|
||||||
this.stand.leftArm[1] = (float) leftArm.getY();
|
this.stand.leftArm[1] = (float) leftArm.getY();
|
||||||
this.stand.leftArm[2] = (float) leftArm.getZ();
|
this.stand.leftArm[2] = (float) leftArm.getZ();
|
||||||
|
|
||||||
EulerAngle rightArm = stand.getRightArmPose();
|
EulerAngle rightArm = stand.getRightArmPose();
|
||||||
this.stand.rightArm[0] = (float) rightArm.getX();
|
this.stand.rightArm[0] = (float) rightArm.getX();
|
||||||
this.stand.rightArm[1] = (float) rightArm.getY();
|
this.stand.rightArm[1] = (float) rightArm.getY();
|
||||||
this.stand.rightArm[2] = (float) rightArm.getZ();
|
this.stand.rightArm[2] = (float) rightArm.getZ();
|
||||||
|
|
||||||
if (stand.hasArms()) {
|
if (stand.hasArms()) {
|
||||||
this.stand.arms = true;
|
this.stand.arms = true;
|
||||||
}
|
}
|
||||||
@ -282,53 +249,38 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
this.stand.small = true;
|
this.stand.small = true;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
case "ENDERMITE":
|
}
|
||||||
|
case "ENDERMITE" -> {
|
||||||
return;
|
return;
|
||||||
case "BAT":
|
}
|
||||||
|
case "BAT" -> {
|
||||||
if (((Bat) entity).isAwake()) {
|
if (((Bat) entity).isAwake()) {
|
||||||
this.dataByte = (byte) 1;
|
this.dataByte = (byte) 1;
|
||||||
} else {
|
} else {
|
||||||
this.dataByte = (byte) 0;
|
this.dataByte = (byte) 0;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
case "ENDER_DRAGON":
|
}
|
||||||
|
case "ENDER_DRAGON" -> {
|
||||||
EnderDragon entity1 = (EnderDragon) entity;
|
EnderDragon entity1 = (EnderDragon) entity;
|
||||||
this.dataByte = (byte) entity1.getPhase().ordinal();
|
this.dataByte = (byte) entity1.getPhase().ordinal();
|
||||||
return;
|
return;
|
||||||
case "SKELETON":
|
}
|
||||||
case "WITHER_SKELETON":
|
case "SKELETON", "WITHER_SKELETON", "GUARDIAN", "ELDER_GUARDIAN", "GHAST", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN",
|
||||||
case "GUARDIAN":
|
"ZOMBIFIED_PIGLIN", "PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH",
|
||||||
case "ELDER_GUARDIAN":
|
"GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SHULKER", "SNOWMAN" -> {
|
||||||
case "GHAST":
|
|
||||||
case "MAGMA_CUBE":
|
|
||||||
case "SQUID":
|
|
||||||
case "PIG_ZOMBIE":
|
|
||||||
case "HOGLIN":
|
|
||||||
case "ZOMBIFIED_PIGLIN":
|
|
||||||
case "PIGLIN":
|
|
||||||
case "PIGLIN_BRUTE":
|
|
||||||
case "ZOMBIE":
|
|
||||||
case "WITHER":
|
|
||||||
case "WITCH":
|
|
||||||
case "SPIDER":
|
|
||||||
case "CAVE_SPIDER":
|
|
||||||
case "SILVERFISH":
|
|
||||||
case "GIANT":
|
|
||||||
case "ENDERMAN":
|
|
||||||
case "CREEPER":
|
|
||||||
case "BLAZE":
|
|
||||||
case "SHULKER":
|
|
||||||
case "SNOWMAN":
|
|
||||||
storeLiving((LivingEntity) entity);
|
storeLiving((LivingEntity) entity);
|
||||||
return;
|
return;
|
||||||
case "IRON_GOLEM":
|
}
|
||||||
|
case "IRON_GOLEM" -> {
|
||||||
if (((IronGolem) entity).isPlayerCreated()) {
|
if (((IronGolem) entity).isPlayerCreated()) {
|
||||||
this.dataByte = (byte) 1;
|
this.dataByte = (byte) 1;
|
||||||
} else {
|
} else {
|
||||||
this.dataByte = (byte) 0;
|
this.dataByte = (byte) 0;
|
||||||
}
|
}
|
||||||
storeLiving((LivingEntity) entity);
|
storeLiving((LivingEntity) entity);
|
||||||
// END LIVING //
|
}
|
||||||
|
// END LIVING //
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -431,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();
|
||||||
@ -441,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();
|
||||||
@ -448,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();
|
||||||
@ -465,20 +450,15 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
}
|
}
|
||||||
Entity entity;
|
Entity entity;
|
||||||
switch (this.getType().toString()) {
|
switch (this.getType().toString()) {
|
||||||
case "DROPPED_ITEM":
|
case "DROPPED_ITEM" -> {
|
||||||
return world.dropItem(location, this.stack);
|
return world.dropItem(location, this.stack);
|
||||||
case "PLAYER":
|
}
|
||||||
case "LEASH_HITCH":
|
case "PLAYER", "LEASH_HITCH" -> {
|
||||||
return null;
|
return null;
|
||||||
case "ITEM_FRAME":
|
}
|
||||||
entity = world.spawn(location, ItemFrame.class);
|
case "ITEM_FRAME" -> entity = world.spawn(location, ItemFrame.class);
|
||||||
break;
|
case "PAINTING" -> entity = world.spawn(location, Painting.class);
|
||||||
case "PAINTING":
|
default -> entity = world.spawnEntity(location, this.getType());
|
||||||
entity = world.spawn(location, Painting.class);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
entity = world.spawnEntity(location, this.getType());
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
if (this.depth == 0) {
|
if (this.depth == 0) {
|
||||||
return entity;
|
return entity;
|
||||||
@ -506,72 +486,46 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
entity.setGravity(false);
|
entity.setGravity(false);
|
||||||
}
|
}
|
||||||
switch (entity.getType().toString()) {
|
switch (entity.getType().toString()) {
|
||||||
case "BOAT":
|
case "BOAT" -> {
|
||||||
Boat boat = (Boat) entity;
|
Boat boat = (Boat) entity;
|
||||||
boat.setWoodType(TreeSpecies.values()[dataByte]);
|
boat.setWoodType(TreeSpecies.values()[dataByte]);
|
||||||
return entity;
|
return entity;
|
||||||
case "SLIME":
|
}
|
||||||
|
case "SLIME" -> {
|
||||||
((Slime) entity).setSize(this.dataByte);
|
((Slime) entity).setSize(this.dataByte);
|
||||||
return entity;
|
return entity;
|
||||||
case "ARROW":
|
}
|
||||||
case "EGG":
|
case "ARROW", "EGG", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "DROPPED_ITEM", "EXPERIENCE_ORB", "FALLING_BLOCK",
|
||||||
case "ENDER_CRYSTAL":
|
"FIREBALL", "FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND",
|
||||||
case "ENDER_PEARL":
|
"MINECART_MOB_SPAWNER", "MINECART_TNT", "PLAYER", "PRIMED_TNT", "SMALL_FIREBALL", "SNOWBALL",
|
||||||
case "ENDER_SIGNAL":
|
"SPLASH_POTION", "THROWN_EXP_BOTTLE", "SPECTRAL_ARROW", "SHULKER_BULLET", "AREA_EFFECT_CLOUD",
|
||||||
case "DROPPED_ITEM":
|
"DRAGON_FIREBALL", "WITHER_SKULL", "MINECART_FURNACE", "LLAMA_SPIT", "TRIDENT", "UNKNOWN" -> {
|
||||||
case "EXPERIENCE_ORB":
|
|
||||||
case "FALLING_BLOCK":
|
|
||||||
case "FIREBALL":
|
|
||||||
case "FIREWORK":
|
|
||||||
case "FISHING_HOOK":
|
|
||||||
case "LEASH_HITCH":
|
|
||||||
case "LIGHTNING":
|
|
||||||
case "MINECART":
|
|
||||||
case "MINECART_COMMAND":
|
|
||||||
case "MINECART_MOB_SPAWNER":
|
|
||||||
case "MINECART_TNT":
|
|
||||||
case "PLAYER":
|
|
||||||
case "PRIMED_TNT":
|
|
||||||
case "SMALL_FIREBALL":
|
|
||||||
case "SNOWBALL":
|
|
||||||
case "SPLASH_POTION":
|
|
||||||
case "THROWN_EXP_BOTTLE":
|
|
||||||
case "SPECTRAL_ARROW":
|
|
||||||
case "SHULKER_BULLET":
|
|
||||||
case "AREA_EFFECT_CLOUD":
|
|
||||||
case "DRAGON_FIREBALL":
|
|
||||||
case "WITHER_SKULL":
|
|
||||||
case "MINECART_FURNACE":
|
|
||||||
case "LLAMA_SPIT":
|
|
||||||
case "TRIDENT":
|
|
||||||
case "UNKNOWN":
|
|
||||||
// Do this stuff later
|
// Do this stuff later
|
||||||
return entity;
|
return entity;
|
||||||
|
}
|
||||||
// MISC //
|
// MISC //
|
||||||
case "ITEM_FRAME":
|
case "ITEM_FRAME" -> {
|
||||||
ItemFrame itemframe = (ItemFrame) entity;
|
ItemFrame itemframe = (ItemFrame) entity;
|
||||||
itemframe.setRotation(Rotation.values()[this.dataByte]);
|
itemframe.setRotation(Rotation.values()[this.dataByte]);
|
||||||
itemframe.setItem(this.stack);
|
itemframe.setItem(this.stack);
|
||||||
return entity;
|
return entity;
|
||||||
case "PAINTING":
|
}
|
||||||
|
case "PAINTING" -> {
|
||||||
Painting painting = (Painting) entity;
|
Painting painting = (Painting) entity;
|
||||||
painting.setFacingDirection(BlockFace.values()[this.dataByte], true);
|
painting.setFacingDirection(BlockFace.values()[this.dataByte], true);
|
||||||
painting.setArt(Art.getByName(this.dataString), true);
|
painting.setArt(Art.getByName(this.dataString), true);
|
||||||
return entity;
|
return entity;
|
||||||
|
}
|
||||||
// END MISC //
|
// END MISC //
|
||||||
// INVENTORY HOLDER //
|
// INVENTORY HOLDER //
|
||||||
case "MINECART_CHEST":
|
case "MINECART_CHEST", "MINECART_HOPPER" -> {
|
||||||
case "MINECART_HOPPER":
|
|
||||||
restoreInventory((InventoryHolder) entity);
|
restoreInventory((InventoryHolder) entity);
|
||||||
return entity;
|
return entity;
|
||||||
|
}
|
||||||
// START LIVING ENTITY //
|
// START LIVING ENTITY //
|
||||||
// START AGEABLE //
|
// START AGEABLE //
|
||||||
// START TAMEABLE //
|
// START TAMEABLE //
|
||||||
case "HORSE":
|
case "HORSE", "LLAMA", "SKELETON_HORSE", "DONKEY", "MULE" -> {
|
||||||
case "LLAMA":
|
|
||||||
case "SKELETON_HORSE":
|
|
||||||
case "DONKEY":
|
|
||||||
case "MULE":
|
|
||||||
AbstractHorse horse = (AbstractHorse) entity;
|
AbstractHorse horse = (AbstractHorse) entity;
|
||||||
horse.setJumpStrength(this.horse.jump);
|
horse.setJumpStrength(this.horse.jump);
|
||||||
if (horse instanceof ChestedHorse) {
|
if (horse instanceof ChestedHorse) {
|
||||||
@ -582,19 +536,20 @@ 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;
|
||||||
|
}
|
||||||
// END INVENTORY HOLDER //
|
// END INVENTORY HOLDER //
|
||||||
case "WOLF":
|
case "WOLF", "OCELOT" -> {
|
||||||
case "OCELOT":
|
|
||||||
restoreTameable((Tameable) entity);
|
restoreTameable((Tameable) entity);
|
||||||
restoreAgeable((Ageable) entity);
|
restoreBreedable((Breedable) entity);
|
||||||
restoreLiving((LivingEntity) entity);
|
restoreLiving((LivingEntity) entity);
|
||||||
return entity;
|
return entity;
|
||||||
|
}
|
||||||
// END AGEABLE //
|
// END AGEABLE //
|
||||||
case "SHEEP":
|
case "SHEEP" -> {
|
||||||
Sheep sheep = (Sheep) entity;
|
Sheep sheep = (Sheep) entity;
|
||||||
if (this.dataByte == 1) {
|
if (this.dataByte == 1) {
|
||||||
sheep.setSheared(true);
|
sheep.setSheared(true);
|
||||||
@ -602,28 +557,25 @@ 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":
|
}
|
||||||
case "CHICKEN":
|
case "VILLAGER", "CHICKEN", "COW", "TURTLE", "POLAR_BEAR", "MUSHROOM_COW", "PIG" -> {
|
||||||
case "COW":
|
restoreBreedable((Breedable) entity);
|
||||||
case "TURTLE":
|
|
||||||
case "POLAR_BEAR":
|
|
||||||
case "MUSHROOM_COW":
|
|
||||||
case "PIG":
|
|
||||||
restoreAgeable((Ageable) entity);
|
|
||||||
restoreLiving((LivingEntity) entity);
|
restoreLiving((LivingEntity) entity);
|
||||||
return entity;
|
return entity;
|
||||||
|
}
|
||||||
// END AGEABLE //
|
// END AGEABLE //
|
||||||
case "RABBIT":
|
case "RABBIT" -> {
|
||||||
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;
|
||||||
case "ARMOR_STAND":
|
}
|
||||||
|
case "ARMOR_STAND" -> {
|
||||||
// CHECK positions
|
// CHECK positions
|
||||||
ArmorStand stand = (ArmorStand) entity;
|
ArmorStand stand = (ArmorStand) entity;
|
||||||
if (this.inventory[0] != null) {
|
if (this.inventory[0] != null) {
|
||||||
@ -693,56 +645,38 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
}
|
}
|
||||||
restoreLiving(stand);
|
restoreLiving(stand);
|
||||||
return stand;
|
return stand;
|
||||||
case "BAT":
|
}
|
||||||
|
case "BAT" -> {
|
||||||
if (this.dataByte != 0) {
|
if (this.dataByte != 0) {
|
||||||
((Bat) entity).setAwake(true);
|
((Bat) entity).setAwake(true);
|
||||||
}
|
}
|
||||||
restoreLiving((LivingEntity) entity);
|
restoreLiving((LivingEntity) entity);
|
||||||
return entity;
|
return entity;
|
||||||
case "ENDER_DRAGON":
|
}
|
||||||
|
case "ENDER_DRAGON" -> {
|
||||||
if (this.dataByte != 0) {
|
if (this.dataByte != 0) {
|
||||||
((EnderDragon) entity).setPhase(EnderDragon.Phase.values()[this.dataByte]);
|
((EnderDragon) entity).setPhase(EnderDragon.Phase.values()[this.dataByte]);
|
||||||
}
|
}
|
||||||
restoreLiving((LivingEntity) entity);
|
restoreLiving((LivingEntity) entity);
|
||||||
return entity;
|
return entity;
|
||||||
case "ENDERMITE":
|
}
|
||||||
case "GHAST":
|
case "ENDERMITE", "GHAST", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN", "PIGLIN", "ZOMBIFIED_PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH", "GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SNOWMAN", "SHULKER", "GUARDIAN", "ELDER_GUARDIAN", "SKELETON", "WITHER_SKELETON" -> {
|
||||||
case "MAGMA_CUBE":
|
|
||||||
case "SQUID":
|
|
||||||
case "PIG_ZOMBIE":
|
|
||||||
case "HOGLIN":
|
|
||||||
case "PIGLIN":
|
|
||||||
case "ZOMBIFIED_PIGLIN":
|
|
||||||
case "PIGLIN_BRUTE":
|
|
||||||
case "ZOMBIE":
|
|
||||||
case "WITHER":
|
|
||||||
case "WITCH":
|
|
||||||
case "SPIDER":
|
|
||||||
case "CAVE_SPIDER":
|
|
||||||
case "SILVERFISH":
|
|
||||||
case "GIANT":
|
|
||||||
case "ENDERMAN":
|
|
||||||
case "CREEPER":
|
|
||||||
case "BLAZE":
|
|
||||||
case "SNOWMAN":
|
|
||||||
case "SHULKER":
|
|
||||||
case "GUARDIAN":
|
|
||||||
case "ELDER_GUARDIAN":
|
|
||||||
case "SKELETON":
|
|
||||||
case "WITHER_SKELETON":
|
|
||||||
restoreLiving((LivingEntity) entity);
|
restoreLiving((LivingEntity) entity);
|
||||||
return entity;
|
return entity;
|
||||||
case "IRON_GOLEM":
|
}
|
||||||
|
case "IRON_GOLEM" -> {
|
||||||
if (this.dataByte != 0) {
|
if (this.dataByte != 0) {
|
||||||
((IronGolem) entity).setPlayerCreated(true);
|
((IronGolem) entity).setPlayerCreated(true);
|
||||||
}
|
}
|
||||||
restoreLiving((LivingEntity) entity);
|
restoreLiving((LivingEntity) entity);
|
||||||
return entity;
|
return entity;
|
||||||
default:
|
}
|
||||||
|
default -> {
|
||||||
if (Settings.DEBUG) {
|
if (Settings.DEBUG) {
|
||||||
LOGGER.info("Could not identify entity: {}", entity.getType());
|
LOGGER.info("Could not identify entity: {}", entity.getType());
|
||||||
}
|
}
|
||||||
return entity;
|
return entity;
|
||||||
|
}
|
||||||
// END LIVING
|
// END LIVING
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,9 +34,12 @@ import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
|
|||||||
import com.plotsquared.core.util.ChunkManager;
|
import com.plotsquared.core.util.ChunkManager;
|
||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||||
import com.sk89q.worldedit.math.BlockVector2;
|
import com.sk89q.worldedit.math.BlockVector2;
|
||||||
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.bukkit.HeightMap;
|
import org.bukkit.HeightMap;
|
||||||
|
import org.bukkit.NamespacedKey;
|
||||||
|
import org.bukkit.Registry;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.generator.BiomeProvider;
|
import org.bukkit.generator.BiomeProvider;
|
||||||
@ -48,13 +51,17 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.EnumSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static java.util.function.Predicate.not;
|
||||||
|
|
||||||
public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrapper<ChunkGenerator> {
|
public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrapper<ChunkGenerator> {
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitPlotGenerator.class.getSimpleName());
|
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitPlotGenerator.class.getSimpleName());
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public final boolean PAPER_ASYNC_SAFE = true;
|
public final boolean PAPER_ASYNC_SAFE = true;
|
||||||
@ -185,12 +192,6 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
|
|||||||
world.setWaterAnimalSpawnLimit(limit);
|
world.setWaterAnimalSpawnLimit(limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* The entire method is deprecated, but kept for compatibility with versions lower than or equal to 1.16.2.
|
|
||||||
* The method will be removed in future versions, because WorldEdit and FastAsyncWorldEdit only support the latest point
|
|
||||||
* release.
|
|
||||||
*/
|
|
||||||
@Deprecated(forRemoval = true, since = "6.11.0")
|
|
||||||
@Override
|
@Override
|
||||||
public void generateNoise(
|
public void generateNoise(
|
||||||
@NotNull final WorldInfo worldInfo,
|
@NotNull final WorldInfo worldInfo,
|
||||||
@ -283,9 +284,14 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
|
|||||||
return super.getBaseHeight(worldInfo, random, x, z, heightMap);
|
return super.getBaseHeight(worldInfo, random, x, z, heightMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The entire method is deprecated, but kept for compatibility with versions lower than or equal to 1.16.2.
|
||||||
|
* The method will be removed in future versions, because WorldEdit and FastAsyncWorldEdit only support the latest point
|
||||||
|
* release.
|
||||||
|
*/
|
||||||
@SuppressWarnings("deprecation") // The entire method is deprecated, but kept for compatibility with <=1.16.2
|
@SuppressWarnings("deprecation") // The entire method is deprecated, but kept for compatibility with <=1.16.2
|
||||||
@Override
|
@Override
|
||||||
@Deprecated(since = "TODO")
|
@Deprecated(since = "7.0.0")
|
||||||
public @NonNull ChunkData generateChunkData(
|
public @NonNull ChunkData generateChunkData(
|
||||||
@NonNull World world, @NonNull Random random, int x, int z, @NonNull BiomeGrid biome
|
@NonNull World world, @NonNull Random random, int x, int z, @NonNull BiomeGrid biome
|
||||||
) {
|
) {
|
||||||
@ -293,8 +299,8 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
|
|||||||
if (this.platformGenerator != this) {
|
if (this.platformGenerator != this) {
|
||||||
return this.platformGenerator.generateChunkData(world, random, x, z, biome);
|
return this.platformGenerator.generateChunkData(world, random, x, z, biome);
|
||||||
} else {
|
} else {
|
||||||
// Return super as it will throw an exception caught by the server that will mean this method is no longer used.
|
// Throw exception to be caught by the server that indicates the new generation API is being used.
|
||||||
return super.generateChunkData(world, random, x, z, biome);
|
throw new UnsupportedOperationException("Using new generation methods. This method is unsupported.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -415,9 +421,14 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
|
|||||||
if (lastPlotArea != null && name.equals(this.levelName) && chunkX == lastChunkX && chunkZ == lastChunkZ) {
|
if (lastPlotArea != null && name.equals(this.levelName) && chunkX == lastChunkX && chunkZ == lastChunkZ) {
|
||||||
return lastPlotArea;
|
return lastPlotArea;
|
||||||
}
|
}
|
||||||
PlotArea area = UncheckedWorldLocation.at(name, chunkX << 4, 0, chunkZ << 4).getPlotArea();
|
BlockVector3 loc = BlockVector3.at(chunkX << 4, 0, chunkZ << 4);
|
||||||
|
if (lastPlotArea != null && lastPlotArea.getRegion().contains(loc) && lastPlotArea.getRegion().contains(loc)) {
|
||||||
|
return lastPlotArea;
|
||||||
|
}
|
||||||
|
PlotArea area = UncheckedWorldLocation.at(name, loc).getPlotArea();
|
||||||
if (area == null) {
|
if (area == null) {
|
||||||
throw new IllegalStateException(String.format("Cannot generate chunk that does not belong to a plot area. World: %s",
|
throw new IllegalStateException(String.format(
|
||||||
|
"Cannot generate chunk that does not belong to a plot area. World: %s",
|
||||||
name
|
name
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@ -434,9 +445,16 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
|
|||||||
private static final List<Biome> BIOMES;
|
private static final List<Biome> BIOMES;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
ArrayList<Biome> biomes = new ArrayList<>(List.of(Biome.values()));
|
Set<Biome> disabledBiomes = EnumSet.of(Biome.CUSTOM);
|
||||||
biomes.remove(Biome.CUSTOM);
|
if (PlotSquared.platform().serverVersion()[1] <= 19) {
|
||||||
BIOMES = List.copyOf(biomes);
|
final Biome cherryGrove = Registry.BIOME.get(NamespacedKey.minecraft("cherry_grove"));
|
||||||
|
if (cherryGrove != null) {
|
||||||
|
disabledBiomes.add(cherryGrove);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BIOMES = Arrays.stream(Biome.values())
|
||||||
|
.filter(not(disabledBiomes::contains))
|
||||||
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -33,6 +33,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;
|
||||||
@ -72,6 +73,7 @@ import org.bukkit.block.BlockFace;
|
|||||||
import org.bukkit.block.BlockState;
|
import org.bukkit.block.BlockState;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.block.data.type.Dispenser;
|
import org.bukkit.block.data.type.Dispenser;
|
||||||
|
import org.bukkit.block.data.type.Farmland;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.Fireball;
|
import org.bukkit.entity.Fireball;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@ -585,6 +587,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)
|
||||||
@ -746,20 +754,35 @@ public class BlockEventListener implements Listener {
|
|||||||
Block block = event.getBlock();
|
Block block = event.getBlock();
|
||||||
Location location = BukkitUtil.adapt(block.getLocation());
|
Location location = BukkitUtil.adapt(block.getLocation());
|
||||||
PlotArea area = location.getPlotArea();
|
PlotArea area = location.getPlotArea();
|
||||||
|
|
||||||
if (area == null) {
|
if (area == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Plot plot = area.getOwnedPlot(location);
|
Plot plot = area.getOwnedPlot(location);
|
||||||
|
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Material blockType = block.getType();
|
|
||||||
if (blockType == Material.FARMLAND) {
|
if (block.getBlockData() instanceof Farmland farmland && event
|
||||||
if (!plot.getFlag(SoilDryFlag.class)) {
|
.getNewState()
|
||||||
plot.debug("Soil could not dry because soil-dry = false");
|
.getBlockData() instanceof Farmland newFarmland) {
|
||||||
event.setCancelled(true);
|
int currentMoisture = farmland.getMoisture();
|
||||||
|
int newMoisture = newFarmland.getMoisture();
|
||||||
|
|
||||||
|
// farmland gets moisturizes
|
||||||
|
if (newMoisture > currentMoisture) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (plot.getFlag(SoilDryFlag.class)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
plot.debug("Soil could not dry because soil-dry = false");
|
||||||
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1100,6 +1123,7 @@ public class BlockEventListener implements Listener {
|
|||||||
if (plot != null) {
|
if (plot != null) {
|
||||||
plot.debug("Explosion was cancelled because explosion = false");
|
plot.debug("Explosion was cancelled because explosion = false");
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
event.blockList().removeIf(blox -> !plot.equals(area.getOwnedPlot(BukkitUtil.adapt(blox.getLocation()))));
|
event.blockList().removeIf(blox -> !plot.equals(area.getOwnedPlot(BukkitUtil.adapt(blox.getLocation()))));
|
||||||
}
|
}
|
||||||
|
@ -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.flag.implementations.CopperOxideFlag;
|
import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag;
|
import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.SculkSensorInteractFlag;
|
||||||
import com.plotsquared.core.util.PlotFlagUtil;
|
import com.plotsquared.core.util.PlotFlagUtil;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
@ -92,12 +93,16 @@ public class BlockEventListener117 implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Plot plot = location.getOwnedPlot();
|
Plot plot = location.getOwnedPlot();
|
||||||
if (plot == null && !PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, MiscInteractFlag.class, true) || plot != null && !plot.getFlag(
|
if (plot == null && !PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(
|
||||||
MiscInteractFlag.class)) {
|
area,
|
||||||
|
MiscInteractFlag.class,
|
||||||
|
true
|
||||||
|
) || plot != null && (!plot.getFlag(MiscInteractFlag.class) || !plot.getFlag(SculkSensorInteractFlag.class))) {
|
||||||
if (plotPlayer != null) {
|
if (plotPlayer != null) {
|
||||||
if (plot != null) {
|
if (plot != null) {
|
||||||
if (!plot.isAdded(plotPlayer.getUUID())) {
|
if (!plot.isAdded(plotPlayer.getUUID())) {
|
||||||
plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because misc-interact = false");
|
plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because both " +
|
||||||
|
"sculk-sensor-interact and misc-interact = false");
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -108,13 +113,15 @@ public class BlockEventListener117 implements Listener {
|
|||||||
if (plot != null) {
|
if (plot != null) {
|
||||||
if (itemThrower == null && (itemThrower = item.getOwner()) == null) {
|
if (itemThrower == null && (itemThrower = item.getOwner()) == null) {
|
||||||
plot.debug(
|
plot.debug(
|
||||||
"A thrown item couldn't trigger sculk sensors because misc-interact = false and the item's owner could not be resolved.");
|
"A thrown item couldn't trigger sculk sensors because both sculk-sensor-interact and " +
|
||||||
|
"misc-interact = false and the item's owner could not be resolved.");
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!plot.isAdded(itemThrower)) {
|
if (!plot.isAdded(itemThrower)) {
|
||||||
if (!plot.isAdded(itemThrower)) {
|
if (!plot.isAdded(itemThrower)) {
|
||||||
plot.debug("A thrown item couldn't trigger sculk sensors because misc-interact = false");
|
plot.debug("A thrown item couldn't trigger sculk sensors because both sculk-sensor-interact and " +
|
||||||
|
"misc-interact = false");
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -133,7 +140,6 @@ public class BlockEventListener117 implements Listener {
|
|||||||
if (area == null) {
|
if (area == null) {
|
||||||
for (int i = blocks.size() - 1; i >= 0; i--) {
|
for (int i = blocks.size() - 1; i >= 0; i--) {
|
||||||
Location blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
|
Location blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
|
||||||
blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
|
|
||||||
if (blockLocation.isPlotArea()) {
|
if (blockLocation.isPlotArea()) {
|
||||||
blocks.remove(i);
|
blocks.remove(i);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
@ -234,7 +244,8 @@ public class ChunkListener implements Listener {
|
|||||||
Chunk chunk = event.getChunk();
|
Chunk chunk = event.getChunk();
|
||||||
if (Settings.Chunk_Processor.AUTO_TRIM) {
|
if (Settings.Chunk_Processor.AUTO_TRIM) {
|
||||||
String world = chunk.getWorld().getName();
|
String world = chunk.getWorld().getName();
|
||||||
if ((!Settings.Enabled_Components.WORLDS || !SinglePlotArea.isSinglePlotWorld(world)) && this.plotAreaManager.hasPlotArea(world)) {
|
if ((!Settings.Enabled_Components.WORLDS || !SinglePlotArea.isSinglePlotWorld(world)) && this.plotAreaManager.hasPlotArea(
|
||||||
|
world)) {
|
||||||
if (unloadChunk(world, chunk, true)) {
|
if (unloadChunk(world, chunk, true)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -145,54 +145,38 @@ public class EntityEventListener implements Listener {
|
|||||||
}
|
}
|
||||||
CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason();
|
CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason();
|
||||||
switch (reason.toString()) {
|
switch (reason.toString()) {
|
||||||
case "DISPENSE_EGG":
|
case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> {
|
||||||
case "EGG":
|
|
||||||
case "OCELOT_BABY":
|
|
||||||
case "SPAWNER_EGG":
|
|
||||||
if (!area.isSpawnEggs()) {
|
if (!area.isSpawnEggs()) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case "REINFORCEMENTS":
|
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
|
||||||
case "NATURAL":
|
"TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL",
|
||||||
case "MOUNT":
|
"DUPLICATION", "FROZEN", "SPELL" -> {
|
||||||
case "PATROL":
|
|
||||||
case "RAID":
|
|
||||||
case "SHEARED":
|
|
||||||
case "SILVERFISH_BLOCK":
|
|
||||||
case "ENDER_PEARL":
|
|
||||||
case "TRAP":
|
|
||||||
case "VILLAGE_DEFENSE":
|
|
||||||
case "VILLAGE_INVASION":
|
|
||||||
case "BEEHIVE":
|
|
||||||
case "CHUNK_GEN":
|
|
||||||
if (!area.isMobSpawning()) {
|
if (!area.isMobSpawning()) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case "BREEDING":
|
case "BREEDING" -> {
|
||||||
if (!area.isSpawnBreeding()) {
|
if (!area.isSpawnBreeding()) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case "BUILD_IRONGOLEM":
|
case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
|
||||||
case "BUILD_SNOWMAN":
|
|
||||||
case "BUILD_WITHER":
|
|
||||||
case "CUSTOM":
|
|
||||||
if (!area.isSpawnCustom() && entity.getType() != EntityType.ARMOR_STAND) {
|
if (!area.isSpawnCustom() && entity.getType() != EntityType.ARMOR_STAND) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case "SPAWNER":
|
case "SPAWNER" -> {
|
||||||
if (!area.isMobSpawnerSpawning()) {
|
if (!area.isMobSpawnerSpawning()) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
}
|
}
|
||||||
Plot plot = area.getOwnedPlotAbs(location);
|
Plot plot = area.getOwnedPlotAbs(location);
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
|
@ -43,10 +43,10 @@ import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
|||||||
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
|
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
|
||||||
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 net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.minimessage.tag.Tag;
|
import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||||
import com.plotsquared.core.util.PlotFlagUtil;
|
|
||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.TileState;
|
import org.bukkit.block.TileState;
|
||||||
@ -178,59 +178,41 @@ public class PaperListener implements Listener {
|
|||||||
}
|
}
|
||||||
CreatureSpawnEvent.SpawnReason reason = event.getReason();
|
CreatureSpawnEvent.SpawnReason reason = event.getReason();
|
||||||
switch (reason.toString()) {
|
switch (reason.toString()) {
|
||||||
case "DISPENSE_EGG":
|
case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> {
|
||||||
case "EGG":
|
|
||||||
case "OCELOT_BABY":
|
|
||||||
case "SPAWNER_EGG":
|
|
||||||
if (!area.isSpawnEggs()) {
|
if (!area.isSpawnEggs()) {
|
||||||
event.setShouldAbortSpawn(true);
|
event.setShouldAbortSpawn(true);
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case "REINFORCEMENTS":
|
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL", "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> {
|
||||||
case "NATURAL":
|
|
||||||
case "MOUNT":
|
|
||||||
case "PATROL":
|
|
||||||
case "RAID":
|
|
||||||
case "SHEARED":
|
|
||||||
case "SILVERFISH_BLOCK":
|
|
||||||
case "ENDER_PEARL":
|
|
||||||
case "TRAP":
|
|
||||||
case "VILLAGE_DEFENSE":
|
|
||||||
case "VILLAGE_INVASION":
|
|
||||||
case "BEEHIVE":
|
|
||||||
case "CHUNK_GEN":
|
|
||||||
if (!area.isMobSpawning()) {
|
if (!area.isMobSpawning()) {
|
||||||
event.setShouldAbortSpawn(true);
|
event.setShouldAbortSpawn(true);
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case "BREEDING":
|
case "BREEDING" -> {
|
||||||
if (!area.isSpawnBreeding()) {
|
if (!area.isSpawnBreeding()) {
|
||||||
event.setShouldAbortSpawn(true);
|
event.setShouldAbortSpawn(true);
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case "BUILD_IRONGOLEM":
|
case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
|
||||||
case "BUILD_SNOWMAN":
|
|
||||||
case "BUILD_WITHER":
|
|
||||||
case "CUSTOM":
|
|
||||||
if (!area.isSpawnCustom() && event.getType() != EntityType.ARMOR_STAND) {
|
if (!area.isSpawnCustom() && event.getType() != EntityType.ARMOR_STAND) {
|
||||||
event.setShouldAbortSpawn(true);
|
event.setShouldAbortSpawn(true);
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case "SPAWNER":
|
case "SPAWNER" -> {
|
||||||
if (!area.isMobSpawnerSpawning()) {
|
if (!area.isMobSpawnerSpawning()) {
|
||||||
event.setShouldAbortSpawn(true);
|
event.setShouldAbortSpawn(true);
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
}
|
}
|
||||||
Plot plot = location.getOwnedPlotAbs();
|
Plot plot = location.getOwnedPlotAbs();
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
@ -457,9 +439,11 @@ public class PaperListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean getBooleanFlagValue(@NonNull FlagContainer container,
|
private boolean getBooleanFlagValue(
|
||||||
@NonNull Class<? extends BooleanFlag<?>> flagClass,
|
@NonNull FlagContainer container,
|
||||||
boolean defaultValue) {
|
@NonNull Class<? extends BooleanFlag<?>> flagClass,
|
||||||
|
boolean defaultValue
|
||||||
|
) {
|
||||||
BooleanFlag<?> flag = container.getFlag(flagClass);
|
BooleanFlag<?> flag = container.getFlag(flagClass);
|
||||||
return flag == null ? defaultValue : flag.getValue();
|
return flag == null ? defaultValue : flag.getValue();
|
||||||
}
|
}
|
||||||
|
@ -273,8 +273,7 @@ public class PlayerEventListener implements Listener {
|
|||||||
Plot plot = plotPlayer.getCurrentPlot();
|
Plot plot = plotPlayer.getCurrentPlot();
|
||||||
// Check WorldEdit
|
// Check WorldEdit
|
||||||
switch (parts[0]) {
|
switch (parts[0]) {
|
||||||
case "up":
|
case "up", "worldedit:up" -> {
|
||||||
case "worldedit:up":
|
|
||||||
if (plot == null || (!plot.isAdded(plotPlayer.getUUID()) && !plotPlayer.hasPermission(
|
if (plot == null || (!plot.isAdded(plotPlayer.getUUID()) && !plotPlayer.hasPermission(
|
||||||
Permission.PERMISSION_ADMIN_BUILD_OTHER,
|
Permission.PERMISSION_ADMIN_BUILD_OTHER,
|
||||||
true
|
true
|
||||||
@ -282,6 +281,7 @@ public class PlayerEventListener implements Listener {
|
|||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (plot == null && !area.isRoadFlags()) {
|
if (plot == null && !area.isRoadFlags()) {
|
||||||
return;
|
return;
|
||||||
@ -369,6 +369,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());
|
||||||
@ -572,7 +573,8 @@ public class PlayerEventListener implements Listener {
|
|||||||
if (now == null) {
|
if (now == null) {
|
||||||
try (final MetaDataAccess<Boolean> kickAccess =
|
try (final MetaDataAccess<Boolean> kickAccess =
|
||||||
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
|
||||||
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) {
|
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(
|
||||||
|
false)) {
|
||||||
pp.sendMessage(
|
pp.sendMessage(
|
||||||
TranslatableCaption.of("permission.no_permission_event"),
|
TranslatableCaption.of("permission.no_permission_event"),
|
||||||
TagResolver.resolver(
|
TagResolver.resolver(
|
||||||
@ -665,7 +667,8 @@ public class PlayerEventListener implements Listener {
|
|||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
try (final MetaDataAccess<Boolean> kickAccess =
|
try (final MetaDataAccess<Boolean> kickAccess =
|
||||||
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
|
||||||
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) {
|
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(
|
||||||
|
false)) {
|
||||||
pp.sendMessage(
|
pp.sendMessage(
|
||||||
TranslatableCaption.of("permission.no_permission_event"),
|
TranslatableCaption.of("permission.no_permission_event"),
|
||||||
TagResolver.resolver(
|
TagResolver.resolver(
|
||||||
@ -731,6 +734,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;
|
||||||
@ -1061,6 +1065,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();
|
||||||
@ -1114,13 +1119,13 @@ public class PlayerEventListener implements Listener {
|
|||||||
Location location = BukkitUtil.adapt(block.getLocation());
|
Location location = BukkitUtil.adapt(block.getLocation());
|
||||||
Action action = event.getAction();
|
Action action = event.getAction();
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case PHYSICAL: {
|
case PHYSICAL -> {
|
||||||
eventType = PlayerBlockEventType.TRIGGER_PHYSICAL;
|
eventType = PlayerBlockEventType.TRIGGER_PHYSICAL;
|
||||||
blocktype1 = BukkitAdapter.asBlockType(block.getType());
|
blocktype1 = BukkitAdapter.asBlockType(block.getType());
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//todo rearrange the right click code. it is all over the place.
|
//todo rearrange the right click code. it is all over the place.
|
||||||
case RIGHT_CLICK_BLOCK: {
|
case RIGHT_CLICK_BLOCK -> {
|
||||||
Material blockType = block.getType();
|
Material blockType = block.getType();
|
||||||
eventType = PlayerBlockEventType.INTERACT_BLOCK;
|
eventType = PlayerBlockEventType.INTERACT_BLOCK;
|
||||||
blocktype1 = BukkitAdapter.asBlockType(block.getType());
|
blocktype1 = BukkitAdapter.asBlockType(block.getType());
|
||||||
@ -1142,21 +1147,16 @@ public class PlayerEventListener implements Listener {
|
|||||||
|
|
||||||
// in the following, lb needs to have the material of the item in hand i.e. type
|
// in the following, lb needs to have the material of the item in hand i.e. type
|
||||||
switch (type.toString()) {
|
switch (type.toString()) {
|
||||||
case "REDSTONE":
|
case "REDSTONE", "STRING", "PUMPKIN_SEEDS", "MELON_SEEDS", "COCOA_BEANS", "WHEAT_SEEDS", "BEETROOT_SEEDS",
|
||||||
case "STRING":
|
"SWEET_BERRIES", "GLOW_BERRIES" -> {
|
||||||
case "PUMPKIN_SEEDS":
|
|
||||||
case "MELON_SEEDS":
|
|
||||||
case "COCOA_BEANS":
|
|
||||||
case "WHEAT_SEEDS":
|
|
||||||
case "BEETROOT_SEEDS":
|
|
||||||
case "SWEET_BERRIES":
|
|
||||||
case "GLOW_BERRIES":
|
|
||||||
return;
|
return;
|
||||||
default:
|
}
|
||||||
|
default -> {
|
||||||
//eventType = PlayerBlockEventType.PLACE_BLOCK;
|
//eventType = PlayerBlockEventType.PLACE_BLOCK;
|
||||||
if (type.isBlock()) {
|
if (type.isBlock()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (PaperLib.isPaper()) {
|
if (PaperLib.isPaper()) {
|
||||||
if (MaterialTags.SPAWN_EGGS.isTagged(type) || Material.EGG.equals(type)) {
|
if (MaterialTags.SPAWN_EGGS.isTagged(type) || Material.EGG.equals(type)) {
|
||||||
@ -1170,7 +1170,7 @@ public class PlayerEventListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (type.isEdible()) {
|
if (type.isEdible()) {
|
||||||
//Allow all players to eat while also allowing the block place event ot be fired
|
//Allow all players to eat while also allowing the block place event to be fired
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (type == Material.ARMOR_STAND) {
|
if (type == Material.ARMOR_STAND) {
|
||||||
@ -1189,9 +1189,8 @@ public class PlayerEventListener implements Listener {
|
|||||||
eventType = PlayerBlockEventType.READ;
|
eventType = PlayerBlockEventType.READ;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case LEFT_CLICK_BLOCK: {
|
case LEFT_CLICK_BLOCK -> {
|
||||||
Material blockType = block.getType();
|
Material blockType = block.getType();
|
||||||
|
|
||||||
// todo: when the code above is rearranged, it would be great to beautify this as well.
|
// todo: when the code above is rearranged, it would be great to beautify this as well.
|
||||||
@ -1202,10 +1201,10 @@ public class PlayerEventListener implements Listener {
|
|||||||
|
|
||||||
eventType = PlayerBlockEventType.INTERACT_BLOCK;
|
eventType = PlayerBlockEventType.INTERACT_BLOCK;
|
||||||
blocktype1 = BukkitAdapter.asBlockType(block.getType());
|
blocktype1 = BukkitAdapter.asBlockType(block.getType());
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
default:
|
default -> {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (this.worldEdit != null && pp.getAttribute("worldedit")) {
|
if (this.worldEdit != null && pp.getAttribute("worldedit")) {
|
||||||
if (event.getMaterial() == Material.getMaterial(this.worldEdit.getConfiguration().wandItem)) {
|
if (event.getMaterial() == Material.getMaterial(this.worldEdit.getConfiguration().wandItem)) {
|
||||||
|
@ -30,9 +30,9 @@ 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.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 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 com.plotsquared.core.util.PlotFlagUtil;
|
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,63 +0,0 @@
|
|||||||
/*
|
|
||||||
* PlotSquared, a land and world management plugin for Minecraft.
|
|
||||||
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
|
||||||
* Copyright (C) IntellectualSites team and contributors
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package com.plotsquared.bukkit.managers;
|
|
||||||
|
|
||||||
/*
|
|
||||||
import com.google.inject.Singleton;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
|
||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
|
||||||
import se.hyperver.hyperverse.Hyperverse;
|
|
||||||
import se.hyperver.hyperverse.world.WorldConfiguration;
|
|
||||||
import se.hyperver.hyperverse.world.WorldConfigurationBuilder;
|
|
||||||
import se.hyperver.hyperverse.world.WorldFeatures;
|
|
||||||
import se.hyperver.hyperverse.world.WorldType;
|
|
||||||
|
|
||||||
Hyperverse implementation is currently put on ice until Hyperverse is released on a stable line and deployed to the central
|
|
||||||
repository.
|
|
||||||
|
|
||||||
@Singleton
|
|
||||||
public class HyperverseWorldManager extends BukkitWorldManager {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @Nullable World handleWorldCreation(@NonNull String worldName, @Nullable String generator) {
|
|
||||||
// First let Bukkit register the world
|
|
||||||
this.setGenerator(worldName, generator);
|
|
||||||
// Create the world
|
|
||||||
final WorldConfigurationBuilder worldConfigurationBuilder = WorldConfiguration.builder()
|
|
||||||
.setName(worldName).setType(WorldType.OVER_WORLD);
|
|
||||||
if (generator != null) {
|
|
||||||
worldConfigurationBuilder.setGenerator(generator).setWorldFeatures(WorldFeatures.FLATLAND);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return Hyperverse.getApi().createWorld(worldConfigurationBuilder.createWorldConfiguration())
|
|
||||||
.getBukkitWorld();
|
|
||||||
} catch (final Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return "bukkit-hyperverse";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
@ -43,7 +43,7 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer {
|
|||||||
*/
|
*/
|
||||||
public BukkitOfflinePlayer(
|
public BukkitOfflinePlayer(
|
||||||
final @NonNull OfflinePlayer player, final @NonNull
|
final @NonNull OfflinePlayer player, final @NonNull
|
||||||
PermissionHandler permissionHandler
|
PermissionHandler permissionHandler
|
||||||
) {
|
) {
|
||||||
this.player = player;
|
this.player = player;
|
||||||
this.permissionProfile = permissionHandler.getPermissionProfile(this)
|
this.permissionProfile = permissionHandler.getPermissionProfile(this)
|
||||||
|
@ -176,6 +176,10 @@ public class BukkitPlayer extends PlotPlayer<Player> {
|
|||||||
final Set<PermissionAttachmentInfo> effective = player.getEffectivePermissions();
|
final Set<PermissionAttachmentInfo> effective = player.getEffectivePermissions();
|
||||||
if (!effective.isEmpty()) {
|
if (!effective.isEmpty()) {
|
||||||
for (PermissionAttachmentInfo attach : effective) {
|
for (PermissionAttachmentInfo attach : effective) {
|
||||||
|
// Ignore all "false" permissions
|
||||||
|
if (!attach.getValue()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
String permStr = attach.getPermission();
|
String permStr = attach.getPermission();
|
||||||
if (permStr.startsWith(stubPlus)) {
|
if (permStr.startsWith(stubPlus)) {
|
||||||
hasAny = true;
|
hasAny = true;
|
||||||
|
@ -270,7 +270,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
|||||||
if (getChunkObject() instanceof Chunk chunkObject) {
|
if (getChunkObject() instanceof Chunk chunkObject) {
|
||||||
existing = chunkObject.getBlock(x & 15, y, z & 15);
|
existing = chunkObject.getBlock(x & 15, y, z & 15);
|
||||||
} else {
|
} else {
|
||||||
existing = getBukkitWorld().getBlockAt(x, y, z);
|
existing = getBukkitWorld().getBlockAt(x, y, z);
|
||||||
}
|
}
|
||||||
final BlockState existingBaseBlock = BukkitAdapter.adapt(existing.getBlockData());
|
final BlockState existingBaseBlock = BukkitAdapter.adapt(existing.getBlockData());
|
||||||
if (BukkitBlockUtil.get(existing).equals(existingBaseBlock) && existing.getBlockData().matches(blockData)) {
|
if (BukkitBlockUtil.get(existing).equals(existingBaseBlock) && existing.getBlockData().matches(blockData)) {
|
||||||
|
@ -62,7 +62,6 @@ public class GenChunk extends ZeroedDelegateScopedQueueCoordinator {
|
|||||||
/**
|
/**
|
||||||
* @param minY minimum world Y, inclusive
|
* @param minY minimum world Y, inclusive
|
||||||
* @param maxY maximum world Y, inclusive
|
* @param maxY maximum world Y, inclusive
|
||||||
*
|
|
||||||
* @since 6.6.0
|
* @since 6.6.0
|
||||||
*/
|
*/
|
||||||
public GenChunk(int minY, int maxY) {
|
public GenChunk(int minY, int maxY) {
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.plotsquared.bukkit.schematic;
|
package com.plotsquared.bukkit.schematic;
|
||||||
|
|
||||||
|
import com.destroystokyo.paper.profile.PlayerProfile;
|
||||||
|
import com.destroystokyo.paper.profile.ProfileProperty;
|
||||||
import com.plotsquared.bukkit.util.BukkitUtil;
|
import com.plotsquared.bukkit.util.BukkitUtil;
|
||||||
import com.sk89q.jnbt.ByteTag;
|
import com.sk89q.jnbt.ByteTag;
|
||||||
import com.sk89q.jnbt.CompoundTag;
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
@ -28,13 +30,20 @@ import com.sk89q.jnbt.Tag;
|
|||||||
import com.sk89q.worldedit.blocks.BaseItemStack;
|
import com.sk89q.worldedit.blocks.BaseItemStack;
|
||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||||
import com.sk89q.worldedit.world.item.ItemType;
|
import com.sk89q.worldedit.world.item.ItemType;
|
||||||
|
import io.papermc.lib.PaperLib;
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.DyeColor;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Banner;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.Container;
|
import org.bukkit.block.Container;
|
||||||
import org.bukkit.block.Sign;
|
import org.bukkit.block.Sign;
|
||||||
import org.bukkit.block.Skull;
|
import org.bukkit.block.Skull;
|
||||||
|
import org.bukkit.block.banner.Pattern;
|
||||||
|
import org.bukkit.block.banner.PatternType;
|
||||||
import org.bukkit.enchantments.Enchantment;
|
import org.bukkit.enchantments.Enchantment;
|
||||||
import org.bukkit.inventory.Inventory;
|
import org.bukkit.inventory.Inventory;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
@ -45,11 +54,15 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
public class StateWrapper {
|
public class StateWrapper {
|
||||||
|
|
||||||
public org.bukkit.block.BlockState state = null;
|
public CompoundTag tag;
|
||||||
public CompoundTag tag = null;
|
|
||||||
|
private boolean paperErrorTextureSent = false;
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + StateWrapper.class.getSimpleName());
|
||||||
|
|
||||||
public StateWrapper(CompoundTag tag) {
|
public StateWrapper(CompoundTag tag) {
|
||||||
this.tag = tag;
|
this.tag = tag;
|
||||||
@ -227,15 +240,64 @@ public class StateWrapper {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
String player = skullOwner.getString("Name");
|
String player = skullOwner.getString("Name");
|
||||||
if (player == null || player.isEmpty()) {
|
|
||||||
|
if (player != null && !player.isEmpty()) {
|
||||||
|
try {
|
||||||
|
skull.setOwningPlayer(Bukkit.getOfflinePlayer(player));
|
||||||
|
skull.update(true);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
final CompoundTag properties = (CompoundTag) skullOwner.getValue().get("Properties");
|
||||||
|
if (properties == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
final ListTag textures = properties.getListTag("textures");
|
||||||
skull.setOwningPlayer(Bukkit.getOfflinePlayer(player));
|
if (textures.getValue().isEmpty()) {
|
||||||
skull.update(true);
|
return false;
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
|
final CompoundTag textureCompound = (CompoundTag) textures.getValue().get(0);
|
||||||
|
if (textureCompound == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
String textureValue = textureCompound.getString("Value");
|
||||||
|
if (textureValue == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!PaperLib.isPaper()) {
|
||||||
|
if (!paperErrorTextureSent) {
|
||||||
|
paperErrorTextureSent = true;
|
||||||
|
LOGGER.error("Failed to populate skull data in your road schematic - This is a Spigot limitation.");
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final PlayerProfile profile = Bukkit.createProfile(UUID.randomUUID());
|
||||||
|
profile.setProperty(new ProfileProperty("textures", textureValue));
|
||||||
|
skull.setPlayerProfile(profile);
|
||||||
|
skull.update(true);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
case "banner" -> {
|
||||||
|
if (state instanceof Banner banner) {
|
||||||
|
List<Tag> patterns = this.tag.getListTag("Patterns").getValue();
|
||||||
|
if (patterns == null || patterns.isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
banner.setPatterns(patterns.stream().map(t -> (CompoundTag) t).map(compoundTag -> {
|
||||||
|
DyeColor color = DyeColor.getByWoolData((byte) compoundTag.getInt("Color"));
|
||||||
|
PatternType patternType = PatternType.getByIdentifier(compoundTag.getString("Pattern"));
|
||||||
|
if (color == null || patternType == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new Pattern(color, patternType);
|
||||||
|
}).filter(Objects::nonNull).toList());
|
||||||
|
banner.update(true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -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;
|
||||||
|
@ -70,7 +70,7 @@ public class BukkitRegionManager extends RegionManager {
|
|||||||
@Inject
|
@Inject
|
||||||
public BukkitRegionManager(
|
public BukkitRegionManager(
|
||||||
@NonNull WorldUtil worldUtil, @NonNull GlobalBlockQueue blockQueue, @NonNull
|
@NonNull WorldUtil worldUtil, @NonNull GlobalBlockQueue blockQueue, @NonNull
|
||||||
ProgressSubscriberFactory subscriberFactory
|
ProgressSubscriberFactory subscriberFactory
|
||||||
) {
|
) {
|
||||||
super(worldUtil, blockQueue, subscriberFactory);
|
super(worldUtil, blockQueue, subscriberFactory);
|
||||||
this.blockQueue = blockQueue;
|
this.blockQueue = blockQueue;
|
||||||
|
@ -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) {
|
||||||
|
@ -28,24 +28,38 @@ import java.nio.file.Paths;
|
|||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a helper class which replaces occurrences of 'suggest_command' with 'run_command' in messages_%.json.
|
* This is a helper class which replaces older syntax no longer supported by MiniMessage with replacements in messages_%.json.
|
||||||
* MiniMessage changed the syntax between major releases. To warrant a smooth upgrade, we attempt to replace any occurrences
|
* MiniMessage changed the syntax between major releases. To warrant a smooth upgrade, we attempt to replace any occurrences
|
||||||
* while loading PlotSquared.
|
* while loading PlotSquared.
|
||||||
*
|
*
|
||||||
* @since TODO
|
* @since 7.0.0
|
||||||
*/
|
*/
|
||||||
@NotPublic
|
@NotPublic
|
||||||
public class TranslationUpdateManager {
|
public class TranslationUpdateManager {
|
||||||
|
|
||||||
public static void upgradeTranslationFile() throws IOException {
|
public static void upgradeTranslationFile() throws IOException {
|
||||||
String searchText = "suggest_command";
|
String suggestCommand = "suggest_command";
|
||||||
String replacementText = "run_command";
|
String suggestCommandReplacement = "run_command";
|
||||||
|
String minHeight = "minHeight";
|
||||||
|
String minheightReplacement = "minheight";
|
||||||
|
String maxHeight = "maxHeight";
|
||||||
|
String maxheightReplacement = "maxheight";
|
||||||
|
String usedGrants = "usedGrants";
|
||||||
|
String usedGrantsReplacement = "used_grants";
|
||||||
|
String remainingGrants = "remainingGrants";
|
||||||
|
String rremainingGrantsReplacement = "remaining_grants";
|
||||||
|
|
||||||
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
|
||||||
.filter(Files::isRegularFile)
|
.filter(Files::isRegularFile)
|
||||||
.filter(p -> p.getFileName().toString().matches("messages_[a-z]{2}\\.json"))
|
.filter(p -> p.getFileName().toString().matches("messages_[a-z]{2}\\.json"))
|
||||||
.forEach(p -> replaceInFile(p, searchText, replacementText));
|
.forEach(p -> {
|
||||||
|
replaceInFile(p, suggestCommand, suggestCommandReplacement);
|
||||||
|
replaceInFile(p, minHeight, minheightReplacement);
|
||||||
|
replaceInFile(p, maxHeight, maxheightReplacement);
|
||||||
|
replaceInFile(p, usedGrants, usedGrantsReplacement);
|
||||||
|
replaceInFile(p, remainingGrants, rremainingGrantsReplacement);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,4 +74,5 @@ public class TranslationUpdateManager {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
@ -54,12 +54,14 @@ public class UpdateUtility implements Listener {
|
|||||||
internalVersion = PlotSquared.get().getVersion();
|
internalVersion = PlotSquared.get().getVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({"deprecation", "DefaultCharset"}) // Suppress Json deprecation, we can't use features from gson 2.8.1 and newer yet
|
@SuppressWarnings({"deprecation", "DefaultCharset"})
|
||||||
|
// Suppress Json deprecation, we can't use features from gson 2.8.1 and newer yet
|
||||||
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()
|
||||||
|
@ -4,16 +4,16 @@ api-version: "1.13"
|
|||||||
version: "${version}"
|
version: "${version}"
|
||||||
load: STARTUP
|
load: STARTUP
|
||||||
description: "Easy, yet powerful Plot World generation and management."
|
description: "Easy, yet powerful Plot World generation and management."
|
||||||
authors: [Citymonstret, Empire92, MattBDev, dordsor21, NotMyFault, SirYwell]
|
authors: [ Citymonstret, Empire92, MattBDev, dordsor21, NotMyFault, SirYwell ]
|
||||||
website: https://www.spigotmc.org/resources/77506/
|
website: https://www.spigotmc.org/resources/77506/
|
||||||
softdepend: [Vault, PlaceholderAPI, Essentials, LuckPerms, BungeePerms, MVdWPlaceholderAPI]
|
softdepend: [ Vault, PlaceholderAPI, Essentials, LuckPerms, BungeePerms, MVdWPlaceholderAPI ]
|
||||||
loadbefore: [MultiWorld, Multiverse-Core]
|
loadbefore: [ MultiWorld, Multiverse-Core ]
|
||||||
depend: [WorldEdit]
|
depend: [ WorldEdit ]
|
||||||
database: false
|
database: false
|
||||||
commands:
|
commands:
|
||||||
plots:
|
plots:
|
||||||
description: Plot command.
|
description: Plot command.
|
||||||
aliases: [p,plot,ps,plotsquared,p2,2,plotme]
|
aliases: [ p,plot,ps,plotsquared,p2,2,plotme ]
|
||||||
permission: plots.use
|
permission: plots.use
|
||||||
permission-message: "You are lacking the permission node 'plots.use'"
|
permission-message: "You are lacking the permission node 'plots.use'"
|
||||||
permissions:
|
permissions:
|
||||||
|
@ -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,24 @@ 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)
|
||||||
|
|
||||||
|
// Database
|
||||||
|
api(libs.hikaricp)
|
||||||
|
api(libs.jdbiCore)
|
||||||
|
api(libs.jdbiGuice)
|
||||||
|
|
||||||
// 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 +62,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"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -68,11 +73,10 @@ tasks {
|
|||||||
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
|
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
|
||||||
val opt = options as StandardJavadocDocletOptions
|
val opt = options as StandardJavadocDocletOptions
|
||||||
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString())
|
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString())
|
||||||
opt.links("https://jd.adventure.kyori.net/api/4.12.0/")
|
opt.links("https://jd.advntr.dev/api/4.14.0/")
|
||||||
opt.links("https://jd.adventure.kyori.net/text-minimessage/4.12.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
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.plotsquared.core;
|
package com.plotsquared.core;
|
||||||
|
|
||||||
|
import com.google.inject.Key;
|
||||||
import com.plotsquared.core.configuration.ConfigurationSection;
|
import com.plotsquared.core.configuration.ConfigurationSection;
|
||||||
import com.plotsquared.core.configuration.ConfigurationUtil;
|
import com.plotsquared.core.configuration.ConfigurationUtil;
|
||||||
import com.plotsquared.core.configuration.MemorySection;
|
import com.plotsquared.core.configuration.MemorySection;
|
||||||
@ -31,14 +32,12 @@ import com.plotsquared.core.configuration.caption.load.DefaultCaptionProvider;
|
|||||||
import com.plotsquared.core.configuration.file.YamlConfiguration;
|
import com.plotsquared.core.configuration.file.YamlConfiguration;
|
||||||
import com.plotsquared.core.configuration.serialization.ConfigurationSerialization;
|
import com.plotsquared.core.configuration.serialization.ConfigurationSerialization;
|
||||||
import com.plotsquared.core.database.DBFunc;
|
import com.plotsquared.core.database.DBFunc;
|
||||||
import com.plotsquared.core.database.Database;
|
|
||||||
import com.plotsquared.core.database.MySQL;
|
|
||||||
import com.plotsquared.core.database.SQLManager;
|
import com.plotsquared.core.database.SQLManager;
|
||||||
import com.plotsquared.core.database.SQLite;
|
|
||||||
import com.plotsquared.core.generator.GeneratorWrapper;
|
import com.plotsquared.core.generator.GeneratorWrapper;
|
||||||
import com.plotsquared.core.generator.HybridPlotWorld;
|
import com.plotsquared.core.generator.HybridPlotWorld;
|
||||||
import com.plotsquared.core.generator.HybridUtils;
|
import com.plotsquared.core.generator.HybridUtils;
|
||||||
import com.plotsquared.core.generator.IndependentPlotGenerator;
|
import com.plotsquared.core.generator.IndependentPlotGenerator;
|
||||||
|
import com.plotsquared.core.inject.annotations.PlotDatabase;
|
||||||
import com.plotsquared.core.inject.factory.HybridPlotWorldFactory;
|
import com.plotsquared.core.inject.factory.HybridPlotWorldFactory;
|
||||||
import com.plotsquared.core.listener.PlotListener;
|
import com.plotsquared.core.listener.PlotListener;
|
||||||
import com.plotsquared.core.location.Location;
|
import com.plotsquared.core.location.Location;
|
||||||
@ -75,7 +74,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
|||||||
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 javax.sql.DataSource;
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
|
import java.io.Closeable;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
@ -84,7 +85,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 +211,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()) {
|
||||||
@ -270,7 +272,11 @@ public class PlotSquared {
|
|||||||
captionMap = this.captionLoader.loadAll(this.platform.getDirectory().toPath().resolve("lang"));
|
captionMap = this.captionLoader.loadAll(this.platform.getDirectory().toPath().resolve("lang"));
|
||||||
} else {
|
} else {
|
||||||
String fileName = "messages_" + Settings.Enabled_Components.DEFAULT_LOCALE + ".json";
|
String fileName = "messages_" + Settings.Enabled_Components.DEFAULT_LOCALE + ".json";
|
||||||
captionMap = this.captionLoader.loadOrCreateSingle(this.platform.getDirectory().toPath().resolve("lang").resolve(fileName));
|
captionMap = this.captionLoader.loadOrCreateSingle(this.platform
|
||||||
|
.getDirectory()
|
||||||
|
.toPath()
|
||||||
|
.resolve("lang")
|
||||||
|
.resolve(fileName));
|
||||||
}
|
}
|
||||||
this.captionMaps.put(TranslatableCaption.DEFAULT_NAMESPACE, captionMap);
|
this.captionMaps.put(TranslatableCaption.DEFAULT_NAMESPACE, captionMap);
|
||||||
LOGGER.info(
|
LOGGER.info(
|
||||||
@ -1011,7 +1017,7 @@ public class PlotSquared {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup the configuration for a plot world based on world arguments.
|
* Setup the configuration for a plot world based on world arguments.
|
||||||
*
|
* <p>
|
||||||
*
|
*
|
||||||
* <i>e.g. /mv create <world> normal -g PlotSquared:<args></i>
|
* <i>e.g. /mv create <world> normal -g PlotSquared:<args></i>
|
||||||
*
|
*
|
||||||
@ -1231,8 +1237,11 @@ public class PlotSquared {
|
|||||||
DBFunc.validatePlots(plots);
|
DBFunc.validatePlots(plots);
|
||||||
|
|
||||||
// Close the connection
|
// Close the connection
|
||||||
DBFunc.close();
|
final DataSource dataSource = platform().injector().getInstance(Key.get(DataSource.class, PlotDatabase.class));
|
||||||
} catch (NullPointerException throwable) {
|
if (dataSource instanceof Closeable closeable) {
|
||||||
|
closeable.close();
|
||||||
|
}
|
||||||
|
} catch (IOException | NullPointerException throwable) {
|
||||||
LOGGER.error("Could not close database connection", throwable);
|
LOGGER.error("Could not close database connection", throwable);
|
||||||
throwable.printStackTrace();
|
throwable.printStackTrace();
|
||||||
}
|
}
|
||||||
@ -1277,33 +1286,14 @@ public class PlotSquared {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup the database connection.
|
* Set up the database connection.
|
||||||
*/
|
*/
|
||||||
public void setupDatabase() {
|
public void setupDatabase() {
|
||||||
try {
|
try {
|
||||||
if (DBFunc.dbManager != null) {
|
if (DBFunc.dbManager != null) {
|
||||||
DBFunc.dbManager.close();
|
DBFunc.dbManager.close();
|
||||||
}
|
}
|
||||||
Database database;
|
DBFunc.dbManager = platform().injector().getInstance(SQLManager.class);
|
||||||
if (Storage.MySQL.USE) {
|
|
||||||
database = new MySQL(Storage.MySQL.HOST, Storage.MySQL.PORT, Storage.MySQL.DATABASE,
|
|
||||||
Storage.MySQL.USER, Storage.MySQL.PASSWORD
|
|
||||||
);
|
|
||||||
} else if (Storage.SQLite.USE) {
|
|
||||||
File file = FileUtils.getFile(platform.getDirectory(), Storage.SQLite.DB + ".db");
|
|
||||||
database = new SQLite(file);
|
|
||||||
} else {
|
|
||||||
LOGGER.error("No storage type is set. Disabling PlotSquared");
|
|
||||||
this.platform.shutdown(); //shutdown used instead of disable because no database is set
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
DBFunc.dbManager = new SQLManager(
|
|
||||||
database,
|
|
||||||
Storage.PREFIX,
|
|
||||||
this.eventDispatcher,
|
|
||||||
this.plotListener,
|
|
||||||
this.worldConfiguration
|
|
||||||
);
|
|
||||||
this.plots_tmp = DBFunc.getPlots();
|
this.plots_tmp = DBFunc.getPlots();
|
||||||
if (getPlotAreaManager() instanceof SinglePlotAreaManager) {
|
if (getPlotAreaManager() instanceof SinglePlotAreaManager) {
|
||||||
SinglePlotArea area = ((SinglePlotAreaManager) getPlotAreaManager()).getArea();
|
SinglePlotArea area = ((SinglePlotAreaManager) getPlotAreaManager()).getArea();
|
||||||
@ -1317,13 +1307,13 @@ public class PlotSquared {
|
|||||||
}
|
}
|
||||||
this.clustersTmp = DBFunc.getClusters();
|
this.clustersTmp = DBFunc.getClusters();
|
||||||
LOGGER.info("Connection to database established. Type: {}", Storage.MySQL.USE ? "MySQL" : "SQLite");
|
LOGGER.info("Connection to database established. Type: {}", Storage.MySQL.USE ? "MySQL" : "SQLite");
|
||||||
} catch (ClassNotFoundException | SQLException e) {
|
} catch (Exception e) {
|
||||||
LOGGER.error(
|
LOGGER.error(
|
||||||
"Failed to open database connection ({}). Disabling PlotSquared",
|
"Failed to open database connection ({}). Disabling PlotSquared",
|
||||||
Storage.MySQL.USE ? "MySQL" : "SQLite"
|
Storage.MySQL.USE ? "MySQL" : "SQLite"
|
||||||
);
|
);
|
||||||
LOGGER.error("==== Here is an ugly stacktrace, if you are interested in those things ===");
|
LOGGER.error("==== Here is an ugly stacktrace, if you are interested in those things ===");
|
||||||
e.printStackTrace();
|
LOGGER.error("", e);
|
||||||
LOGGER.error("==== End of stacktrace ====");
|
LOGGER.error("==== End of stacktrace ====");
|
||||||
LOGGER.error(
|
LOGGER.error(
|
||||||
"Please go to the {} 'storage.yml' and configure the database correctly",
|
"Please go to the {} 'storage.yml' and configure the database correctly",
|
||||||
|
@ -141,24 +141,24 @@ public class SimpleBackupManager implements BackupManager {
|
|||||||
) {
|
) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(final Object o) {
|
public boolean equals(final Object o) {
|
||||||
if (this == o) {
|
if (this == o) {
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
if (o == null || getClass() != o.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
final PlotCacheKey that = (PlotCacheKey) o;
|
|
||||||
return Objects.equals(plot.getArea(), that.plot.getArea())
|
|
||||||
&& Objects.equals(plot.getId(), that.plot.getId())
|
|
||||||
&& Objects.equals(plot.getOwnerAbs(), that.plot.getOwnerAbs());
|
|
||||||
}
|
}
|
||||||
|
if (o == null || getClass() != o.getClass()) {
|
||||||
@Override
|
return false;
|
||||||
public int hashCode() {
|
|
||||||
return Objects.hash(plot.getArea(), plot.getId(), plot.getOwnerAbs());
|
|
||||||
}
|
}
|
||||||
|
final PlotCacheKey that = (PlotCacheKey) o;
|
||||||
|
return Objects.equals(plot.getArea(), that.plot.getArea())
|
||||||
|
&& Objects.equals(plot.getId(), that.plot.getId())
|
||||||
|
&& Objects.equals(plot.getOwnerAbs(), that.plot.getOwnerAbs());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(plot.getArea(), plot.getId(), plot.getOwnerAbs());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
@ -70,7 +71,8 @@ public class Add extends Command {
|
|||||||
plot.isOwner(player.getUUID()) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_TRUST),
|
plot.isOwner(player.getUUID()) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_TRUST),
|
||||||
TranslatableCaption.of("permission.no_plot_perms")
|
TranslatableCaption.of("permission.no_plot_perms")
|
||||||
);
|
);
|
||||||
checkTrue(args.length == 1,
|
checkTrue(
|
||||||
|
args.length == 1,
|
||||||
TranslatableCaption.of("commandconfig.command_syntax"),
|
TranslatableCaption.of("commandconfig.command_syntax"),
|
||||||
TagResolver.resolver("value", Tag.inserting(Component.text("/plot add <player | *>")))
|
TagResolver.resolver("value", Tag.inserting(Component.text("/plot add <player | *>")))
|
||||||
);
|
);
|
||||||
@ -100,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;
|
||||||
@ -110,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;
|
||||||
@ -120,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,12 +294,15 @@ 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");
|
||||||
|
int size = sizeX * sizeZ;
|
||||||
|
double mergeCost = size <= 1 || mergeCostExp == null ? 0d : mergeCostExp.evaluate(size);
|
||||||
double cost = costExp.evaluate(Settings.Limit.GLOBAL ?
|
double cost = costExp.evaluate(Settings.Limit.GLOBAL ?
|
||||||
player.getPlotCount() :
|
player.getPlotCount() :
|
||||||
player.getPlotCount(plotarea.getWorldName()));
|
player.getPlotCount(plotarea.getWorldName()));
|
||||||
cost = (sizeX * sizeZ) * cost;
|
cost = size * cost + mergeCost;
|
||||||
if (cost > 0d) {
|
if (cost > 0d) {
|
||||||
if (!this.econHandler.isSupported()) {
|
if (!this.econHandler.isSupported()) {
|
||||||
player.sendMessage(TranslatableCaption.of("economy.vault_or_consumer_null"));
|
player.sendMessage(TranslatableCaption.of("economy.vault_or_consumer_null"));
|
||||||
|
@ -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,8 +186,8 @@ 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()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -107,37 +107,35 @@ public class Clear extends Command {
|
|||||||
}
|
}
|
||||||
BackupManager.backup(player, plot, () -> {
|
BackupManager.backup(player, plot, () -> {
|
||||||
final long start = System.currentTimeMillis();
|
final long start = System.currentTimeMillis();
|
||||||
boolean result = plot.getPlotModificationManager().clear(true, false, player, () -> {
|
boolean result = plot.getPlotModificationManager().clear(true, false, player, () -> TaskManager.runTask(() -> {
|
||||||
TaskManager.runTask(() -> {
|
plot.removeRunning();
|
||||||
plot.removeRunning();
|
// If the state changes, then mark it as no longer done
|
||||||
// If the state changes, then mark it as no longer done
|
if (DoneFlag.isDone(plot)) {
|
||||||
if (DoneFlag.isDone(plot)) {
|
PlotFlag<?, ?> plotFlag =
|
||||||
PlotFlag<?, ?> plotFlag =
|
plot.getFlagContainer().getFlag(DoneFlag.class);
|
||||||
plot.getFlagContainer().getFlag(DoneFlag.class);
|
PlotFlagRemoveEvent event = this.eventDispatcher
|
||||||
PlotFlagRemoveEvent event = this.eventDispatcher
|
.callFlagRemove(plotFlag, plot);
|
||||||
.callFlagRemove(plotFlag, plot);
|
if (event.getEventResult() != Result.DENY) {
|
||||||
if (event.getEventResult() != Result.DENY) {
|
plot.removeFlag(event.getFlag());
|
||||||
plot.removeFlag(event.getFlag());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (!plot.getFlag(AnalysisFlag.class).isEmpty()) {
|
}
|
||||||
PlotFlag<?, ?> plotFlag =
|
if (!plot.getFlag(AnalysisFlag.class).isEmpty()) {
|
||||||
plot.getFlagContainer().getFlag(AnalysisFlag.class);
|
PlotFlag<?, ?> plotFlag =
|
||||||
PlotFlagRemoveEvent event = this.eventDispatcher
|
plot.getFlagContainer().getFlag(AnalysisFlag.class);
|
||||||
.callFlagRemove(plotFlag, plot);
|
PlotFlagRemoveEvent event = this.eventDispatcher
|
||||||
if (event.getEventResult() != Result.DENY) {
|
.callFlagRemove(plotFlag, plot);
|
||||||
plot.removeFlag(event.getFlag());
|
if (event.getEventResult() != Result.DENY) {
|
||||||
}
|
plot.removeFlag(event.getFlag());
|
||||||
}
|
}
|
||||||
player.sendMessage(
|
}
|
||||||
TranslatableCaption.of("working.clearing_done"),
|
player.sendMessage(
|
||||||
TagResolver.builder()
|
TranslatableCaption.of("working.clearing_done"),
|
||||||
.tag("amount", Tag.inserting(Component.text(System.currentTimeMillis() - start)))
|
TagResolver.builder()
|
||||||
.tag("plot", Tag.inserting(Component.text(plot.getId().toString())))
|
.tag("amount", Tag.inserting(Component.text(System.currentTimeMillis() - start)))
|
||||||
.build()
|
.tag("plot", Tag.inserting(Component.text(plot.getId().toString())))
|
||||||
);
|
.build()
|
||||||
});
|
);
|
||||||
});
|
}));
|
||||||
if (!result) {
|
if (!result) {
|
||||||
player.sendMessage(TranslatableCaption.of("errors.wait_for_timer"));
|
player.sendMessage(TranslatableCaption.of("errors.wait_for_timer"));
|
||||||
} else {
|
} else {
|
||||||
|
@ -46,6 +46,7 @@ import java.util.Collections;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
@ -77,8 +78,7 @@ public class Cluster extends SubCommand {
|
|||||||
}
|
}
|
||||||
String sub = args[0].toLowerCase();
|
String sub = args[0].toLowerCase();
|
||||||
switch (sub) {
|
switch (sub) {
|
||||||
case "l":
|
case "l", "list" -> {
|
||||||
case "list": {
|
|
||||||
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_LIST)) {
|
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_LIST)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("permission.no_permission"),
|
TranslatableCaption.of("permission.no_permission"),
|
||||||
@ -133,8 +133,7 @@ public class Cluster extends SubCommand {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "c":
|
case "c", "create" -> {
|
||||||
case "create": {
|
|
||||||
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_CREATE)) {
|
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_CREATE)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("permission.no_permission"),
|
TranslatableCaption.of("permission.no_permission"),
|
||||||
@ -269,9 +268,7 @@ public class Cluster extends SubCommand {
|
|||||||
);
|
);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "disband":
|
case "disband", "del", "delete" -> {
|
||||||
case "del":
|
|
||||||
case "delete": {
|
|
||||||
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_DELETE)) {
|
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_DELETE)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("permission.no_permission"),
|
TranslatableCaption.of("permission.no_permission"),
|
||||||
@ -330,8 +327,7 @@ public class Cluster extends SubCommand {
|
|||||||
));
|
));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "res":
|
case "res", "resize" -> {
|
||||||
case "resize": {
|
|
||||||
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE)) {
|
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("permission.no_permission"),
|
TranslatableCaption.of("permission.no_permission"),
|
||||||
@ -452,9 +448,7 @@ public class Cluster extends SubCommand {
|
|||||||
player.sendMessage(TranslatableCaption.of("cluster.cluster_resized"));
|
player.sendMessage(TranslatableCaption.of("cluster.cluster_resized"));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "add":
|
case "add", "inv", "invite" -> {
|
||||||
case "inv":
|
|
||||||
case "invite": {
|
|
||||||
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_INVITE)) {
|
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_INVITE)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("permission.no_permission"),
|
TranslatableCaption.of("permission.no_permission"),
|
||||||
@ -523,9 +517,7 @@ public class Cluster extends SubCommand {
|
|||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "k":
|
case "k", "remove", "kick" -> {
|
||||||
case "remove":
|
|
||||||
case "kick": {
|
|
||||||
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_KICK)) {
|
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_KICK)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("permission.no_permission"),
|
TranslatableCaption.of("permission.no_permission"),
|
||||||
@ -605,8 +597,7 @@ public class Cluster extends SubCommand {
|
|||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "quit":
|
case "quit", "leave" -> {
|
||||||
case "leave": {
|
|
||||||
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_LEAVE)) {
|
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_LEAVE)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("permission.no_permission"),
|
TranslatableCaption.of("permission.no_permission"),
|
||||||
@ -667,7 +658,7 @@ public class Cluster extends SubCommand {
|
|||||||
removePlayerPlots(cluster, uuid, player.getLocation().getWorldName());
|
removePlayerPlots(cluster, uuid, player.getLocation().getWorldName());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "members": {
|
case "members" -> {
|
||||||
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_HELPERS)) {
|
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_HELPERS)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("permission.no_permission"),
|
TranslatableCaption.of("permission.no_permission"),
|
||||||
@ -728,9 +719,7 @@ public class Cluster extends SubCommand {
|
|||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "spawn":
|
case "spawn", "home", "tp" -> {
|
||||||
case "home":
|
|
||||||
case "tp": {
|
|
||||||
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_TP)) {
|
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_TP)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("permission.no_permission"),
|
TranslatableCaption.of("permission.no_permission"),
|
||||||
@ -778,10 +767,7 @@ public class Cluster extends SubCommand {
|
|||||||
player.sendMessage(TranslatableCaption.of("cluster.cluster_teleporting"));
|
player.sendMessage(TranslatableCaption.of("cluster.cluster_teleporting"));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "i":
|
case "i", "info", "show", "information" -> {
|
||||||
case "info":
|
|
||||||
case "show":
|
|
||||||
case "information": {
|
|
||||||
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_INFO)) {
|
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_INFO)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("permission.no_permission"),
|
TranslatableCaption.of("permission.no_permission"),
|
||||||
@ -828,11 +814,7 @@ public class Cluster extends SubCommand {
|
|||||||
player.sendMessage(TranslatableCaption.of("players.fetching_players_timeout"));
|
player.sendMessage(TranslatableCaption.of("players.fetching_players_timeout"));
|
||||||
} else {
|
} else {
|
||||||
final String owner;
|
final String owner;
|
||||||
if (username == null) {
|
owner = Objects.requireNonNullElse(username, "unknown");
|
||||||
owner = "unknown";
|
|
||||||
} else {
|
|
||||||
owner = username;
|
|
||||||
}
|
|
||||||
String name = cluster.getName();
|
String name = cluster.getName();
|
||||||
String size = (cluster.getP2().getX() - cluster.getP1().getX() + 1) + "x" + (
|
String size = (cluster.getP2().getX() - cluster.getP1().getX() + 1) + "x" + (
|
||||||
cluster.getP2().getY() - cluster.getP1().getY() + 1);
|
cluster.getP2().getY() - cluster.getP1().getY() + 1);
|
||||||
@ -850,9 +832,7 @@ public class Cluster extends SubCommand {
|
|||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "sh":
|
case "sh", "setspawn", "sethome" -> {
|
||||||
case "setspawn":
|
|
||||||
case "sethome": {
|
|
||||||
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_SETHOME)) {
|
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_SETHOME)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("permission.no_permission"),
|
TranslatableCaption.of("permission.no_permission"),
|
||||||
|
@ -559,9 +559,10 @@ public abstract class Command {
|
|||||||
|
|
||||||
public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
|
public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
|
||||||
switch (args.length) {
|
switch (args.length) {
|
||||||
case 0:
|
case 0 -> {
|
||||||
return this.allCommands;
|
return this.allCommands;
|
||||||
case 1:
|
}
|
||||||
|
case 1 -> {
|
||||||
String arg = args[0].toLowerCase();
|
String arg = args[0].toLowerCase();
|
||||||
if (space) {
|
if (space) {
|
||||||
Command cmd = getCommand(arg);
|
Command cmd = getCommand(arg);
|
||||||
@ -580,13 +581,15 @@ public abstract class Command {
|
|||||||
}
|
}
|
||||||
return commands;
|
return commands;
|
||||||
}
|
}
|
||||||
default:
|
}
|
||||||
|
default -> {
|
||||||
Command cmd = getCommand(args[0]);
|
Command cmd = getCommand(args[0]);
|
||||||
if (cmd != null) {
|
if (cmd != null) {
|
||||||
return cmd.tab(player, Arrays.copyOfRange(args, 1, args.length), space);
|
return cmd.tab(player, Arrays.copyOfRange(args, 1, args.length), space);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,8 @@ public class Copy extends SubCommand {
|
|||||||
|
|
||||||
plot1.getPlotModificationManager().copy(plot2, player).thenAccept(result -> {
|
plot1.getPlotModificationManager().copy(plot2, player).thenAccept(result -> {
|
||||||
if (result) {
|
if (result) {
|
||||||
player.sendMessage(TranslatableCaption.of("move.copy_success"),
|
player.sendMessage(
|
||||||
|
TranslatableCaption.of("move.copy_success"),
|
||||||
TagResolver.builder()
|
TagResolver.builder()
|
||||||
.tag("origin", Tag.inserting(Component.text(plot1.toString())))
|
.tag("origin", Tag.inserting(Component.text(plot1.toString())))
|
||||||
.tag("target", Tag.inserting(Component.text(plot2.toString())))
|
.tag("target", Tag.inserting(Component.text(plot2.toString())))
|
||||||
|
@ -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());
|
||||||
|
@ -71,9 +71,9 @@ public class DebugPaste extends SubCommand {
|
|||||||
StringBuilder b = new StringBuilder();
|
StringBuilder b = new StringBuilder();
|
||||||
b.append(
|
b.append(
|
||||||
"""
|
"""
|
||||||
# Welcome to this paste
|
# Welcome to this paste
|
||||||
# It is meant to provide us at IntellectualSites with better information about your problem
|
# It is meant to provide us at IntellectualSites with better information about your problem
|
||||||
"""
|
"""
|
||||||
);
|
);
|
||||||
b.append("# PlotSquared Information\n");
|
b.append("# PlotSquared Information\n");
|
||||||
b.append("PlotSquared Version: ").append(PlotSquared.get().getVersion())
|
b.append("PlotSquared Version: ").append(PlotSquared.get().getVersion())
|
||||||
|
@ -75,16 +75,19 @@ public class DebugRoadRegen extends SubCommand {
|
|||||||
}
|
}
|
||||||
String kind = args[0].toLowerCase();
|
String kind = args[0].toLowerCase();
|
||||||
switch (kind) {
|
switch (kind) {
|
||||||
case "plot":
|
case "plot" -> {
|
||||||
return regenPlot(player);
|
return regenPlot(player);
|
||||||
case "region":
|
}
|
||||||
|
case "region" -> {
|
||||||
return regenRegion(player, Arrays.copyOfRange(args, 1, args.length));
|
return regenRegion(player, Arrays.copyOfRange(args, 1, args.length));
|
||||||
default:
|
}
|
||||||
|
default -> {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("commandconfig.command_syntax"),
|
TranslatableCaption.of("commandconfig.command_syntax"),
|
||||||
TagResolver.resolver("value", Tag.inserting(Component.text(DebugRoadRegen.USAGE)))
|
TagResolver.resolver("value", Tag.inserting(Component.text(DebugRoadRegen.USAGE)))
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,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 {
|
||||||
|
@ -103,7 +103,7 @@ public class Done extends SubCommand {
|
|||||||
public void run(PlotAnalysis value) {
|
public void run(PlotAnalysis value) {
|
||||||
plot.removeRunning();
|
plot.removeRunning();
|
||||||
boolean result =
|
boolean result =
|
||||||
value.getComplexity(doneRequirements) <= doneRequirements.THRESHOLD;
|
value.getComplexity(doneRequirements) >= doneRequirements.THRESHOLD;
|
||||||
finish(plot, player, result);
|
finish(plot, player, result);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -185,22 +185,25 @@ public class Download extends SubCommand {
|
|||||||
if (Settings.Web.LEGACY_WEBINTERFACE) {
|
if (Settings.Web.LEGACY_WEBINTERFACE) {
|
||||||
schematicHandler
|
schematicHandler
|
||||||
.getCompoundTag(plot)
|
.getCompoundTag(plot)
|
||||||
.whenComplete((compoundTag, throwable) -> {
|
.whenComplete((compoundTag, throwable) -> schematicHandler.upload(
|
||||||
schematicHandler.upload(compoundTag, null, null, new RunnableVal<>() {
|
compoundTag,
|
||||||
@Override
|
null,
|
||||||
public void run(URL value) {
|
null,
|
||||||
plot.removeRunning();
|
new RunnableVal<>() {
|
||||||
player.sendMessage(
|
@Override
|
||||||
TranslatableCaption.of("web.generation_link_success"),
|
public void run(URL value) {
|
||||||
TagResolver.builder()
|
plot.removeRunning();
|
||||||
.tag("download", Tag.preProcessParsed(value.toString()))
|
player.sendMessage(
|
||||||
.tag("delete", Tag.preProcessParsed("Not available"))
|
TranslatableCaption.of("web.generation_link_success"),
|
||||||
.build()
|
TagResolver.builder()
|
||||||
);
|
.tag("download", Tag.preProcessParsed(value.toString()))
|
||||||
player.sendMessage(StaticCaption.of(value.toString()));
|
.tag("delete", Tag.preProcessParsed("Not available"))
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
player.sendMessage(StaticCaption.of(value.toString()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
));
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// TODO legacy support
|
// TODO legacy support
|
||||||
|
@ -60,9 +60,10 @@ public class Help extends Command {
|
|||||||
RunnableVal2<Command, CommandResult> whenDone
|
RunnableVal2<Command, CommandResult> whenDone
|
||||||
) {
|
) {
|
||||||
switch (args.length) {
|
switch (args.length) {
|
||||||
case 0:
|
case 0 -> {
|
||||||
return displayHelp(player, null, 0);
|
return displayHelp(player, null, 0);
|
||||||
case 1:
|
}
|
||||||
|
case 1 -> {
|
||||||
if (MathMan.isInteger(args[0])) {
|
if (MathMan.isInteger(args[0])) {
|
||||||
try {
|
try {
|
||||||
return displayHelp(player, null, Integer.parseInt(args[0]));
|
return displayHelp(player, null, Integer.parseInt(args[0]));
|
||||||
@ -72,7 +73,8 @@ public class Help extends Command {
|
|||||||
} else {
|
} else {
|
||||||
return displayHelp(player, args[0], 1);
|
return displayHelp(player, args[0], 1);
|
||||||
}
|
}
|
||||||
case 2:
|
}
|
||||||
|
case 2 -> {
|
||||||
if (MathMan.isInteger(args[1])) {
|
if (MathMan.isInteger(args[1])) {
|
||||||
try {
|
try {
|
||||||
return displayHelp(player, args[0], Integer.parseInt(args[1]));
|
return displayHelp(player, args[0], Integer.parseInt(args[1]));
|
||||||
@ -81,8 +83,8 @@ public class Help extends Command {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return CompletableFuture.completedFuture(false);
|
return CompletableFuture.completedFuture(false);
|
||||||
default:
|
}
|
||||||
sendUsage(player);
|
default -> sendUsage(player);
|
||||||
}
|
}
|
||||||
return CompletableFuture.completedFuture(true);
|
return CompletableFuture.completedFuture(true);
|
||||||
}
|
}
|
||||||
@ -132,7 +134,12 @@ public class Help extends Command {
|
|||||||
TagResolver.builder()
|
TagResolver.builder()
|
||||||
.tag("command", Tag.inserting(Component.text("/plot help")))
|
.tag("command", Tag.inserting(Component.text("/plot help")))
|
||||||
.tag("category", Tag.inserting(Component.text("all")))
|
.tag("category", Tag.inserting(Component.text("all")))
|
||||||
.tag("category_desc", Tag.inserting(TranslatableCaption.of("help.help_display_all_commands").toComponent(player)))
|
.tag(
|
||||||
|
"category_desc",
|
||||||
|
Tag.inserting(TranslatableCaption
|
||||||
|
.of("help.help_display_all_commands")
|
||||||
|
.toComponent(player))
|
||||||
|
)
|
||||||
.build()
|
.build()
|
||||||
));
|
));
|
||||||
builder.append(Component.newline()).append(MINI_MESSAGE.deserialize(TranslatableCaption
|
builder.append(Component.newline()).append(MINI_MESSAGE.deserialize(TranslatableCaption
|
||||||
|
@ -190,7 +190,7 @@ public class Inbox extends SubCommand {
|
|||||||
final int page;
|
final int page;
|
||||||
if (args.length > 1) {
|
if (args.length > 1) {
|
||||||
switch (args[1].toLowerCase()) {
|
switch (args[1].toLowerCase()) {
|
||||||
case "delete":
|
case "delete" -> {
|
||||||
if (!inbox.canModify(plot, player)) {
|
if (!inbox.canModify(plot, player)) {
|
||||||
player.sendMessage(TranslatableCaption.of("comment.no_perm_inbox_modify"));
|
player.sendMessage(TranslatableCaption.of("comment.no_perm_inbox_modify"));
|
||||||
return false;
|
return false;
|
||||||
@ -225,7 +225,6 @@ public class Inbox extends SubCommand {
|
|||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!inbox.getComments(plot, new RunnableVal<>() {
|
if (!inbox.getComments(plot, new RunnableVal<>() {
|
||||||
@Override
|
@Override
|
||||||
public void run(List<PlotComment> value) {
|
public void run(List<PlotComment> value) {
|
||||||
@ -254,7 +253,8 @@ public class Inbox extends SubCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
case "clear":
|
}
|
||||||
|
case "clear" -> {
|
||||||
if (!inbox.canModify(plot, player)) {
|
if (!inbox.canModify(plot, player)) {
|
||||||
player.sendMessage(TranslatableCaption.of("comment.no_perm_inbox_modify"));
|
player.sendMessage(TranslatableCaption.of("comment.no_perm_inbox_modify"));
|
||||||
}
|
}
|
||||||
@ -268,13 +268,15 @@ public class Inbox extends SubCommand {
|
|||||||
plot.getPlotCommentContainer().removeComments(comments);
|
plot.getPlotCommentContainer().removeComments(comments);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
default:
|
}
|
||||||
|
default -> {
|
||||||
try {
|
try {
|
||||||
page = Integer.parseInt(args[1]);
|
page = Integer.parseInt(args[1]);
|
||||||
} catch (NumberFormatException ignored) {
|
} catch (NumberFormatException ignored) {
|
||||||
sendUsage(player);
|
sendUsage(player);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
page = 1;
|
page = 1;
|
||||||
|
@ -52,8 +52,9 @@ public class Info extends SubCommand {
|
|||||||
arg = args[0];
|
arg = args[0];
|
||||||
switch (arg) {
|
switch (arg) {
|
||||||
// TODO: (re?)implement /plot info inv. (it was never properly implemented)
|
// TODO: (re?)implement /plot info inv. (it was never properly implemented)
|
||||||
case "trusted", "alias", "biome", "denied", "flags", "id", "size", "members", "creationdate", "seen", "owner", "rating", "likes" -> plot = Plot
|
case "trusted", "alias", "biome", "denied", "flags", "id", "size", "members", "creationdate", "seen", "owner", "rating", "likes" ->
|
||||||
.getPlotFromString(player, null, false);
|
plot = Plot
|
||||||
|
.getPlotFromString(player, null, false);
|
||||||
default -> {
|
default -> {
|
||||||
plot = Plot.getPlotFromString(player, arg, false);
|
plot = Plot.getPlotFromString(player, arg, false);
|
||||||
if (args.length == 2) {
|
if (args.length == 2) {
|
||||||
|
@ -112,15 +112,15 @@ public class Kick extends SubCommand {
|
|||||||
for (PlotPlayer<?> player2 : players) {
|
for (PlotPlayer<?> player2 : players) {
|
||||||
if (!plot.equals(player2.getCurrentPlot())) {
|
if (!plot.equals(player2.getCurrentPlot())) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("errors.invalid_player"),
|
TranslatableCaption.of("kick.player_not_in_plot"),
|
||||||
TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
|
TagResolver.resolver("player", Tag.inserting(Component.text(player2.getName())))
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (player2.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_DENIED)) {
|
if (player2.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_DENIED)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("cluster.cannot_kick_player"),
|
TranslatableCaption.of("kick.cannot_kick_player"),
|
||||||
TagResolver.resolver("name", Tag.inserting(Component.text(player2.getName())))
|
TagResolver.resolver("player", Tag.inserting(Component.text(player2.getName())))
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -476,11 +476,11 @@ public class ListCmd extends SubCommand {
|
|||||||
for (final UUIDMapping uuidMapping : names) {
|
for (final UUIDMapping uuidMapping : names) {
|
||||||
PlotPlayer<?> pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuidMapping.uuid());
|
PlotPlayer<?> pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuidMapping.uuid());
|
||||||
TagResolver resolver = TagResolver.builder()
|
TagResolver resolver = TagResolver.builder()
|
||||||
.tag("prefix", Tag.inserting(Component.text(prefix)))
|
.tag("prefix", Tag.inserting(Component.text(prefix)))
|
||||||
.tag("player", Tag.inserting(Component.text(uuidMapping.username())))
|
.tag("player", Tag.inserting(Component.text(uuidMapping.username())))
|
||||||
.build();
|
.build();
|
||||||
if (pp != null) {
|
if (pp != null) {
|
||||||
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",
|
"info.unknown",
|
||||||
@ -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) {
|
||||||
|
@ -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"),
|
||||||
|
@ -56,7 +56,7 @@ public class Music extends SubCommand {
|
|||||||
.asList("music_disc_13", "music_disc_cat", "music_disc_blocks", "music_disc_chirp",
|
.asList("music_disc_13", "music_disc_cat", "music_disc_blocks", "music_disc_chirp",
|
||||||
"music_disc_far", "music_disc_mall", "music_disc_mellohi", "music_disc_stal",
|
"music_disc_far", "music_disc_mall", "music_disc_mellohi", "music_disc_stal",
|
||||||
"music_disc_strad", "music_disc_ward", "music_disc_11", "music_disc_wait", "music_disc_otherside",
|
"music_disc_strad", "music_disc_ward", "music_disc_11", "music_disc_wait", "music_disc_otherside",
|
||||||
"music_disc_pigstep", "music_disc_5"
|
"music_disc_pigstep", "music_disc_5", "music_disc_relic"
|
||||||
);
|
);
|
||||||
|
|
||||||
private final InventoryUtil inventoryUtil;
|
private final InventoryUtil inventoryUtil;
|
||||||
|
@ -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(
|
||||||
|
@ -90,12 +90,8 @@ public class Purge extends SubCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
switch (split[0].toLowerCase()) {
|
switch (split[0].toLowerCase()) {
|
||||||
case "world":
|
case "world", "w" -> world = split[1];
|
||||||
case "w":
|
case "area", "a" -> {
|
||||||
world = split[1];
|
|
||||||
break;
|
|
||||||
case "area":
|
|
||||||
case "a":
|
|
||||||
area = this.plotAreaManager.getPlotAreaByString(split[1]);
|
area = this.plotAreaManager.getPlotAreaByString(split[1]);
|
||||||
if (area == null) {
|
if (area == null) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
@ -104,9 +100,8 @@ public class Purge extends SubCommand {
|
|||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case "plotid":
|
case "plotid", "id" -> {
|
||||||
case "id":
|
|
||||||
try {
|
try {
|
||||||
id = PlotId.fromString(split[1]);
|
id = PlotId.fromString(split[1]);
|
||||||
} catch (IllegalArgumentException ignored) {
|
} catch (IllegalArgumentException ignored) {
|
||||||
@ -116,9 +111,8 @@ public class Purge extends SubCommand {
|
|||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case "owner":
|
case "owner", "o" -> {
|
||||||
case "o":
|
|
||||||
UUIDMapping ownerMapping = PlotSquared.get().getImpromptuUUIDPipeline().getImmediately(split[1]);
|
UUIDMapping ownerMapping = PlotSquared.get().getImpromptuUUIDPipeline().getImmediately(split[1]);
|
||||||
if (ownerMapping == null) {
|
if (ownerMapping == null) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
@ -128,9 +122,8 @@ public class Purge extends SubCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
owner = ownerMapping.uuid();
|
owner = ownerMapping.uuid();
|
||||||
break;
|
}
|
||||||
case "shared":
|
case "shared", "s" -> {
|
||||||
case "s":
|
|
||||||
UUIDMapping addedMapping = PlotSquared.get().getImpromptuUUIDPipeline().getImmediately(split[1]);
|
UUIDMapping addedMapping = PlotSquared.get().getImpromptuUUIDPipeline().getImmediately(split[1]);
|
||||||
if (addedMapping == null) {
|
if (addedMapping == null) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
@ -140,22 +133,13 @@ public class Purge extends SubCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
added = addedMapping.uuid();
|
added = addedMapping.uuid();
|
||||||
break;
|
}
|
||||||
case "clear":
|
case "clear", "c", "delete", "d", "del" -> clear = Boolean.parseBoolean(split[1]);
|
||||||
case "c":
|
case "unknown", "?", "u" -> unknown = Boolean.parseBoolean(split[1]);
|
||||||
case "delete":
|
default -> {
|
||||||
case "d":
|
|
||||||
case "del":
|
|
||||||
clear = Boolean.parseBoolean(split[1]);
|
|
||||||
break;
|
|
||||||
case "unknown":
|
|
||||||
case "?":
|
|
||||||
case "u":
|
|
||||||
unknown = Boolean.parseBoolean(split[1]);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
sendUsage(player);
|
sendUsage(player);
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final HashSet<Plot> toDelete = new HashSet<>();
|
final HashSet<Plot> toDelete = new HashSet<>();
|
||||||
@ -236,9 +220,9 @@ public class Purge extends SubCommand {
|
|||||||
try {
|
try {
|
||||||
ids.add(plot.temp);
|
ids.add(plot.temp);
|
||||||
if (finalClear) {
|
if (finalClear) {
|
||||||
plot.getPlotModificationManager().clear(false, true, player, () -> {
|
plot.getPlotModificationManager().clear(false, true, player,
|
||||||
LOGGER.info("Plot {} cleared by purge", plot.getId());
|
() -> LOGGER.info("Plot {} cleared by purge", plot.getId())
|
||||||
});
|
);
|
||||||
} else {
|
} else {
|
||||||
plot.getPlotModificationManager().removeSign();
|
plot.getPlotModificationManager().removeSign();
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -49,7 +49,8 @@ public record ComponentPreset(
|
|||||||
public static ComponentPreset deserialize(final @NonNull Map<String, Object> map) {
|
public static ComponentPreset deserialize(final @NonNull Map<String, Object> map) {
|
||||||
final ClassicPlotManagerComponent classicPlotManagerComponent = ClassicPlotManagerComponent
|
final ClassicPlotManagerComponent classicPlotManagerComponent = ClassicPlotManagerComponent
|
||||||
.fromString(map.getOrDefault("component", "").toString()).orElseThrow(() ->
|
.fromString(map.getOrDefault("component", "").toString()).orElseThrow(() ->
|
||||||
new IllegalArgumentException("The preset in components.yml needs a valid target component, got: " + map.get("component")));
|
new IllegalArgumentException("The preset in components.yml needs a valid target component, got: " + map.get(
|
||||||
|
"component")));
|
||||||
final String pattern = map.getOrDefault("pattern", "").toString();
|
final String pattern = map.getOrDefault("pattern", "").toString();
|
||||||
final double cost = Double.parseDouble(map.getOrDefault("cost", "0.0").toString());
|
final double cost = Double.parseDouble(map.getOrDefault("cost", "0.0").toString());
|
||||||
final String permission = map.getOrDefault("permission", "").toString();
|
final String permission = map.getOrDefault("permission", "").toString();
|
||||||
|
@ -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"),
|
||||||
|
@ -42,32 +42,6 @@ public class Config {
|
|||||||
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + Config.class.getSimpleName());
|
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + Config.class.getSimpleName());
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the value for a node<br>
|
|
||||||
* Probably throws some error if you try to get a non existent key
|
|
||||||
*
|
|
||||||
* @param key configuration key
|
|
||||||
* @param root configuration class
|
|
||||||
* @param <T> value type
|
|
||||||
* @return value
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public static <T> T get(String key, Class<?> root) {
|
|
||||||
String[] split = key.split("\\.");
|
|
||||||
Object instance = getInstance(split, root);
|
|
||||||
if (instance != null) {
|
|
||||||
Field field = getField(split, instance);
|
|
||||||
if (field != null) {
|
|
||||||
try {
|
|
||||||
return (T) field.get(instance);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the value of a specific node<br>
|
* Set the value of a specific node<br>
|
||||||
* Probably throws some error if you supply non existing keys or invalid values
|
* Probably throws some error if you supply non existing keys or invalid values
|
||||||
@ -259,7 +233,6 @@ public class Config {
|
|||||||
*
|
*
|
||||||
* @param split the node (split by period)
|
* @param split the node (split by period)
|
||||||
* @param instance the instance
|
* @param instance the instance
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
private static Field getField(String[] split, Object instance) {
|
private static Field getField(String[] split, Object instance) {
|
||||||
try {
|
try {
|
||||||
@ -445,10 +418,6 @@ public class Config {
|
|||||||
return INSTANCES.values();
|
return INSTANCES.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<String> getSections() {
|
|
||||||
return INSTANCES.keySet();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Map<String, T> getRaw() {
|
private Map<String, T> getRaw() {
|
||||||
return INSTANCES;
|
return INSTANCES;
|
||||||
}
|
}
|
||||||
|
@ -194,7 +194,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 +214,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 +280,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 +402,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(
|
||||||
@ -531,7 +531,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")
|
||||||
@ -783,7 +783,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;
|
||||||
|
@ -40,8 +40,10 @@ public interface Caption {
|
|||||||
*
|
*
|
||||||
* @param localeHolder Locale holder
|
* @param localeHolder Locale holder
|
||||||
* @return {@link ComponentLike}
|
* @return {@link ComponentLike}
|
||||||
* @since TODO
|
* @since 7.0.0
|
||||||
*/
|
*/
|
||||||
@NonNull Component toComponent(@NonNull LocaleHolder localeHolder);
|
@NonNull Component toComponent(@NonNull LocaleHolder localeHolder);
|
||||||
|
|
||||||
|
@NonNull String toString();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ public class CaptionHolder {
|
|||||||
* Get the {@link TagResolver}s to use when resolving tags in the {@link Caption}.
|
* Get the {@link TagResolver}s to use when resolving tags in the {@link Caption}.
|
||||||
*
|
*
|
||||||
* @return The tag resolvers to use.
|
* @return The tag resolvers to use.
|
||||||
* @since TODO
|
* @since 7.0.0
|
||||||
*/
|
*/
|
||||||
public TagResolver[] getTagResolvers() {
|
public TagResolver[] getTagResolvers() {
|
||||||
return this.tagResolvers;
|
return this.tagResolvers;
|
||||||
@ -61,7 +61,7 @@ public class CaptionHolder {
|
|||||||
* Set the {@link TagResolver}s to use when resolving tags in the {@link Caption}.
|
* Set the {@link TagResolver}s to use when resolving tags in the {@link Caption}.
|
||||||
*
|
*
|
||||||
* @param tagResolvers The tag resolvers to use.
|
* @param tagResolvers The tag resolvers to use.
|
||||||
* @since TODO
|
* @since 7.0.0
|
||||||
*/
|
*/
|
||||||
public void setTagResolvers(TagResolver... tagResolvers) {
|
public void setTagResolvers(TagResolver... tagResolvers) {
|
||||||
this.tagResolvers = tagResolvers;
|
this.tagResolvers = tagResolvers;
|
||||||
|
@ -28,16 +28,20 @@ import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag;
|
|||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.event.ClickEvent;
|
import net.kyori.adventure.text.event.ClickEvent;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
|
import net.kyori.adventure.text.minimessage.ParsingException;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import static com.plotsquared.core.configuration.caption.ComponentTransform.nested;
|
import static com.plotsquared.core.configuration.caption.ComponentTransform.nested;
|
||||||
import static com.plotsquared.core.configuration.caption.ComponentTransform.stripClicks;
|
import static com.plotsquared.core.configuration.caption.ComponentTransform.stripClicks;
|
||||||
|
|
||||||
public class CaptionUtility {
|
public class CaptionUtility {
|
||||||
|
|
||||||
|
private static final Pattern LEGACY_FORMATTING = Pattern.compile("§[a-gklmnor0-9]");
|
||||||
|
|
||||||
// flags which values are parsed by minimessage
|
// flags which values are parsed by minimessage
|
||||||
private static final Set<Class<? extends PlotFlag<?, ?>>> MINI_MESSAGE_FLAGS = Set.of(
|
private static final Set<Class<? extends PlotFlag<?, ?>>> MINI_MESSAGE_FLAGS = Set.of(
|
||||||
GreetingFlag.class,
|
GreetingFlag.class,
|
||||||
@ -100,7 +104,14 @@ public class CaptionUtility {
|
|||||||
*/
|
*/
|
||||||
public static String stripClickEvents(final @NonNull String miniMessageString) {
|
public static String stripClickEvents(final @NonNull String miniMessageString) {
|
||||||
// parse, transform and serialize again
|
// parse, transform and serialize again
|
||||||
Component component = MiniMessage.miniMessage().deserialize(miniMessageString);
|
Component component;
|
||||||
|
try {
|
||||||
|
component = MiniMessage.miniMessage().deserialize(miniMessageString);
|
||||||
|
} catch (ParsingException e) {
|
||||||
|
// if the String cannot be parsed, we try stripping legacy colors
|
||||||
|
String legacyStripped = LEGACY_FORMATTING.matcher(miniMessageString).replaceAll("");
|
||||||
|
component = MiniMessage.miniMessage().deserialize(legacyStripped);
|
||||||
|
}
|
||||||
component = CLICK_STRIP_TRANSFORM.transform(component);
|
component = CLICK_STRIP_TRANSFORM.transform(component);
|
||||||
return MiniMessage.miniMessage().serialize(component);
|
return MiniMessage.miniMessage().serialize(component);
|
||||||
}
|
}
|
||||||
|
@ -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() + ")";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -225,7 +225,7 @@ public final class CaptionLoader {
|
|||||||
*/
|
*/
|
||||||
public @NonNull CaptionMap loadOrCreateSingle(final @NonNull Path file) throws IOException {
|
public @NonNull CaptionMap loadOrCreateSingle(final @NonNull Path file) throws IOException {
|
||||||
final Locale locale = this.localeExtractor.apply(file);
|
final Locale locale = this.localeExtractor.apply(file);
|
||||||
if (!Files.exists(file) ) {
|
if (!Files.exists(file)) {
|
||||||
Map<String, String> map = new LinkedHashMap<>();
|
Map<String, String> map = new LinkedHashMap<>();
|
||||||
patch(map, locale);
|
patch(map, locale);
|
||||||
save(file, map);
|
save(file, map);
|
||||||
|
@ -56,7 +56,8 @@ final class ClassLoaderCaptionProvider implements DefaultCaptionProvider {
|
|||||||
LOGGER.info("No resource for locale '{}' found in the plugin file." +
|
LOGGER.info("No resource for locale '{}' found in the plugin file." +
|
||||||
"Please ensure you have placed the latest version of the file messages_{}.json in the 'lang' folder." +
|
"Please ensure you have placed the latest version of the file messages_{}.json in the 'lang' folder." +
|
||||||
"You may be able to find completed translations at https://intellectualsites.crowdin.com/plotsquared",
|
"You may be able to find completed translations at https://intellectualsites.crowdin.com/plotsquared",
|
||||||
locale, locale);
|
locale, locale
|
||||||
|
);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
try (final BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) {
|
try (final BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) {
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
package com.plotsquared.core.configuration.file;
|
package com.plotsquared.core.configuration.file;
|
||||||
|
|
||||||
import com.plotsquared.core.configuration.serialization.ConfigurationSerialization;
|
import com.plotsquared.core.configuration.serialization.ConfigurationSerialization;
|
||||||
|
import org.yaml.snakeyaml.LoaderOptions;
|
||||||
import org.yaml.snakeyaml.constructor.SafeConstructor;
|
import org.yaml.snakeyaml.constructor.SafeConstructor;
|
||||||
import org.yaml.snakeyaml.error.YAMLException;
|
import org.yaml.snakeyaml.error.YAMLException;
|
||||||
import org.yaml.snakeyaml.nodes.Node;
|
import org.yaml.snakeyaml.nodes.Node;
|
||||||
@ -30,6 +31,7 @@ import java.util.Map;
|
|||||||
public class YamlConstructor extends SafeConstructor {
|
public class YamlConstructor extends SafeConstructor {
|
||||||
|
|
||||||
YamlConstructor() {
|
YamlConstructor() {
|
||||||
|
super(new LoaderOptions());
|
||||||
yamlConstructors.put(Tag.MAP, new ConstructCustomObject());
|
yamlConstructors.put(Tag.MAP, new ConstructCustomObject());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ package com.plotsquared.core.configuration.file;
|
|||||||
import com.plotsquared.core.configuration.ConfigurationSection;
|
import com.plotsquared.core.configuration.ConfigurationSection;
|
||||||
import com.plotsquared.core.configuration.serialization.ConfigurationSerializable;
|
import com.plotsquared.core.configuration.serialization.ConfigurationSerializable;
|
||||||
import com.plotsquared.core.configuration.serialization.ConfigurationSerialization;
|
import com.plotsquared.core.configuration.serialization.ConfigurationSerialization;
|
||||||
|
import org.yaml.snakeyaml.DumperOptions;
|
||||||
import org.yaml.snakeyaml.nodes.Node;
|
import org.yaml.snakeyaml.nodes.Node;
|
||||||
import org.yaml.snakeyaml.representer.Representer;
|
import org.yaml.snakeyaml.representer.Representer;
|
||||||
|
|
||||||
@ -30,6 +31,7 @@ import java.util.Map;
|
|||||||
class YamlRepresenter extends Representer {
|
class YamlRepresenter extends Representer {
|
||||||
|
|
||||||
YamlRepresenter() {
|
YamlRepresenter() {
|
||||||
|
super(new DumperOptions());
|
||||||
this.multiRepresenters.put(ConfigurationSection.class, new RepresentConfigurationSection());
|
this.multiRepresenters.put(ConfigurationSection.class, new RepresentConfigurationSection());
|
||||||
this.multiRepresenters
|
this.multiRepresenters
|
||||||
.put(ConfigurationSerializable.class, new RepresentConfigurationSerializable());
|
.put(ConfigurationSerializable.class, new RepresentConfigurationSerializable());
|
||||||
|
@ -29,6 +29,7 @@ import java.sql.Statement;
|
|||||||
* @author -_Husky_-
|
* @author -_Husky_-
|
||||||
* @author tips48
|
* @author tips48
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(forRemoval = true)
|
||||||
public abstract class Database {
|
public abstract class Database {
|
||||||
|
|
||||||
public abstract Connection forceConnection() throws SQLException, ClassNotFoundException;
|
public abstract Connection forceConnection() throws SQLException, ClassNotFoundException;
|
||||||
|
@ -33,6 +33,7 @@ import java.sql.Statement;
|
|||||||
* @author -_Husky_-
|
* @author -_Husky_-
|
||||||
* @author tips48
|
* @author tips48
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(forRemoval = true)
|
||||||
public class MySQL extends Database {
|
public class MySQL extends Database {
|
||||||
|
|
||||||
private final String user;
|
private final String user;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -33,6 +33,7 @@ import java.sql.Statement;
|
|||||||
/**
|
/**
|
||||||
* Connects to and uses a SQLite database.
|
* Connects to and uses a SQLite database.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(forRemoval = true)
|
||||||
public class SQLite extends Database {
|
public class SQLite extends Database {
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + SQLite.class.getSimpleName());
|
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + SQLite.class.getSimpleName());
|
||||||
|
@ -22,7 +22,7 @@ import com.sk89q.worldedit.entity.Entity;
|
|||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since TODO
|
* @since 6.11.1
|
||||||
*/
|
*/
|
||||||
public abstract class EntityEvent {
|
public abstract class EntityEvent {
|
||||||
|
|
||||||
@ -53,7 +53,8 @@ public abstract class EntityEvent {
|
|||||||
* @return the event class name
|
* @return the event class name
|
||||||
* @since 6.11.0
|
* @since 6.11.0
|
||||||
*/
|
*/
|
||||||
@NonNull public String getEventName() {
|
@NonNull
|
||||||
|
public String getEventName() {
|
||||||
if (this.name == null) {
|
if (this.name == null) {
|
||||||
this.name = this.getClass().getSimpleName();
|
this.name = this.getClass().getSimpleName();
|
||||||
}
|
}
|
||||||
|
@ -379,10 +379,11 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int yStart = classicPlotWorld.getMinBuildHeight() + (classicPlotWorld.PLOT_BEDROCK ? 1 : 0);
|
||||||
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++) {
|
||||||
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
for (int y = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||||
queue.setBlock(x, y, z, blocks);
|
queue.setBlock(x, y, z, blocks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -390,7 +391,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
if (!plot.isMerged(Direction.WEST)) {
|
if (!plot.isMerged(Direction.WEST)) {
|
||||||
int x = bot.getX();
|
int x = bot.getX();
|
||||||
for (int z = bot.getZ(); z < top.getZ(); z++) {
|
for (int z = bot.getZ(); z < top.getZ(); z++) {
|
||||||
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
for (int y = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||||
queue.setBlock(x, y, z, blocks);
|
queue.setBlock(x, y, z, blocks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -398,7 +399,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
if (!plot.isMerged(Direction.SOUTH)) {
|
if (!plot.isMerged(Direction.SOUTH)) {
|
||||||
int z = top.getZ();
|
int z = top.getZ();
|
||||||
for (int x = bot.getX(); x < top.getX() + (plot.isMerged(Direction.EAST) ? 0 : 1); x++) {
|
for (int x = bot.getX(); x < top.getX() + (plot.isMerged(Direction.EAST) ? 0 : 1); x++) {
|
||||||
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
for (int y = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||||
queue.setBlock(x, y, z, blocks);
|
queue.setBlock(x, y, z, blocks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -406,7 +407,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
if (!plot.isMerged(Direction.EAST)) {
|
if (!plot.isMerged(Direction.EAST)) {
|
||||||
int x = top.getX();
|
int x = top.getX();
|
||||||
for (int z = bot.getZ(); z < top.getZ() + (plot.isMerged(Direction.SOUTH) ? 0 : 1); z++) {
|
for (int z = bot.getZ(); z < top.getZ() + (plot.isMerged(Direction.SOUTH) ? 0 : 1); z++) {
|
||||||
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
for (int y = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||||
queue.setBlock(x, y, z, blocks);
|
queue.setBlock(x, y, z, blocks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,7 @@ import javax.annotation.Nullable;
|
|||||||
|
|
||||||
@SuppressWarnings("WeakerAccess")
|
@SuppressWarnings("WeakerAccess")
|
||||||
public abstract class ClassicPlotWorld extends SquarePlotWorld {
|
public abstract class ClassicPlotWorld extends SquarePlotWorld {
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ClassicPlotWorld.class.getSimpleName());
|
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ClassicPlotWorld.class.getSimpleName());
|
||||||
|
|
||||||
public int ROAD_HEIGHT = 62;
|
public int ROAD_HEIGHT = 62;
|
||||||
@ -64,6 +65,21 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
|
|||||||
super(worldName, id, generator, min, max, worldConfiguration, blockQueue);
|
super(worldName, id, generator, min, max, worldConfiguration, blockQueue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static BlockBucket createCheckedBlockBucket(String input, BlockBucket def) {
|
||||||
|
final BlockBucket bucket = new BlockBucket(input);
|
||||||
|
Pattern pattern = null;
|
||||||
|
try {
|
||||||
|
pattern = bucket.toPattern();
|
||||||
|
} catch (Exception ignore) {
|
||||||
|
}
|
||||||
|
if (pattern == null) {
|
||||||
|
LOGGER.error("Failed to parse pattern '{}', check your worlds.yml", input);
|
||||||
|
LOGGER.error("Falling back to {}", def);
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
return bucket;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CONFIG NODE | DEFAULT VALUE | DESCRIPTION | CONFIGURATION TYPE | REQUIRED FOR INITIAL SETUP.
|
* CONFIG NODE | DEFAULT VALUE | DESCRIPTION | CONFIGURATION TYPE | REQUIRED FOR INITIAL SETUP.
|
||||||
*
|
*
|
||||||
@ -144,19 +160,4 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
|
|||||||
return Math.min(WALL_HEIGHT, plotRoadMin);
|
return Math.min(WALL_HEIGHT, plotRoadMin);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static BlockBucket createCheckedBlockBucket(String input, BlockBucket def) {
|
|
||||||
final BlockBucket bucket = new BlockBucket(input);
|
|
||||||
Pattern pattern = null;
|
|
||||||
try {
|
|
||||||
pattern = bucket.toPattern();
|
|
||||||
} catch (Exception ignore) {
|
|
||||||
}
|
|
||||||
if (pattern == null) {
|
|
||||||
LOGGER.error("Failed to parse pattern '{}', check your worlds.yml", input);
|
|
||||||
LOGGER.error("Falling back to {}", def);
|
|
||||||
return def;
|
|
||||||
}
|
|
||||||
return bucket;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -69,8 +69,8 @@ public class HybridGen extends IndependentPlotGenerator {
|
|||||||
EnumSet<SchematicFeature> features
|
EnumSet<SchematicFeature> features
|
||||||
) {
|
) {
|
||||||
int minY; // Math.min(world.PLOT_HEIGHT, world.ROAD_HEIGHT);
|
int minY; // Math.min(world.PLOT_HEIGHT, world.ROAD_HEIGHT);
|
||||||
if ((features.contains(SchematicFeature.ROAD) && Settings.Schematics.PASTE_ROAD_ON_TOP)
|
boolean isRoad = features.contains(SchematicFeature.ROAD);
|
||||||
|| (!features.contains(SchematicFeature.ROAD) && Settings.Schematics.PASTE_ON_TOP)) {
|
if ((isRoad && Settings.Schematics.PASTE_ROAD_ON_TOP) || (!isRoad && Settings.Schematics.PASTE_ON_TOP)) {
|
||||||
minY = world.SCHEM_Y;
|
minY = world.SCHEM_Y;
|
||||||
} else {
|
} else {
|
||||||
minY = world.getMinBuildHeight();
|
minY = world.getMinBuildHeight();
|
||||||
@ -341,7 +341,10 @@ public class HybridGen extends IndependentPlotGenerator {
|
|||||||
for (Entity entity : hybridPlotWorld.getPlotSchematicEntities()) {
|
for (Entity entity : hybridPlotWorld.getPlotSchematicEntities()) {
|
||||||
if (region.contains(entity.getLocation().toVector().toBlockPoint())) {
|
if (region.contains(entity.getLocation().toVector().toBlockPoint())) {
|
||||||
Vector3 pos = (entity.getLocation().toVector()
|
Vector3 pos = (entity.getLocation().toVector()
|
||||||
.subtract(region.getMinimumPoint().withY(hybridPlotWorld.getPlotSchematicMinPoint().getY()).toVector3()))
|
.subtract(region
|
||||||
|
.getMinimumPoint()
|
||||||
|
.withY(hybridPlotWorld.getPlotSchematicMinPoint().getY())
|
||||||
|
.toVector3()))
|
||||||
.add(min.getBlockVector3().withY(hybridPlotWorld.SCHEM_Y).toVector3());
|
.add(min.getBlockVector3().withY(hybridPlotWorld.SCHEM_Y).toVector3());
|
||||||
result.setEntity(new PopulatingEntity(
|
result.setEntity(new PopulatingEntity(
|
||||||
entity,
|
entity,
|
||||||
@ -399,6 +402,12 @@ public class HybridGen extends IndependentPlotGenerator {
|
|||||||
return biome == null ? hybridPlotWorld.getPlotBiome() : biome;
|
return biome == null ? hybridPlotWorld.getPlotBiome() : biome;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private enum SchematicFeature {
|
||||||
|
BIOMES,
|
||||||
|
ROAD,
|
||||||
|
POPULATING
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper to allow a WorldEdit {@link Entity} to effectively have a mutable location as the location in its NBT should be changed
|
* Wrapper to allow a WorldEdit {@link Entity} to effectively have a mutable location as the location in its NBT should be changed
|
||||||
* when set to the world.
|
* when set to the world.
|
||||||
@ -453,10 +462,4 @@ public class HybridGen extends IndependentPlotGenerator {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum SchematicFeature {
|
|
||||||
BIOMES,
|
|
||||||
ROAD,
|
|
||||||
POPULATING
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -141,7 +141,11 @@ public class HybridPlotManager extends ClassicPlotManager {
|
|||||||
(pos1.getX() + pos2.getX()) / 2,
|
(pos1.getX() + pos2.getX()) / 2,
|
||||||
(pos1.getZ() + pos2.getZ()) / 2
|
(pos1.getZ() + pos2.getZ()) / 2
|
||||||
), biome)) {
|
), biome)) {
|
||||||
WorldUtil.setBiome(hybridPlotWorld.getWorldName(), new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3()), biome);
|
WorldUtil.setBiome(
|
||||||
|
hybridPlotWorld.getWorldName(),
|
||||||
|
new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3()),
|
||||||
|
biome
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,6 +162,7 @@ public class HybridPlotManager extends ClassicPlotManager {
|
|||||||
} else {
|
} else {
|
||||||
minY = hybridPlotWorld.getMinBuildHeight();
|
minY = hybridPlotWorld.getMinBuildHeight();
|
||||||
}
|
}
|
||||||
|
int schemYDiff = (isRoad ? hybridPlotWorld.getRoadYStart() : hybridPlotWorld.getPlotYStart()) - minY;
|
||||||
BaseBlock airBlock = BlockTypes.AIR.getDefaultState().toBaseBlock();
|
BaseBlock airBlock = BlockTypes.AIR.getDefaultState().toBaseBlock();
|
||||||
for (int x = pos1.getX(); x <= pos2.getX(); x++) {
|
for (int x = pos1.getX(); x <= pos2.getX(); x++) {
|
||||||
short absX = (short) ((x - hybridPlotWorld.ROAD_OFFSET_X) % size);
|
short absX = (short) ((x - hybridPlotWorld.ROAD_OFFSET_X) % size);
|
||||||
@ -174,10 +179,14 @@ public class HybridPlotManager extends ClassicPlotManager {
|
|||||||
for (int y = 0; y < blocks.length; y++) {
|
for (int y = 0; y < blocks.length; y++) {
|
||||||
if (blocks[y] != null) {
|
if (blocks[y] != null) {
|
||||||
queue.setBlock(x, minY + y, z, blocks[y]);
|
queue.setBlock(x, minY + y, z, blocks[y]);
|
||||||
} else if (!isRoad) {
|
} else if (y > schemYDiff) {
|
||||||
// This is necessary, otherwise any blocks not specified in the schematic will remain after a clear
|
// This is necessary, otherwise any blocks not specified in the schematic will remain after a clear.
|
||||||
// Do not set air for road as this may cause cavernous roads when debugroadregen is used
|
// This should only be done where the schematic has actually "started"
|
||||||
queue.setBlock(x, minY + y, z, airBlock);
|
queue.setBlock(x, minY + y, z, airBlock);
|
||||||
|
} else if (isRoad) {
|
||||||
|
queue.setBlock(x, minY + y, z, hybridPlotWorld.ROAD_BLOCK.toPattern());
|
||||||
|
} else {
|
||||||
|
queue.setBlock(x, minY + y, z, hybridPlotWorld.MAIN_BLOCK.toPattern());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -203,8 +212,18 @@ public class HybridPlotManager extends ClassicPlotManager {
|
|||||||
PlotId id2 = PlotId.of(id.getX(), id.getY() + 1);
|
PlotId id2 = PlotId.of(id.getX(), id.getY() + 1);
|
||||||
Location bot = getPlotBottomLocAbs(id2);
|
Location bot = getPlotBottomLocAbs(id2);
|
||||||
Location top = getPlotTopLocAbs(id);
|
Location top = getPlotTopLocAbs(id);
|
||||||
Location pos1 = Location.at(hybridPlotWorld.getWorldName(), bot.getX() - 1, hybridPlotWorld.getMinGenHeight(), top.getZ() + 1);
|
Location pos1 = Location.at(
|
||||||
Location pos2 = Location.at(hybridPlotWorld.getWorldName(), top.getX() + 1, hybridPlotWorld.getMaxGenHeight(), bot.getZ());
|
hybridPlotWorld.getWorldName(),
|
||||||
|
bot.getX() - 1,
|
||||||
|
hybridPlotWorld.getMinGenHeight(),
|
||||||
|
top.getZ() + 1
|
||||||
|
);
|
||||||
|
Location pos2 = Location.at(
|
||||||
|
hybridPlotWorld.getWorldName(),
|
||||||
|
top.getX() + 1,
|
||||||
|
hybridPlotWorld.getMaxGenHeight(),
|
||||||
|
bot.getZ()
|
||||||
|
);
|
||||||
this.resetBiome(hybridPlotWorld, pos1, pos2);
|
this.resetBiome(hybridPlotWorld, pos1, pos2);
|
||||||
if (!hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) {
|
if (!hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) {
|
||||||
return true;
|
return true;
|
||||||
@ -274,6 +293,13 @@ public class HybridPlotManager extends ClassicPlotManager {
|
|||||||
queue.setCompleteTask(whenDone);
|
queue.setCompleteTask(whenDone);
|
||||||
}
|
}
|
||||||
if (!canRegen) {
|
if (!canRegen) {
|
||||||
|
if (hybridPlotWorld.getMinBuildHeight() < hybridPlotWorld.getMinGenHeight()) {
|
||||||
|
queue.setCuboid(
|
||||||
|
pos1.withY(hybridPlotWorld.getMinBuildHeight()),
|
||||||
|
pos2.withY(hybridPlotWorld.getMinGenHeight()),
|
||||||
|
BlockTypes.AIR.getDefaultState()
|
||||||
|
);
|
||||||
|
}
|
||||||
queue.setCuboid(
|
queue.setCuboid(
|
||||||
pos1.withY(hybridPlotWorld.getMinGenHeight()),
|
pos1.withY(hybridPlotWorld.getMinGenHeight()),
|
||||||
pos2.withY(hybridPlotWorld.getMinGenHeight()),
|
pos2.withY(hybridPlotWorld.getMinGenHeight()),
|
||||||
@ -291,6 +317,13 @@ public class HybridPlotManager extends ClassicPlotManager {
|
|||||||
pos2.withY(hybridPlotWorld.getMaxGenHeight()),
|
pos2.withY(hybridPlotWorld.getMaxGenHeight()),
|
||||||
BlockTypes.AIR.getDefaultState()
|
BlockTypes.AIR.getDefaultState()
|
||||||
);
|
);
|
||||||
|
if (hybridPlotWorld.getMaxGenHeight() < hybridPlotWorld.getMaxBuildHeight() - 1) {
|
||||||
|
queue.setCuboid(
|
||||||
|
pos1.withY(hybridPlotWorld.getMaxGenHeight()),
|
||||||
|
pos2.withY(hybridPlotWorld.getMaxBuildHeight() - 1),
|
||||||
|
BlockTypes.AIR.getDefaultState()
|
||||||
|
);
|
||||||
|
}
|
||||||
queue.setBiomeCuboid(pos1, pos2, biome);
|
queue.setBiomeCuboid(pos1, pos2, biome);
|
||||||
} else {
|
} else {
|
||||||
queue.setRegenRegion(new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3()));
|
queue.setRegenRegion(new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3()));
|
||||||
|
@ -76,6 +76,9 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
* The Y level at which schematic generation will start, lowest of either road or plot schematic generation.
|
* The Y level at which schematic generation will start, lowest of either road or plot schematic generation.
|
||||||
*/
|
*/
|
||||||
public int SCHEM_Y;
|
public int SCHEM_Y;
|
||||||
|
|
||||||
|
private int plotY;
|
||||||
|
private int roadY;
|
||||||
private Location SIGN_LOCATION;
|
private Location SIGN_LOCATION;
|
||||||
private File root = null;
|
private File root = null;
|
||||||
private int lastOverlayHeightError = Integer.MIN_VALUE;
|
private int lastOverlayHeightError = Integer.MIN_VALUE;
|
||||||
@ -186,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);
|
||||||
@ -252,68 +255,60 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
|
|
||||||
SCHEM_Y = schematicStartHeight();
|
SCHEM_Y = schematicStartHeight();
|
||||||
|
|
||||||
// plotY and roadY are important to allow plot and/or road schematic "overflow" into each other without causing AIOOB
|
// plotY and roadY are important to allow plot and/or road schematic "overflow" into each other
|
||||||
// exceptions when attempting either to set blocks to, or get block from G_SCH
|
// without causing AIOOB exceptions when attempting either to set blocks to, or get block from G_SCH
|
||||||
// Default plot schematic start height, normalized to the minimum height schematics are pasted from.
|
// Default plot schematic start height, normalized to the minimum height schematics are pasted from.
|
||||||
int plotY = PLOT_HEIGHT - SCHEM_Y;
|
plotY = PLOT_HEIGHT - SCHEM_Y;
|
||||||
int minRoadWall = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ? Math.min(ROAD_HEIGHT, WALL_HEIGHT) : ROAD_HEIGHT;
|
int minRoadWall = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ? Math.min(ROAD_HEIGHT, WALL_HEIGHT) : ROAD_HEIGHT;
|
||||||
// Default road schematic start height, normalized to the minimum height schematics are pasted from.
|
// Default road schematic start height, normalized to the minimum height schematics are pasted from.
|
||||||
int roadY = minRoadWall - SCHEM_Y;
|
roadY = minRoadWall - SCHEM_Y;
|
||||||
|
|
||||||
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
|
||||||
if (schematic3 != null) {
|
if (schematic3 != null) {
|
||||||
plotSchemHeight = maxSchematicHeight = schematic3.getClipboard().getDimensions().getY();
|
plotSchemHeight = schematic3.getClipboard().getDimensions().getY();
|
||||||
if (maxSchematicHeight == worldGenHeight) {
|
if (plotSchemHeight == worldGenHeight) {
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
@ -323,7 +318,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
short w3 = (short) d3.getX();
|
short w3 = (short) d3.getX();
|
||||||
short l3 = (short) d3.getZ();
|
short l3 = (short) d3.getZ();
|
||||||
short h3 = (short) d3.getY();
|
short h3 = (short) d3.getY();
|
||||||
if (w3 > PLOT_WIDTH || h3 > PLOT_WIDTH) {
|
if (w3 > PLOT_WIDTH || l3 > PLOT_WIDTH) {
|
||||||
this.ROAD_SCHEMATIC_ENABLED = true;
|
this.ROAD_SCHEMATIC_ENABLED = true;
|
||||||
}
|
}
|
||||||
int centerShiftZ;
|
int centerShiftZ;
|
||||||
@ -378,7 +373,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
}
|
}
|
||||||
if ((schematic1 == null && schematic2 == null) || this.ROAD_WIDTH == 0) {
|
if ((schematic1 == null && schematic2 == null) || this.ROAD_WIDTH == 0) {
|
||||||
if (Settings.DEBUG) {
|
if (Settings.DEBUG) {
|
||||||
LOGGER.info("- schematic: false");
|
LOGGER.info("- road schematic: false");
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -544,14 +539,6 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
return schem1PopulationNeeded || schem2PopulationNeeded || schem3PopulationNeeded;
|
return schem1PopulationNeeded || schem2PopulationNeeded || schem3PopulationNeeded;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated in favour of {@link HybridPlotWorld#getSchematicRoot()}
|
|
||||||
*/
|
|
||||||
@Deprecated(forRemoval = true, since = "6.9.0")
|
|
||||||
public File getRoot() {
|
|
||||||
return this.root;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the root folder for this world's generation schematics. May be null if schematics not initialised via
|
* Get the root folder for this world's generation schematics. May be null if schematics not initialised via
|
||||||
* {@link HybridPlotWorld#setupSchematics()}
|
* {@link HybridPlotWorld#setupSchematics()}
|
||||||
@ -562,4 +549,24 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
return this.root;
|
return this.root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the y value where the plot schematic should be pasted from.
|
||||||
|
*
|
||||||
|
* @return plot schematic y start value
|
||||||
|
* @since 7.0.0
|
||||||
|
*/
|
||||||
|
public int getPlotYStart() {
|
||||||
|
return SCHEM_Y + plotY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the y value where the road schematic should be pasted from.
|
||||||
|
*
|
||||||
|
* @return road schematic y start value
|
||||||
|
* @since 7.0.0
|
||||||
|
*/
|
||||||
|
public int getRoadYStart() {
|
||||||
|
return SCHEM_Y + roadY;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,6 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
@ -78,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;
|
||||||
@ -380,22 +383,6 @@ public class HybridUtils {
|
|||||||
run.run();
|
run.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int checkModified(QueueCoordinator queue, int x1, int x2, int y1, int y2, int z1, int z2, BlockState[] blocks) {
|
|
||||||
int count = 0;
|
|
||||||
for (int y = y1; y <= y2; y++) {
|
|
||||||
for (int x = x1; x <= x2; x++) {
|
|
||||||
for (int z = z1; z <= z2; z++) {
|
|
||||||
BlockState block = queue.getBlock(x, y, z);
|
|
||||||
boolean same = Arrays.stream(blocks).anyMatch(p -> this.worldUtil.isBlockSame(block, p));
|
|
||||||
if (!same) {
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final ArrayList<BlockVector2> getChunks(BlockVector2 region) {
|
public final ArrayList<BlockVector2> getChunks(BlockVector2 region) {
|
||||||
ArrayList<BlockVector2> chunks = new ArrayList<>();
|
ArrayList<BlockVector2> chunks = new ArrayList<>();
|
||||||
int sx = region.getX() << 5;
|
int sx = region.getX() << 5;
|
||||||
@ -546,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);
|
||||||
@ -685,7 +672,7 @@ public class HybridUtils {
|
|||||||
}
|
}
|
||||||
if (condition) {
|
if (condition) {
|
||||||
BaseBlock[] blocks = plotWorld.G_SCH.get(MathMan.pair(absX, absZ));
|
BaseBlock[] blocks = plotWorld.G_SCH.get(MathMan.pair(absX, absZ));
|
||||||
int minY = Settings.Schematics.PASTE_ROAD_ON_TOP ? plotWorld.SCHEM_Y : area.getMinGenHeight() + 1;
|
int minY = plotWorld.getRoadYStart();
|
||||||
int maxDy = Math.max(extend, blocks.length);
|
int maxDy = Math.max(extend, blocks.length);
|
||||||
for (int dy = 0; dy < maxDy; dy++) {
|
for (int dy = 0; dy < maxDy; dy++) {
|
||||||
if (dy > blocks.length - 1) {
|
if (dy > blocks.length - 1) {
|
||||||
|
@ -46,7 +46,7 @@ public abstract class IndependentPlotGenerator {
|
|||||||
* @param result Queue to write to
|
* @param result Queue to write to
|
||||||
* @param settings PlotArea (settings)
|
* @param settings PlotArea (settings)
|
||||||
* @param biomes If biomes should be generated
|
* @param biomes If biomes should be generated
|
||||||
* @since TODO
|
* @since 7.0.0
|
||||||
*/
|
*/
|
||||||
public abstract void generateChunk(ZeroedDelegateScopedQueueCoordinator result, PlotArea settings, boolean biomes);
|
public abstract void generateChunk(ZeroedDelegateScopedQueueCoordinator result, PlotArea settings, boolean biomes);
|
||||||
|
|
||||||
@ -55,9 +55,10 @@ public abstract class IndependentPlotGenerator {
|
|||||||
*
|
*
|
||||||
* @param result Queue to write to
|
* @param result Queue to write to
|
||||||
* @param setting PlotArea (settings)
|
* @param setting PlotArea (settings)
|
||||||
* @since TODO
|
* @since 7.0.0
|
||||||
*/
|
*/
|
||||||
public void populateChunk(ZeroedDelegateScopedQueueCoordinator result, PlotArea setting) {}
|
public void populateChunk(ZeroedDelegateScopedQueueCoordinator result, PlotArea setting) {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a new PlotArea object.
|
* Return a new PlotArea object.
|
||||||
@ -103,11 +104,11 @@ public abstract class IndependentPlotGenerator {
|
|||||||
* Get the biome to be generated at a specific point
|
* Get the biome to be generated at a specific point
|
||||||
*
|
*
|
||||||
* @param settings PlotArea settings to provide biome
|
* @param settings PlotArea settings to provide biome
|
||||||
* @param x World x position
|
* @param x World x position
|
||||||
* @param y World y position
|
* @param y World y position
|
||||||
* @param z World z position
|
* @param z World z position
|
||||||
* @return Biome type to be generated
|
* @return Biome type to be generated
|
||||||
* @since TODO
|
* @since 7.0.0
|
||||||
*/
|
*/
|
||||||
public abstract BiomeType getBiome(PlotArea settings, int x, int y, int z);
|
public abstract BiomeType getBiome(PlotArea settings, int x, int y, int z);
|
||||||
|
|
||||||
|
@ -185,30 +185,38 @@ public abstract class SquarePlotManager extends GridPlotManager {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
switch (hash) {
|
switch (hash) {
|
||||||
case 8:
|
case 8 -> {
|
||||||
// north
|
// north
|
||||||
return plot.isMerged(Direction.NORTH) ? id : null;
|
return plot.isMerged(Direction.NORTH) ? id : null;
|
||||||
case 4:
|
}
|
||||||
|
case 4 -> {
|
||||||
// east
|
// east
|
||||||
return plot.isMerged(Direction.EAST) ? id : null;
|
return plot.isMerged(Direction.EAST) ? id : null;
|
||||||
case 2:
|
}
|
||||||
|
case 2 -> {
|
||||||
// south
|
// south
|
||||||
return plot.isMerged(Direction.SOUTH) ? id : null;
|
return plot.isMerged(Direction.SOUTH) ? id : null;
|
||||||
case 1:
|
}
|
||||||
|
case 1 -> {
|
||||||
// west
|
// west
|
||||||
return plot.isMerged(Direction.WEST) ? id : null;
|
return plot.isMerged(Direction.WEST) ? id : null;
|
||||||
case 12:
|
}
|
||||||
|
case 12 -> {
|
||||||
// northeast
|
// northeast
|
||||||
return plot.isMerged(Direction.NORTHEAST) ? id : null;
|
return plot.isMerged(Direction.NORTHEAST) ? id : null;
|
||||||
case 6:
|
}
|
||||||
|
case 6 -> {
|
||||||
// southeast
|
// southeast
|
||||||
return plot.isMerged(Direction.SOUTHEAST) ? id : null;
|
return plot.isMerged(Direction.SOUTHEAST) ? id : null;
|
||||||
case 3:
|
}
|
||||||
|
case 3 -> {
|
||||||
// southwest
|
// southwest
|
||||||
return plot.isMerged(Direction.SOUTHWEST) ? id : null;
|
return plot.isMerged(Direction.SOUTHWEST) ? id : null;
|
||||||
case 9:
|
}
|
||||||
|
case 9 -> {
|
||||||
// northwest
|
// northwest
|
||||||
return plot.isMerged(Direction.NORTHWEST) ? id : null;
|
return plot.isMerged(Direction.NORTHWEST) ? id : null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception ignored) {
|
} catch (Exception ignored) {
|
||||||
LOGGER.error("Invalid plot / road width in settings.yml for world: {}", squarePlotWorld.getWorldName());
|
LOGGER.error("Invalid plot / road width in settings.yml for world: {}", squarePlotWorld.getWorldName());
|
||||||
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.plotsquared.core.inject.annotations;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.PARAMETER})
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface PlotDatabase {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,72 @@
|
|||||||
|
package com.plotsquared.core.inject.modules;
|
||||||
|
|
||||||
|
import com.google.inject.AbstractModule;
|
||||||
|
import com.plotsquared.core.PlotSquared;
|
||||||
|
import com.plotsquared.core.configuration.Storage;
|
||||||
|
import com.plotsquared.core.inject.annotations.PlotDatabase;
|
||||||
|
import com.plotsquared.core.util.FileUtils;
|
||||||
|
import com.plotsquared.core.util.StringMan;
|
||||||
|
import com.zaxxer.hikari.HikariConfig;
|
||||||
|
import com.zaxxer.hikari.HikariDataSource;
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
public class DatabaseModule extends AbstractModule {
|
||||||
|
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + PlotSquared.class.getSimpleName());
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
try {
|
||||||
|
if (Storage.MySQL.USE) {
|
||||||
|
this.configureMySQL();
|
||||||
|
} else if (Storage.SQLite.USE) {
|
||||||
|
this.configureSQLite();
|
||||||
|
} else {
|
||||||
|
LOGGER.error("No storage type is set. Disabling PlotSquared");
|
||||||
|
PlotSquared.platform().shutdown();
|
||||||
|
}
|
||||||
|
} catch (final Exception e) {
|
||||||
|
LOGGER.error("Unable to initialize database", e);
|
||||||
|
PlotSquared.platform().shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void configureSQLite() throws Exception {
|
||||||
|
final File file = FileUtils.getFile(PlotSquared.platform().getDirectory(), Storage.SQLite.DB + ".db");
|
||||||
|
if (!file.exists()) {
|
||||||
|
file.createNewFile();
|
||||||
|
}
|
||||||
|
Class.forName("org.sqlite.JDBC");
|
||||||
|
|
||||||
|
final HikariConfig config = new HikariConfig();
|
||||||
|
config.setJdbcUrl("jdbc:sqlite:" + file);
|
||||||
|
config.setDriverClassName("org.sqlite.JDBC");
|
||||||
|
final DataSource dataSource = new HikariDataSource();
|
||||||
|
|
||||||
|
binder().bind(DataSource.class).annotatedWith(PlotDatabase.class).toInstance(dataSource);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void configureMySQL() {
|
||||||
|
final HikariConfig hikariConfig = new HikariConfig();
|
||||||
|
hikariConfig.setJdbcUrl(
|
||||||
|
String.format(
|
||||||
|
"jdbc:mysql://%s:%s/%s?%s",
|
||||||
|
Storage.MySQL.HOST,
|
||||||
|
Storage.MySQL.PORT,
|
||||||
|
Storage.MySQL.DATABASE,
|
||||||
|
StringMan.join(Storage.MySQL.PROPERTIES, "&")
|
||||||
|
));
|
||||||
|
hikariConfig.setUsername(Storage.MySQL.USER);
|
||||||
|
hikariConfig.setPassword(Storage.MySQL.PASSWORD);
|
||||||
|
hikariConfig.addDataSourceProperty("cachePrepStmts", "true");
|
||||||
|
hikariConfig.addDataSourceProperty("prepStmtCacheSize", "512");
|
||||||
|
hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
|
||||||
|
final DataSource dataSource = new HikariDataSource(hikariConfig);
|
||||||
|
|
||||||
|
binder().bind(DataSource.class).annotatedWith(PlotDatabase.class).toInstance(dataSource);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package com.plotsquared.core.inject.modules;
|
||||||
|
|
||||||
|
import com.plotsquared.core.inject.annotations.PlotDatabase;
|
||||||
|
import org.jdbi.v3.guice.AbstractJdbiDefinitionModule;
|
||||||
|
|
||||||
|
public class JdbiModule extends AbstractJdbiDefinitionModule {
|
||||||
|
|
||||||
|
public JdbiModule() {
|
||||||
|
super(PlotDatabase.class);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void configureJdbi() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -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 {
|
||||||
|
|
||||||
@ -142,7 +141,9 @@ public class PlotListener {
|
|||||||
Map.Entry<UUID, List<StatusEffect>> entry = iterator.next();
|
Map.Entry<UUID, List<StatusEffect>> entry = iterator.next();
|
||||||
List<StatusEffect> effects = entry.getValue();
|
List<StatusEffect> effects = entry.getValue();
|
||||||
effects.removeIf(effect -> currentTime > effect.expiresAt);
|
effects.removeIf(effect -> currentTime > effect.expiresAt);
|
||||||
if (effects.isEmpty()) iterator.remove();
|
if (effects.isEmpty()) {
|
||||||
|
iterator.remove();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, TaskTime.seconds(1L));
|
}, TaskTime.seconds(1L));
|
||||||
@ -319,22 +320,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));
|
||||||
}
|
}
|
||||||
@ -486,8 +492,9 @@ public class PlotListener {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Marks an effect as a status effect that will be removed on leaving a plot
|
* Marks an effect as a status effect that will be removed on leaving a plot
|
||||||
* @param uuid The uuid of the player the effect belongs to
|
*
|
||||||
* @param name The name of the status effect
|
* @param uuid The uuid of the player the effect belongs to
|
||||||
|
* @param name The name of the status effect
|
||||||
* @param expiresAt The time when the effect expires
|
* @param expiresAt The time when the effect expires
|
||||||
* @since 6.10.0
|
* @since 6.10.0
|
||||||
*/
|
*/
|
||||||
@ -518,10 +525,10 @@ public class PlotListener {
|
|||||||
private record StatusEffect(@NonNull String name, long expiresAt) {
|
private record StatusEffect(@NonNull String name, long expiresAt) {
|
||||||
|
|
||||||
private StatusEffect(@NonNull String name, long expiresAt) {
|
private StatusEffect(@NonNull String name, long expiresAt) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.expiresAt = expiresAt;
|
this.expiresAt = expiresAt;
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,6 @@ public final class UncheckedWorldLocation extends Location {
|
|||||||
* @param y Y coordinate
|
* @param y Y coordinate
|
||||||
* @param z Z coordinate
|
* @param z Z coordinate
|
||||||
* @return New location
|
* @return New location
|
||||||
*
|
|
||||||
* @since 6.9.0
|
* @since 6.9.0
|
||||||
*/
|
*/
|
||||||
@DoNotUse
|
@DoNotUse
|
||||||
@ -61,6 +60,19 @@ public final class UncheckedWorldLocation extends Location {
|
|||||||
return new UncheckedWorldLocation(world, x, y, z);
|
return new UncheckedWorldLocation(world, x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a new location with yaw and pitch equal to 0
|
||||||
|
*
|
||||||
|
* @param world World
|
||||||
|
* @param loc Coordinates
|
||||||
|
* @return New location
|
||||||
|
* @since 7.0.0
|
||||||
|
*/
|
||||||
|
@DoNotUse
|
||||||
|
public static @NonNull UncheckedWorldLocation at(final @NonNull String world, BlockVector3 loc) {
|
||||||
|
return new UncheckedWorldLocation(world, loc.getX(), loc.getY(), loc.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@DoNotUse
|
@DoNotUse
|
||||||
public @NonNull String getWorldName() {
|
public @NonNull String getWorldName() {
|
||||||
|
@ -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"),
|
||||||
@ -200,7 +201,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;
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user