mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2025-07-04 06:34:42 +02:00
Compare commits
2 Commits
fix/add-mi
...
recordiniz
Author | SHA1 | Date | |
---|---|---|---|
e06bf2cd6b | |||
0484915233 |
5
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
5
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -8,7 +8,7 @@ body:
|
|||||||
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.github.io/plotsquared-documentation/).
|
||||||
Do NOT use the public issue tracker to report security vulnerabilities! They are disclosed using [this](https://github.com/IntellectualSites/PlotSquared/security/policy) GitHub form!
|
Do NOT use the public issue tracker to report security vulnerabilities! They are disclosed using [this](https://forms.gle/btgdRn9yhGtzEiGW8) form!
|
||||||
|
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
attributes:
|
attributes:
|
||||||
@ -27,9 +27,6 @@ body:
|
|||||||
description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first.
|
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.1'
|
|
||||||
- '1.20'
|
|
||||||
- '1.19.4'
|
|
||||||
- '1.19.3'
|
- '1.19.3'
|
||||||
- '1.19.2'
|
- '1.19.2'
|
||||||
- '1.19.1'
|
- '1.19.1'
|
||||||
|
@ -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@0.3.2
|
uses: Ilshidur/action-discord@0c4b27844ba47cb1c7bee539c8eead5284ce9fa9 # ratchet:Ilshidur/action-discord@0.3.2
|
||||||
with:
|
with:
|
||||||
args: |
|
args: |
|
||||||
"<@&525015541815967744> <@&679322738552471574> <@&699293353862496266>"
|
"<@&525015541815967744> <@&679322738552471574> <@&699293353862496266>"
|
||||||
|
6
.github/workflows/build-pr.yml
vendored
6
.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@v3
|
||||||
- name: Validate Gradle Wrapper
|
- name: Validate Gradle Wrapper
|
||||||
uses: gradle/wrapper-validation-action@v1
|
uses: gradle/wrapper-validation-action@55e685c48d84285a5b0418cd094606e199cca3b6 # v1
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
|
21
.github/workflows/build.yml
vendored
21
.github/workflows/build.yml
vendored
@ -2,7 +2,7 @@ name: build
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- v7
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
if: github.repository_owner == 'IntellectualSites'
|
if: github.repository_owner == 'IntellectualSites'
|
||||||
@ -11,7 +11,7 @@ jobs:
|
|||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
- name: Validate Gradle Wrapper
|
- name: Validate Gradle Wrapper
|
||||||
uses: gradle/wrapper-validation-action@v1
|
uses: gradle/wrapper-validation-action@55e685c48d84285a5b0418cd094606e199cca3b6 # 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/main'}}
|
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v7'}}
|
||||||
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,14 +36,20 @@ 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/main' }}
|
if: ${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v7' }}
|
||||||
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
|
||||||
# if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
|
<<<<<<< HEAD
|
||||||
|
# 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:
|
||||||
@ -54,8 +60,9 @@ jobs:
|
|||||||
target-branch: main
|
target-branch: main
|
||||||
target-directory: v7/core
|
target-directory: v7/core
|
||||||
- name: Publish bukkit javadoc
|
- name: Publish bukkit javadoc
|
||||||
# if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
|
# if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v7'}}
|
||||||
uses: cpina/github-action-push-to-another-repository@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@0a14457bb28b04dfa1652e0ffdfda866d2845c73 # main
|
||||||
env:
|
env:
|
||||||
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
||||||
with:
|
with:
|
||||||
|
17
.github/workflows/codeql.yml
vendored
17
.github/workflows/codeql.yml
vendored
@ -1,10 +1,10 @@
|
|||||||
name: "CodeQL"
|
name: "CodeQL"
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ main ]
|
branches: [ v7 ]
|
||||||
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: [ main ]
|
branches: [ v7 ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
analyze:
|
analyze:
|
||||||
@ -17,20 +17,15 @@ 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@v3
|
||||||
- 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@v2
|
uses: github/codeql-action/init@32dc499307d133bb5085bae78498c0ac2cf762d5 # v2
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v2
|
uses: github/codeql-action/autobuild@32dc499307d133bb5085bae78498c0ac2cf762d5 # v2
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v2
|
uses: github/codeql-action/analyze@32dc499307d133bb5085bae78498c0ac2cf762d5 # 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:
|
||||||
- main
|
- v6
|
||||||
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 }}
|
||||||
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -137,7 +137,3 @@ docs/
|
|||||||
build/
|
build/
|
||||||
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
# Ignore run folders
|
|
||||||
run-[0-0].[0-9]/
|
|
||||||
run-[0-0].[0-9].[0-9]/
|
|
||||||
|
|
||||||
|
154
.idea/icon.svg
generated
154
.idea/icon.svg
generated
@ -1,144 +1,48 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<svg
|
<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">
|
||||||
version="1.1"
|
<metadata id="metadata8">
|
||||||
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
|
<cc:Work rdf:about="">
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
<defs
|
<defs id="defs6">
|
||||||
id="defs6">
|
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath18">
|
||||||
<clipPath
|
<path d="M 0,2500 H 3000 V 0 H 0 Z" id="path16" />
|
||||||
clipPathUnits="userSpaceOnUse"
|
|
||||||
id="clipPath18">
|
|
||||||
<path
|
|
||||||
d="M 0,2500 H 3000 V 0 H 0 Z"
|
|
||||||
id="path16" />
|
|
||||||
</clipPath>
|
</clipPath>
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview
|
<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" />
|
||||||
pagecolor="#ffffff"
|
<g id="g10" inkscape:groupmode="layer" inkscape:label="PlotSquared" transform="matrix(1.3333333,0,0,-1.3333333,0,3333.3333)">
|
||||||
bordercolor="#666666"
|
<g id="g12">
|
||||||
borderopacity="1"
|
<g id="g14" clip-path="url(#clipPath18)">
|
||||||
objecttolerance="10"
|
<g id="g20" transform="translate(1486.1511,2242.6453)">
|
||||||
gridtolerance="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" />
|
||||||
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
|
<g id="g24" transform="translate(1201.7948,1741.5303)">
|
||||||
id="g24"
|
<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" />
|
||||||
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
|
<g id="g28" transform="translate(919.3342,1429.7462)">
|
||||||
id="g28"
|
<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" />
|
||||||
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
|
<g id="g32" transform="translate(1649.134,1700.6166)">
|
||||||
id="g32"
|
<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" />
|
||||||
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
|
<g id="g36" transform="translate(1262.7214,1613.126)">
|
||||||
id="g36"
|
<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" />
|
||||||
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
|
<g id="g40" transform="translate(1966.3174,1675.6364)">
|
||||||
id="g40"
|
<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" />
|
||||||
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
|
<g id="g44" transform="translate(1499.3971,1669.1094)">
|
||||||
id="g44"
|
<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" />
|
||||||
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
|
<g id="g48" transform="translate(1748.0469,1601.6797)">
|
||||||
id="g48"
|
<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" />
|
||||||
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
|
<g id="g52" transform="translate(1262.7214,1613.126)">
|
||||||
id="g52"
|
<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" />
|
||||||
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: 12 KiB After Width: | Height: | Size: 11 KiB |
@ -18,7 +18,7 @@ repositories {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api(projects.plotsquaredCore)
|
api(projects.plotSquaredCore)
|
||||||
|
|
||||||
// Metrics
|
// Metrics
|
||||||
implementation("org.bstats:bstats-bukkit")
|
implementation("org.bstats:bstats-bukkit")
|
||||||
@ -62,7 +62,6 @@ tasks.processResources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
tasks.named<ShadowJar>("shadowJar") {
|
tasks.named<ShadowJar>("shadowJar") {
|
||||||
dependsOn(":plotsquared-core:shadowJar")
|
|
||||||
dependencies {
|
dependencies {
|
||||||
exclude(dependency("org.checkerframework:"))
|
exclude(dependency("org.checkerframework:"))
|
||||||
}
|
}
|
||||||
@ -103,7 +102,7 @@ tasks {
|
|||||||
opt.links("https://jd.papermc.io/paper/1.19/")
|
opt.links("https://jd.papermc.io/paper/1.19/")
|
||||||
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
|
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
|
||||||
opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/")
|
opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/")
|
||||||
opt.links("https://jd.advntr.dev/api/4.14.0/")
|
opt.links("https://jd.adventure.kyori.net/api/4.12.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,6 +49,7 @@ 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.task.BukkitTaskManager;
|
import com.plotsquared.bukkit.util.task.BukkitTaskManager;
|
||||||
import com.plotsquared.bukkit.util.task.PaperTimeConverter;
|
import com.plotsquared.bukkit.util.task.PaperTimeConverter;
|
||||||
@ -302,11 +303,9 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
|
|
||||||
this.serverLocale = Locale.forLanguageTag(Settings.Enabled_Components.DEFAULT_LOCALE);
|
this.serverLocale = Locale.forLanguageTag(Settings.Enabled_Components.DEFAULT_LOCALE);
|
||||||
|
|
||||||
/* TODO Enable update checker before v7 is released to GA
|
|
||||||
if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) {
|
if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) {
|
||||||
injector.getInstance(UpdateUtility.class).updateChecker();
|
injector.getInstance(UpdateUtility.class).updateChecker();
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
if (PremiumVerification.isPremium()) {
|
if (PremiumVerification.isPremium()) {
|
||||||
LOGGER.info("PlotSquared version licensed to Spigot user {}", getUserID());
|
LOGGER.info("PlotSquared version licensed to Spigot user {}", getUserID());
|
||||||
@ -367,7 +366,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);
|
||||||
}
|
}
|
||||||
@ -1186,17 +1185,9 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
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
|
msg.append("FastAsyncWorldEdit: ").append(Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit").getDescription().getVersion());
|
||||||
.getPluginManager()
|
|
||||||
.getPlugin("FastAsyncWorldEdit")
|
|
||||||
.getDescription()
|
|
||||||
.getVersion());
|
|
||||||
} else if (Bukkit.getPluginManager().getPlugin("AsyncWorldEdit") != null) {
|
} else if (Bukkit.getPluginManager().getPlugin("AsyncWorldEdit") != null) {
|
||||||
msg.append("AsyncWorldEdit: ").append(Bukkit
|
msg.append("AsyncWorldEdit: ").append(Bukkit.getPluginManager().getPlugin("AsyncWorldEdit").getDescription().getVersion()).append("\n");
|
||||||
.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());
|
||||||
|
@ -101,26 +101,50 @@ 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 "ARROW", "EGG", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "EXPERIENCE_ORB", "FALLING_BLOCK", "FIREBALL",
|
case "EGG":
|
||||||
"FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND", "MINECART_MOB_SPAWNER",
|
case "ENDER_CRYSTAL":
|
||||||
"MINECART_TNT", "PLAYER", "PRIMED_TNT", "SLIME", "SMALL_FIREBALL", "SNOWBALL", "MINECART_FURNACE", "SPLASH_POTION",
|
case "ENDER_PEARL":
|
||||||
"THROWN_EXP_BOTTLE", "WITHER_SKULL", "UNKNOWN", "SPECTRAL_ARROW", "SHULKER_BULLET", "DRAGON_FIREBALL", "AREA_EFFECT_CLOUD",
|
case "ENDER_SIGNAL":
|
||||||
"TRIDENT", "LLAMA_SPIT" -> {
|
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 "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());
|
||||||
@ -128,8 +152,7 @@ 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());
|
||||||
@ -142,17 +165,20 @@ 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", "MINECART_HOPPER" -> {
|
case "MINECART_CHEST":
|
||||||
|
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", "DONKEY", "LLAMA", "MULE", "SKELETON_HORSE" -> {
|
case "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();
|
||||||
@ -168,17 +194,16 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
storeLiving(horse);
|
storeLiving(horse);
|
||||||
storeInventory(horse);
|
storeInventory(horse);
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
// END INVENTORY HOLDER //
|
// END INVENTORY HOLDER //
|
||||||
case "WOLF", "OCELOT" -> {
|
case "WOLF":
|
||||||
|
case "OCELOT":
|
||||||
storeTameable((Tameable) entity);
|
storeTameable((Tameable) entity);
|
||||||
storeAgeable((Ageable) entity);
|
storeAgeable((Ageable) 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;
|
||||||
@ -189,20 +214,23 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
storeAgeable(sheep);
|
storeAgeable(sheep);
|
||||||
storeLiving(sheep);
|
storeLiving(sheep);
|
||||||
return;
|
return;
|
||||||
}
|
case "VILLAGER":
|
||||||
case "VILLAGER", "CHICKEN", "COW", "MUSHROOM_COW", "PIG", "TURTLE", "POLAR_BEAR" -> {
|
case "CHICKEN":
|
||||||
|
case "COW":
|
||||||
|
case "MUSHROOM_COW":
|
||||||
|
case "PIG":
|
||||||
|
case "TURTLE":
|
||||||
|
case "POLAR_BEAR":
|
||||||
storeAgeable((Ageable) entity);
|
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);
|
storeAgeable((Ageable) 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(),
|
||||||
@ -210,30 +238,37 @@ 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;
|
||||||
}
|
}
|
||||||
@ -247,38 +282,53 @@ 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 "SKELETON", "WITHER_SKELETON", "GUARDIAN", "ELDER_GUARDIAN", "GHAST", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN",
|
case "WITHER_SKELETON":
|
||||||
"ZOMBIFIED_PIGLIN", "PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH",
|
case "GUARDIAN":
|
||||||
"GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SHULKER", "SNOWMAN" -> {
|
case "ELDER_GUARDIAN":
|
||||||
|
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 //
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -415,15 +465,20 @@ 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 "PLAYER", "LEASH_HITCH" -> {
|
case "LEASH_HITCH":
|
||||||
return null;
|
return null;
|
||||||
}
|
case "ITEM_FRAME":
|
||||||
case "ITEM_FRAME" -> entity = world.spawn(location, ItemFrame.class);
|
entity = world.spawn(location, ItemFrame.class);
|
||||||
case "PAINTING" -> entity = world.spawn(location, Painting.class);
|
break;
|
||||||
default -> entity = world.spawnEntity(location, this.getType());
|
case "PAINTING":
|
||||||
|
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;
|
||||||
@ -451,46 +506,72 @@ 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 "ARROW", "EGG", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "DROPPED_ITEM", "EXPERIENCE_ORB", "FALLING_BLOCK",
|
case "EGG":
|
||||||
"FIREBALL", "FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND",
|
case "ENDER_CRYSTAL":
|
||||||
"MINECART_MOB_SPAWNER", "MINECART_TNT", "PLAYER", "PRIMED_TNT", "SMALL_FIREBALL", "SNOWBALL",
|
case "ENDER_PEARL":
|
||||||
"SPLASH_POTION", "THROWN_EXP_BOTTLE", "SPECTRAL_ARROW", "SHULKER_BULLET", "AREA_EFFECT_CLOUD",
|
case "ENDER_SIGNAL":
|
||||||
"DRAGON_FIREBALL", "WITHER_SKULL", "MINECART_FURNACE", "LLAMA_SPIT", "TRIDENT", "UNKNOWN" -> {
|
case "DROPPED_ITEM":
|
||||||
|
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", "MINECART_HOPPER" -> {
|
case "MINECART_CHEST":
|
||||||
|
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", "LLAMA", "SKELETON_HORSE", "DONKEY", "MULE" -> {
|
case "HORSE":
|
||||||
|
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) {
|
||||||
@ -505,16 +586,15 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
restoreLiving(horse);
|
restoreLiving(horse);
|
||||||
restoreInventory(horse);
|
restoreInventory(horse);
|
||||||
return entity;
|
return entity;
|
||||||
}
|
|
||||||
// END INVENTORY HOLDER //
|
// END INVENTORY HOLDER //
|
||||||
case "WOLF", "OCELOT" -> {
|
case "WOLF":
|
||||||
|
case "OCELOT":
|
||||||
restoreTameable((Tameable) entity);
|
restoreTameable((Tameable) entity);
|
||||||
restoreAgeable((Ageable) entity);
|
restoreAgeable((Ageable) 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);
|
||||||
@ -525,22 +605,25 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
restoreAgeable(sheep);
|
restoreAgeable(sheep);
|
||||||
restoreLiving(sheep);
|
restoreLiving(sheep);
|
||||||
return sheep;
|
return sheep;
|
||||||
}
|
case "VILLAGER":
|
||||||
case "VILLAGER", "CHICKEN", "COW", "TURTLE", "POLAR_BEAR", "MUSHROOM_COW", "PIG" -> {
|
case "CHICKEN":
|
||||||
|
case "COW":
|
||||||
|
case "TURTLE":
|
||||||
|
case "POLAR_BEAR":
|
||||||
|
case "MUSHROOM_COW":
|
||||||
|
case "PIG":
|
||||||
restoreAgeable((Ageable) entity);
|
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);
|
restoreAgeable((Ageable) 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) {
|
||||||
@ -610,38 +693,56 @@ 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 "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 "GHAST":
|
||||||
|
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,12 +34,9 @@ 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;
|
||||||
@ -51,17 +48,13 @@ 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;
|
||||||
@ -192,6 +185,12 @@ 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,
|
||||||
@ -284,14 +283,9 @@ 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 = "7.0.0")
|
@Deprecated(since = "TODO")
|
||||||
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
|
||||||
) {
|
) {
|
||||||
@ -299,8 +293,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 {
|
||||||
// Throw exception to be caught by the server that indicates the new generation API is being used.
|
// Return super as it will throw an exception caught by the server that will mean this method is no longer used.
|
||||||
throw new UnsupportedOperationException("Using new generation methods. This method is unsupported.");
|
return super.generateChunkData(world, random, x, z, biome);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -421,14 +415,9 @@ 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;
|
||||||
}
|
}
|
||||||
BlockVector3 loc = BlockVector3.at(chunkX << 4, 0, chunkZ << 4);
|
PlotArea area = UncheckedWorldLocation.at(name, chunkX << 4, 0, chunkZ << 4).getPlotArea();
|
||||||
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(
|
throw new IllegalStateException(String.format("Cannot generate chunk that does not belong to a plot area. World: %s",
|
||||||
"Cannot generate chunk that does not belong to a plot area. World: %s",
|
|
||||||
name
|
name
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@ -445,16 +434,9 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
|
|||||||
private static final List<Biome> BIOMES;
|
private static final List<Biome> BIOMES;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
Set<Biome> disabledBiomes = EnumSet.of(Biome.CUSTOM);
|
ArrayList<Biome> biomes = new ArrayList<>(List.of(Biome.values()));
|
||||||
if (PlotSquared.platform().serverVersion()[1] <= 19) {
|
biomes.remove(Biome.CUSTOM);
|
||||||
final Biome cherryGrove = Registry.BIOME.get(NamespacedKey.minecraft("cherry_grove"));
|
BIOMES = List.copyOf(biomes);
|
||||||
if (cherryGrove != null) {
|
|
||||||
disabledBiomes.add(cherryGrove);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
BIOMES = Arrays.stream(Biome.values())
|
|
||||||
.filter(not(disabledBiomes::contains))
|
|
||||||
.toList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -72,7 +72,6 @@ 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;
|
||||||
@ -747,35 +746,20 @@ 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 (block.getBlockData() instanceof Farmland farmland && event
|
if (blockType == Material.FARMLAND) {
|
||||||
.getNewState()
|
if (!plot.getFlag(SoilDryFlag.class)) {
|
||||||
.getBlockData() instanceof Farmland newFarmland) {
|
plot.debug("Soil could not dry because soil-dry = false");
|
||||||
int currentMoisture = farmland.getMoisture();
|
event.setCancelled(true);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1116,7 +1100,6 @@ 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,7 +26,6 @@ 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;
|
||||||
@ -93,16 +92,12 @@ public class BlockEventListener117 implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Plot plot = location.getOwnedPlot();
|
Plot plot = location.getOwnedPlot();
|
||||||
if (plot == null && !PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(
|
if (plot == null && !PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, MiscInteractFlag.class, true) || plot != null && !plot.getFlag(
|
||||||
area,
|
MiscInteractFlag.class)) {
|
||||||
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 both " +
|
plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because misc-interact = false");
|
||||||
"sculk-sensor-interact and misc-interact = false");
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -113,15 +108,13 @@ 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 both sculk-sensor-interact and " +
|
"A thrown item couldn't trigger sculk sensors because misc-interact = false and the item's owner could not be resolved.");
|
||||||
"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 both sculk-sensor-interact and " +
|
plot.debug("A thrown item couldn't trigger sculk sensors because misc-interact = false");
|
||||||
"misc-interact = false");
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -140,6 +133,7 @@ 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);
|
||||||
}
|
}
|
||||||
|
@ -234,8 +234,7 @@ 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(
|
if ((!Settings.Enabled_Components.WORLDS || !SinglePlotArea.isSinglePlotWorld(world)) && this.plotAreaManager.hasPlotArea(world)) {
|
||||||
world)) {
|
|
||||||
if (unloadChunk(world, chunk, true)) {
|
if (unloadChunk(world, chunk, true)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -145,38 +145,54 @@ public class EntityEventListener implements Listener {
|
|||||||
}
|
}
|
||||||
CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason();
|
CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason();
|
||||||
switch (reason.toString()) {
|
switch (reason.toString()) {
|
||||||
case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> {
|
case "DISPENSE_EGG":
|
||||||
|
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", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
|
case "REINFORCEMENTS":
|
||||||
"TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL", "DEFAULT",
|
case "NATURAL":
|
||||||
"DUPLICATION", "FROZEN", "SPELL" -> {
|
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.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", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
|
case "BUILD_IRONGOLEM":
|
||||||
|
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,41 +178,59 @@ public class PaperListener implements Listener {
|
|||||||
}
|
}
|
||||||
CreatureSpawnEvent.SpawnReason reason = event.getReason();
|
CreatureSpawnEvent.SpawnReason reason = event.getReason();
|
||||||
switch (reason.toString()) {
|
switch (reason.toString()) {
|
||||||
case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> {
|
case "DISPENSE_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", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL", "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> {
|
case "REINFORCEMENTS":
|
||||||
|
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", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
|
case "BUILD_IRONGOLEM":
|
||||||
|
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) {
|
||||||
@ -439,11 +457,9 @@ public class PaperListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean getBooleanFlagValue(
|
private boolean getBooleanFlagValue(@NonNull FlagContainer container,
|
||||||
@NonNull FlagContainer container,
|
@NonNull Class<? extends BooleanFlag<?>> flagClass,
|
||||||
@NonNull Class<? extends BooleanFlag<?>> flagClass,
|
boolean defaultValue) {
|
||||||
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,7 +273,8 @@ 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", "worldedit:up" -> {
|
case "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
|
||||||
@ -281,7 +282,6 @@ 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;
|
||||||
@ -572,8 +572,7 @@ public class PlayerEventListener implements Listener {
|
|||||||
if (now == null) {
|
if (now == null) {
|
||||||
try (final MetaDataAccess<Boolean> kickAccess =
|
try (final MetaDataAccess<Boolean> kickAccess =
|
||||||
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
|
||||||
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(
|
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) {
|
||||||
false)) {
|
|
||||||
pp.sendMessage(
|
pp.sendMessage(
|
||||||
TranslatableCaption.of("permission.no_permission_event"),
|
TranslatableCaption.of("permission.no_permission_event"),
|
||||||
TagResolver.resolver(
|
TagResolver.resolver(
|
||||||
@ -666,8 +665,7 @@ public class PlayerEventListener implements Listener {
|
|||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
try (final MetaDataAccess<Boolean> kickAccess =
|
try (final MetaDataAccess<Boolean> kickAccess =
|
||||||
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
|
||||||
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(
|
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) {
|
||||||
false)) {
|
|
||||||
pp.sendMessage(
|
pp.sendMessage(
|
||||||
TranslatableCaption.of("permission.no_permission_event"),
|
TranslatableCaption.of("permission.no_permission_event"),
|
||||||
TagResolver.resolver(
|
TagResolver.resolver(
|
||||||
@ -1116,13 +1114,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());
|
||||||
@ -1144,16 +1142,21 @@ 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", "STRING", "PUMPKIN_SEEDS", "MELON_SEEDS", "COCOA_BEANS", "WHEAT_SEEDS", "BEETROOT_SEEDS",
|
case "REDSTONE":
|
||||||
"SWEET_BERRIES", "GLOW_BERRIES" -> {
|
case "STRING":
|
||||||
|
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)) {
|
||||||
@ -1186,8 +1189,9 @@ 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.
|
||||||
@ -1198,10 +1202,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;
|
||||||
|
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* 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,10 +176,6 @@ 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,6 +62,7 @@ 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,8 +18,6 @@
|
|||||||
*/
|
*/
|
||||||
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;
|
||||||
@ -30,20 +28,13 @@ 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;
|
||||||
@ -54,15 +45,11 @@ 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 CompoundTag tag;
|
public org.bukkit.block.BlockState state = null;
|
||||||
|
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;
|
||||||
@ -240,64 +227,15 @@ 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;
|
||||||
}
|
}
|
||||||
final ListTag textures = properties.getListTag("textures");
|
try {
|
||||||
if (textures.getValue().isEmpty()) {
|
skull.setOwningPlayer(Bukkit.getOfflinePlayer(player));
|
||||||
return false;
|
skull.update(true);
|
||||||
|
} 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;
|
||||||
|
@ -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;
|
||||||
|
@ -28,32 +28,24 @@ import java.nio.file.Paths;
|
|||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a helper class which replaces older syntax no longer supported by MiniMessage with replacements in messages_%.json.
|
* This is a helper class which replaces occurrences of 'suggest_command' with 'run_command' in messages_%.json.
|
||||||
* MiniMessage changed the syntax between major releases. To warrant a smooth upgrade, we attempt to replace any occurrences
|
* 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 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
@NotPublic
|
@NotPublic
|
||||||
public class TranslationUpdateManager {
|
public class TranslationUpdateManager {
|
||||||
|
|
||||||
public static void upgradeTranslationFile() throws IOException {
|
public static void upgradeTranslationFile() throws IOException {
|
||||||
String suggestCommand = "suggest_command";
|
String searchText = "suggest_command";
|
||||||
String suggestCommandReplacement = "run_command";
|
String replacementText = "run_command";
|
||||||
String minHeight = "minHeight";
|
|
||||||
String minheightReplacement = "minheight";
|
|
||||||
String maxHeight = "maxHeight";
|
|
||||||
String maxheightReplacement = "maxheight";
|
|
||||||
|
|
||||||
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 -> {
|
.forEach(p -> replaceInFile(p, searchText, replacementText));
|
||||||
replaceInFile(p, suggestCommand, suggestCommandReplacement);
|
|
||||||
replaceInFile(p, minHeight, minheightReplacement);
|
|
||||||
replaceInFile(p, maxHeight, maxheightReplacement);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,5 +60,4 @@ public class TranslationUpdateManager {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -54,8 +54,7 @@ public class UpdateUtility implements Listener {
|
|||||||
internalVersion = PlotSquared.get().getVersion();
|
internalVersion = PlotSquared.get().getVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({"deprecation", "DefaultCharset"})
|
@SuppressWarnings({"deprecation", "DefaultCharset"}) // Suppress Json deprecation, we can't use features from gson 2.8.1 and newer yet
|
||||||
// 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 {
|
||||||
|
@ -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:
|
||||||
|
@ -23,13 +23,13 @@ include:
|
|||||||
Examples of unacceptable behavior by participants include:
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
advances
|
advances
|
||||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
* Public or private harassment
|
* Public or private harassment
|
||||||
* Publishing others' private information, such as a physical or electronic
|
* Publishing others' private information, such as a physical or electronic
|
||||||
address, without explicit permission
|
address, without explicit permission
|
||||||
* Other conduct which could reasonably be considered inappropriate in a
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
professional setting
|
professional setting
|
||||||
|
|
||||||
## Our Responsibilities
|
## Our Responsibilities
|
||||||
|
|
||||||
|
@ -68,8 +68,8 @@ 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.advntr.dev/api/4.14.0/")
|
opt.links("https://jd.adventure.kyori.net/api/4.12.0/")
|
||||||
opt.links("https://jd.advntr.dev/text-minimessage/4.14.0/")
|
opt.links("https://jd.adventure.kyori.net/text-minimessage/4.12.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.links("https://javadoc.io/doc/com.intellectualsites.informative-annotations/informative-annotations/latest/")
|
||||||
|
@ -270,11 +270,7 @@ 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
|
captionMap = this.captionLoader.loadOrCreateSingle(this.platform.getDirectory().toPath().resolve("lang").resolve(fileName));
|
||||||
.getDirectory()
|
|
||||||
.toPath()
|
|
||||||
.resolve("lang")
|
|
||||||
.resolve(fileName));
|
|
||||||
}
|
}
|
||||||
this.captionMaps.put(TranslatableCaption.DEFAULT_NAMESPACE, captionMap);
|
this.captionMaps.put(TranslatableCaption.DEFAULT_NAMESPACE, captionMap);
|
||||||
LOGGER.info(
|
LOGGER.info(
|
||||||
@ -1015,7 +1011,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>
|
||||||
*
|
*
|
||||||
|
@ -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()) {
|
|
||||||
return false;
|
@Override
|
||||||
|
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());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -70,8 +70,7 @@ 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(
|
checkTrue(args.length == 1,
|
||||||
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 | *>")))
|
||||||
);
|
);
|
||||||
|
@ -296,13 +296,10 @@ public class Auto extends SubCommand {
|
|||||||
}
|
}
|
||||||
if (this.econHandler != null && plotarea.useEconomy()) {
|
if (this.econHandler != null && plotarea.useEconomy()) {
|
||||||
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 = size * cost + mergeCost;
|
cost = (sizeX * sizeZ) * cost;
|
||||||
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"));
|
||||||
|
@ -107,35 +107,37 @@ 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, () -> TaskManager.runTask(() -> {
|
boolean result = plot.getPlotModificationManager().clear(true, false, player, () -> {
|
||||||
plot.removeRunning();
|
TaskManager.runTask(() -> {
|
||||||
// If the state changes, then mark it as no longer done
|
plot.removeRunning();
|
||||||
if (DoneFlag.isDone(plot)) {
|
// If the state changes, then mark it as no longer done
|
||||||
PlotFlag<?, ?> plotFlag =
|
if (DoneFlag.isDone(plot)) {
|
||||||
plot.getFlagContainer().getFlag(DoneFlag.class);
|
PlotFlag<?, ?> plotFlag =
|
||||||
PlotFlagRemoveEvent event = this.eventDispatcher
|
plot.getFlagContainer().getFlag(DoneFlag.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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
if (!plot.getFlag(AnalysisFlag.class).isEmpty()) {
|
||||||
if (!plot.getFlag(AnalysisFlag.class).isEmpty()) {
|
PlotFlag<?, ?> plotFlag =
|
||||||
PlotFlag<?, ?> plotFlag =
|
plot.getFlagContainer().getFlag(AnalysisFlag.class);
|
||||||
plot.getFlagContainer().getFlag(AnalysisFlag.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());
|
}
|
||||||
}
|
}
|
||||||
}
|
player.sendMessage(
|
||||||
player.sendMessage(
|
TranslatableCaption.of("working.clearing_done"),
|
||||||
TranslatableCaption.of("working.clearing_done"),
|
TagResolver.builder()
|
||||||
TagResolver.builder()
|
.tag("amount", Tag.inserting(Component.text(System.currentTimeMillis() - start)))
|
||||||
.tag("amount", Tag.inserting(Component.text(System.currentTimeMillis() - start)))
|
.tag("plot", Tag.inserting(Component.text(plot.getId().toString())))
|
||||||
.tag("plot", Tag.inserting(Component.text(plot.getId().toString())))
|
.build()
|
||||||
.build()
|
);
|
||||||
);
|
});
|
||||||
}));
|
});
|
||||||
if (!result) {
|
if (!result) {
|
||||||
player.sendMessage(TranslatableCaption.of("errors.wait_for_timer"));
|
player.sendMessage(TranslatableCaption.of("errors.wait_for_timer"));
|
||||||
} else {
|
} else {
|
||||||
|
@ -46,7 +46,6 @@ 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;
|
||||||
@ -78,7 +77,8 @@ public class Cluster extends SubCommand {
|
|||||||
}
|
}
|
||||||
String sub = args[0].toLowerCase();
|
String sub = args[0].toLowerCase();
|
||||||
switch (sub) {
|
switch (sub) {
|
||||||
case "l", "list" -> {
|
case "l":
|
||||||
|
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,7 +133,8 @@ public class Cluster extends SubCommand {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "c", "create" -> {
|
case "c":
|
||||||
|
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"),
|
||||||
@ -268,7 +269,9 @@ public class Cluster extends SubCommand {
|
|||||||
);
|
);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "disband", "del", "delete" -> {
|
case "disband":
|
||||||
|
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"),
|
||||||
@ -327,7 +330,8 @@ public class Cluster extends SubCommand {
|
|||||||
));
|
));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "res", "resize" -> {
|
case "res":
|
||||||
|
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"),
|
||||||
@ -448,7 +452,9 @@ 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", "inv", "invite" -> {
|
case "add":
|
||||||
|
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"),
|
||||||
@ -517,7 +523,9 @@ public class Cluster extends SubCommand {
|
|||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "k", "remove", "kick" -> {
|
case "k":
|
||||||
|
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"),
|
||||||
@ -597,7 +605,8 @@ public class Cluster extends SubCommand {
|
|||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "quit", "leave" -> {
|
case "quit":
|
||||||
|
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"),
|
||||||
@ -658,7 +667,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"),
|
||||||
@ -719,7 +728,9 @@ public class Cluster extends SubCommand {
|
|||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "spawn", "home", "tp" -> {
|
case "spawn":
|
||||||
|
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"),
|
||||||
@ -767,7 +778,10 @@ 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", "info", "show", "information" -> {
|
case "i":
|
||||||
|
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"),
|
||||||
@ -814,7 +828,11 @@ 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;
|
||||||
owner = Objects.requireNonNullElse(username, "unknown");
|
if (username == null) {
|
||||||
|
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);
|
||||||
@ -832,7 +850,9 @@ public class Cluster extends SubCommand {
|
|||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "sh", "setspawn", "sethome" -> {
|
case "sh":
|
||||||
|
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,10 +559,9 @@ 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);
|
||||||
@ -581,15 +580,13 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,8 +69,7 @@ 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(
|
player.sendMessage(TranslatableCaption.of("move.copy_success"),
|
||||||
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())))
|
||||||
|
@ -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,19 +75,16 @@ 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;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,25 +185,22 @@ public class Download extends SubCommand {
|
|||||||
if (Settings.Web.LEGACY_WEBINTERFACE) {
|
if (Settings.Web.LEGACY_WEBINTERFACE) {
|
||||||
schematicHandler
|
schematicHandler
|
||||||
.getCompoundTag(plot)
|
.getCompoundTag(plot)
|
||||||
.whenComplete((compoundTag, throwable) -> schematicHandler.upload(
|
.whenComplete((compoundTag, throwable) -> {
|
||||||
compoundTag,
|
schematicHandler.upload(compoundTag, null, null, new RunnableVal<>() {
|
||||||
null,
|
@Override
|
||||||
null,
|
public void run(URL value) {
|
||||||
new RunnableVal<>() {
|
plot.removeRunning();
|
||||||
@Override
|
player.sendMessage(
|
||||||
public void run(URL value) {
|
TranslatableCaption.of("web.generation_link_success"),
|
||||||
plot.removeRunning();
|
TagResolver.builder()
|
||||||
player.sendMessage(
|
.tag("download", Tag.preProcessParsed(value.toString()))
|
||||||
TranslatableCaption.of("web.generation_link_success"),
|
.tag("delete", Tag.preProcessParsed("Not available"))
|
||||||
TagResolver.builder()
|
.build()
|
||||||
.tag("download", Tag.preProcessParsed(value.toString()))
|
);
|
||||||
.tag("delete", Tag.preProcessParsed("Not available"))
|
player.sendMessage(StaticCaption.of(value.toString()));
|
||||||
.build()
|
|
||||||
);
|
|
||||||
player.sendMessage(StaticCaption.of(value.toString()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
));
|
});
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// TODO legacy support
|
// TODO legacy support
|
||||||
|
@ -60,10 +60,9 @@ 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]));
|
||||||
@ -73,8 +72,7 @@ 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]));
|
||||||
@ -83,8 +81,8 @@ public class Help extends Command {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return CompletableFuture.completedFuture(false);
|
return CompletableFuture.completedFuture(false);
|
||||||
}
|
default:
|
||||||
default -> sendUsage(player);
|
sendUsage(player);
|
||||||
}
|
}
|
||||||
return CompletableFuture.completedFuture(true);
|
return CompletableFuture.completedFuture(true);
|
||||||
}
|
}
|
||||||
@ -134,12 +132,7 @@ 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(
|
.tag("category_desc", Tag.inserting(TranslatableCaption.of("help.help_display_all_commands").toComponent(player)))
|
||||||
"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,6 +225,7 @@ 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) {
|
||||||
@ -253,8 +254,7 @@ 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,15 +268,13 @@ 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,9 +52,8 @@ 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" ->
|
case "trusted", "alias", "biome", "denied", "flags", "id", "size", "members", "creationdate", "seen", "owner", "rating", "likes" -> plot = Plot
|
||||||
plot = Plot
|
.getPlotFromString(player, null, false);
|
||||||
.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("kick.player_not_in_plot"),
|
TranslatableCaption.of("errors.invalid_player"),
|
||||||
TagResolver.resolver("player", Tag.inserting(Component.text(player2.getName())))
|
TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (player2.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_DENIED)) {
|
if (player2.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_DENIED)) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("kick.cannot_kick_player"),
|
TranslatableCaption.of("cluster.cannot_kick_player"),
|
||||||
TagResolver.resolver("player", Tag.inserting(Component.text(player2.getName())))
|
TagResolver.resolver("name", 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",
|
||||||
|
@ -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_relic"
|
"music_disc_pigstep", "music_disc_5"
|
||||||
);
|
);
|
||||||
|
|
||||||
private final InventoryUtil inventoryUtil;
|
private final InventoryUtil inventoryUtil;
|
||||||
|
@ -90,8 +90,12 @@ public class Purge extends SubCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
switch (split[0].toLowerCase()) {
|
switch (split[0].toLowerCase()) {
|
||||||
case "world", "w" -> world = split[1];
|
case "world":
|
||||||
case "area", "a" -> {
|
case "w":
|
||||||
|
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(
|
||||||
@ -100,8 +104,9 @@ public class Purge extends SubCommand {
|
|||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
break;
|
||||||
case "plotid", "id" -> {
|
case "plotid":
|
||||||
|
case "id":
|
||||||
try {
|
try {
|
||||||
id = PlotId.fromString(split[1]);
|
id = PlotId.fromString(split[1]);
|
||||||
} catch (IllegalArgumentException ignored) {
|
} catch (IllegalArgumentException ignored) {
|
||||||
@ -111,8 +116,9 @@ public class Purge extends SubCommand {
|
|||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
break;
|
||||||
case "owner", "o" -> {
|
case "owner":
|
||||||
|
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(
|
||||||
@ -122,8 +128,9 @@ public class Purge extends SubCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
owner = ownerMapping.uuid();
|
owner = ownerMapping.uuid();
|
||||||
}
|
break;
|
||||||
case "shared", "s" -> {
|
case "shared":
|
||||||
|
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(
|
||||||
@ -133,13 +140,22 @@ public class Purge extends SubCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
added = addedMapping.uuid();
|
added = addedMapping.uuid();
|
||||||
}
|
break;
|
||||||
case "clear", "c", "delete", "d", "del" -> clear = Boolean.parseBoolean(split[1]);
|
case "clear":
|
||||||
case "unknown", "?", "u" -> unknown = Boolean.parseBoolean(split[1]);
|
case "c":
|
||||||
default -> {
|
case "delete":
|
||||||
|
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<>();
|
||||||
@ -220,9 +236,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();
|
||||||
}
|
}
|
||||||
|
@ -49,8 +49,7 @@ 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(
|
new IllegalArgumentException("The preset in components.yml needs a valid target component, got: " + map.get("component")));
|
||||||
"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();
|
||||||
|
@ -42,6 +42,32 @@ 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
|
||||||
@ -233,6 +259,7 @@ 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 {
|
||||||
@ -418,6 +445,10 @@ 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;
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ public interface Caption {
|
|||||||
*
|
*
|
||||||
* @param localeHolder Locale holder
|
* @param localeHolder Locale holder
|
||||||
* @return {@link ComponentLike}
|
* @return {@link ComponentLike}
|
||||||
* @since 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
@NonNull Component toComponent(@NonNull LocaleHolder localeHolder);
|
@NonNull Component toComponent(@NonNull LocaleHolder localeHolder);
|
||||||
|
|
||||||
|
@ -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 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
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 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
public void setTagResolvers(TagResolver... tagResolvers) {
|
public void setTagResolvers(TagResolver... tagResolvers) {
|
||||||
this.tagResolvers = tagResolvers;
|
this.tagResolvers = tagResolvers;
|
||||||
|
@ -28,20 +28,16 @@ import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag;
|
|||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.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,
|
||||||
@ -104,14 +100,7 @@ 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;
|
Component component = MiniMessage.miniMessage().deserialize(miniMessageString);
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
@ -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,8 +56,7 @@ 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,7 +19,6 @@
|
|||||||
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;
|
||||||
@ -31,7 +30,6 @@ 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,7 +21,6 @@ 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;
|
||||||
|
|
||||||
@ -31,7 +30,6 @@ 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());
|
||||||
|
@ -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 6.11.1
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
public abstract class EntityEvent {
|
public abstract class EntityEvent {
|
||||||
|
|
||||||
@ -53,8 +53,7 @@ public abstract class EntityEvent {
|
|||||||
* @return the event class name
|
* @return the event class name
|
||||||
* @since 6.11.0
|
* @since 6.11.0
|
||||||
*/
|
*/
|
||||||
@NonNull
|
@NonNull public String getEventName() {
|
||||||
public String getEventName() {
|
|
||||||
if (this.name == null) {
|
if (this.name == null) {
|
||||||
this.name = this.getClass().getSimpleName();
|
this.name = this.getClass().getSimpleName();
|
||||||
}
|
}
|
||||||
|
@ -379,11 +379,10 @@ 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 = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||||
queue.setBlock(x, y, z, blocks);
|
queue.setBlock(x, y, z, blocks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -391,7 +390,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 = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||||
queue.setBlock(x, y, z, blocks);
|
queue.setBlock(x, y, z, blocks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -399,7 +398,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 = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||||
queue.setBlock(x, y, z, blocks);
|
queue.setBlock(x, y, z, blocks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -407,7 +406,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 = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||||
queue.setBlock(x, y, z, blocks);
|
queue.setBlock(x, y, z, blocks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,6 @@ 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;
|
||||||
@ -65,21 +64,6 @@ 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.
|
||||||
*
|
*
|
||||||
@ -160,4 +144,19 @@ 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);
|
||||||
boolean isRoad = features.contains(SchematicFeature.ROAD);
|
if ((features.contains(SchematicFeature.ROAD) && Settings.Schematics.PASTE_ROAD_ON_TOP)
|
||||||
if ((isRoad && Settings.Schematics.PASTE_ROAD_ON_TOP) || (!isRoad && Settings.Schematics.PASTE_ON_TOP)) {
|
|| (!features.contains(SchematicFeature.ROAD) && Settings.Schematics.PASTE_ON_TOP)) {
|
||||||
minY = world.SCHEM_Y;
|
minY = world.SCHEM_Y;
|
||||||
} else {
|
} else {
|
||||||
minY = world.getMinBuildHeight();
|
minY = world.getMinBuildHeight();
|
||||||
@ -341,10 +341,7 @@ 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
|
.subtract(region.getMinimumPoint().withY(hybridPlotWorld.getPlotSchematicMinPoint().getY()).toVector3()))
|
||||||
.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,
|
||||||
@ -402,12 +399,6 @@ 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.
|
||||||
@ -462,4 +453,10 @@ public class HybridGen extends IndependentPlotGenerator {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private enum SchematicFeature {
|
||||||
|
BIOMES,
|
||||||
|
ROAD,
|
||||||
|
POPULATING
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -141,11 +141,7 @@ 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(
|
WorldUtil.setBiome(hybridPlotWorld.getWorldName(), new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3()), biome);
|
||||||
hybridPlotWorld.getWorldName(),
|
|
||||||
new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3()),
|
|
||||||
biome
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,7 +158,6 @@ 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);
|
||||||
@ -179,14 +174,10 @@ 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 (y > schemYDiff) {
|
} else if (!isRoad) {
|
||||||
// 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
|
||||||
// This should only be done where the schematic has actually "started"
|
// Do not set air for road as this may cause cavernous roads when debugroadregen is used
|
||||||
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());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -212,18 +203,8 @@ 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(
|
Location pos1 = Location.at(hybridPlotWorld.getWorldName(), bot.getX() - 1, hybridPlotWorld.getMinGenHeight(), top.getZ() + 1);
|
||||||
hybridPlotWorld.getWorldName(),
|
Location pos2 = Location.at(hybridPlotWorld.getWorldName(), top.getX() + 1, hybridPlotWorld.getMaxGenHeight(), bot.getZ());
|
||||||
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;
|
||||||
@ -293,13 +274,6 @@ 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()),
|
||||||
@ -317,13 +291,6 @@ 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,9 +76,6 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
* The Y level at which schematic generation will start, lowest of either road or plot schematic generation.
|
* 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;
|
||||||
@ -255,13 +252,13 @@ 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
|
// plotY and roadY are important to allow plot and/or road schematic "overflow" into each other without causing AIOOB
|
||||||
// without causing AIOOB exceptions when attempting either to set blocks to, or get block from G_SCH
|
// 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.
|
||||||
plotY = PLOT_HEIGHT - SCHEM_Y;
|
int plotY = PLOT_HEIGHT - SCHEM_Y;
|
||||||
int minRoadWall = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ? Math.min(ROAD_HEIGHT, WALL_HEIGHT) : ROAD_HEIGHT;
|
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.
|
||||||
roadY = minRoadWall - SCHEM_Y;
|
int roadY = minRoadWall - SCHEM_Y;
|
||||||
|
|
||||||
int worldGenHeight = getMaxGenHeight() - getMinGenHeight() + 1;
|
int worldGenHeight = getMaxGenHeight() - getMinGenHeight() + 1;
|
||||||
|
|
||||||
@ -270,15 +267,14 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
|
|
||||||
// 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 = schematic3.getClipboard().getDimensions().getY();
|
plotSchemHeight = maxSchematicHeight = schematic3.getClipboard().getDimensions().getY();
|
||||||
if (plotSchemHeight == worldGenHeight) {
|
if (maxSchematicHeight == 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 = getMinBuildHeight();
|
||||||
plotY = 0;
|
plotY = 0;
|
||||||
}
|
}
|
||||||
maxSchematicHeight = plotY + plotSchemHeight;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int roadSchemHeight;
|
int roadSchemHeight;
|
||||||
@ -327,7 +323,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 || l3 > PLOT_WIDTH) {
|
if (w3 > PLOT_WIDTH || h3 > PLOT_WIDTH) {
|
||||||
this.ROAD_SCHEMATIC_ENABLED = true;
|
this.ROAD_SCHEMATIC_ENABLED = true;
|
||||||
}
|
}
|
||||||
int centerShiftZ;
|
int centerShiftZ;
|
||||||
@ -382,7 +378,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("- road schematic: false");
|
LOGGER.info("- schematic: false");
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -548,6 +544,14 @@ 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()}
|
||||||
@ -558,24 +562,4 @@ 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 TODO
|
|
||||||
*/
|
|
||||||
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 TODO
|
|
||||||
*/
|
|
||||||
public int getRoadYStart() {
|
|
||||||
return SCHEM_Y + roadY;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -63,6 +63,7 @@ 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;
|
||||||
@ -379,6 +380,22 @@ 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;
|
||||||
@ -668,7 +685,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 = plotWorld.getRoadYStart();
|
int minY = Settings.Schematics.PASTE_ROAD_ON_TOP ? plotWorld.SCHEM_Y : area.getMinGenHeight() + 1;
|
||||||
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 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
public abstract void generateChunk(ZeroedDelegateScopedQueueCoordinator result, PlotArea settings, boolean biomes);
|
public abstract void generateChunk(ZeroedDelegateScopedQueueCoordinator result, PlotArea settings, boolean biomes);
|
||||||
|
|
||||||
@ -55,10 +55,9 @@ 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 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
public void populateChunk(ZeroedDelegateScopedQueueCoordinator result, PlotArea setting) {
|
public void populateChunk(ZeroedDelegateScopedQueueCoordinator result, PlotArea setting) {}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a new PlotArea object.
|
* Return a new PlotArea object.
|
||||||
@ -104,11 +103,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 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
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,38 +185,30 @@ 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());
|
||||||
|
@ -142,9 +142,7 @@ 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()) {
|
if (effects.isEmpty()) iterator.remove();
|
||||||
iterator.remove();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, TaskTime.seconds(1L));
|
}, TaskTime.seconds(1L));
|
||||||
@ -488,9 +486,8 @@ 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 uuid The uuid of the player the effect belongs to
|
* @param name The name of the status effect
|
||||||
* @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
|
||||||
*/
|
*/
|
||||||
@ -521,10 +518,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,6 +51,7 @@ 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
|
||||||
|
@ -222,13 +222,41 @@ public final class BlockBucket implements ConfigurationSerializable {
|
|||||||
) {
|
) {
|
||||||
|
|
||||||
public int getWeight() {
|
public int getWeight() {
|
||||||
return max - min;
|
return max - min;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInRange(final int num) {
|
public boolean isInRange(final int num) {
|
||||||
return num <= max && num >= min;
|
return num <= max && num >= min;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
public boolean equals(final Object o) {
|
||||||
|
if (o == this) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!(o instanceof final Range other)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (this.min() != other.min()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (this.max() != other.max()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (this.automatic() != other.automatic()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int hashCode() {
|
||||||
|
final int PRIME = 59;
|
||||||
|
int result = 1;
|
||||||
|
result = result * PRIME + this.min();
|
||||||
|
result = result * PRIME + this.max();
|
||||||
|
result = result * PRIME + (this.automatic() ? 79 : 97);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ package com.plotsquared.core.plot;
|
|||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.plotsquared.core.PlotSquared;
|
import com.plotsquared.core.PlotSquared;
|
||||||
import com.plotsquared.core.command.Like;
|
import com.plotsquared.core.command.Like;
|
||||||
@ -2417,6 +2418,7 @@ public class Plot {
|
|||||||
if (!this.isMerged()) {
|
if (!this.isMerged()) {
|
||||||
Location pos1 = this.getBottomAbs().withY(getArea().getMinBuildHeight());
|
Location pos1 = this.getBottomAbs().withY(getArea().getMinBuildHeight());
|
||||||
Location pos2 = this.getTopAbs().withY(getArea().getMaxBuildHeight());
|
Location pos2 = this.getTopAbs().withY(getArea().getMaxBuildHeight());
|
||||||
|
this.connectedCache = Sets.newHashSet(this);
|
||||||
CuboidRegion rg = new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3());
|
CuboidRegion rg = new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3());
|
||||||
return Collections.singleton(rg);
|
return Collections.singleton(rg);
|
||||||
}
|
}
|
||||||
|
@ -657,11 +657,9 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("height.height_limit"),
|
TranslatableCaption.of("height.height_limit"),
|
||||||
TagResolver.builder()
|
TagResolver.builder()
|
||||||
.tag("minheight", Tag.inserting(Component.text(minBuildHeight)))
|
.tag("minHeight", Tag.inserting(Component.text(minBuildHeight)))
|
||||||
.tag(
|
.tag("maxHeight",
|
||||||
"maxheight",
|
Tag.inserting(Component.text(maxBuildHeight))).build()
|
||||||
Tag.inserting(Component.text(maxBuildHeight))
|
|
||||||
).build()
|
|
||||||
);
|
);
|
||||||
// Return true if "failed" as the method will always be inverted otherwise
|
// Return true if "failed" as the method will always be inverted otherwise
|
||||||
return true;
|
return true;
|
||||||
@ -1019,7 +1017,7 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
*
|
*
|
||||||
* @param plotIds List of plot IDs to merge
|
* @param plotIds List of plot IDs to merge
|
||||||
* @param removeRoads If the roads between plots should be removed
|
* @param removeRoads If the roads between plots should be removed
|
||||||
* @param whenDone Task to run when any merge world changes are complete. Also runs if no changes were made. Does not
|
* @param whenDone Task to run when any merge world changes are complete. Also runs if no changes were made. Does not
|
||||||
* run if there was an error or if too few plots IDs were supplied.
|
* run if there was an error or if too few plots IDs were supplied.
|
||||||
* @return if merges were completed successfully.
|
* @return if merges were completed successfully.
|
||||||
* @since 6.9.0
|
* @since 6.9.0
|
||||||
|
@ -100,7 +100,7 @@ public class PlotInventory {
|
|||||||
* Put an item into this inventory
|
* Put an item into this inventory
|
||||||
*
|
*
|
||||||
* @param index the index (= slot) where to place the item
|
* @param index the index (= slot) where to place the item
|
||||||
* @param item the item to place
|
* @param item the item to place
|
||||||
* @see #setItemChecked(int, PlotItemStack)
|
* @see #setItemChecked(int, PlotItemStack)
|
||||||
*/
|
*/
|
||||||
public void setItem(int index, PlotItemStack item) {
|
public void setItem(int index, PlotItemStack item) {
|
||||||
|
@ -79,6 +79,14 @@ public class PlotSettings {
|
|||||||
this.ratings = ratings;
|
this.ratings = ratings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean setMerged(int direction, boolean merged) {
|
||||||
|
if (this.merged[direction] != merged) {
|
||||||
|
this.merged[direction] = merged;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean setMerged(Direction direction, boolean merged) {
|
public boolean setMerged(Direction direction, boolean merged) {
|
||||||
if (Direction.ALL == direction) {
|
if (Direction.ALL == direction) {
|
||||||
throw new IllegalArgumentException("You cannot use Direction.ALL in this method!");
|
throw new IllegalArgumentException("You cannot use Direction.ALL in this method!");
|
||||||
|
@ -154,7 +154,6 @@ public class ExpiryTask {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns {@code true} if this task respects unknown owners
|
* Returns {@code true} if this task respects unknown owners
|
||||||
*
|
|
||||||
* @return {@code true} if unknown owners should be counted as never online
|
* @return {@code true} if unknown owners should be counted as never online
|
||||||
* @since 6.4.0
|
* @since 6.4.0
|
||||||
*/
|
*/
|
||||||
|
@ -91,7 +91,6 @@ import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
|
|||||||
import com.plotsquared.core.plot.flag.implementations.PveFlag;
|
import com.plotsquared.core.plot.flag.implementations.PveFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.PvpFlag;
|
import com.plotsquared.core.plot.flag.implementations.PvpFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.RedstoneFlag;
|
import com.plotsquared.core.plot.flag.implementations.RedstoneFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.SculkSensorInteractFlag;
|
|
||||||
import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag;
|
import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.SnowFormFlag;
|
import com.plotsquared.core.plot.flag.implementations.SnowFormFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.SnowMeltFlag;
|
import com.plotsquared.core.plot.flag.implementations.SnowMeltFlag;
|
||||||
@ -173,7 +172,6 @@ public final class GlobalFlagContainer extends FlagContainer {
|
|||||||
this.addFlag(MobBreakFlag.MOB_BREAK_FALSE);
|
this.addFlag(MobBreakFlag.MOB_BREAK_FALSE);
|
||||||
this.addFlag(MobPlaceFlag.MOB_PLACE_FALSE);
|
this.addFlag(MobPlaceFlag.MOB_PLACE_FALSE);
|
||||||
this.addFlag(MiscInteractFlag.MISC_INTERACT_FALSE);
|
this.addFlag(MiscInteractFlag.MISC_INTERACT_FALSE);
|
||||||
this.addFlag(SculkSensorInteractFlag.SCULK_SENSOR_INTERACT_FALSE);
|
|
||||||
this.addFlag(MiscPlaceFlag.MISC_PLACE_FALSE);
|
this.addFlag(MiscPlaceFlag.MISC_PLACE_FALSE);
|
||||||
this.addFlag(MycelGrowFlag.MYCEL_GROW_TRUE);
|
this.addFlag(MycelGrowFlag.MYCEL_GROW_TRUE);
|
||||||
this.addFlag(NotifyEnterFlag.NOTIFY_ENTER_FALSE);
|
this.addFlag(NotifyEnterFlag.NOTIFY_ENTER_FALSE);
|
||||||
|
@ -88,7 +88,7 @@ public abstract class PlotFlag<T, F extends PlotFlag<T, F>> {
|
|||||||
* Gets the flag name as a Kyori {@link Component}
|
* Gets the flag name as a Kyori {@link Component}
|
||||||
*
|
*
|
||||||
* @see #getFlagName(Class)
|
* @see #getFlagName(Class)
|
||||||
* @since 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
public static <T, F extends PlotFlag<T, F>> Component getFlagNameComponent(Class<F> flagClass) {
|
public static <T, F extends PlotFlag<T, F>> Component getFlagNameComponent(Class<F> flagClass) {
|
||||||
return Component.text(getFlagName(flagClass));
|
return Component.text(getFlagName(flagClass));
|
||||||
|
@ -27,7 +27,7 @@ public class BeaconEffectsFlag extends BooleanFlag<BeaconEffectsFlag> {
|
|||||||
public static final BeaconEffectsFlag BEACON_EFFECT_TRUE = new BeaconEffectsFlag(true);
|
public static final BeaconEffectsFlag BEACON_EFFECT_TRUE = new BeaconEffectsFlag(true);
|
||||||
public static final BeaconEffectsFlag BEACON_EFFECT_FALSE = new BeaconEffectsFlag(false);
|
public static final BeaconEffectsFlag BEACON_EFFECT_FALSE = new BeaconEffectsFlag(false);
|
||||||
|
|
||||||
private BeaconEffectsFlag(boolean value) {
|
private BeaconEffectsFlag(boolean value){
|
||||||
super(value, TranslatableCaption.of("flags.flag_description_beacon_effect"));
|
super(value, TranslatableCaption.of("flags.flag_description_beacon_effect"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,15 +57,24 @@ public class DenyTeleportFlag extends PlotFlag<DenyTeleportFlag.DeniedGroup, Den
|
|||||||
}
|
}
|
||||||
final boolean result;
|
final boolean result;
|
||||||
switch (value) {
|
switch (value) {
|
||||||
case TRUSTED -> result = !plot.getTrusted().contains(player.getUUID());
|
case TRUSTED:
|
||||||
case MEMBERS -> result = !plot.getMembers().contains(player.getUUID());
|
result = !plot.getTrusted().contains(player.getUUID());
|
||||||
case NONMEMBERS -> result = plot.isAdded(player.getUUID());
|
break;
|
||||||
case NONTRUSTED -> result =
|
case MEMBERS:
|
||||||
plot.getTrusted().contains(player.getUUID()) || plot.isOwner(player.getUUID());
|
result = !plot.getMembers().contains(player.getUUID());
|
||||||
case NONOWNERS -> result = plot.isOwner(player.getUUID());
|
break;
|
||||||
default -> {
|
case NONMEMBERS:
|
||||||
|
result = plot.isAdded(player.getUUID());
|
||||||
|
break;
|
||||||
|
case NONTRUSTED:
|
||||||
|
result =
|
||||||
|
plot.getTrusted().contains(player.getUUID()) || plot.isOwner(player.getUUID());
|
||||||
|
break;
|
||||||
|
case NONOWNERS:
|
||||||
|
result = plot.isOwner(player.getUUID());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return result || player.hasPermission("plots.admin.entry.denied");
|
return result || player.hasPermission("plots.admin.entry.denied");
|
||||||
}
|
}
|
||||||
|
@ -68,11 +68,14 @@ public class FlyFlag extends PlotFlag<FlyFlag.FlyStatus, FlyFlag> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected FlyFlag flagOf(final @NonNull FlyStatus value) {
|
protected FlyFlag flagOf(final @NonNull FlyStatus value) {
|
||||||
return switch (value) {
|
switch (value) {
|
||||||
case ENABLED -> FLIGHT_FLAG_ENABLED;
|
case ENABLED:
|
||||||
case DISABLED -> FLIGHT_FLAG_DISABLED;
|
return FLIGHT_FLAG_ENABLED;
|
||||||
default -> FLIGHT_FLAG_DEFAULT;
|
case DISABLED:
|
||||||
};
|
return FLIGHT_FLAG_DISABLED;
|
||||||
|
default:
|
||||||
|
return FLIGHT_FLAG_DEFAULT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -27,7 +27,7 @@ public class ProjectilesFlag extends BooleanFlag<ProjectilesFlag> {
|
|||||||
public static final ProjectilesFlag PROJECTILES_TRUE = new ProjectilesFlag(true);
|
public static final ProjectilesFlag PROJECTILES_TRUE = new ProjectilesFlag(true);
|
||||||
public static final ProjectilesFlag PROJECTILES_FALSE = new ProjectilesFlag(false);
|
public static final ProjectilesFlag PROJECTILES_FALSE = new ProjectilesFlag(false);
|
||||||
|
|
||||||
private ProjectilesFlag(boolean value) {
|
private ProjectilesFlag(boolean value){
|
||||||
super(value, TranslatableCaption.of("flags.flag_description_projectiles"));
|
super(value, TranslatableCaption.of("flags.flag_description_projectiles"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* PlotSquared, a land and world management plugin for Minecraft.
|
|
||||||
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
|
||||||
* Copyright (C) IntellectualSites team and contributors
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package com.plotsquared.core.plot.flag.implementations;
|
|
||||||
|
|
||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
|
||||||
import com.plotsquared.core.plot.flag.types.BooleanFlag;
|
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
|
||||||
|
|
||||||
public class SculkSensorInteractFlag extends BooleanFlag<SculkSensorInteractFlag> {
|
|
||||||
|
|
||||||
public static final SculkSensorInteractFlag SCULK_SENSOR_INTERACT_TRUE = new SculkSensorInteractFlag(true);
|
|
||||||
public static final SculkSensorInteractFlag SCULK_SENSOR_INTERACT_FALSE = new SculkSensorInteractFlag(false);
|
|
||||||
|
|
||||||
private SculkSensorInteractFlag(boolean value) {
|
|
||||||
super(value, TranslatableCaption.of("flags.flag_description_sculk_sensor_interact"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected SculkSensorInteractFlag flagOf(@NonNull Boolean value) {
|
|
||||||
return value ? SCULK_SENSOR_INTERACT_TRUE : SCULK_SENSOR_INTERACT_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -82,10 +82,10 @@ public abstract class TimedFlag<T, F extends PlotFlag<TimedFlag.Timed<T>, F>>
|
|||||||
) {
|
) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return String.format("%d %s", interval, value);
|
return String.format("%d %s", interval, value);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -29,17 +29,17 @@ import org.checkerframework.checker.nullness.qual.NonNull;
|
|||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public class DefaultPlotAreaManager implements PlotAreaManager {
|
public class DefaultPlotAreaManager implements PlotAreaManager {
|
||||||
|
|
||||||
final PlotArea[] noPlotAreas = new PlotArea[0];
|
final PlotArea[] noPlotAreas = new PlotArea[0];
|
||||||
private final Map<String, PlotWorld> plotWorlds = new ConcurrentHashMap<>();
|
private final Map<String, PlotWorld> plotWorlds = new HashMap<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NonNull PlotArea[] getAllPlotAreas() {
|
public @NonNull PlotArea[] getAllPlotAreas() {
|
||||||
|
@ -111,7 +111,7 @@ public interface PlotAreaManager {
|
|||||||
*
|
*
|
||||||
* @param worldName Name of the world to add
|
* @param worldName Name of the world to add
|
||||||
* @return {@code true} if successful, {@code false} if world already existed
|
* @return {@code true} if successful, {@code false} if world already existed
|
||||||
* @since 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
boolean addWorld(@NonNull String worldName);
|
boolean addWorld(@NonNull String worldName);
|
||||||
|
|
||||||
|
@ -76,7 +76,6 @@ public class SinglePlotArea extends GridPlotWorld {
|
|||||||
* Returns true if the given string matches the naming system used to identify single plot worlds
|
* Returns true if the given string matches the naming system used to identify single plot worlds
|
||||||
* e.g. -1_5 represents plot id *;-1;5. "*" being the plot area name given to single plot world
|
* e.g. -1_5 represents plot id *;-1;5. "*" being the plot area name given to single plot world
|
||||||
* {@link com.plotsquared.core.plot.PlotArea}.
|
* {@link com.plotsquared.core.plot.PlotArea}.
|
||||||
*
|
|
||||||
* @since 6.1.4
|
* @since 6.1.4
|
||||||
*/
|
*/
|
||||||
public static boolean isSinglePlotWorld(String worldName) {
|
public static boolean isSinglePlotWorld(String worldName) {
|
||||||
|
@ -36,7 +36,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
|||||||
* The min and max points of this queue are offset according to the minimum point given in the constructor, and the offsets set
|
* The min and max points of this queue are offset according to the minimum point given in the constructor, and the offsets set
|
||||||
* in {@link BlockArrayCacheScopedQueueCoordinator#setOffsetX(int)} and
|
* in {@link BlockArrayCacheScopedQueueCoordinator#setOffsetX(int)} and
|
||||||
* {@link BlockArrayCacheScopedQueueCoordinator#setOffsetZ(int)}
|
* {@link BlockArrayCacheScopedQueueCoordinator#setOffsetZ(int)}
|
||||||
* <p>
|
*
|
||||||
* Internal use only. Subject to change at any time and created for specific use cases.
|
* Internal use only. Subject to change at any time and created for specific use cases.
|
||||||
*/
|
*/
|
||||||
@NotPublic
|
@NotPublic
|
||||||
@ -54,7 +54,6 @@ public class BlockArrayCacheScopedQueueCoordinator extends ZeroedDelegateScopedQ
|
|||||||
private final int scopeMaxZ;
|
private final int scopeMaxZ;
|
||||||
private int offsetX = 0;
|
private int offsetX = 0;
|
||||||
private int offsetZ = 0;
|
private int offsetZ = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new instance
|
* Construct a new instance
|
||||||
*
|
*
|
||||||
|
@ -29,7 +29,6 @@ public abstract class ChunkCoordinator implements Runnable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Cancel the chunk coordinator.
|
* Cancel the chunk coordinator.
|
||||||
*
|
|
||||||
* @since 6.0.10
|
* @since 6.0.10
|
||||||
*/
|
*/
|
||||||
public abstract void cancel();
|
public abstract void cancel();
|
||||||
|
@ -43,10 +43,11 @@ import java.util.function.Consumer;
|
|||||||
|
|
||||||
public abstract class QueueCoordinator {
|
public abstract class QueueCoordinator {
|
||||||
|
|
||||||
private final AtomicBoolean enqueued = new AtomicBoolean();
|
|
||||||
private boolean forceSync = false;
|
private boolean forceSync = false;
|
||||||
@Nullable
|
@Nullable
|
||||||
private Object chunkObject;
|
private Object chunkObject;
|
||||||
|
private final AtomicBoolean enqueued = new AtomicBoolean();
|
||||||
|
|
||||||
@SuppressWarnings({"unused", "FieldCanBeLocal"})
|
@SuppressWarnings({"unused", "FieldCanBeLocal"})
|
||||||
@Inject
|
@Inject
|
||||||
private GlobalBlockQueue blockQueue;
|
private GlobalBlockQueue blockQueue;
|
||||||
@ -66,7 +67,7 @@ public abstract class QueueCoordinator {
|
|||||||
* @param x chunk x coordinate
|
* @param x chunk x coordinate
|
||||||
* @param z chunk z coordinate
|
* @param z chunk z coordinate
|
||||||
* @return a new {@link ZeroedDelegateScopedQueueCoordinator}
|
* @return a new {@link ZeroedDelegateScopedQueueCoordinator}
|
||||||
* @since 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
public ZeroedDelegateScopedQueueCoordinator getForChunk(int x, int z, int minY, int maxY) {
|
public ZeroedDelegateScopedQueueCoordinator getForChunk(int x, int z, int minY, int maxY) {
|
||||||
int bx = x << 4;
|
int bx = x << 4;
|
||||||
|
@ -32,7 +32,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
|||||||
* zero in the x and z directions, i.e. starting from 0,0. An offset of the minimum point of the region will then be applied to
|
* zero in the x and z directions, i.e. starting from 0,0. An offset of the minimum point of the region will then be applied to
|
||||||
* x and z.
|
* x and z.
|
||||||
*
|
*
|
||||||
* @since 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
public class ZeroedDelegateScopedQueueCoordinator extends DelegateQueueCoordinator {
|
public class ZeroedDelegateScopedQueueCoordinator extends DelegateQueueCoordinator {
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ public class ZeroedDelegateScopedQueueCoordinator extends DelegateQueueCoordinat
|
|||||||
/**
|
/**
|
||||||
* Create a new ScopedQueueCoordinator instance that delegates to a given QueueCoordinator. Locations are inclusive.
|
* Create a new ScopedQueueCoordinator instance that delegates to a given QueueCoordinator. Locations are inclusive.
|
||||||
*
|
*
|
||||||
* @since 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
public ZeroedDelegateScopedQueueCoordinator(@Nullable QueueCoordinator parent, @NonNull Location min, @NonNull Location max) {
|
public ZeroedDelegateScopedQueueCoordinator(@Nullable QueueCoordinator parent, @NonNull Location min, @NonNull Location max) {
|
||||||
super(parent);
|
super(parent);
|
||||||
|
@ -36,7 +36,6 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
|||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -93,7 +92,11 @@ public class DefaultProgressSubscriber implements ProgressSubscriber {
|
|||||||
this.actor = actor;
|
this.actor = actor;
|
||||||
this.interval = TaskTime.ms(interval);
|
this.interval = TaskTime.ms(interval);
|
||||||
this.wait = TaskTime.ms(wait);
|
this.wait = TaskTime.ms(wait);
|
||||||
this.caption = Objects.requireNonNullElseGet(caption, () -> TranslatableCaption.of("working.progress"));
|
if (caption == null) {
|
||||||
|
this.caption = TranslatableCaption.of("working.progress");
|
||||||
|
} else {
|
||||||
|
this.caption = caption;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -24,23 +24,34 @@ import com.plotsquared.core.plot.PlotId;
|
|||||||
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;
|
||||||
|
|
||||||
/**
|
|
||||||
* Crate a new auto query
|
|
||||||
*
|
|
||||||
* @param player Player to claim for
|
|
||||||
* @param startId Plot ID to start searching from
|
|
||||||
* @param sizeX Number of plots along the X axis
|
|
||||||
* @param sizeZ Number of plots along the Z axis
|
|
||||||
* @param plotArea Plot area to search in
|
|
||||||
*/
|
|
||||||
public record AutoQuery(
|
public record AutoQuery(
|
||||||
@NonNull PlotPlayer<?> player,
|
PlotPlayer<?> player,
|
||||||
@Nullable PlotId startId,
|
PlotId startId,
|
||||||
int sizeX,
|
int sizeX,
|
||||||
int sizeZ,
|
int sizeZ,
|
||||||
@NonNull PlotArea plotArea
|
PlotArea plotArea
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Crate a new auto query
|
||||||
|
*
|
||||||
|
* @param player Player to claim for
|
||||||
|
* @param startId Plot ID to start searching from
|
||||||
|
* @param sizeX Number of plots along the X axis
|
||||||
|
* @param sizeZ Number of plots along the Z axis
|
||||||
|
* @param plotArea Plot area to search in
|
||||||
|
*/
|
||||||
|
public AutoQuery(
|
||||||
|
final @NonNull PlotPlayer<?> player, final @Nullable PlotId startId,
|
||||||
|
final int sizeX, final int sizeZ, final @NonNull PlotArea plotArea
|
||||||
|
) {
|
||||||
|
this.player = player;
|
||||||
|
this.startId = startId;
|
||||||
|
this.sizeX = sizeX;
|
||||||
|
this.sizeZ = sizeZ;
|
||||||
|
this.plotArea = plotArea;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the player that the plots are meant for
|
* Get the player that the plots are meant for
|
||||||
*
|
*
|
||||||
|
@ -25,17 +25,11 @@ import com.plotsquared.core.plot.PlotAreaTerrainType;
|
|||||||
import com.plotsquared.core.plot.PlotAreaType;
|
import com.plotsquared.core.plot.PlotAreaType;
|
||||||
import com.plotsquared.core.plot.PlotId;
|
import com.plotsquared.core.plot.PlotId;
|
||||||
import com.plotsquared.core.util.SetupUtils;
|
import com.plotsquared.core.util.SetupUtils;
|
||||||
import org.jetbrains.annotations.Contract;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
public class PlotAreaBuilder {
|
public class PlotAreaBuilder {
|
||||||
|
|
||||||
private String generatorName;
|
private String generatorName;
|
||||||
private String plotManager;
|
private String plotManager;
|
||||||
@Nullable
|
|
||||||
private PlotAreaType plotAreaType;
|
private PlotAreaType plotAreaType;
|
||||||
private PlotAreaTerrainType terrainType;
|
private PlotAreaTerrainType terrainType;
|
||||||
private String worldName;
|
private String worldName;
|
||||||
@ -91,10 +85,8 @@ public class PlotAreaBuilder {
|
|||||||
return this.plotManager;
|
return this.plotManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Contract(" -> !null")
|
|
||||||
public PlotAreaType plotAreaType() {
|
public PlotAreaType plotAreaType() {
|
||||||
return Objects.requireNonNullElse(this.plotAreaType, PlotAreaType.NORMAL);
|
return this.plotAreaType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PlotAreaTerrainType terrainType() {
|
public PlotAreaTerrainType terrainType() {
|
||||||
@ -135,8 +127,7 @@ public class PlotAreaBuilder {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PlotAreaBuilder plotAreaType(@NotNull PlotAreaType plotAreaType) {
|
public PlotAreaBuilder plotAreaType(PlotAreaType plotAreaType) {
|
||||||
Objects.requireNonNull(plotAreaType, "PlotAreaType must not be null");
|
|
||||||
this.plotAreaType = plotAreaType;
|
this.plotAreaType = plotAreaType;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -65,9 +65,9 @@ public final class LockRepository {
|
|||||||
* @param runnable Action to run when the lock is available
|
* @param runnable Action to run when the lock is available
|
||||||
*/
|
*/
|
||||||
public void useLock(final @NonNull LockKey key, final @NonNull Runnable runnable) {
|
public void useLock(final @NonNull LockKey key, final @NonNull Runnable runnable) {
|
||||||
try (LockAccess ignored = lock(key)) {
|
try (LockAccess ignored = lock(key)) {
|
||||||
runnable.run();
|
runnable.run();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -31,6 +31,8 @@ import com.sk89q.worldedit.world.registry.LegacyMapper;
|
|||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link BlockState} related utility methods
|
* {@link BlockState} related utility methods
|
||||||
*/
|
*/
|
||||||
@ -107,4 +109,34 @@ public final class BlockUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a comma delimited list of block states
|
||||||
|
*
|
||||||
|
* @param commaDelimited List of block states
|
||||||
|
* @return Parsed block states
|
||||||
|
*/
|
||||||
|
public static @NonNull BlockState[] parse(final @NonNull String commaDelimited) {
|
||||||
|
final String[] split = commaDelimited.split(",(?![^\\(\\[]*[\\]\\)])");
|
||||||
|
final BlockState[] result = new BlockState[split.length];
|
||||||
|
for (int i = 0; i < split.length; i++) {
|
||||||
|
result[i] = get(split[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deserialize a serialized {@link BlockState}
|
||||||
|
*
|
||||||
|
* @param map Serialized block state
|
||||||
|
* @return Deserialized block state, or {@code null} if the map is
|
||||||
|
* not a properly serialized block state
|
||||||
|
*/
|
||||||
|
public static @Nullable BlockState deserialize(final @NonNull Map<String, Object> map) {
|
||||||
|
if (map.containsKey("material")) {
|
||||||
|
final Object object = map.get("material");
|
||||||
|
return get(object.toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ public abstract class ChunkManager {
|
|||||||
private static final Map<BlockVector2, RunnableVal<ZeroedDelegateScopedQueueCoordinator>> addChunks = new ConcurrentHashMap<>();
|
private static final Map<BlockVector2, RunnableVal<ZeroedDelegateScopedQueueCoordinator>> addChunks = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
public static void setChunkInPlotArea(
|
public static void setChunkInPlotArea(
|
||||||
RunnableVal<ZeroedDelegateScopedQueueCoordinator> force,
|
RunnableVal<ZeroedDelegateScopedQueueCoordinator> force,
|
||||||
@ -76,7 +76,7 @@ public abstract class ChunkManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
public static boolean preProcessChunk(BlockVector2 loc, ZeroedDelegateScopedQueueCoordinator queue) {
|
public static boolean preProcessChunk(BlockVector2 loc, ZeroedDelegateScopedQueueCoordinator queue) {
|
||||||
final RunnableVal<ZeroedDelegateScopedQueueCoordinator> forceChunk = forceChunks.get(loc);
|
final RunnableVal<ZeroedDelegateScopedQueueCoordinator> forceChunk = forceChunks.get(loc);
|
||||||
@ -89,7 +89,7 @@ public abstract class ChunkManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
public static boolean postProcessChunk(BlockVector2 loc, ZeroedDelegateScopedQueueCoordinator queue) {
|
public static boolean postProcessChunk(BlockVector2 loc, ZeroedDelegateScopedQueueCoordinator queue) {
|
||||||
final RunnableVal<ZeroedDelegateScopedQueueCoordinator> addChunk = forceChunks.get(loc);
|
final RunnableVal<ZeroedDelegateScopedQueueCoordinator> addChunk = forceChunks.get(loc);
|
||||||
|
@ -18,6 +18,10 @@
|
|||||||
*/
|
*/
|
||||||
package com.plotsquared.core.util;
|
package com.plotsquared.core.util;
|
||||||
|
|
||||||
|
import com.plotsquared.core.location.Location;
|
||||||
|
import com.sk89q.worldedit.math.BlockVector2;
|
||||||
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This cache is used for world generation and just saves a bit of calculation time when checking if something is in the plot area.
|
* This cache is used for world generation and just saves a bit of calculation time when checking if something is in the plot area.
|
||||||
*/
|
*/
|
||||||
@ -103,4 +107,22 @@ public class ChunkUtil {
|
|||||||
return z_loc[j];
|
return z_loc[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the region pos1-pos2 contains the chunk
|
||||||
|
*
|
||||||
|
* @param pos1 Region minimum point
|
||||||
|
* @param pos2 Region maximum point
|
||||||
|
* @param chunk BlockVector2 of chunk coordinates
|
||||||
|
* @return {@code true} if the region pos1-pos2 contains the chunk
|
||||||
|
*/
|
||||||
|
public static boolean isWholeChunk(@NonNull Location pos1, @NonNull Location pos2, @NonNull BlockVector2 chunk) {
|
||||||
|
int x1 = pos1.getX();
|
||||||
|
int z1 = pos1.getZ();
|
||||||
|
int x2 = pos2.getX();
|
||||||
|
int z2 = pos2.getZ();
|
||||||
|
int cx = chunk.getX() << 4;
|
||||||
|
int cz = chunk.getZ() << 4;
|
||||||
|
return cx > x1 && cz > z1 && cx < x2 && cz < z2;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ import java.util.Collection;
|
|||||||
/**
|
/**
|
||||||
* A utility class for modifying components.
|
* A utility class for modifying components.
|
||||||
*
|
*
|
||||||
* @since 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
public class ComponentHelper {
|
public class ComponentHelper {
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ public class ComponentHelper {
|
|||||||
* @param components The components to join
|
* @param components The components to join
|
||||||
* @param delimiter The delimiter to use between the components
|
* @param delimiter The delimiter to use between the components
|
||||||
* @return The joined components
|
* @return The joined components
|
||||||
* @since 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
public static ComponentLike join(Collection<? extends ComponentLike> components, Component delimiter) {
|
public static ComponentLike join(Collection<? extends ComponentLike> components, Component delimiter) {
|
||||||
return join(components.toArray(ComponentLike[]::new), delimiter);
|
return join(components.toArray(ComponentLike[]::new), delimiter);
|
||||||
@ -49,7 +49,7 @@ public class ComponentHelper {
|
|||||||
* @param components The components to join
|
* @param components The components to join
|
||||||
* @param delimiter The delimiter to use between the components
|
* @param delimiter The delimiter to use between the components
|
||||||
* @return The joined components
|
* @return The joined components
|
||||||
* @since 7.0.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
public static Component join(ComponentLike[] components, Component delimiter) {
|
public static Component join(ComponentLike[] components, Component delimiter) {
|
||||||
TextComponent.Builder builder = Component.text();
|
TextComponent.Builder builder = Component.text();
|
||||||
|
@ -359,13 +359,11 @@ public class EventDispatcher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TELEPORT_OBJECT -> {
|
case TELEPORT_OBJECT:
|
||||||
return false;
|
return false;
|
||||||
}
|
case READ:
|
||||||
case READ -> {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
case INTERACT_BLOCK: {
|
||||||
case INTERACT_BLOCK -> {
|
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
final List<BlockTypeWrapper> use = area.getRoadFlag(UseFlag.class);
|
final List<BlockTypeWrapper> use = area.getRoadFlag(UseFlag.class);
|
||||||
for (final BlockTypeWrapper blockTypeWrapper : use) {
|
for (final BlockTypeWrapper blockTypeWrapper : use) {
|
||||||
@ -400,7 +398,7 @@ public class EventDispatcher {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
case TRIGGER_PHYSICAL -> {
|
case TRIGGER_PHYSICAL: {
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
final List<BlockTypeWrapper> use = area.getRoadFlag(UseFlag.class);
|
final List<BlockTypeWrapper> use = area.getRoadFlag(UseFlag.class);
|
||||||
for (final BlockTypeWrapper blockTypeWrapper : use) {
|
for (final BlockTypeWrapper blockTypeWrapper : use) {
|
||||||
@ -432,7 +430,7 @@ public class EventDispatcher {
|
|||||||
false
|
false
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
case SPAWN_MOB -> {
|
case SPAWN_MOB: {
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
return player.hasPermission(
|
return player.hasPermission(
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString(), notifyPerms
|
Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString(), notifyPerms
|
||||||
@ -474,7 +472,7 @@ public class EventDispatcher {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
case PLACE_MISC -> {
|
case PLACE_MISC: {
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
return player.hasPermission(
|
return player.hasPermission(
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString(), notifyPerms
|
Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString(), notifyPerms
|
||||||
@ -516,7 +514,7 @@ public class EventDispatcher {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
case PLACE_VEHICLE -> {
|
case PLACE_VEHICLE:
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
return player.hasPermission(
|
return player.hasPermission(
|
||||||
Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString(), notifyPerms
|
Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString(), notifyPerms
|
||||||
@ -528,9 +526,8 @@ public class EventDispatcher {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
return plot.getFlag(VehiclePlaceFlag.class);
|
return plot.getFlag(VehiclePlaceFlag.class);
|
||||||
}
|
default:
|
||||||
default -> {
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user