mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-10-22 06:03:45 +02:00 
			
		
		
		
	Compare commits
	
		
			37 Commits
		
	
	
		
			renovate/n
			...
			refactor/v
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 79121603ee | ||
|   | bbb9965526 | ||
|   | bf646be482 | ||
|   | cc7e17960b | ||
|   | 3c75b170f0 | ||
|   | a79c474957 | ||
|   | 4bb480a238 | ||
|   | 9ffa935c0c | ||
|   | 0a32268784 | ||
|   | ae3b8c06f6 | ||
|   | 713c4ad0d2 | ||
|   | 48386c0828 | ||
|   | 625b3921e1 | ||
|   | 48aa37d173 | ||
|   | 2c2314e95c | ||
|   | 5eb2fc3ad0 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 82cd9a092c | ||
|   | 62754362c2 | ||
|   | 2e9dfd6f6f | ||
|   | fc9fe1462f | ||
|   | 41f546ca6b | ||
|   | d037da33cb | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | dc2d08c67e | ||
|   | 96dfc27411 | ||
|   | 171d2e5e99 | ||
|   | 4433892431 | ||
|   | 98a07dad1b | ||
|   | 0ffa22b7a6 | ||
|   | 60a0129fe9 | ||
|   | d5f8a0842b | ||
|   | f7d55ce105 | ||
|   | 85911646f3 | ||
|   | 8b75dece69 | ||
|   | 7d6e515ba8 | ||
|   | 13d7357c85 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 16e26b910c | ||
|   | faadebd30e | 
							
								
								
									
										4
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							| @@ -27,14 +27,12 @@ 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.19' | ||||||
|         - '1.18.2' |         - '1.18.2' | ||||||
|         - '1.18.1' |         - '1.18.1' | ||||||
|         - '1.18' |         - '1.18' | ||||||
|         - '1.17.1' |         - '1.17.1' | ||||||
|         - '1.16.5' |         - '1.16.5' | ||||||
|         - '1.15.2' |  | ||||||
|         - '1.14.4' |  | ||||||
|         - '1.13.2' |  | ||||||
|     validations: |     validations: | ||||||
|       required: true |       required: true | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								.github/workflows/release-drafter.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/release-drafter.yml
									
									
									
									
										vendored
									
									
								
							| @@ -14,6 +14,6 @@ jobs: | |||||||
