mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2025-07-04 14:44:43 +02:00
Compare commits
83 Commits
refactor/v
...
6.7.0
Author | SHA1 | Date | |
---|---|---|---|
9db7791835 | |||
f49ddb819d | |||
d71c62771e | |||
a6aaa9538f | |||
0974fb2834 | |||
8982b33b6c | |||
a7b3b3b7df | |||
888bb20e78 | |||
b11bb6fa22 | |||
e5764b958d | |||
bfe3141ff1 | |||
73c82deeb0 | |||
38682ecff6 | |||
6a54dc7eff | |||
8454c29c91 | |||
b2c9311a47 | |||
c4aa497a2b | |||
c13f544390 | |||
c28177d6af | |||
8a80f252cf | |||
93571c72d1 | |||
6fd7379221 | |||
dc5c80d812 | |||
96e9a61e7c | |||
b9bd9b81e6 | |||
ec77812879 | |||
efc2083798 | |||
3a6f845c01 | |||
7efd42ae45 | |||
f43f4cbf5d | |||
104cc4b7a4 | |||
218be43143 | |||
308dba5601 | |||
5f233bb5d1 | |||
5e188d114f | |||
660e05d27f | |||
4c0ad148bf | |||
5c7bfb988c | |||
b46f486680 | |||
05797d0c78 | |||
36ef2cf9ba | |||
26ec31a012 | |||
fd4a542062 | |||
dc13f2565f | |||
9f632af0ae | |||
d698c6a1e5 | |||
40e1bd9897 | |||
75f31c5bf6 | |||
954c813cef | |||
05e055e9cf | |||
2ea21c150f | |||
c2fd4edad5 | |||
78b8696778 | |||
e653961385 | |||
b21d12fd52 | |||
7557df96c7 | |||
61797c3aff | |||
78125ff1e2 | |||
d7c8715b25 | |||
34f005c244 | |||
6fbd1376ca | |||
951767dc64 | |||
16928b05f1 | |||
fff14b05cb | |||
e619c867e9 | |||
543284e016 | |||
0d78ba5f35 | |||
9ba2b62fc2 | |||
f10ee27fdd | |||
3278ce1fe9 | |||
fefb0334bd | |||
d06a827e31 | |||
10bb520f3a | |||
126aa53b61 | |||
ac71046feb | |||
7c290e6bd0 | |||
4d297cc829 | |||
5ab410a5c5 | |||
1f28bac955 | |||
92c54de5e9 | |||
ff5d79699d | |||
a0594c19ee | |||
da41c136fe |
3
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
3
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -7,7 +7,7 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
Thanks for taking the time to fill out this bug report for PlotSquared! Fill out the following form to your best ability to help us fix the problem.
|
Thanks for taking the time to fill out this bug report for PlotSquared! Fill out the following form to your best ability to help us fix the problem.
|
||||||
Only use this if you're absolutely sure that you found a bug and can reproduce it. For anything else, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://github.com/IntellectualSites/PlotSquared-Documentation/wiki).
|
Only use this if you're absolutely sure that you found a bug and can reproduce it. For anything else, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.github.io/plotsquared-documentation/).
|
||||||
Do NOT use the public issue tracker to report security vulnerabilities! They are disclosed using [this](https://forms.gle/btgdRn9yhGtzEiGW8) form!
|
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
|
||||||
@ -27,6 +27,7 @@ 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.18.2'
|
||||||
- '1.18.1'
|
- '1.18.1'
|
||||||
- '1.18'
|
- '1.18'
|
||||||
- '1.17.1'
|
- '1.17.1'
|
||||||
|
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@ -4,5 +4,5 @@ contact_links:
|
|||||||
url: https://discord.gg/intellectualsites
|
url: https://discord.gg/intellectualsites
|
||||||
about: Our support Discord, please ask questions and seek support here.
|
about: Our support Discord, please ask questions and seek support here.
|
||||||
- name: PlotSquared Wiki
|
- name: PlotSquared Wiki
|
||||||
url: https://github.com/IntellectualSites/PlotSquared-Documentation/wiki
|
url: https://intellectualsites.github.io/plotsquared-documentation/
|
||||||
about: Take a look at the wiki page for instructions how to setup PlotSquared and use its commands.
|
about: Take a look at the wiki page for instructions how to setup PlotSquared and use its commands.
|
||||||
|
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@ -7,7 +7,7 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
Thanks for taking the time to fill out this feature request for PlotSquared! Fill out the following form to your best ability to help us understand your feature request and greately improve the change of it getting added.
|
Thanks for taking the time to fill out this feature request for PlotSquared! Fill out the following form to your best ability to help us understand your feature request and greately improve the change of it getting added.
|
||||||
For anything else than a feature request, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://github.com/IntellectualSites/PlotSquared-Documentation/wiki).
|
For anything else than a feature request, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.github.io/plotsquared-documentation/).
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
|
7
.github/workflows/build.yml
vendored
7
.github/workflows/build.yml
vendored
@ -4,14 +4,15 @@ on: [ pull_request, push ]
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v2.4.0
|
uses: actions/checkout@v3
|
||||||
- name: Validate Gradle Wrapper"
|
- name: Validate Gradle Wrapper"
|
||||||
uses: gradle/wrapper-validation-action@v1.0.4
|
uses: gradle/wrapper-validation-action@v1
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v2.5.0
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: temurin
|
distribution: temurin
|
||||||
java-version: 17
|
java-version: 17
|
||||||
|
37
.github/workflows/codeql.yml
vendored
Normal file
37
.github/workflows/codeql.yml
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
name: "CodeQL"
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ v6 ]
|
||||||
|
pull_request:
|
||||||
|
# The branches below must be a subset of the branches above
|
||||||
|
branches: [ v6 ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
name: Analyze
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
language: [ 'java' ]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Initialize CodeQL
|
||||||
|
uses: github/codeql-action/init@v2
|
||||||
|
with:
|
||||||
|
languages: ${{ matrix.language }}
|
||||||
|
|
||||||
|
- name: Autobuild
|
||||||
|
uses: github/codeql-action/autobuild@v2
|
||||||
|
|
||||||
|
- name: Perform CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@v2
|
20
.github/workflows/rebase.yml
vendored
20
.github/workflows/rebase.yml
vendored
@ -1,20 +0,0 @@
|
|||||||
name: Rebase Pull Request
|
|
||||||
on:
|
|
||||||
issue_comment:
|
|
||||||
types: [created]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
rebase:
|
|
||||||
name: Rebase
|
|
||||||
if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase') && github.event.comment.author_association == 'MEMBER'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout Repository
|
|
||||||
uses: actions/checkout@v2.4.0
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.REBASE_TOKEN }}
|
|
||||||
fetch-depth: 0
|
|
||||||
- name: Automatic Rebase
|
|
||||||
uses: cirrus-actions/rebase@1.5
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.REBASE_TOKEN }}
|
|
3
.github/workflows/release-drafter.yml
vendored
3
.github/workflows/release-drafter.yml
vendored
@ -11,8 +11,9 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
update_release_draft:
|
update_release_draft:
|
||||||
|
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: release-drafter/release-drafter@v5.17.6
|
- uses: release-drafter/release-drafter@v5.19.0
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -41,7 +41,8 @@ hs_err_pid*
|
|||||||
*.iml
|
*.iml
|
||||||
|
|
||||||
## Directory-based project format:
|
## Directory-based project format:
|
||||||
.idea/
|
/.idea/*
|
||||||
|
!/.idea/icon.svg
|
||||||
# if you remove the above rule, at least ignore the following:
|
# if you remove the above rule, at least ignore the following:
|
||||||
|
|
||||||
# User-specific stuff:
|
# User-specific stuff:
|
||||||
@ -74,9 +75,6 @@ hs_err_pid*
|
|||||||
# IntelliJ
|
# IntelliJ
|
||||||
/out/
|
/out/
|
||||||
|
|
||||||
# mpeltonen/sbt-idea plugin
|
|
||||||
.idea_modules/
|
|
||||||
|
|
||||||
# JIRA plugin
|
# JIRA plugin
|
||||||
atlassian-ide-plugin.xml
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
49
.idea/icon.svg
generated
Normal file
49
.idea/icon.svg
generated
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4000 3333.3333" height="3333.3333" width="4000" xml:space="preserve" id="svg2" version="1.1">
|
||||||
|
<metadata id="metadata8">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs id="defs6">
|
||||||
|
<clipPath id="clipPath18" clipPathUnits="userSpaceOnUse">
|
||||||
|
<path id="path16" d="M 0,2500 H 3000 V 0 H 0 Z" />
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
<g transform="matrix(1.3333333,0,0,-1.3333333,0,3333.3333)" id="g10">
|
||||||
|
<g id="g12">
|
||||||
|
<g clip-path="url(#clipPath18)" id="g14">
|
||||||
|
<g transform="translate(1486.1511,2242.6453)" id="g20">
|
||||||
|
<path id="path22" style="fill:#2b3f56;fill-opacity:1;fill-rule:nonzero;stroke:none" 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" />
|
||||||
|
</g>
|
||||||
|
<g transform="translate(1201.7948,1741.5303)" id="g24">
|
||||||
|
<path id="path26" style="fill:#5693ce;fill-opacity:1;fill-rule:nonzero;stroke:none" 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" />
|
||||||
|
</g>
|
||||||
|
<g transform="translate(919.3342,1429.7462)" id="g28">
|
||||||
|
<path id="path30" style="fill:#5693ce;fill-opacity:1;fill-rule:nonzero;stroke:none" 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" />
|
||||||
|
</g>
|
||||||
|
<g transform="translate(1649.134,1700.6166)" id="g32">
|
||||||
|
<path id="path34" style="fill:#feeeef;fill-opacity:1;fill-rule:nonzero;stroke:none" 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" />
|
||||||
|
</g>
|
||||||
|
<g transform="translate(1262.7214,1613.126)" id="g36">
|
||||||
|
<path id="path38" style="fill:#feeeef;fill-opacity:1;fill-rule:nonzero;stroke:none" 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" />
|
||||||
|
</g>
|
||||||
|
<g transform="translate(1966.3174,1675.6364)" id="g40">
|
||||||
|
<path id="path42" style="fill:#2a3746;fill-opacity:1;fill-rule:nonzero;stroke:none" 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" />
|
||||||
|
</g>
|
||||||
|
<g transform="translate(1499.3971,1669.1094)" id="g44">
|
||||||
|
<path id="path46" style="fill:#3378bc;fill-opacity:1;fill-rule:nonzero;stroke:none" 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" />
|
||||||
|
</g>
|
||||||
|
<g transform="translate(1748.0469,1601.6797)" id="g48">
|
||||||
|
<path id="path50" style="fill:#3378bc;fill-opacity:1;fill-rule:nonzero;stroke:none" 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" />
|
||||||
|
</g>
|
||||||
|
<g transform="translate(1262.7214,1613.126)" id="g52">
|
||||||
|
<path id="path54" style="fill:#3378bc;fill-opacity:1;fill-rule:nonzero;stroke:none" 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" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 10 KiB |
13
.whitesource
13
.whitesource
@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"scanSettings": {
|
|
||||||
"baseBranches": ["v6"]
|
|
||||||
},
|
|
||||||
"checkRunSettings": {
|
|
||||||
"vulnerableCheckRunConclusionLevel": "success",
|
|
||||||
"displayMode": "diff"
|
|
||||||
},
|
|
||||||
"issueSettings": {
|
|
||||||
"minSeverityLevel": "LOW"
|
|
||||||
},
|
|
||||||
"enableRenovate": "true"
|
|
||||||
}
|
|
@ -83,7 +83,7 @@ tasks.named<ShadowJar>("shadowJar") {
|
|||||||
relocate("org.jetbrains", "com.plotsquared.core.annotations")
|
relocate("org.jetbrains", "com.plotsquared.core.annotations")
|
||||||
relocate("org.intellij.lang", "com.plotsquared.core.intellij.annotations")
|
relocate("org.intellij.lang", "com.plotsquared.core.intellij.annotations")
|
||||||
relocate("javax.annotation", "com.plotsquared.core.annotation")
|
relocate("javax.annotation", "com.plotsquared.core.annotation")
|
||||||
relocate("com.google.code.findbugs", "com.plotsquared.core.findbugs")
|
relocate("com.github.spotbugs", "com.plotsquared.core.spotbugs")
|
||||||
relocate("javax.inject", "com.plotsquared.core.annotation.inject")
|
relocate("javax.inject", "com.plotsquared.core.annotation.inject")
|
||||||
|
|
||||||
// Get rid of all the libs which are 100% unused.
|
// Get rid of all the libs which are 100% unused.
|
||||||
@ -95,11 +95,11 @@ tasks.named<ShadowJar>("shadowJar") {
|
|||||||
tasks {
|
tasks {
|
||||||
withType<Javadoc> {
|
withType<Javadoc> {
|
||||||
val opt = options as StandardJavadocDocletOptions
|
val opt = options as StandardJavadocDocletOptions
|
||||||
opt.links("https://papermc.io/javadocs/paper/1.17/")
|
opt.links("https://papermc.io/javadocs/paper/1.18/")
|
||||||
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/7.2.7/")
|
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/7.2.7/")
|
opt.links("https://javadoc.io/doc/com.plotsquared/PlotSquared-Core/latest/")
|
||||||
opt.links("https://jd.adventure.kyori.net/api/4.9.3/")
|
opt.links("https://jd.adventure.kyori.net/api/" + libs.adventure.get().versionConstraint.toString())
|
||||||
opt.links("https://google.github.io/guice/api-docs/5.0.1/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/")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -238,6 +238,16 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
return this.version;
|
return this.version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int versionMinHeight() {
|
||||||
|
return serverVersion()[1] >= 18 ? -64 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int versionMaxHeight() {
|
||||||
|
return serverVersion()[1] >= 18 ? 319 : 255;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NonNull String serverImplementation() {
|
public @NonNull String serverImplementation() {
|
||||||
return Bukkit.getVersion();
|
return Bukkit.getVersion();
|
||||||
|
@ -65,7 +65,10 @@ final class BlockStatePopulator extends BlockPopulator {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final ChunkWrapper wrap = new ChunkWrapper(area.getWorldName(), source.getX(), source.getZ());
|
final ChunkWrapper wrap = new ChunkWrapper(area.getWorldName(), source.getX(), source.getZ());
|
||||||
final ScopedQueueCoordinator chunk = this.queue.getForChunk(wrap.x, wrap.z);
|
final ScopedQueueCoordinator chunk = this.queue.getForChunk(wrap.x, wrap.z,
|
||||||
|
com.plotsquared.bukkit.util.BukkitWorld.getMinWorldHeight(world),
|
||||||
|
com.plotsquared.bukkit.util.BukkitWorld.getMaxWorldHeight(world) - 1
|
||||||
|
);
|
||||||
if (this.plotGenerator.populateChunk(chunk, area)) {
|
if (this.plotGenerator.populateChunk(chunk, area)) {
|
||||||
this.queue.enqueue();
|
this.queue.enqueue();
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ package com.plotsquared.bukkit.generator;
|
|||||||
|
|
||||||
import com.plotsquared.bukkit.queue.GenChunk;
|
import com.plotsquared.bukkit.queue.GenChunk;
|
||||||
import com.plotsquared.bukkit.util.BukkitUtil;
|
import com.plotsquared.bukkit.util.BukkitUtil;
|
||||||
|
import com.plotsquared.bukkit.util.BukkitWorld;
|
||||||
import com.plotsquared.core.PlotSquared;
|
import com.plotsquared.core.PlotSquared;
|
||||||
import com.plotsquared.core.generator.GeneratorWrapper;
|
import com.plotsquared.core.generator.GeneratorWrapper;
|
||||||
import com.plotsquared.core.generator.IndependentPlotGenerator;
|
import com.plotsquared.core.generator.IndependentPlotGenerator;
|
||||||
@ -159,12 +160,14 @@ public class BukkitPlotGenerator extends ChunkGenerator
|
|||||||
@NonNull BiomeGrid biome
|
@NonNull BiomeGrid biome
|
||||||
) {
|
) {
|
||||||
|
|
||||||
GenChunk result = new GenChunk();
|
int minY = BukkitWorld.getMinWorldHeight(world);
|
||||||
|
int maxY = BukkitWorld.getMaxWorldHeight(world);
|
||||||
|
GenChunk result = new GenChunk(minY, maxY);
|
||||||
if (this.getPlotGenerator() instanceof SingleWorldGenerator) {
|
if (this.getPlotGenerator() instanceof SingleWorldGenerator) {
|
||||||
if (result.getChunkData() != null) {
|
if (result.getChunkData() != null) {
|
||||||
for (int chunkX = 0; chunkX < 16; chunkX++) {
|
for (int chunkX = 0; chunkX < 16; chunkX++) {
|
||||||
for (int chunkZ = 0; chunkZ < 16; chunkZ++) {
|
for (int chunkZ = 0; chunkZ < 16; chunkZ++) {
|
||||||
for (int y = 0; y < world.getMaxHeight(); y++) {
|
for (int y = minY; y < maxY; y++) {
|
||||||
biome.setBiome(chunkX, y, chunkZ, Biome.PLAINS);
|
biome.setBiome(chunkX, y, chunkZ, Biome.PLAINS);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -74,6 +74,7 @@ import org.bukkit.GameMode;
|
|||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.block.BlockState;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.Fireball;
|
import org.bukkit.entity.Fireball;
|
||||||
@ -92,6 +93,7 @@ import org.bukkit.event.block.BlockFormEvent;
|
|||||||
import org.bukkit.event.block.BlockFromToEvent;
|
import org.bukkit.event.block.BlockFromToEvent;
|
||||||
import org.bukkit.event.block.BlockGrowEvent;
|
import org.bukkit.event.block.BlockGrowEvent;
|
||||||
import org.bukkit.event.block.BlockIgniteEvent;
|
import org.bukkit.event.block.BlockIgniteEvent;
|
||||||
|
import org.bukkit.event.block.BlockMultiPlaceEvent;
|
||||||
import org.bukkit.event.block.BlockPhysicsEvent;
|
import org.bukkit.event.block.BlockPhysicsEvent;
|
||||||
import org.bukkit.event.block.BlockPistonExtendEvent;
|
import org.bukkit.event.block.BlockPistonExtendEvent;
|
||||||
import org.bukkit.event.block.BlockPistonRetractEvent;
|
import org.bukkit.event.block.BlockPistonRetractEvent;
|
||||||
@ -166,7 +168,7 @@ public class BlockEventListener implements Listener {
|
|||||||
}
|
}
|
||||||
if (Settings.Redstone.DISABLE_OFFLINE) {
|
if (Settings.Redstone.DISABLE_OFFLINE) {
|
||||||
boolean disable = false;
|
boolean disable = false;
|
||||||
if (!plot.getOwner().equals(DBFunc.SERVER)) {
|
if (!DBFunc.SERVER.equals(plot.getOwner())) {
|
||||||
if (plot.isMerged()) {
|
if (plot.isMerged()) {
|
||||||
disable = true;
|
disable = true;
|
||||||
for (UUID owner : plot.getOwners()) {
|
for (UUID owner : plot.getOwners()) {
|
||||||
@ -277,7 +279,7 @@ public class BlockEventListener implements Listener {
|
|||||||
BukkitPlayer pp = BukkitUtil.adapt(player);
|
BukkitPlayer pp = BukkitUtil.adapt(player);
|
||||||
Plot plot = area.getPlot(location);
|
Plot plot = area.getPlot(location);
|
||||||
if (plot != null) {
|
if (plot != null) {
|
||||||
if ((location.getY() > area.getMaxBuildHeight() || location.getY() < area
|
if ((location.getY() >= area.getMaxBuildHeight() || location.getY() < area
|
||||||
.getMinBuildHeight()) && !Permissions
|
.getMinBuildHeight()) && !Permissions
|
||||||
.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
|
.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
@ -352,7 +354,8 @@ public class BlockEventListener implements Listener {
|
|||||||
Plot plot = area.getPlot(location);
|
Plot plot = area.getPlot(location);
|
||||||
if (plot != null) {
|
if (plot != null) {
|
||||||
BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
|
BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
|
||||||
if (event.getBlock().getY() == 0) {
|
// == rather than <= as we only care about the "ground level" not being destroyed
|
||||||
|
if (event.getBlock().getY() == area.getMinGenHeight()) {
|
||||||
if (!Permissions
|
if (!Permissions
|
||||||
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_GROUNDLEVEL)) {
|
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_GROUNDLEVEL)) {
|
||||||
plotPlayer.sendMessage(
|
plotPlayer.sendMessage(
|
||||||
@ -362,7 +365,7 @@ public class BlockEventListener implements Listener {
|
|||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if ((location.getY() > area.getMaxBuildHeight() || location.getY() < area
|
} else if ((location.getY() >= area.getMaxBuildHeight() || location.getY() < area
|
||||||
.getMinBuildHeight()) && !Permissions
|
.getMinBuildHeight()) && !Permissions
|
||||||
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
|
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
@ -647,7 +650,8 @@ public class BlockEventListener implements Listener {
|
|||||||
event.getBlock().breakNaturally();
|
event.getBlock().breakNaturally();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (location.getY() == 0) {
|
// == rather than <= as we only care about the "ground level" not being destroyed
|
||||||
|
if (location.getY() == area.getMinGenHeight()) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1208,4 +1212,51 @@ public class BlockEventListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BlockMultiPlaceEvent is called unrelated to the BlockPlaceEvent itself and therefore doesn't respect the cancellation.
|
||||||
|
*/
|
||||||
|
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
|
||||||
|
public void onBlockMultiPlace(BlockMultiPlaceEvent event) {
|
||||||
|
// Check if the generic block place event would be cancelled
|
||||||
|
blockCreate(event);
|
||||||
|
if (event.isCancelled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
BukkitPlayer pp = BukkitUtil.adapt(event.getPlayer());
|
||||||
|
Location placedLocation = BukkitUtil.adapt(event.getBlockReplacedState().getLocation());
|
||||||
|
PlotArea area = placedLocation.getPlotArea();
|
||||||
|
if (area == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Plot plot = placedLocation.getPlot();
|
||||||
|
|
||||||
|
for (final BlockState state : event.getReplacedBlockStates()) {
|
||||||
|
Location currentLocation = BukkitUtil.adapt(state.getLocation());
|
||||||
|
if (!Permissions.hasPermission(
|
||||||
|
pp,
|
||||||
|
Permission.PERMISSION_ADMIN_BUILD_ROAD
|
||||||
|
) && !(Objects.equals(currentLocation.getPlot(), plot))) {
|
||||||
|
pp.sendMessage(
|
||||||
|
TranslatableCaption.of("permission.no_permission_event"),
|
||||||
|
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD))
|
||||||
|
);
|
||||||
|
event.setCancelled(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (currentLocation.getY() >= area.getMaxBuildHeight() || currentLocation.getY() < area.getMinBuildHeight()) {
|
||||||
|
pp.sendMessage(
|
||||||
|
TranslatableCaption.of("height.height_limit"),
|
||||||
|
Template.of("minHeight", String.valueOf(area.getMinBuildHeight())),
|
||||||
|
Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight()))
|
||||||
|
);
|
||||||
|
event.setCancelled(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,7 @@ import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
|||||||
import io.papermc.lib.PaperLib;
|
import io.papermc.lib.PaperLib;
|
||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.entity.ArmorStand;
|
import org.bukkit.entity.ArmorStand;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
@ -191,8 +192,32 @@ public class EntitySpawnListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onTeleport(EntityTeleportEvent event) {
|
public void onTeleport(EntityTeleportEvent event) {
|
||||||
Entity ent = event.getEntity();
|
Entity entity = event.getEntity();
|
||||||
if (ent instanceof Vehicle || ent instanceof ArmorStand) {
|
Entity fromLocation = event.getEntity();
|
||||||
|
Block toLocation = event.getTo().getBlock();
|
||||||
|
final Location fromLocLocation = BukkitUtil.adapt(fromLocation.getLocation());
|
||||||
|
final PlotArea fromArea = fromLocLocation.getPlotArea();
|
||||||
|
Location toLocLocation = BukkitUtil.adapt(toLocation.getLocation());
|
||||||
|
PlotArea toArea = toLocLocation.getPlotArea();
|
||||||
|
|
||||||
|
if (toArea == null) {
|
||||||
|
if (fromLocation.getType() == EntityType.SHULKER && fromArea != null) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Plot toPlot = toArea.getOwnedPlot(toLocLocation);
|
||||||
|
if (fromLocation.getType() == EntityType.SHULKER && fromArea != null) {
|
||||||
|
final Plot fromPlot = fromArea.getOwnedPlot(fromLocLocation);
|
||||||
|
|
||||||
|
if (fromPlot != null || toPlot != null) {
|
||||||
|
if ((fromPlot == null || !fromPlot.equals(toPlot)) && (toPlot == null || !toPlot.equals(fromPlot))) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (entity instanceof Vehicle || entity instanceof ArmorStand) {
|
||||||
testNether(event.getEntity());
|
testNether(event.getEntity());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,6 +44,7 @@ import com.plotsquared.core.player.PlotPlayer;
|
|||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.plot.PlotArea;
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
||||||
|
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.Permissions;
|
import com.plotsquared.core.util.Permissions;
|
||||||
import net.kyori.adventure.text.minimessage.Template;
|
import net.kyori.adventure.text.minimessage.Template;
|
||||||
@ -352,13 +353,15 @@ public class PaperListener implements Listener {
|
|||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
} else if (!plot.isAdded(pp.getUUID())) {
|
} else if (!plot.isAdded(pp.getUUID())) {
|
||||||
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
|
if (!plot.getFlag(ProjectilesFlag.class)) {
|
||||||
pp.sendMessage(
|
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
|
||||||
TranslatableCaption.of("permission.no_permission_event"),
|
pp.sendMessage(
|
||||||
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER))
|
TranslatableCaption.of("permission.no_permission_event"),
|
||||||
);
|
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER))
|
||||||
entity.remove();
|
);
|
||||||
event.setCancelled(true);
|
entity.remove();
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,7 +76,6 @@ import com.plotsquared.core.util.EventDispatcher;
|
|||||||
import com.plotsquared.core.util.MathMan;
|
import com.plotsquared.core.util.MathMan;
|
||||||
import com.plotsquared.core.util.Permissions;
|
import com.plotsquared.core.util.Permissions;
|
||||||
import com.plotsquared.core.util.PremiumVerification;
|
import com.plotsquared.core.util.PremiumVerification;
|
||||||
import com.plotsquared.core.util.RegExUtil;
|
|
||||||
import com.plotsquared.core.util.entity.EntityCategories;
|
import com.plotsquared.core.util.entity.EntityCategories;
|
||||||
import com.plotsquared.core.util.task.TaskManager;
|
import com.plotsquared.core.util.task.TaskManager;
|
||||||
import com.plotsquared.core.util.task.TaskTime;
|
import com.plotsquared.core.util.task.TaskTime;
|
||||||
@ -223,10 +222,9 @@ public class PlayerEventListener extends PlotListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("StringSplitter")
|
|
||||||
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
|
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
|
||||||
public void playerCommand(PlayerCommandPreprocessEvent event) {
|
public void playerCommand(PlayerCommandPreprocessEvent event) {
|
||||||
String msg = event.getMessage().toLowerCase().replaceAll("/", "").trim();
|
String msg = event.getMessage().replace("/", "").toLowerCase(Locale.ROOT).trim();
|
||||||
if (msg.isEmpty()) {
|
if (msg.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -240,11 +238,9 @@ public class PlayerEventListener extends PlotListener implements Listener {
|
|||||||
String[] parts = msg.split(" ");
|
String[] parts = msg.split(" ");
|
||||||
Plot plot = plotPlayer.getCurrentPlot();
|
Plot plot = plotPlayer.getCurrentPlot();
|
||||||
// Check WorldEdit
|
// Check WorldEdit
|
||||||
switch (parts[0].toLowerCase()) {
|
switch (parts[0]) {
|
||||||
case "up":
|
case "up":
|
||||||
case "/up":
|
|
||||||
case "worldedit:up":
|
case "worldedit:up":
|
||||||
case "worldedit:/up":
|
|
||||||
if (plot == null || (!plot.isAdded(plotPlayer.getUUID()) && !Permissions
|
if (plot == null || (!plot.isAdded(plotPlayer.getUUID()) && !Permissions
|
||||||
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER, true))) {
|
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER, true))) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
@ -258,63 +254,67 @@ public class PlayerEventListener extends PlotListener implements Listener {
|
|||||||
List<String> blockedCommands = plot != null ?
|
List<String> blockedCommands = plot != null ?
|
||||||
plot.getFlag(BlockedCmdsFlag.class) :
|
plot.getFlag(BlockedCmdsFlag.class) :
|
||||||
area.getFlag(BlockedCmdsFlag.class);
|
area.getFlag(BlockedCmdsFlag.class);
|
||||||
if (!blockedCommands.isEmpty() && !Permissions
|
if (blockedCommands.isEmpty()) {
|
||||||
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_BLOCKED_CMDS)) {
|
return;
|
||||||
String part = parts[0];
|
}
|
||||||
if (parts[0].contains(":")) {
|
if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_BLOCKED_CMDS)) {
|
||||||
part = parts[0].split(":")[1];
|
return;
|
||||||
msg = msg.replace(parts[0].split(":")[0] + ':', "");
|
}
|
||||||
}
|
// When using namespaced commands, we're not interested in the namespace
|
||||||
String s1 = part;
|
String part = parts[0];
|
||||||
List<String> aliases = new ArrayList<>();
|
if (part.contains(":")) {
|
||||||
for (HelpTopic cmdLabel : Bukkit.getServer().getHelpMap().getHelpTopics()) {
|
String[] namespaced = part.split(":");
|
||||||
if (part.equals(cmdLabel.getName())) {
|
part = namespaced[1];
|
||||||
break;
|
msg = msg.substring(namespaced[0].length() + 1);
|
||||||
}
|
}
|
||||||
String label = cmdLabel.getName().replaceFirst("/", "");
|
msg = replaceAliases(msg, part);
|
||||||
if (aliases.contains(label)) {
|
for (String blocked : blockedCommands) {
|
||||||
continue;
|
if (blocked.equalsIgnoreCase(msg)) {
|
||||||
}
|
String perm;
|
||||||
PluginCommand p;
|
if (plot != null && plot.isAdded(plotPlayer.getUUID())) {
|
||||||
if ((p = Bukkit.getPluginCommand(label)) != null) {
|
perm = "plots.admin.command.blocked-cmds.shared";
|
||||||
for (String a : p.getAliases()) {
|
|
||||||
if (aliases.contains(a)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
aliases.add(a);
|
|
||||||
a = a.replaceFirst("/", "");
|
|
||||||
if (!a.equals(label) && a.equals(part)) {
|
|
||||||
part = label;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!s1.equals(part)) {
|
|
||||||
msg = msg.replace(s1, part);
|
|
||||||
}
|
|
||||||
for (String s : blockedCommands) {
|
|
||||||
Pattern pattern;
|
|
||||||
if (!RegExUtil.compiledPatterns.containsKey(s)) {
|
|
||||||
RegExUtil.compiledPatterns.put(s, pattern = Pattern.compile(s));
|
|
||||||
} else {
|
} else {
|
||||||
pattern = RegExUtil.compiledPatterns.get(s);
|
perm = "plots.admin.command.blocked-cmds.road";
|
||||||
}
|
}
|
||||||
if (pattern.matcher(msg).matches()) {
|
if (!Permissions.hasPermission(plotPlayer, perm)) {
|
||||||
String perm;
|
plotPlayer.sendMessage(TranslatableCaption.of("blockedcmds.command_blocked"));
|
||||||
if (plot != null && plot.isAdded(plotPlayer.getUUID())) {
|
event.setCancelled(true);
|
||||||
perm = "plots.admin.command.blocked-cmds.shared";
|
}
|
||||||
} else {
|
return;
|
||||||
perm = "plots.admin.command.blocked-cmds.road";
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String replaceAliases(String msg, String part) {
|
||||||
|
String s1 = part;
|
||||||
|
Set<String> aliases = new HashSet<>();
|
||||||
|
for (HelpTopic cmdLabel : Bukkit.getServer().getHelpMap().getHelpTopics()) {
|
||||||
|
if (part.equals(cmdLabel.getName())) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
String label = cmdLabel.getName().replaceFirst("/", "");
|
||||||
|
if (aliases.contains(label)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
PluginCommand p = Bukkit.getPluginCommand(label);
|
||||||
|
if (p != null) {
|
||||||
|
for (String a : p.getAliases()) {
|
||||||
|
if (aliases.contains(a)) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if (!Permissions.hasPermission(plotPlayer, perm)) {
|
aliases.add(a);
|
||||||
plotPlayer.sendMessage(TranslatableCaption.of("blockedcmds.command_blocked"));
|
a = a.replaceFirst("/", "");
|
||||||
event.setCancelled(true);
|
if (!a.equals(label) && a.equals(part)) {
|
||||||
|
part = label;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!s1.equals(part)) {
|
||||||
|
msg = msg.replace(s1, part);
|
||||||
|
}
|
||||||
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
|
@ -35,6 +35,7 @@ import com.plotsquared.core.player.PlotPlayer;
|
|||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.plot.PlotArea;
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
import com.plotsquared.core.plot.PlotHandler;
|
import com.plotsquared.core.plot.PlotHandler;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
|
||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||||
import com.plotsquared.core.util.Permissions;
|
import com.plotsquared.core.util.Permissions;
|
||||||
import net.kyori.adventure.text.minimessage.Template;
|
import net.kyori.adventure.text.minimessage.Template;
|
||||||
@ -128,13 +129,15 @@ public class ProjectileEventListener implements Listener {
|
|||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
} else if (!plot.isAdded(pp.getUUID())) {
|
} else if (!plot.isAdded(pp.getUUID())) {
|
||||||
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
|
if (!plot.getFlag(ProjectilesFlag.class)) {
|
||||||
pp.sendMessage(
|
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
|
||||||
TranslatableCaption.of("permission.no_permission_event"),
|
pp.sendMessage(
|
||||||
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER))
|
TranslatableCaption.of("permission.no_permission_event"),
|
||||||
);
|
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER))
|
||||||
entity.remove();
|
);
|
||||||
event.setCancelled(true);
|
entity.remove();
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -162,7 +165,7 @@ public class ProjectileEventListener implements Listener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (plot.isAdded(pp.getUUID()) || Permissions
|
if (plot.isAdded(pp.getUUID()) || Permissions
|
||||||
.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
|
.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag(ProjectilesFlag.class)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
entity.remove();
|
entity.remove();
|
||||||
|
@ -46,7 +46,7 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
|
|||||||
public class SingleWorldListener implements Listener {
|
public class SingleWorldListener implements Listener {
|
||||||
|
|
||||||
private final Method methodGetHandleChunk;
|
private final Method methodGetHandleChunk;
|
||||||
private Field shouldSave;
|
private Field shouldSave = null;
|
||||||
|
|
||||||
public SingleWorldListener() throws Exception {
|
public SingleWorldListener() throws Exception {
|
||||||
ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
|
ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
|
||||||
@ -59,9 +59,12 @@ public class SingleWorldListener implements Listener {
|
|||||||
} else {
|
} else {
|
||||||
this.shouldSave = classChunk.getField("s").getRealField();
|
this.shouldSave = classChunk.getField("s").getRealField();
|
||||||
}
|
}
|
||||||
} else {
|
} else if (PlotSquared.platform().serverVersion()[1] == 17) {
|
||||||
ReflectionUtils.RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
|
ReflectionUtils.RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
|
||||||
this.shouldSave = classChunk.getField("r").getRealField();
|
this.shouldSave = classChunk.getField("r").getRealField();
|
||||||
|
} else if (PlotSquared.platform().serverVersion()[1] == 18) {
|
||||||
|
ReflectionUtils.RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
|
||||||
|
this.shouldSave = classChunk.getField("b").getRealField();
|
||||||
}
|
}
|
||||||
} catch (NoSuchFieldException e) {
|
} catch (NoSuchFieldException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -38,7 +38,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
|||||||
* @deprecated Deprecated and scheduled for removal without replacement
|
* @deprecated Deprecated and scheduled for removal without replacement
|
||||||
* in favor of the build in setup wizard.
|
* in favor of the build in setup wizard.
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true, since = "6.0.0")
|
||||||
@Singleton
|
@Singleton
|
||||||
public class MultiverseWorldManager extends BukkitWorldManager {
|
public class MultiverseWorldManager extends BukkitWorldManager {
|
||||||
|
|
||||||
|
@ -74,8 +74,9 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator {
|
|||||||
private final Consumer<Throwable> throwableConsumer;
|
private final Consumer<Throwable> throwableConsumer;
|
||||||
private final boolean unloadAfter;
|
private final boolean unloadAfter;
|
||||||
private final int totalSize;
|
private final int totalSize;
|
||||||
|
|
||||||
private final AtomicInteger expectedSize;
|
private final AtomicInteger expectedSize;
|
||||||
|
private final AtomicInteger loadingChunks = new AtomicInteger();
|
||||||
|
|
||||||
private int batchSize;
|
private int batchSize;
|
||||||
private PlotSquaredTask task;
|
private PlotSquaredTask task;
|
||||||
private boolean shouldCancel;
|
private boolean shouldCancel;
|
||||||
@ -150,6 +151,13 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator {
|
|||||||
|
|
||||||
Chunk chunk = this.availableChunks.poll();
|
Chunk chunk = this.availableChunks.poll();
|
||||||
if (chunk == null) {
|
if (chunk == null) {
|
||||||
|
if (this.availableChunks.isEmpty()) {
|
||||||
|
if (this.requestedChunks.isEmpty() && loadingChunks.get() == 0) {
|
||||||
|
finish();
|
||||||
|
} else {
|
||||||
|
requestBatch();
|
||||||
|
}
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
long[] iterationTime = new long[2];
|
long[] iterationTime = new long[2];
|
||||||
@ -197,9 +205,11 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator {
|
|||||||
BlockVector2 chunk;
|
BlockVector2 chunk;
|
||||||
for (int i = 0; i < this.batchSize && (chunk = this.requestedChunks.poll()) != null; i++) {
|
for (int i = 0; i < this.batchSize && (chunk = this.requestedChunks.poll()) != null; i++) {
|
||||||
// This required PaperLib to be bumped to version 1.0.4 to mark the request as urgent
|
// This required PaperLib to be bumped to version 1.0.4 to mark the request as urgent
|
||||||
|
loadingChunks.incrementAndGet();
|
||||||
PaperLib
|
PaperLib
|
||||||
.getChunkAtAsync(this.bukkitWorld, chunk.getX(), chunk.getZ(), true, true)
|
.getChunkAtAsync(this.bukkitWorld, chunk.getX(), chunk.getZ(), true, true)
|
||||||
.whenComplete((chunkObject, throwable) -> {
|
.whenComplete((chunkObject, throwable) -> {
|
||||||
|
loadingChunks.decrementAndGet();
|
||||||
if (throwable != null) {
|
if (throwable != null) {
|
||||||
throwable.printStackTrace();
|
throwable.printStackTrace();
|
||||||
// We want one less because this couldn't be processed
|
// We want one less because this couldn't be processed
|
||||||
|
@ -111,8 +111,8 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
|||||||
public boolean enqueue() {
|
public boolean enqueue() {
|
||||||
final Clipboard regenClipboard;
|
final Clipboard regenClipboard;
|
||||||
if (isRegen()) {
|
if (isRegen()) {
|
||||||
BlockVector3 start = BlockVector3.at(getRegenStart()[0] << 4, 0, getRegenStart()[1] << 4);
|
BlockVector3 start = BlockVector3.at(getRegenStart()[0] << 4, getMinY(), getRegenStart()[1] << 4);
|
||||||
BlockVector3 end = BlockVector3.at((getRegenEnd()[0] << 4) + 15, 255, (getRegenEnd()[1] << 4) + 15);
|
BlockVector3 end = BlockVector3.at((getRegenEnd()[0] << 4) + 15, getMaxY(), (getRegenEnd()[1] << 4) + 15);
|
||||||
Region region = new CuboidRegion(start, end);
|
Region region = new CuboidRegion(start, end);
|
||||||
regenClipboard = new BlockArrayClipboard(region);
|
regenClipboard = new BlockArrayClipboard(region);
|
||||||
regenClipboard.setOrigin(start);
|
regenClipboard.setOrigin(start);
|
||||||
@ -134,7 +134,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
|||||||
int sx = blockVector2.getX() << 4;
|
int sx = blockVector2.getX() << 4;
|
||||||
int sz = blockVector2.getZ() << 4;
|
int sz = blockVector2.getZ() << 4;
|
||||||
if (isRegenChunk) {
|
if (isRegenChunk) {
|
||||||
for (int layer = 0; layer < 16; layer++) {
|
for (int layer = getMinLayer(); layer <= getMaxLayer(); layer++) {
|
||||||
for (int y = 0; y < 16; y++) {
|
for (int y = 0; y < 16; y++) {
|
||||||
for (int x = 0; x < 16; x++) {
|
for (int x = 0; x < 16; x++) {
|
||||||
for (int z = 0; z < 16; z++) {
|
for (int z = 0; z < 16; z++) {
|
||||||
@ -170,7 +170,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
|||||||
int lx = ChunkUtil.getX(j);
|
int lx = ChunkUtil.getX(j);
|
||||||
int lz = ChunkUtil.getZ(j);
|
int lz = ChunkUtil.getZ(j);
|
||||||
int x = sx + lx;
|
int x = sx + lx;
|
||||||
int y = ChunkUtil.getY(layer, j);
|
int y = ChunkUtil.getY(layer + localChunk.getMinSection(), j);
|
||||||
int z = sz + lz;
|
int z = sz + lz;
|
||||||
boolean edge = Settings.QUEUE.UPDATE_EDGES && isEdge(y >> 4, lx, y & 15, lz, blockVector2,
|
boolean edge = Settings.QUEUE.UPDATE_EDGES && isEdge(y >> 4, lx, y & 15, lz, blockVector2,
|
||||||
localChunk
|
localChunk
|
||||||
@ -179,7 +179,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int layer = 0; layer < localChunk.getBaseblocks().length; layer++) {
|
for (int layer = 0; layer < localChunk.getBiomes().length; layer++) {
|
||||||
BiomeType[] biomesLayer = localChunk.getBiomes()[layer];
|
BiomeType[] biomesLayer = localChunk.getBiomes()[layer];
|
||||||
if (biomesLayer == null) {
|
if (biomesLayer == null) {
|
||||||
continue;
|
continue;
|
||||||
@ -295,47 +295,48 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isEdge(int layer, int x, int y, int z, BlockVector2 blockVector2, LocalChunk localChunk) {
|
private boolean isEdge(int layer, int x, int y, int z, BlockVector2 blockVector2, LocalChunk localChunk) {
|
||||||
if (layer == 0 || layer == localChunk.getBaseblocks().length - 1) {
|
int layerIndex = (layer - localChunk.getMinSection());
|
||||||
|
if (layer == localChunk.getMinSection() || layerIndex == localChunk.getBaseblocks().length - 1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (x == 0) {
|
if (x == 0) {
|
||||||
LocalChunk localChunkX = getBlockChunks().get(blockVector2.withX(blockVector2.getX() - 1));
|
LocalChunk localChunkX = getBlockChunks().get(blockVector2.withX(blockVector2.getX() - 1));
|
||||||
if (localChunkX == null || localChunkX.getBaseblocks()[layer] == null ||
|
if (localChunkX == null || localChunkX.getBaseblocks()[layerIndex] == null ||
|
||||||
localChunkX.getBaseblocks()[layer][ChunkUtil.getJ(15, y, z)] != null) {
|
localChunkX.getBaseblocks()[layerIndex][ChunkUtil.getJ(15, y, z)] != null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else if (x == 15) {
|
} else if (x == 15) {
|
||||||
LocalChunk localChunkX = getBlockChunks().get(blockVector2.withX(blockVector2.getX() + 1));
|
LocalChunk localChunkX = getBlockChunks().get(blockVector2.withX(blockVector2.getX() + 1));
|
||||||
if (localChunkX == null || localChunkX.getBaseblocks()[layer] == null ||
|
if (localChunkX == null || localChunkX.getBaseblocks()[layerIndex] == null ||
|
||||||
localChunkX.getBaseblocks()[layer][ChunkUtil.getJ(0, y, z)] != null) {
|
localChunkX.getBaseblocks()[layerIndex][ChunkUtil.getJ(0, y, z)] != null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (z == 0) {
|
if (z == 0) {
|
||||||
LocalChunk localChunkZ = getBlockChunks().get(blockVector2.withZ(blockVector2.getZ() - 1));
|
LocalChunk localChunkZ = getBlockChunks().get(blockVector2.withZ(blockVector2.getZ() - 1));
|
||||||
if (localChunkZ == null || localChunkZ.getBaseblocks()[layer] == null ||
|
if (localChunkZ == null || localChunkZ.getBaseblocks()[layerIndex] == null ||
|
||||||
localChunkZ.getBaseblocks()[layer][ChunkUtil.getJ(x, y, 15)] != null) {
|
localChunkZ.getBaseblocks()[layerIndex][ChunkUtil.getJ(x, y, 15)] != null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else if (z == 15) {
|
} else if (z == 15) {
|
||||||
LocalChunk localChunkZ = getBlockChunks().get(blockVector2.withZ(blockVector2.getZ() + 1));
|
LocalChunk localChunkZ = getBlockChunks().get(blockVector2.withZ(blockVector2.getZ() + 1));
|
||||||
if (localChunkZ == null || localChunkZ.getBaseblocks()[layer] == null ||
|
if (localChunkZ == null || localChunkZ.getBaseblocks()[layerIndex] == null ||
|
||||||
localChunkZ.getBaseblocks()[layer][ChunkUtil.getJ(x, y, 0)] != null) {
|
localChunkZ.getBaseblocks()[layerIndex][ChunkUtil.getJ(x, y, 0)] != null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (y == 0) {
|
if (y == 0) {
|
||||||
if (localChunk.getBaseblocks()[layer - 1] == null ||
|
if (localChunk.getBaseblocks()[layerIndex - 1] == null ||
|
||||||
localChunk.getBaseblocks()[layer][ChunkUtil.getJ(x, 15, z)] != null) {
|
localChunk.getBaseblocks()[layerIndex][ChunkUtil.getJ(x, 15, z)] != null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else if (y == 15) {
|
} else if (y == 15) {
|
||||||
if (localChunk.getBaseblocks()[layer + 1] == null ||
|
if (localChunk.getBaseblocks()[layerIndex + 1] == null ||
|
||||||
localChunk.getBaseblocks()[layer][ChunkUtil.getJ(x, 0, z)] != null) {
|
localChunk.getBaseblocks()[layerIndex][ChunkUtil.getJ(x, 0, z)] != null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BaseBlock[] baseBlocks = localChunk.getBaseblocks()[layer];
|
BaseBlock[] baseBlocks = localChunk.getBaseblocks()[layerIndex];
|
||||||
if (x > 0 && baseBlocks[ChunkUtil.getJ(x - 1, y, z)] == null) {
|
if (x > 0 && baseBlocks[ChunkUtil.getJ(x - 1, y, z)] == null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,7 @@ import com.plotsquared.bukkit.util.BukkitUtil;
|
|||||||
import com.plotsquared.core.location.ChunkWrapper;
|
import com.plotsquared.core.location.ChunkWrapper;
|
||||||
import com.plotsquared.core.location.Location;
|
import com.plotsquared.core.location.Location;
|
||||||
import com.plotsquared.core.queue.ScopedQueueCoordinator;
|
import com.plotsquared.core.queue.ScopedQueueCoordinator;
|
||||||
|
import com.plotsquared.core.util.AnnotationHelper;
|
||||||
import com.plotsquared.core.util.ChunkUtil;
|
import com.plotsquared.core.util.ChunkUtil;
|
||||||
import com.plotsquared.core.util.PatternUtil;
|
import com.plotsquared.core.util.PatternUtil;
|
||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||||
@ -50,6 +51,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
|||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
@AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.")
|
||||||
public class GenChunk extends ScopedQueueCoordinator {
|
public class GenChunk extends ScopedQueueCoordinator {
|
||||||
|
|
||||||
public final Biome[] biomes;
|
public final Biome[] biomes;
|
||||||
@ -61,8 +63,14 @@ public class GenChunk extends ScopedQueueCoordinator {
|
|||||||
public int chunkZ;
|
public int chunkZ;
|
||||||
private ChunkData chunkData = null;
|
private ChunkData chunkData = null;
|
||||||
|
|
||||||
public GenChunk() {
|
/**
|
||||||
super(null, Location.at("", 0, 0, 0), Location.at("", 15, 255, 15));
|
* @param minY minimum world Y, inclusive
|
||||||
|
* @param maxY maximum world Y, inclusive
|
||||||
|
*
|
||||||
|
* @since 6.6.0
|
||||||
|
*/
|
||||||
|
public GenChunk(int minY, int maxY) {
|
||||||
|
super(null, Location.at("", 0, minY, 0), Location.at("", 15, maxY, 15));
|
||||||
this.biomes = Biome.values();
|
this.biomes = Biome.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,7 +125,7 @@ public class GenChunk extends ScopedQueueCoordinator {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Biome biome = BukkitAdapter.adapt(biomeType);
|
Biome biome = BukkitAdapter.adapt(biomeType);
|
||||||
for (int y = 0; y < 256; y++) {
|
for (int y = getMin().getY(); y <= getMax().getY(); y++) {
|
||||||
for (int x = 0; x < 16; x++) {
|
for (int x = 0; x < 16; x++) {
|
||||||
for (int z = 0; z < 16; z++) {
|
for (int z = 0; z < 16; z++) {
|
||||||
this.biomeGrid.setBiome(x, y, z, biome);
|
this.biomeGrid.setBiome(x, y, z, biome);
|
||||||
@ -130,7 +138,7 @@ public class GenChunk extends ScopedQueueCoordinator {
|
|||||||
public void setCuboid(@NonNull Location pos1, @NonNull Location pos2, @NonNull BlockState block) {
|
public void setCuboid(@NonNull Location pos1, @NonNull Location pos2, @NonNull BlockState block) {
|
||||||
if (result != null && pos1.getX() == 0 && pos1.getZ() == 0 && pos2.getX() == 15 && pos2.getZ() == 15) {
|
if (result != null && pos1.getX() == 0 && pos1.getZ() == 0 && pos2.getX() == 15 && pos2.getZ() == 15) {
|
||||||
for (int y = pos1.getY(); y <= pos2.getY(); y++) {
|
for (int y = pos1.getY(); y <= pos2.getY(); y++) {
|
||||||
int layer = y >> 4;
|
int layer = getLayerIndex(y);
|
||||||
BlockState[] data = result[layer];
|
BlockState[] data = result[layer];
|
||||||
if (data == null) {
|
if (data == null) {
|
||||||
result[layer] = data = new BlockState[4096];
|
result[layer] = data = new BlockState[4096];
|
||||||
@ -164,7 +172,7 @@ public class GenChunk extends ScopedQueueCoordinator {
|
|||||||
*/
|
*/
|
||||||
public boolean setBiome(int x, int z, @NonNull Biome biome) {
|
public boolean setBiome(int x, int z, @NonNull Biome biome) {
|
||||||
if (this.biomeGrid != null) {
|
if (this.biomeGrid != null) {
|
||||||
for (int y = 0; y < 256; y++) {
|
for (int y = getMin().getY(); y <= getMax().getY(); y++) {
|
||||||
this.setBiome(x, y, z, biome);
|
this.setBiome(x, y, z, biome);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -197,7 +205,7 @@ public class GenChunk extends ScopedQueueCoordinator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void storeCache(final int x, final int y, final int z, final @NonNull BlockState id) {
|
private void storeCache(final int x, final int y, final int z, final @NonNull BlockState id) {
|
||||||
int i = y >> 4;
|
int i = getLayerIndex(y);
|
||||||
BlockState[] v = this.result[i];
|
BlockState[] v = this.result[i];
|
||||||
if (v == null) {
|
if (v == null) {
|
||||||
this.result[i] = v = new BlockState[4096];
|
this.result[i] = v = new BlockState[4096];
|
||||||
@ -219,7 +227,7 @@ public class GenChunk extends ScopedQueueCoordinator {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable BlockState getBlock(int x, int y, int z) {
|
public @Nullable BlockState getBlock(int x, int y, int z) {
|
||||||
int i = y >> 4;
|
int i = getLayerIndex(y);
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
return BukkitBlockUtil.get(chunkData.getType(x, y, z));
|
return BukkitBlockUtil.get(chunkData.getType(x, y, z));
|
||||||
}
|
}
|
||||||
@ -246,16 +254,16 @@ public class GenChunk extends ScopedQueueCoordinator {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NonNull Location getMax() {
|
public @NonNull Location getMax() {
|
||||||
return Location.at(getWorld().getName(), 15 + (getX() << 4), 255, 15 + (getZ() << 4));
|
return Location.at(getWorld().getName(), 15 + (getX() << 4), super.getMax().getY(), 15 + (getZ() << 4));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NonNull Location getMin() {
|
public @NonNull Location getMin() {
|
||||||
return Location.at(getWorld().getName(), getX() << 4, 0, getZ() << 4);
|
return Location.at(getWorld().getName(), getX() << 4, super.getMin().getY(), getZ() << 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NonNull GenChunk clone() {
|
public @NonNull GenChunk clone() {
|
||||||
GenChunk toReturn = new GenChunk();
|
GenChunk toReturn = new GenChunk(getMin().getY(), getMax().getY());
|
||||||
if (this.result != null) {
|
if (this.result != null) {
|
||||||
for (int i = 0; i < this.result.length; i++) {
|
for (int i = 0; i < this.result.length; i++) {
|
||||||
BlockState[] matrix = this.result[i];
|
BlockState[] matrix = this.result[i];
|
||||||
@ -269,4 +277,8 @@ public class GenChunk extends ScopedQueueCoordinator {
|
|||||||
return toReturn;
|
return toReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int getLayerIndex(int y) {
|
||||||
|
return (y - getMin().getY()) >> 4;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -42,6 +42,7 @@ import org.bukkit.inventory.InventoryView;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.PlayerInventory;
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -50,11 +51,15 @@ import java.util.stream.IntStream;
|
|||||||
@Singleton
|
@Singleton
|
||||||
public class BukkitInventoryUtil extends InventoryUtil {
|
public class BukkitInventoryUtil extends InventoryUtil {
|
||||||
|
|
||||||
private static ItemStack getItem(PlotItemStack item) {
|
private static @Nullable ItemStack getItem(PlotItemStack item) {
|
||||||
if (item == null) {
|
if (item == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
ItemStack stack = new ItemStack(BukkitAdapter.adapt(item.getType()), item.getAmount());
|
Material material = BukkitAdapter.adapt(item.getType());
|
||||||
|
if (material == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
ItemStack stack = new ItemStack(material, item.getAmount());
|
||||||
ItemMeta meta = null;
|
ItemMeta meta = null;
|
||||||
if (item.getName() != null) {
|
if (item.getName() != null) {
|
||||||
meta = stack.getItemMeta();
|
meta = stack.getItemMeta();
|
||||||
@ -104,14 +109,19 @@ public class BukkitInventoryUtil extends InventoryUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setItem(PlotInventory inv, int index, PlotItemStack item) {
|
public boolean setItemChecked(PlotInventory inv, int index, PlotItemStack item) {
|
||||||
BukkitPlayer bp = (BukkitPlayer) inv.getPlayer();
|
BukkitPlayer bp = (BukkitPlayer) inv.getPlayer();
|
||||||
InventoryView opened = bp.player.getOpenInventory();
|
InventoryView opened = bp.player.getOpenInventory();
|
||||||
if (!inv.isOpen()) {
|
ItemStack stack = getItem(item);
|
||||||
return;
|
if (stack == null) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
opened.setItem(index, getItem(item));
|
if (!inv.isOpen()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
opened.setItem(index, stack);
|
||||||
bp.player.updateInventory();
|
bp.player.updateInventory();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation") // Paper deprecation
|
@SuppressWarnings("deprecation") // Paper deprecation
|
||||||
|
@ -40,7 +40,6 @@ import com.plotsquared.core.queue.QueueCoordinator;
|
|||||||
import com.plotsquared.core.queue.ScopedQueueCoordinator;
|
import com.plotsquared.core.queue.ScopedQueueCoordinator;
|
||||||
import com.plotsquared.core.util.ChunkManager;
|
import com.plotsquared.core.util.ChunkManager;
|
||||||
import com.plotsquared.core.util.RegionManager;
|
import com.plotsquared.core.util.RegionManager;
|
||||||
import com.plotsquared.core.util.RegionUtil;
|
|
||||||
import com.plotsquared.core.util.WorldUtil;
|
import com.plotsquared.core.util.WorldUtil;
|
||||||
import com.plotsquared.core.util.entity.EntityCategories;
|
import com.plotsquared.core.util.entity.EntityCategories;
|
||||||
import com.plotsquared.core.util.task.RunnableVal;
|
import com.plotsquared.core.util.task.RunnableVal;
|
||||||
@ -261,7 +260,7 @@ public class BukkitRegionManager extends RegionManager {
|
|||||||
if (checkX2 && checkZ2) {
|
if (checkX2 && checkZ2) {
|
||||||
map.saveRegion(world, xxt2, xxt, zzt2, zzt); //
|
map.saveRegion(world, xxt2, xxt, zzt2, zzt); //
|
||||||
}
|
}
|
||||||
CuboidRegion currentPlotClear = RegionUtil.createRegion(pos1.getX(), pos2.getX(), pos1.getZ(), pos2.getZ());
|
CuboidRegion currentPlotClear = new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3());
|
||||||
map.saveEntitiesOut(Bukkit.getWorld(world.getName()).getChunkAt(x, z), currentPlotClear);
|
map.saveEntitiesOut(Bukkit.getWorld(world.getName()).getChunkAt(x, z), currentPlotClear);
|
||||||
AugmentedUtils.bypass(
|
AugmentedUtils.bypass(
|
||||||
ignoreAugment,
|
ignoreAugment,
|
||||||
@ -276,7 +275,9 @@ public class BukkitRegionManager extends RegionManager {
|
|||||||
PlotLoc plotLoc = new PlotLoc(bx + x1, bz + z1);
|
PlotLoc plotLoc = new PlotLoc(bx + x1, bz + z1);
|
||||||
BaseBlock[] ids = map.allBlocks.get(plotLoc);
|
BaseBlock[] ids = map.allBlocks.get(plotLoc);
|
||||||
if (ids != null) {
|
if (ids != null) {
|
||||||
for (int y = 0; y < Math.min(128, ids.length); y++) {
|
int minY = value.getMin().getY();
|
||||||
|
for (int yIndex = 0; yIndex < ids.length; yIndex++) {
|
||||||
|
int y = yIndex + minY;
|
||||||
BaseBlock id = ids[y];
|
BaseBlock id = ids[y];
|
||||||
if (id != null) {
|
if (id != null) {
|
||||||
value.setBlock(x1, y, z1, id);
|
value.setBlock(x1, y, z1, id);
|
||||||
@ -284,12 +285,6 @@ public class BukkitRegionManager extends RegionManager {
|
|||||||
value.setBlock(x1, y, z1, BlockTypes.AIR.getDefaultState());
|
value.setBlock(x1, y, z1, BlockTypes.AIR.getDefaultState());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int y = Math.min(128, ids.length); y < ids.length; y++) {
|
|
||||||
BaseBlock id = ids[y];
|
|
||||||
if (id != null) {
|
|
||||||
value.setBlock(x1, y, z1, id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -297,7 +292,7 @@ public class BukkitRegionManager extends RegionManager {
|
|||||||
}, world.getName(), chunk)
|
}, world.getName(), chunk)
|
||||||
);
|
);
|
||||||
//map.restoreBlocks(worldObj, 0, 0);
|
//map.restoreBlocks(worldObj, 0, 0);
|
||||||
map.restoreEntities(Bukkit.getWorld(world.getName()), 0, 0);
|
map.restoreEntities(Bukkit.getWorld(world.getName()));
|
||||||
});
|
});
|
||||||
regenQueue.setCompleteTask(whenDone);
|
regenQueue.setCompleteTask(whenDone);
|
||||||
queue.setCompleteTask(regenQueue::enqueue);
|
queue.setCompleteTask(regenQueue::enqueue);
|
||||||
|
@ -44,7 +44,6 @@ import com.plotsquared.core.util.task.TaskManager;
|
|||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||||
import com.sk89q.worldedit.bukkit.BukkitWorld;
|
import com.sk89q.worldedit.bukkit.BukkitWorld;
|
||||||
import com.sk89q.worldedit.math.BlockVector2;
|
import com.sk89q.worldedit.math.BlockVector2;
|
||||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
|
||||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||||
import com.sk89q.worldedit.world.block.BlockCategories;
|
import com.sk89q.worldedit.world.block.BlockCategories;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
@ -61,7 +60,6 @@ import org.bukkit.Bukkit;
|
|||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.block.Biome;
|
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
import org.bukkit.block.Sign;
|
import org.bukkit.block.Sign;
|
||||||
@ -246,7 +244,9 @@ public class BukkitUtil extends WorldUtil {
|
|||||||
final World bukkitWorld = Objects.requireNonNull(getWorld(world));
|
final World bukkitWorld = Objects.requireNonNull(getWorld(world));
|
||||||
// Skip top and bottom block
|
// Skip top and bottom block
|
||||||
int air = 1;
|
int air = 1;
|
||||||
for (int y = bukkitWorld.getMaxHeight() - 1; y >= 0; y--) {
|
int maxY = com.plotsquared.bukkit.util.BukkitWorld.getMaxWorldHeight(bukkitWorld);
|
||||||
|
int minY = com.plotsquared.bukkit.util.BukkitWorld.getMinWorldHeight(bukkitWorld);
|
||||||
|
for (int y = maxY - 1; y >= minY; y--) {
|
||||||
Block block = bukkitWorld.getBlockAt(x, y, z);
|
Block block = bukkitWorld.getBlockAt(x, y, z);
|
||||||
Material type = block.getType();
|
Material type = block.getType();
|
||||||
if (type.isSolid()) {
|
if (type.isSolid()) {
|
||||||
@ -273,7 +273,9 @@ public class BukkitUtil extends WorldUtil {
|
|||||||
final World bukkitWorld = Objects.requireNonNull(getWorld(world));
|
final World bukkitWorld = Objects.requireNonNull(getWorld(world));
|
||||||
// Skip top and bottom block
|
// Skip top and bottom block
|
||||||
int air = 1;
|
int air = 1;
|
||||||
for (int y = bukkitWorld.getMaxHeight() - 1; y >= 0; y--) {
|
int maxY = com.plotsquared.bukkit.util.BukkitWorld.getMaxWorldHeight(bukkitWorld);
|
||||||
|
int minY = com.plotsquared.bukkit.util.BukkitWorld.getMinWorldHeight(bukkitWorld);
|
||||||
|
for (int y = maxY - 1; y >= minY; y--) {
|
||||||
Block block = bukkitWorld.getBlockAt(x, y, z);
|
Block block = bukkitWorld.getBlockAt(x, y, z);
|
||||||
Material type = block.getType();
|
Material type = block.getType();
|
||||||
if (type.isSolid()) {
|
if (type.isSolid()) {
|
||||||
@ -345,13 +347,15 @@ public class BukkitUtil extends WorldUtil {
|
|||||||
final Block block = world.getBlockAt(location.getX(), location.getY(), location.getZ());
|
final Block block = world.getBlockAt(location.getX(), location.getY(), location.getZ());
|
||||||
final Material type = block.getType();
|
final Material type = block.getType();
|
||||||
if (type != Material.LEGACY_SIGN && type != Material.LEGACY_WALL_SIGN) {
|
if (type != Material.LEGACY_SIGN && type != Material.LEGACY_WALL_SIGN) {
|
||||||
BlockFace facing = BlockFace.EAST;
|
BlockFace facing = BlockFace.NORTH;
|
||||||
if (world.getBlockAt(location.getX(), location.getY(), location.getZ() + 1).getType().isSolid()) {
|
if (!world.getBlockAt(location.getX(), location.getY(), location.getZ() + 1).getType().isSolid()) {
|
||||||
facing = BlockFace.NORTH;
|
if (world.getBlockAt(location.getX() - 1, location.getY(), location.getZ()).getType().isSolid()) {
|
||||||
} else if (world.getBlockAt(location.getX() + 1, location.getY(), location.getZ()).getType().isSolid()) {
|
facing = BlockFace.EAST;
|
||||||
facing = BlockFace.WEST;
|
} else if (world.getBlockAt(location.getX() + 1, location.getY(), location.getZ()).getType().isSolid()) {
|
||||||
} else if (world.getBlockAt(location.getX(), location.getY(), location.getZ() - 1).getType().isSolid()) {
|
facing = BlockFace.WEST;
|
||||||
facing = BlockFace.SOUTH;
|
} else if (world.getBlockAt(location.getX(), location.getY(), location.getZ() - 1).getType().isSolid()) {
|
||||||
|
facing = BlockFace.SOUTH;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (PlotSquared.platform().serverVersion()[1] == 13) {
|
if (PlotSquared.platform().serverVersion()[1] == 13) {
|
||||||
block.setType(Material.valueOf(area.legacySignMaterial()), false);
|
block.setType(Material.valueOf(area.legacySignMaterial()), false);
|
||||||
@ -371,7 +375,7 @@ public class BukkitUtil extends WorldUtil {
|
|||||||
sign.setLine(i, LEGACY_COMPONENT_SERIALIZER
|
sign.setLine(i, LEGACY_COMPONENT_SERIALIZER
|
||||||
.serialize(MINI_MESSAGE.parse(lines[i].getComponent(LocaleHolder.console()), replacements)));
|
.serialize(MINI_MESSAGE.parse(lines[i].getComponent(LocaleHolder.console()), replacements)));
|
||||||
}
|
}
|
||||||
sign.update(true);
|
sign.update(true, false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -382,27 +386,6 @@ public class BukkitUtil extends WorldUtil {
|
|||||||
return new StringComparison<BlockState>().new ComparisonResult(1, state);
|
return new StringComparison<BlockState>().new ComparisonResult(1, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setBiomes(
|
|
||||||
final @NonNull String worldName,
|
|
||||||
final @NonNull CuboidRegion region,
|
|
||||||
final @NonNull BiomeType biomeType
|
|
||||||
) {
|
|
||||||
final World world = getWorld(worldName);
|
|
||||||
if (world == null) {
|
|
||||||
LOGGER.warn("An error occurred while setting the biome because the world was null", new RuntimeException());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final Biome biome = BukkitAdapter.adapt(biomeType);
|
|
||||||
for (int x = region.getMinimumPoint().getX(); x <= region.getMaximumPoint().getX(); x++) {
|
|
||||||
for (int z = region.getMinimumPoint().getZ(); z <= region.getMaximumPoint().getZ(); z++) {
|
|
||||||
if (world.getBiome(x, z) != biome) {
|
|
||||||
world.setBiome(x, z, biome);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public com.sk89q.worldedit.world.@NonNull World getWeWorld(final @NonNull String world) {
|
public com.sk89q.worldedit.world.@NonNull World getWeWorld(final @NonNull String world) {
|
||||||
return new BukkitWorld(Bukkit.getWorld(world));
|
return new BukkitWorld(Bukkit.getWorld(world));
|
||||||
|
@ -36,6 +36,18 @@ import java.util.Objects;
|
|||||||
public class BukkitWorld implements World<org.bukkit.World> {
|
public class BukkitWorld implements World<org.bukkit.World> {
|
||||||
|
|
||||||
private static final Map<String, BukkitWorld> worldMap = Maps.newHashMap();
|
private static final Map<String, BukkitWorld> worldMap = Maps.newHashMap();
|
||||||
|
private static final boolean HAS_MIN_Y;
|
||||||
|
|
||||||
|
static {
|
||||||
|
boolean temp;
|
||||||
|
try {
|
||||||
|
org.bukkit.World.class.getMethod("getMinHeight");
|
||||||
|
temp = true;
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
temp = false;
|
||||||
|
}
|
||||||
|
HAS_MIN_Y = temp;
|
||||||
|
}
|
||||||
|
|
||||||
private final org.bukkit.World world;
|
private final org.bukkit.World world;
|
||||||
|
|
||||||
@ -73,6 +85,24 @@ public class BukkitWorld implements World<org.bukkit.World> {
|
|||||||
return bukkitWorld;
|
return bukkitWorld;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the min world height from a Bukkit {@link org.bukkit.World}. Inclusive
|
||||||
|
*
|
||||||
|
* @since 6.6.0
|
||||||
|
*/
|
||||||
|
public static int getMinWorldHeight(org.bukkit.World world) {
|
||||||
|
return HAS_MIN_Y ? world.getMinHeight() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the max world height from a Bukkit {@link org.bukkit.World}. Exclusive
|
||||||
|
*
|
||||||
|
* @since 6.6.0
|
||||||
|
*/
|
||||||
|
public static int getMaxWorldHeight(org.bukkit.World world) {
|
||||||
|
return HAS_MIN_Y ? world.getMaxHeight() : 256;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public org.bukkit.World getPlatformWorld() {
|
public org.bukkit.World getPlatformWorld() {
|
||||||
return this.world;
|
return this.world;
|
||||||
@ -83,34 +113,41 @@ public class BukkitWorld implements World<org.bukkit.World> {
|
|||||||
return this.world.getName();
|
return this.world.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMinHeight() {
|
||||||
|
return getMinWorldHeight(world);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMaxHeight() {
|
||||||
|
return getMaxWorldHeight(world) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean equals(final Object o) {
|
public boolean equals(final Object o) {
|
||||||
if (o == this) {
|
if (this == o) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!(o instanceof final BukkitWorld other)) {
|
if (o == null || getClass() != o.getClass()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!other.canEqual(this)) {
|
final BukkitWorld that = (BukkitWorld) o;
|
||||||
return false;
|
return world.equals(that.world);
|
||||||
}
|
|
||||||
if (!Objects.equals(this.world, other.world)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return world.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated This method is not meant to be invoked or overridden, with no replacement.
|
||||||
|
*/
|
||||||
|
@Deprecated(forRemoval = true, since = "6.6.0")
|
||||||
protected boolean canEqual(final Object other) {
|
protected boolean canEqual(final Object other) {
|
||||||
return other instanceof BukkitWorld;
|
return other instanceof BukkitWorld;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int hashCode() {
|
|
||||||
final int PRIME = 59;
|
|
||||||
int result = 1;
|
|
||||||
final Object $world = this.world;
|
|
||||||
result = result * PRIME + ($world == null ? 43 : $world.hashCode());
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "BukkitWorld(world=" + this.world + ")";
|
return "BukkitWorld(world=" + this.world + ")";
|
||||||
}
|
}
|
||||||
|
@ -70,7 +70,7 @@ public class ContentMap {
|
|||||||
}
|
}
|
||||||
for (int x = x1; x <= x2; x++) {
|
for (int x = x1; x <= x2; x++) {
|
||||||
for (int z = z1; z <= z2; z++) {
|
for (int z = z1; z <= z2; z++) {
|
||||||
saveBlocks(world, 256, x, z, 0, 0);
|
saveBlocks(world, x, z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -92,14 +92,7 @@ public class ContentMap {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void saveEntitiesIn(Chunk chunk, CuboidRegion region) {
|
void saveEntitiesIn(Chunk chunk, CuboidRegion region, boolean delete) {
|
||||||
saveEntitiesIn(chunk, region, 0, 0, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void saveEntitiesIn(
|
|
||||||
Chunk chunk, CuboidRegion region, int offsetX, int offsetZ,
|
|
||||||
boolean delete
|
|
||||||
) {
|
|
||||||
for (Entity entity : chunk.getEntities()) {
|
for (Entity entity : chunk.getEntities()) {
|
||||||
Location location = BukkitUtil.adapt(entity.getLocation());
|
Location location = BukkitUtil.adapt(entity.getLocation());
|
||||||
int x = location.getX();
|
int x = location.getX();
|
||||||
@ -111,8 +104,6 @@ public class ContentMap {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
EntityWrapper wrap = new ReplicatingEntityWrapper(entity, (short) 2);
|
EntityWrapper wrap = new ReplicatingEntityWrapper(entity, (short) 2);
|
||||||
wrap.x += offsetX;
|
|
||||||
wrap.z += offsetZ;
|
|
||||||
wrap.saveEntity();
|
wrap.saveEntity();
|
||||||
this.entities.add(wrap);
|
this.entities.add(wrap);
|
||||||
if (delete) {
|
if (delete) {
|
||||||
@ -123,10 +114,10 @@ public class ContentMap {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void restoreEntities(World world, int xOffset, int zOffset) {
|
void restoreEntities(World world) {
|
||||||
for (EntityWrapper entity : this.entities) {
|
for (EntityWrapper entity : this.entities) {
|
||||||
try {
|
try {
|
||||||
entity.spawn(world, xOffset, zOffset);
|
entity.spawn(world, 0, 0);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LOGGER.error("Failed to restore entity", e);
|
LOGGER.error("Failed to restore entity", e);
|
||||||
}
|
}
|
||||||
@ -134,15 +125,13 @@ public class ContentMap {
|
|||||||
this.entities.clear();
|
this.entities.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
//todo optimize maxY
|
private void saveBlocks(BukkitWorld world, int x, int z) {
|
||||||
void saveBlocks(BukkitWorld world, int maxY, int x, int z, int offsetX, int offsetZ) {
|
BaseBlock[] ids = new BaseBlock[world.getMaxY() - world.getMinY() + 1];
|
||||||
maxY = Math.min(255, maxY);
|
for (short yIndex = 0; yIndex <= world.getMaxY() - world.getMinY(); yIndex++) {
|
||||||
BaseBlock[] ids = new BaseBlock[maxY + 1];
|
BaseBlock block = world.getFullBlock(BlockVector3.at(x, yIndex + world.getMinY(), z));
|
||||||
for (short y = 0; y <= maxY; y++) {
|
ids[yIndex] = block;
|
||||||
BaseBlock block = world.getFullBlock(BlockVector3.at(x, y, z));
|
|
||||||
ids[y] = block;
|
|
||||||
}
|
}
|
||||||
PlotLoc loc = new PlotLoc(x + offsetX, z + offsetZ);
|
PlotLoc loc = new PlotLoc(x, z);
|
||||||
this.allBlocks.put(loc, ids);
|
this.allBlocks.put(loc, ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,6 +110,11 @@ public class FaweRegionManager extends BukkitRegionManager {
|
|||||||
delegate.setBiome(region, extendBiome, biome, world, whenDone);
|
delegate.setBiome(region, extendBiome, biome, world, whenDone);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBiome(CuboidRegion region, int extendBiome, BiomeType biome, PlotArea area, Runnable whenDone) {
|
||||||
|
delegate.setBiome(region, extendBiome, biome, area.getWorldName(), whenDone);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean copyRegion(
|
public boolean copyRegion(
|
||||||
final @NonNull Location pos1,
|
final @NonNull Location pos1,
|
||||||
|
@ -67,7 +67,7 @@ public class FaweSchematicHandler extends SchematicHandler {
|
|||||||
final PlotPlayer<?> actor,
|
final PlotPlayer<?> actor,
|
||||||
final RunnableVal<Boolean> whenDone
|
final RunnableVal<Boolean> whenDone
|
||||||
) {
|
) {
|
||||||
delegate.paste(schematic, plot, xOffset, yOffset, zOffset, autoHeight, whenDone);
|
delegate.paste(schematic, plot, xOffset, yOffset, zOffset, autoHeight, actor, whenDone);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -22,7 +22,7 @@ dependencies {
|
|||||||
api(libs.guiceassistedinject) {
|
api(libs.guiceassistedinject) {
|
||||||
exclude("com.google.inject", "guice")
|
exclude("com.google.inject", "guice")
|
||||||
}
|
}
|
||||||
api(libs.findbugs)
|
api(libs.spotbugs)
|
||||||
|
|
||||||
// Plugins
|
// Plugins
|
||||||
compileOnly(libs.worldeditCore) {
|
compileOnly(libs.worldeditCore) {
|
||||||
@ -54,3 +54,13 @@ tasks.processResources {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tasks {
|
||||||
|
withType<Javadoc> {
|
||||||
|
val opt = options as StandardJavadocDocletOptions
|
||||||
|
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString())
|
||||||
|
opt.links("https://jd.adventure.kyori.net/api/" + libs.adventure.get().versionConstraint.toString())
|
||||||
|
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
|
||||||
|
opt.links("https://checkerframework.org/api/")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -98,6 +98,22 @@ public interface PlotPlatform<P> extends LocaleHolder {
|
|||||||
*/
|
*/
|
||||||
int[] serverVersion();
|
int[] serverVersion();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the default minimum world height for the version of Minecraft that the server is running.
|
||||||
|
*
|
||||||
|
* @return minimum world height
|
||||||
|
* @since 6.6.0
|
||||||
|
*/
|
||||||
|
int versionMinHeight();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the default maximum world height for the version of Minecraft that the server is running.
|
||||||
|
*
|
||||||
|
* @return maximum world height (inclusive)
|
||||||
|
* @since 6.6.0
|
||||||
|
*/
|
||||||
|
int versionMaxHeight();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the server implementation name and version
|
* Gets the server implementation name and version
|
||||||
*
|
*
|
||||||
@ -274,6 +290,7 @@ public interface PlotPlatform<P> extends LocaleHolder {
|
|||||||
* Get the {@link PlotAreaManager} implementation.
|
* Get the {@link PlotAreaManager} implementation.
|
||||||
*
|
*
|
||||||
* @return the PlotAreaManager
|
* @return the PlotAreaManager
|
||||||
|
* @since 6.1.4
|
||||||
*/
|
*/
|
||||||
@NonNull PlotAreaManager plotAreaManager();
|
@NonNull PlotAreaManager plotAreaManager();
|
||||||
|
|
||||||
|
@ -306,7 +306,7 @@ public class PlotSquared {
|
|||||||
*
|
*
|
||||||
* @param version First version
|
* @param version First version
|
||||||
* @param version2 Second version
|
* @param version2 Second version
|
||||||
* @return true if `version` is >= `version2`
|
* @return {@code true} if `version` is >= `version2`
|
||||||
*/
|
*/
|
||||||
public boolean checkVersion(
|
public boolean checkVersion(
|
||||||
final int[] version,
|
final int[] version,
|
||||||
@ -338,9 +338,11 @@ public class PlotSquared {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a global reference to a plot world.
|
* Add a global reference to a plot world.
|
||||||
|
* <p>
|
||||||
|
* You can remove the reference by calling {@link #removePlotArea(PlotArea)}
|
||||||
|
* </p>
|
||||||
*
|
*
|
||||||
* @param plotArea the {@link PlotArea} to add.
|
* @param plotArea the {@link PlotArea} to add.
|
||||||
* @see #removePlotArea(PlotArea) To remove the reference
|
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public void addPlotArea(final @NonNull PlotArea plotArea) {
|
public void addPlotArea(final @NonNull PlotArea plotArea) {
|
||||||
@ -733,7 +735,7 @@ public class PlotSquared {
|
|||||||
*
|
*
|
||||||
* @param plot the plot to remove
|
* @param plot the plot to remove
|
||||||
* @param callEvent If to call an event about the plot being removed
|
* @param callEvent If to call an event about the plot being removed
|
||||||
* @return true if plot existed | false if it didn't
|
* @return {@code true} if plot existed | {@code false} if it didn't
|
||||||
*/
|
*/
|
||||||
public boolean removePlot(
|
public boolean removePlot(
|
||||||
final @NonNull Plot plot,
|
final @NonNull Plot plot,
|
||||||
@ -1018,8 +1020,8 @@ public class PlotSquared {
|
|||||||
// save configuration
|
// save configuration
|
||||||
|
|
||||||
final List<String> validArguments = Arrays
|
final List<String> validArguments = Arrays
|
||||||
.asList("s=", "size=", "g=", "gap=", "h=", "height=", "f=", "floor=", "m=", "main=",
|
.asList("s=", "size=", "g=", "gap=", "h=", "height=", "minh=", "minheight=", "maxh=", "maxheight=",
|
||||||
"w=", "wall=", "b=", "border="
|
"f=", "floor=", "m=", "main=", "w=", "wall=", "b=", "border="
|
||||||
);
|
);
|
||||||
|
|
||||||
// Calculate the number of expected arguments
|
// Calculate the number of expected arguments
|
||||||
@ -1098,6 +1100,14 @@ public class PlotSquared {
|
|||||||
ConfigurationUtil.INTEGER.parseString(value).shortValue()
|
ConfigurationUtil.INTEGER.parseString(value).shortValue()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
case "minh", "minheight" -> this.worldConfiguration.set(
|
||||||
|
base + "world.min_gen_height",
|
||||||
|
ConfigurationUtil.INTEGER.parseString(value).shortValue()
|
||||||
|
);
|
||||||
|
case "maxh", "maxheight" -> this.worldConfiguration.set(
|
||||||
|
base + "world.max_gen_height",
|
||||||
|
ConfigurationUtil.INTEGER.parseString(value).shortValue()
|
||||||
|
);
|
||||||
case "f", "floor" -> this.worldConfiguration.set(
|
case "f", "floor" -> this.worldConfiguration.set(
|
||||||
base + "plot.floor",
|
base + "plot.floor",
|
||||||
ConfigurationUtil.BLOCK_BUCKET.parseString(value).toString()
|
ConfigurationUtil.BLOCK_BUCKET.parseString(value).toString()
|
||||||
@ -1476,7 +1486,7 @@ public class PlotSquared {
|
|||||||
*
|
*
|
||||||
* @param world World name
|
* @param world World name
|
||||||
* @param chunkCoordinates Chunk coordinates
|
* @param chunkCoordinates Chunk coordinates
|
||||||
* @return True if the chunk uses non-standard generation, false if not
|
* @return {@code true} if the chunk uses non-standard generation, {@code false} if not
|
||||||
*/
|
*/
|
||||||
public boolean isNonStandardGeneration(
|
public boolean isNonStandardGeneration(
|
||||||
final @NonNull String world,
|
final @NonNull String world,
|
||||||
@ -1521,10 +1531,12 @@ public class PlotSquared {
|
|||||||
/**
|
/**
|
||||||
* Get the caption map belonging to a namespace. If none exists, a dummy
|
* Get the caption map belonging to a namespace. If none exists, a dummy
|
||||||
* caption map will be returned.
|
* caption map will be returned.
|
||||||
|
* <p>
|
||||||
|
* You can register a caption map by calling {@link #registerCaptionMap(String, CaptionMap)}
|
||||||
|
* </p>
|
||||||
*
|
*
|
||||||
* @param namespace Namespace
|
* @param namespace Namespace
|
||||||
* @return Map instance
|
* @return Map instance
|
||||||
* @see #registerCaptionMap(String, CaptionMap) To register a caption map
|
|
||||||
*/
|
*/
|
||||||
public @NonNull CaptionMap getCaptionMap(final @NonNull String namespace) {
|
public @NonNull CaptionMap getCaptionMap(final @NonNull String namespace) {
|
||||||
return this.captionMaps.computeIfAbsent(
|
return this.captionMaps.computeIfAbsent(
|
||||||
|
@ -122,7 +122,7 @@ public final class PlotVersion {
|
|||||||
* Compare a given version string with the one cached here.
|
* Compare a given version string with the one cached here.
|
||||||
*
|
*
|
||||||
* @param versionString the version to compare
|
* @param versionString the version to compare
|
||||||
* @return true if the given version is a "later" version
|
* @return {@code true} if the given version is a "later" version
|
||||||
*/
|
*/
|
||||||
public boolean isLaterVersion(final @NonNull String versionString) {
|
public boolean isLaterVersion(final @NonNull String versionString) {
|
||||||
int dash = versionString.indexOf('-');
|
int dash = versionString.indexOf('-');
|
||||||
@ -144,7 +144,7 @@ public final class PlotVersion {
|
|||||||
* Compare a given version with the one cached here.
|
* Compare a given version with the one cached here.
|
||||||
*
|
*
|
||||||
* @param verArray the version to compare
|
* @param verArray the version to compare
|
||||||
* @return true if the given version is a "later" version
|
* @return {@code true} if the given version is a "later" version
|
||||||
*/
|
*/
|
||||||
public boolean isLaterVersion(int[] verArray) {
|
public boolean isLaterVersion(int[] verArray) {
|
||||||
if (verArray[0] > version[0]) {
|
if (verArray[0] > version[0]) {
|
||||||
|
@ -88,7 +88,7 @@ public interface BackupManager {
|
|||||||
* Returns true if (potentially) destructive actions should cause
|
* Returns true if (potentially) destructive actions should cause
|
||||||
* PlotSquared to create automatic plot backups
|
* PlotSquared to create automatic plot backups
|
||||||
*
|
*
|
||||||
* @return True if automatic backups are enabled
|
* @return {@code true} if automatic backups are enabled
|
||||||
*/
|
*/
|
||||||
boolean shouldAutomaticallyBackup();
|
boolean shouldAutomaticallyBackup();
|
||||||
|
|
||||||
|
@ -75,6 +75,7 @@ import com.sk89q.worldedit.function.operation.Operations;
|
|||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||||
import com.sk89q.worldedit.regions.Region;
|
import com.sk89q.worldedit.regions.Region;
|
||||||
|
import com.sk89q.worldedit.world.World;
|
||||||
import net.kyori.adventure.text.minimessage.Template;
|
import net.kyori.adventure.text.minimessage.Template;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
@ -191,11 +192,12 @@ public class Area extends SubCommand {
|
|||||||
final BlockVector3 playerSelectionMin = playerSelectedRegion.getMinimumPoint();
|
final BlockVector3 playerSelectionMin = playerSelectedRegion.getMinimumPoint();
|
||||||
final BlockVector3 playerSelectionMax = playerSelectedRegion.getMaximumPoint();
|
final BlockVector3 playerSelectionMax = playerSelectedRegion.getMaximumPoint();
|
||||||
// Create a new selection that spans the entire vertical range of the world
|
// Create a new selection that spans the entire vertical range of the world
|
||||||
|
World world = playerSelectedRegion.getWorld();
|
||||||
final CuboidRegion selectedRegion =
|
final CuboidRegion selectedRegion =
|
||||||
new CuboidRegion(
|
new CuboidRegion(
|
||||||
playerSelectedRegion.getWorld(),
|
playerSelectedRegion.getWorld(),
|
||||||
BlockVector3.at(playerSelectionMin.getX(), 0, playerSelectionMin.getZ()),
|
BlockVector3.at(playerSelectionMin.getX(), world.getMinY(), playerSelectionMin.getZ()),
|
||||||
BlockVector3.at(playerSelectionMax.getX(), 255, playerSelectionMax.getZ())
|
BlockVector3.at(playerSelectionMax.getX(), world.getMaxY(), playerSelectionMax.getZ())
|
||||||
);
|
);
|
||||||
// There's only one plot in the area...
|
// There's only one plot in the area...
|
||||||
final PlotId plotId = PlotId.of(1, 1);
|
final PlotId plotId = PlotId.of(1, 1);
|
||||||
@ -278,9 +280,9 @@ public class Area extends SubCommand {
|
|||||||
if (offsetZ != 0) {
|
if (offsetZ != 0) {
|
||||||
this.worldConfiguration.set(path + ".road.offset.z", offsetZ);
|
this.worldConfiguration.set(path + ".road.offset.z", offsetZ);
|
||||||
}
|
}
|
||||||
final String world = this.setupUtils.setupWorld(singleBuilder);
|
final String worldName = this.setupUtils.setupWorld(singleBuilder);
|
||||||
if (this.worldUtil.isWorld(world)) {
|
if (this.worldUtil.isWorld(worldName)) {
|
||||||
PlotSquared.get().loadWorld(world, null);
|
PlotSquared.get().loadWorld(worldName, null);
|
||||||
player.sendMessage(TranslatableCaption.of("single.single_area_created"));
|
player.sendMessage(TranslatableCaption.of("single.single_area_created"));
|
||||||
} else {
|
} else {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
@ -369,7 +371,8 @@ public class Area extends SubCommand {
|
|||||||
int lower = (area.ROAD_WIDTH & 1) == 0 ? area.ROAD_WIDTH / 2 - 1 : area.ROAD_WIDTH / 2;
|
int lower = (area.ROAD_WIDTH & 1) == 0 ? area.ROAD_WIDTH / 2 - 1 : area.ROAD_WIDTH / 2;
|
||||||
final int offsetX = bx - (area.ROAD_WIDTH == 0 ? 0 : lower);
|
final int offsetX = bx - (area.ROAD_WIDTH == 0 ? 0 : lower);
|
||||||
final int offsetZ = bz - (area.ROAD_WIDTH == 0 ? 0 : lower);
|
final int offsetZ = bz - (area.ROAD_WIDTH == 0 ? 0 : lower);
|
||||||
final CuboidRegion region = RegionUtil.createRegion(bx, tx, bz, tz);
|
// Height doesn't matter for this region
|
||||||
|
final CuboidRegion region = RegionUtil.createRegion(bx, tx, 0, 0, bz, tz);
|
||||||
final Set<PlotArea> areas = this.plotAreaManager.getPlotAreasSet(area.getWorldName(), region);
|
final Set<PlotArea> areas = this.plotAreaManager.getPlotAreasSet(area.getWorldName(), region);
|
||||||
if (!areas.isEmpty()) {
|
if (!areas.isEmpty()) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
|
@ -34,7 +34,7 @@ import net.kyori.adventure.text.minimessage.Template;
|
|||||||
* @deprecated In favor of "/plot toggle chat" and
|
* @deprecated In favor of "/plot toggle chat" and
|
||||||
* scheduled for removal within the next major release.
|
* scheduled for removal within the next major release.
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true, since = "6.0.0")
|
||||||
@CommandDeclaration(command = "chat",
|
@CommandDeclaration(command = "chat",
|
||||||
usage = "/plot chat",
|
usage = "/plot chat",
|
||||||
permission = "plots.chat",
|
permission = "plots.chat",
|
||||||
|
@ -288,7 +288,7 @@ public abstract class Command {
|
|||||||
* @param args Arguments
|
* @param args Arguments
|
||||||
* @param confirm Instance, Success, Failure
|
* @param confirm Instance, Success, Failure
|
||||||
* @param whenDone task to run when done
|
* @param whenDone task to run when done
|
||||||
* @return CompletableFuture true if the command executed fully, false in
|
* @return CompletableFuture {@code true} if the command executed fully, {@code false} in
|
||||||
* any other case
|
* any other case
|
||||||
*/
|
*/
|
||||||
public CompletableFuture<Boolean> execute(
|
public CompletableFuture<Boolean> execute(
|
||||||
|
@ -28,6 +28,7 @@ package com.plotsquared.core.command;
|
|||||||
import com.plotsquared.core.configuration.caption.Caption;
|
import com.plotsquared.core.configuration.caption.Caption;
|
||||||
import com.plotsquared.core.configuration.caption.LocaleHolder;
|
import com.plotsquared.core.configuration.caption.LocaleHolder;
|
||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -95,4 +96,16 @@ public enum CommandCategory implements Caption {
|
|||||||
public String getComponent(@NonNull LocaleHolder localeHolder) {
|
public String getComponent(@NonNull LocaleHolder localeHolder) {
|
||||||
return this.caption.getComponent(localeHolder);
|
return this.caption.getComponent(localeHolder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a player has access to this command category
|
||||||
|
*
|
||||||
|
* @param player The player to check against
|
||||||
|
* @return {@code true} if at least one command of this category can be executed by the player, {@code false} otherwise
|
||||||
|
* @since 6.5.0
|
||||||
|
*/
|
||||||
|
boolean canAccess(PlotPlayer<?> player) {
|
||||||
|
return !MainCommand.getInstance().getCommands(this, player).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ public class Confirm extends SubCommand {
|
|||||||
player.sendMessage(TranslatableCaption.of("confirm.expired_confirm"));
|
player.sendMessage(TranslatableCaption.of("confirm.expired_confirm"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
TaskManager.runTaskAsync(command.command);
|
TaskManager.runTask(command.command);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,6 +49,7 @@ import org.checkerframework.checker.nullness.qual.NonNull;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -207,7 +208,7 @@ public class DebugExec extends SubCommand {
|
|||||||
}
|
}
|
||||||
boolean result;
|
boolean result;
|
||||||
if (HybridUtils.regions != null) {
|
if (HybridUtils.regions != null) {
|
||||||
result = this.hybridUtils.scheduleRoadUpdate(area, HybridUtils.regions, 0, new HashSet<>());
|
result = this.hybridUtils.scheduleRoadUpdate(area, HybridUtils.regions, 0, new LinkedHashSet<>());
|
||||||
} else {
|
} else {
|
||||||
result = this.hybridUtils.scheduleRoadUpdate(area, 0);
|
result = this.hybridUtils.scheduleRoadUpdate(area, 0);
|
||||||
}
|
}
|
||||||
|
@ -126,7 +126,7 @@ public class Done extends SubCommand {
|
|||||||
long flagValue = System.currentTimeMillis() / 1000;
|
long flagValue = System.currentTimeMillis() / 1000;
|
||||||
PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(DoneFlag.class)
|
PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(DoneFlag.class)
|
||||||
.createFlagInstance(Long.toString(flagValue));
|
.createFlagInstance(Long.toString(flagValue));
|
||||||
PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, plot);
|
PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, plot);
|
||||||
if (event.getEventResult() == Result.DENY) {
|
if (event.getEventResult() == Result.DENY) {
|
||||||
player.sendMessage(TranslatableCaption.of("events.event_denied"));
|
player.sendMessage(TranslatableCaption.of("events.event_denied"));
|
||||||
return;
|
return;
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.plotsquared.core.command;
|
package com.plotsquared.core.command;
|
||||||
|
|
||||||
|
import com.google.inject.Inject;
|
||||||
import com.plotsquared.core.PlotSquared;
|
import com.plotsquared.core.PlotSquared;
|
||||||
import com.plotsquared.core.configuration.Settings;
|
import com.plotsquared.core.configuration.Settings;
|
||||||
import com.plotsquared.core.configuration.caption.CaptionUtility;
|
import com.plotsquared.core.configuration.caption.CaptionUtility;
|
||||||
@ -44,6 +45,7 @@ import com.plotsquared.core.plot.flag.InternalFlag;
|
|||||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||||
import com.plotsquared.core.plot.flag.types.IntegerFlag;
|
import com.plotsquared.core.plot.flag.types.IntegerFlag;
|
||||||
import com.plotsquared.core.plot.flag.types.ListFlag;
|
import com.plotsquared.core.plot.flag.types.ListFlag;
|
||||||
|
import com.plotsquared.core.util.EventDispatcher;
|
||||||
import com.plotsquared.core.util.MathMan;
|
import com.plotsquared.core.util.MathMan;
|
||||||
import com.plotsquared.core.util.Permissions;
|
import com.plotsquared.core.util.Permissions;
|
||||||
import com.plotsquared.core.util.StringComparison;
|
import com.plotsquared.core.util.StringComparison;
|
||||||
@ -79,8 +81,12 @@ import java.util.stream.Stream;
|
|||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public final class FlagCommand extends Command {
|
public final class FlagCommand extends Command {
|
||||||
|
|
||||||
public FlagCommand() {
|
private final EventDispatcher eventDispatcher;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public FlagCommand(final @NonNull EventDispatcher eventDispatcher) {
|
||||||
super(MainCommand.getInstance(), true);
|
super(MainCommand.getInstance(), true);
|
||||||
|
this.eventDispatcher = eventDispatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean sendMessage(PlotPlayer<?> player) {
|
private static boolean sendMessage(PlotPlayer<?> player) {
|
||||||
@ -114,7 +120,7 @@ public final class FlagCommand extends Command {
|
|||||||
TranslatableCaption.of("permission.no_permission"),
|
TranslatableCaption.of("permission.no_permission"),
|
||||||
Template.of(
|
Template.of(
|
||||||
"node",
|
"node",
|
||||||
perm
|
perm + "." + numeric
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -165,7 +171,7 @@ public final class FlagCommand extends Command {
|
|||||||
/**
|
/**
|
||||||
* Checks if the player is allowed to modify the flags at their current location
|
* Checks if the player is allowed to modify the flags at their current location
|
||||||
*
|
*
|
||||||
* @return true if the player is allowed to modify the flags at their current location
|
* @return {@code true} if the player is allowed to modify the flags at their current location
|
||||||
*/
|
*/
|
||||||
private static boolean checkRequirements(final @NonNull PlotPlayer<?> player) {
|
private static boolean checkRequirements(final @NonNull PlotPlayer<?> player) {
|
||||||
final Location location = player.getLocation();
|
final Location location = player.getLocation();
|
||||||
@ -335,7 +341,7 @@ public final class FlagCommand extends Command {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Plot plot = player.getLocation().getPlotAbs();
|
Plot plot = player.getLocation().getPlotAbs();
|
||||||
PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, plot);
|
PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, plot);
|
||||||
if (event.getEventResult() == Result.DENY) {
|
if (event.getEventResult() == Result.DENY) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("events.event_denied"),
|
TranslatableCaption.of("events.event_denied"),
|
||||||
@ -394,7 +400,7 @@ public final class FlagCommand extends Command {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Plot plot = player.getLocation().getPlotAbs();
|
Plot plot = player.getLocation().getPlotAbs();
|
||||||
PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, plot);
|
PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, plot);
|
||||||
if (event.getEventResult() == Result.DENY) {
|
if (event.getEventResult() == Result.DENY) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("events.event_denied"),
|
TranslatableCaption.of("events.event_denied"),
|
||||||
@ -463,7 +469,7 @@ public final class FlagCommand extends Command {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final Plot plot = player.getLocation().getPlotAbs();
|
final Plot plot = player.getLocation().getPlotAbs();
|
||||||
PlotFlagRemoveEvent event = new PlotFlagRemoveEvent(flag, plot);
|
PlotFlagRemoveEvent event = eventDispatcher.callFlagRemove(flag, plot);
|
||||||
if (event.getEventResult() == Result.DENY) {
|
if (event.getEventResult() == Result.DENY) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("events.event_denied"),
|
TranslatableCaption.of("events.event_denied"),
|
||||||
@ -516,7 +522,7 @@ public final class FlagCommand extends Command {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
PlotFlag<?, ?> plotFlag = parsedFlag.createFlagInstance(list);
|
PlotFlag<?, ?> plotFlag = parsedFlag.createFlagInstance(list);
|
||||||
PlotFlagAddEvent addEvent = new PlotFlagAddEvent(plotFlag, plot);
|
PlotFlagAddEvent addEvent = eventDispatcher.callFlagAdd(plotFlag, plot);
|
||||||
if (addEvent.getEventResult() == Result.DENY) {
|
if (addEvent.getEventResult() == Result.DENY) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
TranslatableCaption.of("events.event_denied"),
|
TranslatableCaption.of("events.event_denied"),
|
||||||
|
@ -37,11 +37,11 @@ import net.kyori.adventure.text.Component;
|
|||||||
import net.kyori.adventure.text.TextComponent;
|
import net.kyori.adventure.text.TextComponent;
|
||||||
import net.kyori.adventure.text.minimessage.Template;
|
import net.kyori.adventure.text.minimessage.Template;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
@CommandDeclaration(command = "help",
|
@CommandDeclaration(command = "help",
|
||||||
aliases = "?",
|
aliases = "?",
|
||||||
@ -119,6 +119,9 @@ public class Help extends Command {
|
|||||||
TextComponent.Builder builder = Component.text();
|
TextComponent.Builder builder = Component.text();
|
||||||
builder.append(MINI_MESSAGE.parse(TranslatableCaption.of("help.help_header").getComponent(player)));
|
builder.append(MINI_MESSAGE.parse(TranslatableCaption.of("help.help_header").getComponent(player)));
|
||||||
for (CommandCategory c : CommandCategory.values()) {
|
for (CommandCategory c : CommandCategory.values()) {
|
||||||
|
if (!c.canAccess(player)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
builder.append(Component.newline()).append(MINI_MESSAGE
|
builder.append(Component.newline()).append(MINI_MESSAGE
|
||||||
.parse(
|
.parse(
|
||||||
TranslatableCaption.of("help.help_info_item").getComponent(player),
|
TranslatableCaption.of("help.help_info_item").getComponent(player),
|
||||||
@ -152,12 +155,26 @@ public class Help extends Command {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
|
public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
|
||||||
return Stream.of("claiming", "teleport", "settings", "chat", "schematic", "appearance", "info", "debug",
|
final String argument = args[0].toLowerCase(Locale.ENGLISH);
|
||||||
"administration", "all"
|
List<Command> result = new ArrayList<>();
|
||||||
)
|
|
||||||
.filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH)))
|
for (final CommandCategory category : CommandCategory.values()) {
|
||||||
.map(value -> new Command(null, false, value, "", RequiredType.NONE, null) {
|
if (!category.canAccess(player)) {
|
||||||
}).collect(Collectors.toList());
|
continue;
|
||||||
|
}
|
||||||
|
String name = category.name().toLowerCase();
|
||||||
|
if (!name.startsWith(argument)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
result.add(new Command(null, false, name, "", RequiredType.NONE, null) {
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// add the category "all"
|
||||||
|
if ("all".startsWith(argument)) {
|
||||||
|
result.add(new Command(null, false, "all", "", RequiredType.NONE, null) {
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,7 @@ import com.plotsquared.core.plot.schematic.Schematic;
|
|||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||||
import com.plotsquared.core.util.Permissions;
|
import com.plotsquared.core.util.Permissions;
|
||||||
import com.plotsquared.core.util.SchematicHandler;
|
import com.plotsquared.core.util.SchematicHandler;
|
||||||
|
import com.plotsquared.core.util.TimeUtil;
|
||||||
import com.plotsquared.core.util.task.RunnableVal;
|
import com.plotsquared.core.util.task.RunnableVal;
|
||||||
import com.plotsquared.core.util.task.TaskManager;
|
import com.plotsquared.core.util.task.TaskManager;
|
||||||
import net.kyori.adventure.text.minimessage.Template;
|
import net.kyori.adventure.text.minimessage.Template;
|
||||||
@ -205,7 +206,7 @@ public class Load extends SubCommand {
|
|||||||
if (split.length < 5) {
|
if (split.length < 5) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
String time = secToTime((System.currentTimeMillis() / 1000) - Long.parseLong(split[0]));
|
String time = TimeUtil.secToTime((System.currentTimeMillis() / 1000) - Long.parseLong(split[0]));
|
||||||
String world = split[1];
|
String world = split[1];
|
||||||
PlotId id = PlotId.fromString(split[2] + ';' + split[3]);
|
PlotId id = PlotId.fromString(split[2] + ';' + split[3]);
|
||||||
String size = split[4];
|
String size = split[4];
|
||||||
@ -223,6 +224,10 @@ public class Load extends SubCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use {@link TimeUtil#secToTime(long)}
|
||||||
|
*/
|
||||||
|
@Deprecated(forRemoval = true, since = "6.6.2")
|
||||||
public String secToTime(long time) {
|
public String secToTime(long time) {
|
||||||
StringBuilder toreturn = new StringBuilder();
|
StringBuilder toreturn = new StringBuilder();
|
||||||
if (time >= 33868800) {
|
if (time >= 33868800) {
|
||||||
|
@ -38,10 +38,13 @@ import com.plotsquared.core.plot.PlotInventory;
|
|||||||
import com.plotsquared.core.plot.PlotItemStack;
|
import com.plotsquared.core.plot.PlotItemStack;
|
||||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.MusicFlag;
|
import com.plotsquared.core.plot.flag.implementations.MusicFlag;
|
||||||
|
import com.plotsquared.core.util.EventDispatcher;
|
||||||
import com.plotsquared.core.util.InventoryUtil;
|
import com.plotsquared.core.util.InventoryUtil;
|
||||||
import com.plotsquared.core.util.Permissions;
|
import com.plotsquared.core.util.Permissions;
|
||||||
|
import com.sk89q.worldedit.world.item.ItemType;
|
||||||
import com.sk89q.worldedit.world.item.ItemTypes;
|
import com.sk89q.worldedit.world.item.ItemTypes;
|
||||||
import net.kyori.adventure.text.minimessage.Template;
|
import net.kyori.adventure.text.minimessage.Template;
|
||||||
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@ -63,10 +66,12 @@ public class Music extends SubCommand {
|
|||||||
);
|
);
|
||||||
|
|
||||||
private final InventoryUtil inventoryUtil;
|
private final InventoryUtil inventoryUtil;
|
||||||
|
private final EventDispatcher eventDispatcher;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public Music(final @Nullable InventoryUtil inventoryUtil) {
|
public Music(final @Nullable InventoryUtil inventoryUtil, final @NonNull EventDispatcher eventDispatcher) {
|
||||||
this.inventoryUtil = inventoryUtil;
|
this.inventoryUtil = inventoryUtil;
|
||||||
|
this.eventDispatcher = eventDispatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -104,7 +109,7 @@ public class Music extends SubCommand {
|
|||||||
if (item.getType() == ItemTypes.BEDROCK) {
|
if (item.getType() == ItemTypes.BEDROCK) {
|
||||||
PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(MusicFlag.class)
|
PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(MusicFlag.class)
|
||||||
.createFlagInstance(item.getType());
|
.createFlagInstance(item.getType());
|
||||||
PlotFlagRemoveEvent event = new PlotFlagRemoveEvent(plotFlag, plot);
|
PlotFlagRemoveEvent event = eventDispatcher.callFlagRemove(plotFlag, plot);
|
||||||
if (event.getEventResult() == Result.DENY) {
|
if (event.getEventResult() == Result.DENY) {
|
||||||
getPlayer().sendMessage(
|
getPlayer().sendMessage(
|
||||||
TranslatableCaption.of("events.event_denied"),
|
TranslatableCaption.of("events.event_denied"),
|
||||||
@ -121,7 +126,7 @@ public class Music extends SubCommand {
|
|||||||
} else if (item.getName().toLowerCase(Locale.ENGLISH).contains("disc")) {
|
} else if (item.getName().toLowerCase(Locale.ENGLISH).contains("disc")) {
|
||||||
PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(MusicFlag.class)
|
PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(MusicFlag.class)
|
||||||
.createFlagInstance(item.getType());
|
.createFlagInstance(item.getType());
|
||||||
PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, plot);
|
PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, plot);
|
||||||
if (event.getEventResult() == Result.DENY) {
|
if (event.getEventResult() == Result.DENY) {
|
||||||
getPlayer().sendMessage(
|
getPlayer().sendMessage(
|
||||||
TranslatableCaption.of("events.event_denied"),
|
TranslatableCaption.of("events.event_denied"),
|
||||||
@ -144,8 +149,14 @@ public class Music extends SubCommand {
|
|||||||
for (final String disc : DISCS) {
|
for (final String disc : DISCS) {
|
||||||
final String name = String.format("<gold>%s</gold>", disc);
|
final String name = String.format("<gold>%s</gold>", disc);
|
||||||
final String[] lore = {TranslatableCaption.of("plotjukebox.click_to_play").getComponent(player)};
|
final String[] lore = {TranslatableCaption.of("plotjukebox.click_to_play").getComponent(player)};
|
||||||
final PlotItemStack item = new PlotItemStack(disc, 1, name, lore);
|
ItemType type = ItemTypes.get(disc);
|
||||||
inv.setItem(index++, item);
|
if (type == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final PlotItemStack item = new PlotItemStack(type, 1, name, lore);
|
||||||
|
if (inv.setItemChecked(index, item)) {
|
||||||
|
index++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always add the cancel button
|
// Always add the cancel button
|
||||||
|
@ -51,7 +51,7 @@ public class PluginCmd extends SubCommand {
|
|||||||
player.sendMessage(StaticCaption.of(
|
player.sendMessage(StaticCaption.of(
|
||||||
"<gray>>> </gray><gold><bold>Authors<reset><gray>: </gray><gold>Citymonstret </gold><gray>& </gray><gold>Empire92 </gold><gray>& </gray><gold>MattBDev </gold><gray>& </gray><gold>dordsor21 </gold><gray>& </gray><gold>NotMyFault </gold><gray>& </gray><gold>SirYwell</gold>"));
|
"<gray>>> </gray><gold><bold>Authors<reset><gray>: </gray><gold>Citymonstret </gold><gray>& </gray><gold>Empire92 </gold><gray>& </gray><gold>MattBDev </gold><gray>& </gray><gold>dordsor21 </gold><gray>& </gray><gold>NotMyFault </gold><gray>& </gray><gold>SirYwell</gold>"));
|
||||||
player.sendMessage(StaticCaption.of(
|
player.sendMessage(StaticCaption.of(
|
||||||
"<gray>>> </gray><gold><bold>Wiki<reset><gray>: </gray><gold><click:open_url:https://github.com/IntellectualSites/PlotSquared-Documentation/wiki>https://github.com/IntellectualSites/PlotSquared-Documentation/wiki</gold>"));
|
"<gray>>> </gray><gold><bold>Wiki<reset><gray>: </gray><gold><click:open_url:https://intellectualsites.github.io/plotsquared-documentation/>https://intellectualsites.github.io/plotsquared-documentation/</gold>"));
|
||||||
player.sendMessage(StaticCaption.of(
|
player.sendMessage(StaticCaption.of(
|
||||||
"<gray>>> </gray><gold><bold>Discord<reset><gray>: </gray><gold><click:open_url:https://discord.gg/intellectualsites>https://discord.gg/intellectualsites</gold>"));
|
"<gray>>> </gray><gold><bold>Discord<reset><gray>: </gray><gold><click:open_url:https://discord.gg/intellectualsites>https://discord.gg/intellectualsites</gold>"));
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
|
@ -50,7 +50,7 @@ import java.util.UUID;
|
|||||||
* @deprecated In favor of "/plot download" (Arkitektonika) and scheduled
|
* @deprecated In favor of "/plot download" (Arkitektonika) and scheduled
|
||||||
* for removal within the next major release.
|
* for removal within the next major release.
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true, since = "6.0.9")
|
||||||
@CommandDeclaration(command = "save",
|
@CommandDeclaration(command = "save",
|
||||||
category = CommandCategory.SCHEMATIC,
|
category = CommandCategory.SCHEMATIC,
|
||||||
requiredType = RequiredType.NONE,
|
requiredType = RequiredType.NONE,
|
||||||
@ -104,8 +104,8 @@ public class Save extends SubCommand {
|
|||||||
TaskManager.runTaskAsync(() -> {
|
TaskManager.runTaskAsync(() -> {
|
||||||
String time = (System.currentTimeMillis() / 1000) + "";
|
String time = (System.currentTimeMillis() / 1000) + "";
|
||||||
Location[] corners = plot.getCorners();
|
Location[] corners = plot.getCorners();
|
||||||
corners[0] = corners[0].withY(0);
|
corners[0] = corners[0].withY(plot.getArea().getMinBuildHeight());
|
||||||
corners[1] = corners[1].withY(255);
|
corners[1] = corners[1].withY(plot.getArea().getMaxBuildHeight());
|
||||||
int size = (corners[1].getX() - corners[0].getX()) + 1;
|
int size = (corners[1].getX() - corners[0].getX()) + 1;
|
||||||
PlotId id = plot.getId();
|
PlotId id = plot.getId();
|
||||||
String world1 = plot.getArea().toString().replaceAll(";", "-")
|
String world1 = plot.getArea().toString().replaceAll(";", "-")
|
||||||
|
@ -57,8 +57,12 @@ public class SetHome extends SetCommand {
|
|||||||
Plot base = plot.getBasePlot(false);
|
Plot base = plot.getBasePlot(false);
|
||||||
Location bottom = base.getBottomAbs();
|
Location bottom = base.getBottomAbs();
|
||||||
Location location = player.getLocationFull();
|
Location location = player.getLocationFull();
|
||||||
BlockLoc rel = new BlockLoc(location.getX() - bottom.getX(), location.getY(),
|
BlockLoc rel = new BlockLoc(
|
||||||
location.getZ() - bottom.getZ(), location.getYaw(), location.getPitch()
|
location.getX() - bottom.getX(),
|
||||||
|
location.getY(), // y is absolute
|
||||||
|
location.getZ() - bottom.getZ(),
|
||||||
|
location.getYaw(),
|
||||||
|
location.getPitch()
|
||||||
);
|
);
|
||||||
base.setHome(rel);
|
base.setHome(rel);
|
||||||
player.sendMessage(TranslatableCaption.of("position.position_set"));
|
player.sendMessage(TranslatableCaption.of("position.position_set"));
|
||||||
|
@ -180,12 +180,12 @@ public class Trim extends SubCommand {
|
|||||||
int bx = cbx << 4;
|
int bx = cbx << 4;
|
||||||
int bz = cbz << 4;
|
int bz = cbz << 4;
|
||||||
CuboidRegion region =
|
CuboidRegion region =
|
||||||
RegionUtil.createRegion(bx, bx + 511, bz, bz + 511);
|
RegionUtil.createRegion(bx, bx + 511, 0, 0, bz, bz + 511);
|
||||||
for (Plot plot : PlotQuery.newQuery().inWorld(world)) {
|
for (Plot plot : PlotQuery.newQuery().inWorld(world)) {
|
||||||
Location bot = plot.getBottomAbs();
|
Location bot = plot.getBottomAbs();
|
||||||
Location top = plot.getExtendedTopAbs();
|
Location top = plot.getExtendedTopAbs();
|
||||||
CuboidRegion plotReg = RegionUtil
|
CuboidRegion plotReg = RegionUtil
|
||||||
.createRegion(bot.getX(), top.getX(), bot.getZ(), top.getZ());
|
.createRegion(bot.getX(), top.getX(), 0, 0, bot.getZ(), top.getZ());
|
||||||
if (!RegionUtil.intersects(region, plotReg)) {
|
if (!RegionUtil.intersects(region, plotReg)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ public class ComponentPresetManager {
|
|||||||
0,
|
0,
|
||||||
"",
|
"",
|
||||||
"<rainbow:2>Disco Floor</rainbow>",
|
"<rainbow:2>Disco Floor</rainbow>",
|
||||||
Arrays.asList("<gold>Spice up your plot floor</gold>"),
|
List.of("<gold>Spice up your plot floor</gold>"),
|
||||||
ItemTypes.YELLOW_WOOL
|
ItemTypes.YELLOW_WOOL
|
||||||
));
|
));
|
||||||
yamlConfiguration.set("presets", defaultPreset.stream().map(ComponentPreset::serialize).collect(Collectors.toList()));
|
yamlConfiguration.set("presets", defaultPreset.stream().map(ComponentPreset::serialize).collect(Collectors.toList()));
|
||||||
@ -181,6 +181,10 @@ public class ComponentPresetManager {
|
|||||||
}
|
}
|
||||||
allowedPresets.add(componentPreset);
|
allowedPresets.add(componentPreset);
|
||||||
}
|
}
|
||||||
|
if (allowedPresets.isEmpty()) {
|
||||||
|
player.sendMessage(TranslatableCaption.of("preset.empty"));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
final int size = (int) Math.ceil((double) allowedPresets.size() / 9.0D);
|
final int size = (int) Math.ceil((double) allowedPresets.size() / 9.0D);
|
||||||
final PlotInventory plotInventory = new PlotInventory(this.inventoryUtil, player, size,
|
final PlotInventory plotInventory = new PlotInventory(this.inventoryUtil, player, size,
|
||||||
TranslatableCaption.of("preset.title").getComponent(player)) {
|
TranslatableCaption.of("preset.title").getComponent(player)) {
|
||||||
@ -210,7 +214,13 @@ public class ComponentPresetManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (componentPreset.getCost() > 0.0D && econHandler.isEnabled(plot.getArea())) {
|
if (componentPreset.getCost() > 0.0D) {
|
||||||
|
if (!econHandler.isEnabled(plot.getArea())) {
|
||||||
|
getPlayer().sendMessage(
|
||||||
|
TranslatableCaption.of("preset.economy_disabled"),
|
||||||
|
Template.of("preset", componentPreset.getDisplayName()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (econHandler.getMoney(getPlayer()) < componentPreset.getCost()) {
|
if (econHandler.getMoney(getPlayer()) < componentPreset.getCost()) {
|
||||||
getPlayer().sendMessage(TranslatableCaption.of("preset.preset_cannot_afford"));
|
getPlayer().sendMessage(TranslatableCaption.of("preset.preset_cannot_afford"));
|
||||||
return false;
|
return false;
|
||||||
@ -246,11 +256,16 @@ public class ComponentPresetManager {
|
|||||||
for (int i = 0; i < allowedPresets.size(); i++) {
|
for (int i = 0; i < allowedPresets.size(); i++) {
|
||||||
final ComponentPreset preset = allowedPresets.get(i);
|
final ComponentPreset preset = allowedPresets.get(i);
|
||||||
final List<String> lore = new ArrayList<>();
|
final List<String> lore = new ArrayList<>();
|
||||||
if (preset.getCost() > 0 && this.econHandler.isEnabled(plot.getArea())) {
|
if (preset.getCost() > 0) {
|
||||||
lore.add(MINI_MESSAGE.serialize(MINI_MESSAGE.parse(
|
if (!this.econHandler.isEnabled(plot.getArea())) {
|
||||||
TranslatableCaption.of("preset.preset_lore_cost").getComponent(player),
|
lore.add(MINI_MESSAGE.serialize(MINI_MESSAGE.parse(
|
||||||
Template.of("cost", String.format("%.2f", preset.getCost()))
|
TranslatableCaption.of("preset.preset_lore_economy_disabled").getComponent(player))));
|
||||||
)));
|
} else {
|
||||||
|
lore.add(MINI_MESSAGE.serialize(MINI_MESSAGE.parse(
|
||||||
|
TranslatableCaption.of("preset.preset_lore_cost").getComponent(player),
|
||||||
|
Template.of("cost", String.format("%.2f", preset.getCost()))
|
||||||
|
)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
lore.add(MINI_MESSAGE.serialize(MINI_MESSAGE.parse(
|
lore.add(MINI_MESSAGE.serialize(MINI_MESSAGE.parse(
|
||||||
TranslatableCaption.of("preset.preset_lore_component").getComponent(player),
|
TranslatableCaption.of("preset.preset_lore_component").getComponent(player),
|
||||||
|
@ -73,7 +73,7 @@ public interface ConfigurationSection {
|
|||||||
* has been specified, this will return true.
|
* has been specified, this will return true.
|
||||||
*
|
*
|
||||||
* @param path Path to check for existence.
|
* @param path Path to check for existence.
|
||||||
* @return True if this section contains the requested path, either via
|
* @return {@code true} if this section contains the requested path, either via
|
||||||
* default or being set.
|
* default or being set.
|
||||||
* @throws IllegalArgumentException Thrown when path is {@code null}.
|
* @throws IllegalArgumentException Thrown when path is {@code null}.
|
||||||
*/
|
*/
|
||||||
@ -87,7 +87,7 @@ public interface ConfigurationSection {
|
|||||||
* has been specified, this will still return false.
|
* has been specified, this will still return false.
|
||||||
*
|
*
|
||||||
* @param path Path to check for existence.
|
* @param path Path to check for existence.
|
||||||
* @return True if this section contains the requested path, regardless of
|
* @return {@code true} if this section contains the requested path, regardless of
|
||||||
* having a default.
|
* having a default.
|
||||||
* @throws IllegalArgumentException Thrown when path is {@code null}.
|
* @throws IllegalArgumentException Thrown when path is {@code null}.
|
||||||
*/
|
*/
|
||||||
|
@ -201,7 +201,7 @@ public class Settings extends Config {
|
|||||||
public List<String> WORLDS = new ArrayList<>(Collections.singletonList("*"));
|
public List<String> WORLDS = new ArrayList<>(Collections.singletonList("*"));
|
||||||
|
|
||||||
|
|
||||||
@Comment("See: https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/Plot-analysis for a description of each value.")
|
@Comment("See: https://intellectualsites.github.io/plotsquared-documentation/optimization/plot-analysis for a description of each value.")
|
||||||
public static final class CALIBRATION {
|
public static final class CALIBRATION {
|
||||||
|
|
||||||
public int VARIETY = 0;
|
public int VARIETY = 0;
|
||||||
@ -221,7 +221,7 @@ public class Settings extends Config {
|
|||||||
|
|
||||||
|
|
||||||
@Comment({"Chunk processor related settings",
|
@Comment({"Chunk processor related settings",
|
||||||
"See https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/Chunk-processor for more information."})
|
"See https://intellectualsites.github.io/plotsquared-documentation/optimization/chunk-processor for more information."})
|
||||||
public static class Chunk_Processor {
|
public static class Chunk_Processor {
|
||||||
|
|
||||||
@Comment("Auto trim will not save chunks which aren't claimed")
|
@Comment("Auto trim will not save chunks which aren't claimed")
|
||||||
@ -284,7 +284,7 @@ public class Settings extends Config {
|
|||||||
@Comment("Always show explosion Particles, even if explosion flag is set to false")
|
@Comment("Always show explosion Particles, even if explosion flag is set to false")
|
||||||
public static boolean ALWAYS_SHOW_EXPLOSIONS = false;
|
public static boolean ALWAYS_SHOW_EXPLOSIONS = false;
|
||||||
@Comment({"Blocks that may not be used in plot components",
|
@Comment({"Blocks that may not be used in plot components",
|
||||||
"Checkout the wiki article regarding plot components before modifying: https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/Plot-Components"})
|
"Checkout the wiki article regarding plot components before modifying: https://intellectualsites.github.io/plotsquared-documentation/customization/plot-components"})
|
||||||
public static List<String>
|
public static List<String>
|
||||||
INVALID_BLOCKS = Arrays.asList(
|
INVALID_BLOCKS = Arrays.asList(
|
||||||
// Acacia Stuff
|
// Acacia Stuff
|
||||||
@ -406,7 +406,7 @@ public class Settings extends Config {
|
|||||||
|
|
||||||
|
|
||||||
@Comment({"Schematic Settings",
|
@Comment({"Schematic Settings",
|
||||||
"See https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/Schematic-on-Claim for more information."})
|
"See https://intellectualsites.github.io/plotsquared-documentation/schematics/schematic-on-claim for more information."})
|
||||||
public static final class Schematics {
|
public static final class Schematics {
|
||||||
|
|
||||||
@Comment(
|
@Comment(
|
||||||
@ -438,7 +438,7 @@ public class Settings extends Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true, since = "6.0.0")
|
||||||
@Comment("Schematic interface related settings")
|
@Comment("Schematic interface related settings")
|
||||||
public static class Web {
|
public static class Web {
|
||||||
|
|
||||||
@ -535,7 +535,7 @@ public class Settings extends Config {
|
|||||||
|
|
||||||
|
|
||||||
@Comment({"Backup related settings",
|
@Comment({"Backup related settings",
|
||||||
"See https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/Backups for more information."})
|
"See https://intellectualsites.github.io/plotsquared-documentation/plot-backups for more information."})
|
||||||
public static final class Backup {
|
public static final class Backup {
|
||||||
|
|
||||||
@Comment("Automatically backup plots when destructive commands are performed, e.g. /plot clear")
|
@Comment("Automatically backup plots when destructive commands are performed, e.g. /plot clear")
|
||||||
@ -784,7 +784,7 @@ public class Settings extends Config {
|
|||||||
public static boolean
|
public static boolean
|
||||||
PERSISTENT_ROAD_REGEN = true;
|
PERSISTENT_ROAD_REGEN = true;
|
||||||
@Comment({"Enable the `/plot component` preset GUI",
|
@Comment({"Enable the `/plot component` preset GUI",
|
||||||
"Read more about components here: https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/Plot-Components"})
|
"Read more about components here: https://intellectualsites.github.io/plotsquared-documentation/customization/plot-components"})
|
||||||
public static boolean COMPONENT_PRESETS = true;
|
public static boolean COMPONENT_PRESETS = true;
|
||||||
@Comment("Enable per user locale")
|
@Comment("Enable per user locale")
|
||||||
public static boolean PER_USER_LOCALE = false;
|
public static boolean PER_USER_LOCALE = false;
|
||||||
|
@ -60,7 +60,7 @@ public interface CaptionMap {
|
|||||||
* Check if the map supports a given locale
|
* Check if the map supports a given locale
|
||||||
*
|
*
|
||||||
* @param locale Locale
|
* @param locale Locale
|
||||||
* @return True if the map supports the locale
|
* @return {@code true} if the map supports the locale
|
||||||
*/
|
*/
|
||||||
boolean supportsLocale(final @NonNull Locale locale);
|
boolean supportsLocale(final @NonNull Locale locale);
|
||||||
|
|
||||||
|
@ -103,6 +103,7 @@ public class CaptionUtility {
|
|||||||
* @param miniMessageString the message from which the specified click events should be removed from.
|
* @param miniMessageString the message from which the specified click events should be removed from.
|
||||||
* @return the string without the click events that are configured to be removed.
|
* @return the string without the click events that are configured to be removed.
|
||||||
* @see Settings.Chat#CLICK_EVENT_ACTIONS_TO_REMOVE
|
* @see Settings.Chat#CLICK_EVENT_ACTIONS_TO_REMOVE
|
||||||
|
* @since 6.0.10
|
||||||
*/
|
*/
|
||||||
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
|
||||||
@ -122,6 +123,7 @@ public class CaptionUtility {
|
|||||||
* @return the string without the click events that are configured to be removed.
|
* @return the string without the click events that are configured to be removed.
|
||||||
* @see Settings.Chat#CLICK_EVENT_ACTIONS_TO_REMOVE
|
* @see Settings.Chat#CLICK_EVENT_ACTIONS_TO_REMOVE
|
||||||
* @see #stripClickEvents(String)
|
* @see #stripClickEvents(String)
|
||||||
|
* @since 6.0.10
|
||||||
*/
|
*/
|
||||||
public static String stripClickEvents(
|
public static String stripClickEvents(
|
||||||
final @NonNull PlotFlag<?, ?> flag,
|
final @NonNull PlotFlag<?, ?> flag,
|
||||||
|
@ -99,7 +99,7 @@ public interface ChatFormatter {
|
|||||||
* Whether or not the output should escape
|
* Whether or not the output should escape
|
||||||
* any formatting keys
|
* any formatting keys
|
||||||
*
|
*
|
||||||
* @return True if raw output is to be used
|
* @return {@code true} if raw output is to be used
|
||||||
*/
|
*/
|
||||||
public boolean isRawOutput() {
|
public boolean isRawOutput() {
|
||||||
return this.rawOutput;
|
return this.rawOutput;
|
||||||
|
@ -39,6 +39,7 @@ public interface ComponentTransform {
|
|||||||
*
|
*
|
||||||
* @param transform the transform to apply.
|
* @param transform the transform to apply.
|
||||||
* @return a new transform which is applied on all child components and the component itself.
|
* @return a new transform which is applied on all child components and the component itself.
|
||||||
|
* @since 6.0.10
|
||||||
*/
|
*/
|
||||||
static ComponentTransform nested(ComponentTransform transform) {
|
static ComponentTransform nested(ComponentTransform transform) {
|
||||||
return new NestedComponentTransform(transform);
|
return new NestedComponentTransform(transform);
|
||||||
@ -51,6 +52,7 @@ public interface ComponentTransform {
|
|||||||
*
|
*
|
||||||
* @param actionsToRemove the actions used to filter which click events should be removed.
|
* @param actionsToRemove the actions used to filter which click events should be removed.
|
||||||
* @return a new transform that removes click events from a component.
|
* @return a new transform that removes click events from a component.
|
||||||
|
* @since 6.0.10
|
||||||
*/
|
*/
|
||||||
static ComponentTransform stripClicks(ClickEvent.Action... actionsToRemove) {
|
static ComponentTransform stripClicks(ClickEvent.Action... actionsToRemove) {
|
||||||
return new ClickStripTransform(Set.of(actionsToRemove));
|
return new ClickStripTransform(Set.of(actionsToRemove));
|
||||||
@ -61,6 +63,7 @@ public interface ComponentTransform {
|
|||||||
*
|
*
|
||||||
* @param original the component to transform.
|
* @param original the component to transform.
|
||||||
* @return the transformed component.
|
* @return the transformed component.
|
||||||
|
* @since 6.0.10
|
||||||
*/
|
*/
|
||||||
@NonNull Component transform(@NonNull Component original);
|
@NonNull Component transform(@NonNull Component original);
|
||||||
|
|
||||||
|
@ -36,10 +36,12 @@ import java.util.Locale;
|
|||||||
public interface LocaleHolder {
|
public interface LocaleHolder {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the console locale holder
|
* Get the console locale holder.
|
||||||
|
* <p>
|
||||||
|
* You can use {@link ConsolePlayer#getConsole()} for direct access to the {@link ConsolePlayer}
|
||||||
|
* </p>
|
||||||
*
|
*
|
||||||
* @return Console locale holder
|
* @return Console locale holder
|
||||||
* @see ConsolePlayer#getConsole() for direct access to the {@link ConsolePlayer}
|
|
||||||
*/
|
*/
|
||||||
@NonNull
|
@NonNull
|
||||||
static LocaleHolder console() {
|
static LocaleHolder console() {
|
||||||
|
@ -371,7 +371,7 @@ public interface AbstractDB {
|
|||||||
/**
|
/**
|
||||||
* Don't use this method unless you want to ruin someone's server.
|
* Don't use this method unless you want to ruin someone's server.
|
||||||
*
|
*
|
||||||
* @return true if the tables were deleted, false when an error is encountered
|
* @return {@code true} if the tables were deleted, {@code false} when an error is encountered
|
||||||
*/
|
*/
|
||||||
boolean deleteTables();
|
boolean deleteTables();
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ public abstract class Database {
|
|||||||
/**
|
/**
|
||||||
* Checks if a connection is open with the database.
|
* Checks if a connection is open with the database.
|
||||||
*
|
*
|
||||||
* @return true if the connection is open
|
* @return {@code true} if the connection is open
|
||||||
* @throws SQLException if the connection cannot be checked
|
* @throws SQLException if the connection cannot be checked
|
||||||
*/
|
*/
|
||||||
public abstract boolean checkConnection() throws SQLException;
|
public abstract boolean checkConnection() throws SQLException;
|
||||||
@ -67,7 +67,7 @@ public abstract class Database {
|
|||||||
/**
|
/**
|
||||||
* Closes the connection with the database.
|
* Closes the connection with the database.
|
||||||
*
|
*
|
||||||
* @return true if successful
|
* @return {@code true} if successful
|
||||||
* @throws SQLException if the connection cannot be closed
|
* @throws SQLException if the connection cannot be closed
|
||||||
*/
|
*/
|
||||||
public abstract boolean closeConnection() throws SQLException;
|
public abstract boolean closeConnection() throws SQLException;
|
||||||
|
@ -115,7 +115,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
|||||||
/**
|
/**
|
||||||
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#getSizeX()}
|
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#getSizeX()}
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true, since = "6.1.0")
|
||||||
public int getSize_x() {
|
public int getSize_x() {
|
||||||
return getSizeX();
|
return getSizeX();
|
||||||
}
|
}
|
||||||
@ -123,7 +123,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
|||||||
/**
|
/**
|
||||||
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#setSizeX(int)} )}
|
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#setSizeX(int)} )}
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true, since = "6.1.0")
|
||||||
public void setSize_x(int sizeX) {
|
public void setSize_x(int sizeX) {
|
||||||
setSizeX(sizeX);
|
setSizeX(sizeX);
|
||||||
}
|
}
|
||||||
@ -131,7 +131,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
|||||||
/**
|
/**
|
||||||
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#getSizeZ()}
|
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#getSizeZ()}
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true, since = "6.1.0")
|
||||||
public int getSize_z() {
|
public int getSize_z() {
|
||||||
return getSizeZ();
|
return getSizeZ();
|
||||||
}
|
}
|
||||||
@ -139,7 +139,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
|||||||
/**
|
/**
|
||||||
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#setSizeZ(int)} )}
|
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#setSizeZ(int)} )}
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true, since = "6.1.0")
|
||||||
public void setSize_z(int sizeZ) {
|
public void setSize_z(int sizeZ) {
|
||||||
setSizeZ(sizeZ);
|
setSizeZ(sizeZ);
|
||||||
}
|
}
|
||||||
@ -148,6 +148,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
|||||||
* Get the x size of the auto-area
|
* Get the x size of the auto-area
|
||||||
*
|
*
|
||||||
* @return x size
|
* @return x size
|
||||||
|
* @since 6.1.0
|
||||||
*/
|
*/
|
||||||
public int getSizeX() {
|
public int getSizeX() {
|
||||||
return this.sizeX;
|
return this.sizeX;
|
||||||
@ -157,6 +158,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
|||||||
* Set the x size of the auto-area
|
* Set the x size of the auto-area
|
||||||
*
|
*
|
||||||
* @param sizeX x size
|
* @param sizeX x size
|
||||||
|
* @since 6.1.0
|
||||||
*/
|
*/
|
||||||
public void setSizeX(int sizeX) {
|
public void setSizeX(int sizeX) {
|
||||||
this.sizeX = sizeX;
|
this.sizeX = sizeX;
|
||||||
@ -166,6 +168,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
|||||||
* Get the z size of the auto-area
|
* Get the z size of the auto-area
|
||||||
*
|
*
|
||||||
* @return z size
|
* @return z size
|
||||||
|
* @since 6.1.0
|
||||||
*/
|
*/
|
||||||
public int getSizeZ() {
|
public int getSizeZ() {
|
||||||
return this.sizeZ;
|
return this.sizeZ;
|
||||||
@ -175,6 +178,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
|||||||
* Set the z size of the auto-area
|
* Set the z size of the auto-area
|
||||||
*
|
*
|
||||||
* @param sizeZ z size
|
* @param sizeZ z size
|
||||||
|
* @since 6.1.0
|
||||||
*/
|
*/
|
||||||
public void setSizeZ(int sizeZ) {
|
public void setSizeZ(int sizeZ) {
|
||||||
this.sizeZ = sizeZ;
|
this.sizeZ = sizeZ;
|
||||||
|
@ -47,6 +47,7 @@ public class PlayerAutoPlotsChosenEvent extends PlotPlayerEvent {
|
|||||||
*
|
*
|
||||||
* @param player Player that executed the auto
|
* @param player Player that executed the auto
|
||||||
* @param plots Plots that have been chosen to be set to the player
|
* @param plots Plots that have been chosen to be set to the player
|
||||||
|
* @since 6.1.0
|
||||||
*/
|
*/
|
||||||
public PlayerAutoPlotsChosenEvent(PlotPlayer<?> player, List<Plot> plots) {
|
public PlayerAutoPlotsChosenEvent(PlotPlayer<?> player, List<Plot> plots) {
|
||||||
super(player, plots.size() > 0 ? plots.get(0) : null);
|
super(player, plots.size() > 0 ? plots.get(0) : null);
|
||||||
@ -67,6 +68,7 @@ public class PlayerAutoPlotsChosenEvent extends PlotPlayerEvent {
|
|||||||
* Get the immutable list of plots selected to be claimed by the player. May be of length 0.
|
* Get the immutable list of plots selected to be claimed by the player. May be of length 0.
|
||||||
*
|
*
|
||||||
* @return immutable list.
|
* @return immutable list.
|
||||||
|
* @since 6.1.0
|
||||||
*/
|
*/
|
||||||
public @NonNull List<Plot> getPlots() {
|
public @NonNull List<Plot> getPlots() {
|
||||||
return plots;
|
return plots;
|
||||||
@ -76,6 +78,7 @@ public class PlayerAutoPlotsChosenEvent extends PlotPlayerEvent {
|
|||||||
* Set the plots to be claimed by the player.
|
* Set the plots to be claimed by the player.
|
||||||
*
|
*
|
||||||
* @param plots list of plots.
|
* @param plots list of plots.
|
||||||
|
* @since 6.1.0
|
||||||
*/
|
*/
|
||||||
public void setPlots(final @NonNull List<Plot> plots) {
|
public void setPlots(final @NonNull List<Plot> plots) {
|
||||||
this.plots = List.copyOf(plots);
|
this.plots = List.copyOf(plots);
|
||||||
|
@ -42,7 +42,7 @@ public class PlayerPlotDeniedEvent extends PlotEvent {
|
|||||||
* @param initiator Player that initiated the event
|
* @param initiator Player that initiated the event
|
||||||
* @param plot Plot in which the event occurred
|
* @param plot Plot in which the event occurred
|
||||||
* @param player Player that was denied/un-denied
|
* @param player Player that was denied/un-denied
|
||||||
* @param added true of add to deny list, false if removed
|
* @param added {@code true} of add to deny list, {@code false} if removed
|
||||||
*/
|
*/
|
||||||
public PlayerPlotDeniedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) {
|
public PlayerPlotDeniedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) {
|
||||||
super(plot);
|
super(plot);
|
||||||
|
@ -45,7 +45,7 @@ public class PlayerPlotHelperEvent extends PlotEvent {
|
|||||||
* @param initiator Player that initiated the event
|
* @param initiator Player that initiated the event
|
||||||
* @param plot Plot in which the event occurred
|
* @param plot Plot in which the event occurred
|
||||||
* @param player Player that was added/removed from the helper list
|
* @param player Player that was added/removed from the helper list
|
||||||
* @param added true of the player was added, false if the player was removed
|
* @param added {@code true} if the player was added, {@code false} if the player was removed
|
||||||
*/
|
*/
|
||||||
public PlayerPlotHelperEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) {
|
public PlayerPlotHelperEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) {
|
||||||
super(plot);
|
super(plot);
|
||||||
|
@ -42,7 +42,7 @@ public class PlayerPlotTrustedEvent extends PlotEvent {
|
|||||||
* @param initiator Player that initiated the event
|
* @param initiator Player that initiated the event
|
||||||
* @param plot Plot in which the event occurred
|
* @param plot Plot in which the event occurred
|
||||||
* @param player Player that was added/removed from the trusted list
|
* @param player Player that was added/removed from the trusted list
|
||||||
* @param added true of the player was added, false if the player was removed
|
* @param added {@code true} if the player was added, {@code false} if the player was removed
|
||||||
*/
|
*/
|
||||||
public PlayerPlotTrustedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) {
|
public PlayerPlotTrustedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) {
|
||||||
super(plot);
|
super(plot);
|
||||||
|
@ -42,7 +42,7 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
|
|||||||
* @deprecated use {@link PlayerTeleportToPlotEvent#PlayerTeleportToPlotEvent(PlotPlayer, Location, Plot, TeleportCause)}.
|
* @deprecated use {@link PlayerTeleportToPlotEvent#PlayerTeleportToPlotEvent(PlotPlayer, Location, Plot, TeleportCause)}.
|
||||||
* You should not be creating events in the first place.
|
* You should not be creating events in the first place.
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true, since = "6.1.0")
|
||||||
public PlayerTeleportToPlotEvent(PlotPlayer<?> player, Location from, Plot plot) {
|
public PlayerTeleportToPlotEvent(PlotPlayer<?> player, Location from, Plot plot) {
|
||||||
this(player, from, plot, TeleportCause.UNKNOWN);
|
this(player, from, plot, TeleportCause.UNKNOWN);
|
||||||
}
|
}
|
||||||
@ -54,6 +54,7 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
|
|||||||
* @param from Start location
|
* @param from Start location
|
||||||
* @param plot Plot to which the player was teleported
|
* @param plot Plot to which the player was teleported
|
||||||
* @param cause Why the teleport is being completed
|
* @param cause Why the teleport is being completed
|
||||||
|
* @since 6.1.0
|
||||||
*/
|
*/
|
||||||
public PlayerTeleportToPlotEvent(PlotPlayer<?> player, Location from, Plot plot, TeleportCause cause) {
|
public PlayerTeleportToPlotEvent(PlotPlayer<?> player, Location from, Plot plot, TeleportCause cause) {
|
||||||
super(player, plot);
|
super(player, plot);
|
||||||
@ -65,6 +66,7 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
|
|||||||
* Get the teleport cause
|
* Get the teleport cause
|
||||||
*
|
*
|
||||||
* @return TeleportCause
|
* @return TeleportCause
|
||||||
|
* @since 6.1.0
|
||||||
*/
|
*/
|
||||||
public TeleportCause getCause() {
|
public TeleportCause getCause() {
|
||||||
return cause;
|
return cause;
|
||||||
|
@ -39,6 +39,7 @@ public class PlotClaimedNotifyEvent extends PlotEvent {
|
|||||||
*
|
*
|
||||||
* @param plot Plot that was claimed
|
* @param plot Plot that was claimed
|
||||||
* @param auto If the plot was claimed using /plot auto
|
* @param auto If the plot was claimed using /plot auto
|
||||||
|
* @since 6.1.0
|
||||||
*/
|
*/
|
||||||
public PlotClaimedNotifyEvent(Plot plot, boolean auto) {
|
public PlotClaimedNotifyEvent(Plot plot, boolean auto) {
|
||||||
super(plot);
|
super(plot);
|
||||||
@ -49,7 +50,9 @@ public class PlotClaimedNotifyEvent extends PlotEvent {
|
|||||||
* If the plot was claimed using /plot auto
|
* If the plot was claimed using /plot auto
|
||||||
*
|
*
|
||||||
* @return if claimed with auto
|
* @return if claimed with auto
|
||||||
|
* @since 6.1.0
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unused")
|
||||||
public boolean wasAuto() {
|
public boolean wasAuto() {
|
||||||
return auto;
|
return auto;
|
||||||
}
|
}
|
||||||
|
@ -57,12 +57,16 @@ public enum TeleportCause {
|
|||||||
PLUGIN,
|
PLUGIN,
|
||||||
UNKNOWN;
|
UNKNOWN;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 6.1.0
|
||||||
|
*/
|
||||||
public static final class CauseSets {
|
public static final class CauseSets {
|
||||||
|
|
||||||
public static final Set<TeleportCause> COMMAND = Sets.immutableEnumSet(EnumSet.range(
|
public static final Set<TeleportCause> COMMAND = Sets.immutableEnumSet(EnumSet.range(
|
||||||
TeleportCause.COMMAND,
|
TeleportCause.COMMAND,
|
||||||
TeleportCause.COMMAND_VISIT
|
TeleportCause.COMMAND_VISIT
|
||||||
));
|
));
|
||||||
|
@SuppressWarnings("unused")
|
||||||
public static final Set<TeleportCause> PLUGIN = Sets.immutableEnumSet(EnumSet.range(
|
public static final Set<TeleportCause> PLUGIN = Sets.immutableEnumSet(EnumSet.range(
|
||||||
TeleportCause.DEATH,
|
TeleportCause.DEATH,
|
||||||
TeleportCause.PLUGIN
|
TeleportCause.PLUGIN
|
||||||
|
@ -70,7 +70,7 @@ public class AugmentedUtils {
|
|||||||
final int blockZ = chunkZ << 4;
|
final int blockZ = chunkZ << 4;
|
||||||
// Create a region that contains the
|
// Create a region that contains the
|
||||||
// entire chunk
|
// entire chunk
|
||||||
CuboidRegion region = RegionUtil.createRegion(blockX, blockX + 15, blockZ, blockZ + 15);
|
CuboidRegion region = RegionUtil.createRegion(blockX, blockX + 15, 0, 0, blockZ, blockZ + 15);
|
||||||
// Query for plot areas in the chunk
|
// Query for plot areas in the chunk
|
||||||
final Set<PlotArea> areas = PlotSquared.get().getPlotAreaManager().getPlotAreasSet(world, region);
|
final Set<PlotArea> areas = PlotSquared.get().getPlotAreaManager().getPlotAreasSet(world, region);
|
||||||
if (areas.isEmpty()) {
|
if (areas.isEmpty()) {
|
||||||
@ -122,6 +122,7 @@ public class AugmentedUtils {
|
|||||||
}
|
}
|
||||||
QueueCoordinator secondaryMask;
|
QueueCoordinator secondaryMask;
|
||||||
BlockState air = BlockTypes.AIR.getDefaultState();
|
BlockState air = BlockTypes.AIR.getDefaultState();
|
||||||
|
int startYOffset = !(area instanceof ClassicPlotWorld) || ((ClassicPlotWorld) area).PLOT_BEDROCK ? 1 : 0;
|
||||||
if (area.getTerrain() == PlotAreaTerrainType.ROAD) {
|
if (area.getTerrain() == PlotAreaTerrainType.ROAD) {
|
||||||
PlotManager manager = area.getPlotManager();
|
PlotManager manager = area.getPlotManager();
|
||||||
final boolean[][] canPlace = new boolean[16][16];
|
final boolean[][] canPlace = new boolean[16][16];
|
||||||
@ -132,7 +133,7 @@ public class AugmentedUtils {
|
|||||||
int worldZ = z + blockZ;
|
int worldZ = z + blockZ;
|
||||||
boolean can = manager.getPlotId(worldX, 0, worldZ) == null;
|
boolean can = manager.getPlotId(worldX, 0, worldZ) == null;
|
||||||
if (can) {
|
if (can) {
|
||||||
for (int y = 1; y < 128; y++) {
|
for (int y = area.getMinGenHeight() + startYOffset; y <= area.getMaxGenHeight(); y++) {
|
||||||
queue.setBlock(worldX, y, worldZ, air);
|
queue.setBlock(worldX, y, worldZ, air);
|
||||||
}
|
}
|
||||||
canPlace[x][z] = true;
|
canPlace[x][z] = true;
|
||||||
@ -149,7 +150,7 @@ public class AugmentedUtils {
|
|||||||
secondaryMask = primaryMask;
|
secondaryMask = primaryMask;
|
||||||
for (int x = relativeBottomX; x <= relativeTopX; x++) {
|
for (int x = relativeBottomX; x <= relativeTopX; x++) {
|
||||||
for (int z = relativeBottomZ; z <= relativeTopZ; z++) {
|
for (int z = relativeBottomZ; z <= relativeTopZ; z++) {
|
||||||
for (int y = 1; y < 128; y++) {
|
for (int y = area.getMinGenHeight() + startYOffset; y <= area.getMaxGenHeight(); y++) {
|
||||||
queue.setBlock(blockX + x, y, blockZ + z, air);
|
queue.setBlock(blockX + x, y, blockZ + z, air);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -166,8 +167,8 @@ public class AugmentedUtils {
|
|||||||
ScopedQueueCoordinator scoped =
|
ScopedQueueCoordinator scoped =
|
||||||
new ScopedQueueCoordinator(
|
new ScopedQueueCoordinator(
|
||||||
secondaryMask,
|
secondaryMask,
|
||||||
Location.at(world, blockX, 0, blockZ),
|
Location.at(world, blockX, area.getMinGenHeight(), blockZ),
|
||||||
Location.at(world, blockX + 15, 255, blockZ + 15)
|
Location.at(world, blockX + 15, area.getMaxGenHeight(), blockZ + 15)
|
||||||
);
|
);
|
||||||
generator.generateChunk(scoped, area);
|
generator.generateChunk(scoped, area);
|
||||||
generator.populateChunk(scoped, area);
|
generator.populateChunk(scoped, area);
|
||||||
|
@ -37,7 +37,6 @@ import com.plotsquared.core.plot.Plot;
|
|||||||
import com.plotsquared.core.plot.PlotAreaTerrainType;
|
import com.plotsquared.core.plot.PlotAreaTerrainType;
|
||||||
import com.plotsquared.core.plot.PlotId;
|
import com.plotsquared.core.plot.PlotId;
|
||||||
import com.plotsquared.core.queue.QueueCoordinator;
|
import com.plotsquared.core.queue.QueueCoordinator;
|
||||||
import com.plotsquared.core.util.BlockUtil;
|
|
||||||
import com.plotsquared.core.util.MathMan;
|
import com.plotsquared.core.util.MathMan;
|
||||||
import com.plotsquared.core.util.RegionManager;
|
import com.plotsquared.core.util.RegionManager;
|
||||||
import com.plotsquared.core.util.task.TaskManager;
|
import com.plotsquared.core.util.task.TaskManager;
|
||||||
@ -147,7 +146,15 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
) {
|
) {
|
||||||
Plot plot = classicPlotWorld.getPlotAbs(plotId);
|
Plot plot = classicPlotWorld.getPlotAbs(plotId);
|
||||||
if (plot != null && plot.isBasePlot()) {
|
if (plot != null && plot.isBasePlot()) {
|
||||||
return this.regionManager.setCuboids(classicPlotWorld, plot.getRegions(), blocks, 1, getWorldHeight(), actor, queue);
|
return this.regionManager.setCuboids(
|
||||||
|
classicPlotWorld,
|
||||||
|
plot.getRegions(),
|
||||||
|
blocks,
|
||||||
|
classicPlotWorld.getMinBuildHeight(),
|
||||||
|
classicPlotWorld.getMaxBuildHeight(),
|
||||||
|
actor,
|
||||||
|
queue
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -175,7 +182,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
plot.getRegions(),
|
plot.getRegions(),
|
||||||
blocks,
|
blocks,
|
||||||
classicPlotWorld.PLOT_HEIGHT + 1,
|
classicPlotWorld.PLOT_HEIGHT + 1,
|
||||||
getWorldHeight(),
|
classicPlotWorld.getMaxBuildHeight(),
|
||||||
actor,
|
actor,
|
||||||
queue
|
queue
|
||||||
);
|
);
|
||||||
@ -204,7 +211,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
classicPlotWorld,
|
classicPlotWorld,
|
||||||
plot.getRegions(),
|
plot.getRegions(),
|
||||||
blocks,
|
blocks,
|
||||||
1,
|
classicPlotWorld.getMinBuildHeight(),
|
||||||
classicPlotWorld.PLOT_HEIGHT - 1,
|
classicPlotWorld.PLOT_HEIGHT - 1,
|
||||||
actor,
|
actor,
|
||||||
queue
|
queue
|
||||||
@ -281,7 +288,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int maxY = classicPlotWorld.getPlotManager().getWorldHeight();
|
int maxY = classicPlotWorld.getMaxBuildHeight();
|
||||||
if (!plot.isMerged(Direction.NORTH)) {
|
if (!plot.isMerged(Direction.NORTH)) {
|
||||||
int z = bottom.getZ();
|
int z = bottom.getZ();
|
||||||
for (int x = bottom.getX(); x <= top.getX(); x++) {
|
for (int x = bottom.getX(); x <= top.getX(); x++) {
|
||||||
@ -382,7 +389,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
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 = 1; 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -390,7 +397,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 = 1; 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -398,7 +405,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 = 1; 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -406,7 +413,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 = 1; 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -501,7 +508,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
enqueue = true;
|
enqueue = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int maxY = getWorldHeight();
|
int maxY = classicPlotWorld.getMaxGenHeight();
|
||||||
queue.setCuboid(
|
queue.setCuboid(
|
||||||
Location.at(
|
Location.at(
|
||||||
classicPlotWorld.getWorldName(),
|
classicPlotWorld.getWorldName(),
|
||||||
@ -513,27 +520,27 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
);
|
);
|
||||||
if (classicPlotWorld.PLOT_BEDROCK) {
|
if (classicPlotWorld.PLOT_BEDROCK) {
|
||||||
queue.setCuboid(
|
queue.setCuboid(
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx, 0, sz + 1),
|
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.getMinGenHeight(), sz + 1),
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex, 0, ez - 1),
|
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getMinGenHeight(), ez - 1),
|
||||||
BlockTypes.BEDROCK.getDefaultState()
|
BlockTypes.BEDROCK.getDefaultState()
|
||||||
);
|
);
|
||||||
queue.setCuboid(
|
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx, 1, sz + 1),
|
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.WALL_HEIGHT, ez - 1),
|
|
||||||
classicPlotWorld.WALL_FILLING.toPattern()
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
queue.setCuboid(
|
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx, 0, sz + 1),
|
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.WALL_HEIGHT, ez - 1),
|
|
||||||
classicPlotWorld.WALL_FILLING.toPattern()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
int startYOffset = classicPlotWorld.PLOT_BEDROCK ? 1 : 0;
|
||||||
queue.setCuboid(
|
queue.setCuboid(
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx, 1, sz + 1),
|
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getMinGenHeight() + startYOffset, sz + 1),
|
||||||
|
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.WALL_HEIGHT, ez - 1),
|
||||||
|
classicPlotWorld.WALL_FILLING.toPattern()
|
||||||
|
);
|
||||||
|
queue.setCuboid(
|
||||||
|
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.getMinGenHeight() + startYOffset, sz + 1),
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.WALL_HEIGHT, ez - 1),
|
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.WALL_HEIGHT, ez - 1),
|
||||||
classicPlotWorld.WALL_FILLING.toPattern()
|
classicPlotWorld.WALL_FILLING.toPattern()
|
||||||
);
|
);
|
||||||
|
queue.setCuboid(
|
||||||
|
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight() + startYOffset, sz + 1),
|
||||||
|
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.ROAD_HEIGHT, ez - 1),
|
||||||
|
classicPlotWorld.ROAD_BLOCK.toPattern()
|
||||||
|
);
|
||||||
|
|
||||||
if (classicPlotWorld.PLACE_TOP_BLOCK) {
|
if (classicPlotWorld.PLACE_TOP_BLOCK) {
|
||||||
queue.setCuboid(
|
queue.setCuboid(
|
||||||
@ -541,24 +548,12 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.WALL_HEIGHT + 1, ez - 1),
|
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.WALL_HEIGHT + 1, ez - 1),
|
||||||
classicPlotWorld.WALL_BLOCK.toPattern()
|
classicPlotWorld.WALL_BLOCK.toPattern()
|
||||||
);
|
);
|
||||||
}
|
|
||||||
queue.setCuboid(
|
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex, 1, sz + 1),
|
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.WALL_HEIGHT, ez - 1),
|
|
||||||
classicPlotWorld.WALL_FILLING.toPattern()
|
|
||||||
);
|
|
||||||
if (classicPlotWorld.PLACE_TOP_BLOCK) {
|
|
||||||
queue.setCuboid(
|
queue.setCuboid(
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.WALL_HEIGHT + 1, sz + 1),
|
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.WALL_HEIGHT + 1, sz + 1),
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.WALL_HEIGHT + 1, ez - 1),
|
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.WALL_HEIGHT + 1, ez - 1),
|
||||||
classicPlotWorld.WALL_BLOCK.toPattern()
|
classicPlotWorld.WALL_BLOCK.toPattern()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
queue.setCuboid(
|
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, 1, sz + 1),
|
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.ROAD_HEIGHT, ez - 1),
|
|
||||||
classicPlotWorld.ROAD_BLOCK.toPattern()
|
|
||||||
);
|
|
||||||
return !enqueue || queue.enqueue();
|
return !enqueue || queue.enqueue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -584,19 +579,32 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
classicPlotWorld.schematicStartHeight() + 1,
|
classicPlotWorld.schematicStartHeight() + 1,
|
||||||
sz
|
sz
|
||||||
),
|
),
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.getPlotManager().getWorldHeight(), ez),
|
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.getMaxGenHeight(), ez),
|
||||||
BlockTypes.AIR.getDefaultState()
|
BlockTypes.AIR.getDefaultState()
|
||||||
);
|
);
|
||||||
|
if (classicPlotWorld.PLOT_BEDROCK) {
|
||||||
|
queue.setCuboid(
|
||||||
|
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight(), sz),
|
||||||
|
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.getMinGenHeight(), ez),
|
||||||
|
BlockTypes.BEDROCK.getDefaultState()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
int startYOffset = classicPlotWorld.PLOT_BEDROCK ? 1 : 0;
|
||||||
queue.setCuboid(
|
queue.setCuboid(
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, 0, sz),
|
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight() + startYOffset, sz),
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, 0, ez),
|
|
||||||
BlockUtil.get((short) 7, (byte) 0)
|
|
||||||
);
|
|
||||||
queue.setCuboid(
|
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, 1, sz),
|
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.WALL_HEIGHT, sz),
|
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.WALL_HEIGHT, sz),
|
||||||
classicPlotWorld.WALL_FILLING.toPattern()
|
classicPlotWorld.WALL_FILLING.toPattern()
|
||||||
);
|
);
|
||||||
|
queue.setCuboid(
|
||||||
|
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight() + startYOffset, ez),
|
||||||
|
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.WALL_HEIGHT, ez),
|
||||||
|
classicPlotWorld.WALL_FILLING.toPattern()
|
||||||
|
);
|
||||||
|
queue.setCuboid(
|
||||||
|
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight() + startYOffset, sz + 1),
|
||||||
|
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.ROAD_HEIGHT, ez - 1),
|
||||||
|
classicPlotWorld.ROAD_BLOCK.toPattern()
|
||||||
|
);
|
||||||
|
|
||||||
if (classicPlotWorld.PLACE_TOP_BLOCK) {
|
if (classicPlotWorld.PLACE_TOP_BLOCK) {
|
||||||
queue.setCuboid(
|
queue.setCuboid(
|
||||||
@ -604,24 +612,12 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.WALL_HEIGHT + 1, sz),
|
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.WALL_HEIGHT + 1, sz),
|
||||||
classicPlotWorld.WALL_BLOCK.toPattern()
|
classicPlotWorld.WALL_BLOCK.toPattern()
|
||||||
);
|
);
|
||||||
}
|
|
||||||
queue.setCuboid(
|
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, 1, ez),
|
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.WALL_HEIGHT, ez),
|
|
||||||
classicPlotWorld.WALL_FILLING.toPattern()
|
|
||||||
);
|
|
||||||
if (classicPlotWorld.PLACE_TOP_BLOCK) {
|
|
||||||
queue.setCuboid(
|
queue.setCuboid(
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.WALL_HEIGHT + 1, ez),
|
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.WALL_HEIGHT + 1, ez),
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.WALL_HEIGHT + 1, ez),
|
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.WALL_HEIGHT + 1, ez),
|
||||||
classicPlotWorld.WALL_BLOCK.toPattern()
|
classicPlotWorld.WALL_BLOCK.toPattern()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
queue.setCuboid(
|
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, 1, sz + 1),
|
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.ROAD_HEIGHT, ez - 1),
|
|
||||||
classicPlotWorld.ROAD_BLOCK.toPattern()
|
|
||||||
);
|
|
||||||
return !enqueue || queue.enqueue();
|
return !enqueue || queue.enqueue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -642,14 +638,19 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
|
|
||||||
queue.setCuboid(
|
queue.setCuboid(
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.ROAD_HEIGHT + 1, sz + 1),
|
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.ROAD_HEIGHT + 1, sz + 1),
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.getPlotManager().getWorldHeight(), ez - 1),
|
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.getMaxGenHeight(), ez - 1),
|
||||||
BlockTypes.AIR.getDefaultState()
|
BlockTypes.AIR.getDefaultState()
|
||||||
);
|
);
|
||||||
queue.setCuboid(Location.at(classicPlotWorld.getWorldName(), sx + 1, 0, sz + 1),
|
if (classicPlotWorld.PLOT_BEDROCK) {
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, 0, ez - 1), BlockUtil.get((short) 7, (byte) 0)
|
queue.setCuboid(
|
||||||
);
|
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight(), sz + 1),
|
||||||
|
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.getMinGenHeight(), ez - 1),
|
||||||
|
BlockTypes.BEDROCK.getDefaultState()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
int startYOffset = classicPlotWorld.PLOT_BEDROCK ? 1 : 0;
|
||||||
queue.setCuboid(
|
queue.setCuboid(
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, 1, sz + 1),
|
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight() + startYOffset, sz + 1),
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.ROAD_HEIGHT, ez - 1),
|
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.ROAD_HEIGHT, ez - 1),
|
||||||
classicPlotWorld.ROAD_BLOCK.toPattern()
|
classicPlotWorld.ROAD_BLOCK.toPattern()
|
||||||
);
|
);
|
||||||
@ -679,11 +680,12 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
classicPlotWorld.schematicStartHeight() + 1,
|
classicPlotWorld.schematicStartHeight() + 1,
|
||||||
sz
|
sz
|
||||||
),
|
),
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getPlotManager().getWorldHeight(), ez),
|
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getMaxGenHeight(), ez),
|
||||||
BlockTypes.AIR.getDefaultState()
|
BlockTypes.AIR.getDefaultState()
|
||||||
);
|
);
|
||||||
|
int startYOffset = classicPlotWorld.PLOT_BEDROCK ? 1 : 0;
|
||||||
queue.setCuboid(
|
queue.setCuboid(
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx, 1, sz + 1),
|
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.getMinGenHeight() + startYOffset, sz + 1),
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.PLOT_HEIGHT - 1, ez - 1),
|
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.PLOT_HEIGHT - 1, ez - 1),
|
||||||
classicPlotWorld.MAIN_BLOCK.toPattern()
|
classicPlotWorld.MAIN_BLOCK.toPattern()
|
||||||
);
|
);
|
||||||
@ -719,11 +721,12 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
classicPlotWorld.schematicStartHeight() + 1,
|
classicPlotWorld.schematicStartHeight() + 1,
|
||||||
sz
|
sz
|
||||||
),
|
),
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getPlotManager().getWorldHeight(), ez),
|
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getMaxGenHeight(), ez),
|
||||||
BlockTypes.AIR.getDefaultState()
|
BlockTypes.AIR.getDefaultState()
|
||||||
);
|
);
|
||||||
|
int startYOffset = classicPlotWorld.PLOT_BEDROCK ? 1 : 0;
|
||||||
queue.setCuboid(
|
queue.setCuboid(
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, 1, sz),
|
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight() + startYOffset, sz),
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.PLOT_HEIGHT - 1, ez),
|
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.PLOT_HEIGHT - 1, ez),
|
||||||
classicPlotWorld.MAIN_BLOCK.toPattern()
|
classicPlotWorld.MAIN_BLOCK.toPattern()
|
||||||
);
|
);
|
||||||
@ -758,11 +761,12 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
classicPlotWorld.schematicStartHeight() + 1,
|
classicPlotWorld.schematicStartHeight() + 1,
|
||||||
sz
|
sz
|
||||||
),
|
),
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getPlotManager().getWorldHeight(), ez),
|
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getMaxGenHeight(), ez),
|
||||||
BlockTypes.AIR.getDefaultState()
|
BlockTypes.AIR.getDefaultState()
|
||||||
);
|
);
|
||||||
|
int startYOffset = classicPlotWorld.PLOT_BEDROCK ? 1 : 0;
|
||||||
queue.setCuboid(
|
queue.setCuboid(
|
||||||
Location.at(classicPlotWorld.getWorldName(), sx, 1, sz),
|
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.getMinGenHeight() + startYOffset, sz),
|
||||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.PLOT_HEIGHT - 1, ez),
|
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.PLOT_HEIGHT - 1, ez),
|
||||||
classicPlotWorld.MAIN_BLOCK.toPattern()
|
classicPlotWorld.MAIN_BLOCK.toPattern()
|
||||||
);
|
);
|
||||||
|
@ -127,16 +127,16 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
|
|||||||
public void loadConfiguration(ConfigurationSection config) {
|
public void loadConfiguration(ConfigurationSection config) {
|
||||||
super.loadConfiguration(config);
|
super.loadConfiguration(config);
|
||||||
this.PLOT_BEDROCK = config.getBoolean("plot.bedrock");
|
this.PLOT_BEDROCK = config.getBoolean("plot.bedrock");
|
||||||
this.PLOT_HEIGHT = Math.min(255, config.getInt("plot.height"));
|
this.PLOT_HEIGHT = Math.min(getMaxGenHeight(), config.getInt("plot.height"));
|
||||||
this.MAIN_BLOCK = new BlockBucket(config.getString("plot.filling"));
|
this.MAIN_BLOCK = new BlockBucket(config.getString("plot.filling"));
|
||||||
this.TOP_BLOCK = new BlockBucket(config.getString("plot.floor"));
|
this.TOP_BLOCK = new BlockBucket(config.getString("plot.floor"));
|
||||||
this.WALL_BLOCK = new BlockBucket(config.getString("wall.block"));
|
this.WALL_BLOCK = new BlockBucket(config.getString("wall.block"));
|
||||||
this.ROAD_HEIGHT = Math.min(255, config.getInt("road.height"));
|
this.ROAD_HEIGHT = Math.min(getMaxGenHeight(), config.getInt("road.height"));
|
||||||
this.ROAD_BLOCK = new BlockBucket(config.getString("road.block"));
|
this.ROAD_BLOCK = new BlockBucket(config.getString("road.block"));
|
||||||
this.WALL_FILLING = new BlockBucket(config.getString("wall.filling"));
|
this.WALL_FILLING = new BlockBucket(config.getString("wall.filling"));
|
||||||
this.WALL_HEIGHT = Math.min(254, config.getInt("wall.height"));
|
|
||||||
this.CLAIMED_WALL_BLOCK = new BlockBucket(config.getString("wall.block_claimed"));
|
|
||||||
this.PLACE_TOP_BLOCK = config.getBoolean("wall.place_top_block");
|
this.PLACE_TOP_BLOCK = config.getBoolean("wall.place_top_block");
|
||||||
|
this.WALL_HEIGHT = Math.min(getMaxGenHeight() - (PLACE_TOP_BLOCK ? 1 : 0), config.getInt("wall.height"));
|
||||||
|
this.CLAIMED_WALL_BLOCK = new BlockBucket(config.getString("wall.block_claimed"));
|
||||||
}
|
}
|
||||||
|
|
||||||
int schematicStartHeight() {
|
int schematicStartHeight() {
|
||||||
|
@ -91,7 +91,7 @@ public class HybridGen extends IndependentPlotGenerator {
|
|||||||
if (hybridPlotWorld.PLOT_BEDROCK) {
|
if (hybridPlotWorld.PLOT_BEDROCK) {
|
||||||
for (short x = 0; x < 16; x++) {
|
for (short x = 0; x < 16; x++) {
|
||||||
for (short z = 0; z < 16; z++) {
|
for (short z = 0; z < 16; z++) {
|
||||||
result.setBlock(x, 0, z, BlockTypes.BEDROCK.getDefaultState());
|
result.setBlock(x, hybridPlotWorld.getMinGenHeight(), z, BlockTypes.BEDROCK.getDefaultState());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -156,7 +156,7 @@ public class HybridGen extends IndependentPlotGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// generation
|
// generation
|
||||||
int startY = hybridPlotWorld.PLOT_BEDROCK ? 1 : 0;
|
int startY = hybridPlotWorld.getMinGenHeight() + (hybridPlotWorld.PLOT_BEDROCK ? 1: 0);
|
||||||
for (short x = 0; x < 16; x++) {
|
for (short x = 0; x < 16; x++) {
|
||||||
if (insideRoadX[x]) {
|
if (insideRoadX[x]) {
|
||||||
for (short z = 0; z < 16; z++) {
|
for (short z = 0; z < 16; z++) {
|
||||||
|
@ -46,7 +46,6 @@ import com.sk89q.worldedit.function.pattern.Pattern;
|
|||||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
|
||||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||||
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;
|
||||||
@ -107,22 +106,32 @@ public class HybridPlotManager extends ClassicPlotManager {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean createRoadEast(final @NonNull Plot plot, @Nullable QueueCoordinator queue) {
|
public boolean createRoadEast(final @NonNull Plot plot, @Nullable QueueCoordinator queue) {
|
||||||
|
boolean enqueue = false;
|
||||||
|
if (queue == null) {
|
||||||
|
queue = hybridPlotWorld.getQueue();
|
||||||
|
enqueue = true;
|
||||||
|
}
|
||||||
super.createRoadEast(plot, queue);
|
super.createRoadEast(plot, queue);
|
||||||
PlotId id = plot.getId();
|
PlotId id = plot.getId();
|
||||||
PlotId id2 = PlotId.of(id.getX() + 1, id.getY());
|
PlotId id2 = PlotId.of(id.getX() + 1, id.getY());
|
||||||
Location bot = getPlotBottomLocAbs(id2);
|
Location bot = getPlotBottomLocAbs(id2);
|
||||||
Location top = getPlotTopLocAbs(id);
|
Location top = getPlotTopLocAbs(id);
|
||||||
Location pos1 = Location.at(hybridPlotWorld.getWorldName(), top.getX() + 1, 0, bot.getZ() - 1);
|
Location pos1 = Location.at(
|
||||||
Location pos2 = Location.at(hybridPlotWorld.getWorldName(), bot.getX(), Math.min(getWorldHeight(), 255), top.getZ() + 1);
|
hybridPlotWorld.getWorldName(),
|
||||||
|
top.getX() + 1,
|
||||||
|
hybridPlotWorld.getMinGenHeight(),
|
||||||
|
bot.getZ() - 1
|
||||||
|
);
|
||||||
|
Location pos2 = Location.at(
|
||||||
|
hybridPlotWorld.getWorldName(),
|
||||||
|
bot.getX(),
|
||||||
|
hybridPlotWorld.getMaxGenHeight(),
|
||||||
|
top.getZ() + 1
|
||||||
|
);
|
||||||
this.resetBiome(hybridPlotWorld, pos1, pos2);
|
this.resetBiome(hybridPlotWorld, pos1, pos2);
|
||||||
if (!hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) {
|
if (!hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
boolean enqueue = false;
|
|
||||||
if (queue == null) {
|
|
||||||
queue = hybridPlotWorld.getQueue();
|
|
||||||
enqueue = true;
|
|
||||||
}
|
|
||||||
createSchemAbs(queue, pos1, pos2, true);
|
createSchemAbs(queue, pos1, pos2, true);
|
||||||
return !enqueue || queue.enqueue();
|
return !enqueue || queue.enqueue();
|
||||||
}
|
}
|
||||||
@ -139,7 +148,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(hybridPlotWorld.getWorldName(), pos1.getX(), pos1.getZ(), pos2.getX(), pos2.getZ(), biome);
|
WorldUtil.setBiome(hybridPlotWorld.getWorldName(), new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3()), biome);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,38 +199,38 @@ public class HybridPlotManager extends ClassicPlotManager {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean createRoadSouth(final @NonNull Plot plot, @Nullable QueueCoordinator queue) {
|
public boolean createRoadSouth(final @NonNull Plot plot, @Nullable QueueCoordinator queue) {
|
||||||
|
boolean enqueue = false;
|
||||||
|
if (queue == null) {
|
||||||
|
enqueue = true;
|
||||||
|
queue = hybridPlotWorld.getQueue();
|
||||||
|
}
|
||||||
super.createRoadSouth(plot, queue);
|
super.createRoadSouth(plot, queue);
|
||||||
PlotId id = plot.getId();
|
PlotId id = plot.getId();
|
||||||
PlotId id2 = PlotId.of(id.getX(), id.getY() + 1);
|
PlotId id2 = PlotId.of(id.getX(), id.getY() + 1);
|
||||||
Location bot = getPlotBottomLocAbs(id2);
|
Location bot = getPlotBottomLocAbs(id2);
|
||||||
Location top = getPlotTopLocAbs(id);
|
Location top = getPlotTopLocAbs(id);
|
||||||
Location pos1 = Location.at(hybridPlotWorld.getWorldName(), bot.getX() - 1, 0, top.getZ() + 1);
|
Location pos1 = Location.at(hybridPlotWorld.getWorldName(), bot.getX() - 1, hybridPlotWorld.getMinGenHeight(), top.getZ() + 1);
|
||||||
Location pos2 = Location.at(hybridPlotWorld.getWorldName(), top.getX() + 1, Math.min(getWorldHeight(), 255), bot.getZ());
|
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;
|
||||||
}
|
}
|
||||||
boolean enqueue = false;
|
|
||||||
if (queue == null) {
|
|
||||||
enqueue = true;
|
|
||||||
queue = hybridPlotWorld.getQueue();
|
|
||||||
}
|
|
||||||
createSchemAbs(queue, pos1, pos2, true);
|
createSchemAbs(queue, pos1, pos2, true);
|
||||||
return !enqueue || queue.enqueue();
|
return !enqueue || queue.enqueue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean createRoadSouthEast(final @NonNull Plot plot, @Nullable QueueCoordinator queue) {
|
public boolean createRoadSouthEast(final @NonNull Plot plot, @Nullable QueueCoordinator queue) {
|
||||||
super.createRoadSouthEast(plot, queue);
|
|
||||||
PlotId id = plot.getId();
|
|
||||||
PlotId id2 = PlotId.of(id.getX() + 1, id.getY() + 1);
|
|
||||||
Location pos1 = getPlotTopLocAbs(id).add(1, 0, 1).withY(0);
|
|
||||||
Location pos2 = getPlotBottomLocAbs(id2).withY(Math.min(getWorldHeight(), 255));
|
|
||||||
boolean enqueue = false;
|
boolean enqueue = false;
|
||||||
if (queue == null) {
|
if (queue == null) {
|
||||||
enqueue = true;
|
enqueue = true;
|
||||||
queue = hybridPlotWorld.getQueue();
|
queue = hybridPlotWorld.getQueue();
|
||||||
}
|
}
|
||||||
|
super.createRoadSouthEast(plot, queue);
|
||||||
|
PlotId id = plot.getId();
|
||||||
|
PlotId id2 = PlotId.of(id.getX() + 1, id.getY() + 1);
|
||||||
|
Location pos1 = getPlotTopLocAbs(id).add(1, 0, 1);
|
||||||
|
Location pos2 = getPlotBottomLocAbs(id2);
|
||||||
createSchemAbs(queue, pos1, pos2, true);
|
createSchemAbs(queue, pos1, pos2, true);
|
||||||
if (hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) {
|
if (hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) {
|
||||||
createSchemAbs(queue, pos1, pos2, true);
|
createSchemAbs(queue, pos1, pos2, true);
|
||||||
@ -271,11 +280,23 @@ public class HybridPlotManager extends ClassicPlotManager {
|
|||||||
queue.setCompleteTask(whenDone);
|
queue.setCompleteTask(whenDone);
|
||||||
}
|
}
|
||||||
if (!canRegen) {
|
if (!canRegen) {
|
||||||
queue.setCuboid(pos1.withY(0), pos2.withY(0), bedrock);
|
queue.setCuboid(
|
||||||
|
pos1.withY(hybridPlotWorld.getMinGenHeight()),
|
||||||
|
pos2.withY(hybridPlotWorld.getMinGenHeight()),
|
||||||
|
hybridPlotWorld.PLOT_BEDROCK ? bedrock : filling
|
||||||
|
);
|
||||||
// Each component has a different layer
|
// Each component has a different layer
|
||||||
queue.setCuboid(pos1.withY(1), pos2.withY(hybridPlotWorld.PLOT_HEIGHT - 1), filling);
|
queue.setCuboid(
|
||||||
|
pos1.withY(hybridPlotWorld.getMinGenHeight() + 1),
|
||||||
|
pos2.withY(hybridPlotWorld.PLOT_HEIGHT - 1),
|
||||||
|
filling
|
||||||
|
);
|
||||||
queue.setCuboid(pos1.withY(hybridPlotWorld.PLOT_HEIGHT), pos2.withY(hybridPlotWorld.PLOT_HEIGHT), plotfloor);
|
queue.setCuboid(pos1.withY(hybridPlotWorld.PLOT_HEIGHT), pos2.withY(hybridPlotWorld.PLOT_HEIGHT), plotfloor);
|
||||||
queue.setCuboid(pos1.withY(hybridPlotWorld.PLOT_HEIGHT + 1), pos2.withY(getWorldHeight()), BlockTypes.AIR.getDefaultState());
|
queue.setCuboid(
|
||||||
|
pos1.withY(hybridPlotWorld.PLOT_HEIGHT + 1),
|
||||||
|
pos2.withY(hybridPlotWorld.getMaxGenHeight()),
|
||||||
|
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()));
|
||||||
|
@ -79,6 +79,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
public int SCHEM_Y;
|
public int SCHEM_Y;
|
||||||
private Location SIGN_LOCATION;
|
private Location SIGN_LOCATION;
|
||||||
private File root = null;
|
private File root = null;
|
||||||
|
private int lastOverlayHeightError = Integer.MIN_VALUE;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private SchematicHandler schematicHandler;
|
private SchematicHandler schematicHandler;
|
||||||
@ -171,9 +172,9 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
public void loadConfiguration(ConfigurationSection config) {
|
public void loadConfiguration(ConfigurationSection config) {
|
||||||
super.loadConfiguration(config);
|
super.loadConfiguration(config);
|
||||||
if ((this.ROAD_WIDTH & 1) == 0) {
|
if ((this.ROAD_WIDTH & 1) == 0) {
|
||||||
this.PATH_WIDTH_LOWER = (short) (Math.floor(this.ROAD_WIDTH / 2) - 1);
|
this.PATH_WIDTH_LOWER = (short) (Math.floor(this.ROAD_WIDTH / 2f) - 1);
|
||||||
} else {
|
} else {
|
||||||
this.PATH_WIDTH_LOWER = (short) Math.floor(this.ROAD_WIDTH / 2);
|
this.PATH_WIDTH_LOWER = (short) Math.floor(this.ROAD_WIDTH / 2f);
|
||||||
}
|
}
|
||||||
if (this.ROAD_WIDTH == 0) {
|
if (this.ROAD_WIDTH == 0) {
|
||||||
this.PATH_WIDTH_UPPER = (short) (this.SIZE + 1);
|
this.PATH_WIDTH_UPPER = (short) (this.SIZE + 1);
|
||||||
@ -251,31 +252,34 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
Schematic schematic2 = this.schematicHandler.getSchematic(schematic2File);
|
Schematic schematic2 = this.schematicHandler.getSchematic(schematic2File);
|
||||||
Schematic schematic3 = this.schematicHandler.getSchematic(schematic3File);
|
Schematic schematic3 = this.schematicHandler.getSchematic(schematic3File);
|
||||||
int shift = this.ROAD_WIDTH / 2;
|
int shift = this.ROAD_WIDTH / 2;
|
||||||
int oddshift = (this.ROAD_WIDTH & 1) == 0 ? 0 : 1;
|
int oddshift = (this.ROAD_WIDTH & 1);
|
||||||
|
|
||||||
SCHEM_Y = schematicStartHeight();
|
SCHEM_Y = schematicStartHeight();
|
||||||
int 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;
|
||||||
int roadY = minRoadWall - SCHEM_Y;
|
int roadY = minRoadWall - SCHEM_Y;
|
||||||
|
|
||||||
|
int worldHeight = getMaxGenHeight() - getMinGenHeight() + 1;
|
||||||
|
|
||||||
|
// SCHEM_Y should be normalised to the plot "start" height
|
||||||
if (schematic3 != null) {
|
if (schematic3 != null) {
|
||||||
if (schematic3.getClipboard().getDimensions().getY() == 256) {
|
if (schematic3.getClipboard().getDimensions().getY() == worldHeight) {
|
||||||
SCHEM_Y = plotY = 0;
|
SCHEM_Y = plotY = 0;
|
||||||
} else if (!Settings.Schematics.PASTE_ON_TOP) {
|
} else if (!Settings.Schematics.PASTE_ON_TOP) {
|
||||||
SCHEM_Y = plotY = getMinBuildHeight();
|
SCHEM_Y = plotY = getMinBuildHeight() - getMinGenHeight();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (schematic1 != null) {
|
if (schematic1 != null) {
|
||||||
if (schematic1.getClipboard().getDimensions().getY() == 256) {
|
if (schematic1.getClipboard().getDimensions().getY() == worldHeight) {
|
||||||
SCHEM_Y = roadY = 0;
|
SCHEM_Y = roadY = getMinGenHeight();
|
||||||
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != 256
|
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldHeight
|
||||||
&& !Settings.Schematics.PASTE_ON_TOP) {
|
&& !Settings.Schematics.PASTE_ON_TOP) {
|
||||||
plotY = PLOT_HEIGHT;
|
plotY = PLOT_HEIGHT;
|
||||||
}
|
}
|
||||||
} else if (!Settings.Schematics.PASTE_ROAD_ON_TOP) {
|
} else if (!Settings.Schematics.PASTE_ROAD_ON_TOP) {
|
||||||
SCHEM_Y = roadY = getMinBuildHeight();
|
SCHEM_Y = roadY = getMinBuildHeight();
|
||||||
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != 256
|
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldHeight
|
||||||
&& !Settings.Schematics.PASTE_ON_TOP) {
|
&& !Settings.Schematics.PASTE_ON_TOP) {
|
||||||
plotY = PLOT_HEIGHT;
|
plotY = PLOT_HEIGHT;
|
||||||
}
|
}
|
||||||
@ -428,7 +432,10 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
int pair = MathMan.pair(x, z);
|
int pair = MathMan.pair(x, z);
|
||||||
BaseBlock[] existing = this.G_SCH.computeIfAbsent(pair, k -> new BaseBlock[height]);
|
BaseBlock[] existing = this.G_SCH.computeIfAbsent(pair, k -> new BaseBlock[height]);
|
||||||
if (y >= height) {
|
if (y >= height) {
|
||||||
LOGGER.error("Error adding overlay block. `y > height`");
|
if (y != lastOverlayHeightError) {
|
||||||
|
lastOverlayHeightError = y;
|
||||||
|
LOGGER.error(String.format("Error adding overlay block. `y > height`. y=%s, height=%s", y, height));
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
existing[y] = id;
|
existing[y] = id;
|
||||||
|
@ -45,6 +45,7 @@ import com.plotsquared.core.queue.ChunkQueueCoordinator;
|
|||||||
import com.plotsquared.core.queue.GlobalBlockQueue;
|
import com.plotsquared.core.queue.GlobalBlockQueue;
|
||||||
import com.plotsquared.core.queue.QueueCoordinator;
|
import com.plotsquared.core.queue.QueueCoordinator;
|
||||||
import com.plotsquared.core.util.ChunkManager;
|
import com.plotsquared.core.util.ChunkManager;
|
||||||
|
import com.plotsquared.core.util.EventDispatcher;
|
||||||
import com.plotsquared.core.util.MathMan;
|
import com.plotsquared.core.util.MathMan;
|
||||||
import com.plotsquared.core.util.RegionManager;
|
import com.plotsquared.core.util.RegionManager;
|
||||||
import com.plotsquared.core.util.RegionUtil;
|
import com.plotsquared.core.util.RegionUtil;
|
||||||
@ -64,6 +65,7 @@ import com.sk89q.worldedit.world.block.BlockTypes;
|
|||||||
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.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
@ -72,6 +74,7 @@ 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;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
@ -84,7 +87,9 @@ public class HybridUtils {
|
|||||||
public static HybridUtils manager;
|
public static HybridUtils manager;
|
||||||
public static Set<BlockVector2> regions;
|
public static Set<BlockVector2> regions;
|
||||||
public static int height;
|
public static int height;
|
||||||
public static Set<BlockVector2> chunks = new HashSet<>();
|
// Use ordered for reasonable chunk loading order to reduce paper unloading neighbour chunks and then us attempting to load
|
||||||
|
// them again, causing errors
|
||||||
|
public static Set<BlockVector2> chunks = new LinkedHashSet<>();
|
||||||
public static PlotArea area;
|
public static PlotArea area;
|
||||||
public static boolean UPDATE = false;
|
public static boolean UPDATE = false;
|
||||||
|
|
||||||
@ -93,6 +98,7 @@ public class HybridUtils {
|
|||||||
private final GlobalBlockQueue blockQueue;
|
private final GlobalBlockQueue blockQueue;
|
||||||
private final WorldUtil worldUtil;
|
private final WorldUtil worldUtil;
|
||||||
private final SchematicHandler schematicHandler;
|
private final SchematicHandler schematicHandler;
|
||||||
|
private final EventDispatcher eventDispatcher;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public HybridUtils(
|
public HybridUtils(
|
||||||
@ -100,13 +106,15 @@ public class HybridUtils {
|
|||||||
final @NonNull ChunkManager chunkManager,
|
final @NonNull ChunkManager chunkManager,
|
||||||
final @NonNull GlobalBlockQueue blockQueue,
|
final @NonNull GlobalBlockQueue blockQueue,
|
||||||
final @NonNull WorldUtil worldUtil,
|
final @NonNull WorldUtil worldUtil,
|
||||||
final @NonNull SchematicHandler schematicHandler
|
final @NonNull SchematicHandler schematicHandler,
|
||||||
|
final @NonNull EventDispatcher eventDispatcher
|
||||||
) {
|
) {
|
||||||
this.plotAreaManager = plotAreaManager;
|
this.plotAreaManager = plotAreaManager;
|
||||||
this.chunkManager = chunkManager;
|
this.chunkManager = chunkManager;
|
||||||
this.blockQueue = blockQueue;
|
this.blockQueue = blockQueue;
|
||||||
this.worldUtil = worldUtil;
|
this.worldUtil = worldUtil;
|
||||||
this.schematicHandler = schematicHandler;
|
this.schematicHandler = schematicHandler;
|
||||||
|
this.eventDispatcher = eventDispatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void regeneratePlotWalls(final PlotArea area) {
|
public void regeneratePlotWalls(final PlotArea area) {
|
||||||
@ -141,6 +149,8 @@ public class HybridUtils {
|
|||||||
final int ctz = tz >> 4;
|
final int ctz = tz >> 4;
|
||||||
final int width = tx - bx + 1;
|
final int width = tx - bx + 1;
|
||||||
final int length = tz - bz + 1;
|
final int length = tz - bz + 1;
|
||||||
|
final int height = area.getMaxGenHeight() - area.getMinGenHeight() + 1;
|
||||||
|
final int minHeight = area.getMinGenHeight();
|
||||||
|
|
||||||
final PlotArea area = this.plotAreaManager.getPlotArea(world, null);
|
final PlotArea area = this.plotAreaManager.getPlotArea(world, null);
|
||||||
|
|
||||||
@ -153,7 +163,7 @@ public class HybridUtils {
|
|||||||
|
|
||||||
final BlockState airBlock = BlockTypes.AIR.getDefaultState();
|
final BlockState airBlock = BlockTypes.AIR.getDefaultState();
|
||||||
final BlockState[][][] oldBlocks = chunk.getBlocks();
|
final BlockState[][][] oldBlocks = chunk.getBlocks();
|
||||||
final BlockState[][][] newBlocks = new BlockState[256][width][length];
|
final BlockState[][][] newBlocks = new BlockState[height][width][length];
|
||||||
for (final BlockState[][] newBlock : newBlocks) {
|
for (final BlockState[][] newBlock : newBlocks) {
|
||||||
for (final BlockState[] blockStates : newBlock) {
|
for (final BlockState[] blockStates : newBlock) {
|
||||||
Arrays.fill(blockStates, airBlock);
|
Arrays.fill(blockStates, airBlock);
|
||||||
@ -207,11 +217,12 @@ public class HybridUtils {
|
|||||||
int xx = chunkBlockX + x;
|
int xx = chunkBlockX + x;
|
||||||
for (int z = minZ; z <= maxZ; z++) {
|
for (int z = minZ; z <= maxZ; z++) {
|
||||||
int zz = chunkBlockZ + z;
|
int zz = chunkBlockZ + z;
|
||||||
for (int y = 0; y < 256; y++) {
|
for (int yIndex = 0; yIndex < height; yIndex++) {
|
||||||
|
int y = yIndex + minHeight;
|
||||||
BlockState block = queue.getBlock(xx, y, zz);
|
BlockState block = queue.getBlock(xx, y, zz);
|
||||||
int xr = xb + x;
|
int xr = xb + x;
|
||||||
int zr = zb + z;
|
int zr = zb + z;
|
||||||
newBlocks[y][xr][zr] = block;
|
newBlocks[yIndex][xr][zr] = block;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -228,10 +239,10 @@ public class HybridUtils {
|
|||||||
for (int x = 0; x < width; x++) {
|
for (int x = 0; x < width; x++) {
|
||||||
for (int z = 0; z < length; z++) {
|
for (int z = 0; z < length; z++) {
|
||||||
Set<BlockType> types = new HashSet<>();
|
Set<BlockType> types = new HashSet<>();
|
||||||
for (int y = 0; y < 256; y++) {
|
for (int yIndex = 0; yIndex < height; yIndex++) {
|
||||||
BlockState old = oldBlocks[y][x][z];
|
BlockState old = oldBlocks[yIndex][x][z];
|
||||||
try {
|
try {
|
||||||
BlockState now = newBlocks[y][x][z];
|
BlockState now = newBlocks[yIndex][x][z];
|
||||||
if (!old.equals(now)) {
|
if (!old.equals(now)) {
|
||||||
changes[i]++;
|
changes[i]++;
|
||||||
}
|
}
|
||||||
@ -240,23 +251,23 @@ public class HybridUtils {
|
|||||||
} else {
|
} else {
|
||||||
// check vertices
|
// check vertices
|
||||||
// modifications_adjacent
|
// modifications_adjacent
|
||||||
if (x > 0 && z > 0 && y > 0 && x < width - 1 && z < length - 1 && y < 255) {
|
if (x > 0 && z > 0 && yIndex > 0 && x < width - 1 && z < length - 1 && yIndex < (height - 1)) {
|
||||||
if (newBlocks[y - 1][x][z].getBlockType().getMaterial().isAir()) {
|
if (newBlocks[yIndex - 1][x][z].getBlockType().getMaterial().isAir()) {
|
||||||
faces[i]++;
|
faces[i]++;
|
||||||
}
|
}
|
||||||
if (newBlocks[y][x - 1][z].getBlockType().getMaterial().isAir()) {
|
if (newBlocks[yIndex][x - 1][z].getBlockType().getMaterial().isAir()) {
|
||||||
faces[i]++;
|
faces[i]++;
|
||||||
}
|
}
|
||||||
if (newBlocks[y][x][z - 1].getBlockType().getMaterial().isAir()) {
|
if (newBlocks[yIndex][x][z - 1].getBlockType().getMaterial().isAir()) {
|
||||||
faces[i]++;
|
faces[i]++;
|
||||||
}
|
}
|
||||||
if (newBlocks[y + 1][x][z].getBlockType().getMaterial().isAir()) {
|
if (newBlocks[yIndex + 1][x][z].getBlockType().getMaterial().isAir()) {
|
||||||
faces[i]++;
|
faces[i]++;
|
||||||
}
|
}
|
||||||
if (newBlocks[y][x + 1][z].getBlockType().getMaterial().isAir()) {
|
if (newBlocks[yIndex][x + 1][z].getBlockType().getMaterial().isAir()) {
|
||||||
faces[i]++;
|
faces[i]++;
|
||||||
}
|
}
|
||||||
if (newBlocks[y][x][z + 1].getBlockType().getMaterial().isAir()) {
|
if (newBlocks[yIndex][x][z + 1].getBlockType().getMaterial().isAir()) {
|
||||||
faces[i]++;
|
faces[i]++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -348,7 +359,7 @@ public class HybridUtils {
|
|||||||
result.add(whenDone.value.variety_sd);
|
result.add(whenDone.value.variety_sd);
|
||||||
PlotFlag<?, ?> plotFlag = GlobalFlagContainer.getInstance().getFlag(AnalysisFlag.class).createFlagInstance(
|
PlotFlag<?, ?> plotFlag = GlobalFlagContainer.getInstance().getFlag(AnalysisFlag.class).createFlagInstance(
|
||||||
result);
|
result);
|
||||||
PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, origin);
|
PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, origin);
|
||||||
if (event.getEventResult() == Result.DENY) {
|
if (event.getEventResult() == Result.DENY) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -404,7 +415,7 @@ public class HybridUtils {
|
|||||||
}
|
}
|
||||||
HybridUtils.UPDATE = true;
|
HybridUtils.UPDATE = true;
|
||||||
Set<BlockVector2> regions = this.worldUtil.getChunkChunks(area.getWorldName());
|
Set<BlockVector2> regions = this.worldUtil.getChunkChunks(area.getWorldName());
|
||||||
return scheduleRoadUpdate(area, regions, extend, new HashSet<>());
|
return scheduleRoadUpdate(area, regions, extend, new LinkedHashSet<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean scheduleSingleRegionRoadUpdate(Plot plot, int extend) {
|
public boolean scheduleSingleRegionRoadUpdate(Plot plot, int extend) {
|
||||||
@ -414,7 +425,7 @@ public class HybridUtils {
|
|||||||
HybridUtils.UPDATE = true;
|
HybridUtils.UPDATE = true;
|
||||||
Set<BlockVector2> regions = new HashSet<>();
|
Set<BlockVector2> regions = new HashSet<>();
|
||||||
regions.add(RegionManager.getRegion(plot.getCenterSynchronous()));
|
regions.add(RegionManager.getRegion(plot.getCenterSynchronous()));
|
||||||
return scheduleRoadUpdate(plot.getArea(), regions, extend, new HashSet<>());
|
return scheduleRoadUpdate(plot.getArea(), regions, extend, new LinkedHashSet<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean scheduleRoadUpdate(
|
public boolean scheduleRoadUpdate(
|
||||||
@ -427,26 +438,29 @@ public class HybridUtils {
|
|||||||
HybridUtils.area = area;
|
HybridUtils.area = area;
|
||||||
HybridUtils.height = extend;
|
HybridUtils.height = extend;
|
||||||
HybridUtils.chunks = chunks;
|
HybridUtils.chunks = chunks;
|
||||||
|
final int initial = 1024 * regions.size() + chunks.size();
|
||||||
final AtomicInteger count = new AtomicInteger(0);
|
final AtomicInteger count = new AtomicInteger(0);
|
||||||
TaskManager.runTask(new Runnable() {
|
TaskManager.runTask(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (!UPDATE) {
|
if (!UPDATE) {
|
||||||
Iterator<BlockVector2> iter = chunks.iterator();
|
Iterator<BlockVector2> iter = chunks.iterator();
|
||||||
|
QueueCoordinator queue = blockQueue.getNewQueue(worldUtil.getWeWorld(area.getWorldName()));
|
||||||
while (iter.hasNext()) {
|
while (iter.hasNext()) {
|
||||||
BlockVector2 chunk = iter.next();
|
BlockVector2 chunk = iter.next();
|
||||||
iter.remove();
|
iter.remove();
|
||||||
boolean regenedRoad = regenerateRoad(area, chunk, extend);
|
boolean regenedRoad = regenerateRoad(area, chunk, extend, queue);
|
||||||
if (!regenedRoad) {
|
if (!regenedRoad) {
|
||||||
LOGGER.info("Failed to regenerate roads");
|
LOGGER.info("Failed to regenerate roads in chunk {}", chunk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
queue.enqueue();
|
||||||
LOGGER.info("Cancelled road task");
|
LOGGER.info("Cancelled road task");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
count.incrementAndGet();
|
count.incrementAndGet();
|
||||||
if (count.intValue() % 20 == 0) {
|
if (count.intValue() % 10 == 0) {
|
||||||
LOGGER.info("Progress: {}%", 100 * (2048 - chunks.size()) / 2048);
|
LOGGER.info("Progress: {}%", 100 * (initial - (chunks.size() + 1024 * regions.size())) / initial);
|
||||||
}
|
}
|
||||||
if (HybridUtils.regions.isEmpty() && chunks.isEmpty()) {
|
if (HybridUtils.regions.isEmpty() && chunks.isEmpty()) {
|
||||||
regeneratePlotWalls(area);
|
regeneratePlotWalls(area);
|
||||||
@ -458,7 +472,7 @@ public class HybridUtils {
|
|||||||
final Runnable task = this;
|
final Runnable task = this;
|
||||||
TaskManager.runTaskAsync(() -> {
|
TaskManager.runTaskAsync(() -> {
|
||||||
try {
|
try {
|
||||||
if (chunks.size() < 1024) {
|
if (chunks.size() < 64) {
|
||||||
if (!HybridUtils.regions.isEmpty()) {
|
if (!HybridUtils.regions.isEmpty()) {
|
||||||
Iterator<BlockVector2> iterator = HybridUtils.regions.iterator();
|
Iterator<BlockVector2> iterator = HybridUtils.regions.iterator();
|
||||||
BlockVector2 loc = iterator.next();
|
BlockVector2 loc = iterator.next();
|
||||||
@ -471,18 +485,35 @@ public class HybridUtils {
|
|||||||
}
|
}
|
||||||
if (!chunks.isEmpty()) {
|
if (!chunks.isEmpty()) {
|
||||||
TaskManager.getPlatformImplementation().sync(() -> {
|
TaskManager.getPlatformImplementation().sync(() -> {
|
||||||
long start = System.currentTimeMillis();
|
|
||||||
Iterator<BlockVector2> iterator = chunks.iterator();
|
Iterator<BlockVector2> iterator = chunks.iterator();
|
||||||
while (System.currentTimeMillis() - start < 20 && !chunks.isEmpty()) {
|
if (chunks.size() >= 32) {
|
||||||
|
QueueCoordinator queue = blockQueue.getNewQueue(worldUtil.getWeWorld(area.getWorldName()));
|
||||||
|
for (int i = 0; i < 32; i++) {
|
||||||
|
final BlockVector2 chunk = iterator.next();
|
||||||
|
iterator.remove();
|
||||||
|
boolean regenedRoads = regenerateRoad(area, chunk, extend, queue);
|
||||||
|
if (!regenedRoads) {
|
||||||
|
LOGGER.info("Failed to regenerate the road in chunk {}", chunk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
queue.setCompleteTask(task);
|
||||||
|
queue.enqueue();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
QueueCoordinator queue = blockQueue.getNewQueue(worldUtil.getWeWorld(area.getWorldName()));
|
||||||
|
while (!chunks.isEmpty()) {
|
||||||
final BlockVector2 chunk = iterator.next();
|
final BlockVector2 chunk = iterator.next();
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
boolean regenedRoads = regenerateRoad(area, chunk, extend);
|
boolean regenedRoads = regenerateRoad(area, chunk, extend, queue);
|
||||||
if (!regenedRoads) {
|
if (!regenedRoads) {
|
||||||
LOGGER.info("Failed to regenerate road");
|
LOGGER.info("Failed to regenerate road in chunk {}", chunk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
queue.setCompleteTask(task);
|
||||||
|
queue.enqueue();
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -510,7 +541,6 @@ public class HybridUtils {
|
|||||||
Location bot = plot.getBottomAbs().subtract(1, 0, 1);
|
Location bot = plot.getBottomAbs().subtract(1, 0, 1);
|
||||||
Location top = plot.getTopAbs();
|
Location top = plot.getTopAbs();
|
||||||
final HybridPlotWorld plotworld = (HybridPlotWorld) plot.getArea();
|
final HybridPlotWorld plotworld = (HybridPlotWorld) plot.getArea();
|
||||||
PlotManager plotManager = plotworld.getPlotManager();
|
|
||||||
// Do not use plotworld#schematicStartHeight() here as we want to restore the pre 6.1.4 way of doing it if
|
// Do not use plotworld#schematicStartHeight() here as we want to restore the pre 6.1.4 way of doing it if
|
||||||
// USE_WALL_IN_ROAD_SCHEM_HEIGHT is false
|
// USE_WALL_IN_ROAD_SCHEM_HEIGHT is false
|
||||||
int schemY = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ?
|
int schemY = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ?
|
||||||
@ -520,10 +550,10 @@ public class HybridUtils {
|
|||||||
int sy = Settings.Schematics.PASTE_ROAD_ON_TOP ? schemY : plot.getArea().getMinBuildHeight();
|
int sy = Settings.Schematics.PASTE_ROAD_ON_TOP ? schemY : plot.getArea().getMinBuildHeight();
|
||||||
int ex = bot.getX();
|
int ex = bot.getX();
|
||||||
int ez = top.getZ();
|
int ez = top.getZ();
|
||||||
int ey = get_ey(plotManager, queue, sx, ex, sz, ez, sy);
|
int ey = get_ey(plotworld, queue, sx, ex, sz, ez, sy);
|
||||||
int bz = sz - plotworld.ROAD_WIDTH;
|
int bz = sz - plotworld.ROAD_WIDTH;
|
||||||
int tz = sz - 1;
|
int tz = sz - 1;
|
||||||
int ty = get_ey(plotManager, queue, sx, ex, bz, tz, sy);
|
int ty = get_ey(plotworld, queue, sx, ex, bz, tz, sy);
|
||||||
|
|
||||||
final Set<CuboidRegion> sideRoad = Collections.singleton(RegionUtil.createRegion(sx, ex, sy, ey, sz, ez));
|
final Set<CuboidRegion> sideRoad = Collections.singleton(RegionUtil.createRegion(sx, ex, sy, ey, sz, ez));
|
||||||
final Set<CuboidRegion> intersection = Collections.singleton(RegionUtil.createRegion(sx, ex, sy, ty, bz, tz));
|
final Set<CuboidRegion> intersection = Collections.singleton(RegionUtil.createRegion(sx, ex, sy, ty, bz, tz));
|
||||||
@ -549,11 +579,11 @@ public class HybridUtils {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int get_ey(final PlotManager pm, QueueCoordinator queue, int sx, int ex, int sz, int ez, int sy) {
|
private int get_ey(final HybridPlotWorld hpw, QueueCoordinator queue, int sx, int ex, int sz, int ez, int sy) {
|
||||||
int ey = sy;
|
int ey = sy;
|
||||||
for (int x = sx; x <= ex; x++) {
|
for (int x = sx; x <= ex; x++) {
|
||||||
for (int z = sz; z <= ez; z++) {
|
for (int z = sz; z <= ez; z++) {
|
||||||
for (int y = sy; y <= pm.getWorldHeight(); y++) {
|
for (int y = sy; y <= hpw.getMaxGenHeight(); y++) {
|
||||||
if (y > ey) {
|
if (y > ey) {
|
||||||
BlockState block = queue.getBlock(x, y, z);
|
BlockState block = queue.getBlock(x, y, z);
|
||||||
if (!block.getBlockType().getMaterial().isAir()) {
|
if (!block.getBlockType().getMaterial().isAir()) {
|
||||||
@ -566,7 +596,36 @@ public class HybridUtils {
|
|||||||
return ey;
|
return ey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Regenerate the road in a chunk in a plot area.
|
||||||
|
*
|
||||||
|
* @param area Plot area to regenerate road for
|
||||||
|
* @param chunk Chunk location to regenerate
|
||||||
|
* @param extend How far to extend setting air above the road
|
||||||
|
* @return if successful
|
||||||
|
* @deprecated use {@link HybridUtils#regenerateRoad(PlotArea, BlockVector2, int, QueueCoordinator)}
|
||||||
|
*/
|
||||||
|
@Deprecated(forRemoval = true, since = "6.6.0")
|
||||||
public boolean regenerateRoad(final PlotArea area, final BlockVector2 chunk, int extend) {
|
public boolean regenerateRoad(final PlotArea area, final BlockVector2 chunk, int extend) {
|
||||||
|
return regenerateRoad(area, chunk, extend, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Regenerate the road in a chunk in a plot area.
|
||||||
|
*
|
||||||
|
* @param area Plot area to regenerate road for
|
||||||
|
* @param chunk Chunk location to regenerate
|
||||||
|
* @param extend How far to extend setting air above the road
|
||||||
|
* @param queueCoordinator {@link QueueCoordinator} to use to set the blocks. Null if one should be created and enqueued
|
||||||
|
* @return if successful
|
||||||
|
* @since 6.6.0
|
||||||
|
*/
|
||||||
|
public boolean regenerateRoad(
|
||||||
|
final PlotArea area,
|
||||||
|
final BlockVector2 chunk,
|
||||||
|
int extend,
|
||||||
|
@Nullable QueueCoordinator queueCoordinator
|
||||||
|
) {
|
||||||
int x = chunk.getX() << 4;
|
int x = chunk.getX() << 4;
|
||||||
int z = chunk.getZ() << 4;
|
int z = chunk.getZ() << 4;
|
||||||
int ex = x + 15;
|
int ex = x + 15;
|
||||||
@ -592,92 +651,100 @@ public class HybridUtils {
|
|||||||
z -= plotWorld.ROAD_OFFSET_Z;
|
z -= plotWorld.ROAD_OFFSET_Z;
|
||||||
final int finalX = x;
|
final int finalX = x;
|
||||||
final int finalZ = z;
|
final int finalZ = z;
|
||||||
QueueCoordinator queue = this.blockQueue.getNewQueue(worldUtil.getWeWorld(plotWorld.getWorldName()));
|
final boolean enqueue;
|
||||||
|
final QueueCoordinator queue;
|
||||||
|
if (queueCoordinator == null) {
|
||||||
|
queue = this.blockQueue.getNewQueue(worldUtil.getWeWorld(plotWorld.getWorldName()));
|
||||||
|
enqueue = true;
|
||||||
|
} else {
|
||||||
|
queue = queueCoordinator;
|
||||||
|
enqueue = false;
|
||||||
|
}
|
||||||
if (id1 == null || id2 == null || id1 != id2) {
|
if (id1 == null || id2 == null || id1 != id2) {
|
||||||
this.chunkManager.loadChunk(area.getWorldName(), chunk, false).thenRun(() -> {
|
if (id1 != null) {
|
||||||
if (id1 != null) {
|
Plot p1 = area.getPlotAbs(id1);
|
||||||
Plot p1 = area.getPlotAbs(id1);
|
if (p1 != null && p1.hasOwner() && p1.isMerged()) {
|
||||||
if (p1 != null && p1.hasOwner() && p1.isMerged()) {
|
toCheck.set(true);
|
||||||
toCheck.set(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (id2 != null && !toCheck.get()) {
|
}
|
||||||
Plot p2 = area.getPlotAbs(id2);
|
if (id2 != null && !toCheck.get()) {
|
||||||
if (p2 != null && p2.hasOwner() && p2.isMerged()) {
|
Plot p2 = area.getPlotAbs(id2);
|
||||||
toCheck.set(true);
|
if (p2 != null && p2.hasOwner() && p2.isMerged()) {
|
||||||
}
|
toCheck.set(true);
|
||||||
}
|
}
|
||||||
int size = plotWorld.SIZE;
|
}
|
||||||
for (int X = 0; X < 16; X++) {
|
short size = plotWorld.SIZE;
|
||||||
short absX = (short) ((finalX + X) % size);
|
for (int X = 0; X < 16; X++) {
|
||||||
for (int Z = 0; Z < 16; Z++) {
|
short absX = (short) ((finalX + X) % size);
|
||||||
short absZ = (short) ((finalZ + Z) % size);
|
for (int Z = 0; Z < 16; Z++) {
|
||||||
if (absX < 0) {
|
short absZ = (short) ((finalZ + Z) % size);
|
||||||
absX += size;
|
if (absX < 0) {
|
||||||
}
|
absX += size;
|
||||||
if (absZ < 0) {
|
}
|
||||||
absZ += size;
|
if (absZ < 0) {
|
||||||
}
|
absZ += size;
|
||||||
boolean condition;
|
}
|
||||||
if (toCheck.get()) {
|
boolean condition;
|
||||||
condition = manager.getPlotId(
|
if (toCheck.get()) {
|
||||||
finalX + X + plotWorld.ROAD_OFFSET_X,
|
condition = manager.getPlotId(
|
||||||
1,
|
finalX + X + plotWorld.ROAD_OFFSET_X,
|
||||||
finalZ + Z + plotWorld.ROAD_OFFSET_Z
|
1,
|
||||||
) == null;
|
finalZ + Z + plotWorld.ROAD_OFFSET_Z
|
||||||
} else {
|
) == null;
|
||||||
boolean gx = absX > plotWorld.PATH_WIDTH_LOWER;
|
} else {
|
||||||
boolean gz = absZ > plotWorld.PATH_WIDTH_LOWER;
|
boolean gx = absX > plotWorld.PATH_WIDTH_LOWER;
|
||||||
boolean lx = absX < plotWorld.PATH_WIDTH_UPPER;
|
boolean gz = absZ > plotWorld.PATH_WIDTH_LOWER;
|
||||||
boolean lz = absZ < plotWorld.PATH_WIDTH_UPPER;
|
boolean lx = absX < plotWorld.PATH_WIDTH_UPPER;
|
||||||
condition = !gx || !gz || !lx || !lz;
|
boolean lz = absZ < plotWorld.PATH_WIDTH_UPPER;
|
||||||
}
|
condition = !gx || !gz || !lx || !lz;
|
||||||
if (condition) {
|
}
|
||||||
BaseBlock[] blocks = plotWorld.G_SCH.get(MathMan.pair(absX, absZ));
|
if (condition) {
|
||||||
int minY = Settings.Schematics.PASTE_ROAD_ON_TOP ? plotWorld.SCHEM_Y : 1;
|
BaseBlock[] blocks = plotWorld.G_SCH.get(MathMan.pair(absX, absZ));
|
||||||
int maxY = Math.max(extend, blocks.length);
|
int minY = Settings.Schematics.PASTE_ROAD_ON_TOP ? plotWorld.SCHEM_Y : area.getMinGenHeight() + 1;
|
||||||
for (int y = 0; y < maxY; y++) {
|
int maxDy = Math.max(extend, blocks.length);
|
||||||
if (y > blocks.length - 1) {
|
for (int dy = 0; dy < maxDy; dy++) {
|
||||||
|
if (dy > blocks.length - 1) {
|
||||||
|
queue.setBlock(
|
||||||
|
finalX + X + plotWorld.ROAD_OFFSET_X,
|
||||||
|
minY + dy,
|
||||||
|
finalZ + Z + plotWorld.ROAD_OFFSET_Z,
|
||||||
|
WEExtent.AIRBASE
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
BaseBlock block = blocks[dy];
|
||||||
|
if (block != null) {
|
||||||
queue.setBlock(
|
queue.setBlock(
|
||||||
finalX + X + plotWorld.ROAD_OFFSET_X,
|
finalX + X + plotWorld.ROAD_OFFSET_X,
|
||||||
minY + y,
|
minY + dy,
|
||||||
|
finalZ + Z + plotWorld.ROAD_OFFSET_Z,
|
||||||
|
block
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
queue.setBlock(
|
||||||
|
finalX + X + plotWorld.ROAD_OFFSET_X,
|
||||||
|
minY + dy,
|
||||||
finalZ + Z + plotWorld.ROAD_OFFSET_Z,
|
finalZ + Z + plotWorld.ROAD_OFFSET_Z,
|
||||||
WEExtent.AIRBASE
|
WEExtent.AIRBASE
|
||||||
);
|
);
|
||||||
} else {
|
|
||||||
BaseBlock block = blocks[y];
|
|
||||||
if (block != null) {
|
|
||||||
queue.setBlock(
|
|
||||||
finalX + X + plotWorld.ROAD_OFFSET_X,
|
|
||||||
minY + y,
|
|
||||||
finalZ + Z + plotWorld.ROAD_OFFSET_Z,
|
|
||||||
block
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
queue.setBlock(
|
|
||||||
finalX + X + plotWorld.ROAD_OFFSET_X,
|
|
||||||
minY + y,
|
|
||||||
finalZ + Z + plotWorld.ROAD_OFFSET_Z,
|
|
||||||
WEExtent.AIRBASE
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BiomeType biome = plotWorld.G_SCH_B.get(MathMan.pair(absX, absZ));
|
}
|
||||||
if (biome != null) {
|
BiomeType biome = plotWorld.G_SCH_B.get(MathMan.pair(absX, absZ));
|
||||||
queue.setBiome(finalX + X + plotWorld.ROAD_OFFSET_X, finalZ + Z + plotWorld.ROAD_OFFSET_Z, biome);
|
if (biome != null) {
|
||||||
} else {
|
queue.setBiome(finalX + X + plotWorld.ROAD_OFFSET_X, finalZ + Z + plotWorld.ROAD_OFFSET_Z, biome);
|
||||||
queue.setBiome(
|
} else {
|
||||||
finalX + X + plotWorld.ROAD_OFFSET_X,
|
queue.setBiome(
|
||||||
finalZ + Z + plotWorld.ROAD_OFFSET_Z,
|
finalX + X + plotWorld.ROAD_OFFSET_X,
|
||||||
plotWorld.getPlotBiome()
|
finalZ + Z + plotWorld.ROAD_OFFSET_Z,
|
||||||
);
|
plotWorld.getPlotBiome()
|
||||||
}
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (enqueue) {
|
||||||
queue.enqueue();
|
queue.enqueue();
|
||||||
});
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -96,7 +96,7 @@ public abstract class SquarePlotManager extends GridPlotManager {
|
|||||||
.floor(squarePlotWorld.ROAD_WIDTH / 2) - 1;
|
.floor(squarePlotWorld.ROAD_WIDTH / 2) - 1;
|
||||||
int z = (squarePlotWorld.ROAD_OFFSET_Z + (pz * (squarePlotWorld.ROAD_WIDTH + squarePlotWorld.PLOT_WIDTH))) - (int) Math
|
int z = (squarePlotWorld.ROAD_OFFSET_Z + (pz * (squarePlotWorld.ROAD_WIDTH + squarePlotWorld.PLOT_WIDTH))) - (int) Math
|
||||||
.floor(squarePlotWorld.ROAD_WIDTH / 2) - 1;
|
.floor(squarePlotWorld.ROAD_WIDTH / 2) - 1;
|
||||||
return Location.at(squarePlotWorld.getWorldName(), x, Math.min(getWorldHeight(), 255), z);
|
return Location.at(squarePlotWorld.getWorldName(), x, squarePlotWorld.getMaxGenHeight(), z);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -260,7 +260,7 @@ public abstract class SquarePlotManager extends GridPlotManager {
|
|||||||
- (int) Math.floor(squarePlotWorld.ROAD_WIDTH / 2);
|
- (int) Math.floor(squarePlotWorld.ROAD_WIDTH / 2);
|
||||||
int z = (squarePlotWorld.ROAD_OFFSET_Z + (pz * (squarePlotWorld.ROAD_WIDTH + squarePlotWorld.PLOT_WIDTH))) - squarePlotWorld.PLOT_WIDTH
|
int z = (squarePlotWorld.ROAD_OFFSET_Z + (pz * (squarePlotWorld.ROAD_WIDTH + squarePlotWorld.PLOT_WIDTH))) - squarePlotWorld.PLOT_WIDTH
|
||||||
- (int) Math.floor(squarePlotWorld.ROAD_WIDTH / 2);
|
- (int) Math.floor(squarePlotWorld.ROAD_WIDTH / 2);
|
||||||
return Location.at(squarePlotWorld.getWorldName(), x, squarePlotWorld.getMinBuildHeight(), z);
|
return Location.at(squarePlotWorld.getWorldName(), x, squarePlotWorld.getMinGenHeight(), z);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -174,21 +174,9 @@ public class PlotListener {
|
|||||||
String greeting = plot.getFlag(GreetingFlag.class);
|
String greeting = plot.getFlag(GreetingFlag.class);
|
||||||
if (!greeting.isEmpty()) {
|
if (!greeting.isEmpty()) {
|
||||||
if (!Settings.Chat.NOTIFICATION_AS_ACTIONBAR) {
|
if (!Settings.Chat.NOTIFICATION_AS_ACTIONBAR) {
|
||||||
player.sendMessage(
|
plot.format(StaticCaption.of(greeting), player, false).thenAcceptAsync(player::sendMessage);
|
||||||
TranslatableCaption.of("flags.greeting_flag_format"),
|
|
||||||
Template.of("world", plot.getWorldName()),
|
|
||||||
Template.of("plot_id", plot.getId().toString()),
|
|
||||||
Template.of("alias", plot.getAlias()),
|
|
||||||
Template.of("greeting", greeting)
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
player.sendActionBar(
|
plot.format(StaticCaption.of(greeting), player, false).thenAcceptAsync(player::sendActionBar);
|
||||||
TranslatableCaption.of("flags.greeting_flag_format"),
|
|
||||||
Template.of("world", plot.getWorldName()),
|
|
||||||
Template.of("plot_id", plot.getId().toString()),
|
|
||||||
Template.of("alias", plot.getAlias()),
|
|
||||||
Template.of("greeting", greeting)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -321,7 +309,7 @@ public class PlotListener {
|
|||||||
}
|
}
|
||||||
if ((lastPlot != null) && plot.getId().equals(lastPlot.getId()) && plot.hasOwner()) {
|
if ((lastPlot != null) && plot.getId().equals(lastPlot.getId()) && plot.hasOwner()) {
|
||||||
final UUID plotOwner = plot.getOwnerAbs();
|
final UUID plotOwner = plot.getOwnerAbs();
|
||||||
String owner = PlayerManager.resolveName(plotOwner, false).getComponent(player);
|
String owner = PlayerManager.resolveName(plotOwner, true).getComponent(player);
|
||||||
Caption header = fromFlag ? StaticCaption.of(title) : TranslatableCaption.of("titles" +
|
Caption header = fromFlag ? StaticCaption.of(title) : TranslatableCaption.of("titles" +
|
||||||
".title_entered_plot");
|
".title_entered_plot");
|
||||||
Caption subHeader = fromFlag ? StaticCaption.of(subtitle) : TranslatableCaption.of("titles" +
|
Caption subHeader = fromFlag ? StaticCaption.of(subtitle) : TranslatableCaption.of("titles" +
|
||||||
@ -413,21 +401,9 @@ public class PlotListener {
|
|||||||
String farewell = plot.getFlag(FarewellFlag.class);
|
String farewell = plot.getFlag(FarewellFlag.class);
|
||||||
if (!farewell.isEmpty()) {
|
if (!farewell.isEmpty()) {
|
||||||
if (!Settings.Chat.NOTIFICATION_AS_ACTIONBAR) {
|
if (!Settings.Chat.NOTIFICATION_AS_ACTIONBAR) {
|
||||||
player.sendMessage(
|
plot.format(StaticCaption.of(farewell), player, false).thenAcceptAsync(player::sendMessage);
|
||||||
TranslatableCaption.of("flags.farewell_flag_format"),
|
|
||||||
Template.of("world", plot.getWorldName()),
|
|
||||||
Template.of("plot_id", plot.getId().toString()),
|
|
||||||
Template.of("alias", plot.getAlias()),
|
|
||||||
Template.of("farewell", farewell)
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
player.sendActionBar(
|
plot.format(StaticCaption.of(farewell), player, false).thenAcceptAsync(player::sendActionBar);
|
||||||
TranslatableCaption.of("flags.farewell_flag_format"),
|
|
||||||
Template.of("world", plot.getWorldName()),
|
|
||||||
Template.of("plot_id", plot.getId().toString()),
|
|
||||||
Template.of("alias", plot.getAlias()),
|
|
||||||
Template.of("farewell", farewell)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@ import com.plotsquared.core.plot.world.PlotAreaManager;
|
|||||||
import com.plotsquared.core.util.Permissions;
|
import com.plotsquared.core.util.Permissions;
|
||||||
import com.plotsquared.core.util.WEManager;
|
import com.plotsquared.core.util.WEManager;
|
||||||
import com.plotsquared.core.util.WorldUtil;
|
import com.plotsquared.core.util.WorldUtil;
|
||||||
|
import com.sk89q.worldedit.EditSession;
|
||||||
import com.sk89q.worldedit.WorldEdit;
|
import com.sk89q.worldedit.WorldEdit;
|
||||||
import com.sk89q.worldedit.entity.Player;
|
import com.sk89q.worldedit.entity.Player;
|
||||||
import com.sk89q.worldedit.event.extent.EditSessionEvent;
|
import com.sk89q.worldedit.event.extent.EditSessionEvent;
|
||||||
@ -67,6 +68,9 @@ public class WESubscriber {
|
|||||||
WorldEdit.getInstance().getEventBus().unregister(this);
|
WorldEdit.getInstance().getEventBus().unregister(this);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (event.getStage() != EditSession.Stage.BEFORE_HISTORY) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
World worldObj = event.getWorld();
|
World worldObj = event.getWorld();
|
||||||
if (worldObj == null) {
|
if (worldObj == null) {
|
||||||
return;
|
return;
|
||||||
|
@ -58,6 +58,21 @@ public interface World<T> {
|
|||||||
*/
|
*/
|
||||||
@NonNull String getName();
|
@NonNull String getName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the min world height. Inclusive.
|
||||||
|
*
|
||||||
|
* @since 6.6.0
|
||||||
|
*/
|
||||||
|
int getMinHeight();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the max world height. Inclusive.
|
||||||
|
*
|
||||||
|
* @since 6.6.0
|
||||||
|
*/
|
||||||
|
int getMaxHeight();
|
||||||
|
|
||||||
class NullWorld<T> implements World<T> {
|
class NullWorld<T> implements World<T> {
|
||||||
|
|
||||||
private NullWorld() {
|
private NullWorld() {
|
||||||
@ -74,6 +89,16 @@ public interface World<T> {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMinHeight() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMaxHeight() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(final Object obj) {
|
public boolean equals(final Object obj) {
|
||||||
return obj instanceof NullWorld;
|
return obj instanceof NullWorld;
|
||||||
|
@ -52,6 +52,7 @@ public interface PermissionHolder {
|
|||||||
* @param permission Permission
|
* @param permission Permission
|
||||||
* @param key Permission "key"
|
* @param key Permission "key"
|
||||||
* @return {@code true} if the owner has the given permission, else {@code false}
|
* @return {@code true} if the owner has the given permission, else {@code false}
|
||||||
|
* @since 6.0.10
|
||||||
*/
|
*/
|
||||||
default boolean hasKeyedPermission(
|
default boolean hasKeyedPermission(
|
||||||
final @NonNull String permission,
|
final @NonNull String permission,
|
||||||
@ -115,6 +116,7 @@ public interface PermissionHolder {
|
|||||||
* @param permission Permission
|
* @param permission Permission
|
||||||
* @param key Permission "key"
|
* @param key Permission "key"
|
||||||
* @return {@code true} if the owner has the given permission, else {@code false}
|
* @return {@code true} if the owner has the given permission, else {@code false}
|
||||||
|
* @since 6.0.10
|
||||||
*/
|
*/
|
||||||
boolean hasKeyedPermission(@Nullable String world, @NonNull String permission, @NonNull String key);
|
boolean hasKeyedPermission(@Nullable String world, @NonNull String permission, @NonNull String key);
|
||||||
|
|
||||||
|
@ -59,7 +59,9 @@ public interface PermissionProfile {
|
|||||||
* @param permission Permission
|
* @param permission Permission
|
||||||
* @param key Permission "key"
|
* @param key Permission "key"
|
||||||
* @return {@code true} if the owner has the given permission, else {@code false}
|
* @return {@code true} if the owner has the given permission, else {@code false}
|
||||||
|
* @since 6.0.10
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unused")
|
||||||
default boolean hasKeyedPermission(
|
default boolean hasKeyedPermission(
|
||||||
final @NonNull String permission,
|
final @NonNull String permission,
|
||||||
final @NonNull String key
|
final @NonNull String key
|
||||||
@ -75,6 +77,7 @@ public interface PermissionProfile {
|
|||||||
* @param permission Permission
|
* @param permission Permission
|
||||||
* @param key Permission "key"
|
* @param key Permission "key"
|
||||||
* @return {@code true} if the owner has the given permission, else {@code false}
|
* @return {@code true} if the owner has the given permission, else {@code false}
|
||||||
|
* @since 6.0.10
|
||||||
*/
|
*/
|
||||||
boolean hasKeyedPermission(
|
boolean hasKeyedPermission(
|
||||||
@Nullable String world, final @NonNull String permission,
|
@Nullable String world, final @NonNull String permission,
|
||||||
|
@ -378,9 +378,12 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
|||||||
/**
|
/**
|
||||||
* Get a {@link Set} of plots owned by this player.
|
* Get a {@link Set} of plots owned by this player.
|
||||||
*
|
*
|
||||||
|
* <p>
|
||||||
|
* Take a look at {@link PlotSquared} for more searching functions.
|
||||||
|
* See {@link #getPlotCount()} for the number of plots.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @return a {@link Set} of plots owned by the player
|
* @return a {@link Set} of plots owned by the player
|
||||||
* @see PlotSquared for more searching functions
|
|
||||||
* @see #getPlotCount() for the number of plots
|
|
||||||
*/
|
*/
|
||||||
public Set<Plot> getPlots() {
|
public Set<Plot> getPlots() {
|
||||||
return PlotQuery.newQuery().ownedBy(this).asSet();
|
return PlotQuery.newQuery().ownedBy(this).asSet();
|
||||||
@ -501,7 +504,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
|||||||
* Retrieves the attribute of this player.
|
* Retrieves the attribute of this player.
|
||||||
*
|
*
|
||||||
* @param key metadata key
|
* @param key metadata key
|
||||||
* @return the attribute will be either true or false
|
* @return the attribute will be either {@code true} or {@code false}
|
||||||
*/
|
*/
|
||||||
public boolean getAttribute(String key) {
|
public boolean getAttribute(String key) {
|
||||||
if (!hasPersistentMeta("attrib_" + key)) {
|
if (!hasPersistentMeta("attrib_" + key)) {
|
||||||
@ -572,7 +575,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
|||||||
/**
|
/**
|
||||||
* Check if this player is banned.
|
* Check if this player is banned.
|
||||||
*
|
*
|
||||||
* @return true if the player is banned, false otherwise.
|
* @return {@code true} if the player is banned, {@code false} otherwise.
|
||||||
*/
|
*/
|
||||||
public abstract boolean isBanned();
|
public abstract boolean isBanned();
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ import static com.plotsquared.core.util.entity.EntityCategories.CAP_VEHICLE;
|
|||||||
*/
|
*/
|
||||||
public class Plot {
|
public class Plot {
|
||||||
|
|
||||||
|
@Deprecated(forRemoval = true, since = "6.6.0")
|
||||||
public static final int MAX_HEIGHT = 256;
|
public static final int MAX_HEIGHT = 256;
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + Plot.class.getSimpleName());
|
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + Plot.class.getSimpleName());
|
||||||
@ -219,10 +219,13 @@ public class Plot {
|
|||||||
* Constructor for a new plot.
|
* Constructor for a new plot.
|
||||||
* (Only changes after plot.create() will be properly set in the database)
|
* (Only changes after plot.create() will be properly set in the database)
|
||||||
*
|
*
|
||||||
|
* <p>
|
||||||
|
* See {@link Plot#getPlot(Location)} for existing plots
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @param area the PlotArea where the plot is located
|
* @param area the PlotArea where the plot is located
|
||||||
* @param id the plot id
|
* @param id the plot id
|
||||||
* @param owner the plot owner
|
* @param owner the plot owner
|
||||||
* @see Plot#getPlot(Location) for existing plots
|
|
||||||
*/
|
*/
|
||||||
public Plot(final PlotArea area, final @NonNull PlotId id, final UUID owner) {
|
public Plot(final PlotArea area, final @NonNull PlotId id, final UUID owner) {
|
||||||
this(area, id, owner, 0);
|
this(area, id, owner, 0);
|
||||||
@ -232,9 +235,12 @@ public class Plot {
|
|||||||
* Constructor for an unowned plot.
|
* Constructor for an unowned plot.
|
||||||
* (Only changes after plot.create() will be properly set in the database)
|
* (Only changes after plot.create() will be properly set in the database)
|
||||||
*
|
*
|
||||||
|
* <p>
|
||||||
|
* See {@link Plot#getPlot(Location)} for existing plots
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @param area the PlotArea where the plot is located
|
* @param area the PlotArea where the plot is located
|
||||||
* @param id the plot id
|
* @param id the plot id
|
||||||
* @see Plot#getPlot(Location) for existing plots
|
|
||||||
*/
|
*/
|
||||||
public Plot(final @NonNull PlotArea area, final @NonNull PlotId id) {
|
public Plot(final @NonNull PlotArea area, final @NonNull PlotId id) {
|
||||||
this(area, id, null, 0);
|
this(area, id, null, 0);
|
||||||
@ -245,11 +251,14 @@ public class Plot {
|
|||||||
* The database will ignore any queries regarding temporary plots.
|
* The database will ignore any queries regarding temporary plots.
|
||||||
* Please note that some bulk plot management functions may still affect temporary plots (TODO: fix this)
|
* Please note that some bulk plot management functions may still affect temporary plots (TODO: fix this)
|
||||||
*
|
*
|
||||||
|
* <p>
|
||||||
|
* See {@link Plot#getPlot(Location)} for existing plots
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @param area the PlotArea where the plot is located
|
* @param area the PlotArea where the plot is located
|
||||||
* @param id the plot id
|
* @param id the plot id
|
||||||
* @param owner the owner of the plot
|
* @param owner the owner of the plot
|
||||||
* @param temp Represents whatever the database manager needs it to
|
* @param temp Represents whatever the database manager needs it to
|
||||||
* @see Plot#getPlot(Location) for existing plots
|
|
||||||
*/
|
*/
|
||||||
public Plot(final PlotArea area, final @NonNull PlotId id, final UUID owner, final int temp) {
|
public Plot(final PlotArea area, final @NonNull PlotId id, final UUID owner, final int temp) {
|
||||||
this.area = area;
|
this.area = area;
|
||||||
@ -266,6 +275,10 @@ public class Plot {
|
|||||||
/**
|
/**
|
||||||
* Constructor for a saved plots (Used by the database manager when plots are fetched)
|
* Constructor for a saved plots (Used by the database manager when plots are fetched)
|
||||||
*
|
*
|
||||||
|
* <p>
|
||||||
|
* See {@link Plot#getPlot(Location)} for existing plots
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @param id the plot id
|
* @param id the plot id
|
||||||
* @param owner the plot owner
|
* @param owner the plot owner
|
||||||
* @param trusted the plot trusted players
|
* @param trusted the plot trusted players
|
||||||
@ -278,7 +291,6 @@ public class Plot {
|
|||||||
* @param merged an array giving merged plots
|
* @param merged an array giving merged plots
|
||||||
* @param timestamp when the plot was created
|
* @param timestamp when the plot was created
|
||||||
* @param temp value representing whatever DBManager needs to to. Do not touch tbh.
|
* @param temp value representing whatever DBManager needs to to. Do not touch tbh.
|
||||||
* @see Plot#getPlot(Location) for existing plots
|
|
||||||
*/
|
*/
|
||||||
public Plot(
|
public Plot(
|
||||||
@NonNull PlotId id,
|
@NonNull PlotId id,
|
||||||
@ -418,9 +430,12 @@ public class Plot {
|
|||||||
/**
|
/**
|
||||||
* Return a new/cached plot object at a given location.
|
* Return a new/cached plot object at a given location.
|
||||||
*
|
*
|
||||||
|
* <p>
|
||||||
|
* Use {@link PlotPlayer#getCurrentPlot()} if a player is expected here.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @param location the location of the plot
|
* @param location the location of the plot
|
||||||
* @return plot at location or null
|
* @return plot at location or null
|
||||||
* @see PlotPlayer#getCurrentPlot() if a player is expected here.
|
|
||||||
*/
|
*/
|
||||||
public static @Nullable Plot getPlot(final @NonNull Location location) {
|
public static @Nullable Plot getPlot(final @NonNull Location location) {
|
||||||
final PlotArea pa = location.getPlotArea();
|
final PlotArea pa = location.getPlotArea();
|
||||||
@ -449,7 +464,7 @@ public class Plot {
|
|||||||
* that could alter the de facto owner of the plot.
|
* that could alter the de facto owner of the plot.
|
||||||
*
|
*
|
||||||
* @return The plot owner of this particular (sub-)plot
|
* @return The plot owner of this particular (sub-)plot
|
||||||
* as stored in the database, if one exists. Else, null.
|
* as stored in the database, if one exists. Else, null.
|
||||||
*/
|
*/
|
||||||
public @Nullable UUID getOwnerAbs() {
|
public @Nullable UUID getOwnerAbs() {
|
||||||
return this.owner;
|
return this.owner;
|
||||||
@ -588,10 +603,13 @@ public class Plot {
|
|||||||
/**
|
/**
|
||||||
* Get the plot owner of this particular sub-plot.
|
* Get the plot owner of this particular sub-plot.
|
||||||
* (Merged plots can have multiple owners)
|
* (Merged plots can have multiple owners)
|
||||||
* Direct access is discouraged: use getOwners()
|
* Direct access is discouraged: use {@link #getOwners()}
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* Use {@link #getOwnerAbs()} to get the owner as stored in the database
|
||||||
|
* </p>
|
||||||
*
|
*
|
||||||
* @return Server if ServerPlot flag set, else {@link #getOwnerAbs()}
|
* @return Server if ServerPlot flag set, else {@link #getOwnerAbs()}
|
||||||
* @see #getOwnerAbs() getOwnerAbs() to get the owner as stored in the database
|
|
||||||
*/
|
*/
|
||||||
public @Nullable UUID getOwner() {
|
public @Nullable UUID getOwner() {
|
||||||
if (this.getFlag(ServerPlotFlag.class)) {
|
if (this.getFlag(ServerPlotFlag.class)) {
|
||||||
@ -1201,12 +1219,6 @@ public class Plot {
|
|||||||
*
|
*
|
||||||
* @return array of entity counts
|
* @return array of entity counts
|
||||||
* @see RegionManager#countEntities(Plot)
|
* @see RegionManager#countEntities(Plot)
|
||||||
* 0 = Entity
|
|
||||||
* 1 = Animal
|
|
||||||
* 2 = Monster
|
|
||||||
* 3 = Mob
|
|
||||||
* 4 = Boat
|
|
||||||
* 5 = Misc
|
|
||||||
*/
|
*/
|
||||||
public int[] countEntities() {
|
public int[] countEntities() {
|
||||||
int[] count = new int[6];
|
int[] count = new int[6];
|
||||||
@ -1225,7 +1237,7 @@ public class Plot {
|
|||||||
/**
|
/**
|
||||||
* Returns true if a previous task was running
|
* Returns true if a previous task was running
|
||||||
*
|
*
|
||||||
* @return true if a previous task is running
|
* @return {@code true} if a previous task is running
|
||||||
*/
|
*/
|
||||||
public int addRunning() {
|
public int addRunning() {
|
||||||
int value = this.getRunning();
|
int value = this.getRunning();
|
||||||
@ -1269,7 +1281,7 @@ public class Plot {
|
|||||||
/**
|
/**
|
||||||
* Unclaim the plot (does not modify terrain). Changes made to this plot will not be reflected in unclaimed plot objects.
|
* Unclaim the plot (does not modify terrain). Changes made to this plot will not be reflected in unclaimed plot objects.
|
||||||
*
|
*
|
||||||
* @return false if the Plot has no owner, otherwise true.
|
* @return {@code false} if the Plot has no owner, otherwise {@code true}.
|
||||||
*/
|
*/
|
||||||
public boolean unclaim() {
|
public boolean unclaim() {
|
||||||
if (!this.hasOwner()) {
|
if (!this.hasOwner()) {
|
||||||
@ -1359,7 +1371,7 @@ public class Plot {
|
|||||||
int z = largest.getMinimumPoint().getZ() - 1;
|
int z = largest.getMinimumPoint().getZ() - 1;
|
||||||
PlotManager manager = getManager();
|
PlotManager manager = getManager();
|
||||||
int y = isLoaded() ? this.worldUtil.getHighestBlockSynchronous(getWorldName(), x, z) : 62;
|
int y = isLoaded() ? this.worldUtil.getHighestBlockSynchronous(getWorldName(), x, z) : 62;
|
||||||
if (area.allowSigns() && (y <= 0 || y >= 255)) {
|
if (area.allowSigns() && (y <= area.getMinGenHeight() || y >= area.getMaxGenHeight())) {
|
||||||
y = Math.max(y, manager.getSignLoc(this).getY() - 1);
|
y = Math.max(y, manager.getSignLoc(this).getY() - 1);
|
||||||
}
|
}
|
||||||
return Location.at(getWorldName(), x, y + 1, z);
|
return Location.at(getWorldName(), x, y + 1, z);
|
||||||
@ -1375,7 +1387,7 @@ public class Plot {
|
|||||||
if (isLoaded()) {
|
if (isLoaded()) {
|
||||||
this.worldUtil.getHighestBlock(getWorldName(), x, z, y -> {
|
this.worldUtil.getHighestBlock(getWorldName(), x, z, y -> {
|
||||||
int height = y;
|
int height = y;
|
||||||
if (area.allowSigns() && (y <= 0 || y >= 255)) {
|
if (area.allowSigns() && (y <= area.getMinGenHeight() || y >= area.getMaxGenHeight())) {
|
||||||
height = Math.max(y, manager.getSignLoc(this).getY() - 1);
|
height = Math.max(y, manager.getSignLoc(this).getY() - 1);
|
||||||
}
|
}
|
||||||
result.accept(Location.at(getWorldName(), x, height + 1, z));
|
result.accept(Location.at(getWorldName(), x, height + 1, z));
|
||||||
@ -1453,7 +1465,7 @@ public class Plot {
|
|||||||
.at(
|
.at(
|
||||||
bottom.getWorldName(),
|
bottom.getWorldName(),
|
||||||
bottom.getX() + home.getX(),
|
bottom.getX() + home.getX(),
|
||||||
bottom.getY() + home.getY(),
|
home.getY(), // y is absolute
|
||||||
bottom.getZ() + home.getZ(),
|
bottom.getZ() + home.getZ(),
|
||||||
home.getYaw(),
|
home.getYaw(),
|
||||||
home.getPitch()
|
home.getPitch()
|
||||||
@ -1607,8 +1619,8 @@ public class Plot {
|
|||||||
public double getVolume() {
|
public double getVolume() {
|
||||||
double count = 0;
|
double count = 0;
|
||||||
for (CuboidRegion region : getRegions()) {
|
for (CuboidRegion region : getRegions()) {
|
||||||
count += (region.getMaximumPoint().getX() - (double) region.getMinimumPoint().getX() + 1) * (
|
// CuboidRegion#getArea is deprecated and we want to ensure use of correct height
|
||||||
region.getMaximumPoint().getZ() - (double) region.getMinimumPoint().getZ() + 1) * MAX_HEIGHT;
|
count += region.getLength() * region.getWidth() * (area.getMaxGenHeight() - area.getMinGenHeight() + 1);
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
@ -1686,7 +1698,7 @@ public class Plot {
|
|||||||
return base.settings != null && base.settings.getRatings() != null;
|
return base.settings != null && base.settings.getRatings() != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true, since = "6.1.0")
|
||||||
public boolean claim(final @NonNull PlotPlayer<?> player, boolean teleport, String schematic) {
|
public boolean claim(final @NonNull PlotPlayer<?> player, boolean teleport, String schematic) {
|
||||||
if (!canClaim(player)) {
|
if (!canClaim(player)) {
|
||||||
return false;
|
return false;
|
||||||
@ -1694,7 +1706,7 @@ public class Plot {
|
|||||||
return claim(player, teleport, schematic, true);
|
return claim(player, teleport, schematic, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true, since = "6.1.0")
|
||||||
public boolean claim(final @NonNull PlotPlayer<?> player, boolean teleport, String schematic, boolean updateDB) {
|
public boolean claim(final @NonNull PlotPlayer<?> player, boolean teleport, String schematic, boolean updateDB) {
|
||||||
return claim(player, teleport, schematic, updateDB, false);
|
return claim(player, teleport, schematic, updateDB, false);
|
||||||
}
|
}
|
||||||
@ -1708,6 +1720,7 @@ public class Plot {
|
|||||||
* @param updateDB If the database should be updated
|
* @param updateDB If the database should be updated
|
||||||
* @param auto If the plot is being claimed by a /plot auto
|
* @param auto If the plot is being claimed by a /plot auto
|
||||||
* @return success
|
* @return success
|
||||||
|
* @since 6.1.0
|
||||||
*/
|
*/
|
||||||
public boolean claim(
|
public boolean claim(
|
||||||
final @NonNull PlotPlayer<?> player, boolean teleport, String schematic, boolean updateDB,
|
final @NonNull PlotPlayer<?> player, boolean teleport, String schematic, boolean updateDB,
|
||||||
@ -1725,7 +1738,6 @@ public class Plot {
|
|||||||
area.addPlot(this);
|
area.addPlot(this);
|
||||||
updateWorldBorder();
|
updateWorldBorder();
|
||||||
}
|
}
|
||||||
this.getPlotModificationManager().setSign(player.getName());
|
|
||||||
player.sendMessage(TranslatableCaption.of("working.claimed"), Template.of("plot", this.getId().toString()));
|
player.sendMessage(TranslatableCaption.of("working.claimed"), Template.of("plot", this.getId().toString()));
|
||||||
if (teleport) {
|
if (teleport) {
|
||||||
if (!auto && Settings.Teleport.ON_CLAIM) {
|
if (!auto && Settings.Teleport.ON_CLAIM) {
|
||||||
@ -1773,6 +1785,7 @@ public class Plot {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
plotworld.getPlotManager().claimPlot(this, null);
|
plotworld.getPlotManager().claimPlot(this, null);
|
||||||
|
this.getPlotModificationManager().setSign(player.getName());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2425,8 +2438,8 @@ public class Plot {
|
|||||||
return regions_cache;
|
return regions_cache;
|
||||||
}
|
}
|
||||||
if (!this.isMerged()) {
|
if (!this.isMerged()) {
|
||||||
Location pos1 = this.getBottomAbs();
|
Location pos1 = this.getBottomAbs().withY(getArea().getMinBuildHeight());
|
||||||
Location pos2 = this.getTopAbs();
|
Location pos2 = this.getTopAbs().withY(getArea().getMaxBuildHeight());
|
||||||
connected_cache = Sets.newHashSet(this);
|
connected_cache = Sets.newHashSet(this);
|
||||||
CuboidRegion rg = new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3());
|
CuboidRegion rg = new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3());
|
||||||
regions_cache = Collections.singleton(rg);
|
regions_cache = Collections.singleton(rg);
|
||||||
@ -2669,7 +2682,7 @@ public class Plot {
|
|||||||
/**
|
/**
|
||||||
* Checks if the owner of this Plot is online.
|
* Checks if the owner of this Plot is online.
|
||||||
*
|
*
|
||||||
* @return true if the owner of the Plot is online
|
* @return {@code true} if the owner of the Plot is online
|
||||||
*/
|
*/
|
||||||
public boolean isOnline() {
|
public boolean isOnline() {
|
||||||
if (!this.hasOwner()) {
|
if (!this.hasOwner()) {
|
||||||
@ -3031,8 +3044,11 @@ public class Plot {
|
|||||||
* If rating categories are enabled, get the average rating by category.<br>
|
* If rating categories are enabled, get the average rating by category.<br>
|
||||||
* - The index corresponds to the index of the category in the config
|
* - The index corresponds to the index of the category in the config
|
||||||
*
|
*
|
||||||
|
* <p>
|
||||||
|
* See {@link Settings.Ratings#CATEGORIES} for rating categories
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @return Average ratings in each category
|
* @return Average ratings in each category
|
||||||
* @see Settings.Ratings#CATEGORIES Rating categories
|
|
||||||
*/
|
*/
|
||||||
public @NonNull double[] getAverageRatings() {
|
public @NonNull double[] getAverageRatings() {
|
||||||
Map<UUID, Integer> rating;
|
Map<UUID, Integer> rating;
|
||||||
|
@ -34,8 +34,6 @@ import com.plotsquared.core.configuration.ConfigurationNode;
|
|||||||
import com.plotsquared.core.configuration.ConfigurationSection;
|
import com.plotsquared.core.configuration.ConfigurationSection;
|
||||||
import com.plotsquared.core.configuration.ConfigurationUtil;
|
import com.plotsquared.core.configuration.ConfigurationUtil;
|
||||||
import com.plotsquared.core.configuration.Settings;
|
import com.plotsquared.core.configuration.Settings;
|
||||||
import com.plotsquared.core.configuration.caption.CaptionUtility;
|
|
||||||
import com.plotsquared.core.configuration.caption.LocaleHolder;
|
|
||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
import com.plotsquared.core.configuration.file.YamlConfiguration;
|
import com.plotsquared.core.configuration.file.YamlConfiguration;
|
||||||
import com.plotsquared.core.generator.GridPlotWorld;
|
import com.plotsquared.core.generator.GridPlotWorld;
|
||||||
@ -54,7 +52,6 @@ import com.plotsquared.core.plot.flag.FlagParseException;
|
|||||||
import com.plotsquared.core.plot.flag.GlobalFlagContainer;
|
import com.plotsquared.core.plot.flag.GlobalFlagContainer;
|
||||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
||||||
import com.plotsquared.core.plot.flag.types.DoubleFlag;
|
|
||||||
import com.plotsquared.core.queue.GlobalBlockQueue;
|
import com.plotsquared.core.queue.GlobalBlockQueue;
|
||||||
import com.plotsquared.core.queue.QueueCoordinator;
|
import com.plotsquared.core.queue.QueueCoordinator;
|
||||||
import com.plotsquared.core.util.MathMan;
|
import com.plotsquared.core.util.MathMan;
|
||||||
@ -144,8 +141,10 @@ public abstract class PlotArea {
|
|||||||
private boolean homeAllowNonmember = false;
|
private boolean homeAllowNonmember = false;
|
||||||
private BlockLoc nonmemberHome;
|
private BlockLoc nonmemberHome;
|
||||||
private BlockLoc defaultHome;
|
private BlockLoc defaultHome;
|
||||||
private int maxBuildHeight = 256;
|
private int maxBuildHeight = PlotSquared.platform().versionMaxHeight() + 1; // Exclusive
|
||||||
private int minBuildHeight = 1;
|
private int minBuildHeight = PlotSquared.platform().versionMinHeight() + 1; // Inclusive
|
||||||
|
private int maxGenHeight = PlotSquared.platform().versionMaxHeight(); // Inclusive
|
||||||
|
private int minGenHeight = PlotSquared.platform().versionMinHeight(); // Inclusive
|
||||||
private GameMode gameMode = GameModes.CREATIVE;
|
private GameMode gameMode = GameModes.CREATIVE;
|
||||||
private Map<String, PlotExpression> prices = new HashMap<>();
|
private Map<String, PlotExpression> prices = new HashMap<>();
|
||||||
private List<String> schematics = new ArrayList<>();
|
private List<String> schematics = new ArrayList<>();
|
||||||
@ -295,7 +294,7 @@ public abstract class PlotArea {
|
|||||||
* Check if a PlotArea is compatible (move/copy etc.).
|
* Check if a PlotArea is compatible (move/copy etc.).
|
||||||
*
|
*
|
||||||
* @param plotArea the {@link PlotArea} to compare
|
* @param plotArea the {@link PlotArea} to compare
|
||||||
* @return true if both areas are compatible
|
* @return {@code true} if both areas are compatible
|
||||||
*/
|
*/
|
||||||
public boolean isCompatible(final @NonNull PlotArea plotArea) {
|
public boolean isCompatible(final @NonNull PlotArea plotArea) {
|
||||||
final ConfigurationSection section = this.worldConfiguration.getConfigurationSection("worlds");
|
final ConfigurationSection section = this.worldConfiguration.getConfigurationSection("worlds");
|
||||||
@ -361,6 +360,8 @@ public abstract class PlotArea {
|
|||||||
this.worldBorder = config.getBoolean("world.border");
|
this.worldBorder = config.getBoolean("world.border");
|
||||||
this.maxBuildHeight = config.getInt("world.max_height");
|
this.maxBuildHeight = config.getInt("world.max_height");
|
||||||
this.minBuildHeight = config.getInt("world.min_height");
|
this.minBuildHeight = config.getInt("world.min_height");
|
||||||
|
this.minGenHeight = config.getInt("world.min_gen_height");
|
||||||
|
this.maxGenHeight = config.getInt("world.max_gen_height");
|
||||||
|
|
||||||
switch (config.getString("world.gamemode").toLowerCase()) {
|
switch (config.getString("world.gamemode").toLowerCase()) {
|
||||||
case "creative", "c", "1" -> this.gameMode = GameModes.CREATIVE;
|
case "creative", "c", "1" -> this.gameMode = GameModes.CREATIVE;
|
||||||
@ -484,6 +485,8 @@ public abstract class PlotArea {
|
|||||||
options.put("home.nonmembers", position);
|
options.put("home.nonmembers", position);
|
||||||
options.put("world.max_height", this.getMaxBuildHeight());
|
options.put("world.max_height", this.getMaxBuildHeight());
|
||||||
options.put("world.min_height", this.getMinBuildHeight());
|
options.put("world.min_height", this.getMinBuildHeight());
|
||||||
|
options.put("world.min_gen_height", this.getMinGenHeight());
|
||||||
|
options.put("world.max_gen_height", this.getMaxGenHeight());
|
||||||
options.put("world.gamemode", this.getGameMode().getName().toLowerCase());
|
options.put("world.gamemode", this.getGameMode().getName().toLowerCase());
|
||||||
options.put("road.flags.default", null);
|
options.put("road.flags.default", null);
|
||||||
|
|
||||||
@ -1078,8 +1081,8 @@ public abstract class PlotArea {
|
|||||||
BlockVector2 pos1 = BlockVector2.at(value.getP1().getX(), value.getP1().getY());
|
BlockVector2 pos1 = BlockVector2.at(value.getP1().getX(), value.getP1().getY());
|
||||||
BlockVector2 pos2 = BlockVector2.at(value.getP2().getX(), value.getP2().getY());
|
BlockVector2 pos2 = BlockVector2.at(value.getP2().getX(), value.getP2().getY());
|
||||||
return new CuboidRegion(
|
return new CuboidRegion(
|
||||||
pos1.toBlockVector3(),
|
pos1.toBlockVector3(getMinGenHeight()),
|
||||||
pos2.toBlockVector3(Plot.MAX_HEIGHT - 1)
|
pos2.toBlockVector3(getMaxGenHeight())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -1101,7 +1104,7 @@ public abstract class PlotArea {
|
|||||||
* If a schematic is available, it can be used for plot claiming.
|
* If a schematic is available, it can be used for plot claiming.
|
||||||
*
|
*
|
||||||
* @param schematic the schematic to look for.
|
* @param schematic the schematic to look for.
|
||||||
* @return true if the schematic exists, false otherwise.
|
* @return {@code true} if the schematic exists, {@code false} otherwise.
|
||||||
*/
|
*/
|
||||||
public boolean hasSchematic(@NonNull String schematic) {
|
public boolean hasSchematic(@NonNull String schematic) {
|
||||||
return getSchematics().contains(schematic.toLowerCase());
|
return getSchematics().contains(schematic.toLowerCase());
|
||||||
@ -1110,7 +1113,7 @@ public abstract class PlotArea {
|
|||||||
/**
|
/**
|
||||||
* Get whether economy is enabled and used on this plot area or not.
|
* Get whether economy is enabled and used on this plot area or not.
|
||||||
*
|
*
|
||||||
* @return true if this plot area uses economy, false otherwise.
|
* @return {@code true} if this plot area uses economy, {@code false} otherwise.
|
||||||
*/
|
*/
|
||||||
public boolean useEconomy() {
|
public boolean useEconomy() {
|
||||||
return useEconomy;
|
return useEconomy;
|
||||||
@ -1119,7 +1122,7 @@ public abstract class PlotArea {
|
|||||||
/**
|
/**
|
||||||
* Get whether the plot area is limited by a world border or not.
|
* Get whether the plot area is limited by a world border or not.
|
||||||
*
|
*
|
||||||
* @return true if the plot area has a world border, false otherwise.
|
* @return {@code true} if the plot area has a world border, {@code false} otherwise.
|
||||||
*/
|
*/
|
||||||
public boolean hasWorldBorder() {
|
public boolean hasWorldBorder() {
|
||||||
return worldBorder;
|
return worldBorder;
|
||||||
@ -1128,7 +1131,7 @@ public abstract class PlotArea {
|
|||||||
/**
|
/**
|
||||||
* Get whether plot signs are allowed or not.
|
* Get whether plot signs are allowed or not.
|
||||||
*
|
*
|
||||||
* @return true if plot signs are allow, false otherwise.
|
* @return {@code true} if plot signs are allowed, {@code false} otherwise.
|
||||||
*/
|
*/
|
||||||
public boolean allowSigns() {
|
public boolean allowSigns() {
|
||||||
return allowSigns;
|
return allowSigns;
|
||||||
@ -1276,8 +1279,9 @@ public abstract class PlotArea {
|
|||||||
* @deprecated Use {@link #signMaterial()}. This method is used for 1.13 only and
|
* @deprecated Use {@link #signMaterial()}. This method is used for 1.13 only and
|
||||||
* will be removed without replacement in favor of {@link #signMaterial()}
|
* will be removed without replacement in favor of {@link #signMaterial()}
|
||||||
* once we remove the support for 1.13.
|
* once we remove the support for 1.13.
|
||||||
|
* @since 6.0.3
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true, since = "6.0.3")
|
||||||
public String getLegacySignMaterial() {
|
public String getLegacySignMaterial() {
|
||||||
return this.legacySignMaterial;
|
return this.legacySignMaterial;
|
||||||
}
|
}
|
||||||
@ -1323,14 +1327,18 @@ public abstract class PlotArea {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the location for non-members to be teleported to.
|
* Get the location for non-members to be teleported to.
|
||||||
|
*
|
||||||
|
* @since 6.1.4
|
||||||
*/
|
*/
|
||||||
public BlockLoc nonmemberHome() {
|
public BlockLoc nonmemberHome() {
|
||||||
return this.nonmemberHome;
|
return this.nonmemberHome;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the default location for players to be teleported to. May be overriden by {@link #nonmemberHome} if the player is
|
* Get the default location for players to be teleported to. May be overridden by {@link #nonmemberHome} if the player is
|
||||||
* not a member of the plot.
|
* not a member of the plot.
|
||||||
|
*
|
||||||
|
* @since 6.1.4
|
||||||
*/
|
*/
|
||||||
public BlockLoc defaultHome() {
|
public BlockLoc defaultHome() {
|
||||||
return this.defaultHome;
|
return this.defaultHome;
|
||||||
@ -1339,7 +1347,7 @@ public abstract class PlotArea {
|
|||||||
/**
|
/**
|
||||||
* @deprecated Use {@link #nonmemberHome}
|
* @deprecated Use {@link #nonmemberHome}
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true, since = "6.1.4")
|
||||||
public PlotLoc getNonmemberHome() {
|
public PlotLoc getNonmemberHome() {
|
||||||
return new PlotLoc(this.defaultHome.getX(), this.defaultHome.getY(), this.defaultHome.getZ());
|
return new PlotLoc(this.defaultHome.getX(), this.defaultHome.getY(), this.defaultHome.getZ());
|
||||||
}
|
}
|
||||||
@ -1347,7 +1355,7 @@ public abstract class PlotArea {
|
|||||||
/**
|
/**
|
||||||
* @deprecated Use {@link #defaultHome}
|
* @deprecated Use {@link #defaultHome}
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true, since = "6.1.4")
|
||||||
public PlotLoc getDefaultHome() {
|
public PlotLoc getDefaultHome() {
|
||||||
return new PlotLoc(this.defaultHome.getX(), this.defaultHome.getY(), this.defaultHome.getZ());
|
return new PlotLoc(this.defaultHome.getX(), this.defaultHome.getY(), this.defaultHome.getZ());
|
||||||
}
|
}
|
||||||
@ -1356,14 +1364,38 @@ public abstract class PlotArea {
|
|||||||
this.defaultHome = defaultHome;
|
this.defaultHome = defaultHome;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the maximum height players may build in. Exclusive.
|
||||||
|
*/
|
||||||
public int getMaxBuildHeight() {
|
public int getMaxBuildHeight() {
|
||||||
return this.maxBuildHeight;
|
return this.maxBuildHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the minimum height players may build in. Inclusive.
|
||||||
|
*/
|
||||||
public int getMinBuildHeight() {
|
public int getMinBuildHeight() {
|
||||||
return this.minBuildHeight;
|
return this.minBuildHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the min height from which P2 will generate blocks. Inclusive.
|
||||||
|
*
|
||||||
|
* @since 6.6.0
|
||||||
|
*/
|
||||||
|
public int getMinGenHeight() {
|
||||||
|
return this.minGenHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the max height to which P2 will generate blocks. Inclusive.
|
||||||
|
*
|
||||||
|
* @since 6.6.0
|
||||||
|
*/
|
||||||
|
public int getMaxGenHeight() {
|
||||||
|
return this.maxGenHeight;
|
||||||
|
}
|
||||||
|
|
||||||
public GameMode getGameMode() {
|
public GameMode getGameMode() {
|
||||||
return this.gameMode;
|
return this.gameMode;
|
||||||
}
|
}
|
||||||
|
@ -89,11 +89,17 @@ public class PlotCluster {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setRegion() {
|
private void setRegion() {
|
||||||
this.region = RegionUtil.createRegion(this.pos1.getX(), this.pos2.getX(),
|
this.region = RegionUtil.createRegion(this.pos1.getX(), this.pos2.getX(), 0, 0,
|
||||||
this.pos1.getY(), this.pos2.getY()
|
this.pos1.getY(), this.pos2.getY()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a region of PlotIDs
|
||||||
|
*
|
||||||
|
* @deprecated - returns region of IDs, not of actual blocks.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public CuboidRegion getRegion() {
|
public CuboidRegion getRegion() {
|
||||||
return this.region;
|
return this.region;
|
||||||
}
|
}
|
||||||
@ -165,7 +171,7 @@ public class PlotCluster {
|
|||||||
Consumer<Location> locationConsumer = toReturn ->
|
Consumer<Location> locationConsumer = toReturn ->
|
||||||
PlotSquared.platform().worldUtil().getHighestBlock(this.area.getWorldName(), toReturn.getX(), toReturn.getZ(),
|
PlotSquared.platform().worldUtil().getHighestBlock(this.area.getWorldName(), toReturn.getX(), toReturn.getZ(),
|
||||||
highest -> {
|
highest -> {
|
||||||
if (highest == 0) {
|
if (highest <= area.getMinBuildHeight()) {
|
||||||
highest = 63;
|
highest = 63;
|
||||||
}
|
}
|
||||||
if (highest > toReturn.getY()) {
|
if (highest > toReturn.getY()) {
|
||||||
@ -175,12 +181,12 @@ public class PlotCluster {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
if (home.getY() == 0) {
|
if (home.getY() == Integer.MIN_VALUE) {
|
||||||
// default pos
|
// default pos
|
||||||
Plot center = getCenterPlot();
|
Plot center = getCenterPlot();
|
||||||
center.getHome(location -> {
|
center.getHome(location -> {
|
||||||
Location toReturn = location;
|
Location toReturn = location;
|
||||||
if (toReturn.getY() == 0) {
|
if (toReturn.getY() <= area.getMinBuildHeight()) {
|
||||||
PlotManager manager = this.area.getPlotManager();
|
PlotManager manager = this.area.getPlotManager();
|
||||||
Location locationSign = manager.getSignLoc(center);
|
Location locationSign = manager.getSignLoc(center);
|
||||||
toReturn = toReturn.withY(locationSign.getY());
|
toReturn = toReturn.withY(locationSign.getY());
|
||||||
|
@ -103,9 +103,32 @@ public class PlotInventory {
|
|||||||
this.open = false;
|
this.open = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Put an item into this inventory
|
||||||
|
*
|
||||||
|
* @param index the index (= slot) where to place the item
|
||||||
|
* @param item the item to place
|
||||||
|
* @see #setItemChecked(int, PlotItemStack)
|
||||||
|
*/
|
||||||
public void setItem(int index, PlotItemStack item) {
|
public void setItem(int index, PlotItemStack item) {
|
||||||
|
setItemChecked(index, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Put an item into this inventory, while also checking the existence of the material in the current version
|
||||||
|
*
|
||||||
|
* @param index the index (= slot) where to place the item
|
||||||
|
* @param item the item to place
|
||||||
|
* @return {@code true} if the item could be placed, otherwise {@code false}
|
||||||
|
* @see InventoryUtil#setItemChecked(PlotInventory, int, PlotItemStack)
|
||||||
|
* @since 6.5.0
|
||||||
|
*/
|
||||||
|
public boolean setItemChecked(int index, PlotItemStack item) {
|
||||||
|
if (!this.inventoryUtil.setItemChecked(this, index, item)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
this.items[index] = item;
|
this.items[index] = item;
|
||||||
this.inventoryUtil.setItem(this, index, item);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PlotItemStack getItem(int index) {
|
public PlotItemStack getItem(int index) {
|
||||||
|
@ -46,7 +46,21 @@ public class PlotItemStack {
|
|||||||
final String id, final int amount, final String name,
|
final String id, final int amount, final String name,
|
||||||
final String... lore
|
final String... lore
|
||||||
) {
|
) {
|
||||||
this.type = ItemTypes.get(id);
|
this(ItemTypes.get(id), amount, name, lore);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param type The item type
|
||||||
|
* @param amount Amount of items in the stack
|
||||||
|
* @param name The display name of the item stack
|
||||||
|
* @param lore The item stack lore
|
||||||
|
* @since 6.5.0
|
||||||
|
*/
|
||||||
|
public PlotItemStack(
|
||||||
|
final ItemType type, final int amount, final String name,
|
||||||
|
final String... lore
|
||||||
|
) {
|
||||||
|
this.type = type;
|
||||||
this.amount = amount;
|
this.amount = amount;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.lore = lore;
|
this.lore = lore;
|
||||||
|
@ -187,7 +187,7 @@ public abstract class PlotManager {
|
|||||||
* @param plotIds list of PlotIds to finish the merge for
|
* @param plotIds list of PlotIds to finish the merge for
|
||||||
* @param queue Nullable {@link QueueCoordinator}. If null, creates own queue and enqueues,
|
* @param queue Nullable {@link QueueCoordinator}. If null, creates own queue and enqueues,
|
||||||
* otherwise writes to the queue but does not enqueue.
|
* otherwise writes to the queue but does not enqueue.
|
||||||
* @return false if part if the merge failed, otherwise true if successful.
|
* @return {@code false} if part if the merge failed, otherwise {@code true} if successful.
|
||||||
*/
|
*/
|
||||||
public abstract boolean finishPlotMerge(@NonNull List<PlotId> plotIds, @Nullable QueueCoordinator queue);
|
public abstract boolean finishPlotMerge(@NonNull List<PlotId> plotIds, @Nullable QueueCoordinator queue);
|
||||||
|
|
||||||
@ -214,7 +214,7 @@ public abstract class PlotManager {
|
|||||||
* @return the world height
|
* @return the world height
|
||||||
* @deprecated In favor of custom world heights within 1.17 and therefore scheduled for removal without replacement
|
* @deprecated In favor of custom world heights within 1.17 and therefore scheduled for removal without replacement
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true, since = "6.0.0")
|
||||||
public int getWorldHeight() {
|
public int getWorldHeight() {
|
||||||
return 255;
|
return 255;
|
||||||
}
|
}
|
||||||
@ -224,7 +224,7 @@ public abstract class PlotManager {
|
|||||||
*
|
*
|
||||||
* @param queue Nullable {@link QueueCoordinator}. If null, creates own queue and enqueues,
|
* @param queue Nullable {@link QueueCoordinator}. If null, creates own queue and enqueues,
|
||||||
* otherwise writes to the queue but does not enqueue.
|
* otherwise writes to the queue but does not enqueue.
|
||||||
* @return true if the wall blocks were successfully set
|
* @return {@code true} if the wall blocks were successfully set
|
||||||
*/
|
*/
|
||||||
public boolean regenerateAllPlotWalls(@Nullable QueueCoordinator queue) {
|
public boolean regenerateAllPlotWalls(@Nullable QueueCoordinator queue) {
|
||||||
boolean success = true;
|
boolean success = true;
|
||||||
|
@ -69,8 +69,6 @@ import java.util.concurrent.CompletableFuture;
|
|||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static com.plotsquared.core.plot.Plot.MAX_HEIGHT;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manager that handles {@link Plot} modifications
|
* Manager that handles {@link Plot} modifications
|
||||||
*/
|
*/
|
||||||
@ -190,9 +188,12 @@ public final class PlotModificationManager {
|
|||||||
/**
|
/**
|
||||||
* Clear the plot
|
* Clear the plot
|
||||||
*
|
*
|
||||||
|
* <p>
|
||||||
|
* Use {@link #deletePlot(PlotPlayer, Runnable)} to clear and delete a plot
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @param whenDone A runnable to execute when clearing finishes, or null
|
* @param whenDone A runnable to execute when clearing finishes, or null
|
||||||
* @see #clear(boolean, boolean, PlotPlayer, Runnable)
|
* @see #clear(boolean, boolean, PlotPlayer, Runnable)
|
||||||
* @see #deletePlot(PlotPlayer, Runnable) to clear and delete a plot
|
|
||||||
*/
|
*/
|
||||||
public void clear(final @Nullable Runnable whenDone) {
|
public void clear(final @Nullable Runnable whenDone) {
|
||||||
this.clear(false, false, null, whenDone);
|
this.clear(false, false, null, whenDone);
|
||||||
@ -201,11 +202,14 @@ public final class PlotModificationManager {
|
|||||||
/**
|
/**
|
||||||
* Clear the plot
|
* Clear the plot
|
||||||
*
|
*
|
||||||
|
* <p>
|
||||||
|
* Use {@link #deletePlot(PlotPlayer, Runnable)} to clear and delete a plot
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @param checkRunning Whether or not already executing tasks should be checked
|
* @param checkRunning Whether or not already executing tasks should be checked
|
||||||
* @param isDelete Whether or not the plot is being deleted
|
* @param isDelete Whether or not the plot is being deleted
|
||||||
* @param actor The actor clearing the plot
|
* @param actor The actor clearing the plot
|
||||||
* @param whenDone A runnable to execute when clearing finishes, or null
|
* @param whenDone A runnable to execute when clearing finishes, or null
|
||||||
* @see #deletePlot(PlotPlayer, Runnable) to clear and delete a plot
|
|
||||||
*/
|
*/
|
||||||
public boolean clear(
|
public boolean clear(
|
||||||
final boolean checkRunning,
|
final boolean checkRunning,
|
||||||
@ -256,7 +260,9 @@ public final class PlotModificationManager {
|
|||||||
if (queue.size() > 0) {
|
if (queue.size() > 0) {
|
||||||
queue.setCompleteTask(run);
|
queue.setCompleteTask(run);
|
||||||
queue.enqueue();
|
queue.enqueue();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
run.run();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Plot current = queue.poll();
|
Plot current = queue.poll();
|
||||||
@ -303,7 +309,7 @@ public final class PlotModificationManager {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
CuboidRegion region = regions.poll();
|
CuboidRegion region = regions.poll();
|
||||||
PlotSquared.platform().regionManager().setBiome(region, extendBiome, biome, plot.getWorldName(), this);
|
PlotSquared.platform().regionManager().setBiome(region, extendBiome, biome, plot.getArea(), this);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
run.run();
|
run.run();
|
||||||
@ -327,10 +333,9 @@ public final class PlotModificationManager {
|
|||||||
ids.add(current.getId());
|
ids.add(current.getId());
|
||||||
}
|
}
|
||||||
this.plot.clearRatings();
|
this.plot.clearRatings();
|
||||||
QueueCoordinator queue = null;
|
QueueCoordinator queue = this.plot.getArea().getQueue();
|
||||||
if (createSign) {
|
if (createSign) {
|
||||||
this.removeSign();
|
this.removeSign();
|
||||||
queue = this.plot.getArea().getQueue();
|
|
||||||
}
|
}
|
||||||
PlotManager manager = this.plot.getArea().getPlotManager();
|
PlotManager manager = this.plot.getArea().getPlotManager();
|
||||||
if (createRoad) {
|
if (createRoad) {
|
||||||
@ -448,7 +453,7 @@ public final class PlotModificationManager {
|
|||||||
* - Any setting from before plot creation will not be saved until the server is stopped properly. i.e. Set any values/options after plot
|
* - Any setting from before plot creation will not be saved until the server is stopped properly. i.e. Set any values/options after plot
|
||||||
* creation.
|
* creation.
|
||||||
*
|
*
|
||||||
* @return true if plot was created successfully
|
* @return {@code true} if plot was created successfully
|
||||||
*/
|
*/
|
||||||
public boolean create() {
|
public boolean create() {
|
||||||
return this.create(this.plot.getOwnerAbs(), true);
|
return this.create(this.plot.getOwnerAbs(), true);
|
||||||
@ -519,28 +524,6 @@ public final class PlotModificationManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove the south road section of a plot<br>
|
|
||||||
* - Used when a plot is merged<br>
|
|
||||||
*
|
|
||||||
* @param queue Nullable {@link QueueCoordinator}. If null, creates own queue and enqueues,
|
|
||||||
* otherwise writes to the queue but does not enqueue.
|
|
||||||
*/
|
|
||||||
public void removeRoadSouth(final @Nullable QueueCoordinator queue) {
|
|
||||||
if (this.plot.getArea().getType() != PlotAreaType.NORMAL && this.plot
|
|
||||||
.getArea()
|
|
||||||
.getTerrain() == PlotAreaTerrainType.ROAD) {
|
|
||||||
Plot other = this.plot.getRelative(Direction.SOUTH);
|
|
||||||
Location bot = other.getBottomAbs();
|
|
||||||
Location top = this.plot.getTopAbs();
|
|
||||||
Location pos1 = Location.at(this.plot.getWorldName(), bot.getX(), 0, top.getZ());
|
|
||||||
Location pos2 = Location.at(this.plot.getWorldName(), top.getX(), MAX_HEIGHT, bot.getZ());
|
|
||||||
PlotSquared.platform().regionManager().regenerateRegion(pos1, pos2, true, null);
|
|
||||||
} else if (this.plot.getArea().getTerrain() != PlotAreaTerrainType.ALL) { // no road generated => no road to remove
|
|
||||||
this.plot.getManager().removeRoadSouth(this.plot, queue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Auto merge a plot in a specific direction.
|
* Auto merge a plot in a specific direction.
|
||||||
*
|
*
|
||||||
@ -792,7 +775,7 @@ public final class PlotModificationManager {
|
|||||||
/**
|
/**
|
||||||
* Unlink a plot and remove the roads
|
* Unlink a plot and remove the roads
|
||||||
*
|
*
|
||||||
* @return true if plot was linked
|
* @return {@code true} if plot was linked
|
||||||
* @see #unlinkPlot(boolean, boolean)
|
* @see #unlinkPlot(boolean, boolean)
|
||||||
*/
|
*/
|
||||||
public boolean unlink() {
|
public boolean unlink() {
|
||||||
@ -858,11 +841,14 @@ public final class PlotModificationManager {
|
|||||||
/**
|
/**
|
||||||
* Delete a plot (use null for the runnable if you don't need to be notified on completion)
|
* Delete a plot (use null for the runnable if you don't need to be notified on completion)
|
||||||
*
|
*
|
||||||
|
* <p>
|
||||||
|
* Use {@link PlotModificationManager#clear(boolean, boolean, PlotPlayer, Runnable)} to simply clear a plot
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @param actor The actor executing the task
|
* @param actor The actor executing the task
|
||||||
* @param whenDone task to run when plot has been deleted. Nullable
|
* @param whenDone task to run when plot has been deleted. Nullable
|
||||||
* @return {@code true} if the deletion was successful, {@code false} if not
|
* @return {@code true} if the deletion was successful, {@code false} if not
|
||||||
* @see PlotSquared#removePlot(Plot, boolean)
|
* @see PlotSquared#removePlot(Plot, boolean)
|
||||||
* @see PlotModificationManager#clear(boolean, boolean, PlotPlayer, Runnable) to simply clear a plot
|
|
||||||
*/
|
*/
|
||||||
public boolean deletePlot(@Nullable PlotPlayer<?> actor, final Runnable whenDone) {
|
public boolean deletePlot(@Nullable PlotPlayer<?> actor, final Runnable whenDone) {
|
||||||
if (!this.plot.hasOwner()) {
|
if (!this.plot.hasOwner()) {
|
||||||
@ -904,6 +890,28 @@ public final class PlotModificationManager {
|
|||||||
return this.setComponent(component, parsed.toPattern(), actor, queue);
|
return this.setComponent(component, parsed.toPattern(), actor, queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the south road section of a plot<br>
|
||||||
|
* - Used when a plot is merged<br>
|
||||||
|
*
|
||||||
|
* @param queue Nullable {@link QueueCoordinator}. If null, creates own queue and enqueues,
|
||||||
|
* otherwise writes to the queue but does not enqueue.
|
||||||
|
*/
|
||||||
|
public void removeRoadSouth(final @Nullable QueueCoordinator queue) {
|
||||||
|
if (this.plot.getArea().getType() != PlotAreaType.NORMAL && this.plot
|
||||||
|
.getArea()
|
||||||
|
.getTerrain() == PlotAreaTerrainType.ROAD) {
|
||||||
|
Plot other = this.plot.getRelative(Direction.SOUTH);
|
||||||
|
Location bot = other.getBottomAbs();
|
||||||
|
Location top = this.plot.getTopAbs();
|
||||||
|
Location pos1 = Location.at(this.plot.getWorldName(), bot.getX(), plot.getArea().getMinGenHeight(), top.getZ());
|
||||||
|
Location pos2 = Location.at(this.plot.getWorldName(), top.getX(), plot.getArea().getMaxGenHeight(), bot.getZ());
|
||||||
|
PlotSquared.platform().regionManager().regenerateRegion(pos1, pos2, true, null);
|
||||||
|
} else if (this.plot.getArea().getTerrain() != PlotAreaTerrainType.ALL) { // no road generated => no road to remove
|
||||||
|
this.plot.getManager().removeRoadSouth(this.plot, queue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the east road section of a plot<br>
|
* Remove the east road section of a plot<br>
|
||||||
* - Used when a plot is merged<br>
|
* - Used when a plot is merged<br>
|
||||||
@ -918,8 +926,8 @@ public final class PlotModificationManager {
|
|||||||
Plot other = this.plot.getRelative(Direction.EAST);
|
Plot other = this.plot.getRelative(Direction.EAST);
|
||||||
Location bot = other.getBottomAbs();
|
Location bot = other.getBottomAbs();
|
||||||
Location top = this.plot.getTopAbs();
|
Location top = this.plot.getTopAbs();
|
||||||
Location pos1 = Location.at(this.plot.getWorldName(), top.getX(), 0, bot.getZ());
|
Location pos1 = Location.at(this.plot.getWorldName(), top.getX(), plot.getArea().getMinGenHeight(), bot.getZ());
|
||||||
Location pos2 = Location.at(this.plot.getWorldName(), bot.getX(), MAX_HEIGHT, top.getZ());
|
Location pos2 = Location.at(this.plot.getWorldName(), bot.getX(), plot.getArea().getMaxGenHeight(), top.getZ());
|
||||||
PlotSquared.platform().regionManager().regenerateRegion(pos1, pos2, true, null);
|
PlotSquared.platform().regionManager().regenerateRegion(pos1, pos2, true, null);
|
||||||
} else if (this.plot.getArea().getTerrain() != PlotAreaTerrainType.ALL) { // no road generated => no road to remove
|
} else if (this.plot.getArea().getTerrain() != PlotAreaTerrainType.ALL) { // no road generated => no road to remove
|
||||||
this.plot.getArea().getPlotManager().removeRoadEast(this.plot, queue);
|
this.plot.getArea().getPlotManager().removeRoadEast(this.plot, queue);
|
||||||
@ -937,8 +945,8 @@ public final class PlotModificationManager {
|
|||||||
.getArea()
|
.getArea()
|
||||||
.getTerrain() == PlotAreaTerrainType.ROAD) {
|
.getTerrain() == PlotAreaTerrainType.ROAD) {
|
||||||
Plot other = this.plot.getRelative(1, 1);
|
Plot other = this.plot.getRelative(1, 1);
|
||||||
Location pos1 = this.plot.getTopAbs().add(1, 0, 1).withY(0);
|
Location pos1 = this.plot.getTopAbs().add(1, 0, 1);
|
||||||
Location pos2 = other.getBottomAbs().subtract(1, 0, 1).withY(MAX_HEIGHT);
|
Location pos2 = other.getBottomAbs().subtract(1, 0, 1);
|
||||||
PlotSquared.platform().regionManager().regenerateRegion(pos1, pos2, true, null);
|
PlotSquared.platform().regionManager().regenerateRegion(pos1, pos2, true, null);
|
||||||
} else if (this.plot.getArea().getTerrain() != PlotAreaTerrainType.ALL) { // no road generated => no road to remove
|
} else if (this.plot.getArea().getTerrain() != PlotAreaTerrainType.ALL) { // no road generated => no road to remove
|
||||||
this.plot.getArea().getPlotManager().removeRoadSouthEast(this.plot, queue);
|
this.plot.getArea().getPlotManager().removeRoadSouthEast(this.plot, queue);
|
||||||
|
@ -30,6 +30,9 @@ import java.util.Objects;
|
|||||||
|
|
||||||
public class PlotTitle {
|
public class PlotTitle {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 6.1.0
|
||||||
|
*/
|
||||||
public static final PlotTitle CONFIGURED = new PlotTitle();
|
public static final PlotTitle CONFIGURED = new PlotTitle();
|
||||||
|
|
||||||
private final String title;
|
private final String title;
|
||||||
@ -40,6 +43,9 @@ public class PlotTitle {
|
|||||||
subtitle = null;
|
subtitle = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 6.0.10
|
||||||
|
*/
|
||||||
public PlotTitle(String title, String subtitle) {
|
public PlotTitle(String title, String subtitle) {
|
||||||
Objects.requireNonNull(title);
|
Objects.requireNonNull(title);
|
||||||
Objects.requireNonNull(subtitle);
|
Objects.requireNonNull(subtitle);
|
||||||
@ -47,11 +53,17 @@ public class PlotTitle {
|
|||||||
this.subtitle = subtitle;
|
this.subtitle = subtitle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 6.0.10
|
||||||
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public String title() {
|
public String title() {
|
||||||
return title;
|
return title;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 6.0.10
|
||||||
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public String subtitle() {
|
public String subtitle() {
|
||||||
return subtitle;
|
return subtitle;
|
||||||
|
@ -105,31 +105,29 @@ public abstract class PlotWorld {
|
|||||||
return this.world;
|
return this.world;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean equals(final Object o) {
|
public boolean equals(final Object o) {
|
||||||
if (o == this) {
|
if (this == o) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!(o instanceof final PlotWorld other)) {
|
if (o == null || getClass() != o.getClass()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!other.canEqual(this)) {
|
final PlotWorld plotWorld = (PlotWorld) o;
|
||||||
return false;
|
return world.equals(plotWorld.world);
|
||||||
}
|
|
||||||
final Object this$world = this.getWorld();
|
|
||||||
final Object other$world = other.getWorld();
|
|
||||||
return Objects.equals(this$world, other$world);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return world.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated This method is not meant to be invoked or overridden, with no replacement.
|
||||||
|
*/
|
||||||
|
@Deprecated(forRemoval = true, since = "6.6.0")
|
||||||
protected boolean canEqual(final Object other) {
|
protected boolean canEqual(final Object other) {
|
||||||
return other instanceof PlotWorld;
|
return other instanceof PlotWorld;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int hashCode() {
|
|
||||||
final int PRIME = 59;
|
|
||||||
int result = 1;
|
|
||||||
final Object $world = this.getWorld();
|
|
||||||
result = result * PRIME + ($world == null ? 43 : $world.hashCode());
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ public abstract class CommentInbox {
|
|||||||
/**
|
/**
|
||||||
* @param plot the plot's inbox to write to
|
* @param plot the plot's inbox to write to
|
||||||
* @param player the player trying to write the comment
|
* @param player the player trying to write the comment
|
||||||
* @return true if the player can write a comment on the plot
|
* @return {@code true} if the player can write a comment on the plot
|
||||||
*/
|
*/
|
||||||
public boolean canWrite(Plot plot, PlotPlayer<?> player) {
|
public boolean canWrite(Plot plot, PlotPlayer<?> player) {
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
@ -68,7 +68,7 @@ public abstract class CommentInbox {
|
|||||||
/**
|
/**
|
||||||
* @param plot the plot's inbox to write to
|
* @param plot the plot's inbox to write to
|
||||||
* @param player the player trying to modify the inbox
|
* @param player the player trying to modify the inbox
|
||||||
* @return true if the player can write a comment on the plot
|
* @return {@code true} if the player can write a comment on the plot
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({"BooleanMethodIsAlwaysInverted"})
|
@SuppressWarnings({"BooleanMethodIsAlwaysInverted"})
|
||||||
public boolean canModify(Plot plot, PlotPlayer<?> player) {
|
public boolean canModify(Plot plot, PlotPlayer<?> player) {
|
||||||
|
@ -136,18 +136,18 @@ public class ExpireManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void confirmExpiry(final PlotPlayer<?> pp) {
|
public void confirmExpiry(final PlotPlayer<?> pp) {
|
||||||
try (final MetaDataAccess<Boolean> metaDataAccess = pp.accessTemporaryMetaData(
|
TaskManager.runTask(() -> {
|
||||||
PlayerMetaDataKeys.TEMPORARY_IGNORE_EXPIRE_TASK)) {
|
try (final MetaDataAccess<Boolean> metaDataAccess = pp.accessTemporaryMetaData(
|
||||||
if (metaDataAccess.isPresent()) {
|
PlayerMetaDataKeys.TEMPORARY_IGNORE_EXPIRE_TASK)) {
|
||||||
return;
|
if (metaDataAccess.isPresent()) {
|
||||||
}
|
return;
|
||||||
if (plotsToDelete != null && !plotsToDelete.isEmpty() && pp.hasPermission("plots.admin.command.autoclear")) {
|
}
|
||||||
final int num = plotsToDelete.size();
|
if (plotsToDelete != null && !plotsToDelete.isEmpty() && pp.hasPermission("plots.admin.command.autoclear")) {
|
||||||
while (!plotsToDelete.isEmpty()) {
|
final int num = plotsToDelete.size();
|
||||||
Iterator<Plot> iter = plotsToDelete.iterator();
|
while (!plotsToDelete.isEmpty()) {
|
||||||
final Plot current = iter.next();
|
Iterator<Plot> iter = plotsToDelete.iterator();
|
||||||
if (!isExpired(new ArrayDeque<>(tasks), current).isEmpty()) {
|
final Plot current = iter.next();
|
||||||
TaskManager.runTask(() -> {
|
if (!isExpired(new ArrayDeque<>(tasks), current).isEmpty()) {
|
||||||
metaDataAccess.set(true);
|
metaDataAccess.set(true);
|
||||||
current.getCenter(pp::teleport);
|
current.getCenter(pp::teleport);
|
||||||
metaDataAccess.remove();
|
metaDataAccess.remove();
|
||||||
@ -171,15 +171,15 @@ public class ExpireManager {
|
|||||||
cmd_keep,
|
cmd_keep,
|
||||||
cmd_no_show_expir
|
cmd_no_show_expir
|
||||||
);
|
);
|
||||||
});
|
return;
|
||||||
return;
|
} else {
|
||||||
} else {
|
iter.remove();
|
||||||
iter.remove();
|
}
|
||||||
}
|
}
|
||||||
|
plotsToDelete.clear();
|
||||||
}
|
}
|
||||||
plotsToDelete.clear();
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -307,6 +307,7 @@ public class ExpireManager {
|
|||||||
this.running = 2;
|
this.running = 2;
|
||||||
TaskManager.runTaskAsync(new Runnable() {
|
TaskManager.runTaskAsync(new Runnable() {
|
||||||
private ConcurrentLinkedDeque<Plot> plots = null;
|
private ConcurrentLinkedDeque<Plot> plots = null;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
final Runnable task = this;
|
final Runnable task = this;
|
||||||
@ -359,7 +360,7 @@ public class ExpireManager {
|
|||||||
.getFlag(AnalysisFlag.class)
|
.getFlag(AnalysisFlag.class)
|
||||||
.createFlagInstance(changed.asList());
|
.createFlagInstance(changed.asList());
|
||||||
PlotFlagAddEvent event =
|
PlotFlagAddEvent event =
|
||||||
new PlotFlagAddEvent(plotFlag, newPlot);
|
eventDispatcher.callFlagAdd(plotFlag, plot);
|
||||||
if (event.getEventResult() == Result.DENY) {
|
if (event.getEventResult() == Result.DENY) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -451,7 +452,7 @@ public class ExpireManager {
|
|||||||
plot.getPlotModificationManager().deletePlot(null, whenDone);
|
plot.getPlotModificationManager().deletePlot(null, whenDone);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated(forRemoval = true, since = "TODO")
|
@Deprecated(forRemoval = true, since = "6.4.0")
|
||||||
public long getAge(UUID uuid) {
|
public long getAge(UUID uuid) {
|
||||||
return getAge(uuid, false);
|
return getAge(uuid, false);
|
||||||
}
|
}
|
||||||
@ -462,7 +463,7 @@ public class ExpireManager {
|
|||||||
* @param uuid the uuid of the owner to check against
|
* @param uuid the uuid of the owner to check against
|
||||||
* @param shouldDeleteUnknownOwner {@code true} if an unknown player should be counted as never online
|
* @param shouldDeleteUnknownOwner {@code true} if an unknown player should be counted as never online
|
||||||
* @return the millis since the player was last online, or {@link Long#MAX_VALUE} if player was never online
|
* @return the millis since the player was last online, or {@link Long#MAX_VALUE} if player was never online
|
||||||
* @since TODO
|
* @since 6.4.0
|
||||||
*/
|
*/
|
||||||
public long getAge(UUID uuid, final boolean shouldDeleteUnknownOwner) {
|
public long getAge(UUID uuid, final boolean shouldDeleteUnknownOwner) {
|
||||||
if (PlotSquared.platform().playerManager().getPlayerIfExists(uuid) != null) {
|
if (PlotSquared.platform().playerManager().getPlayerIfExists(uuid) != null) {
|
||||||
|
@ -160,7 +160,7 @@ 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 TODO
|
* @since 6.4.0
|
||||||
*/
|
*/
|
||||||
public boolean shouldDeleteForUnknownOwner() {
|
public boolean shouldDeleteForUnknownOwner() {
|
||||||
return settings.DELETE_IF_OWNER_IS_UNKNOWN;
|
return settings.DELETE_IF_OWNER_IS_UNKNOWN;
|
||||||
|
@ -142,10 +142,13 @@ public class FlagContainer {
|
|||||||
/**
|
/**
|
||||||
* Add a flag to the container
|
* Add a flag to the container
|
||||||
*
|
*
|
||||||
|
* <p>
|
||||||
|
* Use {@link #addAll(Collection)} to add multiple flags.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @param flag Flag to add
|
* @param flag Flag to add
|
||||||
* @param <T> flag type
|
* @param <T> flag type
|
||||||
* @param <V> flag value type
|
* @param <V> flag value type
|
||||||
* @see #addAll(Collection) to add multiple flags
|
|
||||||
*/
|
*/
|
||||||
public <V, T extends PlotFlag<V, ?>> void addFlag(final T flag) {
|
public <V, T extends PlotFlag<V, ?>> void addFlag(final T flag) {
|
||||||
try {
|
try {
|
||||||
@ -199,8 +202,11 @@ public class FlagContainer {
|
|||||||
/**
|
/**
|
||||||
* Add all flags to the container
|
* Add all flags to the container
|
||||||
*
|
*
|
||||||
|
* <p>
|
||||||
|
* Use {@link #addFlag(PlotFlag)} to add a single flag.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @param flags Flags to add
|
* @param flags Flags to add
|
||||||
* @see #addFlag(PlotFlag) to add a single flagg
|
|
||||||
*/
|
*/
|
||||||
public void addAll(final Collection<PlotFlag<?, ?>> flags) {
|
public void addAll(final Collection<PlotFlag<?, ?>> flags) {
|
||||||
for (final PlotFlag<?, ?> flag : flags) {
|
for (final PlotFlag<?, ?> flag : flags) {
|
||||||
@ -305,8 +311,11 @@ public class FlagContainer {
|
|||||||
* Updates are: a flag being removed, a flag being added or a flag
|
* Updates are: a flag being removed, a flag being added or a flag
|
||||||
* being updated.
|
* being updated.
|
||||||
*
|
*
|
||||||
|
* <p>
|
||||||
|
* Use {@link PlotFlagUpdateType} to see the update types available.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @param plotFlagUpdateHandler The update handler which will react to changes.
|
* @param plotFlagUpdateHandler The update handler which will react to changes.
|
||||||
* @see PlotFlagUpdateType Plot flag update types
|
|
||||||
*/
|
*/
|
||||||
public void subscribe(final @NonNull PlotFlagUpdateHandler plotFlagUpdateHandler) {
|
public void subscribe(final @NonNull PlotFlagUpdateHandler plotFlagUpdateHandler) {
|
||||||
this.updateSubscribers.add(plotFlagUpdateHandler);
|
this.updateSubscribers.add(plotFlagUpdateHandler);
|
||||||
@ -349,6 +358,7 @@ public class FlagContainer {
|
|||||||
* This is to prevent memory leaks. This method is not part of the API.
|
* This is to prevent memory leaks. This method is not part of the API.
|
||||||
*
|
*
|
||||||
* @return a new Runnable that cleans up once the FlagContainer isn't needed anymore.
|
* @return a new Runnable that cleans up once the FlagContainer isn't needed anymore.
|
||||||
|
* @since 6.0.10
|
||||||
*/
|
*/
|
||||||
@AnnotationHelper.ApiDescription(info = "This method should not be considered as public or API.")
|
@AnnotationHelper.ApiDescription(info = "This method should not be considered as public or API.")
|
||||||
public Runnable createCleanupHook() {
|
public Runnable createCleanupHook() {
|
||||||
@ -361,33 +371,31 @@ public class FlagContainer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean equals(final Object o) {
|
public boolean equals(final Object o) {
|
||||||
if (o == this) {
|
if (this == o) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!(o instanceof final FlagContainer other)) {
|
if (o == null || getClass() != o.getClass()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!other.canEqual(this)) {
|
final FlagContainer that = (FlagContainer) o;
|
||||||
return false;
|
return flagMap.equals(that.flagMap);
|
||||||
}
|
|
||||||
final Object this$flagMap = this.getFlagMap();
|
|
||||||
final Object other$flagMap = other.getFlagMap();
|
|
||||||
return Objects.equals(this$flagMap, other$flagMap);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return flagMap.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated This method is not meant to be invoked or overridden, with no replacement.
|
||||||
|
*/
|
||||||
|
@Deprecated(forRemoval = true, since = "6.6.0")
|
||||||
protected boolean canEqual(final Object other) {
|
protected boolean canEqual(final Object other) {
|
||||||
return other instanceof FlagContainer;
|
return other instanceof FlagContainer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int hashCode() {
|
|
||||||
final int PRIME = 59;
|
|
||||||
int result = 1;
|
|
||||||
final Object $flagMap = this.getFlagMap();
|
|
||||||
result = result * PRIME + ($flagMap == null ? 43 : $flagMap.hashCode());
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update event types used in {@link PlotFlagUpdateHandler}.
|
* Update event types used in {@link PlotFlagUpdateHandler}.
|
||||||
*/
|
*/
|
||||||
|
@ -93,6 +93,7 @@ import com.plotsquared.core.plot.flag.implementations.PlayerInteractFlag;
|
|||||||
import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag;
|
import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag;
|
import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.PriceFlag;
|
import com.plotsquared.core.plot.flag.implementations.PriceFlag;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.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;
|
||||||
@ -134,17 +135,28 @@ public final class GlobalFlagContainer extends FlagContainer {
|
|||||||
stringClassMap = new HashMap<>();
|
stringClassMap = new HashMap<>();
|
||||||
|
|
||||||
// Register all default flags here
|
// Register all default flags here
|
||||||
|
// Block type list flags
|
||||||
|
this.addFlag(BreakFlag.BREAK_NONE);
|
||||||
|
this.addFlag(UseFlag.USE_NONE);
|
||||||
|
this.addFlag(PlaceFlag.PLACE_NONE);
|
||||||
|
|
||||||
// Boolean flags
|
// Boolean flags
|
||||||
this.addFlag(ExplosionFlag.EXPLOSION_FALSE);
|
|
||||||
this.addFlag(UntrustedVisitFlag.UNTRUSTED_VISIT_FLAG_TRUE);
|
|
||||||
this.addFlag(DenyExitFlag.DENY_EXIT_FLAG_FALSE);
|
|
||||||
this.addFlag(AnimalAttackFlag.ANIMAL_ATTACK_FALSE);
|
this.addFlag(AnimalAttackFlag.ANIMAL_ATTACK_FALSE);
|
||||||
this.addFlag(AnimalInteractFlag.ANIMAL_INTERACT_FALSE);
|
this.addFlag(AnimalInteractFlag.ANIMAL_INTERACT_FALSE);
|
||||||
this.addFlag(BlockBurnFlag.BLOCK_BURN_FALSE);
|
this.addFlag(BlockBurnFlag.BLOCK_BURN_FALSE);
|
||||||
this.addFlag(BlockIgnitionFlag.BLOCK_IGNITION_TRUE);
|
this.addFlag(BlockIgnitionFlag.BLOCK_IGNITION_TRUE);
|
||||||
|
this.addFlag(ChatFlag.CHAT_FLAG_TRUE);
|
||||||
|
this.addFlag(CopperOxideFlag.COPPER_OXIDE_FALSE);
|
||||||
|
this.addFlag(CoralDryFlag.CORAL_DRY_FALSE);
|
||||||
|
this.addFlag(CropGrowFlag.CROP_GROW_TRUE);
|
||||||
|
this.addFlag(DenyExitFlag.DENY_EXIT_FLAG_FALSE);
|
||||||
|
this.addFlag(DenyPortalsFlag.DENY_PORTALS_FALSE);
|
||||||
|
this.addFlag(DenyPortalTravelFlag.DENY_PORTAL_TRAVEL_FALSE);
|
||||||
this.addFlag(DeviceInteractFlag.DEVICE_INTERACT_FALSE);
|
this.addFlag(DeviceInteractFlag.DEVICE_INTERACT_FALSE);
|
||||||
this.addFlag(DisablePhysicsFlag.DISABLE_PHYSICS_FALSE);
|
this.addFlag(DisablePhysicsFlag.DISABLE_PHYSICS_FALSE);
|
||||||
this.addFlag(DropProtectionFlag.DROP_PROTECTION_FALSE);
|
this.addFlag(DropProtectionFlag.DROP_PROTECTION_FALSE);
|
||||||
|
this.addFlag(EntityChangeBlockFlag.ENTITY_CHANGE_BLOCK_FALSE);
|
||||||
|
this.addFlag(ExplosionFlag.EXPLOSION_FALSE);
|
||||||
this.addFlag(ForcefieldFlag.FORCEFIELD_FALSE);
|
this.addFlag(ForcefieldFlag.FORCEFIELD_FALSE);
|
||||||
this.addFlag(GrassGrowFlag.GRASS_GROW_TRUE);
|
this.addFlag(GrassGrowFlag.GRASS_GROW_TRUE);
|
||||||
this.addFlag(HangingBreakFlag.HANGING_BREAK_FALSE);
|
this.addFlag(HangingBreakFlag.HANGING_BREAK_FALSE);
|
||||||
@ -154,52 +166,54 @@ public final class GlobalFlagContainer extends FlagContainer {
|
|||||||
this.addFlag(HostileInteractFlag.HOSTILE_INTERACT_FALSE);
|
this.addFlag(HostileInteractFlag.HOSTILE_INTERACT_FALSE);
|
||||||
this.addFlag(IceFormFlag.ICE_FORM_FALSE);
|
this.addFlag(IceFormFlag.ICE_FORM_FALSE);
|
||||||
this.addFlag(IceMeltFlag.ICE_MELT_FALSE);
|
this.addFlag(IceMeltFlag.ICE_MELT_FALSE);
|
||||||
|
this.addFlag(InstabreakFlag.INSTABREAK_FALSE);
|
||||||
|
this.addFlag(InvincibleFlag.INVINCIBLE_FALSE);
|
||||||
|
this.addFlag(ItemDropFlag.ITEM_DROP_TRUE);
|
||||||
|
this.addFlag(KeepInventoryFlag.KEEP_INVENTORY_FALSE);
|
||||||
this.addFlag(KelpGrowFlag.KELP_GROW_TRUE);
|
this.addFlag(KelpGrowFlag.KELP_GROW_TRUE);
|
||||||
this.addFlag(RedstoneFlag.REDSTONE_TRUE);
|
this.addFlag(LeafDecayFlag.LEAF_DECAY_TRUE);
|
||||||
this.addFlag(ServerPlotFlag.SERVER_PLOT_FALSE);
|
this.addFlag(LecternReadBookFlag.LECTERN_READ_BOOK_FALSE);
|
||||||
this.addFlag(MiscBreakFlag.MISC_BREAK_FALSE);
|
this.addFlag(MiscBreakFlag.MISC_BREAK_FALSE);
|
||||||
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(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);
|
||||||
this.addFlag(NotifyLeaveFlag.NOTIFY_LEAVE_FALSE);
|
this.addFlag(NotifyLeaveFlag.NOTIFY_LEAVE_FALSE);
|
||||||
this.addFlag(NoWorldeditFlag.NO_WORLDEDIT_FALSE);
|
this.addFlag(NoWorldeditFlag.NO_WORLDEDIT_FALSE);
|
||||||
this.addFlag(PlayerInteractFlag.PLAYER_INTERACT_FALSE);
|
this.addFlag(PlayerInteractFlag.PLAYER_INTERACT_FALSE);
|
||||||
|
this.addFlag(PreventCreativeCopyFlag.PREVENT_CREATIVE_COPY_FALSE);
|
||||||
this.addFlag(PveFlag.PVE_FALSE);
|
this.addFlag(PveFlag.PVE_FALSE);
|
||||||
this.addFlag(PvpFlag.PVP_FALSE);
|
this.addFlag(PvpFlag.PVP_FALSE);
|
||||||
|
this.addFlag(RedstoneFlag.REDSTONE_TRUE);
|
||||||
|
this.addFlag(ServerPlotFlag.SERVER_PLOT_FALSE);
|
||||||
this.addFlag(SnowFormFlag.SNOW_FORM_FALSE);
|
this.addFlag(SnowFormFlag.SNOW_FORM_FALSE);
|
||||||
this.addFlag(SnowMeltFlag.SNOW_MELT_TRUE);
|
this.addFlag(SnowMeltFlag.SNOW_MELT_TRUE);
|
||||||
this.addFlag(SoilDryFlag.SOIL_DRY_FALSE);
|
this.addFlag(SoilDryFlag.SOIL_DRY_FALSE);
|
||||||
this.addFlag(CoralDryFlag.CORAL_DRY_FALSE);
|
|
||||||
this.addFlag(TamedAttackFlag.TAMED_ATTACK_FALSE);
|
this.addFlag(TamedAttackFlag.TAMED_ATTACK_FALSE);
|
||||||
this.addFlag(TamedInteractFlag.TAMED_INTERACT_FALSE);
|
this.addFlag(TamedInteractFlag.TAMED_INTERACT_FALSE);
|
||||||
|
this.addFlag(UntrustedVisitFlag.UNTRUSTED_VISIT_FLAG_TRUE);
|
||||||
this.addFlag(VehicleBreakFlag.VEHICLE_BREAK_FALSE);
|
this.addFlag(VehicleBreakFlag.VEHICLE_BREAK_FALSE);
|
||||||
this.addFlag(VehiclePlaceFlag.VEHICLE_PLACE_FALSE);
|
this.addFlag(VehiclePlaceFlag.VEHICLE_PLACE_FALSE);
|
||||||
this.addFlag(VehicleUseFlag.VEHICLE_USE_FALSE);
|
this.addFlag(VehicleUseFlag.VEHICLE_USE_FALSE);
|
||||||
this.addFlag(VillagerInteractFlag.VILLAGER_INTERACT_FALSE);
|
this.addFlag(VillagerInteractFlag.VILLAGER_INTERACT_FALSE);
|
||||||
this.addFlag(VineGrowFlag.VINE_GROW_TRUE);
|
this.addFlag(VineGrowFlag.VINE_GROW_TRUE);
|
||||||
this.addFlag(ItemDropFlag.ITEM_DROP_TRUE);
|
this.addFlag(ProjectilesFlag.PROJECTILES_FALSE);
|
||||||
this.addFlag(InstabreakFlag.INSTABREAK_FALSE);
|
|
||||||
this.addFlag(InvincibleFlag.INVINCIBLE_FALSE);
|
// Double flags
|
||||||
this.addFlag(ChatFlag.CHAT_FLAG_TRUE);
|
this.addFlag(PriceFlag.PRICE_NOT_BUYABLE);
|
||||||
this.addFlag(MiscPlaceFlag.MISC_PLACE_FALSE);
|
|
||||||
this.addFlag(MiscInteractFlag.MISC_INTERACT_FALSE);
|
|
||||||
this.addFlag(KeepInventoryFlag.KEEP_INVENTORY_FALSE);
|
|
||||||
this.addFlag(PreventCreativeCopyFlag.PREVENT_CREATIVE_COPY_FALSE);
|
|
||||||
this.addFlag(LeafDecayFlag.LEAF_DECAY_TRUE);
|
|
||||||
this.addFlag(CropGrowFlag.CROP_GROW_TRUE);
|
|
||||||
this.addFlag(DenyPortalTravelFlag.DENY_PORTAL_TRAVEL_FALSE);
|
|
||||||
this.addFlag(DenyPortalsFlag.DENY_PORTALS_FALSE);
|
|
||||||
this.addFlag(LecternReadBookFlag.LECTERN_READ_BOOK_FALSE);
|
|
||||||
this.addFlag(EntityChangeBlockFlag.ENTITY_CHANGE_BLOCK_FALSE);
|
|
||||||
this.addFlag(CopperOxideFlag.COPPER_OXIDE_FALSE);
|
|
||||||
|
|
||||||
// Enum Flags
|
// Enum Flags
|
||||||
this.addFlag(WeatherFlag.PLOT_WEATHER_FLAG_OFF);
|
|
||||||
this.addFlag(DenyTeleportFlag.DENY_TELEPORT_FLAG_NONE);
|
this.addFlag(DenyTeleportFlag.DENY_TELEPORT_FLAG_NONE);
|
||||||
this.addFlag(TitlesFlag.TITLES_NONE);
|
|
||||||
this.addFlag(FlyFlag.FLIGHT_FLAG_DEFAULT);
|
this.addFlag(FlyFlag.FLIGHT_FLAG_DEFAULT);
|
||||||
this.addFlag(LiquidFlowFlag.LIQUID_FLOW_DEFAULT);
|
this.addFlag(LiquidFlowFlag.LIQUID_FLOW_DEFAULT);
|
||||||
|
this.addFlag(TitlesFlag.TITLES_NONE);
|
||||||
|
this.addFlag(WeatherFlag.PLOT_WEATHER_FLAG_OFF);
|
||||||
|
|
||||||
|
// Internal flags
|
||||||
|
this.addFlag(new AnalysisFlag(Collections.emptyList()));
|
||||||
|
this.addFlag(new DoneFlag(""));
|
||||||
|
|
||||||
// Integer flags
|
// Integer flags
|
||||||
this.addFlag(AnimalCapFlag.ANIMAL_CAP_UNLIMITED);
|
this.addFlag(AnimalCapFlag.ANIMAL_CAP_UNLIMITED);
|
||||||
@ -210,22 +224,10 @@ public final class GlobalFlagContainer extends FlagContainer {
|
|||||||
this.addFlag(TimeFlag.TIME_DISABLED);
|
this.addFlag(TimeFlag.TIME_DISABLED);
|
||||||
this.addFlag(VehicleCapFlag.VEHICLE_CAP_UNLIMITED);
|
this.addFlag(VehicleCapFlag.VEHICLE_CAP_UNLIMITED);
|
||||||
|
|
||||||
// Timed flags
|
|
||||||
this.addFlag(FeedFlag.FEED_NOTHING);
|
|
||||||
this.addFlag(HealFlag.HEAL_NOTHING);
|
|
||||||
|
|
||||||
// Double flags
|
|
||||||
this.addFlag(PriceFlag.PRICE_NOT_BUYABLE);
|
|
||||||
|
|
||||||
// Block type list flags
|
|
||||||
this.addFlag(BreakFlag.BREAK_NONE);
|
|
||||||
this.addFlag(PlaceFlag.PLACE_NONE);
|
|
||||||
this.addFlag(UseFlag.USE_NONE);
|
|
||||||
|
|
||||||
// Misc
|
// Misc
|
||||||
|
this.addFlag(BlockedCmdsFlag.BLOCKED_CMDS_FLAG_NONE);
|
||||||
this.addFlag(GamemodeFlag.GAMEMODE_FLAG_DEFAULT);
|
this.addFlag(GamemodeFlag.GAMEMODE_FLAG_DEFAULT);
|
||||||
this.addFlag(GuestGamemodeFlag.GUEST_GAMEMODE_FLAG_DEFAULT);
|
this.addFlag(GuestGamemodeFlag.GUEST_GAMEMODE_FLAG_DEFAULT);
|
||||||
this.addFlag(BlockedCmdsFlag.BLOCKED_CMDS_FLAG_NONE);
|
|
||||||
this.addFlag(KeepFlag.KEEP_FLAG_FALSE);
|
this.addFlag(KeepFlag.KEEP_FLAG_FALSE);
|
||||||
this.addFlag(MusicFlag.MUSIC_FLAG_NONE);
|
this.addFlag(MusicFlag.MUSIC_FLAG_NONE);
|
||||||
|
|
||||||
@ -235,9 +237,9 @@ public final class GlobalFlagContainer extends FlagContainer {
|
|||||||
this.addFlag(FarewellFlag.FAREWELL_FLAG_EMPTY);
|
this.addFlag(FarewellFlag.FAREWELL_FLAG_EMPTY);
|
||||||
this.addFlag(PlotTitleFlag.TITLE_FLAG_DEFAULT);
|
this.addFlag(PlotTitleFlag.TITLE_FLAG_DEFAULT);
|
||||||
|
|
||||||
// Internal flags
|
// Timed flags
|
||||||
this.addFlag(new AnalysisFlag(Collections.emptyList()));
|
this.addFlag(FeedFlag.FEED_NOTHING);
|
||||||
this.addFlag(new DoneFlag(""));
|
this.addFlag(HealFlag.HEAL_NOTHING);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setup() {
|
public static void setup() {
|
||||||
|
@ -31,6 +31,7 @@ import org.checkerframework.checker.nullness.qual.NonNull;
|
|||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A plot flag is any property that can be assigned
|
* A plot flag is any property that can be assigned
|
||||||
@ -163,6 +164,7 @@ public abstract class PlotFlag<T, F extends PlotFlag<T, F>> {
|
|||||||
* Get if the flag's permission should check for values. E.g. plots.flag.set.music.VALUE
|
* Get if the flag's permission should check for values. E.g. plots.flag.set.music.VALUE
|
||||||
*
|
*
|
||||||
* @return if valued permission
|
* @return if valued permission
|
||||||
|
* @since 6.0.10
|
||||||
*/
|
*/
|
||||||
public boolean isValuedPermission() {
|
public boolean isValuedPermission() {
|
||||||
return true;
|
return true;
|
||||||
@ -199,34 +201,30 @@ public abstract class PlotFlag<T, F extends PlotFlag<T, F>> {
|
|||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean equals(final Object o) {
|
public boolean equals(final Object o) {
|
||||||
if (o == this) {
|
if (this == o) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!(o instanceof final PlotFlag<?, ?> other)) {
|
if (o == null || getClass() != o.getClass()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!other.canEqual(this)) {
|
final PlotFlag<?, ?> plotFlag = (PlotFlag<?, ?>) o;
|
||||||
return false;
|
return value.equals(plotFlag.value);
|
||||||
}
|
|
||||||
final Object this$value = this.getValue();
|
|
||||||
final Object other$value = other.getValue();
|
|
||||||
if (this$value == null ? other$value != null : !this$value.equals(other$value)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return value.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated This method is not meant to be invoked or overridden, with no replacement.
|
||||||
|
*/
|
||||||
|
@Deprecated(forRemoval = true, since = "6.6.0")
|
||||||
protected boolean canEqual(final Object other) {
|
protected boolean canEqual(final Object other) {
|
||||||
return other instanceof PlotFlag;
|
return other instanceof PlotFlag;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int hashCode() {
|
|
||||||
final int PRIME = 59;
|
|
||||||
int result = 1;
|
|
||||||
final Object $value = this.getValue();
|
|
||||||
result = result * PRIME + ($value == null ? 43 : $value.hashCode());
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* _____ _ _ _____ _
|
||||||
|
* | __ \| | | | / ____| | |
|
||||||
|
* | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| |
|
||||||
|
* | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` |
|
||||||
|
* | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| |
|
||||||
|
* |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_|
|
||||||
|
* | |
|
||||||
|
* |_|
|
||||||
|
* PlotSquared plot management system for Minecraft
|
||||||
|
* Copyright (C) 2014 - 2022 IntellectualSites
|
||||||
|
*
|
||||||
|
* 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 ProjectilesFlag extends BooleanFlag<ProjectilesFlag> {
|
||||||
|
|
||||||
|
public static final ProjectilesFlag PROJECTILES_TRUE = new ProjectilesFlag(true);
|
||||||
|
public static final ProjectilesFlag PROJECTILES_FALSE = new ProjectilesFlag(false);
|
||||||
|
|
||||||
|
private ProjectilesFlag(boolean value){
|
||||||
|
super(value, TranslatableCaption.of("flags.flag_description_projectiles"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ProjectilesFlag flagOf(@NonNull final Boolean value) {
|
||||||
|
return value ? PROJECTILES_TRUE : PROJECTILES_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -196,9 +196,12 @@ public interface PlotAreaManager {
|
|||||||
/**
|
/**
|
||||||
* Check if a plot world.
|
* Check if a plot world.
|
||||||
*
|
*
|
||||||
|
* <p>
|
||||||
|
* Use {@link #getPlotAreaByString(String)} to get the PlotArea object
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @param world the world
|
* @param world the world
|
||||||
* @return if a plot world is registered
|
* @return if a plot world is registered
|
||||||
* @see #getPlotAreaByString(String) to get the PlotArea object
|
|
||||||
*/
|
*/
|
||||||
default boolean hasPlotArea(final @NonNull String world) {
|
default boolean hasPlotArea(final @NonNull String world) {
|
||||||
return this.getPlotAreas(world, null).length != 0;
|
return this.getPlotAreas(world, null).length != 0;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user