|     if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }} |     if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }} | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - uses: release-drafter/release-drafter@v5.19.0 |       - uses: release-drafter/release-drafter@v5 | ||||||
|         env: |         env: | ||||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -131,5 +131,9 @@ local.properties | |||||||
| checkstyle.xml | checkstyle.xml | ||||||
| classes/ | classes/ | ||||||
| *.bat | *.bat | ||||||
|  |  | ||||||
|  | # Other | ||||||
| docs/ | docs/ | ||||||
| build/ | build/ | ||||||
|  |  | ||||||
|  | .DS_Store | ||||||
|   | |||||||
							
								
								
									
										49
									
								
								.idea/icon.svg
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										49
									
								
								.idea/icon.svg
									
									
									
										generated
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||||
| <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4000 3333.3333" height="3333.3333" width="4000" xml:space="preserve" id="svg2" version="1.1"> | <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" id="svg2" xml:space="preserve" width="4000" height="3333.3333" viewBox="0 0 4000 3333.3333" sodipodi:docname="PlotSquared.ai"> | ||||||
| 		<metadata id="metadata8"> | 		<metadata id="metadata8"> | ||||||
| 			<rdf:RDF> | 			<rdf:RDF> | ||||||
| 				<cc:Work rdf:about=""> | 				<cc:Work rdf:about=""> | ||||||
| @@ -9,41 +9,42 @@ | |||||||
| 			</rdf:RDF> | 			</rdf:RDF> | ||||||
| 		</metadata> | 		</metadata> | ||||||
|     <defs id="defs6"> |     <defs id="defs6"> | ||||||
| 			<clipPath id="clipPath18" clipPathUnits="userSpaceOnUse"> | 			<clipPath clipPathUnits="userSpaceOnUse" id="clipPath18"> | ||||||
| 				<path id="path16" d="M 0,2500 H 3000 V 0 H 0 Z" /> | 				<path d="M 0,2500 H 3000 V 0 H 0 Z" id="path16" /> | ||||||
| 			</clipPath> | 			</clipPath> | ||||||
| 		</defs> | 		</defs> | ||||||
|     <g transform="matrix(1.3333333,0,0,-1.3333333,0,3333.3333)" id="g10"> |     <sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="640" inkscape:window-height="480" id="namedview4" /> | ||||||
|  |     <g id="g10" inkscape:groupmode="layer" inkscape:label="PlotSquared" transform="matrix(1.3333333,0,0,-1.3333333,0,3333.3333)"> | ||||||
| 			<g id="g12"> | 			<g id="g12"> | ||||||
| 				<g clip-path="url(#clipPath18)" id="g14"> | 				<g id="g14" clip-path="url(#clipPath18)"> | ||||||
| 					<g transform="translate(1486.1511,2242.6453)" id="g20"> | 					<g id="g20" transform="translate(1486.1511,2242.6453)"> | ||||||
| 						<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" /> | 						<path d="m 0,0 c 16.533,10.846 33.211,21.453 50.104,31.699 78.972,-48.281 153.985,-102.704 227.269,-159.144 148.61,-115.422 287.884,-243.01 414.393,-382.333 111.39,-122.861 212.751,-255.152 298.898,-396.971 52.744,-87.322 100.544,-177.884 139.514,-272.214 -11.638,-3.551 -23.108,-7.655 -34.362,-12.286 l -0.24,0.288 c -11.135,12.982 -24.141,24.212 -34.915,37.506 -22.557,23.013 -45.425,45.737 -68.03,68.678 -19.725,20.253 -40.601,39.45 -58.958,60.974 -36.355,36.451 -72.517,73.093 -108.944,109.471 -22.628,26.013 -48.064,49.385 -71.965,74.197 -19.029,19.485 -38.706,38.346 -57.519,57.999 -12.166,14.998 -26.684,27.716 -39.93,41.658 -27.668,27.524 -54.903,55.479 -82.571,82.979 -23.924,27.956 -51.664,52.264 -76.692,79.164 -4.68,4.487 -8.855,10.774 -15.886,11.326 -22.34,34.027 -58.311,57.327 -97.377,67.502 -104.312,99.153 -215.487,191.202 -332.661,274.782 -117.942,-83.94 -229.476,-176.781 -334.484,-276.39 -26.684,-0.024 -53.368,0.024 -80.076,-0.024 0.024,-26.564 0.048,-53.104 0,-79.668 -72.229,-73.021 -139.491,-150.937 -202.385,-232.092 -63.758,-82.619 -121.973,-169.51 -173.541,-260.264 131.932,-69.061 257.864,-149.521 375.926,-240.275 0.096,-26.444 -0.12,-52.888 0.096,-79.332 l 0.744,-0.984 c 20.109,-24.14 43.409,-45.233 65.126,-67.861 15.118,-15.382 30.571,-30.404 45.569,-45.881 17.565,-20.733 37.698,-39.042 56.607,-58.503 19.917,-20.781 41.25,-40.218 59.967,-62.151 29.156,-29.299 58.167,-58.815 87.515,-87.922 29.155,-33.043 61.502,-63.111 92.169,-94.738 13.726,-12.67 25.124,-27.571 38.634,-40.457 25.029,-25.365 50.129,-50.657 75.325,-75.853 -37.914,-51.208 -73.741,-103.952 -107.192,-158.183 -167.83,273.317 -397.235,507.305 -662.37,687.158 -81.875,55.335 -167.23,105.584 -255.681,149.641 -52.815,26.276 -106.831,50.248 -162.239,70.381 99.393,233.628 242.795,446.715 410.289,636.79 93.562,106.088 194.634,205.433 301.466,298.13 C -217.335,-155.808 -111.439,-73.789 0,0" style="fill:#062f4c;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path22" /> | ||||||
| 					</g> | 					</g> | ||||||
|                     <g transform="translate(1201.7948,1741.5303)" id="g24"> |                     <g id="g24" transform="translate(1201.7948,1741.5303)"> | ||||||
| 						<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" /> | 						<path d="M 0,0 C 105.008,99.609 216.543,192.45 334.485,276.39 451.659,192.81 562.833,100.76 667.146,1.608 c -34.987,8.83 -71.51,9.718 -107.264,6.431 -41.202,-4.296 -82.907,-19.077 -112.543,-48.953 -33.019,-32.155 -49.456,-77.604 -55.311,-122.501 -28.124,27.908 -56.104,55.983 -84.035,84.083 -2.976,2.976 -6.839,4.823 -10.391,6.911 -19.029,26.348 -45.953,46.673 -76.62,57.495 C 187.555,-2.472 151.513,-0.12 116.166,0 Z" style="fill:#4c8fcc;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path26" /> | ||||||
| 					</g> | 					</g> | ||||||
|                     <g transform="translate(919.3342,1429.7462)" id="g28"> |                     <g id="g28" transform="translate(919.3342,1429.7462)"> | ||||||
| 						<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" /> | 						<path d="m 0,0 c 62.894,81.156 130.156,159.072 202.385,232.092 0.048,-244.21 0.024,-488.421 0,-732.631 C 84.323,-409.785 -41.61,-329.325 -173.541,-260.264 -121.973,-169.51 -63.758,-82.619 0,0" style="fill:#4c8fcc;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path30" /> | ||||||
| 					</g> | 					</g> | ||||||
|                     <g transform="translate(1649.134,1700.6166)" id="g32"> |                     <g id="g32" transform="translate(1649.134,1700.6166)"> | ||||||
| 						<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" /> | 						<path d="m 0,0 c 29.635,29.875 71.341,44.657 112.543,48.952 35.754,3.288 72.277,2.4 107.263,-6.431 39.066,-10.174 75.037,-33.474 97.377,-67.501 11.879,-17.661 20.181,-37.411 26.42,-57.687 10.871,-38.802 11.95,-79.356 11.446,-119.358 -44.345,-0.072 -88.69,0.048 -133.035,-0.072 -1.032,30.907 3.263,63.686 -10.175,92.626 -9.526,20.325 -32.107,31.243 -53.751,32.131 -21.453,1.44 -45.065,-4.32 -59.175,-21.597 -12.79,-15.861 -15.382,-37.002 -16.558,-56.655 -1.295,-29.132 3.696,-59.031 17.518,-84.923 16.821,-30.619 39.378,-57.783 64.526,-81.9 31.387,-32.634 67.501,-60.374 97.857,-94.041 27.332,-28.988 51.256,-61.479 68.005,-97.785 20.541,-41.13 26.972,-87.827 25.82,-133.372 -0.912,-32.107 -5.231,-64.406 -16.149,-94.737 -11.59,-31.699 -31.123,-61.047 -58.335,-81.371 -25.124,-19.125 -55.696,-29.852 -86.651,-34.771 -49.552,-6.743 -101.888,-4.847 -148.465,14.854 -35.227,14.829 -64.238,42.689 -81.708,76.548 -20.996,40.242 -27.115,86.339 -27.259,131.212 0.048,17.829 0,35.658 0.048,53.463 44.345,0.048 88.69,-0.023 133.059,0.048 1.728,-35.538 -4.055,-72.06 5.663,-106.807 5.783,-22.173 26.204,-37.794 48.185,-41.754 20.733,-3.431 43.577,-2.015 61.622,9.791 15.502,9.43 23.949,26.78 26.78,44.225 5.903,35.922 1.872,74.293 -15.381,106.688 -16.918,30.595 -39.474,57.711 -64.55,81.899 -33.187,34.099 -71.173,63.254 -102.585,99.081 -26.756,28.867 -49.408,61.646 -65.486,97.641 -24.572,52.48 -26.731,112.422 -20.18,169.102 C -49.456,-77.604 -33.019,-32.155 0,0" style="fill:#feeeee;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path34" /> | ||||||
| 					</g> | 					</g> | ||||||
|                     <g transform="translate(1262.7214,1613.126)" id="g36"> |                     <g id="g36" transform="translate(1262.7214,1613.126)"> | ||||||
| 						<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" /> | 						<path d="m 0,0 v -301.13 c 23.204,0.024 46.409,-0.048 69.613,0.024 18.525,0.288 38.202,6.575 50.153,21.429 12.43,17.277 13.917,39.522 14.613,60.111 0.024,43.985 -0.048,87.994 0.024,131.979 -0.48,23.637 -0.983,50.369 -17.277,69.23 C 104.864,-5.711 86.867,-0.24 69.589,0 46.385,0.048 23.204,0.024 0,0 m -141.002,128.38 c 26.708,0.048 53.392,0 80.075,0.024 H 55.24 c 35.346,-0.12 71.389,-2.471 104.815,-14.925 30.668,-10.823 57.592,-31.148 76.621,-57.496 26.852,-39.09 36.69,-87.202 38.058,-133.947 0.024,-48.833 0.096,-97.689 -0.024,-146.521 -1.728,-47.993 -11.974,-97.953 -41.514,-136.971 -22.748,-30.644 -57.495,-50.801 -94.281,-59.583 -45.377,-11.878 -92.578,-6.791 -138.891,-7.847 -0.072,-111.799 0,-223.574 -0.024,-335.373 -13.942,0 -27.86,0.024 -41.778,-0.024 -32.802,0.072 -65.605,0 -98.384,0.048 l -0.744,0.984 c -0.216,26.444 0,52.888 -0.096,79.332 0.024,244.211 0.048,488.421 0,732.632 0.048,26.563 0.024,53.103 0,79.667" style="fill:#feeeee;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path38" /> | ||||||
| 					</g> | 					</g> | ||||||
|                     <g transform="translate(1966.3174,1675.6364)" id="g40"> |                     <g id="g40" transform="translate(1966.3174,1675.6364)"> | ||||||
| 						<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" /> | 						<path d="m 0,0 c 7.031,-0.552 11.206,-6.839 15.885,-11.326 25.029,-26.9 52.768,-51.208 76.693,-79.164 27.667,-27.5 54.903,-55.456 82.571,-82.979 13.246,-13.942 27.764,-26.66 39.93,-41.658 18.813,-19.653 38.49,-38.514 57.519,-57.999 23.9,-24.812 49.337,-48.185 71.965,-74.197 36.427,-36.378 72.589,-73.02 108.943,-109.471 18.358,-21.524 39.234,-40.722 58.959,-60.974 22.605,-22.941 45.473,-45.665 68.03,-68.678 10.774,-13.294 23.78,-24.524 34.914,-37.506 -103.904,-41.97 -203.488,-94.114 -298.922,-152.761 -246.994,-152.28 -466.224,-350.298 -639.333,-583.398 -25.197,25.196 -50.297,50.488 -75.325,75.852 -13.51,12.886 -24.908,27.788 -38.634,40.458 -30.667,31.627 -63.014,61.695 -92.17,94.738 -29.347,29.107 -58.359,58.623 -87.514,87.922 -18.717,21.933 -40.05,41.37 -59.967,62.151 -18.909,19.461 -39.042,37.77 -56.607,58.503 -14.998,15.477 -30.452,30.499 -45.569,45.88 -21.717,22.629 -45.017,43.722 -65.126,67.862 32.779,-0.048 65.582,0.024 98.384,-0.048 114.391,-98.097 220.407,-205.984 315.384,-322.99 92.914,114.318 196.242,220.022 307.753,316.271 30.955,4.919 61.526,15.646 86.65,34.771 27.212,20.325 46.745,49.672 58.335,81.371 107.312,77.988 219.327,149.929 337.509,210.376 -35.299,64.67 -75.829,126.437 -118.254,186.643 C 176.253,-228.037 104.24,-140.115 26.42,-57.687 20.181,-37.41 11.878,-17.661 0,0" style="fill:#042338;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path42" /> | ||||||
| 					</g> | 					</g> | ||||||
|                     <g transform="translate(1499.3971,1669.1094)" id="g44"> |                     <g id="g44" transform="translate(1499.3971,1669.1094)"> | ||||||
| 						<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" /> | 						<path d="m 0,0 c 3.551,-2.088 7.415,-3.935 10.39,-6.911 27.932,-28.1 55.912,-56.175 84.036,-84.083 -6.551,-56.679 -4.392,-116.622 20.18,-169.102 16.078,-35.994 38.73,-68.774 65.486,-97.641 31.412,-35.826 69.398,-64.982 102.585,-99.081 25.076,-24.188 47.632,-51.304 64.55,-81.899 17.253,-32.395 21.284,-70.765 15.381,-106.688 -2.831,-17.445 -11.278,-34.794 -26.78,-44.225 -18.045,-11.806 -40.889,-13.222 -61.622,-9.79 -21.981,3.959 -42.402,19.58 -48.185,41.753 -9.718,34.747 -3.935,71.269 -5.663,106.808 -44.369,-0.072 -88.714,0 -133.059,-0.048 -0.048,-17.806 0,-35.635 -0.048,-53.464 0.144,-44.873 6.263,-90.97 27.259,-131.212 17.47,-33.859 46.481,-61.718 81.708,-76.548 46.577,-19.701 98.913,-21.597 148.465,-14.854 -111.511,-96.249 -214.839,-201.953 -307.753,-316.271 -94.977,117.006 -200.993,224.893 -315.383,322.99 13.918,0.048 27.836,0.024 41.777,0.024 0.024,111.799 -0.048,223.574 0.024,335.372 46.313,1.056 93.514,-4.031 138.891,7.847 36.786,8.783 71.533,28.94 94.282,59.583 29.539,39.018 39.785,88.978 41.513,136.971 0.12,48.833 0.048,97.689 0.024,146.522 C 36.69,-87.203 26.852,-39.09 0,0" style="fill:#1c72ba;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path46" /> | ||||||
| 					</g> | 					</g> | ||||||
|                     <g transform="translate(1748.0469,1601.6797)" id="g48"> |                     <g id="g48" transform="translate(1748.0469,1601.6797)"> | ||||||
| 						<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" /> | 						<path d="M 0,0 C 14.11,17.277 37.722,23.036 59.175,21.597 80.82,20.709 103.4,9.791 112.927,-10.534 c 13.438,-28.94 9.142,-61.719 10.174,-92.626 44.345,0.12 88.691,0 133.036,0.072 0.504,40.002 -0.576,80.556 -11.447,119.358 77.82,-82.428 149.833,-170.35 215.583,-262.664 42.426,-60.207 82.956,-121.973 118.254,-186.643 -118.182,-60.447 -230.196,-132.388 -337.508,-210.376 10.918,30.331 15.238,62.63 16.149,94.737 1.152,45.545 -5.279,92.242 -25.82,133.372 -16.749,36.306 -40.673,68.797 -68.005,97.785 -30.355,33.667 -66.47,61.406 -97.857,94.041 -25.148,24.117 -47.705,51.28 -64.526,81.9 -13.822,25.892 -18.813,55.791 -17.517,84.923 C -15.382,-37.002 -12.79,-15.862 0,0" style="fill:#1c72ba;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path50" /> | ||||||
| 					</g> | 					</g> | ||||||
|                     <g transform="translate(1262.7214,1613.126)" id="g52"> |                     <g id="g52" transform="translate(1262.7214,1613.126)"> | ||||||
| 						<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" /> | 						<path d="m 0,0 c 23.204,0.024 46.385,0.048 69.589,0 17.278,-0.24 35.275,-5.711 47.537,-18.357 16.294,-18.861 16.797,-45.593 17.277,-69.23 -0.072,-43.985 0,-87.994 -0.024,-131.979 -0.696,-20.589 -2.183,-42.834 -14.613,-60.111 -11.951,-14.854 -31.628,-21.141 -50.153,-21.429 -23.204,-0.072 -46.409,0 -69.613,-0.024 z" style="fill:#1c72ba;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path54" /> | ||||||
| 					</g> | 					</g> | ||||||
| 				</g> | 				</g> | ||||||
| 			</g> | 			</g> | ||||||
| 		</g> | 		</g> | ||||||
| 	</svg> | </svg> | ||||||
|   | |||||||
| Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 11 KiB | 
| @@ -1,4 +0,0 @@ | |||||||
| jdkVersion = "17" |  | ||||||
| build = "gradle clean build -x test" |  | ||||||
| tools = ["findsecbugs", "ErrorProne", "Semgrep", "Detekt", "Infer"] |  | ||||||
| ignoreRules = ["CatchAndPrintStackTrace", "ReferenceEquality", "FallThrough", "FutureReturnValueIgnored", "MixedMutabilityReturnType", "EmptyCatch", "MissingCasesInEnumSwitch", "OperatorPrecedence", "StaticAssignmentInConstructor", "ReferenceEquality", "EqualsHashCode", "EqualsGetClass", "TypeParameterUnusedInFormals", "StringSplitter", "InlineMeSuggester", "NULL_DEREFERENCE"] |  | ||||||
| @@ -8,7 +8,7 @@ repositories { | |||||||
|  |  | ||||||
|     maven { |     maven { | ||||||
|         name = "PaperMC" |         name = "PaperMC" | ||||||
|         url = uri("https://papermc.io/repo/repository/maven-public/") |         url = uri("https://repo.papermc.io/repository/maven-public/") | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     maven { |     maven { | ||||||
| @@ -21,20 +21,20 @@ dependencies { | |||||||
|     api(projects.plotSquaredCore) |     api(projects.plotSquaredCore) | ||||||
|  |  | ||||||
|     // Metrics |     // Metrics | ||||||
|     implementation(libs.bstats) |     implementation("org.bstats:bstats-bukkit") | ||||||
|  |  | ||||||
|     // Paper |     // Paper | ||||||
|     compileOnly(libs.paper) |     compileOnly(libs.paper) | ||||||
|     implementation(libs.paperlib) |     implementation("io.papermc:paperlib") | ||||||
|  |  | ||||||
|     // Plugins |     // Plugins | ||||||
|     compileOnly(libs.worldeditBukkit) { |     compileOnly(libs.worldeditBukkit) { | ||||||
|         exclude(group = "org.bukkit") |         exclude(group = "org.bukkit") | ||||||
|         exclude(group = "org.spigotmc") |         exclude(group = "org.spigotmc") | ||||||
|     } |     } | ||||||
|     compileOnly(libs.fastasyncworldeditBukkit) { isTransitive = false } |     compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false } | ||||||
|     testImplementation(libs.fastasyncworldeditBukkit) { isTransitive = false } |     testImplementation("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false } | ||||||
|     compileOnly(libs.vault) { |     compileOnly("com.github.MilkBowl:VaultAPI") { | ||||||
|         exclude(group = "org.bukkit") |         exclude(group = "org.bukkit") | ||||||
|     } |     } | ||||||
|     compileOnly(libs.placeholderapi) |     compileOnly(libs.placeholderapi) | ||||||
| @@ -44,15 +44,15 @@ dependencies { | |||||||
|  |  | ||||||
|     // Other libraries |     // Other libraries | ||||||
|     implementation(libs.squirrelid) { isTransitive = false } |     implementation(libs.squirrelid) { isTransitive = false } | ||||||
|     implementation(libs.serverlib) |     implementation("dev.notmyfault.serverlib:ServerLib") | ||||||
|  |  | ||||||
|     // Our libraries |     // Our libraries | ||||||
|     implementation(libs.arkitektonika) |     implementation(libs.arkitektonika) | ||||||
|     implementation(libs.http4j) |     implementation(libs.http4j) | ||||||
|     implementation(libs.paster) |     implementation("com.intellectualsites.paster:Paster") | ||||||
|  |  | ||||||
|     // Adventure |     // Adventure | ||||||
|     implementation(libs.adventurePlatformBukkit) |     implementation("net.kyori:adventure-platform-bukkit") | ||||||
| } | } | ||||||
|  |  | ||||||
| tasks.processResources { | tasks.processResources { | ||||||
| @@ -85,6 +85,8 @@ tasks.named<ShadowJar>("shadowJar") { | |||||||
|     relocate("javax.annotation", "com.plotsquared.core.annotation") |     relocate("javax.annotation", "com.plotsquared.core.annotation") | ||||||
|     relocate("com.github.spotbugs", "com.plotsquared.core.spotbugs") |     relocate("com.github.spotbugs", "com.plotsquared.core.spotbugs") | ||||||
|     relocate("javax.inject", "com.plotsquared.core.annotation.inject") |     relocate("javax.inject", "com.plotsquared.core.annotation.inject") | ||||||
|  |     relocate("net.jcip", "com.plotsquared.core.annotations.jcip") | ||||||
|  |     relocate("edu.umd.cs.findbugs", "com.plotsquared.core.annotations.findbugs") | ||||||
|  |  | ||||||
|     // Get rid of all the libs which are 100% unused. |     // Get rid of all the libs which are 100% unused. | ||||||
|     minimize() |     minimize() | ||||||
| @@ -95,7 +97,7 @@ 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.18/") |         opt.links("https://jd.papermc.io/paper/1.18/") | ||||||
|         opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString()) |         opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString()) | ||||||
|         opt.links("https://javadoc.io/doc/com.plotsquared/PlotSquared-Core/latest/") |         opt.links("https://javadoc.io/doc/com.plotsquared/PlotSquared-Core/latest/") | ||||||
|         opt.links("https://jd.adventure.kyori.net/api/" + libs.adventure.get().versionConstraint.toString()) |         opt.links("https://jd.adventure.kyori.net/api/" + libs.adventure.get().versionConstraint.toString()) | ||||||
|   | |||||||
| @@ -513,8 +513,10 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | |||||||
|                 this.backgroundPipeline.registerService(essentialsUUIDService); |                 this.backgroundPipeline.registerService(essentialsUUIDService); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  |             if (Settings.UUID.IMPROMPTU_SERVICE_MOJANG_API) { | ||||||
|                 final SquirrelIdUUIDService impromptuMojangService = new SquirrelIdUUIDService(Settings.UUID.IMPROMPTU_LIMIT); |                 final SquirrelIdUUIDService impromptuMojangService = new SquirrelIdUUIDService(Settings.UUID.IMPROMPTU_LIMIT); | ||||||
|                 this.impromptuPipeline.registerService(impromptuMojangService); |                 this.impromptuPipeline.registerService(impromptuMojangService); | ||||||
|  |             } | ||||||
|             final SquirrelIdUUIDService backgroundMojangService = new SquirrelIdUUIDService(Settings.UUID.BACKGROUND_LIMIT); |             final SquirrelIdUUIDService backgroundMojangService = new SquirrelIdUUIDService(Settings.UUID.BACKGROUND_LIMIT); | ||||||
|             this.backgroundPipeline.registerService(backgroundMojangService); |             this.backgroundPipeline.registerService(backgroundMojangService); | ||||||
|         } else { |         } else { | ||||||
|   | |||||||
| @@ -25,7 +25,11 @@ | |||||||
|  */ |  */ | ||||||
| package com.plotsquared.bukkit.generator; | package com.plotsquared.bukkit.generator; | ||||||
|  |  | ||||||
|  | import com.plotsquared.core.PlotSquared; | ||||||
| import com.plotsquared.core.generator.AugmentedUtils; | import com.plotsquared.core.generator.AugmentedUtils; | ||||||
|  | import com.plotsquared.core.queue.QueueCoordinator; | ||||||
|  | import com.sk89q.worldedit.bukkit.BukkitAdapter; | ||||||
|  | import com.sk89q.worldedit.util.SideEffectSet; | ||||||
| import org.bukkit.Chunk; | import org.bukkit.Chunk; | ||||||
| import org.bukkit.World; | import org.bukkit.World; | ||||||
| import org.bukkit.generator.BlockPopulator; | import org.bukkit.generator.BlockPopulator; | ||||||
| @@ -52,7 +56,14 @@ public class BukkitAugmentedGenerator extends BlockPopulator { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void populate(@NonNull World world, @NonNull Random random, @NonNull Chunk source) { |     public void populate(@NonNull World world, @NonNull Random random, @NonNull Chunk source) { | ||||||
|         AugmentedUtils.generate(source, world.getName(), source.getX(), source.getZ(), null); |         QueueCoordinator queue = PlotSquared.platform().globalBlockQueue().getNewQueue(BukkitAdapter.adapt(world)); | ||||||
|  |         // The chunk is already loaded and we do not want to load the chunk in "fully" by using any PaperLib methods. | ||||||
|  |         queue.setForceSync(true); | ||||||
|  |         queue.setSideEffectSet(SideEffectSet.none()); | ||||||
|  |         queue.setBiomesEnabled(false); | ||||||
|  |         queue.setChunkObject(source); | ||||||
|  |         AugmentedUtils.generateChunk(world.getName(), source.getX(), source.getZ(), queue); | ||||||
|  |         queue.enqueue(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -112,30 +112,7 @@ public class BukkitPlotGenerator extends ChunkGenerator | |||||||
|     @Override |     @Override | ||||||
|     public @NonNull List<BlockPopulator> getDefaultPopulators(@NonNull World world) { |     public @NonNull List<BlockPopulator> getDefaultPopulators(@NonNull World world) { | ||||||
|         try { |         try { | ||||||
|             if (!this.loaded) { |             checkLoaded(world); | ||||||
|                 String name = world.getName(); |  | ||||||
|                 PlotSquared.get().loadWorld(name, this); |  | ||||||
|                 final Set<PlotArea> areas = this.plotAreaManager.getPlotAreasSet(name); |  | ||||||
|                 if (!areas.isEmpty()) { |  | ||||||
|                     PlotArea area = areas.iterator().next(); |  | ||||||
|                     if (!area.isMobSpawning()) { |  | ||||||
|                         if (!area.isSpawnEggs()) { |  | ||||||
|                             world.setSpawnFlags(false, false); |  | ||||||
|                         } |  | ||||||
|                         world.setAmbientSpawnLimit(0); |  | ||||||
|                         world.setAnimalSpawnLimit(0); |  | ||||||
|                         world.setMonsterSpawnLimit(0); |  | ||||||
|                         world.setWaterAnimalSpawnLimit(0); |  | ||||||
|                     } else { |  | ||||||
|                         world.setSpawnFlags(true, true); |  | ||||||
|                         world.setAmbientSpawnLimit(-1); |  | ||||||
|                         world.setAnimalSpawnLimit(-1); |  | ||||||
|                         world.setMonsterSpawnLimit(-1); |  | ||||||
|                         world.setWaterAnimalSpawnLimit(-1); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 this.loaded = true; |  | ||||||
|             } |  | ||||||
|         } catch (Exception e) { |         } catch (Exception e) { | ||||||
|             e.printStackTrace(); |             e.printStackTrace(); | ||||||
|         } |         } | ||||||
| @@ -154,6 +131,39 @@ public class BukkitPlotGenerator extends ChunkGenerator | |||||||
|         return toAdd; |         return toAdd; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private synchronized void checkLoaded(@NonNull World world) { | ||||||
|  |         // Do not attempt to load configurations until WorldEdit has a platform ready. | ||||||
|  |         if (!PlotSquared.get().isWeInitialised()) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         if (!this.loaded) { | ||||||
|  |             String name = world.getName(); | ||||||
|  |             PlotSquared.get().loadWorld(name, this); | ||||||
|  |             final Set<PlotArea> areas = this.plotAreaManager.getPlotAreasSet(name); | ||||||
|  |             if (!areas.isEmpty()) { | ||||||
|  |                 PlotArea area = areas.iterator().next(); | ||||||
|  |                 if (!area.isMobSpawning()) { | ||||||
|  |                     if (!area.isSpawnEggs()) { | ||||||
|  |                         world.setSpawnFlags(false, false); | ||||||
|  |                     } | ||||||
|  |                     setSpawnLimits(world, 0); | ||||||
|  |                 } else { | ||||||
|  |                     world.setSpawnFlags(true, true); | ||||||
|  |                     setSpawnLimits(world, -1); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             this.loaded = true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @SuppressWarnings("deprecation") | ||||||
|  |     private void setSpawnLimits(@NonNull World world, int limit) { | ||||||
|  |         world.setAmbientSpawnLimit(limit); | ||||||
|  |         world.setAnimalSpawnLimit(limit); | ||||||
|  |         world.setMonsterSpawnLimit(limit); | ||||||
|  |         world.setWaterAnimalSpawnLimit(limit); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public @NonNull ChunkData generateChunkData( |     public @NonNull ChunkData generateChunkData( | ||||||
|             @NonNull World world, @NonNull Random random, int x, int z, |             @NonNull World world, @NonNull Random random, int x, int z, | ||||||
| @@ -201,9 +211,7 @@ public class BukkitPlotGenerator extends ChunkGenerator | |||||||
|     private void generate(BlockVector2 loc, World world, ScopedQueueCoordinator result) { |     private void generate(BlockVector2 loc, World world, ScopedQueueCoordinator result) { | ||||||
|         // Load if improperly loaded |         // Load if improperly loaded | ||||||
|         if (!this.loaded) { |         if (!this.loaded) { | ||||||
|             String name = world.getName(); |             checkLoaded(world); | ||||||
|             PlotSquared.get().loadWorld(name, this); |  | ||||||
|             this.loaded = true; |  | ||||||
|         } |         } | ||||||
|         // Process the chunk |         // Process the chunk | ||||||
|         if (ChunkManager.preProcessChunk(loc, result)) { |         if (ChunkManager.preProcessChunk(loc, result)) { | ||||||
|   | |||||||
| @@ -80,7 +80,8 @@ final class DelegatePlotGenerator extends IndependentPlotGenerator { | |||||||
|                     result.setBiome(x, z, BukkitAdapter.adapt(biome)); |                     result.setBiome(x, z, BukkitAdapter.adapt(biome)); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 //do not annotate with Override until we discontinue support for 1.4.4 |                 //do not annotate with Override until we discontinue support for 1.4.4 (we no longer support 1.4.4) | ||||||
|  |                 @Override | ||||||
|                 public void setBiome(int x, int y, int z, @NonNull Biome biome) { |                 public void setBiome(int x, int y, int z, @NonNull Biome biome) { | ||||||
|                     result.setBiome(x, z, BukkitAdapter.adapt(biome)); |                     result.setBiome(x, z, BukkitAdapter.adapt(biome)); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -72,6 +72,7 @@ import net.kyori.adventure.text.minimessage.Template; | |||||||
| import org.bukkit.Bukkit; | import org.bukkit.Bukkit; | ||||||
| import org.bukkit.GameMode; | import org.bukkit.GameMode; | ||||||
| import org.bukkit.Material; | import org.bukkit.Material; | ||||||
|  | import org.bukkit.Tag; | ||||||
| import org.bukkit.block.Block; | import org.bukkit.block.Block; | ||||||
| import org.bukkit.block.BlockFace; | import org.bukkit.block.BlockFace; | ||||||
| import org.bukkit.block.BlockState; | import org.bukkit.block.BlockState; | ||||||
| @@ -113,11 +114,20 @@ import org.checkerframework.checker.nullness.qual.NonNull; | |||||||
| import java.util.Iterator; | import java.util.Iterator; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Objects; | import java.util.Objects; | ||||||
|  | import java.util.Set; | ||||||
| import java.util.UUID; | import java.util.UUID; | ||||||
|  |  | ||||||
| @SuppressWarnings("unused") | @SuppressWarnings("unused") | ||||||
| public class BlockEventListener implements Listener { | public class BlockEventListener implements Listener { | ||||||
|  |  | ||||||
|  |     private static final Set<Material> PISTONS = Set.of( | ||||||
|  |             Material.PISTON, | ||||||
|  |             Material.STICKY_PISTON | ||||||
|  |     ); | ||||||
|  |     private static final Set<Material> PHYSICS_BLOCKS = Set.of( | ||||||
|  |             Material.TURTLE_EGG, | ||||||
|  |             Material.TURTLE_SPAWN_EGG | ||||||
|  |     ); | ||||||
|     private final PlotAreaManager plotAreaManager; |     private final PlotAreaManager plotAreaManager; | ||||||
|     private final WorldEdit worldEdit; |     private final WorldEdit worldEdit; | ||||||
|  |  | ||||||
| @@ -223,50 +233,33 @@ public class BlockEventListener implements Listener { | |||||||
|             plot.debug("Prevented block physics and resent block change because disable-physics = true"); |             plot.debug("Prevented block physics and resent block change because disable-physics = true"); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         switch (event.getChangedType()) { |         if (event.getChangedType() == Material.COMPARATOR) { | ||||||
|             case COMPARATOR: { |  | ||||||
|             if (!plot.getFlag(RedstoneFlag.class)) { |             if (!plot.getFlag(RedstoneFlag.class)) { | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|                 plot.debug("Prevented comparator update because redstone = false"); |                 plot.debug("Prevented comparator update because redstone = false"); | ||||||
|             } |             } | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|             case ANVIL: |         if (PHYSICS_BLOCKS.contains(event.getChangedType())) { | ||||||
|             case DRAGON_EGG: |  | ||||||
|             case GRAVEL: |  | ||||||
|             case SAND: |  | ||||||
|             case TURTLE_EGG: |  | ||||||
|             case TURTLE_HELMET: |  | ||||||
|             case TURTLE_SPAWN_EGG: { |  | ||||||
|             if (plot.getFlag(DisablePhysicsFlag.class)) { |             if (plot.getFlag(DisablePhysicsFlag.class)) { | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|                 plot.debug("Prevented block physics because disable-physics = true"); |                 plot.debug("Prevented block physics because disable-physics = true"); | ||||||
|             } |             } | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|             default: |  | ||||||
|         if (Settings.Redstone.DETECT_INVALID_EDGE_PISTONS) { |         if (Settings.Redstone.DETECT_INVALID_EDGE_PISTONS) { | ||||||
|                     switch (block.getType()) { |             if (PISTONS.contains(block.getType())) { | ||||||
|                         case PISTON, STICKY_PISTON -> { |  | ||||||
|                 org.bukkit.block.data.Directional piston = (org.bukkit.block.data.Directional) block.getBlockData(); |                 org.bukkit.block.data.Directional piston = (org.bukkit.block.data.Directional) block.getBlockData(); | ||||||
|                             switch (piston.getFacing()) { |                 final BlockFace facing = piston.getFacing(); | ||||||
|                                 case EAST -> location = location.add(1, 0, 0); |                 location = location.add(facing.getModX(), facing.getModY(), facing.getModZ()); | ||||||
|                                 case SOUTH -> location = location.add(-1, 0, 0); |  | ||||||
|                                 case WEST -> location = location.add(0, 0, 1); |  | ||||||
|                                 case NORTH -> location = location.add(0, 0, -1); |  | ||||||
|                             } |  | ||||||
|                 Plot newPlot = area.getOwnedPlotAbs(location); |                 Plot newPlot = area.getOwnedPlotAbs(location); | ||||||
|                 if (!plot.equals(newPlot)) { |                 if (!plot.equals(newPlot)) { | ||||||
|                     event.setCancelled(true); |                     event.setCancelled(true); | ||||||
|                     plot.debug("Prevented piston update because of invalid edge piston detection"); |                     plot.debug("Prevented piston update because of invalid edge piston detection"); | ||||||
|                                 return; |  | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|                 break; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) |     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) | ||||||
|     public void blockCreate(BlockPlaceEvent event) { |     public void blockCreate(BlockPlaceEvent event) { | ||||||
| @@ -551,17 +544,18 @@ public class BlockEventListener implements Listener { | |||||||
|         if (plot == null) { |         if (plot == null) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         switch (event.getNewState().getType()) { |         if (location.getY() >= area.getMaxBuildHeight() || location.getY() < area.getMinBuildHeight()) { | ||||||
|             case SNOW: |             event.setCancelled(true); | ||||||
|             case SNOW_BLOCK: |             return; | ||||||
|  |         } | ||||||
|  |         if (Tag.SNOW.isTagged(event.getNewState().getType())) { | ||||||
|             if (!plot.getFlag(SnowFormFlag.class)) { |             if (!plot.getFlag(SnowFormFlag.class)) { | ||||||
|                 plot.debug("Snow could not form because snow-form = false"); |                 plot.debug("Snow could not form because snow-form = false"); | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|             } |             } | ||||||
|             return; |             return; | ||||||
|             case ICE: |         } | ||||||
|             case FROSTED_ICE: |         if (Tag.ICE.isTagged(event.getNewState().getType())) { | ||||||
|             case PACKED_ICE: |  | ||||||
|             if (!plot.getFlag(IceFormFlag.class)) { |             if (!plot.getFlag(IceFormFlag.class)) { | ||||||
|                 plot.debug("Ice could not form because ice-form = false"); |                 plot.debug("Ice could not form because ice-form = false"); | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
| @@ -586,18 +580,12 @@ public class BlockEventListener implements Listener { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         Class<? extends BooleanFlag<?>> flag; |         Class<? extends BooleanFlag<?>> flag; | ||||||
|         switch (event.getNewState().getType()) { |         if (Tag.SNOW.isTagged(event.getNewState().getType())) { | ||||||
|             case SNOW: |  | ||||||
|             case SNOW_BLOCK: |  | ||||||
|             flag = SnowFormFlag.class; |             flag = SnowFormFlag.class; | ||||||
|                 break; |         } else if (Tag.ICE.isTagged(event.getNewState().getType())) { | ||||||
|             case ICE: |  | ||||||
|             case FROSTED_ICE: |  | ||||||
|             case PACKED_ICE: |  | ||||||
|             flag = IceFormFlag.class; |             flag = IceFormFlag.class; | ||||||
|                 break; |         } else { | ||||||
|             default: |             return; | ||||||
|                 return; // other blocks are ignored by this event |  | ||||||
|         } |         } | ||||||
|         boolean allowed = plot.getFlag(flag); |         boolean allowed = plot.getFlag(flag); | ||||||
|         Entity entity = event.getEntity(); |         Entity entity = event.getEntity(); | ||||||
| @@ -701,111 +689,98 @@ public class BlockEventListener implements Listener { | |||||||
|             event.setCancelled(true); |             event.setCancelled(true); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         switch (block.getType()) { |         Material blockType = block.getType(); | ||||||
|             case ICE: |         if (Tag.ICE.isTagged(blockType)) { | ||||||
|             if (!plot.getFlag(IceMeltFlag.class)) { |             if (!plot.getFlag(IceMeltFlag.class)) { | ||||||
|                 plot.debug("Ice could not melt because ice-melt = false"); |                 plot.debug("Ice could not melt because ice-melt = false"); | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|             } |             } | ||||||
|                 break; |             return; | ||||||
|             case SNOW: |         } | ||||||
|  |         if (Tag.SNOW.isTagged(blockType)) { | ||||||
|             if (!plot.getFlag(SnowMeltFlag.class)) { |             if (!plot.getFlag(SnowMeltFlag.class)) { | ||||||
|                 plot.debug("Snow could not melt because snow-melt = false"); |                 plot.debug("Snow could not melt because snow-melt = false"); | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|             } |             } | ||||||
|                 break; |             return; | ||||||
|             case FARMLAND: |         } | ||||||
|  |         if (blockType == Material.FARMLAND) { | ||||||
|             if (!plot.getFlag(SoilDryFlag.class)) { |             if (!plot.getFlag(SoilDryFlag.class)) { | ||||||
|                 plot.debug("Soil could not dry because soil-dry = false"); |                 plot.debug("Soil could not dry because soil-dry = false"); | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|             } |             } | ||||||
|                 break; |             return; | ||||||
|             case TUBE_CORAL_BLOCK: |         } | ||||||
|             case BRAIN_CORAL_BLOCK: |         if (Tag.CORAL_BLOCKS.isTagged(blockType) || Tag.CORALS.isTagged(blockType)) { | ||||||
|             case BUBBLE_CORAL_BLOCK: |  | ||||||
|             case FIRE_CORAL_BLOCK: |  | ||||||
|             case HORN_CORAL_BLOCK: |  | ||||||
|             case TUBE_CORAL: |  | ||||||
|             case BRAIN_CORAL: |  | ||||||
|             case BUBBLE_CORAL: |  | ||||||
|             case FIRE_CORAL: |  | ||||||
|             case HORN_CORAL: |  | ||||||
|             case TUBE_CORAL_FAN: |  | ||||||
|             case BRAIN_CORAL_FAN: |  | ||||||
|             case BUBBLE_CORAL_FAN: |  | ||||||
|             case FIRE_CORAL_FAN: |  | ||||||
|             case HORN_CORAL_FAN: |  | ||||||
|             case BRAIN_CORAL_WALL_FAN: |  | ||||||
|             case BUBBLE_CORAL_WALL_FAN: |  | ||||||
|             case FIRE_CORAL_WALL_FAN: |  | ||||||
|             case HORN_CORAL_WALL_FAN: |  | ||||||
|             case TUBE_CORAL_WALL_FAN: |  | ||||||
|             if (!plot.getFlag(CoralDryFlag.class)) { |             if (!plot.getFlag(CoralDryFlag.class)) { | ||||||
|                 plot.debug("Coral could not dry because coral-dry = false"); |                 plot.debug("Coral could not dry because coral-dry = false"); | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|             } |             } | ||||||
|                 break; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) |     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) | ||||||
|     public void onChange(BlockFromToEvent event) { |     public void onChange(BlockFromToEvent event) { | ||||||
|         Block from = event.getBlock(); |         Block fromBlock = event.getBlock(); | ||||||
|  |  | ||||||
|         // Check liquid flow flag inside of origin plot too |         // Check liquid flow flag inside of origin plot too | ||||||
|         final Location fLocation = BukkitUtil.adapt(from.getLocation()); |         final Location fromLocation = BukkitUtil.adapt(fromBlock.getLocation()); | ||||||
|         final PlotArea fromArea = fLocation.getPlotArea(); |         final PlotArea fromArea = fromLocation.getPlotArea(); | ||||||
|         if (fromArea != null) { |         if (fromArea != null) { | ||||||
|             final Plot plot = fromArea.getOwnedPlot(fLocation); |             final Plot fromPlot = fromArea.getOwnedPlot(fromLocation); | ||||||
|             if (plot != null && plot.getFlag(LiquidFlowFlag.class) == LiquidFlowFlag.FlowStatus.DISABLED && event |             if (fromPlot != null && fromPlot.getFlag(LiquidFlowFlag.class) == LiquidFlowFlag.FlowStatus.DISABLED && event | ||||||
|                     .getBlock() |                     .getBlock() | ||||||
|                     .isLiquid()) { |                     .isLiquid()) { | ||||||
|                 plot.debug("Liquid could not flow because liquid-flow = disabled"); |                 fromPlot.debug("Liquid could not flow because liquid-flow = disabled"); | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         Block to = event.getToBlock(); |         Block toBlock = event.getToBlock(); | ||||||
|         Location tLocation = BukkitUtil.adapt(to.getLocation()); |         Location toLocation = BukkitUtil.adapt(toBlock.getLocation()); | ||||||
|         PlotArea area = tLocation.getPlotArea(); |         PlotArea toArea = toLocation.getPlotArea(); | ||||||
|         if (area == null) { |         if (toArea == null) { | ||||||
|             if (from.getType() == Material.DRAGON_EGG && fromArea != null) { |             if (fromBlock.getType() == Material.DRAGON_EGG && fromArea != null) { | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|             } |             } | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         Plot plot = area.getOwnedPlot(tLocation); |         if (toLocation.getY() >= toArea.getMaxBuildHeight() || toLocation.getY() < toArea.getMinBuildHeight()) { | ||||||
|  |             event.setCancelled(true); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         Plot toPlot = toArea.getOwnedPlot(toLocation); | ||||||
|  |  | ||||||
|         if (from.getType() == Material.DRAGON_EGG && fromArea != null) { |         if (fromBlock.getType() == Material.DRAGON_EGG && fromArea != null) { | ||||||
|             final Plot fromPlot = fromArea.getOwnedPlot(fLocation); |             final Plot fromPlot = fromArea.getOwnedPlot(fromLocation); | ||||||
|  |  | ||||||
|             if (fromPlot != null || plot != null) { |             if (fromPlot != null || toPlot != null) { | ||||||
|                 if ((fromPlot == null || !fromPlot.equals(plot)) && (plot == null || !plot.equals(fromPlot))) { |                 if ((fromPlot == null || !fromPlot.equals(toPlot)) && (toPlot == null || !toPlot.equals(fromPlot))) { | ||||||
|                     event.setCancelled(true); |                     event.setCancelled(true); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (plot != null) { |         if (toPlot != null) { | ||||||
|             if (!area.contains(fLocation.getX(), fLocation.getZ()) || !Objects.equals(plot, area.getOwnedPlot(fLocation))) { |             if (!toArea.contains(fromLocation.getX(), fromLocation.getZ()) || !Objects.equals(toPlot, toArea.getOwnedPlot(fromLocation))) { | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             if (plot.getFlag(LiquidFlowFlag.class) == LiquidFlowFlag.FlowStatus.ENABLED && event.getBlock().isLiquid()) { |             if (toPlot.getFlag(LiquidFlowFlag.class) == LiquidFlowFlag.FlowStatus.ENABLED && event.getBlock().isLiquid()) { | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             if (plot.getFlag(DisablePhysicsFlag.class)) { |             if (toPlot.getFlag(DisablePhysicsFlag.class)) { | ||||||
|                 plot.debug(event.getBlock().getType() + " could not update because disable-physics = true"); |                 toPlot.debug(event.getBlock().getType() + " could not update because disable-physics = true"); | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             if (plot.getFlag(LiquidFlowFlag.class) == LiquidFlowFlag.FlowStatus.DISABLED && event.getBlock().isLiquid()) { |             if (toPlot.getFlag(LiquidFlowFlag.class) == LiquidFlowFlag.FlowStatus.DISABLED && event.getBlock().isLiquid()) { | ||||||
|                 plot.debug("Liquid could not flow because liquid-flow = disabled"); |                 toPlot.debug("Liquid could not flow because liquid-flow = disabled"); | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|             } |             } | ||||||
|         } else if (!area.contains(fLocation.getX(), fLocation.getZ()) || !Objects.equals(null, area.getOwnedPlot(fLocation))) { |         } else if (!toArea.contains(fromLocation.getX(), fromLocation.getZ()) || !Objects.equals(null, toArea.getOwnedPlot(fromLocation))) { | ||||||
|             event.setCancelled(true); |             event.setCancelled(true); | ||||||
|         } else if (event.getBlock().isLiquid()) { |         } else if (event.getBlock().isLiquid()) { | ||||||
|             final org.bukkit.Location location = event.getBlock().getLocation(); |             final org.bukkit.Location location = event.getBlock().getLocation(); | ||||||
|   | |||||||
| @@ -33,6 +33,7 @@ import com.plotsquared.core.plot.Plot; | |||||||
| import com.plotsquared.core.plot.PlotArea; | import com.plotsquared.core.plot.PlotArea; | ||||||
| import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag; | import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag; | import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag; | ||||||
|  | import org.bukkit.Material; | ||||||
| import org.bukkit.block.Block; | import org.bukkit.block.Block; | ||||||
| import org.bukkit.entity.Entity; | import org.bukkit.entity.Entity; | ||||||
| import org.bukkit.entity.Item; | import org.bukkit.entity.Item; | ||||||
| @@ -46,11 +47,31 @@ import org.bukkit.event.block.BlockReceiveGameEvent; | |||||||
|  |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Objects; | import java.util.Objects; | ||||||
|  | import java.util.Set; | ||||||
| import java.util.UUID; | import java.util.UUID; | ||||||
|  |  | ||||||
| @SuppressWarnings("unused") | @SuppressWarnings("unused") | ||||||
| public class BlockEventListener117 implements Listener { | public class BlockEventListener117 implements Listener { | ||||||
|  |  | ||||||
|  |     private static final Set<Material> COPPER_OXIDIZING = Set.of( | ||||||
|  |             Material.COPPER_BLOCK, | ||||||
|  |             Material.EXPOSED_COPPER, | ||||||
|  |             Material.WEATHERED_COPPER, | ||||||
|  |             Material.OXIDIZED_COPPER, | ||||||
|  |             Material.CUT_COPPER, | ||||||
|  |             Material.EXPOSED_CUT_COPPER, | ||||||
|  |             Material.WEATHERED_CUT_COPPER, | ||||||
|  |             Material.OXIDIZED_CUT_COPPER, | ||||||
|  |             Material.CUT_COPPER_STAIRS, | ||||||
|  |             Material.EXPOSED_CUT_COPPER_STAIRS, | ||||||
|  |             Material.WEATHERED_CUT_COPPER_STAIRS, | ||||||
|  |             Material.OXIDIZED_CUT_COPPER_STAIRS, | ||||||
|  |             Material.CUT_COPPER_SLAB, | ||||||
|  |             Material.EXPOSED_CUT_COPPER_SLAB, | ||||||
|  |             Material.WEATHERED_CUT_COPPER_SLAB, | ||||||
|  |             Material.OXIDIZED_CUT_COPPER_SLAB | ||||||
|  |     ); | ||||||
|  |  | ||||||
|     @Inject |     @Inject | ||||||
|     public BlockEventListener117() { |     public BlockEventListener117() { | ||||||
|     } |     } | ||||||
| @@ -155,23 +176,7 @@ public class BlockEventListener117 implements Listener { | |||||||
|         if (plot == null) { |         if (plot == null) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         switch (event.getNewState().getType()) { |         if (COPPER_OXIDIZING.contains(event.getNewState().getType())) { | ||||||
|             case COPPER_BLOCK: |  | ||||||
|             case EXPOSED_COPPER: |  | ||||||
|             case WEATHERED_COPPER: |  | ||||||
|             case OXIDIZED_COPPER: |  | ||||||
|             case CUT_COPPER: |  | ||||||
|             case EXPOSED_CUT_COPPER: |  | ||||||
|             case WEATHERED_CUT_COPPER: |  | ||||||
|             case OXIDIZED_CUT_COPPER: |  | ||||||
|             case CUT_COPPER_STAIRS: |  | ||||||
|             case EXPOSED_CUT_COPPER_STAIRS: |  | ||||||
|             case WEATHERED_CUT_COPPER_STAIRS: |  | ||||||
|             case OXIDIZED_CUT_COPPER_STAIRS: |  | ||||||
|             case CUT_COPPER_SLAB: |  | ||||||
|             case EXPOSED_CUT_COPPER_SLAB: |  | ||||||
|             case WEATHERED_CUT_COPPER_SLAB: |  | ||||||
|             case OXIDIZED_CUT_COPPER_SLAB: |  | ||||||
|             if (!plot.getFlag(CopperOxideFlag.class)) { |             if (!plot.getFlag(CopperOxideFlag.class)) { | ||||||
|                 plot.debug("Copper could not oxide because copper-oxide = false"); |                 plot.debug("Copper could not oxide because copper-oxide = false"); | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|   | |||||||
| @@ -168,6 +168,7 @@ public class EntityEventListener implements Listener { | |||||||
|             case "RAID": |             case "RAID": | ||||||
|             case "SHEARED": |             case "SHEARED": | ||||||
|             case "SILVERFISH_BLOCK": |             case "SILVERFISH_BLOCK": | ||||||
|  |             case "ENDER_PEARL": | ||||||
|             case "TRAP": |             case "TRAP": | ||||||
|             case "VILLAGE_DEFENSE": |             case "VILLAGE_DEFENSE": | ||||||
|             case "VILLAGE_INVASION": |             case "VILLAGE_INVASION": | ||||||
| @@ -207,7 +208,7 @@ public class EntityEventListener implements Listener { | |||||||
|             } |             } | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         if (BukkitEntityUtil.checkEntity(entity, plot)) { |         if (BukkitEntityUtil.checkEntity(entity, plot.getBasePlot(false))) { | ||||||
|             event.setCancelled(true); |             event.setCancelled(true); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -131,16 +131,16 @@ public class EntitySpawnListener implements Listener { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         Plot plot = location.getOwnedPlotAbs(); |         Plot plot = location.getOwnedPlotAbs(); | ||||||
|         if (plot == null) { |  | ||||||
|         EntityType type = entity.getType(); |         EntityType type = entity.getType(); | ||||||
|  |         if (plot == null) { | ||||||
|             if (!area.isMobSpawning()) { |             if (!area.isMobSpawning()) { | ||||||
|                 switch (type) { |                 if (type == EntityType.PLAYER) { | ||||||
|                     case DROPPED_ITEM: |  | ||||||
|                         if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { |  | ||||||
|                             event.setCancelled(true); |  | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                     case PLAYER: |                 if (type == EntityType.DROPPED_ITEM) { | ||||||
|  |                     if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { | ||||||
|  |                         event.setCancelled(true); | ||||||
|  |                     } | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                 if (type.isAlive()) { |                 if (type.isAlive()) { | ||||||
| @@ -155,12 +155,13 @@ public class EntitySpawnListener implements Listener { | |||||||
|         if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { |         if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { | ||||||
|             event.setCancelled(true); |             event.setCancelled(true); | ||||||
|         } |         } | ||||||
|         switch (entity.getType()) { |         if (type == EntityType.ENDER_CRYSTAL) { | ||||||
|             case ENDER_CRYSTAL: |  | ||||||
|             if (BukkitEntityUtil.checkEntity(entity, plot)) { |             if (BukkitEntityUtil.checkEntity(entity, plot)) { | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|             } |             } | ||||||
|             case SHULKER: |             return; | ||||||
|  |         } | ||||||
|  |         if (type == EntityType.SHULKER) { | ||||||
|             if (!entity.hasMetadata("shulkerPlot")) { |             if (!entity.hasMetadata("shulkerPlot")) { | ||||||
|                 entity.setMetadata("shulkerPlot", new FixedMetadataValue((Plugin) PlotSquared.platform(), plot.getId())); |                 entity.setMetadata("shulkerPlot", new FixedMetadataValue((Plugin) PlotSquared.platform(), plot.getId())); | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -196,6 +196,7 @@ public class PaperListener implements Listener { | |||||||
|             case "RAID": |             case "RAID": | ||||||
|             case "SHEARED": |             case "SHEARED": | ||||||
|             case "SILVERFISH_BLOCK": |             case "SILVERFISH_BLOCK": | ||||||
|  |             case "ENDER_PEARL": | ||||||
|             case "TRAP": |             case "TRAP": | ||||||
|             case "VILLAGE_DEFENSE": |             case "VILLAGE_DEFENSE": | ||||||
|             case "VILLAGE_INVASION": |             case "VILLAGE_INVASION": | ||||||
| @@ -236,14 +237,14 @@ public class PaperListener implements Listener { | |||||||
|         if (plot == null) { |         if (plot == null) { | ||||||
|             EntityType type = event.getType(); |             EntityType type = event.getType(); | ||||||
|             if (!area.isMobSpawning()) { |             if (!area.isMobSpawning()) { | ||||||
|                 switch (type) { |                 if (type == EntityType.PLAYER) { | ||||||
|                     case DROPPED_ITEM: |                     return; | ||||||
|  |                 } | ||||||
|  |                 if (type == EntityType.DROPPED_ITEM) { | ||||||
|                     if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { |                     if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { | ||||||
|                         event.setShouldAbortSpawn(true); |                         event.setShouldAbortSpawn(true); | ||||||
|                         event.setCancelled(true); |                         event.setCancelled(true); | ||||||
|                             return; |  | ||||||
|                     } |                     } | ||||||
|                     case PLAYER: |  | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                 if (type.isAlive()) { |                 if (type.isAlive()) { | ||||||
|   | |||||||
| @@ -89,6 +89,7 @@ import org.bukkit.Bukkit; | |||||||
| import org.bukkit.ChatColor; | import org.bukkit.ChatColor; | ||||||
| import org.bukkit.FluidCollisionMode; | import org.bukkit.FluidCollisionMode; | ||||||
| import org.bukkit.Material; | import org.bukkit.Material; | ||||||
|  | import org.bukkit.Tag; | ||||||
| import org.bukkit.block.Block; | import org.bukkit.block.Block; | ||||||
| import org.bukkit.block.BlockFace; | import org.bukkit.block.BlockFace; | ||||||
| import org.bukkit.block.BlockState; | import org.bukkit.block.BlockState; | ||||||
| @@ -166,6 +167,20 @@ import java.util.regex.Pattern; | |||||||
| @SuppressWarnings("unused") | @SuppressWarnings("unused") | ||||||
| public class PlayerEventListener extends PlotListener implements Listener { | public class PlayerEventListener extends PlotListener implements Listener { | ||||||
|  |  | ||||||
|  |     private static final Set<Material> MINECARTS = Set.of( | ||||||
|  |             Material.MINECART, | ||||||
|  |             Material.TNT_MINECART, | ||||||
|  |             Material.CHEST_MINECART, | ||||||
|  |             Material.COMMAND_BLOCK_MINECART, | ||||||
|  |             Material.FURNACE_MINECART, | ||||||
|  |             Material.HOPPER_MINECART | ||||||
|  |     ); | ||||||
|  |     private static final Set<Material> BOOKS = Set.of( | ||||||
|  |             Material.BOOK, | ||||||
|  |             Material.KNOWLEDGE_BOOK, | ||||||
|  |             Material.WRITABLE_BOOK, | ||||||
|  |             Material.WRITTEN_BOOK | ||||||
|  |     ); | ||||||
|     private final EventDispatcher eventDispatcher; |     private final EventDispatcher eventDispatcher; | ||||||
|     private final WorldEdit worldEdit; |     private final WorldEdit worldEdit; | ||||||
|     private final PlotAreaManager plotAreaManager; |     private final PlotAreaManager plotAreaManager; | ||||||
| @@ -837,10 +852,10 @@ public class PlayerEventListener extends PlotListener implements Listener { | |||||||
|         if ((slot > 8) || !event.getEventName().equals("InventoryCreativeEvent")) { |         if ((slot > 8) || !event.getEventName().equals("InventoryCreativeEvent")) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         ItemStack current = inv.getItemInHand(); |         ItemStack oldItem = inv.getItemInHand(); | ||||||
|  |         ItemMeta oldMeta = oldItem.getItemMeta(); | ||||||
|         ItemStack newItem = event.getCursor(); |         ItemStack newItem = event.getCursor(); | ||||||
|         ItemMeta newMeta = newItem.getItemMeta(); |         ItemMeta newMeta = newItem.getItemMeta(); | ||||||
|         ItemMeta oldMeta = newItem.getItemMeta(); |  | ||||||
|  |  | ||||||
|         if (event.getClick() == ClickType.CREATIVE) { |         if (event.getClick() == ClickType.CREATIVE) { | ||||||
|             final Plot plot = pp.getCurrentPlot(); |             final Plot plot = pp.getCurrentPlot(); | ||||||
| @@ -880,33 +895,25 @@ public class PlayerEventListener extends PlotListener implements Listener { | |||||||
|                 oldLore = lore.toString(); |                 oldLore = lore.toString(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         if (!"[(+NBT)]".equals(newLore) || (current.equals(newItem) && newLore.equals(oldLore))) { |         Material itemType = newItem.getType(); | ||||||
|             switch (newItem.getType()) { |         if (!"[(+NBT)]".equals(newLore) || (oldItem.equals(newItem) && newLore.equals(oldLore))) { | ||||||
|                 case LEGACY_BANNER: |             if (newMeta == null || (itemType != Material.LEGACY_BANNER && itemType != Material.PLAYER_HEAD)) { | ||||||
|                 case PLAYER_HEAD: |  | ||||||
|                     if (newMeta != null) { |  | ||||||
|                         break; |  | ||||||
|                     } |  | ||||||
|                 default: |  | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         Block block = player.getTargetBlock(null, 7); |         Block block = player.getTargetBlock(null, 7); | ||||||
|         org.bukkit.block.BlockState state = block.getState(); |         org.bukkit.block.BlockState state = block.getState(); | ||||||
|         Material stateType = state.getType(); |         Material stateType = state.getType(); | ||||||
|         Material itemType = newItem.getType(); |  | ||||||
|         if (stateType != itemType) { |         if (stateType != itemType) { | ||||||
|             switch (stateType) { |             if (stateType == Material.LEGACY_WALL_BANNER || stateType == Material.LEGACY_STANDING_BANNER) { | ||||||
|                 case LEGACY_STANDING_BANNER: |                 if (itemType != Material.LEGACY_BANNER) { | ||||||
|                 case LEGACY_WALL_BANNER: |                     return; | ||||||
|                     if (itemType == Material.LEGACY_BANNER) { |  | ||||||
|                         break; |  | ||||||
|                 } |                 } | ||||||
|                 case LEGACY_SKULL: |             } else if (stateType == Material.LEGACY_SKULL) { | ||||||
|                     if (itemType == Material.LEGACY_SKULL_ITEM) { |                 if (itemType != Material.LEGACY_SKULL_ITEM) { | ||||||
|                         break; |                     return; | ||||||
|                 } |                 } | ||||||
|                 default: |             } else { | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -946,7 +953,7 @@ public class PlayerEventListener extends PlotListener implements Listener { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         if (cancelled) { |         if (cancelled) { | ||||||
|             if ((current.getType() == newItem.getType()) && (current.getDurability() == newItem |             if ((oldItem.getType() == newItem.getType()) && (oldItem.getDurability() == newItem | ||||||
|                     .getDurability())) { |                     .getDurability())) { | ||||||
|                 event.setCursor( |                 event.setCursor( | ||||||
|                         new ItemStack(newItem.getType(), newItem.getAmount(), newItem.getDurability())); |                         new ItemStack(newItem.getType(), newItem.getAmount(), newItem.getDurability())); | ||||||
| @@ -1133,14 +1140,21 @@ public class PlayerEventListener extends PlotListener implements Listener { | |||||||
|                     //Allow all players to eat while also allowing the block place event ot be fired |                     //Allow all players to eat while also allowing the block place event ot be fired | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                 switch (type) { |                 if (type == Material.ARMOR_STAND) { | ||||||
|                     case ACACIA_BOAT, BIRCH_BOAT, CHEST_MINECART, COMMAND_BLOCK_MINECART, DARK_OAK_BOAT, FURNACE_MINECART, HOPPER_MINECART, JUNGLE_BOAT, MINECART, OAK_BOAT, SPRUCE_BOAT, TNT_MINECART -> eventType = PlayerBlockEventType.PLACE_VEHICLE; |  | ||||||
|                     case FIREWORK_ROCKET, FIREWORK_STAR -> eventType = PlayerBlockEventType.SPAWN_MOB; |  | ||||||
|                     case BOOK, KNOWLEDGE_BOOK, WRITABLE_BOOK, WRITTEN_BOOK -> eventType = PlayerBlockEventType.READ; |  | ||||||
|                     case ARMOR_STAND -> { |  | ||||||
|                     location = BukkitUtil.adapt(block.getRelative(event.getBlockFace()).getLocation()); |                     location = BukkitUtil.adapt(block.getRelative(event.getBlockFace()).getLocation()); | ||||||
|                     eventType = PlayerBlockEventType.PLACE_MISC; |                     eventType = PlayerBlockEventType.PLACE_MISC; | ||||||
|                 } |                 } | ||||||
|  |                 if (Tag.ITEMS_BOATS.isTagged(type) || MINECARTS.contains(type)) { | ||||||
|  |                     eventType = PlayerBlockEventType.PLACE_VEHICLE; | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |                 if (type == Material.FIREWORK_ROCKET || type == Material.FIREWORK_STAR) { | ||||||
|  |                     eventType = PlayerBlockEventType.SPAWN_MOB; | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |                 if (BOOKS.contains(type)) { | ||||||
|  |                     eventType = PlayerBlockEventType.READ; | ||||||
|  |                     break; | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -76,10 +76,11 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator { | |||||||
|     private final int totalSize; |     private final int totalSize; | ||||||
|     private final AtomicInteger expectedSize; |     private final AtomicInteger expectedSize; | ||||||
|     private final AtomicInteger loadingChunks = new AtomicInteger(); |     private final AtomicInteger loadingChunks = new AtomicInteger(); | ||||||
|  |     private final boolean forceSync; | ||||||
|  |  | ||||||
|     private int batchSize; |     private int batchSize; | ||||||
|     private PlotSquaredTask task; |     private PlotSquaredTask task; | ||||||
|     private boolean shouldCancel; |     private volatile boolean shouldCancel; | ||||||
|     private boolean finished; |     private boolean finished; | ||||||
|  |  | ||||||
|     @Inject |     @Inject | ||||||
| @@ -92,7 +93,8 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator { | |||||||
|             @Assisted final @NonNull Runnable whenDone, |             @Assisted final @NonNull Runnable whenDone, | ||||||
|             @Assisted final @NonNull Consumer<Throwable> throwableConsumer, |             @Assisted final @NonNull Consumer<Throwable> throwableConsumer, | ||||||
|             @Assisted final boolean unloadAfter, |             @Assisted final boolean unloadAfter, | ||||||
|             @Assisted final @NonNull Collection<ProgressSubscriber> progressSubscribers |             @Assisted final @NonNull Collection<ProgressSubscriber> progressSubscribers, | ||||||
|  |             @Assisted final boolean forceSync | ||||||
|     ) { |     ) { | ||||||
|         this.requestedChunks = new LinkedBlockingQueue<>(requestedChunks); |         this.requestedChunks = new LinkedBlockingQueue<>(requestedChunks); | ||||||
|         this.availableChunks = new LinkedBlockingQueue<>(); |         this.availableChunks = new LinkedBlockingQueue<>(); | ||||||
| @@ -107,14 +109,27 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator { | |||||||
|         this.plugin = JavaPlugin.getPlugin(BukkitPlatform.class); |         this.plugin = JavaPlugin.getPlugin(BukkitPlatform.class); | ||||||
|         this.bukkitWorld = Bukkit.getWorld(world.getName()); |         this.bukkitWorld = Bukkit.getWorld(world.getName()); | ||||||
|         this.progressSubscribers.addAll(progressSubscribers); |         this.progressSubscribers.addAll(progressSubscribers); | ||||||
|  |         this.forceSync = forceSync; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void start() { |     public void start() { | ||||||
|  |         if (!forceSync) { | ||||||
|             // Request initial batch |             // Request initial batch | ||||||
|             this.requestBatch(); |             this.requestBatch(); | ||||||
|             // Wait until next tick to give the chunks a chance to be loaded |             // Wait until next tick to give the chunks a chance to be loaded | ||||||
|             TaskManager.runTaskLater(() -> task = TaskManager.runTaskRepeat(this, TaskTime.ticks(1)), TaskTime.ticks(1)); |             TaskManager.runTaskLater(() -> task = TaskManager.runTaskRepeat(this, TaskTime.ticks(1)), TaskTime.ticks(1)); | ||||||
|  |         } else { | ||||||
|  |             try { | ||||||
|  |                 while (!shouldCancel && !requestedChunks.isEmpty()) { | ||||||
|  |                     chunkConsumer.accept(requestedChunks.poll()); | ||||||
|  |                 } | ||||||
|  |             } catch (Throwable t) { | ||||||
|  |                 throwableConsumer.accept(t); | ||||||
|  |             } finally { | ||||||
|  |                 finish(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
| @@ -131,7 +146,9 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator { | |||||||
|             for (final ProgressSubscriber subscriber : this.progressSubscribers) { |             for (final ProgressSubscriber subscriber : this.progressSubscribers) { | ||||||
|                 subscriber.notifyEnd(); |                 subscriber.notifyEnd(); | ||||||
|             } |             } | ||||||
|  |             if (task != null) { | ||||||
|                 task.cancel(); |                 task.cancel(); | ||||||
|  |             } | ||||||
|             finished = true; |             finished = true; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -51,6 +51,7 @@ 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.BlockState; | ||||||
| import org.bukkit.Bukkit; | import org.bukkit.Bukkit; | ||||||
|  | import org.bukkit.Chunk; | ||||||
| import org.bukkit.block.Block; | import org.bukkit.block.Block; | ||||||
| import org.bukkit.block.Container; | import org.bukkit.block.Container; | ||||||
| import org.bukkit.block.data.BlockData; | import org.bukkit.block.data.BlockData; | ||||||
| @@ -62,10 +63,27 @@ import java.util.function.Consumer; | |||||||
|  |  | ||||||
| public class BukkitQueueCoordinator extends BasicQueueCoordinator { | public class BukkitQueueCoordinator extends BasicQueueCoordinator { | ||||||
|  |  | ||||||
|     private final SideEffectSet noSideEffectSet; |     private static final SideEffectSet NO_SIDE_EFFECT_SET; | ||||||
|     private final SideEffectSet lightingSideEffectSet; |     private static final SideEffectSet EDGE_SIDE_EFFECT_SET; | ||||||
|     private final SideEffectSet edgeSideEffectSet; |     private static final SideEffectSet LIGHTING_SIDE_EFFECT_SET; | ||||||
|     private final SideEffectSet edgeLightingSideEffectSet; |     private static final SideEffectSet EDGE_LIGHTING_SIDE_EFFECT_SET; | ||||||
|  |  | ||||||
|  |     static { | ||||||
|  |         NO_SIDE_EFFECT_SET = SideEffectSet.none().with(SideEffect.LIGHTING, SideEffect.State.OFF).with( | ||||||
|  |                 SideEffect.NEIGHBORS, | ||||||
|  |                 SideEffect.State.OFF | ||||||
|  |         ); | ||||||
|  |         EDGE_SIDE_EFFECT_SET = SideEffectSet.none().with(SideEffect.UPDATE, SideEffect.State.ON).with( | ||||||
|  |                 SideEffect.NEIGHBORS, | ||||||
|  |                 SideEffect.State.ON | ||||||
|  |         ); | ||||||
|  |         LIGHTING_SIDE_EFFECT_SET = SideEffectSet.none().with(SideEffect.NEIGHBORS, SideEffect.State.OFF); | ||||||
|  |         EDGE_LIGHTING_SIDE_EFFECT_SET = SideEffectSet.none().with(SideEffect.UPDATE, SideEffect.State.ON).with( | ||||||
|  |                 SideEffect.NEIGHBORS, | ||||||
|  |                 SideEffect.State.ON | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     private org.bukkit.World bukkitWorld; |     private org.bukkit.World bukkitWorld; | ||||||
|     @Inject |     @Inject | ||||||
|     private ChunkCoordinatorBuilderFactory chunkCoordinatorBuilderFactory; |     private ChunkCoordinatorBuilderFactory chunkCoordinatorBuilderFactory; | ||||||
| @@ -76,19 +94,6 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator { | |||||||
|     @Inject |     @Inject | ||||||
|     public BukkitQueueCoordinator(@NonNull World world) { |     public BukkitQueueCoordinator(@NonNull World world) { | ||||||
|         super(world); |         super(world); | ||||||
|         noSideEffectSet = SideEffectSet.none().with(SideEffect.LIGHTING, SideEffect.State.OFF).with( |  | ||||||
|                 SideEffect.NEIGHBORS, |  | ||||||
|                 SideEffect.State.OFF |  | ||||||
|         ); |  | ||||||
|         lightingSideEffectSet = SideEffectSet.none().with(SideEffect.NEIGHBORS, SideEffect.State.OFF); |  | ||||||
|         edgeSideEffectSet = noSideEffectSet.with(SideEffect.UPDATE, SideEffect.State.ON).with( |  | ||||||
|                 SideEffect.NEIGHBORS, |  | ||||||
|                 SideEffect.State.ON |  | ||||||
|         ); |  | ||||||
|         edgeLightingSideEffectSet = noSideEffectSet.with(SideEffect.UPDATE, SideEffect.State.ON).with( |  | ||||||
|                 SideEffect.NEIGHBORS, |  | ||||||
|                 SideEffect.State.ON |  | ||||||
|         ); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
| @@ -201,7 +206,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator { | |||||||
|                     localChunk.getTiles().forEach((blockVector3, tag) -> { |                     localChunk.getTiles().forEach((blockVector3, tag) -> { | ||||||
|                         try { |                         try { | ||||||
|                             BaseBlock block = getWorld().getBlock(blockVector3).toBaseBlock(tag); |                             BaseBlock block = getWorld().getBlock(blockVector3).toBaseBlock(tag); | ||||||
|                             getWorld().setBlock(blockVector3, block, noSideEffectSet); |                             getWorld().setBlock(blockVector3, block, getSideEffectSet(SideEffectState.NONE)); | ||||||
|                         } catch (WorldEditException ignored) { |                         } catch (WorldEditException ignored) { | ||||||
|                             StateWrapper sw = new StateWrapper(tag); |                             StateWrapper sw = new StateWrapper(tag); | ||||||
|                             sw.restoreTag(getWorld().getName(), blockVector3.getX(), blockVector3.getY(), blockVector3.getZ()); |                             sw.restoreTag(getWorld().getName(), blockVector3.getX(), blockVector3.getY(), blockVector3.getZ()); | ||||||
| @@ -258,15 +263,21 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator { | |||||||
|             } |             } | ||||||
|             SideEffectSet sideEffectSet; |             SideEffectSet sideEffectSet; | ||||||
|             if (lighting) { |             if (lighting) { | ||||||
|                 sideEffectSet = edge ? edgeLightingSideEffectSet : lightingSideEffectSet; |                 sideEffectSet = getSideEffectSet(edge ? SideEffectState.EDGE_LIGHTING : SideEffectState.LIGHTING); | ||||||
|             } else { |             } else { | ||||||
|                 sideEffectSet = edge ? edgeSideEffectSet : noSideEffectSet; |                 sideEffectSet = getSideEffectSet(edge ? SideEffectState.EDGE : SideEffectState.NONE); | ||||||
|             } |             } | ||||||
|             getWorld().setBlock(loc, block, sideEffectSet); |             getWorld().setBlock(loc, block, sideEffectSet); | ||||||
|         } catch (WorldEditException ignored) { |         } catch (WorldEditException ignored) { | ||||||
|             // Fallback to not so nice method |             // Fallback to not so nice method | ||||||
|             BlockData blockData = BukkitAdapter.adapt(block); |             BlockData blockData = BukkitAdapter.adapt(block); | ||||||
|             Block existing = getBukkitWorld().getBlockAt(x, y, z); |             Block existing; | ||||||
|  |             // Assume a chunk object has been given only when it should have been. | ||||||
|  |             if (getChunkObject() instanceof Chunk chunkObject) { | ||||||
|  |                 existing = chunkObject.getBlock(x & 15, y, z & 15); | ||||||
|  |             } else { | ||||||
|  |                  existing = getBukkitWorld().getBlockAt(x, y, z); | ||||||
|  |             } | ||||||
|             final BlockState existingBaseBlock = BukkitAdapter.adapt(existing.getBlockData()); |             final BlockState existingBaseBlock = BukkitAdapter.adapt(existing.getBlockData()); | ||||||
|             if (BukkitBlockUtil.get(existing).equals(existingBaseBlock) && existing.getBlockData().matches(blockData)) { |             if (BukkitBlockUtil.get(existing).equals(existingBaseBlock) && existing.getBlockData().matches(blockData)) { | ||||||
|                 return; |                 return; | ||||||
| @@ -282,7 +293,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator { | |||||||
|                 CompoundTag tag = block.getNbtData(); |                 CompoundTag tag = block.getNbtData(); | ||||||
|                 StateWrapper sw = new StateWrapper(tag); |                 StateWrapper sw = new StateWrapper(tag); | ||||||
|  |  | ||||||
|                 sw.restoreTag(getWorld().getName(), existing.getX(), existing.getY(), existing.getZ()); |                 sw.restoreTag(existing); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -375,4 +386,23 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator { | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private SideEffectSet getSideEffectSet(SideEffectState state) { | ||||||
|  |         if (getSideEffectSet() != null) { | ||||||
|  |             return getSideEffectSet(); | ||||||
|  |         } | ||||||
|  |         return switch (state) { | ||||||
|  |             case NONE -> NO_SIDE_EFFECT_SET; | ||||||
|  |             case EDGE -> EDGE_SIDE_EFFECT_SET; | ||||||
|  |             case LIGHTING -> LIGHTING_SIDE_EFFECT_SET; | ||||||
|  |             case EDGE_LIGHTING -> EDGE_LIGHTING_SIDE_EFFECT_SET; | ||||||
|  |         }; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private enum SideEffectState { | ||||||
|  |         NONE, | ||||||
|  |         EDGE, | ||||||
|  |         LIGHTING, | ||||||
|  |         EDGE_LIGHTING | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -44,6 +44,7 @@ import org.bukkit.enchantments.Enchantment; | |||||||
| import org.bukkit.inventory.Inventory; | import org.bukkit.inventory.Inventory; | ||||||
| import org.bukkit.inventory.InventoryHolder; | import org.bukkit.inventory.InventoryHolder; | ||||||
| import org.bukkit.inventory.ItemStack; | import org.bukkit.inventory.ItemStack; | ||||||
|  | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  |  | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
| @@ -166,14 +167,32 @@ public class StateWrapper { | |||||||
|         return str; |         return str; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @SuppressWarnings("deprecation") // #setLine is needed for Spigot compatibility |     /** | ||||||
|  |      * Restore the TileEntity data to the given world at the given coordinates. | ||||||
|  |      * | ||||||
|  |      * @param worldName World name | ||||||
|  |      * @param x         x position | ||||||
|  |      * @param y         y position | ||||||
|  |      * @param z         z position | ||||||
|  |      * @return true if successful | ||||||
|  |      */ | ||||||
|     public boolean restoreTag(String worldName, int x, int y, int z) { |     public boolean restoreTag(String worldName, int x, int y, int z) { | ||||||
|         if (this.tag == null) { |         World world = BukkitUtil.getWorld(worldName); | ||||||
|  |         if (world == null) { | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|         World world = BukkitUtil.getWorld(worldName); |         return restoreTag(world.getBlockAt(x, y, z)); | ||||||
|         Block block = world.getBlockAt(x, y, z); |     } | ||||||
|         if (block == null) { |  | ||||||
|  |     /** | ||||||
|  |      * Restore the TileEntity data to the given block | ||||||
|  |      * | ||||||
|  |      * @param block Block to restore to | ||||||
|  |      * @return true if successful | ||||||
|  |      */ | ||||||
|  |     @SuppressWarnings("deprecation") // #setLine is needed for Spigot compatibility | ||||||
|  |     public boolean restoreTag(@NonNull Block block) { | ||||||
|  |         if (this.tag == null) { | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|         org.bukkit.block.BlockState state = block.getState(); |         org.bukkit.block.BlockState state = block.getState(); | ||||||
|   | |||||||
| @@ -278,7 +278,7 @@ public class BukkitRegionManager extends RegionManager { | |||||||
|                                         int minY = value.getMin().getY(); |                                         int minY = value.getMin().getY(); | ||||||
|                                         for (int yIndex = 0; yIndex < ids.length; yIndex++) { |                                         for (int yIndex = 0; yIndex < ids.length; yIndex++) { | ||||||
|                                             int y = yIndex + minY; |                                             int y = yIndex + minY; | ||||||
|                                             BaseBlock id = ids[y]; |                                             BaseBlock id = ids[yIndex]; | ||||||
|                                             if (id != null) { |                                             if (id != null) { | ||||||
|                                                 value.setBlock(x1, y, z1, id); |                                                 value.setBlock(x1, y, z1, id); | ||||||
|                                             } else { |                                             } else { | ||||||
|   | |||||||
| @@ -76,7 +76,7 @@ public class BukkitSetupUtils extends SetupUtils { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void updateGenerators(final boolean force) { |     public void updateGenerators(final boolean force) { | ||||||
|         if (!SetupUtils.generators.isEmpty() && !force) { |         if (loaded && !SetupUtils.generators.isEmpty() && !force) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         String testWorld = "CheckingPlotSquaredGenerator"; |         String testWorld = "CheckingPlotSquaredGenerator"; | ||||||
| @@ -100,6 +100,7 @@ public class BukkitSetupUtils extends SetupUtils { | |||||||
|                 e.printStackTrace(); |                 e.printStackTrace(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |         loaded = true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|   | |||||||
| @@ -55,7 +55,7 @@ further defined and clarified by project maintainers. | |||||||
| ## Enforcement | ## Enforcement | ||||||
|  |  | ||||||
| Instances of abusive, harassing, or otherwise unacceptable behavior may be | Instances of abusive, harassing, or otherwise unacceptable behavior may be | ||||||
| reported by contacting the project team at contact@alexander-soderberg.com. All | reported by contacting the project team at contact@intellectualsites.com. All | ||||||
| complaints will be reviewed and investigated and will result in a response that | complaints will be reviewed and investigated and will result in a response that | ||||||
| is deemed necessary and appropriate to the circumstances. The project team is | is deemed necessary and appropriate to the circumstances. The project team is | ||||||
| obligated to maintain confidentiality with regard to the reporter of an incident. | obligated to maintain confidentiality with regard to the reporter of an incident. | ||||||
|   | |||||||
| @@ -2,18 +2,18 @@ import java.time.format.DateTimeFormatter | |||||||
|  |  | ||||||
| dependencies { | dependencies { | ||||||
|     // Expected everywhere. |     // Expected everywhere. | ||||||
|     compileOnlyApi(libs.checkerqual) |     compileOnlyApi("org.checkerframework:checker-qual") | ||||||
|  |  | ||||||
|     // Minecraft expectations |     // Minecraft expectations | ||||||
|     compileOnlyApi(libs.gson) |     compileOnlyApi("com.google.code.gson:gson") | ||||||
|     compileOnly(libs.guava) |     compileOnly("com.google.guava:guava") | ||||||
|  |  | ||||||
|     // Platform expectations |     // Platform expectations | ||||||
|     compileOnlyApi(libs.snakeyaml) |     compileOnlyApi("org.yaml:snakeyaml") | ||||||
|  |  | ||||||
|     // Adventure |     // Adventure | ||||||
|     api(libs.adventure) |     api("net.kyori:adventure-api") | ||||||
|     api(libs.minimessage) |     api("net.kyori:adventure-text-minimessage") | ||||||
|  |  | ||||||
|     // Guice |     // Guice | ||||||
|     api(libs.guice) { |     api(libs.guice) { | ||||||
| @@ -31,18 +31,18 @@ dependencies { | |||||||
|         exclude(group = "dummypermscompat") |         exclude(group = "dummypermscompat") | ||||||
|     } |     } | ||||||
|     testImplementation(libs.worldeditCore) |     testImplementation(libs.worldeditCore) | ||||||
|     compileOnly(libs.fastasyncworldeditCore) { isTransitive = false } |     compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Core") { isTransitive = false } | ||||||
|     testImplementation(libs.fastasyncworldeditCore) { isTransitive = false } |     testImplementation("com.fastasyncworldedit:FastAsyncWorldEdit-Core") { isTransitive = false } | ||||||
|  |  | ||||||
|     // Logging |     // Logging | ||||||
|     compileOnlyApi(libs.log4j) |     compileOnlyApi("org.apache.logging.log4j:log4j-api") | ||||||
|  |  | ||||||
|     // Other libraries |     // Other libraries | ||||||
|     api(libs.prtree) |     api(libs.prtree) | ||||||
|     api(libs.aopalliance) |     api(libs.aopalliance) | ||||||
|     api(libs.cloudServices) |     api(libs.cloudServices) | ||||||
|     api(libs.arkitektonika) |     api(libs.arkitektonika) | ||||||
|     api(libs.paster) |     api("com.intellectualsites.paster:Paster") | ||||||
| } | } | ||||||
|  |  | ||||||
| tasks.processResources { | tasks.processResources { | ||||||
|   | |||||||
| @@ -72,7 +72,10 @@ import com.plotsquared.core.util.ReflectionUtils; | |||||||
| import com.plotsquared.core.util.task.TaskManager; | import com.plotsquared.core.util.task.TaskManager; | ||||||
| import com.plotsquared.core.uuid.UUIDPipeline; | import com.plotsquared.core.uuid.UUIDPipeline; | ||||||
| import com.sk89q.worldedit.WorldEdit; | import com.sk89q.worldedit.WorldEdit; | ||||||
|  | import com.sk89q.worldedit.event.platform.PlatformReadyEvent; | ||||||
| import com.sk89q.worldedit.math.BlockVector2; | import com.sk89q.worldedit.math.BlockVector2; | ||||||
|  | import com.sk89q.worldedit.util.eventbus.EventHandler; | ||||||
|  | import com.sk89q.worldedit.util.eventbus.Subscribe; | ||||||
| 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.MonotonicNonNull; | import org.checkerframework.checker.nullness.qual.MonotonicNonNull; | ||||||
| @@ -153,6 +156,8 @@ public class PlotSquared { | |||||||
|     private EventDispatcher eventDispatcher; |     private EventDispatcher eventDispatcher; | ||||||
|     private PlotListener plotListener; |     private PlotListener plotListener; | ||||||
|  |  | ||||||
|  |     private boolean weInitialised; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Initialize PlotSquared with the desired Implementation class. |      * Initialize PlotSquared with the desired Implementation class. | ||||||
|      * |      * | ||||||
| @@ -223,6 +228,7 @@ public class PlotSquared { | |||||||
|             } |             } | ||||||
|  |  | ||||||
|             this.worldedit = WorldEdit.getInstance(); |             this.worldedit = WorldEdit.getInstance(); | ||||||
|  |             WorldEdit.getInstance().getEventBus().register(new WEPlatformReadyListener()); | ||||||
|  |  | ||||||
|             // Create Event utility class |             // Create Event utility class | ||||||
|             this.eventDispatcher = new EventDispatcher(this.worldedit); |             this.eventDispatcher = new EventDispatcher(this.worldedit); | ||||||
| @@ -889,8 +895,8 @@ public class PlotSquared { | |||||||
|                             e.printStackTrace(); |                             e.printStackTrace(); | ||||||
|                         } |                         } | ||||||
|                         LOGGER.info("| generator: {}>{}", baseGenerator, areaGen); |                         LOGGER.info("| generator: {}>{}", baseGenerator, areaGen); | ||||||
|                         LOGGER.info("| plot world: {}", pa); |                         LOGGER.info("| plot world: {}", pa.getClass().getCanonicalName()); | ||||||
|                         LOGGER.info("| manager: {}", pa); |                         LOGGER.info("| manager: {}", pa.getPlotManager().getClass().getCanonicalName()); | ||||||
|                         LOGGER.info("Note: Area created for cluster '{}' (invalid or old configuration?)", name); |                         LOGGER.info("Note: Area created for cluster '{}' (invalid or old configuration?)", name); | ||||||
|                         areaGen.getPlotGenerator().initialize(pa); |                         areaGen.getPlotGenerator().initialize(pa); | ||||||
|                         areaGen.augment(pa); |                         areaGen.augment(pa); | ||||||
| @@ -906,6 +912,13 @@ public class PlotSquared { | |||||||
|                     throw new IllegalArgumentException("Invalid Generator: " + gen_string); |                     throw new IllegalArgumentException("Invalid Generator: " + gen_string); | ||||||
|                 } |                 } | ||||||
|                 PlotArea pa = areaGen.getPlotGenerator().getNewPlotArea(world, null, null, null); |                 PlotArea pa = areaGen.getPlotGenerator().getNewPlotArea(world, null, null, null); | ||||||
|  |                 LOGGER.info("- generator: {}>{}", baseGenerator, areaGen); | ||||||
|  |                 LOGGER.info("- plot world: {}", pa.getClass().getCanonicalName()); | ||||||
|  |                 LOGGER.info("- plot area manager: {}", pa.getPlotManager().getClass().getCanonicalName()); | ||||||
|  |                 if (!this.worldConfiguration.contains(path)) { | ||||||
|  |                     this.worldConfiguration.createSection(path); | ||||||
|  |                     worldSection = this.worldConfiguration.getConfigurationSection(path); | ||||||
|  |                 } | ||||||
|                 pa.saveConfiguration(worldSection); |                 pa.saveConfiguration(worldSection); | ||||||
|                 pa.loadDefaultConfiguration(worldSection); |                 pa.loadDefaultConfiguration(worldSection); | ||||||
|                 try { |                 try { | ||||||
| @@ -913,9 +926,6 @@ public class PlotSquared { | |||||||
|                 } catch (IOException e) { |                 } catch (IOException e) { | ||||||
|                     e.printStackTrace(); |                     e.printStackTrace(); | ||||||
|                 } |                 } | ||||||
|                 LOGGER.info("- generator: {}>{}", baseGenerator, areaGen); |  | ||||||
|                 LOGGER.info("- plot world: {}", pa); |  | ||||||
|                 LOGGER.info("- plot area manager: {}", pa.getPlotManager()); |  | ||||||
|                 areaGen.getPlotGenerator().initialize(pa); |                 areaGen.getPlotGenerator().initialize(pa); | ||||||
|                 areaGen.augment(pa); |                 areaGen.augment(pa); | ||||||
|                 addPlotArea(pa); |                 addPlotArea(pa); | ||||||
| @@ -1570,6 +1580,13 @@ public class PlotSquared { | |||||||
|         return this.plotListener; |         return this.plotListener; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Get if the {@link PlatformReadyEvent} has been sent by WE. There is no way to query this within WE itself. | ||||||
|  |      */ | ||||||
|  |     public boolean isWeInitialised() { | ||||||
|  |         return weInitialised; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Different ways of sorting {@link Plot plots} |      * Different ways of sorting {@link Plot plots} | ||||||
|      */ |      */ | ||||||
| @@ -1592,4 +1609,15 @@ public class PlotSquared { | |||||||
|         DISTANCE_FROM_ORIGIN |         DISTANCE_FROM_ORIGIN | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private final class WEPlatformReadyListener { | ||||||
|  |  | ||||||
|  |         @SuppressWarnings("unused") | ||||||
|  |         @Subscribe(priority = EventHandler.Priority.VERY_EARLY) | ||||||
|  |         public void onPlatformReady(PlatformReadyEvent event) { | ||||||
|  |             weInitialised = true; | ||||||
|  |             WorldEdit.getInstance().getEventBus().unregister(WEPlatformReadyListener.this); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -161,6 +161,7 @@ public class Deny extends SubCommand { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void handleKick(PlotPlayer<?> player, Plot plot) { |     private void handleKick(PlotPlayer<?> player, Plot plot) { | ||||||
|  |         plot = plot.getBasePlot(false); | ||||||
|         if (player == null) { |         if (player == null) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ import com.plotsquared.core.configuration.caption.Caption; | |||||||
| import com.plotsquared.core.configuration.caption.CaptionHolder; | import com.plotsquared.core.configuration.caption.CaptionHolder; | ||||||
| import com.plotsquared.core.configuration.caption.Templates; | import com.plotsquared.core.configuration.caption.Templates; | ||||||
| import com.plotsquared.core.configuration.caption.TranslatableCaption; | import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||||
|  | import com.plotsquared.core.database.DBFunc; | ||||||
| import com.plotsquared.core.permissions.Permission; | import com.plotsquared.core.permissions.Permission; | ||||||
| import com.plotsquared.core.player.PlotPlayer; | import com.plotsquared.core.player.PlotPlayer; | ||||||
| import com.plotsquared.core.plot.Plot; | import com.plotsquared.core.plot.Plot; | ||||||
| @@ -39,6 +40,7 @@ import com.plotsquared.core.plot.PlotArea; | |||||||
| import com.plotsquared.core.plot.expiration.ExpireManager; | import com.plotsquared.core.plot.expiration.ExpireManager; | ||||||
| import com.plotsquared.core.plot.flag.implementations.DoneFlag; | import com.plotsquared.core.plot.flag.implementations.DoneFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.PriceFlag; | import com.plotsquared.core.plot.flag.implementations.PriceFlag; | ||||||
|  | import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag; | ||||||
| import com.plotsquared.core.plot.world.PlotAreaManager; | import com.plotsquared.core.plot.world.PlotAreaManager; | ||||||
| import com.plotsquared.core.util.EconHandler; | import com.plotsquared.core.util.EconHandler; | ||||||
| import com.plotsquared.core.util.MathMan; | import com.plotsquared.core.util.MathMan; | ||||||
| @@ -418,7 +420,7 @@ public class ListCmd extends SubCommand { | |||||||
|                 Caption color; |                 Caption color; | ||||||
|                 if (plot.getOwner() == null) { |                 if (plot.getOwner() == null) { | ||||||
|                     color = TranslatableCaption.of("info.plot_list_no_owner"); |                     color = TranslatableCaption.of("info.plot_list_no_owner"); | ||||||
|                 } else if (plot.isOwner(player.getUUID())) { |                 } else if (plot.isOwner(player.getUUID()) || plot.getOwner().equals(DBFunc.EVERYONE)) { | ||||||
|                     color = TranslatableCaption.of("info.plot_list_owned_by"); |                     color = TranslatableCaption.of("info.plot_list_owned_by"); | ||||||
|                 } else if (plot.isAdded(player.getUUID())) { |                 } else if (plot.isAdded(player.getUUID())) { | ||||||
|                     color = TranslatableCaption.of("info.plot_list_added_to"); |                     color = TranslatableCaption.of("info.plot_list_added_to"); | ||||||
| @@ -456,7 +458,17 @@ public class ListCmd extends SubCommand { | |||||||
|                 String prefix = ""; |                 String prefix = ""; | ||||||
|                 String online = TranslatableCaption.of("info.plot_list_player_online").getComponent(player); |                 String online = TranslatableCaption.of("info.plot_list_player_online").getComponent(player); | ||||||
|                 String offline = TranslatableCaption.of("info.plot_list_player_offline").getComponent(player); |                 String offline = TranslatableCaption.of("info.plot_list_player_offline").getComponent(player); | ||||||
|  |                 String unknown = TranslatableCaption.of("info.plot_list_player_unknown").getComponent(player); | ||||||
|  |                 String server = TranslatableCaption.of("info.plot_list_player_server").getComponent(player); | ||||||
|  |                 String everyone = TranslatableCaption.of("info.plot_list_player_everyone").getComponent(player); | ||||||
|                 TextComponent.Builder builder = Component.text(); |                 TextComponent.Builder builder = Component.text(); | ||||||
|  |                 if (plot.getFlag(ServerPlotFlag.class)) { | ||||||
|  |                     Template serverTemplate = Template.of( | ||||||
|  |                             "info.server", | ||||||
|  |                             TranslatableCaption.of("info.server").getComponent(player) | ||||||
|  |                     ); | ||||||
|  |                     builder.append(MINI_MESSAGE.parse(server, serverTemplate)); | ||||||
|  |                 } else { | ||||||
|                     try { |                     try { | ||||||
|                         final List<UUIDMapping> names = PlotSquared.get().getImpromptuUUIDPipeline().getNames(plot.getOwners()) |                         final List<UUIDMapping> names = PlotSquared.get().getImpromptuUUIDPipeline().getNames(plot.getOwners()) | ||||||
|                                 .get(Settings.UUID.BLOCKING_TIMEOUT, TimeUnit.MILLISECONDS); |                                 .get(Settings.UUID.BLOCKING_TIMEOUT, TimeUnit.MILLISECONDS); | ||||||
| @@ -466,6 +478,18 @@ public class ListCmd extends SubCommand { | |||||||
|                             Template playerTemplate = Template.of("player", uuidMapping.getUsername()); |                             Template playerTemplate = Template.of("player", uuidMapping.getUsername()); | ||||||
|                             if (pp != null) { |                             if (pp != null) { | ||||||
|                                 builder.append(MINI_MESSAGE.parse(online, prefixTemplate, playerTemplate)); |                                 builder.append(MINI_MESSAGE.parse(online, prefixTemplate, playerTemplate)); | ||||||
|  |                             } else if (uuidMapping.getUsername().equalsIgnoreCase("unknown")) { | ||||||
|  |                                 Template unknownTemplate = Template.of( | ||||||
|  |                                         "info.unknown", | ||||||
|  |                                         TranslatableCaption.of("info.unknown").getComponent(player) | ||||||
|  |                                 ); | ||||||
|  |                                 builder.append(MINI_MESSAGE.parse(unknown, unknownTemplate)); | ||||||
|  |                             } else if (uuidMapping.getUuid().equals(DBFunc.EVERYONE)) { | ||||||
|  |                                 Template everyoneTemplate = Template.of( | ||||||
|  |                                         "info.everyone", | ||||||
|  |                                         TranslatableCaption.of("info.everyone").getComponent(player) | ||||||
|  |                                 ); | ||||||
|  |                                 builder.append(MINI_MESSAGE.parse(everyone, everyoneTemplate)); | ||||||
|                             } else { |                             } else { | ||||||
|                                 builder.append(MINI_MESSAGE.parse(offline, prefixTemplate, playerTemplate)); |                                 builder.append(MINI_MESSAGE.parse(offline, prefixTemplate, playerTemplate)); | ||||||
|                             } |                             } | ||||||
| @@ -488,6 +512,7 @@ public class ListCmd extends SubCommand { | |||||||
|                     } catch (TimeoutException e) { |                     } catch (TimeoutException e) { | ||||||
|                         player.sendMessage(TranslatableCaption.of("players.fetching_players_timeout")); |                         player.sendMessage(TranslatableCaption.of("players.fetching_players_timeout")); | ||||||
|                     } |                     } | ||||||
|  |                 } | ||||||
|                 Template players = Template.of("players", builder.asComponent()); |                 Template players = Template.of("players", builder.asComponent()); | ||||||
|                 caption.set(TranslatableCaption.of("info.plot_list_item")); |                 caption.set(TranslatableCaption.of("info.plot_list_item")); | ||||||
|                 caption.setTemplates(command_tp, command_info, hover_info, numberTemplate, plotTemplate, players); |                 caption.setTemplates(command_tp, command_info, hover_info, numberTemplate, plotTemplate, players); | ||||||
|   | |||||||
| @@ -249,6 +249,9 @@ public class Settings extends Config { | |||||||
|         public static int UUID_CACHE_SIZE = 100000; |         public static int UUID_CACHE_SIZE = 100000; | ||||||
|         @Comment("Rate limit (per 10 minutes) for background UUID fetching from the Mojang API") |         @Comment("Rate limit (per 10 minutes) for background UUID fetching from the Mojang API") | ||||||
|         public static int BACKGROUND_LIMIT = 200; |         public static int BACKGROUND_LIMIT = 200; | ||||||
|  |         @Comment("Whether the Mojang API service is enabled for impromptu api calls. If false only the Background task will use" + | ||||||
|  |                 " http requests to fill the UUID cache (requires restart)") | ||||||
|  |         public static boolean IMPROMPTU_SERVICE_MOJANG_API = true; | ||||||
|         @Comment("Rate limit (per 10 minutes) for random UUID fetching from the Mojang API") |         @Comment("Rate limit (per 10 minutes) for random UUID fetching from the Mojang API") | ||||||
|         public static int IMPROMPTU_LIMIT = 300; |         public static int IMPROMPTU_LIMIT = 300; | ||||||
|         @Comment("Timeout (in milliseconds) for non-blocking UUID requests (mostly commands)") |         @Comment("Timeout (in milliseconds) for non-blocking UUID requests (mostly commands)") | ||||||
| @@ -691,6 +694,7 @@ public class Settings extends Config { | |||||||
|         @Comment({"If blocks at the edges of queued operations should be set causing updates", |         @Comment({"If blocks at the edges of queued operations should be set causing updates", | ||||||
|                 " - Slightly slower, but prevents issues such as fences left connected to nothing"}) |                 " - Slightly slower, but prevents issues such as fences left connected to nothing"}) | ||||||
|         public static boolean UPDATE_EDGES = true; |         public static boolean UPDATE_EDGES = true; | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Comment("Settings related to tab completion") |     @Comment("Settings related to tab completion") | ||||||
|   | |||||||
| @@ -54,12 +54,23 @@ public class AugmentedUtils { | |||||||
|         enabled = true; |         enabled = true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static boolean generate( |     /** | ||||||
|             @Nullable Object chunkObject, |      * Generate an augmented world chunk at the given location. If a queue is given, the data will be written to it, else a new | ||||||
|  |      * queue will be created and written to world. Returns true if generation occurred. | ||||||
|  |      * | ||||||
|  |      * @param world  World name to generate data for. Must be a PlotSquared world containing one or more areas else nothing will | ||||||
|  |      *               happen. | ||||||
|  |      * @param chunkX Chunk X position | ||||||
|  |      * @param chunkZ Chunk Z position | ||||||
|  |      * @param queue  Queue to write to, if desired. | ||||||
|  |      * @return true if generation occurred. | ||||||
|  |      * @since 6.8.0 | ||||||
|  |      */ | ||||||
|  |     public static boolean generateChunk( | ||||||
|             final @NonNull String world, |             final @NonNull String world, | ||||||
|             final int chunkX, |             final int chunkX, | ||||||
|             final int chunkZ, |             final int chunkZ, | ||||||
|             QueueCoordinator queue |             @Nullable QueueCoordinator queue | ||||||
|     ) { |     ) { | ||||||
|         if (!enabled) { |         if (!enabled) { | ||||||
|             return false; |             return false; | ||||||
| @@ -97,9 +108,6 @@ public class AugmentedUtils { | |||||||
|                         .platform() |                         .platform() | ||||||
|                         .worldUtil() |                         .worldUtil() | ||||||
|                         .getWeWorld(world)); |                         .getWeWorld(world)); | ||||||
|                 if (chunkObject != null) { |  | ||||||
|                     queue.setChunkObject(chunkObject); |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|             QueueCoordinator primaryMask; |             QueueCoordinator primaryMask; | ||||||
|             // coordinates |             // coordinates | ||||||
| @@ -157,13 +165,9 @@ public class AugmentedUtils { | |||||||
|                 } |                 } | ||||||
|                 generationResult = true; |                 generationResult = true; | ||||||
|             } |             } | ||||||
|             if (chunkObject != null) { |  | ||||||
|                 primaryMask.setChunkObject(chunkObject); |  | ||||||
|             } |  | ||||||
|             if (chunkObject != null) { |  | ||||||
|                 secondaryMask.setChunkObject(chunkObject); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|  |             // This queue should not be enqueued as it is simply used to restrict block setting, and then delegate to the | ||||||
|  |             // actual queue | ||||||
|             ScopedQueueCoordinator scoped = |             ScopedQueueCoordinator scoped = | ||||||
|                     new ScopedQueueCoordinator( |                     new ScopedQueueCoordinator( | ||||||
|                             secondaryMask, |                             secondaryMask, | ||||||
| @@ -172,8 +176,6 @@ public class AugmentedUtils { | |||||||
|                     ); |                     ); | ||||||
|             generator.generateChunk(scoped, area); |             generator.generateChunk(scoped, area); | ||||||
|             generator.populateChunk(scoped, area); |             generator.populateChunk(scoped, area); | ||||||
|             scoped.setForceSync(true); |  | ||||||
|             scoped.enqueue(); |  | ||||||
|         } |         } | ||||||
|         if (enqueue) { |         if (enqueue) { | ||||||
|             queue.enqueue(); |             queue.enqueue(); | ||||||
| @@ -181,4 +183,19 @@ public class AugmentedUtils { | |||||||
|         return generationResult; |         return generationResult; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * @deprecated Use {@link AugmentedUtils#generateChunk(String, int, int, QueueCoordinator)} as chunkObject is not required | ||||||
|  |      * in the above method | ||||||
|  |      */ | ||||||
|  |     @Deprecated(forRemoval = true, since = "6.8.0") | ||||||
|  |     public static boolean generate( | ||||||
|  |             @Nullable Object chunkObject, | ||||||
|  |             final @NonNull String world, | ||||||
|  |             final int chunkX, | ||||||
|  |             final int chunkZ, | ||||||
|  |             QueueCoordinator queue | ||||||
|  |     ) { | ||||||
|  |         return generateChunk(world, chunkX, chunkZ, queue); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -41,7 +41,7 @@ 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.AnalysisFlag; | import com.plotsquared.core.plot.flag.implementations.AnalysisFlag; | ||||||
| import com.plotsquared.core.plot.world.PlotAreaManager; | import com.plotsquared.core.plot.world.PlotAreaManager; | ||||||
| import com.plotsquared.core.queue.ChunkQueueCoordinator; | import com.plotsquared.core.queue.BlockArrayCacheScopedQueueCoordinator; | ||||||
| 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; | ||||||
| @@ -83,6 +83,7 @@ import java.util.concurrent.atomic.AtomicInteger; | |||||||
| public class HybridUtils { | public class HybridUtils { | ||||||
|  |  | ||||||
|     private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + HybridUtils.class.getSimpleName()); |     private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + HybridUtils.class.getSimpleName()); | ||||||
|  |     private static final BlockState AIR = BlockTypes.AIR.getDefaultState(); | ||||||
|  |  | ||||||
|     public static HybridUtils manager; |     public static HybridUtils manager; | ||||||
|     public static Set<BlockVector2> regions; |     public static Set<BlockVector2> regions; | ||||||
| @@ -136,6 +137,11 @@ public class HybridUtils { | |||||||
|          * |          * | ||||||
|          */ |          */ | ||||||
|         TaskManager.runTaskAsync(() -> { |         TaskManager.runTaskAsync(() -> { | ||||||
|  |             final PlotArea area = this.plotAreaManager.getPlotArea(world, null); | ||||||
|  |             if (!(area instanceof HybridPlotWorld hpw)) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             final BlockVector3 bot = region.getMinimumPoint(); |             final BlockVector3 bot = region.getMinimumPoint(); | ||||||
|             final BlockVector3 top = region.getMaximumPoint(); |             final BlockVector3 top = region.getMaximumPoint(); | ||||||
|  |  | ||||||
| @@ -152,37 +158,28 @@ public class HybridUtils { | |||||||
|             final int height = area.getMaxGenHeight() - area.getMinGenHeight() + 1; |             final int height = area.getMaxGenHeight() - area.getMinGenHeight() + 1; | ||||||
|             final int minHeight = area.getMinGenHeight(); |             final int minHeight = area.getMinGenHeight(); | ||||||
|  |  | ||||||
|             final PlotArea area = this.plotAreaManager.getPlotArea(world, null); |  | ||||||
|  |  | ||||||
|             if (!(area instanceof HybridPlotWorld hpw)) { |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             ChunkQueueCoordinator chunk = new ChunkQueueCoordinator(worldUtil.getWeWorld(world), bot, top, false); |  | ||||||
|             hpw.getGenerator().generateChunk(chunk, hpw); |  | ||||||
|  |  | ||||||
|             final BlockState airBlock = BlockTypes.AIR.getDefaultState(); |  | ||||||
|             final BlockState[][][] oldBlocks = chunk.getBlocks(); |  | ||||||
|             final BlockState[][][] newBlocks = new BlockState[height][width][length]; |             final BlockState[][][] newBlocks = new BlockState[height][width][length]; | ||||||
|             for (final BlockState[][] newBlock : newBlocks) { |  | ||||||
|                 for (final BlockState[] blockStates : newBlock) { |  | ||||||
|                     Arrays.fill(blockStates, airBlock); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             for (final BlockState[][] oldBlock : oldBlocks) { |  | ||||||
|                 for (final BlockState[] blockStates : oldBlock) { |  | ||||||
|                     Arrays.fill(blockStates, airBlock); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             System.gc(); |             BlockArrayCacheScopedQueueCoordinator oldBlockQueue = new BlockArrayCacheScopedQueueCoordinator( | ||||||
|             System.gc(); |                     Location.at("", region.getMinimumPoint().withY(hpw.getMinGenHeight())), | ||||||
|  |                     Location.at("", region.getMaximumPoint().withY(hpw.getMaxGenHeight())) | ||||||
|  |             ); | ||||||
|  |  | ||||||
|  |             region.getChunks().forEach(chunkPos -> { | ||||||
|  |                 int relChunkX = chunkPos.getX() - cbx; | ||||||
|  |                 int relChunkZ = chunkPos.getZ() - cbz; | ||||||
|  |                 oldBlockQueue.setOffsetX(relChunkX << 4); | ||||||
|  |                 oldBlockQueue.setOffsetZ(relChunkZ << 4); | ||||||
|  |                 hpw.getGenerator().generateChunk(oldBlockQueue, hpw); | ||||||
|  |             }); | ||||||
|  |  | ||||||
|  |             final BlockState[][][] oldBlocks = oldBlockQueue.getBlockStates(); | ||||||
|  |  | ||||||
|             QueueCoordinator queue = area.getQueue(); |             QueueCoordinator queue = area.getQueue(); | ||||||
|             queue.addReadChunks(region.getChunks()); |             queue.addReadChunks(region.getChunks()); | ||||||
|             queue.setChunkConsumer(blockVector2 -> { |             queue.setChunkConsumer(chunkPos -> { | ||||||
|                 int X = blockVector2.getX(); |                 int X = chunkPos.getX(); | ||||||
|                 int Z = blockVector2.getZ(); |                 int Z = chunkPos.getZ(); | ||||||
|                 int minX; |                 int minX; | ||||||
|                 if (X == cbx) { |                 if (X == cbx) { | ||||||
|                     minX = bx & 15; |                     minX = bx & 15; | ||||||
| @@ -220,6 +217,9 @@ public class HybridUtils { | |||||||
|                         for (int yIndex = 0; yIndex < height; yIndex++) { |                         for (int yIndex = 0; yIndex < height; yIndex++) { | ||||||
|                             int y = yIndex + minHeight; |                             int y = yIndex + minHeight; | ||||||
|                             BlockState block = queue.getBlock(xx, y, zz); |                             BlockState block = queue.getBlock(xx, y, zz); | ||||||
|  |                             if (block == null) { | ||||||
|  |                                 block = AIR; | ||||||
|  |                             } | ||||||
|                             int xr = xb + x; |                             int xr = xb + x; | ||||||
|                             int zr = zb + z; |                             int zr = zb + z; | ||||||
|                             newBlocks[yIndex][xr][zr] = block; |                             newBlocks[yIndex][xr][zr] = block; | ||||||
| @@ -240,10 +240,10 @@ public class HybridUtils { | |||||||
|                     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 yIndex = 0; yIndex < height; yIndex++) { |                         for (int yIndex = 0; yIndex < height; yIndex++) { | ||||||
|                             BlockState old = oldBlocks[yIndex][x][z]; |                             BlockState old = oldBlocks[yIndex][x][z]; // Nullable | ||||||
|                             try { |                             try { | ||||||
|                                 BlockState now = newBlocks[yIndex][x][z]; |                                 BlockState now = newBlocks[yIndex][x][z]; // Not null | ||||||
|                                 if (!old.equals(now)) { |                                 if (!now.equals(old) && !(old == null && now.getBlockType().equals(BlockTypes.AIR))) { | ||||||
|                                     changes[i]++; |                                     changes[i]++; | ||||||
|                                 } |                                 } | ||||||
|                                 if (now.getBlockType().getMaterial().isAir()) { |                                 if (now.getBlockType().getMaterial().isAir()) { | ||||||
| @@ -301,8 +301,6 @@ public class HybridUtils { | |||||||
|                 analysis.data_sd = (int) (MathMan.getSD(data, analysis.data) * 100); |                 analysis.data_sd = (int) (MathMan.getSD(data, analysis.data) * 100); | ||||||
|                 analysis.air_sd = (int) (MathMan.getSD(air, analysis.air) * 100); |                 analysis.air_sd = (int) (MathMan.getSD(air, analysis.air) * 100); | ||||||
|                 analysis.variety_sd = (int) (MathMan.getSD(variety, analysis.variety) * 100); |                 analysis.variety_sd = (int) (MathMan.getSD(variety, analysis.variety) * 100); | ||||||
|                 System.gc(); |  | ||||||
|                 System.gc(); |  | ||||||
|                 whenDone.value = analysis; |                 whenDone.value = analysis; | ||||||
|                 whenDone.run(); |                 whenDone.run(); | ||||||
|             }); |             }); | ||||||
|   | |||||||
| @@ -53,9 +53,15 @@ public abstract class IndependentPlotGenerator { | |||||||
|      * |      * | ||||||
|      * @param result   queue |      * @param result   queue | ||||||
|      * @param settings PlotArea (settings) |      * @param settings PlotArea (settings) | ||||||
|  |      * @deprecated {@link ScopedQueueCoordinator} will be renamed in v7. | ||||||
|      */ |      */ | ||||||
|  |     @Deprecated(forRemoval = true, since = "TODO") | ||||||
|     public abstract void generateChunk(ScopedQueueCoordinator result, PlotArea settings); |     public abstract void generateChunk(ScopedQueueCoordinator result, PlotArea settings); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * @deprecated {@link ScopedQueueCoordinator} will be renamed in v7. | ||||||
|  |      */ | ||||||
|  |     @Deprecated(forRemoval = true, since = "TODO") | ||||||
|     public boolean populateChunk(ScopedQueueCoordinator result, PlotArea setting) { |     public boolean populateChunk(ScopedQueueCoordinator result, PlotArea setting) { | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1420,15 +1420,7 @@ public class Plot { | |||||||
|                         0 |                         0 | ||||||
|                 ); |                 ); | ||||||
|             } |             } | ||||||
|             Location location = Location |             Location location = toHomeLocation(bottom, home); | ||||||
|                     .at( |  | ||||||
|                             bottom.getWorldName(), |  | ||||||
|                             bottom.getX() + home.getX(), |  | ||||||
|                             bottom.getY() + home.getY(), |  | ||||||
|                             bottom.getZ() + home.getZ(), |  | ||||||
|                             home.getYaw(), |  | ||||||
|                             home.getPitch() |  | ||||||
|                     ); |  | ||||||
|             if (!this.worldUtil.getBlockSynchronous(location).getBlockType().getMaterial().isAir()) { |             if (!this.worldUtil.getBlockSynchronous(location).getBlockType().getMaterial().isAir()) { | ||||||
|                 location = location.withY( |                 location = location.withY( | ||||||
|                         Math.max(1 + this.worldUtil.getHighestBlockSynchronous( |                         Math.max(1 + this.worldUtil.getHighestBlockSynchronous( | ||||||
| @@ -1461,15 +1453,7 @@ public class Plot { | |||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             Location bottom = this.getBottomAbs(); |             Location bottom = this.getBottomAbs(); | ||||||
|             Location location = Location |             Location location = toHomeLocation(bottom, home); | ||||||
|                     .at( |  | ||||||
|                             bottom.getWorldName(), |  | ||||||
|                             bottom.getX() + home.getX(), |  | ||||||
|                             home.getY(), // y is absolute |  | ||||||
|                             bottom.getZ() + home.getZ(), |  | ||||||
|                             home.getYaw(), |  | ||||||
|                             home.getPitch() |  | ||||||
|                     ); |  | ||||||
|             this.worldUtil.getBlock(location, block -> { |             this.worldUtil.getBlock(location, block -> { | ||||||
|                 if (!block.getBlockType().getMaterial().isAir()) { |                 if (!block.getBlockType().getMaterial().isAir()) { | ||||||
|                     this.worldUtil.getHighestBlock(this.getWorldName(), location.getX(), location.getZ(), |                     this.worldUtil.getHighestBlock(this.getWorldName(), location.getX(), location.getZ(), | ||||||
| @@ -1482,6 +1466,17 @@ public class Plot { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private Location toHomeLocation(Location bottom, BlockLoc relativeHome) { | ||||||
|  |         return Location.at( | ||||||
|  |                 bottom.getWorldName(), | ||||||
|  |                 bottom.getX() + relativeHome.getX(), | ||||||
|  |                 relativeHome.getY(), // y is absolute | ||||||
|  |                 bottom.getZ() + relativeHome.getZ(), | ||||||
|  |                 relativeHome.getYaw(), | ||||||
|  |                 relativeHome.getPitch() | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Sets the home location |      * Sets the home location | ||||||
|      * |      * | ||||||
|   | |||||||
| @@ -75,9 +75,9 @@ public class ExpiryTask { | |||||||
|                     plots = plots != null ? plots : getPlotsToCheck(); |                     plots = plots != null ? plots : getPlotsToCheck(); | ||||||
|                     int diff = settings.REQUIRED_PLOTS; |                     int diff = settings.REQUIRED_PLOTS; | ||||||
|                     boolean min = true; |                     boolean min = true; | ||||||
|                     if (settings.REQUIRED_PLOTS - plots.size() < settings.REQUIRED_PLOTS) { |                     if (plots.size() > settings.REQUIRED_PLOTS) { | ||||||
|                         min = false; |                         min = false; | ||||||
|                         diff = settings.REQUIRED_PLOTS - plots.size(); |                         diff = plots.size() - settings.REQUIRED_PLOTS; | ||||||
|                     } |                     } | ||||||
|                     List<Long> entireList = |                     List<Long> entireList = | ||||||
|                             plots.stream().map(plot -> ExpireManager.IMP.getAge(plot, settings.DELETE_IF_OWNER_IS_UNKNOWN)) |                             plots.stream().map(plot -> ExpireManager.IMP.getAge(plot, settings.DELETE_IF_OWNER_IS_UNKNOWN)) | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ import com.sk89q.worldedit.function.pattern.Pattern; | |||||||
| import com.sk89q.worldedit.math.BlockVector2; | import com.sk89q.worldedit.math.BlockVector2; | ||||||
| import com.sk89q.worldedit.regions.CuboidRegion; | import com.sk89q.worldedit.regions.CuboidRegion; | ||||||
| import com.sk89q.worldedit.util.Location; | import com.sk89q.worldedit.util.Location; | ||||||
|  | import com.sk89q.worldedit.util.SideEffectSet; | ||||||
| import com.sk89q.worldedit.world.World; | import com.sk89q.worldedit.world.World; | ||||||
| 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; | ||||||
| @@ -61,6 +62,7 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator { | |||||||
|     private int lastX = Integer.MIN_VALUE; |     private int lastX = Integer.MIN_VALUE; | ||||||
|     private int lastZ = Integer.MIN_VALUE; |     private int lastZ = Integer.MIN_VALUE; | ||||||
|     private boolean settingBiomes = false; |     private boolean settingBiomes = false; | ||||||
|  |     private boolean disableBiomes = false; | ||||||
|     private boolean settingTiles = false; |     private boolean settingTiles = false; | ||||||
|     private boolean regen = false; |     private boolean regen = false; | ||||||
|     private int[] regenStart; |     private int[] regenStart; | ||||||
| @@ -68,7 +70,8 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator { | |||||||
|     private CuboidRegion regenRegion = null; |     private CuboidRegion regenRegion = null; | ||||||
|     private Consumer<BlockVector2> consumer = null; |     private Consumer<BlockVector2> consumer = null; | ||||||
|     private boolean unloadAfter = true; |     private boolean unloadAfter = true; | ||||||
|     private Runnable whenDone; |     private Runnable whenDone = null; | ||||||
|  |     private SideEffectSet sideEffectSet = null; | ||||||
|     @Nullable |     @Nullable | ||||||
|     private LightingMode lightingMode = LightingMode.valueOf(Settings.QUEUE.LIGHTING_MODE); |     private LightingMode lightingMode = LightingMode.valueOf(Settings.QUEUE.LIGHTING_MODE); | ||||||
|  |  | ||||||
| @@ -120,6 +123,9 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator { | |||||||
|     @SuppressWarnings("removal") |     @SuppressWarnings("removal") | ||||||
|     @Override |     @Override | ||||||
|     public boolean setBiome(int x, int z, @NonNull BiomeType biomeType) { |     public boolean setBiome(int x, int z, @NonNull BiomeType biomeType) { | ||||||
|  |         if (disableBiomes) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|         LocalChunk chunk = getChunk(x >> 4, z >> 4); |         LocalChunk chunk = getChunk(x >> 4, z >> 4); | ||||||
|         for (int y = world.getMinY(); y <= world.getMaxY(); y++) { |         for (int y = world.getMinY(); y <= world.getMaxY(); y++) { | ||||||
|             chunk.setBiome(x & 15, y, z & 15, biomeType); |             chunk.setBiome(x & 15, y, z & 15, biomeType); | ||||||
| @@ -130,6 +136,9 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public final boolean setBiome(int x, int y, int z, @NonNull BiomeType biomeType) { |     public final boolean setBiome(int x, int y, int z, @NonNull BiomeType biomeType) { | ||||||
|  |         if (disableBiomes) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|         LocalChunk chunk = getChunk(x >> 4, z >> 4); |         LocalChunk chunk = getChunk(x >> 4, z >> 4); | ||||||
|         chunk.setBiome(x & 15, y, z & 15, biomeType); |         chunk.setBiome(x & 15, y, z & 15, biomeType); | ||||||
|         settingBiomes = true; |         settingBiomes = true; | ||||||
| @@ -141,6 +150,12 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator { | |||||||
|         return this.settingBiomes; |         return this.settingBiomes; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void setBiomesEnabled(boolean settingBiomes) { | ||||||
|  |         this.settingBiomes = settingBiomes; | ||||||
|  |         this.disableBiomes = true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public boolean setTile(int x, int y, int z, @NonNull CompoundTag tag) { |     public boolean setTile(int x, int y, int z, @NonNull CompoundTag tag) { | ||||||
|         LocalChunk chunk = getChunk(x >> 4, z >> 4); |         LocalChunk chunk = getChunk(x >> 4, z >> 4); | ||||||
| @@ -315,6 +330,29 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator { | |||||||
|         this.whenDone = whenDone; |         this.whenDone = whenDone; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public SideEffectSet getSideEffectSet() { | ||||||
|  |         return sideEffectSet; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void setSideEffectSet(SideEffectSet sideEffectSet) { | ||||||
|  |         this.sideEffectSet = sideEffectSet; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Don't ask about the @NonNull placement. That's how it needs to be else it errors. | ||||||
|  |     @Override | ||||||
|  |     public void setBiomeCuboid( | ||||||
|  |             final com.plotsquared.core.location.@NonNull Location pos1, | ||||||
|  |             final com.plotsquared.core.location.@NonNull Location pos2, | ||||||
|  |             @NonNull final BiomeType biome | ||||||
|  |     ) { | ||||||
|  |         if (disableBiomes) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         super.setBiomeCuboid(pos1, pos2, biome); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Get the {@link LocalChunk} from the queue at the given chunk coordinates. Returns a new instance if one doesn't exist |      * Get the {@link LocalChunk} from the queue at the given chunk coordinates. Returns a new instance if one doesn't exist | ||||||
|      */ |      */ | ||||||
|   | |||||||
| @@ -0,0 +1,175 @@ | |||||||
|  | /* | ||||||
|  |  *       _____  _       _    _____                                _ | ||||||
|  |  *      |  __ \| |     | |  / ____|                              | | | ||||||
|  |  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | | ||||||
|  |  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | | ||||||
|  |  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | | ||||||
|  |  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| | ||||||
|  |  *                                    | | | ||||||
|  |  *                                    |_| | ||||||
|  |  *            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.queue; | ||||||
|  |  | ||||||
|  | import com.plotsquared.core.location.Location; | ||||||
|  | import com.plotsquared.core.util.AnnotationHelper; | ||||||
|  | import com.sk89q.jnbt.CompoundTag; | ||||||
|  | import com.sk89q.worldedit.function.pattern.Pattern; | ||||||
|  | import com.sk89q.worldedit.math.BlockVector3; | ||||||
|  | import com.sk89q.worldedit.world.biome.BiomeType; | ||||||
|  | import com.sk89q.worldedit.world.block.BaseBlock; | ||||||
|  | import com.sk89q.worldedit.world.block.BlockState; | ||||||
|  | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  | import org.checkerframework.checker.nullness.qual.Nullable; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * {@link QueueCoordinator} that caches all blocks set to it in a given array of form BlockState[][][]. An offset can be | ||||||
|  |  * applied to blocks set to it, and the scope limited. This should have blocks set to it one chunk at a time, based on the | ||||||
|  |  * result of {@link BlockArrayCacheScopedQueueCoordinator#getMin()} and {@link BlockArrayCacheScopedQueueCoordinator#getMax()}. | ||||||
|  |  * The min and max points of this queue are offset according to the minimum point given in the constructor, and the offsets set | ||||||
|  |  * in {@link BlockArrayCacheScopedQueueCoordinator#setOffsetX(int)} and | ||||||
|  |  * {@link BlockArrayCacheScopedQueueCoordinator#setOffsetZ(int)} | ||||||
|  |  */ | ||||||
|  | @AnnotationHelper.ApiDescription(info = "Internal use only. Subject to change at any time and created for specific use cases.") | ||||||
|  | public class BlockArrayCacheScopedQueueCoordinator extends ScopedQueueCoordinator { | ||||||
|  |  | ||||||
|  |     private final BlockState[][][] blockStates; | ||||||
|  |     private final int height; | ||||||
|  |     private final int width; | ||||||
|  |     private final int length; | ||||||
|  |     private final int minY; | ||||||
|  |     private final int maxY; | ||||||
|  |     private final int scopeMinX; | ||||||
|  |     private final int scopeMinZ; | ||||||
|  |     private final int scopeMaxX; | ||||||
|  |     private final int scopeMaxZ; | ||||||
|  |     private int offsetX = 0; | ||||||
|  |     private int offsetZ = 0; | ||||||
|  |     /** | ||||||
|  |      * Construct a new instance | ||||||
|  |      * | ||||||
|  |      * @param min Inclusive location of the minimum point to limit the scope to. | ||||||
|  |      * @param max Inclusive location of the maximum point to limit the scope to. | ||||||
|  |      * @since 6.8.0 | ||||||
|  |      */ | ||||||
|  |     public BlockArrayCacheScopedQueueCoordinator(Location min, Location max) { | ||||||
|  |         super(null, min, max); | ||||||
|  |         this.width = max.getX() - min.getX() + 1; | ||||||
|  |         this.length = max.getZ() - min.getZ() + 1; | ||||||
|  |         this.minY = min.getY(); | ||||||
|  |         this.maxY = max.getY(); | ||||||
|  |         this.height = maxY - minY + 1; | ||||||
|  |  | ||||||
|  |         this.scopeMinX = min.getX() & 15; | ||||||
|  |         this.scopeMinZ = min.getZ() & 15; | ||||||
|  |         this.scopeMaxX = scopeMinX + width; | ||||||
|  |         this.scopeMaxZ = scopeMinZ + length; | ||||||
|  |         this.blockStates = new BlockState[height][width][length]; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public BlockState[][][] getBlockStates() { | ||||||
|  |         return blockStates; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public boolean setBlock(int x, final int y, int z, final @NonNull BlockState id) { | ||||||
|  |         x += offsetX; | ||||||
|  |         z += offsetZ; | ||||||
|  |         if (x >= scopeMinX && x < scopeMaxX && y >= minY && y <= maxY && z >= scopeMinZ && z < scopeMaxZ) { | ||||||
|  |             blockStates[y - minY][x - scopeMinX][z - scopeMinZ] = id; | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public boolean setBlock(final int x, final int y, final int z, @NonNull final Pattern pattern) { | ||||||
|  |         int rx = x + offsetX; | ||||||
|  |         int rz = z + offsetZ; | ||||||
|  |         if (rx >= scopeMinX && rx < scopeMaxX && y >= minY && y <= maxY && rz >= scopeMinZ && rz < scopeMaxZ) { | ||||||
|  |             BlockState state = pattern | ||||||
|  |                     .applyBlock(super.getMin().getBlockVector3().add(BlockVector3.at(x, y, z))) | ||||||
|  |                     .toImmutableState(); | ||||||
|  |             blockStates[y - minY][rx - scopeMinX][rz - scopeMinZ] = state; | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public @NonNull Location getMin() { | ||||||
|  |         return super.getMin().add(offsetX - scopeMinX, 0, offsetZ - scopeMinZ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public @NonNull Location getMax() { | ||||||
|  |         return getMin().add(15, 0, 15).withY(maxY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public boolean setBlock(int x, int y, int z, final @NonNull BaseBlock id) { | ||||||
|  |         x += offsetX; | ||||||
|  |         z += offsetZ; | ||||||
|  |         if (x >= scopeMinX && x < scopeMaxX && y >= minY && y <= maxY && z >= scopeMinZ && z < scopeMaxZ) { | ||||||
|  |             blockStates[y - minY][x][z] = id.toImmutableState(); | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public @Nullable BlockState getBlock(final int x, final int y, final int z) { | ||||||
|  |         if (x >= 0 && x < width && y >= minY && y <= maxY && z >= 0 && z < length) { | ||||||
|  |             return blockStates[y - minY][x][z]; | ||||||
|  |         } | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setOffsetX(final int offsetX) { | ||||||
|  |         this.offsetX = offsetX; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setOffsetZ(final int offsetZ) { | ||||||
|  |         this.offsetZ = offsetZ; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public int size() { | ||||||
|  |         return height * width * length; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public boolean setBiome(final int x, final int z, @NonNull final BiomeType biome) { | ||||||
|  |         //do nothing | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public boolean setBiome(final int x, final int y, final int z, @NonNull final BiomeType biome) { | ||||||
|  |         //do nothing | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void fillBiome(final BiomeType biome) { | ||||||
|  |         //do nothing | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public boolean setTile(final int x, final int y, final int z, @NonNull final CompoundTag tag) { | ||||||
|  |         //do nothing | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -36,8 +36,12 @@ import org.checkerframework.checker.nullness.qual.NonNull; | |||||||
| import org.checkerframework.checker.nullness.qual.Nullable; | import org.checkerframework.checker.nullness.qual.Nullable; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Queue that is limited to a single chunk |  * Queue that is limited to a single chunk. It does not allow a delegate queue and should be treated as a cache for changes to | ||||||
|  |  * be set to. Does not support tile entities or entities. | ||||||
|  |  * | ||||||
|  |  * @deprecated This class is poorly designed and will no longer be used in P2 | ||||||
|  */ |  */ | ||||||
|  | @Deprecated(forRemoval = true, since = "6.8.0") | ||||||
| public class ChunkQueueCoordinator extends ScopedQueueCoordinator { | public class ChunkQueueCoordinator extends ScopedQueueCoordinator { | ||||||
|  |  | ||||||
|     public final BiomeType[][][] biomeResult; |     public final BiomeType[][][] biomeResult; | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ import com.sk89q.worldedit.entity.Entity; | |||||||
| import com.sk89q.worldedit.function.pattern.Pattern; | import com.sk89q.worldedit.function.pattern.Pattern; | ||||||
| import com.sk89q.worldedit.math.BlockVector2; | import com.sk89q.worldedit.math.BlockVector2; | ||||||
| import com.sk89q.worldedit.regions.CuboidRegion; | import com.sk89q.worldedit.regions.CuboidRegion; | ||||||
|  | import com.sk89q.worldedit.util.SideEffectSet; | ||||||
| import com.sk89q.worldedit.world.World; | import com.sk89q.worldedit.world.World; | ||||||
| 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; | ||||||
| @@ -135,6 +136,13 @@ public class DelegateQueueCoordinator extends QueueCoordinator { | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void setBiomesEnabled(final boolean enabled) { | ||||||
|  |         if (parent != null) { | ||||||
|  |             parent.setBiomesEnabled(enabled); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public boolean setEntity(@NonNull Entity entity) { |     public boolean setEntity(@NonNull Entity entity) { | ||||||
|         if (parent != null) { |         if (parent != null) { | ||||||
| @@ -248,6 +256,21 @@ public class DelegateQueueCoordinator extends QueueCoordinator { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public SideEffectSet getSideEffectSet() { | ||||||
|  |         if (parent != null) { | ||||||
|  |             return parent.getSideEffectSet(); | ||||||
|  |         } | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void setSideEffectSet(final SideEffectSet sideEffectSet) { | ||||||
|  |         if (parent != null) { | ||||||
|  |             parent.setSideEffectSet(sideEffectSet); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public @NonNull List<BlockVector2> getReadChunks() { |     public @NonNull List<BlockVector2> getReadChunks() { | ||||||
|         if (parent != null) { |         if (parent != null) { | ||||||
|   | |||||||
| @@ -35,6 +35,7 @@ import com.sk89q.worldedit.entity.Entity; | |||||||
| import com.sk89q.worldedit.function.pattern.Pattern; | import com.sk89q.worldedit.function.pattern.Pattern; | ||||||
| import com.sk89q.worldedit.math.BlockVector2; | import com.sk89q.worldedit.math.BlockVector2; | ||||||
| import com.sk89q.worldedit.regions.CuboidRegion; | import com.sk89q.worldedit.regions.CuboidRegion; | ||||||
|  | import com.sk89q.worldedit.util.SideEffectSet; | ||||||
| import com.sk89q.worldedit.world.World; | import com.sk89q.worldedit.world.World; | ||||||
| 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; | ||||||
| @@ -92,7 +93,9 @@ public abstract class QueueCoordinator { | |||||||
|      * @param z chunk z coordinate |      * @param z chunk z coordinate | ||||||
|      * @return a new {@link ScopedQueueCoordinator} |      * @return a new {@link ScopedQueueCoordinator} | ||||||
|      * @since 6.6.0 |      * @since 6.6.0 | ||||||
|  |      * @deprecated {@link ScopedQueueCoordinator} will be renamed in v7. | ||||||
|      */ |      */ | ||||||
|  |     @Deprecated(forRemoval = true, since = "TODO") | ||||||
|     public ScopedQueueCoordinator getForChunk(int x, int z, int minY, int maxY) { |     public ScopedQueueCoordinator getForChunk(int x, int z, int minY, int maxY) { | ||||||
|         int bx = x << 4; |         int bx = x << 4; | ||||||
|         int bz = z << 4; |         int bz = z << 4; | ||||||
| @@ -143,7 +146,8 @@ public abstract class QueueCoordinator { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Set a chunk object (e.g. the Bukkit Chunk object) to the queue |      * Set a chunk object (e.g. the Bukkit Chunk object) to the queue. This will be used as fallback in case of WNA failure. | ||||||
|  |      * Should ONLY be used in specific cases (i.e. generation, where a chunk is being populated) | ||||||
|      * |      * | ||||||
|      * @param chunkObject chunk object. Usually the implementation-specific chunk (e.g. bukkit Chunk) |      * @param chunkObject chunk object. Usually the implementation-specific chunk (e.g. bukkit Chunk) | ||||||
|      */ |      */ | ||||||
| @@ -247,6 +251,14 @@ public abstract class QueueCoordinator { | |||||||
|      */ |      */ | ||||||
|     public abstract boolean isSettingBiomes(); |     public abstract boolean isSettingBiomes(); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * If the queue should accept biome placement | ||||||
|  |      * | ||||||
|  |      * @param enabled If biomes should be enabled | ||||||
|  |      * @since 6.8.0 | ||||||
|  |      */ | ||||||
|  |     public abstract void setBiomesEnabled(boolean enabled); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Add entities to be created |      * Add entities to be created | ||||||
|      * |      * | ||||||
| @@ -412,6 +424,20 @@ public abstract class QueueCoordinator { | |||||||
|      */ |      */ | ||||||
|     public abstract void setLightingMode(@Nullable LightingMode mode); |     public abstract void setLightingMode(@Nullable LightingMode mode); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Get the overriding {@link SideEffectSet} to be used by the queue if it exists, else null | ||||||
|  |      * | ||||||
|  |      * @return Overriding {@link SideEffectSet} or null | ||||||
|  |      */ | ||||||
|  |     public abstract @Nullable SideEffectSet getSideEffectSet(); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Set the overriding {@link SideEffectSet} to be used by the queue. Null to use default side effects. | ||||||
|  |      * | ||||||
|  |      * @param sideEffectSet side effects to override with, or null to use default | ||||||
|  |      */ | ||||||
|  |     public abstract void setSideEffectSet(@Nullable SideEffectSet sideEffectSet); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Fill a cuboid between two positions with a BlockState |      * Fill a cuboid between two positions with a BlockState | ||||||
|      * |      * | ||||||
|   | |||||||
| @@ -35,22 +35,23 @@ import org.checkerframework.checker.nullness.qual.NonNull; | |||||||
| import org.checkerframework.checker.nullness.qual.Nullable; | import org.checkerframework.checker.nullness.qual.Nullable; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Queue that only sets blocks with a designated area |  * Queue that only sets blocks with a designated X-Z area, will accept any Y values. Requires all blocks be set normalized in | ||||||
|  |  * the x and z directions, i.e. starting from 0,0. An offset of the minimum point of the region will then be applied to x and z. | ||||||
|  |  * | ||||||
|  |  * @deprecated This should be renamed to NormalizedScopedQueueCoordinator or something. | ||||||
|  */ |  */ | ||||||
|  | @Deprecated(forRemoval = true, since = "6.8.0") | ||||||
| public class ScopedQueueCoordinator extends DelegateQueueCoordinator { | public class ScopedQueueCoordinator extends DelegateQueueCoordinator { | ||||||
|  |  | ||||||
|     private final Location min; |     private final Location min; | ||||||
|     private final Location max; |     private final Location max; | ||||||
|     private final int minX; |     private final int minX; | ||||||
|     private final int minY; |  | ||||||
|     private final int minZ; |     private final int minZ; | ||||||
|  |  | ||||||
|     private final int maxX; |     private final int maxX; | ||||||
|     private final int maxY; |  | ||||||
|     private final int maxZ; |     private final int maxZ; | ||||||
|  |  | ||||||
|     private final int dx; |     private final int dx; | ||||||
|     private final int dy; |  | ||||||
|     private final int dz; |     private final int dz; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -61,15 +62,12 @@ public class ScopedQueueCoordinator extends DelegateQueueCoordinator { | |||||||
|         this.min = min; |         this.min = min; | ||||||
|         this.max = max; |         this.max = max; | ||||||
|         this.minX = min.getX(); |         this.minX = min.getX(); | ||||||
|         this.minY = min.getY(); |  | ||||||
|         this.minZ = min.getZ(); |         this.minZ = min.getZ(); | ||||||
|  |  | ||||||
|         this.maxX = max.getX(); |         this.maxX = max.getX(); | ||||||
|         this.maxY = max.getY(); |  | ||||||
|         this.maxZ = max.getZ(); |         this.maxZ = max.getZ(); | ||||||
|  |  | ||||||
|         this.dx = maxX - minX; |         this.dx = maxX - minX; | ||||||
|         this.dy = maxY - minY; |  | ||||||
|         this.dz = maxZ - minZ; |         this.dz = maxZ - minZ; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -80,11 +78,11 @@ public class ScopedQueueCoordinator extends DelegateQueueCoordinator { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public boolean setBiome(int x, int y, int z, @NonNull BiomeType biome) { |     public boolean setBiome(int x, int y, int z, @NonNull BiomeType biome) { | ||||||
|         return x >= 0 && x <= dx && y >= 0 && y <= dy && z >= 0 && z <= dz && super.setBiome(x + minX, y + minY, z + minZ, biome); |         return x >= 0 && x <= dx && z >= 0 && z <= dz && super.setBiome(x + minX, y, z + minZ, biome); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void fillBiome(BiomeType biome) { |     public void fillBiome(BiomeType biome) { | ||||||
|         for (int y = 0; y <= dy; y++) { |         for (int y = min.getY(); y <= max.getY(); y++) { | ||||||
|             for (int x = 0; x <= dx; x++) { |             for (int x = 0; x <= dx; x++) { | ||||||
|                 for (int z = 0; z < dz; z++) { |                 for (int z = 0; z < dz; z++) { | ||||||
|                     setBiome(x, y, z, biome); |                     setBiome(x, y, z, biome); | ||||||
| @@ -95,27 +93,22 @@ public class ScopedQueueCoordinator extends DelegateQueueCoordinator { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public boolean setBlock(int x, int y, int z, @NonNull BaseBlock id) { |     public boolean setBlock(int x, int y, int z, @NonNull BaseBlock id) { | ||||||
|         return x >= 0 && x <= dx && y >= 0 && y <= dy && z >= 0 && z <= dz && super.setBlock(x + minX, y + minY, z + minZ, id); |         return x >= 0 && x <= dx && z >= 0 && z <= dz && super.setBlock(x + minX, y, z + minZ, id); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public boolean setBlock(int x, int y, int z, @NonNull BlockState id) { |     public boolean setBlock(int x, int y, int z, @NonNull BlockState id) { | ||||||
|         return x >= 0 && x <= dx && y >= 0 && y <= dy && z >= 0 && z <= dz && super.setBlock(x + minX, y + minY, z + minZ, id); |         return x >= 0 && x <= dx && z >= 0 && z <= dz && super.setBlock(x + minX, y, z + minZ, id); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public boolean setBlock(int x, int y, int z, @NonNull Pattern pattern) { |     public boolean setBlock(int x, int y, int z, @NonNull Pattern pattern) { | ||||||
|         return x >= 0 && x <= dx && y >= 0 && y <= dy && z >= 0 && z <= dz && super.setBlock( |         return x >= 0 && x <= dx && z >= 0 && z <= dz && super.setBlock(x + minX, y, z + minZ, pattern); | ||||||
|                 x + minX, |  | ||||||
|                 y + minY, |  | ||||||
|                 z + minZ, |  | ||||||
|                 pattern |  | ||||||
|         ); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public boolean setTile(int x, int y, int z, @NonNull CompoundTag tag) { |     public boolean setTile(int x, int y, int z, @NonNull CompoundTag tag) { | ||||||
|         return x >= 0 && x <= dx && y >= 0 && y <= dy && z >= 0 && z <= dz && super.setTile(x + minX, y + minY, z + minZ, tag); |         return x >= 0 && x <= dx && z >= 0 && z <= dz && super.setTile(x + minX, y, z + minZ, tag); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public @NonNull Location getMin() { |     public @NonNull Location getMin() { | ||||||
|   | |||||||
| @@ -42,6 +42,10 @@ public abstract class ChunkManager { | |||||||
|     private static final Map<BlockVector2, RunnableVal<ScopedQueueCoordinator>> forceChunks = new ConcurrentHashMap<>(); |     private static final Map<BlockVector2, RunnableVal<ScopedQueueCoordinator>> forceChunks = new ConcurrentHashMap<>(); | ||||||
|     private static final Map<BlockVector2, RunnableVal<ScopedQueueCoordinator>> addChunks = new ConcurrentHashMap<>(); |     private static final Map<BlockVector2, RunnableVal<ScopedQueueCoordinator>> addChunks = new ConcurrentHashMap<>(); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * @deprecated {@link ScopedQueueCoordinator} will be renamed in v7. | ||||||
|  |      */ | ||||||
|  |     @Deprecated(forRemoval = true, since = "TODO") | ||||||
|     public static void setChunkInPlotArea( |     public static void setChunkInPlotArea( | ||||||
|             RunnableVal<ScopedQueueCoordinator> force, |             RunnableVal<ScopedQueueCoordinator> force, | ||||||
|             RunnableVal<ScopedQueueCoordinator> add, |             RunnableVal<ScopedQueueCoordinator> add, | ||||||
| @@ -79,6 +83,10 @@ public abstract class ChunkManager { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * @deprecated {@link ScopedQueueCoordinator} will be renamed in v7. | ||||||
|  |      */ | ||||||
|  |     @Deprecated(forRemoval = true, since = "TODO") | ||||||
|     public static boolean preProcessChunk(BlockVector2 loc, ScopedQueueCoordinator queue) { |     public static boolean preProcessChunk(BlockVector2 loc, ScopedQueueCoordinator queue) { | ||||||
|         final RunnableVal<ScopedQueueCoordinator> forceChunk = forceChunks.get(loc); |         final RunnableVal<ScopedQueueCoordinator> forceChunk = forceChunks.get(loc); | ||||||
|         if (forceChunk != null) { |         if (forceChunk != null) { | ||||||
| @@ -89,6 +97,10 @@ public abstract class ChunkManager { | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * @deprecated {@link ScopedQueueCoordinator} will be renamed in v7. | ||||||
|  |      */ | ||||||
|  |     @Deprecated(forRemoval = true, since = "TODO") | ||||||
|     public static boolean postProcessChunk(BlockVector2 loc, ScopedQueueCoordinator queue) { |     public static boolean postProcessChunk(BlockVector2 loc, ScopedQueueCoordinator queue) { | ||||||
|         final RunnableVal<ScopedQueueCoordinator> addChunk = forceChunks.get(loc); |         final RunnableVal<ScopedQueueCoordinator> addChunk = forceChunks.get(loc); | ||||||
|         if (addChunk != null) { |         if (addChunk != null) { | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ import java.util.HashMap; | |||||||
| public abstract class SetupUtils { | public abstract class SetupUtils { | ||||||
|  |  | ||||||
|     public static HashMap<String, GeneratorWrapper<?>> generators = new HashMap<>(); |     public static HashMap<String, GeneratorWrapper<?>> generators = new HashMap<>(); | ||||||
|  |     protected boolean loaded = false; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * @since 6.1.0 |      * @since 6.1.0 | ||||||
|   | |||||||
| @@ -38,6 +38,7 @@ import com.plotsquared.core.player.PlotPlayer; | |||||||
| import com.plotsquared.core.plot.Plot; | import com.plotsquared.core.plot.Plot; | ||||||
| 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.ServerPlotFlag; | ||||||
| import com.plotsquared.core.util.EventDispatcher; | import com.plotsquared.core.util.EventDispatcher; | ||||||
| import com.plotsquared.core.util.PlayerManager; | import com.plotsquared.core.util.PlayerManager; | ||||||
| import net.kyori.adventure.text.Component; | import net.kyori.adventure.text.Component; | ||||||
| @@ -110,6 +111,9 @@ public final class PlaceholderRegistry { | |||||||
|             return plot.getAlias(); |             return plot.getAlias(); | ||||||
|         }); |         }); | ||||||
|         this.createPlaceholder("currentplot_owner", (player, plot) -> { |         this.createPlaceholder("currentplot_owner", (player, plot) -> { | ||||||
|  |             if (plot.getFlag(ServerPlotFlag.class)){ | ||||||
|  |                 return legacyComponent(TranslatableCaption.of("info.server"), player); | ||||||
|  |             } | ||||||
|             final UUID plotOwner = plot.getOwnerAbs(); |             final UUID plotOwner = plot.getOwnerAbs(); | ||||||
|             if (plotOwner == null) { |             if (plotOwner == null) { | ||||||
|                 return legacyComponent(TranslatableCaption.of("generic.generic_unowned"), player); |                 return legacyComponent(TranslatableCaption.of("generic.generic_unowned"), player); | ||||||
|   | |||||||
| @@ -381,6 +381,9 @@ | |||||||
|   "info.plot_list_default": "<gold><plot></gold>", |   "info.plot_list_default": "<gold><plot></gold>", | ||||||
|   "info.plot_list_player_online": "<dark_aqua><prefix></dark_aqua><hover:show_text:\"<dark_aqua>Online</dark_aqua>\"><gold><player></gold></hover>", |   "info.plot_list_player_online": "<dark_aqua><prefix></dark_aqua><hover:show_text:\"<dark_aqua>Online</dark_aqua>\"><gold><player></gold></hover>", | ||||||
|   "info.plot_list_player_offline": "<dark_aqua><prefix></dark_aqua><hover:show_text:\"<dark_gray>Offline</dark_gray>\"><gold><player></gold></hover>", |   "info.plot_list_player_offline": "<dark_aqua><prefix></dark_aqua><hover:show_text:\"<dark_gray>Offline</dark_gray>\"><gold><player></gold></hover>", | ||||||
|  |   "info.plot_list_player_unknown": "<hover:show_text:\"<red>The owner of this plot is unknown</red>\"><white><info.unknown></white></hover>", | ||||||
|  |   "info.plot_list_player_server": "<hover:show_text:\"<red>The plot is owned by the server</red>\"><white><info.server></white></hover>", | ||||||
|  |   "info.plot_list_player_everyone": "<hover:show_text:\"<blue>The plot is owned by everyone</blue>\"><white><info.everyone></white></hover>", | ||||||
|   "info.area_info_format": "<header>\n<reset><gold>Name: </gold><gray><name></gray>\n<gold>Type: </gold><gray><type></gray>\n<gold>Terrain: </gold><gray><terrain></gray>\n<gold>Usage: </gold><gray><usage>%</gray>\n<gold>Claimed: </gold><gray><claimed></gray>\n<gold>Clusters: </gold><gray><clusters></gray>\n<gold>Region: </gold><gray><region></gray>\n<gold>Generator: </gold><gray><generator></gray>\n<footer>", |   "info.area_info_format": "<header>\n<reset><gold>Name: </gold><gray><name></gray>\n<gold>Type: </gold><gray><type></gray>\n<gold>Terrain: </gold><gray><terrain></gray>\n<gold>Usage: </gold><gray><usage>%</gray>\n<gold>Claimed: </gold><gray><claimed></gray>\n<gold>Clusters: </gold><gray><clusters></gray>\n<gold>Region: </gold><gray><region></gray>\n<gold>Generator: </gold><gray><generator></gray>\n<footer>", | ||||||
|   "info.area_list_tooltip": "<gold>Claimed=</gold><gray><claimed></gray>\n<gold>Usage=</gold><gray><usage></gray>\n<gold>Clusters=</gold><gray><clusters></gray>\n<gold>Region=</gold><gray><region></gray>\n<gold>Generator=</gold><gray><generator></gray>", |   "info.area_list_tooltip": "<gold>Claimed=</gold><gray><claimed></gray>\n<gold>Usage=</gold><gray><usage></gray>\n<gold>Clusters=</gold><gray><clusters></gray>\n<gold>Region=</gold><gray><region></gray>\n<gold>Generator=</gold><gray><generator></gray>", | ||||||
|   "info.area_list_item": "<click:run_command:<command_tp>><hover:show_text:\"<command_tp>\"><dark_gray>[</dark_gray><gold><number></gold><dark_gray>]</dark_gray></hover></click> <click:run_command:<command_info>><hover:show_text:\"<hover_info>\"><gold><area_name></gold></hover></click><gray> - </gray><gray><area_type>:<area_terrain></gray>", |   "info.area_list_item": "<click:run_command:<command_tp>><hover:show_text:\"<command_tp>\"><dark_gray>[</dark_gray><gold><number></gold><dark_gray>]</dark_gray></hover></click> <click:run_command:<command_info>><hover:show_text:\"<hover_info>\"><gold><area_name></gold></hover></click><gray> - </gray><gray><area_type>:<area_terrain></gray>", | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| <p align="center"> | <p align="center"> | ||||||
|     <img src="https://i.imgur.com/33Y65YL.png" width="150"> |     <img src="https://raw.githubusercontent.com/IntellectualSites/Assets/main/plugins/PlotSquared/PlotSquared.svg" width="300"> | ||||||
| </p> | </p> | ||||||
|  |  | ||||||
| --- | --- | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ plugins { | |||||||
|     idea |     idea | ||||||
| } | } | ||||||
|  |  | ||||||
| version = "6.7.1-SNAPSHOT" | version = "6.8.2-SNAPSHOT" | ||||||
|  |  | ||||||
| allprojects { | allprojects { | ||||||
|     group = "com.plotsquared" |     group = "com.plotsquared" | ||||||
| @@ -34,7 +34,7 @@ allprojects { | |||||||
|  |  | ||||||
|         maven { |         maven { | ||||||
|             name = "Sonatype OSS (S01)" |             name = "Sonatype OSS (S01)" | ||||||
|             url = uri("https://s01.oss.sonatype.org/content/repositories/snapshots") |             url = uri("https://s01.oss.sonatype.org/content/repositories/snapshots/") | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         maven { |         maven { | ||||||
| @@ -64,9 +64,12 @@ subprojects { | |||||||
|         plugin<EclipsePlugin>() |         plugin<EclipsePlugin>() | ||||||
|         plugin<IdeaPlugin>() |         plugin<IdeaPlugin>() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     dependencies { | ||||||
|  |         implementation(platform("com.intellectualsites.bom:bom-1.18.x:1.2")) | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| val javadocDir = rootDir.resolve("docs").resolve("javadoc").resolve(project.name) |  | ||||||
| allprojects { | allprojects { | ||||||
|     dependencies { |     dependencies { | ||||||
|         // Tests |         // Tests | ||||||
| @@ -140,7 +143,7 @@ allprojects { | |||||||
|                         } |                         } | ||||||
|                         developer { |                         developer { | ||||||
|                             id.set("NotMyFault") |                             id.set("NotMyFault") | ||||||
|                             name.set("NotMyFault") |                             name.set("Alexander Brandes") | ||||||
|                             organization.set("IntellectualSites") |                             organization.set("IntellectualSites") | ||||||
|                             email.set("contact@notmyfault.dev") |                             email.set("contact@notmyfault.dev") | ||||||
|                         } |                         } | ||||||
| @@ -172,11 +175,6 @@ allprojects { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     tasks { |     tasks { | ||||||
|         named<Delete>("clean") { |  | ||||||
|             doFirst { |  | ||||||
|                 javadocDir.deleteRecursively() |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         compileJava { |         compileJava { | ||||||
|             options.compilerArgs.addAll(arrayOf("-Xmaxerrs", "1000")) |             options.compilerArgs.addAll(arrayOf("-Xmaxerrs", "1000")) | ||||||
| @@ -187,16 +185,6 @@ allprojects { | |||||||
|             options.encoding = "UTF-8" |             options.encoding = "UTF-8" | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         javadoc { |  | ||||||
|             val opt = options as StandardJavadocDocletOptions |  | ||||||
|             opt.addStringOption("Xdoclint:none", "-quiet") |  | ||||||
|             opt.tags( |  | ||||||
|                     "apiNote:a:API Note:", |  | ||||||
|                     "implSpec:a:Implementation Requirements:", |  | ||||||
|                     "implNote:a:Implementation Note:" |  | ||||||
|             ) |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         shadowJar { |         shadowJar { | ||||||
|             this.archiveClassifier.set(null as String?) |             this.archiveClassifier.set(null as String?) | ||||||
|             this.archiveFileName.set("${project.name}-${project.version}.${this.archiveExtension.getOrElse("jar")}") |             this.archiveFileName.set("${project.name}-${project.version}.${this.archiveExtension.getOrElse("jar")}") | ||||||
| @@ -221,37 +209,3 @@ nexusPublishing { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| tasks { |  | ||||||
|     val aggregatedJavadocs = create<Javadoc>("aggregatedJavadocs") { |  | ||||||
|         title = "${project.name} ${project.version} API" |  | ||||||
|         setDestinationDir(javadocDir) |  | ||||||
|         options.destinationDirectory = javadocDir |  | ||||||
|  |  | ||||||
|         doFirst { |  | ||||||
|             javadocDir.deleteRecursively() |  | ||||||
|         } |  | ||||||
|     }.also { |  | ||||||
|         it.group = "Documentation" |  | ||||||
|         it.description = "Generate javadocs from all child projects as if it was a single project" |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     subprojects.forEach { subProject -> |  | ||||||
|         subProject.afterEvaluate { |  | ||||||
|             subProject.tasks.withType<Javadoc>().forEach { task -> |  | ||||||
|                 aggregatedJavadocs.source += task.source |  | ||||||
|                 aggregatedJavadocs.classpath += task.classpath |  | ||||||
|                 aggregatedJavadocs.excludes += task.excludes |  | ||||||
|                 aggregatedJavadocs.includes += task.includes |  | ||||||
|  |  | ||||||
|                 val rootOptions = aggregatedJavadocs.options as StandardJavadocDocletOptions |  | ||||||
|                 val subOptions = task.options as StandardJavadocDocletOptions |  | ||||||
|                 rootOptions.links(*subOptions.links.orEmpty().minus(rootOptions.links.orEmpty().toSet()).toTypedArray()) |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     build { |  | ||||||
|         dependsOn(aggregatedJavadocs) |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -1,25 +1,17 @@ | |||||||
| [versions] | [versions] | ||||||
| # Minecraft expectations |  | ||||||
| gson = "2.8.8" # Version set by Minecraft |  | ||||||
| log4j-api = "2.17.1" # Version set by Minecraft |  | ||||||
| guava = "31.0.1-jre" # Version set by Minecraft |  | ||||||
|  |  | ||||||
| # Platform expectations | # Platform expectations | ||||||
| paper = "1.18.1-R0.1-SNAPSHOT" | paper = "1.18.1-R0.1-SNAPSHOT" | ||||||
| checker-qual = "3.22.0" | checker-qual = "3.22.0" | ||||||
| guice = "5.1.0" | guice = "5.1.0" | ||||||
| spotbugs = "4.6.0" | spotbugs = "4.7.0" | ||||||
| snakeyaml = "1.30" # Version set by Bukkit |  | ||||||
|  |  | ||||||
| # Adventure & MiniMessage | # Adventure & MiniMessage | ||||||
| adventure-api = "4.10.1" | adventure-api = "4.9.3" | ||||||
| adventure-text-minimessage = "4.10.1" | adventure-text-minimessage = "4.1.0-SNAPSHOT" | ||||||
| adventure-platform-bukkit = "4.1.0" | adventure-platform-bukkit = "4.0.1" | ||||||
|  |  | ||||||
| # Plugins | # Plugins | ||||||
| worldedit = "7.2.10" | worldedit = "7.2.10" | ||||||
| fawe = "2.1.2" |  | ||||||
| vault = "1.7.1" |  | ||||||
| placeholderapi = "2.11.1" | placeholderapi = "2.11.1" | ||||||
| luckperms = "5.4" | luckperms = "5.4" | ||||||
| essentialsx = "2.19.4" | essentialsx = "2.19.4" | ||||||
| @@ -30,11 +22,7 @@ prtree = "2.0.0" | |||||||
| aopalliance = "1.0" | aopalliance = "1.0" | ||||||
| cloud-services = "1.6.2" | cloud-services = "1.6.2" | ||||||
| arkitektonika = "2.1.1" | arkitektonika = "2.1.1" | ||||||
| paster = "1.1.4" |  | ||||||
| bstats = "3.0.0" |  | ||||||
| paperlib = "1.0.7" |  | ||||||
| squirrelid = "0.3.1" | squirrelid = "0.3.1" | ||||||
| serverlib = "2.3.1" |  | ||||||
| http4j = "1.3" | http4j = "1.3" | ||||||
|  |  | ||||||
| # Gradle plugins | # Gradle plugins | ||||||
| @@ -48,12 +36,7 @@ nexus = "1.1.0" | |||||||
| paper = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper" } | paper = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper" } | ||||||
| checkerqual = { group = "org.checkerframework", name = "checker-qual", version.ref = "checker-qual" } | checkerqual = { group = "org.checkerframework", name = "checker-qual", version.ref = "checker-qual" } | ||||||
|  |  | ||||||
| # Minecraft expectations |  | ||||||
| gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" } |  | ||||||
| log4j = { group = "org.apache.logging.log4j", name = "log4j-api", version.ref = "log4j-api" } |  | ||||||
|  |  | ||||||
| # Platform expectations | # Platform expectations | ||||||
| snakeyaml = { group = "org.yaml", name = "snakeyaml", version.ref = "snakeyaml" } |  | ||||||
| guice = { group = "com.google.inject", name = "guice", version.ref = "guice" } | guice = { group = "com.google.inject", name = "guice", version.ref = "guice" } | ||||||
| guiceassistedinject = { group = "com.google.inject.extensions", name = "guice-assistedinject", version.ref = "guice" } | guiceassistedinject = { group = "com.google.inject.extensions", name = "guice-assistedinject", version.ref = "guice" } | ||||||
| spotbugs = { group = "com.github.spotbugs", name = "spotbugs-annotations", version.ref = "spotbugs" } | spotbugs = { group = "com.github.spotbugs", name = "spotbugs-annotations", version.ref = "spotbugs" } | ||||||
| @@ -66,9 +49,6 @@ adventurePlatformBukkit = { group = "net.kyori", name = "adventure-platform-bukk | |||||||
| # Plugins | # Plugins | ||||||
| worldeditCore = { group = "com.sk89q.worldedit", name = "worldedit-core", version.ref = "worldedit" } | worldeditCore = { group = "com.sk89q.worldedit", name = "worldedit-core", version.ref = "worldedit" } | ||||||
| worldeditBukkit = { group = "com.sk89q.worldedit", name = "worldedit-bukkit", version.ref = "worldedit" } | worldeditBukkit = { group = "com.sk89q.worldedit", name = "worldedit-bukkit", version.ref = "worldedit" } | ||||||
| fastasyncworldeditBukkit = { group = "com.fastasyncworldedit", name = "FastAsyncWorldEdit-Bukkit", version.ref = "fawe" } |  | ||||||
| fastasyncworldeditCore = { group = "com.fastasyncworldedit", name = "FastAsyncWorldEdit-Core", version.ref = "fawe" } |  | ||||||
| vault = { group = "com.github.MilkBowl", name = "VaultAPI", version.ref = "vault" } |  | ||||||
| placeholderapi = { group = "me.clip", name = "placeholderapi", version.ref = "placeholderapi" } | placeholderapi = { group = "me.clip", name = "placeholderapi", version.ref = "placeholderapi" } | ||||||
| luckperms = { group = "net.luckperms", name = "api", version.ref = "luckperms" } | luckperms = { group = "net.luckperms", name = "api", version.ref = "luckperms" } | ||||||
| essentialsx = { group = "net.essentialsx", name = "EssentialsX", version.ref = "essentialsx" } | essentialsx = { group = "net.essentialsx", name = "EssentialsX", version.ref = "essentialsx" } | ||||||
| @@ -79,13 +59,8 @@ aopalliance = { group = "aopalliance", name = "aopalliance", version.ref = "aopa | |||||||
| cloudServices = { group = "cloud.commandframework", name = "cloud-services", version.ref = "cloud-services" } | cloudServices = { group = "cloud.commandframework", name = "cloud-services", version.ref = "cloud-services" } | ||||||
| mvdwapi = { group = "com.intellectualsites.mvdwplaceholderapi", name = "MVdWPlaceholderAPI", version.ref = "mvdwapi" } | mvdwapi = { group = "com.intellectualsites.mvdwplaceholderapi", name = "MVdWPlaceholderAPI", version.ref = "mvdwapi" } | ||||||
| squirrelid = { group = "org.enginehub", name = "squirrelid", version.ref = "squirrelid" } | squirrelid = { group = "org.enginehub", name = "squirrelid", version.ref = "squirrelid" } | ||||||
| serverlib = { group = "dev.notmyfault.serverlib", name = "ServerLib", version.ref = "serverlib" } |  | ||||||
| bstats = { group = "org.bstats", name = "bstats-bukkit", version.ref = "bstats" } |  | ||||||
| paperlib = { group = "io.papermc", name = "paperlib", version.ref = "paperlib" } |  | ||||||
| arkitektonika = { group = "com.intellectualsites.arkitektonika", name = "Arkitektonika-Client", version.ref = "arkitektonika" } | arkitektonika = { group = "com.intellectualsites.arkitektonika", name = "Arkitektonika-Client", version.ref = "arkitektonika" } | ||||||
| http4j = { group = "com.intellectualsites.http", name = "HTTP4J", version.ref = "http4j" } | http4j = { group = "com.intellectualsites.http", name = "HTTP4J", version.ref = "http4j" } | ||||||
| paster = { group = "com.intellectualsites.paster", name = "Paster", version.ref = "paster" } |  | ||||||
| guava = { group = "com.google.guava", name = "guava", version.ref = "guava" } |  | ||||||
|  |  | ||||||
| [plugins] | [plugins] | ||||||
| shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadow" } | shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadow" } | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 36 KiB | 
		Reference in New Issue
	
	Block a user