mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-11-03 18:53:43 +01:00 
			
		
		
		
	Compare commits
	
		
			251 Commits
		
	
	
		
			drop-http4
			...
			actions-21
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					f41453a412 | ||
| 
						 | 
					b00a46b286 | ||
| 
						 | 
					44b1127181 | ||
| 
						 | 
					c7bfd48a21 | ||
| 
						 | 
					dc13783db8 | ||
| 
						 | 
					0a390ab342 | ||
| 
						 | 
					d111740f64 | ||
| 
						 | 
					28e97e8441 | ||
| 
						 | 
					a30cdb37d6 | ||
| 
						 | 
					f848162066 | ||
| 
						 | 
					40c70aa98d | ||
| 
						 | 
					0d2b36bac8 | ||
| 
						 | 
					d7e5bcdaa5 | ||
| 
						 | 
					fc783574a3 | ||
| 
						 | 
					5f7bb784f0 | ||
| 
						 | 
					26c55a318f | ||
| 
						 | 
					ee68bc3d9e | ||
| 
						 | 
					a3bc3968a5 | ||
| 
						 | 
					79454da1a6 | ||
| 
						 | 
					12a4c92ad9 | ||
| 
						 | 
					167692d464 | ||
| 
						 | 
					ae26e8155c | ||
| 
						 | 
					286ea62a21 | ||
| 
						 | 
					d95c74d8c9 | ||
| 
						 | 
					c1555ddbc7 | ||
| 
						 | 
					4fe0c586d9 | ||
| 
						 | 
					aae6ea4fee | ||
| 
						 | 
					385d018504 | ||
| 
						 | 
					f4def082c1 | ||
| 
						 | 
					69c9f1df83 | ||
| 
						 | 
					e138dc0267 | ||
| 
						 | 
					ca50b53f94 | ||
| 
						 | 
					f705487055 | ||
| 
						 | 
					b7c9453a1a | ||
| 
						 | 
					1aa370d562 | ||
| 
						 | 
					d3dab0d736 | ||
| 
						 | 
					764156b267 | ||
| 
						 | 
					665f5251bf | ||
| 
						 | 
					7c328095d7 | ||
| 
						 | 
					7884c91d52 | ||
| 
						 | 
					e9a19e0821 | ||
| 
						 | 
					022847fc4b | ||
| 
						 | 
					1ee673be58 | ||
| 
						 | 
					3c2aa99e86 | ||
| 
						 | 
					11fac3f060 | ||
| 
						 | 
					3e57e524b9 | ||
| 
						 | 
					f582ec03c5 | ||
| 
						 | 
					893be136f0 | ||
| 
						 | 
					b74ba30281 | ||
| 
						 | 
					ba9dab1f73 | ||
| 
						 | 
					8e60fdb477 | ||
| 
						 | 
					443fe8dd47 | ||
| 
						 | 
					e56e52ba4f | ||
| 
						 | 
					cd008bed9b | ||
| 
						 | 
					d4c90283d6 | ||
| 
						 | 
					dc04ec955a | ||
| 
						 | 
					72f511ce99 | ||
| 
						 | 
					0d63c2bdb6 | ||
| 
						 | 
					49e13384cf | ||
| 
						 | 
					1ddc19ff69 | ||
| 
						 | 
					a6d436e841 | ||
| 
						 | 
					9b0b39ac2e | ||
| 
						 | 
					638f0bd078 | ||
| 
						 | 
					c27b838dad | ||
| 
						 | 
					e0cb2949df | ||
| 
						 | 
					59be582c28 | ||
| 
						 | 
					f6cbb3792f | ||
| 
						 | 
					a68918f830 | ||
| 
						 | 
					1a7ded864e | ||
| 
						 | 
					cbc8bc8879 | ||
| 
						 | 
					21f79d1c13 | ||
| 
						 | 
					293d7acf2d | ||
| 
						 | 
					d876d3722a | ||
| 
						 | 
					dffb7672ff | ||
| 
						 | 
					f867867a42 | ||
| 
						 | 
					59eefd6865 | ||
| 
						 | 
					587a286d05 | ||
| 
						 | 
					e10caf6aa0 | ||
| 
						 | 
					08b325e37d | ||
| 
						 | 
					c394108ba6 | ||
| 
						 | 
					31e89019f1 | ||
| 
						 | 
					3a7075e28d | ||
| 
						 | 
					8373b7874e | ||
| 
						 | 
					fe13882b97 | ||
| 
						 | 
					f45064c4c4 | ||
| 
						 | 
					af32399dd2 | ||
| 
						 | 
					f3c03348d9 | ||
| 
						 | 
					a53330e39b | ||
| 
						 | 
					e2ba93dab9 | ||
| 
						 | 
					9d43434e40 | ||
| 
						 | 
					4f421167d1 | ||
| 
						 | 
					94f4619c2c | ||
| 
						 | 
					9885d3e506 | ||
| 
						 | 
					a54276d3b2 | ||
| 
						 | 
					cbb284b0fd | ||
| 
						 | 
					ed22b22e9c | ||
| 
						 | 
					444ccda807 | ||
| 
						 | 
					db361cc420 | ||
| 
						 | 
					079dc02cfe | ||
| 
						 | 
					e98791c865 | ||
| 
						 | 
					7c3112f30f | ||
| 
						 | 
					c01f5f5c7d | ||
| 
						 | 
					95caa19505 | ||
| 
						 | 
					b8055201df | ||
| 
						 | 
					81daefae4a | ||
| 
						 | 
					02437a8c72 | ||
| 
						 | 
					958c66b28f | ||
| 
						 | 
					c656190e14 | ||
| 
						 | 
					e914cb210e | ||
| 
						 | 
					94c6af74d2 | ||
| 
						 | 
					ebb82bd66d | ||
| 
						 | 
					66f907eb5d | ||
| 
						 | 
					9ffede2c5c | ||
| 
						 | 
					97172df0dc | ||
| 
						 | 
					c9746b182c | ||
| 
						 | 
					10a2b80ffc | ||
| 
						 | 
					ca0f38255d | ||
| 
						 | 
					0484ac73af | ||
| 
						 | 
					1a712ad3c1 | ||
| 
						 | 
					2d1f483469 | ||
| 
						 | 
					91830e233b | ||
| 
						 | 
					561edb83bf | ||
| 
						 | 
					0e09cf223a | ||
| 
						 | 
					d78360d6eb | ||
| 
						 | 
					1464804c11 | ||
| 
						 | 
					8629eae5fc | ||
| 
						 | 
					7b8ba7c3ac | ||
| 
						 | 
					77c7466c17 | ||
| 
						 | 
					82fe76fd37 | ||
| 
						 | 
					3f81ea4ef8 | ||
| 
						 | 
					745b06a008 | ||
| 
						 | 
					77b2bd166a | ||
| 
						 | 
					8e02336c44 | ||
| 
						 | 
					3adfbde45a | ||
| 
						 | 
					e6db8e2750 | ||
| 
						 | 
					9cd0ee9b49 | ||
| 
						 | 
					d455d1fcd7 | ||
| 
						 | 
					ea19ff783f | ||
| 
						 | 
					447e4c7d58 | ||
| 
						 | 
					89031447f2 | ||
| 
						 | 
					4210a3a555 | ||
| 
						 | 
					42e146b8c7 | ||
| 
						 | 
					a5fdcda673 | ||
| 
						 | 
					52823f5024 | ||
| 
						 | 
					1326c257a0 | ||
| 
						 | 
					fc3137cd96 | ||
| 
						 | 
					a5c53a96d1 | ||
| 
						 | 
					c46cc73f52 | ||
| 
						 | 
					276e619caa | ||
| 
						 | 
					f11acacedd | ||
| 
						 | 
					f636a5ec63 | ||
| 
						 | 
					d1bac90745 | ||
| 
						 | 
					785362c576 | ||
| 
						 | 
					e98f628d34 | ||
| 
						 | 
					b2ab61559c | ||
| 
						 | 
					dd6eb8e74f | ||
| 
						 | 
					97cdd03ea4 | ||
| 
						 | 
					f5118e6802 | ||
| 
						 | 
					94ca5cf679 | ||
| 
						 | 
					5a55a1f602 | ||
| 
						 | 
					1e7ba7d173 | ||
| 
						 | 
					ed33635a15 | ||
| 
						 | 
					888682e5d0 | ||
| 
						 | 
					72bb5f00b0 | ||
| 
						 | 
					773fd6f59f | ||
| 
						 | 
					aa784e98f8 | ||
| 
						 | 
					5cce86d924 | ||
| 
						 | 
					84567bcb00 | ||
| 
						 | 
					d7c2ab1d16 | ||
| 
						 | 
					0d359ade0c | ||
| 
						 | 
					ffbec24290 | ||
| 
						 | 
					586474c8e6 | ||
| 
						 | 
					70b6636f50 | ||
| 
						 | 
					ab357deb48 | ||
| 
						 | 
					bd62d1a1c7 | ||
| 
						 | 
					6130c3dfa5 | ||
| 
						 | 
					26692d6633 | ||
| 
						 | 
					bb0f200429 | ||
| 
						 | 
					5787588500 | ||
| 
						 | 
					bed62edc02 | ||
| 
						 | 
					ee0f389c78 | ||
| 
						 | 
					b40383b5a4 | ||
| 
						 | 
					be8903128d | ||
| 
						 | 
					08800ec16d | ||
| 
						 | 
					83e274ff9f | ||
| 
						 | 
					0dd8b1053c | ||
| 
						 | 
					0558fcf5d5 | ||
| 
						 | 
					5af8be4293 | ||
| 
						 | 
					cbacdd67eb | ||
| 
						 | 
					c45bbe3ec5 | ||
| 
						 | 
					746028afbc | ||
| 
						 | 
					b79537ebbc | ||
| 
						 | 
					6efd581500 | ||
| 
						 | 
					07e598e48f | ||
| 
						 | 
					f6f00dfcda | ||
| 
						 | 
					63a6bdc1d6 | ||
| 
						 | 
					abbac057ed | ||
| 
						 | 
					c978322036 | ||
| 
						 | 
					39d2f1a72c | ||
| 
						 | 
					86919b8841 | ||
| 
						 | 
					1448d8d4af | ||
| 
						 | 
					8d9a387587 | ||
| 
						 | 
					00722bc463 | ||
| 
						 | 
					6a34a1996f | ||
| 
						 | 
					1d201b04ba | ||
| 
						 | 
					e887a59158 | ||
| 
						 | 
					d1b8f652a7 | ||
| 
						 | 
					0707aa47c9 | ||
| 
						 | 
					4aa7bc51bc | ||
| 
						 | 
					0f0030916f | ||
| 
						 | 
					8c57d616cf | ||
| 
						 | 
					66660507e0 | ||
| 
						 | 
					a12490c3eb | ||
| 
						 | 
					bbf1e4fe61 | ||
| 
						 | 
					febac6fa40 | ||
| 
						 | 
					99ee8a780d | ||
| 
						 | 
					577a0d8ed9 | ||
| 
						 | 
					02ae14894a | ||
| 
						 | 
					36e5f36660 | ||
| 
						 | 
					78dbe7fbbc | ||
| 
						 | 
					669293566b | ||
| 
						 | 
					350eae7813 | ||
| 
						 | 
					12dc198a86 | ||
| 
						 | 
					fb2533d66a | ||
| 
						 | 
					707c7be5bd | ||
| 
						 | 
					37d6dcc7ea | ||
| 
						 | 
					530fcc0fea | ||
| 
						 | 
					7135bdd6aa | ||
| 
						 | 
					3198c3b081 | ||
| 
						 | 
					7669e79da1 | ||
| 
						 | 
					c0bfa297bb | ||
| 
						 | 
					75fd9b2631 | ||
| 
						 | 
					6b680fb2c0 | ||
| 
						 | 
					27ffe4fcdc | ||
| 
						 | 
					8afcaccb8a | ||
| 
						 | 
					c83b13e374 | ||
| 
						 | 
					23360057b9 | ||
| 
						 | 
					60f7113105 | ||
| 
						 | 
					26c0c1b7cd | ||
| 
						 | 
					764c94c9cc | ||
| 
						 | 
					3d87ee41b3 | ||
| 
						 | 
					fd8832ac98 | ||
| 
						 | 
					228acc196c | ||
| 
						 | 
					62197f3deb | ||
| 
						 | 
					daa9348993 | ||
| 
						 | 
					7e4499e092 | ||
| 
						 | 
					396a1575d2 | ||
| 
						 | 
					953d57d1b5 | ||
| 
						 | 
					b53d2d03a4 | ||
| 
						 | 
					c1431c0971 | ||
| 
						 | 
					62ee60a76c | 
							
								
								
									
										630
									
								
								.editorconfig
									
									
									
									
									
								
							
							
						
						
									
										630
									
								
								.editorconfig
									
									
									
									
									
								
							@@ -13,40 +13,6 @@ ij_formatter_tags_enabled = false
 | 
				
			|||||||
ij_smart_tabs = false
 | 
					ij_smart_tabs = false
 | 
				
			||||||
ij_wrap_on_typing = true
 | 
					ij_wrap_on_typing = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[*.conf]
 | 
					 | 
				
			||||||
indent_size = 2
 | 
					 | 
				
			||||||
tab_width = 2
 | 
					 | 
				
			||||||
ij_continuation_indent_size = 2
 | 
					 | 
				
			||||||
ij_hocon_keep_blank_lines_before_right_brace = 2
 | 
					 | 
				
			||||||
ij_hocon_keep_indents_on_empty_lines = false
 | 
					 | 
				
			||||||
ij_hocon_keep_line_breaks = true
 | 
					 | 
				
			||||||
ij_hocon_space_after_colon = true
 | 
					 | 
				
			||||||
ij_hocon_space_after_comma = true
 | 
					 | 
				
			||||||
ij_hocon_space_before_colon = true
 | 
					 | 
				
			||||||
ij_hocon_space_before_comma = false
 | 
					 | 
				
			||||||
ij_hocon_spaces_within_braces = false
 | 
					 | 
				
			||||||
ij_hocon_spaces_within_brackets = false
 | 
					 | 
				
			||||||
ij_hocon_spaces_within_method_call_parentheses = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[*.css]
 | 
					 | 
				
			||||||
ij_css_align_closing_brace_with_properties = false
 | 
					 | 
				
			||||||
ij_css_blank_lines_around_nested_selector = 1
 | 
					 | 
				
			||||||
ij_css_blank_lines_between_blocks = 1
 | 
					 | 
				
			||||||
ij_css_brace_placement = end_of_line
 | 
					 | 
				
			||||||
ij_css_enforce_quotes_on_format = false
 | 
					 | 
				
			||||||
ij_css_hex_color_long_format = false
 | 
					 | 
				
			||||||
ij_css_hex_color_lower_case = false
 | 
					 | 
				
			||||||
ij_css_hex_color_short_format = false
 | 
					 | 
				
			||||||
ij_css_hex_color_upper_case = false
 | 
					 | 
				
			||||||
ij_css_keep_blank_lines_in_code = 2
 | 
					 | 
				
			||||||
ij_css_keep_indents_on_empty_lines = false
 | 
					 | 
				
			||||||
ij_css_keep_single_line_blocks = false
 | 
					 | 
				
			||||||
ij_css_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow
 | 
					 | 
				
			||||||
ij_css_space_after_colon = true
 | 
					 | 
				
			||||||
ij_css_space_before_opening_brace = true
 | 
					 | 
				
			||||||
ij_css_use_double_quotes = true
 | 
					 | 
				
			||||||
ij_css_value_alignment = do_not_align
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[*.java]
 | 
					[*.java]
 | 
				
			||||||
ij_java_align_consecutive_assignments = false
 | 
					ij_java_align_consecutive_assignments = false
 | 
				
			||||||
ij_java_align_consecutive_variable_declarations = false
 | 
					ij_java_align_consecutive_variable_declarations = false
 | 
				
			||||||
@@ -277,63 +243,12 @@ ij_java_wrap_comments = false
 | 
				
			|||||||
ij_java_wrap_first_method_in_call_chain = true
 | 
					ij_java_wrap_first_method_in_call_chain = true
 | 
				
			||||||
ij_java_wrap_long_lines = false
 | 
					ij_java_wrap_long_lines = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[*.nbtt]
 | 
					 | 
				
			||||||
max_line_length = 150
 | 
					 | 
				
			||||||
ij_continuation_indent_size = 4
 | 
					 | 
				
			||||||
ij_nbtt_keep_indents_on_empty_lines = false
 | 
					 | 
				
			||||||
ij_nbtt_space_after_colon = true
 | 
					 | 
				
			||||||
ij_nbtt_space_after_comma = true
 | 
					 | 
				
			||||||
ij_nbtt_space_before_colon = true
 | 
					 | 
				
			||||||
ij_nbtt_space_before_comma = false
 | 
					 | 
				
			||||||
ij_nbtt_spaces_within_brackets = false
 | 
					 | 
				
			||||||
ij_nbtt_spaces_within_parentheses = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[*.properties]
 | 
					[*.properties]
 | 
				
			||||||
ij_properties_align_group_field_declarations = false
 | 
					ij_properties_align_group_field_declarations = false
 | 
				
			||||||
ij_properties_keep_blank_lines = false
 | 
					ij_properties_keep_blank_lines = false
 | 
				
			||||||
ij_properties_key_value_delimiter = equals
 | 
					ij_properties_key_value_delimiter = equals
 | 
				
			||||||
ij_properties_spaces_around_key_value_delimiter = false
 | 
					ij_properties_spaces_around_key_value_delimiter = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[*.sass]
 | 
					 | 
				
			||||||
indent_size = 2
 | 
					 | 
				
			||||||
ij_sass_align_closing_brace_with_properties = false
 | 
					 | 
				
			||||||
ij_sass_blank_lines_around_nested_selector = 1
 | 
					 | 
				
			||||||
ij_sass_blank_lines_between_blocks = 1
 | 
					 | 
				
			||||||
ij_sass_brace_placement = 0
 | 
					 | 
				
			||||||
ij_sass_enforce_quotes_on_format = false
 | 
					 | 
				
			||||||
ij_sass_hex_color_long_format = false
 | 
					 | 
				
			||||||
ij_sass_hex_color_lower_case = false
 | 
					 | 
				
			||||||
ij_sass_hex_color_short_format = false
 | 
					 | 
				
			||||||
ij_sass_hex_color_upper_case = false
 | 
					 | 
				
			||||||
ij_sass_keep_blank_lines_in_code = 2
 | 
					 | 
				
			||||||
ij_sass_keep_indents_on_empty_lines = false
 | 
					 | 
				
			||||||
ij_sass_keep_single_line_blocks = false
 | 
					 | 
				
			||||||
ij_sass_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow
 | 
					 | 
				
			||||||
ij_sass_space_after_colon = true
 | 
					 | 
				
			||||||
ij_sass_space_before_opening_brace = true
 | 
					 | 
				
			||||||
ij_sass_use_double_quotes = true
 | 
					 | 
				
			||||||
ij_sass_value_alignment = 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[*.scss]
 | 
					 | 
				
			||||||
indent_size = 2
 | 
					 | 
				
			||||||
ij_scss_align_closing_brace_with_properties = false
 | 
					 | 
				
			||||||
ij_scss_blank_lines_around_nested_selector = 1
 | 
					 | 
				
			||||||
ij_scss_blank_lines_between_blocks = 1
 | 
					 | 
				
			||||||
ij_scss_brace_placement = 0
 | 
					 | 
				
			||||||
ij_scss_enforce_quotes_on_format = false
 | 
					 | 
				
			||||||
ij_scss_hex_color_long_format = false
 | 
					 | 
				
			||||||
ij_scss_hex_color_lower_case = false
 | 
					 | 
				
			||||||
ij_scss_hex_color_short_format = false
 | 
					 | 
				
			||||||
ij_scss_hex_color_upper_case = false
 | 
					 | 
				
			||||||
ij_scss_keep_blank_lines_in_code = 2
 | 
					 | 
				
			||||||
ij_scss_keep_indents_on_empty_lines = false
 | 
					 | 
				
			||||||
ij_scss_keep_single_line_blocks = false
 | 
					 | 
				
			||||||
ij_scss_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow
 | 
					 | 
				
			||||||
ij_scss_space_after_colon = true
 | 
					 | 
				
			||||||
ij_scss_space_before_opening_brace = true
 | 
					 | 
				
			||||||
ij_scss_use_double_quotes = true
 | 
					 | 
				
			||||||
ij_scss_value_alignment = 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[.editorconfig]
 | 
					[.editorconfig]
 | 
				
			||||||
ij_editorconfig_align_group_field_declarations = false
 | 
					ij_editorconfig_align_group_field_declarations = false
 | 
				
			||||||
ij_editorconfig_space_after_colon = false
 | 
					ij_editorconfig_space_after_colon = false
 | 
				
			||||||
@@ -342,548 +257,6 @@ ij_editorconfig_space_before_colon = false
 | 
				
			|||||||
ij_editorconfig_space_before_comma = false
 | 
					ij_editorconfig_space_before_comma = false
 | 
				
			||||||
ij_editorconfig_spaces_around_assignment_operators = true
 | 
					ij_editorconfig_spaces_around_assignment_operators = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[{*.ant, *.fxml, *.jhm, *.jnlp, *.jrxml, *.pom, *.rng, *.tld, *.wsdl, *.xml, *.xsd, *.xsl, *.xslt, *.xul}]
 | 
					 | 
				
			||||||
ij_xml_align_attributes = true
 | 
					 | 
				
			||||||
ij_xml_align_text = false
 | 
					 | 
				
			||||||
ij_xml_attribute_wrap = normal
 | 
					 | 
				
			||||||
ij_xml_block_comment_at_first_column = true
 | 
					 | 
				
			||||||
ij_xml_keep_blank_lines = 2
 | 
					 | 
				
			||||||
ij_xml_keep_indents_on_empty_lines = false
 | 
					 | 
				
			||||||
ij_xml_keep_line_breaks = true
 | 
					 | 
				
			||||||
ij_xml_keep_line_breaks_in_text = true
 | 
					 | 
				
			||||||
ij_xml_keep_whitespaces = false
 | 
					 | 
				
			||||||
ij_xml_keep_whitespaces_around_cdata = preserve
 | 
					 | 
				
			||||||
ij_xml_keep_whitespaces_inside_cdata = false
 | 
					 | 
				
			||||||
ij_xml_line_comment_at_first_column = true
 | 
					 | 
				
			||||||
ij_xml_space_after_tag_name = false
 | 
					 | 
				
			||||||
ij_xml_space_around_equals_in_attribute = false
 | 
					 | 
				
			||||||
ij_xml_space_inside_empty_tag = false
 | 
					 | 
				
			||||||
ij_xml_text_wrap = normal
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[{*.ats, *.ts}]
 | 
					 | 
				
			||||||
ij_continuation_indent_size = 4
 | 
					 | 
				
			||||||
ij_typescript_align_imports = false
 | 
					 | 
				
			||||||
ij_typescript_align_multiline_array_initializer_expression = false
 | 
					 | 
				
			||||||
ij_typescript_align_multiline_binary_operation = false
 | 
					 | 
				
			||||||
ij_typescript_align_multiline_chained_methods = false
 | 
					 | 
				
			||||||
ij_typescript_align_multiline_extends_list = false
 | 
					 | 
				
			||||||
ij_typescript_align_multiline_for = true
 | 
					 | 
				
			||||||
ij_typescript_align_multiline_parameters = true
 | 
					 | 
				
			||||||
ij_typescript_align_multiline_parameters_in_calls = false
 | 
					 | 
				
			||||||
ij_typescript_align_multiline_ternary_operation = false
 | 
					 | 
				
			||||||
ij_typescript_align_object_properties = 0
 | 
					 | 
				
			||||||
ij_typescript_align_union_types = false
 | 
					 | 
				
			||||||
ij_typescript_align_var_statements = 0
 | 
					 | 
				
			||||||
ij_typescript_array_initializer_new_line_after_left_brace = false
 | 
					 | 
				
			||||||
ij_typescript_array_initializer_right_brace_on_new_line = false
 | 
					 | 
				
			||||||
ij_typescript_array_initializer_wrap = off
 | 
					 | 
				
			||||||
ij_typescript_assignment_wrap = off
 | 
					 | 
				
			||||||
ij_typescript_binary_operation_sign_on_next_line = false
 | 
					 | 
				
			||||||
ij_typescript_binary_operation_wrap = off
 | 
					 | 
				
			||||||
ij_typescript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/**
 | 
					 | 
				
			||||||
ij_typescript_blank_lines_after_imports = 1
 | 
					 | 
				
			||||||
ij_typescript_blank_lines_around_class = 1
 | 
					 | 
				
			||||||
ij_typescript_blank_lines_around_field = 0
 | 
					 | 
				
			||||||
ij_typescript_blank_lines_around_field_in_interface = 0
 | 
					 | 
				
			||||||
ij_typescript_blank_lines_around_function = 1
 | 
					 | 
				
			||||||
ij_typescript_blank_lines_around_method = 1
 | 
					 | 
				
			||||||
ij_typescript_blank_lines_around_method_in_interface = 1
 | 
					 | 
				
			||||||
ij_typescript_block_brace_style = end_of_line
 | 
					 | 
				
			||||||
ij_typescript_call_parameters_new_line_after_left_paren = false
 | 
					 | 
				
			||||||
ij_typescript_call_parameters_right_paren_on_new_line = false
 | 
					 | 
				
			||||||
ij_typescript_call_parameters_wrap = off
 | 
					 | 
				
			||||||
ij_typescript_catch_on_new_line = false
 | 
					 | 
				
			||||||
ij_typescript_chained_call_dot_on_new_line = true
 | 
					 | 
				
			||||||
ij_typescript_class_brace_style = end_of_line
 | 
					 | 
				
			||||||
ij_typescript_comma_on_new_line = false
 | 
					 | 
				
			||||||
ij_typescript_do_while_brace_force = never
 | 
					 | 
				
			||||||
ij_typescript_else_on_new_line = false
 | 
					 | 
				
			||||||
ij_typescript_enforce_trailing_comma = keep
 | 
					 | 
				
			||||||
ij_typescript_extends_keyword_wrap = off
 | 
					 | 
				
			||||||
ij_typescript_extends_list_wrap = off
 | 
					 | 
				
			||||||
ij_typescript_field_prefix = _
 | 
					 | 
				
			||||||
ij_typescript_file_name_style = relaxed
 | 
					 | 
				
			||||||
ij_typescript_finally_on_new_line = false
 | 
					 | 
				
			||||||
ij_typescript_for_brace_force = never
 | 
					 | 
				
			||||||
ij_typescript_for_statement_new_line_after_left_paren = false
 | 
					 | 
				
			||||||
ij_typescript_for_statement_right_paren_on_new_line = false
 | 
					 | 
				
			||||||
ij_typescript_for_statement_wrap = off
 | 
					 | 
				
			||||||
ij_typescript_force_quote_style = false
 | 
					 | 
				
			||||||
ij_typescript_force_semicolon_style = false
 | 
					 | 
				
			||||||
ij_typescript_function_expression_brace_style = end_of_line
 | 
					 | 
				
			||||||
ij_typescript_if_brace_force = never
 | 
					 | 
				
			||||||
ij_typescript_import_merge_members = global
 | 
					 | 
				
			||||||
ij_typescript_import_prefer_absolute_path = global
 | 
					 | 
				
			||||||
ij_typescript_import_sort_members = true
 | 
					 | 
				
			||||||
ij_typescript_import_sort_module_name = false
 | 
					 | 
				
			||||||
ij_typescript_import_use_node_resolution = true
 | 
					 | 
				
			||||||
ij_typescript_imports_wrap = on_every_item
 | 
					 | 
				
			||||||
ij_typescript_indent_case_from_switch = true
 | 
					 | 
				
			||||||
ij_typescript_indent_chained_calls = true
 | 
					 | 
				
			||||||
ij_typescript_indent_package_children = 0
 | 
					 | 
				
			||||||
ij_typescript_jsdoc_include_types = false
 | 
					 | 
				
			||||||
ij_typescript_jsx_attribute_value = braces
 | 
					 | 
				
			||||||
ij_typescript_keep_blank_lines_in_code = 2
 | 
					 | 
				
			||||||
ij_typescript_keep_first_column_comment = true
 | 
					 | 
				
			||||||
ij_typescript_keep_indents_on_empty_lines = false
 | 
					 | 
				
			||||||
ij_typescript_keep_line_breaks = true
 | 
					 | 
				
			||||||
ij_typescript_keep_simple_blocks_in_one_line = false
 | 
					 | 
				
			||||||
ij_typescript_keep_simple_methods_in_one_line = false
 | 
					 | 
				
			||||||
ij_typescript_line_comment_add_space = true
 | 
					 | 
				
			||||||
ij_typescript_line_comment_at_first_column = false
 | 
					 | 
				
			||||||
ij_typescript_method_brace_style = end_of_line
 | 
					 | 
				
			||||||
ij_typescript_method_call_chain_wrap = off
 | 
					 | 
				
			||||||
ij_typescript_method_parameters_new_line_after_left_paren = false
 | 
					 | 
				
			||||||
ij_typescript_method_parameters_right_paren_on_new_line = false
 | 
					 | 
				
			||||||
ij_typescript_method_parameters_wrap = off
 | 
					 | 
				
			||||||
ij_typescript_object_literal_wrap = on_every_item
 | 
					 | 
				
			||||||
ij_typescript_parentheses_expression_new_line_after_left_paren = false
 | 
					 | 
				
			||||||
ij_typescript_parentheses_expression_right_paren_on_new_line = false
 | 
					 | 
				
			||||||
ij_typescript_place_assignment_sign_on_next_line = false
 | 
					 | 
				
			||||||
ij_typescript_prefer_as_type_cast = false
 | 
					 | 
				
			||||||
ij_typescript_prefer_explicit_types_function_expression_returns = false
 | 
					 | 
				
			||||||
ij_typescript_prefer_explicit_types_function_returns = false
 | 
					 | 
				
			||||||
ij_typescript_prefer_explicit_types_vars_fields = false
 | 
					 | 
				
			||||||
ij_typescript_prefer_parameters_wrap = false
 | 
					 | 
				
			||||||
ij_typescript_reformat_c_style_comments = false
 | 
					 | 
				
			||||||
ij_typescript_space_after_colon = true
 | 
					 | 
				
			||||||
ij_typescript_space_after_comma = true
 | 
					 | 
				
			||||||
ij_typescript_space_after_dots_in_rest_parameter = false
 | 
					 | 
				
			||||||
ij_typescript_space_after_generator_mult = true
 | 
					 | 
				
			||||||
ij_typescript_space_after_property_colon = true
 | 
					 | 
				
			||||||
ij_typescript_space_after_quest = true
 | 
					 | 
				
			||||||
ij_typescript_space_after_type_colon = true
 | 
					 | 
				
			||||||
ij_typescript_space_after_unary_not = false
 | 
					 | 
				
			||||||
ij_typescript_space_before_async_arrow_lparen = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_catch_keyword = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_catch_left_brace = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_catch_parentheses = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_class_lbrace = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_class_left_brace = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_colon = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_comma = false
 | 
					 | 
				
			||||||
ij_typescript_space_before_do_left_brace = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_else_keyword = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_else_left_brace = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_finally_keyword = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_finally_left_brace = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_for_left_brace = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_for_parentheses = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_for_semicolon = false
 | 
					 | 
				
			||||||
ij_typescript_space_before_function_left_parenth = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_generator_mult = false
 | 
					 | 
				
			||||||
ij_typescript_space_before_if_left_brace = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_if_parentheses = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_method_call_parentheses = false
 | 
					 | 
				
			||||||
ij_typescript_space_before_method_left_brace = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_method_parentheses = false
 | 
					 | 
				
			||||||
ij_typescript_space_before_property_colon = false
 | 
					 | 
				
			||||||
ij_typescript_space_before_quest = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_switch_left_brace = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_switch_parentheses = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_try_left_brace = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_type_colon = false
 | 
					 | 
				
			||||||
ij_typescript_space_before_unary_not = false
 | 
					 | 
				
			||||||
ij_typescript_space_before_while_keyword = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_while_left_brace = true
 | 
					 | 
				
			||||||
ij_typescript_space_before_while_parentheses = true
 | 
					 | 
				
			||||||
ij_typescript_spaces_around_additive_operators = true
 | 
					 | 
				
			||||||
ij_typescript_spaces_around_arrow_function_operator = true
 | 
					 | 
				
			||||||
ij_typescript_spaces_around_assignment_operators = true
 | 
					 | 
				
			||||||
ij_typescript_spaces_around_bitwise_operators = true
 | 
					 | 
				
			||||||
ij_typescript_spaces_around_equality_operators = true
 | 
					 | 
				
			||||||
ij_typescript_spaces_around_logical_operators = true
 | 
					 | 
				
			||||||
ij_typescript_spaces_around_multiplicative_operators = true
 | 
					 | 
				
			||||||
ij_typescript_spaces_around_relational_operators = true
 | 
					 | 
				
			||||||
ij_typescript_spaces_around_shift_operators = true
 | 
					 | 
				
			||||||
ij_typescript_spaces_around_unary_operator = false
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_array_initializer_brackets = false
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_brackets = false
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_catch_parentheses = false
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_for_parentheses = false
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_if_parentheses = false
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_imports = false
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_interpolation_expressions = false
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_method_call_parentheses = false
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_method_parentheses = false
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_object_literal_braces = false
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_object_type_braces = true
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_parentheses = false
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_switch_parentheses = false
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_type_assertion = false
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_union_types = true
 | 
					 | 
				
			||||||
ij_typescript_spaces_within_while_parentheses = false
 | 
					 | 
				
			||||||
ij_typescript_special_else_if_treatment = true
 | 
					 | 
				
			||||||
ij_typescript_ternary_operation_signs_on_next_line = false
 | 
					 | 
				
			||||||
ij_typescript_ternary_operation_wrap = off
 | 
					 | 
				
			||||||
ij_typescript_union_types_wrap = on_every_item
 | 
					 | 
				
			||||||
ij_typescript_use_chained_calls_group_indents = false
 | 
					 | 
				
			||||||
ij_typescript_use_double_quotes = true
 | 
					 | 
				
			||||||
ij_typescript_use_explicit_js_extension = global
 | 
					 | 
				
			||||||
ij_typescript_use_path_mapping = always
 | 
					 | 
				
			||||||
ij_typescript_use_public_modifier = false
 | 
					 | 
				
			||||||
ij_typescript_use_semicolon_after_statement = true
 | 
					 | 
				
			||||||
ij_typescript_var_declaration_wrap = normal
 | 
					 | 
				
			||||||
ij_typescript_while_brace_force = never
 | 
					 | 
				
			||||||
ij_typescript_while_on_new_line = false
 | 
					 | 
				
			||||||
ij_typescript_wrap_comments = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[{*.bash, *.sh, *.zsh}]
 | 
					 | 
				
			||||||
indent_size = 2
 | 
					 | 
				
			||||||
tab_width = 2
 | 
					 | 
				
			||||||
ij_shell_binary_ops_start_line = false
 | 
					 | 
				
			||||||
ij_shell_keep_column_alignment_padding = false
 | 
					 | 
				
			||||||
ij_shell_minify_program = false
 | 
					 | 
				
			||||||
ij_shell_redirect_followed_by_space = false
 | 
					 | 
				
			||||||
ij_shell_switch_cases_indented = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[{*.cjs, *.js}]
 | 
					 | 
				
			||||||
ij_continuation_indent_size = 4
 | 
					 | 
				
			||||||
ij_javascript_align_imports = false
 | 
					 | 
				
			||||||
ij_javascript_align_multiline_array_initializer_expression = false
 | 
					 | 
				
			||||||
ij_javascript_align_multiline_binary_operation = false
 | 
					 | 
				
			||||||
ij_javascript_align_multiline_chained_methods = false
 | 
					 | 
				
			||||||
ij_javascript_align_multiline_extends_list = false
 | 
					 | 
				
			||||||
ij_javascript_align_multiline_for = true
 | 
					 | 
				
			||||||
ij_javascript_align_multiline_parameters = true
 | 
					 | 
				
			||||||
ij_javascript_align_multiline_parameters_in_calls = false
 | 
					 | 
				
			||||||
ij_javascript_align_multiline_ternary_operation = false
 | 
					 | 
				
			||||||
ij_javascript_align_object_properties = 0
 | 
					 | 
				
			||||||
ij_javascript_align_union_types = false
 | 
					 | 
				
			||||||
ij_javascript_align_var_statements = 0
 | 
					 | 
				
			||||||
ij_javascript_array_initializer_new_line_after_left_brace = false
 | 
					 | 
				
			||||||
ij_javascript_array_initializer_right_brace_on_new_line = false
 | 
					 | 
				
			||||||
ij_javascript_array_initializer_wrap = off
 | 
					 | 
				
			||||||
ij_javascript_assignment_wrap = off
 | 
					 | 
				
			||||||
ij_javascript_binary_operation_sign_on_next_line = false
 | 
					 | 
				
			||||||
ij_javascript_binary_operation_wrap = off
 | 
					 | 
				
			||||||
ij_javascript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/**
 | 
					 | 
				
			||||||
ij_javascript_blank_lines_after_imports = 1
 | 
					 | 
				
			||||||
ij_javascript_blank_lines_around_class = 1
 | 
					 | 
				
			||||||
ij_javascript_blank_lines_around_field = 0
 | 
					 | 
				
			||||||
ij_javascript_blank_lines_around_function = 1
 | 
					 | 
				
			||||||
ij_javascript_blank_lines_around_method = 1
 | 
					 | 
				
			||||||
ij_javascript_block_brace_style = end_of_line
 | 
					 | 
				
			||||||
ij_javascript_call_parameters_new_line_after_left_paren = false
 | 
					 | 
				
			||||||
ij_javascript_call_parameters_right_paren_on_new_line = false
 | 
					 | 
				
			||||||
ij_javascript_call_parameters_wrap = off
 | 
					 | 
				
			||||||
ij_javascript_catch_on_new_line = false
 | 
					 | 
				
			||||||
ij_javascript_chained_call_dot_on_new_line = true
 | 
					 | 
				
			||||||
ij_javascript_class_brace_style = end_of_line
 | 
					 | 
				
			||||||
ij_javascript_comma_on_new_line = false
 | 
					 | 
				
			||||||
ij_javascript_do_while_brace_force = never
 | 
					 | 
				
			||||||
ij_javascript_else_on_new_line = false
 | 
					 | 
				
			||||||
ij_javascript_enforce_trailing_comma = keep
 | 
					 | 
				
			||||||
ij_javascript_extends_keyword_wrap = off
 | 
					 | 
				
			||||||
ij_javascript_extends_list_wrap = off
 | 
					 | 
				
			||||||
ij_javascript_field_prefix = _
 | 
					 | 
				
			||||||
ij_javascript_file_name_style = relaxed
 | 
					 | 
				
			||||||
ij_javascript_finally_on_new_line = false
 | 
					 | 
				
			||||||
ij_javascript_for_brace_force = never
 | 
					 | 
				
			||||||
ij_javascript_for_statement_new_line_after_left_paren = false
 | 
					 | 
				
			||||||
ij_javascript_for_statement_right_paren_on_new_line = false
 | 
					 | 
				
			||||||
ij_javascript_for_statement_wrap = off
 | 
					 | 
				
			||||||
ij_javascript_force_quote_style = false
 | 
					 | 
				
			||||||
ij_javascript_force_semicolon_style = false
 | 
					 | 
				
			||||||
ij_javascript_function_expression_brace_style = end_of_line
 | 
					 | 
				
			||||||
ij_javascript_if_brace_force = never
 | 
					 | 
				
			||||||
ij_javascript_import_merge_members = global
 | 
					 | 
				
			||||||
ij_javascript_import_prefer_absolute_path = global
 | 
					 | 
				
			||||||
ij_javascript_import_sort_members = true
 | 
					 | 
				
			||||||
ij_javascript_import_sort_module_name = false
 | 
					 | 
				
			||||||
ij_javascript_import_use_node_resolution = true
 | 
					 | 
				
			||||||
ij_javascript_imports_wrap = on_every_item
 | 
					 | 
				
			||||||
ij_javascript_indent_case_from_switch = true
 | 
					 | 
				
			||||||
ij_javascript_indent_chained_calls = true
 | 
					 | 
				
			||||||
ij_javascript_indent_package_children = 0
 | 
					 | 
				
			||||||
ij_javascript_jsx_attribute_value = braces
 | 
					 | 
				
			||||||
ij_javascript_keep_blank_lines_in_code = 2
 | 
					 | 
				
			||||||
ij_javascript_keep_first_column_comment = true
 | 
					 | 
				
			||||||
ij_javascript_keep_indents_on_empty_lines = false
 | 
					 | 
				
			||||||
ij_javascript_keep_line_breaks = true
 | 
					 | 
				
			||||||
ij_javascript_keep_simple_blocks_in_one_line = false
 | 
					 | 
				
			||||||
ij_javascript_keep_simple_methods_in_one_line = false
 | 
					 | 
				
			||||||
ij_javascript_line_comment_add_space = true
 | 
					 | 
				
			||||||
ij_javascript_line_comment_at_first_column = false
 | 
					 | 
				
			||||||
ij_javascript_method_brace_style = end_of_line
 | 
					 | 
				
			||||||
ij_javascript_method_call_chain_wrap = off
 | 
					 | 
				
			||||||
ij_javascript_method_parameters_new_line_after_left_paren = false
 | 
					 | 
				
			||||||
ij_javascript_method_parameters_right_paren_on_new_line = false
 | 
					 | 
				
			||||||
ij_javascript_method_parameters_wrap = off
 | 
					 | 
				
			||||||
ij_javascript_object_literal_wrap = on_every_item
 | 
					 | 
				
			||||||
ij_javascript_parentheses_expression_new_line_after_left_paren = false
 | 
					 | 
				
			||||||
ij_javascript_parentheses_expression_right_paren_on_new_line = false
 | 
					 | 
				
			||||||
ij_javascript_place_assignment_sign_on_next_line = false
 | 
					 | 
				
			||||||
ij_javascript_prefer_as_type_cast = false
 | 
					 | 
				
			||||||
ij_javascript_prefer_explicit_types_function_expression_returns = false
 | 
					 | 
				
			||||||
ij_javascript_prefer_explicit_types_function_returns = false
 | 
					 | 
				
			||||||
ij_javascript_prefer_explicit_types_vars_fields = false
 | 
					 | 
				
			||||||
ij_javascript_prefer_parameters_wrap = false
 | 
					 | 
				
			||||||
ij_javascript_reformat_c_style_comments = false
 | 
					 | 
				
			||||||
ij_javascript_space_after_colon = true
 | 
					 | 
				
			||||||
ij_javascript_space_after_comma = true
 | 
					 | 
				
			||||||
ij_javascript_space_after_dots_in_rest_parameter = false
 | 
					 | 
				
			||||||
ij_javascript_space_after_generator_mult = true
 | 
					 | 
				
			||||||
ij_javascript_space_after_property_colon = true
 | 
					 | 
				
			||||||
ij_javascript_space_after_quest = true
 | 
					 | 
				
			||||||
ij_javascript_space_after_type_colon = true
 | 
					 | 
				
			||||||
ij_javascript_space_after_unary_not = false
 | 
					 | 
				
			||||||
ij_javascript_space_before_async_arrow_lparen = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_catch_keyword = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_catch_left_brace = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_catch_parentheses = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_class_lbrace = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_class_left_brace = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_colon = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_comma = false
 | 
					 | 
				
			||||||
ij_javascript_space_before_do_left_brace = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_else_keyword = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_else_left_brace = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_finally_keyword = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_finally_left_brace = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_for_left_brace = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_for_parentheses = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_for_semicolon = false
 | 
					 | 
				
			||||||
ij_javascript_space_before_function_left_parenth = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_generator_mult = false
 | 
					 | 
				
			||||||
ij_javascript_space_before_if_left_brace = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_if_parentheses = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_method_call_parentheses = false
 | 
					 | 
				
			||||||
ij_javascript_space_before_method_left_brace = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_method_parentheses = false
 | 
					 | 
				
			||||||
ij_javascript_space_before_property_colon = false
 | 
					 | 
				
			||||||
ij_javascript_space_before_quest = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_switch_left_brace = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_switch_parentheses = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_try_left_brace = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_type_colon = false
 | 
					 | 
				
			||||||
ij_javascript_space_before_unary_not = false
 | 
					 | 
				
			||||||
ij_javascript_space_before_while_keyword = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_while_left_brace = true
 | 
					 | 
				
			||||||
ij_javascript_space_before_while_parentheses = true
 | 
					 | 
				
			||||||
ij_javascript_spaces_around_additive_operators = true
 | 
					 | 
				
			||||||
ij_javascript_spaces_around_arrow_function_operator = true
 | 
					 | 
				
			||||||
ij_javascript_spaces_around_assignment_operators = true
 | 
					 | 
				
			||||||
ij_javascript_spaces_around_bitwise_operators = true
 | 
					 | 
				
			||||||
ij_javascript_spaces_around_equality_operators = true
 | 
					 | 
				
			||||||
ij_javascript_spaces_around_logical_operators = true
 | 
					 | 
				
			||||||
ij_javascript_spaces_around_multiplicative_operators = true
 | 
					 | 
				
			||||||
ij_javascript_spaces_around_relational_operators = true
 | 
					 | 
				
			||||||
ij_javascript_spaces_around_shift_operators = true
 | 
					 | 
				
			||||||
ij_javascript_spaces_around_unary_operator = false
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_array_initializer_brackets = false
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_brackets = false
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_catch_parentheses = false
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_for_parentheses = false
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_if_parentheses = false
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_imports = false
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_interpolation_expressions = false
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_method_call_parentheses = false
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_method_parentheses = false
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_object_literal_braces = false
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_object_type_braces = true
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_parentheses = false
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_switch_parentheses = false
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_type_assertion = false
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_union_types = true
 | 
					 | 
				
			||||||
ij_javascript_spaces_within_while_parentheses = false
 | 
					 | 
				
			||||||
ij_javascript_special_else_if_treatment = true
 | 
					 | 
				
			||||||
ij_javascript_ternary_operation_signs_on_next_line = false
 | 
					 | 
				
			||||||
ij_javascript_ternary_operation_wrap = off
 | 
					 | 
				
			||||||
ij_javascript_union_types_wrap = on_every_item
 | 
					 | 
				
			||||||
ij_javascript_use_chained_calls_group_indents = false
 | 
					 | 
				
			||||||
ij_javascript_use_double_quotes = true
 | 
					 | 
				
			||||||
ij_javascript_use_explicit_js_extension = global
 | 
					 | 
				
			||||||
ij_javascript_use_path_mapping = always
 | 
					 | 
				
			||||||
ij_javascript_use_public_modifier = false
 | 
					 | 
				
			||||||
ij_javascript_use_semicolon_after_statement = true
 | 
					 | 
				
			||||||
ij_javascript_var_declaration_wrap = normal
 | 
					 | 
				
			||||||
ij_javascript_while_brace_force = never
 | 
					 | 
				
			||||||
ij_javascript_while_on_new_line = false
 | 
					 | 
				
			||||||
ij_javascript_wrap_comments = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[{*.ft, *.vm, *.vsl}]
 | 
					 | 
				
			||||||
ij_vtl_keep_indents_on_empty_lines = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[{*.gant, *.gradle, *.groovy, *.gy}]
 | 
					 | 
				
			||||||
ij_groovy_align_group_field_declarations = false
 | 
					 | 
				
			||||||
ij_groovy_align_multiline_array_initializer_expression = false
 | 
					 | 
				
			||||||
ij_groovy_align_multiline_assignment = false
 | 
					 | 
				
			||||||
ij_groovy_align_multiline_binary_operation = false
 | 
					 | 
				
			||||||
ij_groovy_align_multiline_chained_methods = false
 | 
					 | 
				
			||||||
ij_groovy_align_multiline_extends_list = false
 | 
					 | 
				
			||||||
ij_groovy_align_multiline_for = true
 | 
					 | 
				
			||||||
ij_groovy_align_multiline_list_or_map = true
 | 
					 | 
				
			||||||
ij_groovy_align_multiline_method_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_align_multiline_parameters = true
 | 
					 | 
				
			||||||
ij_groovy_align_multiline_parameters_in_calls = false
 | 
					 | 
				
			||||||
ij_groovy_align_multiline_resources = true
 | 
					 | 
				
			||||||
ij_groovy_align_multiline_ternary_operation = false
 | 
					 | 
				
			||||||
ij_groovy_align_multiline_throws_list = false
 | 
					 | 
				
			||||||
ij_groovy_align_named_args_in_map = true
 | 
					 | 
				
			||||||
ij_groovy_align_throws_keyword = false
 | 
					 | 
				
			||||||
ij_groovy_array_initializer_new_line_after_left_brace = false
 | 
					 | 
				
			||||||
ij_groovy_array_initializer_right_brace_on_new_line = false
 | 
					 | 
				
			||||||
ij_groovy_array_initializer_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_assert_statement_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_assignment_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_binary_operation_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_blank_lines_after_class_header = 0
 | 
					 | 
				
			||||||
ij_groovy_blank_lines_after_imports = 1
 | 
					 | 
				
			||||||
ij_groovy_blank_lines_after_package = 1
 | 
					 | 
				
			||||||
ij_groovy_blank_lines_around_class = 1
 | 
					 | 
				
			||||||
ij_groovy_blank_lines_around_field = 0
 | 
					 | 
				
			||||||
ij_groovy_blank_lines_around_field_in_interface = 0
 | 
					 | 
				
			||||||
ij_groovy_blank_lines_around_method = 1
 | 
					 | 
				
			||||||
ij_groovy_blank_lines_around_method_in_interface = 1
 | 
					 | 
				
			||||||
ij_groovy_blank_lines_before_imports = 1
 | 
					 | 
				
			||||||
ij_groovy_blank_lines_before_method_body = 0
 | 
					 | 
				
			||||||
ij_groovy_blank_lines_before_package = 0
 | 
					 | 
				
			||||||
ij_groovy_block_brace_style = end_of_line
 | 
					 | 
				
			||||||
ij_groovy_block_comment_at_first_column = true
 | 
					 | 
				
			||||||
ij_groovy_call_parameters_new_line_after_left_paren = false
 | 
					 | 
				
			||||||
ij_groovy_call_parameters_right_paren_on_new_line = false
 | 
					 | 
				
			||||||
ij_groovy_call_parameters_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_catch_on_new_line = false
 | 
					 | 
				
			||||||
ij_groovy_class_annotation_wrap = split_into_lines
 | 
					 | 
				
			||||||
ij_groovy_class_brace_style = end_of_line
 | 
					 | 
				
			||||||
ij_groovy_class_count_to_use_import_on_demand = 5
 | 
					 | 
				
			||||||
ij_groovy_do_while_brace_force = never
 | 
					 | 
				
			||||||
ij_groovy_else_on_new_line = false
 | 
					 | 
				
			||||||
ij_groovy_enum_constants_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_extends_keyword_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_extends_list_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_field_annotation_wrap = split_into_lines
 | 
					 | 
				
			||||||
ij_groovy_finally_on_new_line = false
 | 
					 | 
				
			||||||
ij_groovy_for_brace_force = never
 | 
					 | 
				
			||||||
ij_groovy_for_statement_new_line_after_left_paren = false
 | 
					 | 
				
			||||||
ij_groovy_for_statement_right_paren_on_new_line = false
 | 
					 | 
				
			||||||
ij_groovy_for_statement_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_if_brace_force = never
 | 
					 | 
				
			||||||
ij_groovy_import_annotation_wrap = 2
 | 
					 | 
				
			||||||
ij_groovy_imports_layout = *, |, javax.**, java.**, |, $*
 | 
					 | 
				
			||||||
ij_groovy_indent_case_from_switch = true
 | 
					 | 
				
			||||||
ij_groovy_indent_label_blocks = true
 | 
					 | 
				
			||||||
ij_groovy_insert_inner_class_imports = false
 | 
					 | 
				
			||||||
ij_groovy_keep_blank_lines_before_right_brace = 2
 | 
					 | 
				
			||||||
ij_groovy_keep_blank_lines_in_code = 2
 | 
					 | 
				
			||||||
ij_groovy_keep_blank_lines_in_declarations = 2
 | 
					 | 
				
			||||||
ij_groovy_keep_control_statement_in_one_line = true
 | 
					 | 
				
			||||||
ij_groovy_keep_first_column_comment = true
 | 
					 | 
				
			||||||
ij_groovy_keep_indents_on_empty_lines = false
 | 
					 | 
				
			||||||
ij_groovy_keep_line_breaks = true
 | 
					 | 
				
			||||||
ij_groovy_keep_multiple_expressions_in_one_line = false
 | 
					 | 
				
			||||||
ij_groovy_keep_simple_blocks_in_one_line = false
 | 
					 | 
				
			||||||
ij_groovy_keep_simple_classes_in_one_line = true
 | 
					 | 
				
			||||||
ij_groovy_keep_simple_lambdas_in_one_line = true
 | 
					 | 
				
			||||||
ij_groovy_keep_simple_methods_in_one_line = true
 | 
					 | 
				
			||||||
ij_groovy_label_indent_absolute = false
 | 
					 | 
				
			||||||
ij_groovy_label_indent_size = 0
 | 
					 | 
				
			||||||
ij_groovy_lambda_brace_style = end_of_line
 | 
					 | 
				
			||||||
ij_groovy_layout_static_imports_separately = true
 | 
					 | 
				
			||||||
ij_groovy_line_comment_add_space = false
 | 
					 | 
				
			||||||
ij_groovy_line_comment_at_first_column = true
 | 
					 | 
				
			||||||
ij_groovy_method_annotation_wrap = split_into_lines
 | 
					 | 
				
			||||||
ij_groovy_method_brace_style = end_of_line
 | 
					 | 
				
			||||||
ij_groovy_method_call_chain_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_method_parameters_new_line_after_left_paren = false
 | 
					 | 
				
			||||||
ij_groovy_method_parameters_right_paren_on_new_line = false
 | 
					 | 
				
			||||||
ij_groovy_method_parameters_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_modifier_list_wrap = false
 | 
					 | 
				
			||||||
ij_groovy_names_count_to_use_import_on_demand = 3
 | 
					 | 
				
			||||||
ij_groovy_parameter_annotation_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_parentheses_expression_new_line_after_left_paren = false
 | 
					 | 
				
			||||||
ij_groovy_parentheses_expression_right_paren_on_new_line = false
 | 
					 | 
				
			||||||
ij_groovy_prefer_parameters_wrap = false
 | 
					 | 
				
			||||||
ij_groovy_resource_list_new_line_after_left_paren = false
 | 
					 | 
				
			||||||
ij_groovy_resource_list_right_paren_on_new_line = false
 | 
					 | 
				
			||||||
ij_groovy_resource_list_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_space_after_assert_separator = true
 | 
					 | 
				
			||||||
ij_groovy_space_after_colon = true
 | 
					 | 
				
			||||||
ij_groovy_space_after_comma = true
 | 
					 | 
				
			||||||
ij_groovy_space_after_comma_in_type_arguments = true
 | 
					 | 
				
			||||||
ij_groovy_space_after_for_semicolon = true
 | 
					 | 
				
			||||||
ij_groovy_space_after_quest = true
 | 
					 | 
				
			||||||
ij_groovy_space_after_type_cast = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_annotation_parameter_list = false
 | 
					 | 
				
			||||||
ij_groovy_space_before_array_initializer_left_brace = false
 | 
					 | 
				
			||||||
ij_groovy_space_before_assert_separator = false
 | 
					 | 
				
			||||||
ij_groovy_space_before_catch_keyword = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_catch_left_brace = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_catch_parentheses = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_class_left_brace = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_closure_left_brace = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_colon = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_comma = false
 | 
					 | 
				
			||||||
ij_groovy_space_before_do_left_brace = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_else_keyword = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_else_left_brace = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_finally_keyword = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_finally_left_brace = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_for_left_brace = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_for_parentheses = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_for_semicolon = false
 | 
					 | 
				
			||||||
ij_groovy_space_before_if_left_brace = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_if_parentheses = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_method_call_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_space_before_method_left_brace = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_method_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_space_before_quest = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_switch_left_brace = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_switch_parentheses = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_synchronized_left_brace = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_synchronized_parentheses = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_try_left_brace = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_try_parentheses = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_while_keyword = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_while_left_brace = true
 | 
					 | 
				
			||||||
ij_groovy_space_before_while_parentheses = true
 | 
					 | 
				
			||||||
ij_groovy_space_in_named_argument = true
 | 
					 | 
				
			||||||
ij_groovy_space_in_named_argument_before_colon = false
 | 
					 | 
				
			||||||
ij_groovy_space_within_empty_array_initializer_braces = false
 | 
					 | 
				
			||||||
ij_groovy_space_within_empty_method_call_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_around_additive_operators = true
 | 
					 | 
				
			||||||
ij_groovy_spaces_around_assignment_operators = true
 | 
					 | 
				
			||||||
ij_groovy_spaces_around_bitwise_operators = true
 | 
					 | 
				
			||||||
ij_groovy_spaces_around_equality_operators = true
 | 
					 | 
				
			||||||
ij_groovy_spaces_around_lambda_arrow = true
 | 
					 | 
				
			||||||
ij_groovy_spaces_around_logical_operators = true
 | 
					 | 
				
			||||||
ij_groovy_spaces_around_multiplicative_operators = true
 | 
					 | 
				
			||||||
ij_groovy_spaces_around_regex_operators = true
 | 
					 | 
				
			||||||
ij_groovy_spaces_around_relational_operators = true
 | 
					 | 
				
			||||||
ij_groovy_spaces_around_shift_operators = true
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_annotation_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_array_initializer_braces = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_braces = true
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_brackets = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_cast_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_catch_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_for_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_gstring_injection_braces = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_if_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_list_or_map = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_method_call_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_method_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_switch_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_synchronized_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_try_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_tuple_expression = false
 | 
					 | 
				
			||||||
ij_groovy_spaces_within_while_parentheses = false
 | 
					 | 
				
			||||||
ij_groovy_special_else_if_treatment = true
 | 
					 | 
				
			||||||
ij_groovy_ternary_operation_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_throws_keyword_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_throws_list_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_use_flying_geese_braces = false
 | 
					 | 
				
			||||||
ij_groovy_use_fq_class_names = false
 | 
					 | 
				
			||||||
ij_groovy_use_fq_class_names_in_javadoc = true
 | 
					 | 
				
			||||||
ij_groovy_use_relative_indents = false
 | 
					 | 
				
			||||||
ij_groovy_use_single_class_imports = true
 | 
					 | 
				
			||||||
ij_groovy_variable_annotation_wrap = off
 | 
					 | 
				
			||||||
ij_groovy_while_brace_force = never
 | 
					 | 
				
			||||||
ij_groovy_while_on_new_line = false
 | 
					 | 
				
			||||||
ij_groovy_wrap_long_lines = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[{*.gradle.kts, *.kt, *.kts, *.main.kts}]
 | 
					[{*.gradle.kts, *.kt, *.kts, *.main.kts}]
 | 
				
			||||||
ij_kotlin_align_in_columns_case_branch = false
 | 
					ij_kotlin_align_in_columns_case_branch = false
 | 
				
			||||||
ij_kotlin_align_multiline_binary_operation = false
 | 
					ij_kotlin_align_multiline_binary_operation = false
 | 
				
			||||||
@@ -963,7 +336,8 @@ ij_kotlin_wrap_elvis_expressions = 1
 | 
				
			|||||||
ij_kotlin_wrap_expression_body_functions = 0
 | 
					ij_kotlin_wrap_expression_body_functions = 0
 | 
				
			||||||
ij_kotlin_wrap_first_method_in_call_chain = false
 | 
					ij_kotlin_wrap_first_method_in_call_chain = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[{*.har, *.jsb2, *.jsb3, *.json, .babelrc, .eslintrc, .stylelintrc, bowerrc, jest.config, mcmod.info}]
 | 
					
 | 
				
			||||||
 | 
					[*.json]
 | 
				
			||||||
indent_size = 2
 | 
					indent_size = 2
 | 
				
			||||||
ij_json_keep_blank_lines_in_code = 0
 | 
					ij_json_keep_blank_lines_in_code = 0
 | 
				
			||||||
ij_json_keep_indents_on_empty_lines = false
 | 
					ij_json_keep_indents_on_empty_lines = false
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					* text=auto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*.java text
 | 
				
			||||||
 | 
					*.jar binary
 | 
				
			||||||
							
								
								
									
										7
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							@@ -7,8 +7,8 @@ body:
 | 
				
			|||||||
    attributes:
 | 
					    attributes:
 | 
				
			||||||
      value: |
 | 
					      value: |
 | 
				
			||||||
        Thanks for taking the time to fill out this bug report for PlotSquared! Fill out the following form to your best ability to help us fix the problem.
 | 
					        Thanks for taking the time to fill out this bug report for PlotSquared! Fill out the following form to your best ability to help us fix the problem.
 | 
				
			||||||
        Only use this if you're absolutely sure that you found a bug and can reproduce it. For anything else, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.github.io/plotsquared-documentation/).
 | 
					        Only use this if you're absolutely sure that you found a bug and can reproduce it. For anything else, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.gitbook.io/plotsquared/).
 | 
				
			||||||
        Do NOT use the public issue tracker to report security vulnerabilities! They are disclosed using [this](https://forms.gle/btgdRn9yhGtzEiGW8) form!
 | 
					        Do NOT use the public issue tracker to report security vulnerabilities! They are disclosed using [this](https://github.com/IntellectualSites/PlotSquared/security/policy) GitHub form!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - type: dropdown
 | 
					  - type: dropdown
 | 
				
			||||||
    attributes:
 | 
					    attributes:
 | 
				
			||||||
@@ -27,6 +27,9 @@ body:
 | 
				
			|||||||
      description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first.
 | 
					      description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first.
 | 
				
			||||||
      multiple: false
 | 
					      multiple: false
 | 
				
			||||||
      options:
 | 
					      options:
 | 
				
			||||||
 | 
					        - '1.20.2'
 | 
				
			||||||
 | 
					        - '1.20'
 | 
				
			||||||
 | 
					        - '1.19.4'
 | 
				
			||||||
        - '1.19.3'
 | 
					        - '1.19.3'
 | 
				
			||||||
        - '1.19.2'
 | 
					        - '1.19.2'
 | 
				
			||||||
        - '1.19.1'
 | 
					        - '1.19.1'
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.github/ISSUE_TEMPLATE/config.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/ISSUE_TEMPLATE/config.yml
									
									
									
									
										vendored
									
									
								
							@@ -4,5 +4,5 @@ contact_links:
 | 
				
			|||||||
    url: https://discord.gg/intellectualsites
 | 
					    url: https://discord.gg/intellectualsites
 | 
				
			||||||
    about: Our support Discord, please ask questions and seek support here.
 | 
					    about: Our support Discord, please ask questions and seek support here.
 | 
				
			||||||
  - name: PlotSquared Wiki
 | 
					  - name: PlotSquared Wiki
 | 
				
			||||||
    url: https://intellectualsites.github.io/plotsquared-documentation/
 | 
					    url: https://intellectualsites.gitbook.io/plotsquared/
 | 
				
			||||||
    about: Take a look at the wiki page for instructions how to setup PlotSquared and use its commands.
 | 
					    about: Take a look at the wiki page for instructions how to setup PlotSquared and use its commands.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.github/ISSUE_TEMPLATE/feature_request.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/ISSUE_TEMPLATE/feature_request.yml
									
									
									
									
										vendored
									
									
								
							@@ -7,7 +7,7 @@ body:
 | 
				
			|||||||
    attributes:
 | 
					    attributes:
 | 
				
			||||||
      value: |
 | 
					      value: |
 | 
				
			||||||
        Thanks for taking the time to fill out this feature request for PlotSquared! Fill out the following form to your best ability to help us understand your feature request and greately improve the change of it getting added.
 | 
					        Thanks for taking the time to fill out this feature request for PlotSquared! Fill out the following form to your best ability to help us understand your feature request and greately improve the change of it getting added.
 | 
				
			||||||
        For anything else than a feature request, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.github.io/plotsquared-documentation/).
 | 
					        For anything else than a feature request, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.gitbook.io/plotsquared/).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - type: textarea
 | 
					  - type: textarea
 | 
				
			||||||
    attributes:
 | 
					    attributes:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										19
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
 | 
				
			||||||
 | 
					  "extends": [
 | 
				
			||||||
 | 
					    "config:base",
 | 
				
			||||||
 | 
					    ":semanticCommitsDisabled"
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "automerge": true,
 | 
				
			||||||
 | 
					  "labels": [
 | 
				
			||||||
 | 
					    "dependencies"
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "rebaseWhen": "conflicted",
 | 
				
			||||||
 | 
					  "schedule": ["on the first day of the month"],
 | 
				
			||||||
 | 
					  "ignoreDeps": [
 | 
				
			||||||
 | 
					    "com.google.code.gson:gson",
 | 
				
			||||||
 | 
					    "com.google.guava:guava",
 | 
				
			||||||
 | 
					    "org.yaml:snakeyaml",
 | 
				
			||||||
 | 
					    "org.apache.logging.log4j:log4j-api",
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,8 +1,7 @@
 | 
				
			|||||||
name: Announce release on discord
 | 
					name: Announce release on discord
 | 
				
			||||||
on:
 | 
					on:
 | 
				
			||||||
  release:
 | 
					  release:
 | 
				
			||||||
    types: [published]
 | 
					    types: [ published ]
 | 
				
			||||||
 | 
					 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  send_announcement:
 | 
					  send_announcement:
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										22
									
								
								.github/workflows/build-pr.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								.github/workflows/build-pr.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					name: Build PR
 | 
				
			||||||
 | 
					on: [ pull_request ]
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  build_pr:
 | 
				
			||||||
 | 
					    if: github.repository_owner == 'IntellectualSites'
 | 
				
			||||||
 | 
					    runs-on: ${{ matrix.os }}
 | 
				
			||||||
 | 
					    strategy:
 | 
				
			||||||
 | 
					      matrix:
 | 
				
			||||||
 | 
					        os: [ ubuntu-latest, windows-latest, macos-latest ]
 | 
				
			||||||
 | 
					        jdk: [ 17, 21 ]
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - name: Checkout Repository
 | 
				
			||||||
 | 
					        uses: actions/checkout@v4
 | 
				
			||||||
 | 
					      - name: Validate Gradle Wrapper
 | 
				
			||||||
 | 
					        uses: gradle/wrapper-validation-action@v1
 | 
				
			||||||
 | 
					      - name: Setup Java ${{ matrix.jdk }}
 | 
				
			||||||
 | 
					        uses: actions/setup-java@v3
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          distribution: temurin
 | 
				
			||||||
 | 
					          java-version: ${{ matrix.jdk }}
 | 
				
			||||||
 | 
					      - name: Clean Build
 | 
				
			||||||
 | 
					        run: ./gradlew clean build
 | 
				
			||||||
							
								
								
									
										25
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,15 +1,16 @@
 | 
				
			|||||||
name: build
 | 
					name: build
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
on: [ pull_request, push ]
 | 
					  push:
 | 
				
			||||||
 | 
					    branches:
 | 
				
			||||||
 | 
					      - main
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  build:
 | 
					  build:
 | 
				
			||||||
    if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
 | 
					    if: github.repository_owner == 'IntellectualSites'
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - name: Checkout Repository
 | 
					      - name: Checkout Repository
 | 
				
			||||||
        uses: actions/checkout@v3
 | 
					        uses: actions/checkout@v4
 | 
				
			||||||
      - name: Validate Gradle Wrapper"
 | 
					      - name: Validate Gradle Wrapper
 | 
				
			||||||
        uses: gradle/wrapper-validation-action@v1
 | 
					        uses: gradle/wrapper-validation-action@v1
 | 
				
			||||||
      - name: Setup Java
 | 
					      - name: Setup Java
 | 
				
			||||||
        uses: actions/setup-java@v3
 | 
					        uses: actions/setup-java@v3
 | 
				
			||||||
@@ -27,7 +28,7 @@ jobs:
 | 
				
			|||||||
            echo "STATUS=release" >> $GITHUB_ENV
 | 
					            echo "STATUS=release" >> $GITHUB_ENV
 | 
				
			||||||
          fi
 | 
					          fi
 | 
				
			||||||
      - name: Publish Release
 | 
					      - name: Publish Release
 | 
				
			||||||
        if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v6'}}
 | 
					        if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
 | 
				
			||||||
        run: ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository
 | 
					        run: ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository
 | 
				
			||||||
        env:
 | 
					        env:
 | 
				
			||||||
          ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
 | 
					          ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
 | 
				
			||||||
@@ -35,13 +36,13 @@ jobs:
 | 
				
			|||||||
          ORG_GRADLE_PROJECT_signingKey: ${{ secrets.SIGNING_KEY }}
 | 
					          ORG_GRADLE_PROJECT_signingKey: ${{ secrets.SIGNING_KEY }}
 | 
				
			||||||
          ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.SIGNING_PASSWORD }}
 | 
					          ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.SIGNING_PASSWORD }}
 | 
				
			||||||
      - name: Publish Snapshot
 | 
					      - name: Publish Snapshot
 | 
				
			||||||
        if: ${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v6' }}
 | 
					        if: ${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main' }}
 | 
				
			||||||
        run: ./gradlew publishToSonatype
 | 
					        run: ./gradlew publishToSonatype
 | 
				
			||||||
        env:
 | 
					        env:
 | 
				
			||||||
          ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
 | 
					          ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
 | 
				
			||||||
          ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }}
 | 
					          ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }}
 | 
				
			||||||
      - name: Publish core javadoc
 | 
					      - name: Publish core javadoc
 | 
				
			||||||
        if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v6'}}
 | 
					        if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
 | 
				
			||||||
        uses: cpina/github-action-push-to-another-repository@main
 | 
					        uses: cpina/github-action-push-to-another-repository@main
 | 
				
			||||||
        env:
 | 
					        env:
 | 
				
			||||||
          SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
 | 
					          SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
 | 
				
			||||||
@@ -51,9 +52,9 @@ jobs:
 | 
				
			|||||||
          destination-repository-name: 'plotsquared-javadocs'
 | 
					          destination-repository-name: 'plotsquared-javadocs'
 | 
				
			||||||
          user-email: ${{ secrets.USER_EMAIL }}
 | 
					          user-email: ${{ secrets.USER_EMAIL }}
 | 
				
			||||||
          target-branch: main
 | 
					          target-branch: main
 | 
				
			||||||
          target-directory: core
 | 
					          target-directory: v7/core
 | 
				
			||||||
      - name: Publish bukkit javadoc
 | 
					      - name: Publish bukkit javadoc
 | 
				
			||||||
        if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v6'}}
 | 
					        if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
 | 
				
			||||||
        uses: cpina/github-action-push-to-another-repository@main
 | 
					        uses: cpina/github-action-push-to-another-repository@main
 | 
				
			||||||
        env:
 | 
					        env:
 | 
				
			||||||
          SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
 | 
					          SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
 | 
				
			||||||
@@ -63,4 +64,4 @@ jobs:
 | 
				
			|||||||
          destination-repository-name: 'plotsquared-javadocs'
 | 
					          destination-repository-name: 'plotsquared-javadocs'
 | 
				
			||||||
          user-email: ${{ secrets.USER_EMAIL }}
 | 
					          user-email: ${{ secrets.USER_EMAIL }}
 | 
				
			||||||
          target-branch: main
 | 
					          target-branch: main
 | 
				
			||||||
          target-directory: bukkit
 | 
					          target-directory: v7/bukkit
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,11 +1,10 @@
 | 
				
			|||||||
name: "CodeQL"
 | 
					name: "CodeQL"
 | 
				
			||||||
 | 
					 | 
				
			||||||
on:
 | 
					on:
 | 
				
			||||||
  push:
 | 
					  push:
 | 
				
			||||||
    branches: [ v6 ]
 | 
					    branches: [ main ]
 | 
				
			||||||
  pull_request:
 | 
					  pull_request:
 | 
				
			||||||
    # The branches below must be a subset of the branches above
 | 
					    # The branches below must be a subset of the branches above
 | 
				
			||||||
    branches: [ v6 ]
 | 
					    branches: [ main ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  analyze:
 | 
					  analyze:
 | 
				
			||||||
@@ -15,23 +14,23 @@ jobs:
 | 
				
			|||||||
      actions: read
 | 
					      actions: read
 | 
				
			||||||
      contents: read
 | 
					      contents: read
 | 
				
			||||||
      security-events: write
 | 
					      security-events: write
 | 
				
			||||||
 | 
					 | 
				
			||||||
    strategy:
 | 
					    strategy:
 | 
				
			||||||
      fail-fast: false
 | 
					      fail-fast: false
 | 
				
			||||||
      matrix:
 | 
					      matrix:
 | 
				
			||||||
        language: [ 'java' ]
 | 
					        language: [ 'java' ]
 | 
				
			||||||
 | 
					 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - name: Checkout repository
 | 
					      - name: Checkout repository
 | 
				
			||||||
        uses: actions/checkout@v3
 | 
					        uses: actions/checkout@v4
 | 
				
			||||||
 | 
					      - name: Setup Java
 | 
				
			||||||
 | 
					        uses: actions/setup-java@v3
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          distribution: temurin
 | 
				
			||||||
 | 
					          java-version: 17
 | 
				
			||||||
      - name: Initialize CodeQL
 | 
					      - name: Initialize CodeQL
 | 
				
			||||||
        uses: github/codeql-action/init@v2
 | 
					        uses: github/codeql-action/init@v2
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          languages: ${{ matrix.language }}
 | 
					          languages: ${{ matrix.language }}
 | 
				
			||||||
 | 
					 | 
				
			||||||
      - name: Autobuild
 | 
					      - name: Autobuild
 | 
				
			||||||
        uses: github/codeql-action/autobuild@v2
 | 
					        uses: github/codeql-action/autobuild@v2
 | 
				
			||||||
 | 
					 | 
				
			||||||
      - name: Perform CodeQL Analysis
 | 
					      - name: Perform CodeQL Analysis
 | 
				
			||||||
        uses: github/codeql-action/analyze@v2
 | 
					        uses: github/codeql-action/analyze@v2
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								.github/workflows/release-drafter.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/release-drafter.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,14 +1,12 @@
 | 
				
			|||||||
name: draft release
 | 
					name: draft release
 | 
				
			||||||
 | 
					 | 
				
			||||||
on:
 | 
					on:
 | 
				
			||||||
  push:
 | 
					  push:
 | 
				
			||||||
    branches:
 | 
					    branches:
 | 
				
			||||||
      - v6
 | 
					      - main
 | 
				
			||||||
  pull_request:
 | 
					  pull_request:
 | 
				
			||||||
    types: [ opened, reopened, synchronize ]
 | 
					    types: [ opened, reopened, synchronize ]
 | 
				
			||||||
  pull_request_target:
 | 
					  pull_request_target:
 | 
				
			||||||
    types: [ opened, reopened, synchronize ]
 | 
					    types: [ opened, reopened, synchronize ]
 | 
				
			||||||
 | 
					 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  update_release_draft:
 | 
					  update_release_draft:
 | 
				
			||||||
    if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
 | 
					    if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -137,3 +137,6 @@ docs/
 | 
				
			|||||||
build/
 | 
					build/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.DS_Store
 | 
					.DS_Store
 | 
				
			||||||
 | 
					# Ignore run folders
 | 
				
			||||||
 | 
					run-[0-9].[0-9][0-9]/
 | 
				
			||||||
 | 
					run-[0-9].[0-9][0-9].[0-9]/
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										154
									
								
								.idea/icon.svg
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										154
									
								
								.idea/icon.svg
									
									
									
										generated
									
									
									
								
							@@ -1,48 +1,144 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
				
			||||||
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" id="svg2" xml:space="preserve" width="4000" height="3333.3333" viewBox="0 0 4000 3333.3333" sodipodi:docname="PlotSquared.ai">
 | 
					<svg
 | 
				
			||||||
		<metadata id="metadata8">
 | 
					   version="1.1"
 | 
				
			||||||
 | 
					   id="svg2"
 | 
				
			||||||
 | 
					   xml:space="preserve"
 | 
				
			||||||
 | 
					   width="512"
 | 
				
			||||||
 | 
					   height="512"
 | 
				
			||||||
 | 
					   viewBox="0 0 512 512.00001"
 | 
				
			||||||
 | 
					   sodipodi:docname="icon.svg"
 | 
				
			||||||
 | 
					   inkscape:version="1.1.2 (b8e25be8, 2022-02-05)"
 | 
				
			||||||
 | 
					   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
				
			||||||
 | 
					   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
				
			||||||
 | 
					   xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
					   xmlns:svg="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
					   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
				
			||||||
 | 
					   xmlns:cc="http://creativecommons.org/ns#"
 | 
				
			||||||
 | 
					   xmlns:dc="http://purl.org/dc/elements/1.1/">
 | 
				
			||||||
 | 
							<metadata
 | 
				
			||||||
 | 
					   id="metadata8">
 | 
				
			||||||
			<rdf:RDF>
 | 
								<rdf:RDF>
 | 
				
			||||||
				<cc:Work rdf:about="">
 | 
									<cc:Work
 | 
				
			||||||
 | 
					   rdf:about="">
 | 
				
			||||||
					<dc:format>image/svg+xml</dc:format>
 | 
										<dc:format>image/svg+xml</dc:format>
 | 
				
			||||||
                    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
					                    <dc:type
 | 
				
			||||||
 | 
					   rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
				
			||||||
				</cc:Work>
 | 
									</cc:Work>
 | 
				
			||||||
			</rdf:RDF>
 | 
								</rdf:RDF>
 | 
				
			||||||
		</metadata>
 | 
							</metadata>
 | 
				
			||||||
    <defs id="defs6">
 | 
					    <defs
 | 
				
			||||||
			<clipPath clipPathUnits="userSpaceOnUse" id="clipPath18">
 | 
					   id="defs6">
 | 
				
			||||||
				<path d="M 0,2500 H 3000 V 0 H 0 Z" id="path16" />
 | 
								<clipPath
 | 
				
			||||||
 | 
					   clipPathUnits="userSpaceOnUse"
 | 
				
			||||||
 | 
					   id="clipPath18">
 | 
				
			||||||
 | 
									<path
 | 
				
			||||||
 | 
					   d="M 0,2500 H 3000 V 0 H 0 Z"
 | 
				
			||||||
 | 
					   id="path16" />
 | 
				
			||||||
			</clipPath>
 | 
								</clipPath>
 | 
				
			||||||
		</defs>
 | 
							</defs>
 | 
				
			||||||
    <sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="640" inkscape:window-height="480" id="namedview4" />
 | 
					    <sodipodi:namedview
 | 
				
			||||||
    <g id="g10" inkscape:groupmode="layer" inkscape:label="PlotSquared" transform="matrix(1.3333333,0,0,-1.3333333,0,3333.3333)">
 | 
					   pagecolor="#ffffff"
 | 
				
			||||||
			<g id="g12">
 | 
					   bordercolor="#666666"
 | 
				
			||||||
				<g id="g14" clip-path="url(#clipPath18)">
 | 
					   borderopacity="1"
 | 
				
			||||||
					<g id="g20" transform="translate(1486.1511,2242.6453)">
 | 
					   objecttolerance="10"
 | 
				
			||||||
						<path d="m 0,0 c 16.533,10.846 33.211,21.453 50.104,31.699 78.972,-48.281 153.985,-102.704 227.269,-159.144 148.61,-115.422 287.884,-243.01 414.393,-382.333 111.39,-122.861 212.751,-255.152 298.898,-396.971 52.744,-87.322 100.544,-177.884 139.514,-272.214 -11.638,-3.551 -23.108,-7.655 -34.362,-12.286 l -0.24,0.288 c -11.135,12.982 -24.141,24.212 -34.915,37.506 -22.557,23.013 -45.425,45.737 -68.03,68.678 -19.725,20.253 -40.601,39.45 -58.958,60.974 -36.355,36.451 -72.517,73.093 -108.944,109.471 -22.628,26.013 -48.064,49.385 -71.965,74.197 -19.029,19.485 -38.706,38.346 -57.519,57.999 -12.166,14.998 -26.684,27.716 -39.93,41.658 -27.668,27.524 -54.903,55.479 -82.571,82.979 -23.924,27.956 -51.664,52.264 -76.692,79.164 -4.68,4.487 -8.855,10.774 -15.886,11.326 -22.34,34.027 -58.311,57.327 -97.377,67.502 -104.312,99.153 -215.487,191.202 -332.661,274.782 -117.942,-83.94 -229.476,-176.781 -334.484,-276.39 -26.684,-0.024 -53.368,0.024 -80.076,-0.024 0.024,-26.564 0.048,-53.104 0,-79.668 -72.229,-73.021 -139.491,-150.937 -202.385,-232.092 -63.758,-82.619 -121.973,-169.51 -173.541,-260.264 131.932,-69.061 257.864,-149.521 375.926,-240.275 0.096,-26.444 -0.12,-52.888 0.096,-79.332 l 0.744,-0.984 c 20.109,-24.14 43.409,-45.233 65.126,-67.861 15.118,-15.382 30.571,-30.404 45.569,-45.881 17.565,-20.733 37.698,-39.042 56.607,-58.503 19.917,-20.781 41.25,-40.218 59.967,-62.151 29.156,-29.299 58.167,-58.815 87.515,-87.922 29.155,-33.043 61.502,-63.111 92.169,-94.738 13.726,-12.67 25.124,-27.571 38.634,-40.457 25.029,-25.365 50.129,-50.657 75.325,-75.853 -37.914,-51.208 -73.741,-103.952 -107.192,-158.183 -167.83,273.317 -397.235,507.305 -662.37,687.158 -81.875,55.335 -167.23,105.584 -255.681,149.641 -52.815,26.276 -106.831,50.248 -162.239,70.381 99.393,233.628 242.795,446.715 410.289,636.79 93.562,106.088 194.634,205.433 301.466,298.13 C -217.335,-155.808 -111.439,-73.789 0,0" style="fill:#062f4c;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path22" />
 | 
					   gridtolerance="10"
 | 
				
			||||||
 | 
					   guidetolerance="10"
 | 
				
			||||||
 | 
					   inkscape:pageopacity="0"
 | 
				
			||||||
 | 
					   inkscape:pageshadow="2"
 | 
				
			||||||
 | 
					   inkscape:window-width="1440"
 | 
				
			||||||
 | 
					   inkscape:window-height="900"
 | 
				
			||||||
 | 
					   id="namedview4"
 | 
				
			||||||
 | 
					   inkscape:pagecheckerboard="0"
 | 
				
			||||||
 | 
					   showgrid="false"
 | 
				
			||||||
 | 
					   inkscape:zoom="0.1632"
 | 
				
			||||||
 | 
					   inkscape:cx="1087.6225"
 | 
				
			||||||
 | 
					   inkscape:cy="1666.6666"
 | 
				
			||||||
 | 
					   inkscape:window-x="0"
 | 
				
			||||||
 | 
					   inkscape:window-y="0"
 | 
				
			||||||
 | 
					   inkscape:window-maximized="0"
 | 
				
			||||||
 | 
					   inkscape:current-layer="g10" />
 | 
				
			||||||
 | 
					    <g
 | 
				
			||||||
 | 
					   id="g10"
 | 
				
			||||||
 | 
					   inkscape:groupmode="layer"
 | 
				
			||||||
 | 
					   inkscape:label="PlotSquared"
 | 
				
			||||||
 | 
					   transform="matrix(1.3333333,0,0,-1.3333333,0,3333.3333)">
 | 
				
			||||||
 | 
								<g
 | 
				
			||||||
 | 
					   id="g12"
 | 
				
			||||||
 | 
					   transform="matrix(0.16955078,0,0,0.16955078,-68.456969,2101.8529)">
 | 
				
			||||||
 | 
									<g
 | 
				
			||||||
 | 
					   id="g14"
 | 
				
			||||||
 | 
					   clip-path="url(#clipPath18)">
 | 
				
			||||||
 | 
										<g
 | 
				
			||||||
 | 
					   id="g20"
 | 
				
			||||||
 | 
					   transform="translate(1486.1511,2242.6453)">
 | 
				
			||||||
 | 
											<path
 | 
				
			||||||
 | 
					   d="m 0,0 c 16.533,10.846 33.211,21.453 50.104,31.699 78.972,-48.281 153.985,-102.704 227.269,-159.144 148.61,-115.422 287.884,-243.01 414.393,-382.333 111.39,-122.861 212.751,-255.152 298.898,-396.971 52.744,-87.322 100.544,-177.884 139.514,-272.214 -11.638,-3.551 -23.108,-7.655 -34.362,-12.286 l -0.24,0.288 c -11.135,12.982 -24.141,24.212 -34.915,37.506 -22.557,23.013 -45.425,45.737 -68.03,68.678 -19.725,20.253 -40.601,39.45 -58.958,60.974 -36.355,36.451 -72.517,73.093 -108.944,109.471 -22.628,26.013 -48.064,49.385 -71.965,74.197 -19.029,19.485 -38.706,38.346 -57.519,57.999 -12.166,14.998 -26.684,27.716 -39.93,41.658 -27.668,27.524 -54.903,55.479 -82.571,82.979 -23.924,27.956 -51.664,52.264 -76.692,79.164 -4.68,4.487 -8.855,10.774 -15.886,11.326 -22.34,34.027 -58.311,57.327 -97.377,67.502 -104.312,99.153 -215.487,191.202 -332.661,274.782 -117.942,-83.94 -229.476,-176.781 -334.484,-276.39 -26.684,-0.024 -53.368,0.024 -80.076,-0.024 0.024,-26.564 0.048,-53.104 0,-79.668 -72.229,-73.021 -139.491,-150.937 -202.385,-232.092 -63.758,-82.619 -121.973,-169.51 -173.541,-260.264 131.932,-69.061 257.864,-149.521 375.926,-240.275 0.096,-26.444 -0.12,-52.888 0.096,-79.332 l 0.744,-0.984 c 20.109,-24.14 43.409,-45.233 65.126,-67.861 15.118,-15.382 30.571,-30.404 45.569,-45.881 17.565,-20.733 37.698,-39.042 56.607,-58.503 19.917,-20.781 41.25,-40.218 59.967,-62.151 29.156,-29.299 58.167,-58.815 87.515,-87.922 29.155,-33.043 61.502,-63.111 92.169,-94.738 13.726,-12.67 25.124,-27.571 38.634,-40.457 25.029,-25.365 50.129,-50.657 75.325,-75.853 -37.914,-51.208 -73.741,-103.952 -107.192,-158.183 -167.83,273.317 -397.235,507.305 -662.37,687.158 -81.875,55.335 -167.23,105.584 -255.681,149.641 -52.815,26.276 -106.831,50.248 -162.239,70.381 99.393,233.628 242.795,446.715 410.289,636.79 93.562,106.088 194.634,205.433 301.466,298.13 C -217.335,-155.808 -111.439,-73.789 0,0"
 | 
				
			||||||
 | 
					   style="fill:#062f4c;fill-opacity:1;fill-rule:nonzero;stroke:none"
 | 
				
			||||||
 | 
					   id="path22" />
 | 
				
			||||||
					</g>
 | 
										</g>
 | 
				
			||||||
                    <g id="g24" transform="translate(1201.7948,1741.5303)">
 | 
					                    <g
 | 
				
			||||||
						<path d="M 0,0 C 105.008,99.609 216.543,192.45 334.485,276.39 451.659,192.81 562.833,100.76 667.146,1.608 c -34.987,8.83 -71.51,9.718 -107.264,6.431 -41.202,-4.296 -82.907,-19.077 -112.543,-48.953 -33.019,-32.155 -49.456,-77.604 -55.311,-122.501 -28.124,27.908 -56.104,55.983 -84.035,84.083 -2.976,2.976 -6.839,4.823 -10.391,6.911 -19.029,26.348 -45.953,46.673 -76.62,57.495 C 187.555,-2.472 151.513,-0.12 116.166,0 Z" style="fill:#4c8fcc;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path26" />
 | 
					   id="g24"
 | 
				
			||||||
 | 
					   transform="translate(1201.7948,1741.5303)">
 | 
				
			||||||
 | 
											<path
 | 
				
			||||||
 | 
					   d="M 0,0 C 105.008,99.609 216.543,192.45 334.485,276.39 451.659,192.81 562.833,100.76 667.146,1.608 c -34.987,8.83 -71.51,9.718 -107.264,6.431 -41.202,-4.296 -82.907,-19.077 -112.543,-48.953 -33.019,-32.155 -49.456,-77.604 -55.311,-122.501 -28.124,27.908 -56.104,55.983 -84.035,84.083 -2.976,2.976 -6.839,4.823 -10.391,6.911 -19.029,26.348 -45.953,46.673 -76.62,57.495 C 187.555,-2.472 151.513,-0.12 116.166,0 Z"
 | 
				
			||||||
 | 
					   style="fill:#4c8fcc;fill-opacity:1;fill-rule:nonzero;stroke:none"
 | 
				
			||||||
 | 
					   id="path26" />
 | 
				
			||||||
					</g>
 | 
										</g>
 | 
				
			||||||
                    <g id="g28" transform="translate(919.3342,1429.7462)">
 | 
					                    <g
 | 
				
			||||||
						<path d="m 0,0 c 62.894,81.156 130.156,159.072 202.385,232.092 0.048,-244.21 0.024,-488.421 0,-732.631 C 84.323,-409.785 -41.61,-329.325 -173.541,-260.264 -121.973,-169.51 -63.758,-82.619 0,0" style="fill:#4c8fcc;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path30" />
 | 
					   id="g28"
 | 
				
			||||||
 | 
					   transform="translate(919.3342,1429.7462)">
 | 
				
			||||||
 | 
											<path
 | 
				
			||||||
 | 
					   d="m 0,0 c 62.894,81.156 130.156,159.072 202.385,232.092 0.048,-244.21 0.024,-488.421 0,-732.631 C 84.323,-409.785 -41.61,-329.325 -173.541,-260.264 -121.973,-169.51 -63.758,-82.619 0,0"
 | 
				
			||||||
 | 
					   style="fill:#4c8fcc;fill-opacity:1;fill-rule:nonzero;stroke:none"
 | 
				
			||||||
 | 
					   id="path30" />
 | 
				
			||||||
					</g>
 | 
										</g>
 | 
				
			||||||
                    <g id="g32" transform="translate(1649.134,1700.6166)">
 | 
					                    <g
 | 
				
			||||||
						<path d="m 0,0 c 29.635,29.875 71.341,44.657 112.543,48.952 35.754,3.288 72.277,2.4 107.263,-6.431 39.066,-10.174 75.037,-33.474 97.377,-67.501 11.879,-17.661 20.181,-37.411 26.42,-57.687 10.871,-38.802 11.95,-79.356 11.446,-119.358 -44.345,-0.072 -88.69,0.048 -133.035,-0.072 -1.032,30.907 3.263,63.686 -10.175,92.626 -9.526,20.325 -32.107,31.243 -53.751,32.131 -21.453,1.44 -45.065,-4.32 -59.175,-21.597 -12.79,-15.861 -15.382,-37.002 -16.558,-56.655 -1.295,-29.132 3.696,-59.031 17.518,-84.923 16.821,-30.619 39.378,-57.783 64.526,-81.9 31.387,-32.634 67.501,-60.374 97.857,-94.041 27.332,-28.988 51.256,-61.479 68.005,-97.785 20.541,-41.13 26.972,-87.827 25.82,-133.372 -0.912,-32.107 -5.231,-64.406 -16.149,-94.737 -11.59,-31.699 -31.123,-61.047 -58.335,-81.371 -25.124,-19.125 -55.696,-29.852 -86.651,-34.771 -49.552,-6.743 -101.888,-4.847 -148.465,14.854 -35.227,14.829 -64.238,42.689 -81.708,76.548 -20.996,40.242 -27.115,86.339 -27.259,131.212 0.048,17.829 0,35.658 0.048,53.463 44.345,0.048 88.69,-0.023 133.059,0.048 1.728,-35.538 -4.055,-72.06 5.663,-106.807 5.783,-22.173 26.204,-37.794 48.185,-41.754 20.733,-3.431 43.577,-2.015 61.622,9.791 15.502,9.43 23.949,26.78 26.78,44.225 5.903,35.922 1.872,74.293 -15.381,106.688 -16.918,30.595 -39.474,57.711 -64.55,81.899 -33.187,34.099 -71.173,63.254 -102.585,99.081 -26.756,28.867 -49.408,61.646 -65.486,97.641 -24.572,52.48 -26.731,112.422 -20.18,169.102 C -49.456,-77.604 -33.019,-32.155 0,0" style="fill:#feeeee;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path34" />
 | 
					   id="g32"
 | 
				
			||||||
 | 
					   transform="translate(1649.134,1700.6166)">
 | 
				
			||||||
 | 
											<path
 | 
				
			||||||
 | 
					   d="m 0,0 c 29.635,29.875 71.341,44.657 112.543,48.952 35.754,3.288 72.277,2.4 107.263,-6.431 39.066,-10.174 75.037,-33.474 97.377,-67.501 11.879,-17.661 20.181,-37.411 26.42,-57.687 10.871,-38.802 11.95,-79.356 11.446,-119.358 -44.345,-0.072 -88.69,0.048 -133.035,-0.072 -1.032,30.907 3.263,63.686 -10.175,92.626 -9.526,20.325 -32.107,31.243 -53.751,32.131 -21.453,1.44 -45.065,-4.32 -59.175,-21.597 -12.79,-15.861 -15.382,-37.002 -16.558,-56.655 -1.295,-29.132 3.696,-59.031 17.518,-84.923 16.821,-30.619 39.378,-57.783 64.526,-81.9 31.387,-32.634 67.501,-60.374 97.857,-94.041 27.332,-28.988 51.256,-61.479 68.005,-97.785 20.541,-41.13 26.972,-87.827 25.82,-133.372 -0.912,-32.107 -5.231,-64.406 -16.149,-94.737 -11.59,-31.699 -31.123,-61.047 -58.335,-81.371 -25.124,-19.125 -55.696,-29.852 -86.651,-34.771 -49.552,-6.743 -101.888,-4.847 -148.465,14.854 -35.227,14.829 -64.238,42.689 -81.708,76.548 -20.996,40.242 -27.115,86.339 -27.259,131.212 0.048,17.829 0,35.658 0.048,53.463 44.345,0.048 88.69,-0.023 133.059,0.048 1.728,-35.538 -4.055,-72.06 5.663,-106.807 5.783,-22.173 26.204,-37.794 48.185,-41.754 20.733,-3.431 43.577,-2.015 61.622,9.791 15.502,9.43 23.949,26.78 26.78,44.225 5.903,35.922 1.872,74.293 -15.381,106.688 -16.918,30.595 -39.474,57.711 -64.55,81.899 -33.187,34.099 -71.173,63.254 -102.585,99.081 -26.756,28.867 -49.408,61.646 -65.486,97.641 -24.572,52.48 -26.731,112.422 -20.18,169.102 C -49.456,-77.604 -33.019,-32.155 0,0"
 | 
				
			||||||
 | 
					   style="fill:#feeeee;fill-opacity:1;fill-rule:nonzero;stroke:none"
 | 
				
			||||||
 | 
					   id="path34" />
 | 
				
			||||||
					</g>
 | 
										</g>
 | 
				
			||||||
                    <g id="g36" transform="translate(1262.7214,1613.126)">
 | 
					                    <g
 | 
				
			||||||
						<path d="m 0,0 v -301.13 c 23.204,0.024 46.409,-0.048 69.613,0.024 18.525,0.288 38.202,6.575 50.153,21.429 12.43,17.277 13.917,39.522 14.613,60.111 0.024,43.985 -0.048,87.994 0.024,131.979 -0.48,23.637 -0.983,50.369 -17.277,69.23 C 104.864,-5.711 86.867,-0.24 69.589,0 46.385,0.048 23.204,0.024 0,0 m -141.002,128.38 c 26.708,0.048 53.392,0 80.075,0.024 H 55.24 c 35.346,-0.12 71.389,-2.471 104.815,-14.925 30.668,-10.823 57.592,-31.148 76.621,-57.496 26.852,-39.09 36.69,-87.202 38.058,-133.947 0.024,-48.833 0.096,-97.689 -0.024,-146.521 -1.728,-47.993 -11.974,-97.953 -41.514,-136.971 -22.748,-30.644 -57.495,-50.801 -94.281,-59.583 -45.377,-11.878 -92.578,-6.791 -138.891,-7.847 -0.072,-111.799 0,-223.574 -0.024,-335.373 -13.942,0 -27.86,0.024 -41.778,-0.024 -32.802,0.072 -65.605,0 -98.384,0.048 l -0.744,0.984 c -0.216,26.444 0,52.888 -0.096,79.332 0.024,244.211 0.048,488.421 0,732.632 0.048,26.563 0.024,53.103 0,79.667" style="fill:#feeeee;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path38" />
 | 
					   id="g36"
 | 
				
			||||||
 | 
					   transform="translate(1262.7214,1613.126)">
 | 
				
			||||||
 | 
											<path
 | 
				
			||||||
 | 
					   d="m 0,0 v -301.13 c 23.204,0.024 46.409,-0.048 69.613,0.024 18.525,0.288 38.202,6.575 50.153,21.429 12.43,17.277 13.917,39.522 14.613,60.111 0.024,43.985 -0.048,87.994 0.024,131.979 -0.48,23.637 -0.983,50.369 -17.277,69.23 C 104.864,-5.711 86.867,-0.24 69.589,0 46.385,0.048 23.204,0.024 0,0 m -141.002,128.38 c 26.708,0.048 53.392,0 80.075,0.024 H 55.24 c 35.346,-0.12 71.389,-2.471 104.815,-14.925 30.668,-10.823 57.592,-31.148 76.621,-57.496 26.852,-39.09 36.69,-87.202 38.058,-133.947 0.024,-48.833 0.096,-97.689 -0.024,-146.521 -1.728,-47.993 -11.974,-97.953 -41.514,-136.971 -22.748,-30.644 -57.495,-50.801 -94.281,-59.583 -45.377,-11.878 -92.578,-6.791 -138.891,-7.847 -0.072,-111.799 0,-223.574 -0.024,-335.373 -13.942,0 -27.86,0.024 -41.778,-0.024 -32.802,0.072 -65.605,0 -98.384,0.048 l -0.744,0.984 c -0.216,26.444 0,52.888 -0.096,79.332 0.024,244.211 0.048,488.421 0,732.632 0.048,26.563 0.024,53.103 0,79.667"
 | 
				
			||||||
 | 
					   style="fill:#feeeee;fill-opacity:1;fill-rule:nonzero;stroke:none"
 | 
				
			||||||
 | 
					   id="path38" />
 | 
				
			||||||
					</g>
 | 
										</g>
 | 
				
			||||||
                    <g id="g40" transform="translate(1966.3174,1675.6364)">
 | 
					                    <g
 | 
				
			||||||
						<path d="m 0,0 c 7.031,-0.552 11.206,-6.839 15.885,-11.326 25.029,-26.9 52.768,-51.208 76.693,-79.164 27.667,-27.5 54.903,-55.456 82.571,-82.979 13.246,-13.942 27.764,-26.66 39.93,-41.658 18.813,-19.653 38.49,-38.514 57.519,-57.999 23.9,-24.812 49.337,-48.185 71.965,-74.197 36.427,-36.378 72.589,-73.02 108.943,-109.471 18.358,-21.524 39.234,-40.722 58.959,-60.974 22.605,-22.941 45.473,-45.665 68.03,-68.678 10.774,-13.294 23.78,-24.524 34.914,-37.506 -103.904,-41.97 -203.488,-94.114 -298.922,-152.761 -246.994,-152.28 -466.224,-350.298 -639.333,-583.398 -25.197,25.196 -50.297,50.488 -75.325,75.852 -13.51,12.886 -24.908,27.788 -38.634,40.458 -30.667,31.627 -63.014,61.695 -92.17,94.738 -29.347,29.107 -58.359,58.623 -87.514,87.922 -18.717,21.933 -40.05,41.37 -59.967,62.151 -18.909,19.461 -39.042,37.77 -56.607,58.503 -14.998,15.477 -30.452,30.499 -45.569,45.88 -21.717,22.629 -45.017,43.722 -65.126,67.862 32.779,-0.048 65.582,0.024 98.384,-0.048 114.391,-98.097 220.407,-205.984 315.384,-322.99 92.914,114.318 196.242,220.022 307.753,316.271 30.955,4.919 61.526,15.646 86.65,34.771 27.212,20.325 46.745,49.672 58.335,81.371 107.312,77.988 219.327,149.929 337.509,210.376 -35.299,64.67 -75.829,126.437 -118.254,186.643 C 176.253,-228.037 104.24,-140.115 26.42,-57.687 20.181,-37.41 11.878,-17.661 0,0" style="fill:#042338;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path42" />
 | 
					   id="g40"
 | 
				
			||||||
 | 
					   transform="translate(1966.3174,1675.6364)">
 | 
				
			||||||
 | 
											<path
 | 
				
			||||||
 | 
					   d="m 0,0 c 7.031,-0.552 11.206,-6.839 15.885,-11.326 25.029,-26.9 52.768,-51.208 76.693,-79.164 27.667,-27.5 54.903,-55.456 82.571,-82.979 13.246,-13.942 27.764,-26.66 39.93,-41.658 18.813,-19.653 38.49,-38.514 57.519,-57.999 23.9,-24.812 49.337,-48.185 71.965,-74.197 36.427,-36.378 72.589,-73.02 108.943,-109.471 18.358,-21.524 39.234,-40.722 58.959,-60.974 22.605,-22.941 45.473,-45.665 68.03,-68.678 10.774,-13.294 23.78,-24.524 34.914,-37.506 -103.904,-41.97 -203.488,-94.114 -298.922,-152.761 -246.994,-152.28 -466.224,-350.298 -639.333,-583.398 -25.197,25.196 -50.297,50.488 -75.325,75.852 -13.51,12.886 -24.908,27.788 -38.634,40.458 -30.667,31.627 -63.014,61.695 -92.17,94.738 -29.347,29.107 -58.359,58.623 -87.514,87.922 -18.717,21.933 -40.05,41.37 -59.967,62.151 -18.909,19.461 -39.042,37.77 -56.607,58.503 -14.998,15.477 -30.452,30.499 -45.569,45.88 -21.717,22.629 -45.017,43.722 -65.126,67.862 32.779,-0.048 65.582,0.024 98.384,-0.048 114.391,-98.097 220.407,-205.984 315.384,-322.99 92.914,114.318 196.242,220.022 307.753,316.271 30.955,4.919 61.526,15.646 86.65,34.771 27.212,20.325 46.745,49.672 58.335,81.371 107.312,77.988 219.327,149.929 337.509,210.376 -35.299,64.67 -75.829,126.437 -118.254,186.643 C 176.253,-228.037 104.24,-140.115 26.42,-57.687 20.181,-37.41 11.878,-17.661 0,0"
 | 
				
			||||||
 | 
					   style="fill:#042338;fill-opacity:1;fill-rule:nonzero;stroke:none"
 | 
				
			||||||
 | 
					   id="path42" />
 | 
				
			||||||
					</g>
 | 
										</g>
 | 
				
			||||||
                    <g id="g44" transform="translate(1499.3971,1669.1094)">
 | 
					                    <g
 | 
				
			||||||
						<path d="m 0,0 c 3.551,-2.088 7.415,-3.935 10.39,-6.911 27.932,-28.1 55.912,-56.175 84.036,-84.083 -6.551,-56.679 -4.392,-116.622 20.18,-169.102 16.078,-35.994 38.73,-68.774 65.486,-97.641 31.412,-35.826 69.398,-64.982 102.585,-99.081 25.076,-24.188 47.632,-51.304 64.55,-81.899 17.253,-32.395 21.284,-70.765 15.381,-106.688 -2.831,-17.445 -11.278,-34.794 -26.78,-44.225 -18.045,-11.806 -40.889,-13.222 -61.622,-9.79 -21.981,3.959 -42.402,19.58 -48.185,41.753 -9.718,34.747 -3.935,71.269 -5.663,106.808 -44.369,-0.072 -88.714,0 -133.059,-0.048 -0.048,-17.806 0,-35.635 -0.048,-53.464 0.144,-44.873 6.263,-90.97 27.259,-131.212 17.47,-33.859 46.481,-61.718 81.708,-76.548 46.577,-19.701 98.913,-21.597 148.465,-14.854 -111.511,-96.249 -214.839,-201.953 -307.753,-316.271 -94.977,117.006 -200.993,224.893 -315.383,322.99 13.918,0.048 27.836,0.024 41.777,0.024 0.024,111.799 -0.048,223.574 0.024,335.372 46.313,1.056 93.514,-4.031 138.891,7.847 36.786,8.783 71.533,28.94 94.282,59.583 29.539,39.018 39.785,88.978 41.513,136.971 0.12,48.833 0.048,97.689 0.024,146.522 C 36.69,-87.203 26.852,-39.09 0,0" style="fill:#1c72ba;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path46" />
 | 
					   id="g44"
 | 
				
			||||||
 | 
					   transform="translate(1499.3971,1669.1094)">
 | 
				
			||||||
 | 
											<path
 | 
				
			||||||
 | 
					   d="m 0,0 c 3.551,-2.088 7.415,-3.935 10.39,-6.911 27.932,-28.1 55.912,-56.175 84.036,-84.083 -6.551,-56.679 -4.392,-116.622 20.18,-169.102 16.078,-35.994 38.73,-68.774 65.486,-97.641 31.412,-35.826 69.398,-64.982 102.585,-99.081 25.076,-24.188 47.632,-51.304 64.55,-81.899 17.253,-32.395 21.284,-70.765 15.381,-106.688 -2.831,-17.445 -11.278,-34.794 -26.78,-44.225 -18.045,-11.806 -40.889,-13.222 -61.622,-9.79 -21.981,3.959 -42.402,19.58 -48.185,41.753 -9.718,34.747 -3.935,71.269 -5.663,106.808 -44.369,-0.072 -88.714,0 -133.059,-0.048 -0.048,-17.806 0,-35.635 -0.048,-53.464 0.144,-44.873 6.263,-90.97 27.259,-131.212 17.47,-33.859 46.481,-61.718 81.708,-76.548 46.577,-19.701 98.913,-21.597 148.465,-14.854 -111.511,-96.249 -214.839,-201.953 -307.753,-316.271 -94.977,117.006 -200.993,224.893 -315.383,322.99 13.918,0.048 27.836,0.024 41.777,0.024 0.024,111.799 -0.048,223.574 0.024,335.372 46.313,1.056 93.514,-4.031 138.891,7.847 36.786,8.783 71.533,28.94 94.282,59.583 29.539,39.018 39.785,88.978 41.513,136.971 0.12,48.833 0.048,97.689 0.024,146.522 C 36.69,-87.203 26.852,-39.09 0,0"
 | 
				
			||||||
 | 
					   style="fill:#1c72ba;fill-opacity:1;fill-rule:nonzero;stroke:none"
 | 
				
			||||||
 | 
					   id="path46" />
 | 
				
			||||||
					</g>
 | 
										</g>
 | 
				
			||||||
                    <g id="g48" transform="translate(1748.0469,1601.6797)">
 | 
					                    <g
 | 
				
			||||||
						<path d="M 0,0 C 14.11,17.277 37.722,23.036 59.175,21.597 80.82,20.709 103.4,9.791 112.927,-10.534 c 13.438,-28.94 9.142,-61.719 10.174,-92.626 44.345,0.12 88.691,0 133.036,0.072 0.504,40.002 -0.576,80.556 -11.447,119.358 77.82,-82.428 149.833,-170.35 215.583,-262.664 42.426,-60.207 82.956,-121.973 118.254,-186.643 -118.182,-60.447 -230.196,-132.388 -337.508,-210.376 10.918,30.331 15.238,62.63 16.149,94.737 1.152,45.545 -5.279,92.242 -25.82,133.372 -16.749,36.306 -40.673,68.797 -68.005,97.785 -30.355,33.667 -66.47,61.406 -97.857,94.041 -25.148,24.117 -47.705,51.28 -64.526,81.9 -13.822,25.892 -18.813,55.791 -17.517,84.923 C -15.382,-37.002 -12.79,-15.862 0,0" style="fill:#1c72ba;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path50" />
 | 
					   id="g48"
 | 
				
			||||||
 | 
					   transform="translate(1748.0469,1601.6797)">
 | 
				
			||||||
 | 
											<path
 | 
				
			||||||
 | 
					   d="M 0,0 C 14.11,17.277 37.722,23.036 59.175,21.597 80.82,20.709 103.4,9.791 112.927,-10.534 c 13.438,-28.94 9.142,-61.719 10.174,-92.626 44.345,0.12 88.691,0 133.036,0.072 0.504,40.002 -0.576,80.556 -11.447,119.358 77.82,-82.428 149.833,-170.35 215.583,-262.664 42.426,-60.207 82.956,-121.973 118.254,-186.643 -118.182,-60.447 -230.196,-132.388 -337.508,-210.376 10.918,30.331 15.238,62.63 16.149,94.737 1.152,45.545 -5.279,92.242 -25.82,133.372 -16.749,36.306 -40.673,68.797 -68.005,97.785 -30.355,33.667 -66.47,61.406 -97.857,94.041 -25.148,24.117 -47.705,51.28 -64.526,81.9 -13.822,25.892 -18.813,55.791 -17.517,84.923 C -15.382,-37.002 -12.79,-15.862 0,0"
 | 
				
			||||||
 | 
					   style="fill:#1c72ba;fill-opacity:1;fill-rule:nonzero;stroke:none"
 | 
				
			||||||
 | 
					   id="path50" />
 | 
				
			||||||
					</g>
 | 
										</g>
 | 
				
			||||||
                    <g id="g52" transform="translate(1262.7214,1613.126)">
 | 
					                    <g
 | 
				
			||||||
						<path d="m 0,0 c 23.204,0.024 46.385,0.048 69.589,0 17.278,-0.24 35.275,-5.711 47.537,-18.357 16.294,-18.861 16.797,-45.593 17.277,-69.23 -0.072,-43.985 0,-87.994 -0.024,-131.979 -0.696,-20.589 -2.183,-42.834 -14.613,-60.111 -11.951,-14.854 -31.628,-21.141 -50.153,-21.429 -23.204,-0.072 -46.409,0 -69.613,-0.024 z" style="fill:#1c72ba;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path54" />
 | 
					   id="g52"
 | 
				
			||||||
 | 
					   transform="translate(1262.7214,1613.126)">
 | 
				
			||||||
 | 
											<path
 | 
				
			||||||
 | 
					   d="m 0,0 c 23.204,0.024 46.385,0.048 69.589,0 17.278,-0.24 35.275,-5.711 47.537,-18.357 16.294,-18.861 16.797,-45.593 17.277,-69.23 -0.072,-43.985 0,-87.994 -0.024,-131.979 -0.696,-20.589 -2.183,-42.834 -14.613,-60.111 -11.951,-14.854 -31.628,-21.141 -50.153,-21.429 -23.204,-0.072 -46.409,0 -69.613,-0.024 z"
 | 
				
			||||||
 | 
					   style="fill:#1c72ba;fill-opacity:1;fill-rule:nonzero;stroke:none"
 | 
				
			||||||
 | 
					   id="path54" />
 | 
				
			||||||
					</g>
 | 
										</g>
 | 
				
			||||||
				</g>
 | 
									</g>
 | 
				
			||||||
			</g>
 | 
								</g>
 | 
				
			||||||
 
 | 
				
			|||||||
| 
		 Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 12 KiB  | 
@@ -18,23 +18,23 @@ repositories {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dependencies {
 | 
					dependencies {
 | 
				
			||||||
    api(projects.plotSquaredCore)
 | 
					    api(projects.plotsquaredCore)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Metrics
 | 
					    // Metrics
 | 
				
			||||||
    implementation("org.bstats:bstats-bukkit")
 | 
					    implementation(libs.bstatsBukkit)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Paper
 | 
					    // Paper
 | 
				
			||||||
    compileOnly("io.papermc.paper:paper-api")
 | 
					    compileOnly(libs.paper)
 | 
				
			||||||
    implementation("io.papermc:paperlib")
 | 
					    implementation(libs.paperlib)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Plugins
 | 
					    // Plugins
 | 
				
			||||||
    compileOnly(libs.worldeditBukkit) {
 | 
					    compileOnly(libs.worldeditBukkit) {
 | 
				
			||||||
        exclude(group = "org.bukkit")
 | 
					        exclude(group = "org.bukkit")
 | 
				
			||||||
        exclude(group = "org.spigotmc")
 | 
					        exclude(group = "org.spigotmc")
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false }
 | 
					    compileOnly(libs.faweBukkit) { isTransitive = false }
 | 
				
			||||||
    testImplementation("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false }
 | 
					    testImplementation(libs.faweBukkit) { isTransitive = false }
 | 
				
			||||||
    compileOnly("com.github.MilkBowl:VaultAPI") {
 | 
					    compileOnly(libs.vault) {
 | 
				
			||||||
        exclude(group = "org.bukkit")
 | 
					        exclude(group = "org.bukkit")
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    compileOnly(libs.placeholderapi)
 | 
					    compileOnly(libs.placeholderapi)
 | 
				
			||||||
@@ -44,16 +44,15 @@ dependencies {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Other libraries
 | 
					    // Other libraries
 | 
				
			||||||
    implementation(libs.squirrelid) { isTransitive = false }
 | 
					    implementation(libs.squirrelid) { isTransitive = false }
 | 
				
			||||||
    implementation("dev.notmyfault.serverlib:ServerLib")
 | 
					    implementation(libs.serverlib)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Our libraries
 | 
					    // Our libraries
 | 
				
			||||||
    implementation(libs.arkitektonika)
 | 
					    implementation(libs.arkitektonika)
 | 
				
			||||||
    implementation(libs.http4j)
 | 
					    implementation(libs.paster)
 | 
				
			||||||
    implementation("com.intellectualsites.paster:Paster")
 | 
					    implementation(libs.informativeAnnotations)
 | 
				
			||||||
    implementation("com.intellectualsites.informative-annotations:informative-annotations")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Adventure
 | 
					    // Adventure
 | 
				
			||||||
    implementation("net.kyori:adventure-platform-bukkit")
 | 
					    implementation(libs.adventureBukkit)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tasks.processResources {
 | 
					tasks.processResources {
 | 
				
			||||||
@@ -63,6 +62,7 @@ tasks.processResources {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tasks.named<ShadowJar>("shadowJar") {
 | 
					tasks.named<ShadowJar>("shadowJar") {
 | 
				
			||||||
 | 
					    dependsOn(":plotsquared-core:shadowJar")
 | 
				
			||||||
    dependencies {
 | 
					    dependencies {
 | 
				
			||||||
        exclude(dependency("org.checkerframework:"))
 | 
					        exclude(dependency("org.checkerframework:"))
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -88,7 +88,7 @@ tasks.named<ShadowJar>("shadowJar") {
 | 
				
			|||||||
    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("net.jcip", "com.plotsquared.core.annotations.jcip")
 | 
				
			||||||
    relocate("edu.umd.cs.findbugs", "com.plotsquared.core.annotations.findbugs")
 | 
					    relocate("edu.umd.cs.findbugs", "com.plotsquared.core.annotations.findbugs")
 | 
				
			||||||
    relocate("com.intellectualsites.informative-annotations", "com.plotsquared.core.annotation.informative")
 | 
					    relocate("com.intellectualsites.annotations", "com.plotsquared.core.annotations.informative")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Get rid of all the libs which are 100% unused.
 | 
					    // Get rid of all the libs which are 100% unused.
 | 
				
			||||||
    minimize()
 | 
					    minimize()
 | 
				
			||||||
@@ -98,13 +98,19 @@ tasks.named<ShadowJar>("shadowJar") {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
tasks {
 | 
					tasks {
 | 
				
			||||||
    withType<Javadoc> {
 | 
					    withType<Javadoc> {
 | 
				
			||||||
 | 
					        val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
 | 
				
			||||||
        val opt = options as StandardJavadocDocletOptions
 | 
					        val opt = options as StandardJavadocDocletOptions
 | 
				
			||||||
        opt.links("https://jd.papermc.io/paper/1.18/")
 | 
					        opt.links("https://jd.papermc.io/paper/1.20/")
 | 
				
			||||||
        opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
 | 
					        opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
 | 
				
			||||||
        opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/")
 | 
					        opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/")
 | 
				
			||||||
        opt.links("https://jd.adventure.kyori.net/api/4.9.3/")
 | 
					        opt.links("https://jd.advntr.dev/api/4.14.0/")
 | 
				
			||||||
        opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
 | 
					        opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
 | 
				
			||||||
        opt.links("https://checkerframework.org/api/")
 | 
					        opt.links("https://checkerframework.org/api/")
 | 
				
			||||||
 | 
					        opt.isLinkSource = true
 | 
				
			||||||
 | 
					        opt.bottom(File("$rootDir/javadocfooter.html").readText())
 | 
				
			||||||
 | 
					        opt.isUse = true
 | 
				
			||||||
        opt.encoding("UTF-8")
 | 
					        opt.encoding("UTF-8")
 | 
				
			||||||
 | 
					        opt.keyWords()
 | 
				
			||||||
 | 
					        opt.addStringOption("-since", isRelease)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,7 +36,6 @@ import com.plotsquared.bukkit.listener.ChunkListener;
 | 
				
			|||||||
import com.plotsquared.bukkit.listener.EntityEventListener;
 | 
					import com.plotsquared.bukkit.listener.EntityEventListener;
 | 
				
			||||||
import com.plotsquared.bukkit.listener.EntitySpawnListener;
 | 
					import com.plotsquared.bukkit.listener.EntitySpawnListener;
 | 
				
			||||||
import com.plotsquared.bukkit.listener.PaperListener;
 | 
					import com.plotsquared.bukkit.listener.PaperListener;
 | 
				
			||||||
import com.plotsquared.bukkit.listener.PaperListener113;
 | 
					 | 
				
			||||||
import com.plotsquared.bukkit.listener.PlayerEventListener;
 | 
					import com.plotsquared.bukkit.listener.PlayerEventListener;
 | 
				
			||||||
import com.plotsquared.bukkit.listener.ProjectileEventListener;
 | 
					import com.plotsquared.bukkit.listener.ProjectileEventListener;
 | 
				
			||||||
import com.plotsquared.bukkit.listener.ServerListener;
 | 
					import com.plotsquared.bukkit.listener.ServerListener;
 | 
				
			||||||
@@ -50,6 +49,7 @@ import com.plotsquared.bukkit.player.BukkitPlayerManager;
 | 
				
			|||||||
import com.plotsquared.bukkit.util.BukkitUtil;
 | 
					import com.plotsquared.bukkit.util.BukkitUtil;
 | 
				
			||||||
import com.plotsquared.bukkit.util.BukkitWorld;
 | 
					import com.plotsquared.bukkit.util.BukkitWorld;
 | 
				
			||||||
import com.plotsquared.bukkit.util.SetGenCB;
 | 
					import com.plotsquared.bukkit.util.SetGenCB;
 | 
				
			||||||
 | 
					import com.plotsquared.bukkit.util.TranslationUpdateManager;
 | 
				
			||||||
import com.plotsquared.bukkit.util.UpdateUtility;
 | 
					import com.plotsquared.bukkit.util.UpdateUtility;
 | 
				
			||||||
import com.plotsquared.bukkit.util.task.BukkitTaskManager;
 | 
					import com.plotsquared.bukkit.util.task.BukkitTaskManager;
 | 
				
			||||||
import com.plotsquared.bukkit.util.task.PaperTimeConverter;
 | 
					import com.plotsquared.bukkit.util.task.PaperTimeConverter;
 | 
				
			||||||
@@ -72,6 +72,8 @@ import com.plotsquared.core.configuration.Storage;
 | 
				
			|||||||
import com.plotsquared.core.configuration.caption.ChatFormatter;
 | 
					import com.plotsquared.core.configuration.caption.ChatFormatter;
 | 
				
			||||||
import com.plotsquared.core.configuration.file.YamlConfiguration;
 | 
					import com.plotsquared.core.configuration.file.YamlConfiguration;
 | 
				
			||||||
import com.plotsquared.core.database.DBFunc;
 | 
					import com.plotsquared.core.database.DBFunc;
 | 
				
			||||||
 | 
					import com.plotsquared.core.events.RemoveRoadEntityEvent;
 | 
				
			||||||
 | 
					import com.plotsquared.core.events.Result;
 | 
				
			||||||
import com.plotsquared.core.generator.GeneratorWrapper;
 | 
					import com.plotsquared.core.generator.GeneratorWrapper;
 | 
				
			||||||
import com.plotsquared.core.generator.IndependentPlotGenerator;
 | 
					import com.plotsquared.core.generator.IndependentPlotGenerator;
 | 
				
			||||||
import com.plotsquared.core.generator.SingleWorldGenerator;
 | 
					import com.plotsquared.core.generator.SingleWorldGenerator;
 | 
				
			||||||
@@ -110,6 +112,7 @@ import com.plotsquared.core.uuid.CacheUUIDService;
 | 
				
			|||||||
import com.plotsquared.core.uuid.UUIDPipeline;
 | 
					import com.plotsquared.core.uuid.UUIDPipeline;
 | 
				
			||||||
import com.plotsquared.core.uuid.offline.OfflineModeUUIDService;
 | 
					import com.plotsquared.core.uuid.offline.OfflineModeUUIDService;
 | 
				
			||||||
import com.sk89q.worldedit.WorldEdit;
 | 
					import com.sk89q.worldedit.WorldEdit;
 | 
				
			||||||
 | 
					import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
				
			||||||
import io.papermc.lib.PaperLib;
 | 
					import io.papermc.lib.PaperLib;
 | 
				
			||||||
import net.kyori.adventure.audience.Audience;
 | 
					import net.kyori.adventure.audience.Audience;
 | 
				
			||||||
import net.kyori.adventure.text.Component;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
@@ -138,6 +141,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
 | 
				
			|||||||
import org.incendo.serverlib.ServerLib;
 | 
					import org.incendo.serverlib.ServerLib;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.File;
 | 
					import java.io.File;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
import java.lang.reflect.Method;
 | 
					import java.lang.reflect.Method;
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
import java.util.Arrays;
 | 
					import java.util.Arrays;
 | 
				
			||||||
@@ -248,6 +252,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
 | 
					    @SuppressWarnings("deprecation") // Paper deprecation
 | 
				
			||||||
    public void onEnable() {
 | 
					    public void onEnable() {
 | 
				
			||||||
        this.pluginName = getDescription().getName();
 | 
					        this.pluginName = getDescription().getName();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -291,6 +296,12 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
                );
 | 
					                );
 | 
				
			||||||
        this.injector.injectMembers(this);
 | 
					        this.injector.injectMembers(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            this.injector.getInstance(TranslationUpdateManager.class).upgradeTranslationFile();
 | 
				
			||||||
 | 
					        } catch (IOException e) {
 | 
				
			||||||
 | 
					            throw new RuntimeException(e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.serverLocale = Locale.forLanguageTag(Settings.Enabled_Components.DEFAULT_LOCALE);
 | 
					        this.serverLocale = Locale.forLanguageTag(Settings.Enabled_Components.DEFAULT_LOCALE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) {
 | 
					        if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) {
 | 
				
			||||||
@@ -356,11 +367,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
            getServer().getPluginManager().registerEvents(injector().getInstance(ServerListener.class), this);
 | 
					            getServer().getPluginManager().registerEvents(injector().getInstance(ServerListener.class), this);
 | 
				
			||||||
            getServer().getPluginManager().registerEvents(injector().getInstance(EntitySpawnListener.class), this);
 | 
					            getServer().getPluginManager().registerEvents(injector().getInstance(EntitySpawnListener.class), this);
 | 
				
			||||||
            if (PaperLib.isPaper() && Settings.Paper_Components.PAPER_LISTENERS) {
 | 
					            if (PaperLib.isPaper() && Settings.Paper_Components.PAPER_LISTENERS) {
 | 
				
			||||||
                if (serverVersion()[1] == 13) {
 | 
					 | 
				
			||||||
                    getServer().getPluginManager().registerEvents(injector().getInstance(PaperListener113.class), this);
 | 
					 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                getServer().getPluginManager().registerEvents(injector().getInstance(PaperListener.class), this);
 | 
					                getServer().getPluginManager().registerEvents(injector().getInstance(PaperListener.class), this);
 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                getServer().getPluginManager().registerEvents(injector().getInstance(SpigotListener.class), this);
 | 
					                getServer().getPluginManager().registerEvents(injector().getInstance(SpigotListener.class), this);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -544,7 +551,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
        this.startMetrics();
 | 
					        this.startMetrics();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (Settings.Enabled_Components.WORLDS) {
 | 
					        if (Settings.Enabled_Components.WORLDS) {
 | 
				
			||||||
            TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(1L));
 | 
					            TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(10L));
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                singleWorldListener = injector().getInstance(SingleWorldListener.class);
 | 
					                singleWorldListener = injector().getInstance(SingleWorldListener.class);
 | 
				
			||||||
                Bukkit.getPluginManager().registerEvents(singleWorldListener, this);
 | 
					                Bukkit.getPluginManager().registerEvents(singleWorldListener, this);
 | 
				
			||||||
@@ -815,8 +822,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
                                        if (entity.hasMetadata("ps-tmp-teleport")) {
 | 
					                                        if (entity.hasMetadata("ps-tmp-teleport")) {
 | 
				
			||||||
                                            continue;
 | 
					                                            continue;
 | 
				
			||||||
                                        }
 | 
					                                        }
 | 
				
			||||||
                                        iterator.remove();
 | 
					                                        this.removeRoadEntity(entity, iterator);
 | 
				
			||||||
                                        entity.remove();
 | 
					 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
                                    continue;
 | 
					                                    continue;
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
@@ -829,8 +835,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
                                    if (entity.hasMetadata("ps-tmp-teleport")) {
 | 
					                                    if (entity.hasMetadata("ps-tmp-teleport")) {
 | 
				
			||||||
                                        continue;
 | 
					                                        continue;
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
                                    iterator.remove();
 | 
					                                    this.removeRoadEntity(entity, iterator);
 | 
				
			||||||
                                    entity.remove();
 | 
					 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            continue;
 | 
					                            continue;
 | 
				
			||||||
@@ -840,7 +845,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
                        case "DROPPED_ITEM":
 | 
					                        case "DROPPED_ITEM":
 | 
				
			||||||
                            if (Settings.Enabled_Components.KILL_ROAD_ITEMS
 | 
					                            if (Settings.Enabled_Components.KILL_ROAD_ITEMS
 | 
				
			||||||
                                    && plotArea.getOwnedPlotAbs(BukkitUtil.adapt(entity.getLocation())) == null) {
 | 
					                                    && plotArea.getOwnedPlotAbs(BukkitUtil.adapt(entity.getLocation())) == null) {
 | 
				
			||||||
                                entity.remove();
 | 
					                                this.removeRoadEntity(entity, iterator);
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            // dropped item
 | 
					                            // dropped item
 | 
				
			||||||
                            continue;
 | 
					                            continue;
 | 
				
			||||||
@@ -871,8 +876,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
                                                if (entity.hasMetadata("ps-tmp-teleport")) {
 | 
					                                                if (entity.hasMetadata("ps-tmp-teleport")) {
 | 
				
			||||||
                                                    continue;
 | 
					                                                    continue;
 | 
				
			||||||
                                                }
 | 
					                                                }
 | 
				
			||||||
                                                iterator.remove();
 | 
					                                                this.removeRoadEntity(entity, iterator);
 | 
				
			||||||
                                                entity.remove();
 | 
					 | 
				
			||||||
                                            }
 | 
					                                            }
 | 
				
			||||||
                                        }
 | 
					                                        }
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
@@ -977,8 +981,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
                                                if (entity.hasMetadata("ps-tmp-teleport")) {
 | 
					                                                if (entity.hasMetadata("ps-tmp-teleport")) {
 | 
				
			||||||
                                                    continue;
 | 
					                                                    continue;
 | 
				
			||||||
                                                }
 | 
					                                                }
 | 
				
			||||||
                                                iterator.remove();
 | 
					                                                this.removeRoadEntity(entity, iterator);
 | 
				
			||||||
                                                entity.remove();
 | 
					 | 
				
			||||||
                                            }
 | 
					                                            }
 | 
				
			||||||
                                        }
 | 
					                                        }
 | 
				
			||||||
                                    } else {
 | 
					                                    } else {
 | 
				
			||||||
@@ -989,8 +992,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
                                            if (entity.hasMetadata("ps-tmp-teleport")) {
 | 
					                                            if (entity.hasMetadata("ps-tmp-teleport")) {
 | 
				
			||||||
                                                continue;
 | 
					                                                continue;
 | 
				
			||||||
                                            }
 | 
					                                            }
 | 
				
			||||||
                                            iterator.remove();
 | 
					                                            this.removeRoadEntity(entity, iterator);
 | 
				
			||||||
                                            entity.remove();
 | 
					 | 
				
			||||||
                                        }
 | 
					                                        }
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
@@ -1004,6 +1006,17 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
        }), TaskTime.seconds(1L));
 | 
					        }), TaskTime.seconds(1L));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void removeRoadEntity(Entity entity, Iterator<Entity> entityIterator) {
 | 
				
			||||||
 | 
					        RemoveRoadEntityEvent event = eventDispatcher.callRemoveRoadEntity(BukkitAdapter.adapt(entity));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (event.getEventResult() == Result.DENY) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        entityIterator.remove();
 | 
				
			||||||
 | 
					        entity.remove();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public @Nullable
 | 
					    public @Nullable
 | 
				
			||||||
    final ChunkGenerator getDefaultWorldGenerator(
 | 
					    final ChunkGenerator getDefaultWorldGenerator(
 | 
				
			||||||
@@ -1148,6 +1161,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
        return new BukkitPlotGenerator(world, generator, this.plotAreaManager);
 | 
					        return new BukkitPlotGenerator(world, generator, this.plotAreaManager);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @SuppressWarnings("deprecation") // Paper deprecation
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public @NonNull String pluginsFormatted() {
 | 
					    public @NonNull String pluginsFormatted() {
 | 
				
			||||||
        StringBuilder msg = new StringBuilder();
 | 
					        StringBuilder msg = new StringBuilder();
 | 
				
			||||||
@@ -1169,13 +1183,21 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    @SuppressWarnings("ConstantConditions")
 | 
					    @SuppressWarnings({"ConstantConditions", "deprecation"}) // Paper deprecation
 | 
				
			||||||
    public @NonNull String worldEditImplementations() {
 | 
					    public @NonNull String worldEditImplementations() {
 | 
				
			||||||
        StringBuilder msg = new StringBuilder();
 | 
					        StringBuilder msg = new StringBuilder();
 | 
				
			||||||
        if (Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit") != null) {
 | 
					        if (Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit") != null) {
 | 
				
			||||||
            msg.append("FastAsyncWorldEdit: ").append(Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit").getDescription().getVersion());
 | 
					            msg.append("FastAsyncWorldEdit: ").append(Bukkit
 | 
				
			||||||
 | 
					                    .getPluginManager()
 | 
				
			||||||
 | 
					                    .getPlugin("FastAsyncWorldEdit")
 | 
				
			||||||
 | 
					                    .getDescription()
 | 
				
			||||||
 | 
					                    .getVersion());
 | 
				
			||||||
        } else if (Bukkit.getPluginManager().getPlugin("AsyncWorldEdit") != null) {
 | 
					        } else if (Bukkit.getPluginManager().getPlugin("AsyncWorldEdit") != null) {
 | 
				
			||||||
            msg.append("AsyncWorldEdit: ").append(Bukkit.getPluginManager().getPlugin("AsyncWorldEdit").getDescription().getVersion()).append("\n");
 | 
					            msg.append("AsyncWorldEdit: ").append(Bukkit
 | 
				
			||||||
 | 
					                    .getPluginManager()
 | 
				
			||||||
 | 
					                    .getPlugin("AsyncWorldEdit")
 | 
				
			||||||
 | 
					                    .getDescription()
 | 
				
			||||||
 | 
					                    .getVersion()).append("\n");
 | 
				
			||||||
            msg.append("WorldEdit: ").append(Bukkit.getPluginManager().getPlugin("WorldEdit").getDescription().getVersion());
 | 
					            msg.append("WorldEdit: ").append(Bukkit.getPluginManager().getPlugin("WorldEdit").getDescription().getVersion());
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            msg.append("WorldEdit: ").append(Bukkit.getPluginManager().getPlugin("WorldEdit").getDescription().getVersion());
 | 
					            msg.append("WorldEdit: ").append(Bukkit.getPluginManager().getPlugin("WorldEdit").getDescription().getVersion());
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,6 +33,7 @@ import org.bukkit.entity.Ageable;
 | 
				
			|||||||
import org.bukkit.entity.ArmorStand;
 | 
					import org.bukkit.entity.ArmorStand;
 | 
				
			||||||
import org.bukkit.entity.Bat;
 | 
					import org.bukkit.entity.Bat;
 | 
				
			||||||
import org.bukkit.entity.Boat;
 | 
					import org.bukkit.entity.Boat;
 | 
				
			||||||
 | 
					import org.bukkit.entity.Breedable;
 | 
				
			||||||
import org.bukkit.entity.ChestedHorse;
 | 
					import org.bukkit.entity.ChestedHorse;
 | 
				
			||||||
import org.bukkit.entity.EnderDragon;
 | 
					import org.bukkit.entity.EnderDragon;
 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					import org.bukkit.entity.Entity;
 | 
				
			||||||
@@ -74,6 +75,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
    private HorseStats horse;
 | 
					    private HorseStats horse;
 | 
				
			||||||
    private boolean noGravity;
 | 
					    private boolean noGravity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @SuppressWarnings("deprecation") // Deprecation exists since 1.20, while we support 1.16 onwards
 | 
				
			||||||
    public ReplicatingEntityWrapper(Entity entity, short depth) {
 | 
					    public ReplicatingEntityWrapper(Entity entity, short depth) {
 | 
				
			||||||
        super(entity);
 | 
					        super(entity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -101,50 +103,26 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
            this.noGravity = true;
 | 
					            this.noGravity = true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        switch (entity.getType().toString()) {
 | 
					        switch (entity.getType().toString()) {
 | 
				
			||||||
            case "BOAT":
 | 
					            case "BOAT" -> {
 | 
				
			||||||
                Boat boat = (Boat) entity;
 | 
					                Boat boat = (Boat) entity;
 | 
				
			||||||
                this.dataByte = getOrdinal(TreeSpecies.values(), boat.getWoodType());
 | 
					                this.dataByte = getOrdinal(TreeSpecies.values(), boat.getWoodType());
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            case "ARROW":
 | 
					            }
 | 
				
			||||||
            case "EGG":
 | 
					            case "ARROW", "EGG", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "EXPERIENCE_ORB", "FALLING_BLOCK", "FIREBALL",
 | 
				
			||||||
            case "ENDER_CRYSTAL":
 | 
					                    "FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND", "MINECART_MOB_SPAWNER",
 | 
				
			||||||
            case "ENDER_PEARL":
 | 
					                    "MINECART_TNT", "PLAYER", "PRIMED_TNT", "SLIME", "SMALL_FIREBALL", "SNOWBALL", "MINECART_FURNACE", "SPLASH_POTION",
 | 
				
			||||||
            case "ENDER_SIGNAL":
 | 
					                    "THROWN_EXP_BOTTLE", "WITHER_SKULL", "UNKNOWN", "SPECTRAL_ARROW", "SHULKER_BULLET", "DRAGON_FIREBALL", "AREA_EFFECT_CLOUD",
 | 
				
			||||||
            case "EXPERIENCE_ORB":
 | 
					                    "TRIDENT", "LLAMA_SPIT" -> {
 | 
				
			||||||
            case "FALLING_BLOCK":
 | 
					 | 
				
			||||||
            case "FIREBALL":
 | 
					 | 
				
			||||||
            case "FIREWORK":
 | 
					 | 
				
			||||||
            case "FISHING_HOOK":
 | 
					 | 
				
			||||||
            case "LEASH_HITCH":
 | 
					 | 
				
			||||||
            case "LIGHTNING":
 | 
					 | 
				
			||||||
            case "MINECART":
 | 
					 | 
				
			||||||
            case "MINECART_COMMAND":
 | 
					 | 
				
			||||||
            case "MINECART_MOB_SPAWNER":
 | 
					 | 
				
			||||||
            case "MINECART_TNT":
 | 
					 | 
				
			||||||
            case "PLAYER":
 | 
					 | 
				
			||||||
            case "PRIMED_TNT":
 | 
					 | 
				
			||||||
            case "SLIME":
 | 
					 | 
				
			||||||
            case "SMALL_FIREBALL":
 | 
					 | 
				
			||||||
            case "SNOWBALL":
 | 
					 | 
				
			||||||
            case "MINECART_FURNACE":
 | 
					 | 
				
			||||||
            case "SPLASH_POTION":
 | 
					 | 
				
			||||||
            case "THROWN_EXP_BOTTLE":
 | 
					 | 
				
			||||||
            case "WITHER_SKULL":
 | 
					 | 
				
			||||||
            case "UNKNOWN":
 | 
					 | 
				
			||||||
            case "SPECTRAL_ARROW":
 | 
					 | 
				
			||||||
            case "SHULKER_BULLET":
 | 
					 | 
				
			||||||
            case "DRAGON_FIREBALL":
 | 
					 | 
				
			||||||
            case "AREA_EFFECT_CLOUD":
 | 
					 | 
				
			||||||
            case "TRIDENT":
 | 
					 | 
				
			||||||
            case "LLAMA_SPIT":
 | 
					 | 
				
			||||||
                // Do this stuff later
 | 
					                // Do this stuff later
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            // MISC //
 | 
					            // MISC //
 | 
				
			||||||
            case "DROPPED_ITEM":
 | 
					            case "DROPPED_ITEM" -> {
 | 
				
			||||||
                Item item = (Item) entity;
 | 
					                Item item = (Item) entity;
 | 
				
			||||||
                this.stack = item.getItemStack();
 | 
					                this.stack = item.getItemStack();
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            case "ITEM_FRAME":
 | 
					            }
 | 
				
			||||||
 | 
					            case "ITEM_FRAME" -> {
 | 
				
			||||||
                this.x = Math.floor(this.getX());
 | 
					                this.x = Math.floor(this.getX());
 | 
				
			||||||
                this.y = Math.floor(this.getY());
 | 
					                this.y = Math.floor(this.getY());
 | 
				
			||||||
                this.z = Math.floor(this.getZ());
 | 
					                this.z = Math.floor(this.getZ());
 | 
				
			||||||
@@ -152,7 +130,8 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
                this.dataByte = getOrdinal(Rotation.values(), itemFrame.getRotation());
 | 
					                this.dataByte = getOrdinal(Rotation.values(), itemFrame.getRotation());
 | 
				
			||||||
                this.stack = itemFrame.getItem().clone();
 | 
					                this.stack = itemFrame.getItem().clone();
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            case "PAINTING":
 | 
					            }
 | 
				
			||||||
 | 
					            case "PAINTING" -> {
 | 
				
			||||||
                this.x = Math.floor(this.getX());
 | 
					                this.x = Math.floor(this.getX());
 | 
				
			||||||
                this.y = Math.floor(this.getY());
 | 
					                this.y = Math.floor(this.getY());
 | 
				
			||||||
                this.z = Math.floor(this.getZ());
 | 
					                this.z = Math.floor(this.getZ());
 | 
				
			||||||
@@ -165,20 +144,17 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                this.dataString = art.name();
 | 
					                this.dataString = art.name();
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            // END MISC //
 | 
					            // END MISC //
 | 
				
			||||||
            // INVENTORY HOLDER //
 | 
					            // INVENTORY HOLDER //
 | 
				
			||||||
            case "MINECART_CHEST":
 | 
					            case "MINECART_CHEST", "MINECART_HOPPER" -> {
 | 
				
			||||||
            case "MINECART_HOPPER":
 | 
					 | 
				
			||||||
                storeInventory((InventoryHolder) entity);
 | 
					                storeInventory((InventoryHolder) entity);
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            // START LIVING ENTITY //
 | 
					            // START LIVING ENTITY //
 | 
				
			||||||
            // START AGEABLE //
 | 
					            // START AGEABLE //
 | 
				
			||||||
            // START TAMEABLE //
 | 
					            // START TAMEABLE //
 | 
				
			||||||
            case "HORSE":
 | 
					            case "HORSE", "DONKEY", "LLAMA", "MULE", "SKELETON_HORSE" -> {
 | 
				
			||||||
            case "DONKEY":
 | 
					 | 
				
			||||||
            case "LLAMA":
 | 
					 | 
				
			||||||
            case "MULE":
 | 
					 | 
				
			||||||
            case "SKELETON_HORSE":
 | 
					 | 
				
			||||||
                AbstractHorse horse = (AbstractHorse) entity;
 | 
					                AbstractHorse horse = (AbstractHorse) entity;
 | 
				
			||||||
                this.horse = new HorseStats();
 | 
					                this.horse = new HorseStats();
 | 
				
			||||||
                this.horse.jump = horse.getJumpStrength();
 | 
					                this.horse.jump = horse.getJumpStrength();
 | 
				
			||||||
@@ -190,20 +166,21 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
                //this.horse.style = horse.getStyle();
 | 
					                //this.horse.style = horse.getStyle();
 | 
				
			||||||
                //this.horse.color = horse.getColor();
 | 
					                //this.horse.color = horse.getColor();
 | 
				
			||||||
                storeTameable(horse);
 | 
					                storeTameable(horse);
 | 
				
			||||||
                storeAgeable(horse);
 | 
					                storeBreedable(horse);
 | 
				
			||||||
                storeLiving(horse);
 | 
					                storeLiving(horse);
 | 
				
			||||||
                storeInventory(horse);
 | 
					                storeInventory(horse);
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            // END INVENTORY HOLDER //
 | 
					            // END INVENTORY HOLDER //
 | 
				
			||||||
            case "WOLF":
 | 
					            case "WOLF", "OCELOT" -> {
 | 
				
			||||||
            case "OCELOT":
 | 
					 | 
				
			||||||
                storeTameable((Tameable) entity);
 | 
					                storeTameable((Tameable) entity);
 | 
				
			||||||
                storeAgeable((Ageable) entity);
 | 
					                storeBreedable((Breedable) entity);
 | 
				
			||||||
                storeLiving((LivingEntity) entity);
 | 
					                storeLiving((LivingEntity) entity);
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            // END TAMEABLE //
 | 
					            // END TAMEABLE //
 | 
				
			||||||
            //todo fix sheep
 | 
					            //todo fix sheep
 | 
				
			||||||
            case "SHEEP":
 | 
					            case "SHEEP" -> {
 | 
				
			||||||
                Sheep sheep = (Sheep) entity;
 | 
					                Sheep sheep = (Sheep) entity;
 | 
				
			||||||
                if (sheep.isSheared()) {
 | 
					                if (sheep.isSheared()) {
 | 
				
			||||||
                    this.dataByte = (byte) 1;
 | 
					                    this.dataByte = (byte) 1;
 | 
				
			||||||
@@ -211,26 +188,23 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
                    this.dataByte = (byte) 0;
 | 
					                    this.dataByte = (byte) 0;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                this.dataByte2 = sheep.getColor().getDyeData();
 | 
					                this.dataByte2 = sheep.getColor().getDyeData();
 | 
				
			||||||
                storeAgeable(sheep);
 | 
					                storeBreedable(sheep);
 | 
				
			||||||
                storeLiving(sheep);
 | 
					                storeLiving(sheep);
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            case "VILLAGER":
 | 
					            }
 | 
				
			||||||
            case "CHICKEN":
 | 
					            case "VILLAGER", "CHICKEN", "COW", "MUSHROOM_COW", "PIG", "TURTLE", "POLAR_BEAR" -> {
 | 
				
			||||||
            case "COW":
 | 
					                storeBreedable((Breedable) entity);
 | 
				
			||||||
            case "MUSHROOM_COW":
 | 
					 | 
				
			||||||
            case "PIG":
 | 
					 | 
				
			||||||
            case "TURTLE":
 | 
					 | 
				
			||||||
            case "POLAR_BEAR":
 | 
					 | 
				
			||||||
                storeAgeable((Ageable) entity);
 | 
					 | 
				
			||||||
                storeLiving((LivingEntity) entity);
 | 
					                storeLiving((LivingEntity) entity);
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            case "RABBIT":
 | 
					            }
 | 
				
			||||||
 | 
					            case "RABBIT" -> {
 | 
				
			||||||
                this.dataByte = getOrdinal(Rabbit.Type.values(), ((Rabbit) entity).getRabbitType());
 | 
					                this.dataByte = getOrdinal(Rabbit.Type.values(), ((Rabbit) entity).getRabbitType());
 | 
				
			||||||
                storeAgeable((Ageable) entity);
 | 
					                storeBreedable((Breedable) entity);
 | 
				
			||||||
                storeLiving((LivingEntity) entity);
 | 
					                storeLiving((LivingEntity) entity);
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            // END AGEABLE //
 | 
					            // END AGEABLE //
 | 
				
			||||||
            case "ARMOR_STAND":
 | 
					            case "ARMOR_STAND" -> {
 | 
				
			||||||
                ArmorStand stand = (ArmorStand) entity;
 | 
					                ArmorStand stand = (ArmorStand) entity;
 | 
				
			||||||
                this.inventory =
 | 
					                this.inventory =
 | 
				
			||||||
                        new ItemStack[]{stand.getItemInHand().clone(), stand.getHelmet().clone(),
 | 
					                        new ItemStack[]{stand.getItemInHand().clone(), stand.getHelmet().clone(),
 | 
				
			||||||
@@ -238,37 +212,30 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
                                stand.getBoots().clone()};
 | 
					                                stand.getBoots().clone()};
 | 
				
			||||||
                storeLiving(stand);
 | 
					                storeLiving(stand);
 | 
				
			||||||
                this.stand = new ArmorStandStats();
 | 
					                this.stand = new ArmorStandStats();
 | 
				
			||||||
 | 
					 | 
				
			||||||
                EulerAngle head = stand.getHeadPose();
 | 
					                EulerAngle head = stand.getHeadPose();
 | 
				
			||||||
                this.stand.head[0] = (float) head.getX();
 | 
					                this.stand.head[0] = (float) head.getX();
 | 
				
			||||||
                this.stand.head[1] = (float) head.getY();
 | 
					                this.stand.head[1] = (float) head.getY();
 | 
				
			||||||
                this.stand.head[2] = (float) head.getZ();
 | 
					                this.stand.head[2] = (float) head.getZ();
 | 
				
			||||||
 | 
					 | 
				
			||||||
                EulerAngle body = stand.getBodyPose();
 | 
					                EulerAngle body = stand.getBodyPose();
 | 
				
			||||||
                this.stand.body[0] = (float) body.getX();
 | 
					                this.stand.body[0] = (float) body.getX();
 | 
				
			||||||
                this.stand.body[1] = (float) body.getY();
 | 
					                this.stand.body[1] = (float) body.getY();
 | 
				
			||||||
                this.stand.body[2] = (float) body.getZ();
 | 
					                this.stand.body[2] = (float) body.getZ();
 | 
				
			||||||
 | 
					 | 
				
			||||||
                EulerAngle leftLeg = stand.getLeftLegPose();
 | 
					                EulerAngle leftLeg = stand.getLeftLegPose();
 | 
				
			||||||
                this.stand.leftLeg[0] = (float) leftLeg.getX();
 | 
					                this.stand.leftLeg[0] = (float) leftLeg.getX();
 | 
				
			||||||
                this.stand.leftLeg[1] = (float) leftLeg.getY();
 | 
					                this.stand.leftLeg[1] = (float) leftLeg.getY();
 | 
				
			||||||
                this.stand.leftLeg[2] = (float) leftLeg.getZ();
 | 
					                this.stand.leftLeg[2] = (float) leftLeg.getZ();
 | 
				
			||||||
 | 
					 | 
				
			||||||
                EulerAngle rightLeg = stand.getRightLegPose();
 | 
					                EulerAngle rightLeg = stand.getRightLegPose();
 | 
				
			||||||
                this.stand.rightLeg[0] = (float) rightLeg.getX();
 | 
					                this.stand.rightLeg[0] = (float) rightLeg.getX();
 | 
				
			||||||
                this.stand.rightLeg[1] = (float) rightLeg.getY();
 | 
					                this.stand.rightLeg[1] = (float) rightLeg.getY();
 | 
				
			||||||
                this.stand.rightLeg[2] = (float) rightLeg.getZ();
 | 
					                this.stand.rightLeg[2] = (float) rightLeg.getZ();
 | 
				
			||||||
 | 
					 | 
				
			||||||
                EulerAngle leftArm = stand.getLeftArmPose();
 | 
					                EulerAngle leftArm = stand.getLeftArmPose();
 | 
				
			||||||
                this.stand.leftArm[0] = (float) leftArm.getX();
 | 
					                this.stand.leftArm[0] = (float) leftArm.getX();
 | 
				
			||||||
                this.stand.leftArm[1] = (float) leftArm.getY();
 | 
					                this.stand.leftArm[1] = (float) leftArm.getY();
 | 
				
			||||||
                this.stand.leftArm[2] = (float) leftArm.getZ();
 | 
					                this.stand.leftArm[2] = (float) leftArm.getZ();
 | 
				
			||||||
 | 
					 | 
				
			||||||
                EulerAngle rightArm = stand.getRightArmPose();
 | 
					                EulerAngle rightArm = stand.getRightArmPose();
 | 
				
			||||||
                this.stand.rightArm[0] = (float) rightArm.getX();
 | 
					                this.stand.rightArm[0] = (float) rightArm.getX();
 | 
				
			||||||
                this.stand.rightArm[1] = (float) rightArm.getY();
 | 
					                this.stand.rightArm[1] = (float) rightArm.getY();
 | 
				
			||||||
                this.stand.rightArm[2] = (float) rightArm.getZ();
 | 
					                this.stand.rightArm[2] = (float) rightArm.getZ();
 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (stand.hasArms()) {
 | 
					                if (stand.hasArms()) {
 | 
				
			||||||
                    this.stand.arms = true;
 | 
					                    this.stand.arms = true;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -282,52 +249,37 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
                    this.stand.small = true;
 | 
					                    this.stand.small = true;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            case "ENDERMITE":
 | 
					            }
 | 
				
			||||||
 | 
					            case "ENDERMITE" -> {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            case "BAT":
 | 
					            }
 | 
				
			||||||
 | 
					            case "BAT" -> {
 | 
				
			||||||
                if (((Bat) entity).isAwake()) {
 | 
					                if (((Bat) entity).isAwake()) {
 | 
				
			||||||
                    this.dataByte = (byte) 1;
 | 
					                    this.dataByte = (byte) 1;
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    this.dataByte = (byte) 0;
 | 
					                    this.dataByte = (byte) 0;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            case "ENDER_DRAGON":
 | 
					            }
 | 
				
			||||||
 | 
					            case "ENDER_DRAGON" -> {
 | 
				
			||||||
                EnderDragon entity1 = (EnderDragon) entity;
 | 
					                EnderDragon entity1 = (EnderDragon) entity;
 | 
				
			||||||
                this.dataByte = (byte) entity1.getPhase().ordinal();
 | 
					                this.dataByte = (byte) entity1.getPhase().ordinal();
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            case "SKELETON":
 | 
					            }
 | 
				
			||||||
            case "WITHER_SKELETON":
 | 
					            case "SKELETON", "WITHER_SKELETON", "GUARDIAN", "ELDER_GUARDIAN", "GHAST", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN",
 | 
				
			||||||
            case "GUARDIAN":
 | 
					                    "ZOMBIFIED_PIGLIN", "PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH",
 | 
				
			||||||
            case "ELDER_GUARDIAN":
 | 
					                    "GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SHULKER", "SNOWMAN" -> {
 | 
				
			||||||
            case "GHAST":
 | 
					 | 
				
			||||||
            case "MAGMA_CUBE":
 | 
					 | 
				
			||||||
            case "SQUID":
 | 
					 | 
				
			||||||
            case "PIG_ZOMBIE":
 | 
					 | 
				
			||||||
            case "HOGLIN":
 | 
					 | 
				
			||||||
            case "ZOMBIFIED_PIGLIN":
 | 
					 | 
				
			||||||
            case "PIGLIN":
 | 
					 | 
				
			||||||
            case "PIGLIN_BRUTE":
 | 
					 | 
				
			||||||
            case "ZOMBIE":
 | 
					 | 
				
			||||||
            case "WITHER":
 | 
					 | 
				
			||||||
            case "WITCH":
 | 
					 | 
				
			||||||
            case "SPIDER":
 | 
					 | 
				
			||||||
            case "CAVE_SPIDER":
 | 
					 | 
				
			||||||
            case "SILVERFISH":
 | 
					 | 
				
			||||||
            case "GIANT":
 | 
					 | 
				
			||||||
            case "ENDERMAN":
 | 
					 | 
				
			||||||
            case "CREEPER":
 | 
					 | 
				
			||||||
            case "BLAZE":
 | 
					 | 
				
			||||||
            case "SHULKER":
 | 
					 | 
				
			||||||
            case "SNOWMAN":
 | 
					 | 
				
			||||||
                storeLiving((LivingEntity) entity);
 | 
					                storeLiving((LivingEntity) entity);
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            case "IRON_GOLEM":
 | 
					            }
 | 
				
			||||||
 | 
					            case "IRON_GOLEM" -> {
 | 
				
			||||||
                if (((IronGolem) entity).isPlayerCreated()) {
 | 
					                if (((IronGolem) entity).isPlayerCreated()) {
 | 
				
			||||||
                    this.dataByte = (byte) 1;
 | 
					                    this.dataByte = (byte) 1;
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    this.dataByte = (byte) 0;
 | 
					                    this.dataByte = (byte) 0;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                storeLiving((LivingEntity) entity);
 | 
					                storeLiving((LivingEntity) entity);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            // END LIVING //
 | 
					            // END LIVING //
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -431,6 +383,11 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @deprecated Use {@link #restoreBreedable(Breedable)} instead
 | 
				
			||||||
 | 
					     * @since 7.1.0
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Deprecated(forRemoval = true, since = "7.1.0")
 | 
				
			||||||
    private void restoreAgeable(Ageable entity) {
 | 
					    private void restoreAgeable(Ageable entity) {
 | 
				
			||||||
        if (!this.aged.adult) {
 | 
					        if (!this.aged.adult) {
 | 
				
			||||||
            entity.setBaby();
 | 
					            entity.setBaby();
 | 
				
			||||||
@@ -441,6 +398,11 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @deprecated Use {@link #storeBreedable(Breedable)} instead
 | 
				
			||||||
 | 
					     * @since 7.1.0
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Deprecated(forRemoval = true, since = "7.1.0")
 | 
				
			||||||
    public void storeAgeable(Ageable aged) {
 | 
					    public void storeAgeable(Ageable aged) {
 | 
				
			||||||
        this.aged = new AgeableStats();
 | 
					        this.aged = new AgeableStats();
 | 
				
			||||||
        this.aged.age = aged.getAge();
 | 
					        this.aged.age = aged.getAge();
 | 
				
			||||||
@@ -448,6 +410,29 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
        this.aged.adult = aged.isAdult();
 | 
					        this.aged.adult = aged.isAdult();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @since 7.1.0
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void restoreBreedable(Breedable entity) {
 | 
				
			||||||
 | 
					        if (!this.aged.adult) {
 | 
				
			||||||
 | 
					            entity.setBaby();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        entity.setAgeLock(this.aged.locked);
 | 
				
			||||||
 | 
					        if (this.aged.age > 0) {
 | 
				
			||||||
 | 
					            entity.setAge(this.aged.age);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @since 7.1.0
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void storeBreedable(Breedable breedable) {
 | 
				
			||||||
 | 
					        this.aged = new AgeableStats();
 | 
				
			||||||
 | 
					        this.aged.age = breedable.getAge();
 | 
				
			||||||
 | 
					        this.aged.locked = breedable.getAgeLock();
 | 
				
			||||||
 | 
					        this.aged.adult = breedable.isAdult();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void storeTameable(Tameable tamed) {
 | 
					    public void storeTameable(Tameable tamed) {
 | 
				
			||||||
        this.tamed = new TameableStats();
 | 
					        this.tamed = new TameableStats();
 | 
				
			||||||
        this.tamed.owner = tamed.getOwner();
 | 
					        this.tamed.owner = tamed.getOwner();
 | 
				
			||||||
@@ -465,20 +450,15 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        Entity entity;
 | 
					        Entity entity;
 | 
				
			||||||
        switch (this.getType().toString()) {
 | 
					        switch (this.getType().toString()) {
 | 
				
			||||||
            case "DROPPED_ITEM":
 | 
					            case "DROPPED_ITEM" -> {
 | 
				
			||||||
                return world.dropItem(location, this.stack);
 | 
					                return world.dropItem(location, this.stack);
 | 
				
			||||||
            case "PLAYER":
 | 
					            }
 | 
				
			||||||
            case "LEASH_HITCH":
 | 
					            case "PLAYER", "LEASH_HITCH" -> {
 | 
				
			||||||
                return null;
 | 
					                return null;
 | 
				
			||||||
            case "ITEM_FRAME":
 | 
					            }
 | 
				
			||||||
                entity = world.spawn(location, ItemFrame.class);
 | 
					            case "ITEM_FRAME" -> entity = world.spawn(location, ItemFrame.class);
 | 
				
			||||||
                break;
 | 
					            case "PAINTING" -> entity = world.spawn(location, Painting.class);
 | 
				
			||||||
            case "PAINTING":
 | 
					            default -> entity = world.spawnEntity(location, this.getType());
 | 
				
			||||||
                entity = world.spawn(location, Painting.class);
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            default:
 | 
					 | 
				
			||||||
                entity = world.spawnEntity(location, this.getType());
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (this.depth == 0) {
 | 
					        if (this.depth == 0) {
 | 
				
			||||||
            return entity;
 | 
					            return entity;
 | 
				
			||||||
@@ -506,72 +486,46 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
            entity.setGravity(false);
 | 
					            entity.setGravity(false);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        switch (entity.getType().toString()) {
 | 
					        switch (entity.getType().toString()) {
 | 
				
			||||||
            case "BOAT":
 | 
					            case "BOAT" -> {
 | 
				
			||||||
                Boat boat = (Boat) entity;
 | 
					                Boat boat = (Boat) entity;
 | 
				
			||||||
                boat.setWoodType(TreeSpecies.values()[dataByte]);
 | 
					                boat.setWoodType(TreeSpecies.values()[dataByte]);
 | 
				
			||||||
                return entity;
 | 
					                return entity;
 | 
				
			||||||
            case "SLIME":
 | 
					            }
 | 
				
			||||||
 | 
					            case "SLIME" -> {
 | 
				
			||||||
                ((Slime) entity).setSize(this.dataByte);
 | 
					                ((Slime) entity).setSize(this.dataByte);
 | 
				
			||||||
                return entity;
 | 
					                return entity;
 | 
				
			||||||
            case "ARROW":
 | 
					            }
 | 
				
			||||||
            case "EGG":
 | 
					            case "ARROW", "EGG", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "DROPPED_ITEM", "EXPERIENCE_ORB", "FALLING_BLOCK",
 | 
				
			||||||
            case "ENDER_CRYSTAL":
 | 
					                    "FIREBALL", "FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND",
 | 
				
			||||||
            case "ENDER_PEARL":
 | 
					                    "MINECART_MOB_SPAWNER", "MINECART_TNT", "PLAYER", "PRIMED_TNT", "SMALL_FIREBALL", "SNOWBALL",
 | 
				
			||||||
            case "ENDER_SIGNAL":
 | 
					                    "SPLASH_POTION", "THROWN_EXP_BOTTLE", "SPECTRAL_ARROW", "SHULKER_BULLET", "AREA_EFFECT_CLOUD",
 | 
				
			||||||
            case "DROPPED_ITEM":
 | 
					                    "DRAGON_FIREBALL", "WITHER_SKULL", "MINECART_FURNACE", "LLAMA_SPIT", "TRIDENT", "UNKNOWN" -> {
 | 
				
			||||||
            case "EXPERIENCE_ORB":
 | 
					 | 
				
			||||||
            case "FALLING_BLOCK":
 | 
					 | 
				
			||||||
            case "FIREBALL":
 | 
					 | 
				
			||||||
            case "FIREWORK":
 | 
					 | 
				
			||||||
            case "FISHING_HOOK":
 | 
					 | 
				
			||||||
            case "LEASH_HITCH":
 | 
					 | 
				
			||||||
            case "LIGHTNING":
 | 
					 | 
				
			||||||
            case "MINECART":
 | 
					 | 
				
			||||||
            case "MINECART_COMMAND":
 | 
					 | 
				
			||||||
            case "MINECART_MOB_SPAWNER":
 | 
					 | 
				
			||||||
            case "MINECART_TNT":
 | 
					 | 
				
			||||||
            case "PLAYER":
 | 
					 | 
				
			||||||
            case "PRIMED_TNT":
 | 
					 | 
				
			||||||
            case "SMALL_FIREBALL":
 | 
					 | 
				
			||||||
            case "SNOWBALL":
 | 
					 | 
				
			||||||
            case "SPLASH_POTION":
 | 
					 | 
				
			||||||
            case "THROWN_EXP_BOTTLE":
 | 
					 | 
				
			||||||
            case "SPECTRAL_ARROW":
 | 
					 | 
				
			||||||
            case "SHULKER_BULLET":
 | 
					 | 
				
			||||||
            case "AREA_EFFECT_CLOUD":
 | 
					 | 
				
			||||||
            case "DRAGON_FIREBALL":
 | 
					 | 
				
			||||||
            case "WITHER_SKULL":
 | 
					 | 
				
			||||||
            case "MINECART_FURNACE":
 | 
					 | 
				
			||||||
            case "LLAMA_SPIT":
 | 
					 | 
				
			||||||
            case "TRIDENT":
 | 
					 | 
				
			||||||
            case "UNKNOWN":
 | 
					 | 
				
			||||||
                // Do this stuff later
 | 
					                // Do this stuff later
 | 
				
			||||||
                return entity;
 | 
					                return entity;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            // MISC //
 | 
					            // MISC //
 | 
				
			||||||
            case "ITEM_FRAME":
 | 
					            case "ITEM_FRAME" -> {
 | 
				
			||||||
                ItemFrame itemframe = (ItemFrame) entity;
 | 
					                ItemFrame itemframe = (ItemFrame) entity;
 | 
				
			||||||
                itemframe.setRotation(Rotation.values()[this.dataByte]);
 | 
					                itemframe.setRotation(Rotation.values()[this.dataByte]);
 | 
				
			||||||
                itemframe.setItem(this.stack);
 | 
					                itemframe.setItem(this.stack);
 | 
				
			||||||
                return entity;
 | 
					                return entity;
 | 
				
			||||||
            case "PAINTING":
 | 
					            }
 | 
				
			||||||
 | 
					            case "PAINTING" -> {
 | 
				
			||||||
                Painting painting = (Painting) entity;
 | 
					                Painting painting = (Painting) entity;
 | 
				
			||||||
                painting.setFacingDirection(BlockFace.values()[this.dataByte], true);
 | 
					                painting.setFacingDirection(BlockFace.values()[this.dataByte], true);
 | 
				
			||||||
                painting.setArt(Art.getByName(this.dataString), true);
 | 
					                painting.setArt(Art.getByName(this.dataString), true);
 | 
				
			||||||
                return entity;
 | 
					                return entity;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            // END MISC //
 | 
					            // END MISC //
 | 
				
			||||||
            // INVENTORY HOLDER //
 | 
					            // INVENTORY HOLDER //
 | 
				
			||||||
            case "MINECART_CHEST":
 | 
					            case "MINECART_CHEST", "MINECART_HOPPER" -> {
 | 
				
			||||||
            case "MINECART_HOPPER":
 | 
					 | 
				
			||||||
                restoreInventory((InventoryHolder) entity);
 | 
					                restoreInventory((InventoryHolder) entity);
 | 
				
			||||||
                return entity;
 | 
					                return entity;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            // START LIVING ENTITY //
 | 
					            // START LIVING ENTITY //
 | 
				
			||||||
            // START AGEABLE //
 | 
					            // START AGEABLE //
 | 
				
			||||||
            // START TAMEABLE //
 | 
					            // START TAMEABLE //
 | 
				
			||||||
            case "HORSE":
 | 
					            case "HORSE", "LLAMA", "SKELETON_HORSE", "DONKEY", "MULE" -> {
 | 
				
			||||||
            case "LLAMA":
 | 
					 | 
				
			||||||
            case "SKELETON_HORSE":
 | 
					 | 
				
			||||||
            case "DONKEY":
 | 
					 | 
				
			||||||
            case "MULE":
 | 
					 | 
				
			||||||
                AbstractHorse horse = (AbstractHorse) entity;
 | 
					                AbstractHorse horse = (AbstractHorse) entity;
 | 
				
			||||||
                horse.setJumpStrength(this.horse.jump);
 | 
					                horse.setJumpStrength(this.horse.jump);
 | 
				
			||||||
                if (horse instanceof ChestedHorse) {
 | 
					                if (horse instanceof ChestedHorse) {
 | 
				
			||||||
@@ -582,19 +536,20 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
                //horse.setStyle(this.horse.style);
 | 
					                //horse.setStyle(this.horse.style);
 | 
				
			||||||
                //horse.setColor(this.horse.color);
 | 
					                //horse.setColor(this.horse.color);
 | 
				
			||||||
                restoreTameable(horse);
 | 
					                restoreTameable(horse);
 | 
				
			||||||
                restoreAgeable(horse);
 | 
					                restoreBreedable(horse);
 | 
				
			||||||
                restoreLiving(horse);
 | 
					                restoreLiving(horse);
 | 
				
			||||||
                restoreInventory(horse);
 | 
					                restoreInventory(horse);
 | 
				
			||||||
                return entity;
 | 
					                return entity;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            // END INVENTORY HOLDER //
 | 
					            // END INVENTORY HOLDER //
 | 
				
			||||||
            case "WOLF":
 | 
					            case "WOLF", "OCELOT" -> {
 | 
				
			||||||
            case "OCELOT":
 | 
					 | 
				
			||||||
                restoreTameable((Tameable) entity);
 | 
					                restoreTameable((Tameable) entity);
 | 
				
			||||||
                restoreAgeable((Ageable) entity);
 | 
					                restoreBreedable((Breedable) entity);
 | 
				
			||||||
                restoreLiving((LivingEntity) entity);
 | 
					                restoreLiving((LivingEntity) entity);
 | 
				
			||||||
                return entity;
 | 
					                return entity;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            // END AGEABLE //
 | 
					            // END AGEABLE //
 | 
				
			||||||
            case "SHEEP":
 | 
					            case "SHEEP" -> {
 | 
				
			||||||
                Sheep sheep = (Sheep) entity;
 | 
					                Sheep sheep = (Sheep) entity;
 | 
				
			||||||
                if (this.dataByte == 1) {
 | 
					                if (this.dataByte == 1) {
 | 
				
			||||||
                    sheep.setSheared(true);
 | 
					                    sheep.setSheared(true);
 | 
				
			||||||
@@ -602,28 +557,25 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
                if (this.dataByte2 != 0) {
 | 
					                if (this.dataByte2 != 0) {
 | 
				
			||||||
                    sheep.setColor(DyeColor.getByDyeData(this.dataByte2));
 | 
					                    sheep.setColor(DyeColor.getByDyeData(this.dataByte2));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                restoreAgeable(sheep);
 | 
					                restoreBreedable(sheep);
 | 
				
			||||||
                restoreLiving(sheep);
 | 
					                restoreLiving(sheep);
 | 
				
			||||||
                return sheep;
 | 
					                return sheep;
 | 
				
			||||||
            case "VILLAGER":
 | 
					            }
 | 
				
			||||||
            case "CHICKEN":
 | 
					            case "VILLAGER", "CHICKEN", "COW", "TURTLE", "POLAR_BEAR", "MUSHROOM_COW", "PIG" -> {
 | 
				
			||||||
            case "COW":
 | 
					                restoreBreedable((Breedable) entity);
 | 
				
			||||||
            case "TURTLE":
 | 
					 | 
				
			||||||
            case "POLAR_BEAR":
 | 
					 | 
				
			||||||
            case "MUSHROOM_COW":
 | 
					 | 
				
			||||||
            case "PIG":
 | 
					 | 
				
			||||||
                restoreAgeable((Ageable) entity);
 | 
					 | 
				
			||||||
                restoreLiving((LivingEntity) entity);
 | 
					                restoreLiving((LivingEntity) entity);
 | 
				
			||||||
                return entity;
 | 
					                return entity;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            // END AGEABLE //
 | 
					            // END AGEABLE //
 | 
				
			||||||
            case "RABBIT":
 | 
					            case "RABBIT" -> {
 | 
				
			||||||
                if (this.dataByte != 0) {
 | 
					                if (this.dataByte != 0) {
 | 
				
			||||||
                    ((Rabbit) entity).setRabbitType(Rabbit.Type.values()[this.dataByte]);
 | 
					                    ((Rabbit) entity).setRabbitType(Rabbit.Type.values()[this.dataByte]);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                restoreAgeable((Ageable) entity);
 | 
					                restoreBreedable((Breedable) entity);
 | 
				
			||||||
                restoreLiving((LivingEntity) entity);
 | 
					                restoreLiving((LivingEntity) entity);
 | 
				
			||||||
                return entity;
 | 
					                return entity;
 | 
				
			||||||
            case "ARMOR_STAND":
 | 
					            }
 | 
				
			||||||
 | 
					            case "ARMOR_STAND" -> {
 | 
				
			||||||
                // CHECK positions
 | 
					                // CHECK positions
 | 
				
			||||||
                ArmorStand stand = (ArmorStand) entity;
 | 
					                ArmorStand stand = (ArmorStand) entity;
 | 
				
			||||||
                if (this.inventory[0] != null) {
 | 
					                if (this.inventory[0] != null) {
 | 
				
			||||||
@@ -693,56 +645,38 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                restoreLiving(stand);
 | 
					                restoreLiving(stand);
 | 
				
			||||||
                return stand;
 | 
					                return stand;
 | 
				
			||||||
            case "BAT":
 | 
					            }
 | 
				
			||||||
 | 
					            case "BAT" -> {
 | 
				
			||||||
                if (this.dataByte != 0) {
 | 
					                if (this.dataByte != 0) {
 | 
				
			||||||
                    ((Bat) entity).setAwake(true);
 | 
					                    ((Bat) entity).setAwake(true);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                restoreLiving((LivingEntity) entity);
 | 
					                restoreLiving((LivingEntity) entity);
 | 
				
			||||||
                return entity;
 | 
					                return entity;
 | 
				
			||||||
            case "ENDER_DRAGON":
 | 
					            }
 | 
				
			||||||
 | 
					            case "ENDER_DRAGON" -> {
 | 
				
			||||||
                if (this.dataByte != 0) {
 | 
					                if (this.dataByte != 0) {
 | 
				
			||||||
                    ((EnderDragon) entity).setPhase(EnderDragon.Phase.values()[this.dataByte]);
 | 
					                    ((EnderDragon) entity).setPhase(EnderDragon.Phase.values()[this.dataByte]);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                restoreLiving((LivingEntity) entity);
 | 
					                restoreLiving((LivingEntity) entity);
 | 
				
			||||||
                return entity;
 | 
					                return entity;
 | 
				
			||||||
            case "ENDERMITE":
 | 
					            }
 | 
				
			||||||
            case "GHAST":
 | 
					            case "ENDERMITE", "GHAST", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN", "PIGLIN", "ZOMBIFIED_PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH", "GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SNOWMAN", "SHULKER", "GUARDIAN", "ELDER_GUARDIAN", "SKELETON", "WITHER_SKELETON" -> {
 | 
				
			||||||
            case "MAGMA_CUBE":
 | 
					 | 
				
			||||||
            case "SQUID":
 | 
					 | 
				
			||||||
            case "PIG_ZOMBIE":
 | 
					 | 
				
			||||||
            case "HOGLIN":
 | 
					 | 
				
			||||||
            case "PIGLIN":
 | 
					 | 
				
			||||||
            case "ZOMBIFIED_PIGLIN":
 | 
					 | 
				
			||||||
            case "PIGLIN_BRUTE":
 | 
					 | 
				
			||||||
            case "ZOMBIE":
 | 
					 | 
				
			||||||
            case "WITHER":
 | 
					 | 
				
			||||||
            case "WITCH":
 | 
					 | 
				
			||||||
            case "SPIDER":
 | 
					 | 
				
			||||||
            case "CAVE_SPIDER":
 | 
					 | 
				
			||||||
            case "SILVERFISH":
 | 
					 | 
				
			||||||
            case "GIANT":
 | 
					 | 
				
			||||||
            case "ENDERMAN":
 | 
					 | 
				
			||||||
            case "CREEPER":
 | 
					 | 
				
			||||||
            case "BLAZE":
 | 
					 | 
				
			||||||
            case "SNOWMAN":
 | 
					 | 
				
			||||||
            case "SHULKER":
 | 
					 | 
				
			||||||
            case "GUARDIAN":
 | 
					 | 
				
			||||||
            case "ELDER_GUARDIAN":
 | 
					 | 
				
			||||||
            case "SKELETON":
 | 
					 | 
				
			||||||
            case "WITHER_SKELETON":
 | 
					 | 
				
			||||||
                restoreLiving((LivingEntity) entity);
 | 
					                restoreLiving((LivingEntity) entity);
 | 
				
			||||||
                return entity;
 | 
					                return entity;
 | 
				
			||||||
            case "IRON_GOLEM":
 | 
					            }
 | 
				
			||||||
 | 
					            case "IRON_GOLEM" -> {
 | 
				
			||||||
                if (this.dataByte != 0) {
 | 
					                if (this.dataByte != 0) {
 | 
				
			||||||
                    ((IronGolem) entity).setPlayerCreated(true);
 | 
					                    ((IronGolem) entity).setPlayerCreated(true);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                restoreLiving((LivingEntity) entity);
 | 
					                restoreLiving((LivingEntity) entity);
 | 
				
			||||||
                return entity;
 | 
					                return entity;
 | 
				
			||||||
            default:
 | 
					            }
 | 
				
			||||||
 | 
					            default -> {
 | 
				
			||||||
                if (Settings.DEBUG) {
 | 
					                if (Settings.DEBUG) {
 | 
				
			||||||
                    LOGGER.info("Could not identify entity: {}", entity.getType());
 | 
					                    LOGGER.info("Could not identify entity: {}", entity.getType());
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return entity;
 | 
					                return entity;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            // END LIVING
 | 
					            // END LIVING
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,9 +24,8 @@ import com.plotsquared.core.generator.IndependentPlotGenerator;
 | 
				
			|||||||
import com.plotsquared.core.location.Location;
 | 
					import com.plotsquared.core.location.Location;
 | 
				
			||||||
import com.plotsquared.core.location.UncheckedWorldLocation;
 | 
					import com.plotsquared.core.location.UncheckedWorldLocation;
 | 
				
			||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					import com.plotsquared.core.plot.PlotArea;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					 | 
				
			||||||
import com.plotsquared.core.plot.world.SinglePlotArea;
 | 
					import com.plotsquared.core.plot.world.SinglePlotArea;
 | 
				
			||||||
import com.plotsquared.core.queue.ScopedQueueCoordinator;
 | 
					import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
 | 
				
			||||||
import org.bukkit.generator.BlockPopulator;
 | 
					import org.bukkit.generator.BlockPopulator;
 | 
				
			||||||
import org.bukkit.generator.LimitedRegion;
 | 
					import org.bukkit.generator.LimitedRegion;
 | 
				
			||||||
import org.bukkit.generator.WorldInfo;
 | 
					import org.bukkit.generator.WorldInfo;
 | 
				
			||||||
@@ -47,17 +46,6 @@ final class BlockStatePopulator extends BlockPopulator {
 | 
				
			|||||||
        this.plotGenerator = plotGenerator;
 | 
					        this.plotGenerator = plotGenerator;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @deprecated Use {@link BlockStatePopulator#BlockStatePopulator(IndependentPlotGenerator)} as plotAreManager is unused
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    @Deprecated(forRemoval = true, since = "6.9.0")
 | 
					 | 
				
			||||||
    public BlockStatePopulator(
 | 
					 | 
				
			||||||
            final @NonNull IndependentPlotGenerator plotGenerator,
 | 
					 | 
				
			||||||
            final @NonNull PlotAreaManager plotAreaManager
 | 
					 | 
				
			||||||
    ) {
 | 
					 | 
				
			||||||
        this.plotGenerator = plotGenerator;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void populate(
 | 
					    public void populate(
 | 
				
			||||||
            @NonNull final WorldInfo worldInfo,
 | 
					            @NonNull final WorldInfo worldInfo,
 | 
				
			||||||
@@ -80,7 +68,7 @@ final class BlockStatePopulator extends BlockPopulator {
 | 
				
			|||||||
                worldInfo.getMaxHeight(),
 | 
					                worldInfo.getMaxHeight(),
 | 
				
			||||||
                (chunkZ << 4) + 15
 | 
					                (chunkZ << 4) + 15
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        ScopedQueueCoordinator offsetChunkQueue = new ScopedQueueCoordinator(wrapped, min, max);
 | 
					        ZeroedDelegateScopedQueueCoordinator offsetChunkQueue = new ZeroedDelegateScopedQueueCoordinator(wrapped, min, max);
 | 
				
			||||||
        this.plotGenerator.populateChunk(offsetChunkQueue, area);
 | 
					        this.plotGenerator.populateChunk(offsetChunkQueue, area);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,28 +22,47 @@ import com.plotsquared.bukkit.queue.GenChunk;
 | 
				
			|||||||
import com.plotsquared.bukkit.util.BukkitUtil;
 | 
					import com.plotsquared.bukkit.util.BukkitUtil;
 | 
				
			||||||
import com.plotsquared.bukkit.util.BukkitWorld;
 | 
					import com.plotsquared.bukkit.util.BukkitWorld;
 | 
				
			||||||
import com.plotsquared.core.PlotSquared;
 | 
					import com.plotsquared.core.PlotSquared;
 | 
				
			||||||
 | 
					import com.plotsquared.core.generator.ClassicPlotWorld;
 | 
				
			||||||
import com.plotsquared.core.generator.GeneratorWrapper;
 | 
					import com.plotsquared.core.generator.GeneratorWrapper;
 | 
				
			||||||
import com.plotsquared.core.generator.IndependentPlotGenerator;
 | 
					import com.plotsquared.core.generator.IndependentPlotGenerator;
 | 
				
			||||||
import com.plotsquared.core.generator.SingleWorldGenerator;
 | 
					import com.plotsquared.core.generator.SingleWorldGenerator;
 | 
				
			||||||
import com.plotsquared.core.location.ChunkWrapper;
 | 
					import com.plotsquared.core.location.ChunkWrapper;
 | 
				
			||||||
 | 
					import com.plotsquared.core.location.UncheckedWorldLocation;
 | 
				
			||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					import com.plotsquared.core.plot.PlotArea;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.queue.ScopedQueueCoordinator;
 | 
					import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
 | 
				
			||||||
import com.plotsquared.core.util.ChunkManager;
 | 
					import com.plotsquared.core.util.ChunkManager;
 | 
				
			||||||
 | 
					import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
				
			||||||
import com.sk89q.worldedit.math.BlockVector2;
 | 
					import com.sk89q.worldedit.math.BlockVector2;
 | 
				
			||||||
 | 
					import com.sk89q.worldedit.math.BlockVector3;
 | 
				
			||||||
 | 
					import org.apache.logging.log4j.LogManager;
 | 
				
			||||||
 | 
					import org.apache.logging.log4j.Logger;
 | 
				
			||||||
 | 
					import org.bukkit.HeightMap;
 | 
				
			||||||
 | 
					import org.bukkit.NamespacedKey;
 | 
				
			||||||
 | 
					import org.bukkit.Registry;
 | 
				
			||||||
import org.bukkit.World;
 | 
					import org.bukkit.World;
 | 
				
			||||||
import org.bukkit.block.Biome;
 | 
					import org.bukkit.block.Biome;
 | 
				
			||||||
 | 
					import org.bukkit.generator.BiomeProvider;
 | 
				
			||||||
import org.bukkit.generator.BlockPopulator;
 | 
					import org.bukkit.generator.BlockPopulator;
 | 
				
			||||||
import org.bukkit.generator.ChunkGenerator;
 | 
					import org.bukkit.generator.ChunkGenerator;
 | 
				
			||||||
 | 
					import org.bukkit.generator.WorldInfo;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.NotNull;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.Arrays;
 | 
				
			||||||
 | 
					import java.util.EnumSet;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Random;
 | 
					import java.util.Random;
 | 
				
			||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static java.util.function.Predicate.not;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrapper<ChunkGenerator> {
 | 
					public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrapper<ChunkGenerator> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitPlotGenerator.class.getSimpleName());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @SuppressWarnings("unused")
 | 
					    @SuppressWarnings("unused")
 | 
				
			||||||
    public final boolean PAPER_ASYNC_SAFE = true;
 | 
					    public final boolean PAPER_ASYNC_SAFE = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -52,9 +71,15 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
 | 
				
			|||||||
    private final ChunkGenerator platformGenerator;
 | 
					    private final ChunkGenerator platformGenerator;
 | 
				
			||||||
    private final boolean full;
 | 
					    private final boolean full;
 | 
				
			||||||
    private final String levelName;
 | 
					    private final String levelName;
 | 
				
			||||||
 | 
					    private final boolean useNewGenerationMethods;
 | 
				
			||||||
 | 
					    private final BiomeProvider biomeProvider;
 | 
				
			||||||
    private List<BlockPopulator> populators;
 | 
					    private List<BlockPopulator> populators;
 | 
				
			||||||
    private boolean loaded = false;
 | 
					    private boolean loaded = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private PlotArea lastPlotArea;
 | 
				
			||||||
 | 
					    private int lastChunkX = Integer.MIN_VALUE;
 | 
				
			||||||
 | 
					    private int lastChunkZ = Integer.MIN_VALUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public BukkitPlotGenerator(
 | 
					    public BukkitPlotGenerator(
 | 
				
			||||||
            final @NonNull String name,
 | 
					            final @NonNull String name,
 | 
				
			||||||
            final @NonNull IndependentPlotGenerator generator,
 | 
					            final @NonNull IndependentPlotGenerator generator,
 | 
				
			||||||
@@ -72,18 +97,23 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
 | 
				
			|||||||
            this.populators.add(new LegacyBlockStatePopulator(this.plotGenerator));
 | 
					            this.populators.add(new LegacyBlockStatePopulator(this.plotGenerator));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        this.full = true;
 | 
					        this.full = true;
 | 
				
			||||||
 | 
					        this.useNewGenerationMethods = PlotSquared.platform().serverVersion()[1] >= 19;
 | 
				
			||||||
 | 
					        this.biomeProvider = new BukkitPlotBiomeProvider();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public BukkitPlotGenerator(final String world, final ChunkGenerator cg, final @NonNull PlotAreaManager plotAreaManager) {
 | 
					    public BukkitPlotGenerator(final String world, final ChunkGenerator cg, final @NonNull PlotAreaManager plotAreaManager) {
 | 
				
			||||||
        if (cg instanceof BukkitPlotGenerator) {
 | 
					        if (cg instanceof BukkitPlotGenerator) {
 | 
				
			||||||
            throw new IllegalArgumentException("ChunkGenerator: " + cg.getClass().getName()
 | 
					            throw new IllegalArgumentException("ChunkGenerator: " + cg
 | 
				
			||||||
                    + " is already a BukkitPlotGenerator!");
 | 
					                    .getClass()
 | 
				
			||||||
 | 
					                    .getName() + " is already a BukkitPlotGenerator!");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        this.plotAreaManager = plotAreaManager;
 | 
					        this.plotAreaManager = plotAreaManager;
 | 
				
			||||||
        this.levelName = world;
 | 
					        this.levelName = world;
 | 
				
			||||||
        this.full = false;
 | 
					        this.full = false;
 | 
				
			||||||
        this.platformGenerator = cg;
 | 
					        this.platformGenerator = cg;
 | 
				
			||||||
        this.plotGenerator = new DelegatePlotGenerator(cg, world);
 | 
					        this.plotGenerator = new DelegatePlotGenerator(cg, world);
 | 
				
			||||||
 | 
					        this.useNewGenerationMethods = PlotSquared.platform().serverVersion()[1] >= 19;
 | 
				
			||||||
 | 
					        this.biomeProvider = null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
@@ -111,7 +141,7 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
 | 
				
			|||||||
        try {
 | 
					        try {
 | 
				
			||||||
            checkLoaded(world);
 | 
					            checkLoaded(world);
 | 
				
			||||||
        } catch (Exception e) {
 | 
					        } catch (Exception e) {
 | 
				
			||||||
            e.printStackTrace();
 | 
					            LOGGER.error("Error attempting to load world into PlotSquared.", e);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ArrayList<BlockPopulator> toAdd = new ArrayList<>();
 | 
					        ArrayList<BlockPopulator> toAdd = new ArrayList<>();
 | 
				
			||||||
        List<BlockPopulator> existing = world.getPopulators();
 | 
					        List<BlockPopulator> existing = world.getPopulators();
 | 
				
			||||||
@@ -128,6 +158,7 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
 | 
				
			|||||||
        return toAdd;
 | 
					        return toAdd;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Extracted to synchronized method for thread-safety, preventing multiple internal world load calls
 | 
				
			||||||
    private synchronized void checkLoaded(@NonNull World world) {
 | 
					    private synchronized void checkLoaded(@NonNull World world) {
 | 
				
			||||||
        // Do not attempt to load configurations until WorldEdit has a platform ready.
 | 
					        // Do not attempt to load configurations until WorldEdit has a platform ready.
 | 
				
			||||||
        if (!PlotSquared.get().isWeInitialised()) {
 | 
					        if (!PlotSquared.get().isWeInitialised()) {
 | 
				
			||||||
@@ -153,7 +184,7 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @SuppressWarnings("deprecation")
 | 
					    @SuppressWarnings("deprecation") // Kept for compatibility with <=1.17.1
 | 
				
			||||||
    private void setSpawnLimits(@NonNull World world, int limit) {
 | 
					    private void setSpawnLimits(@NonNull World world, int limit) {
 | 
				
			||||||
        world.setAmbientSpawnLimit(limit);
 | 
					        world.setAmbientSpawnLimit(limit);
 | 
				
			||||||
        world.setAnimalSpawnLimit(limit);
 | 
					        world.setAnimalSpawnLimit(limit);
 | 
				
			||||||
@@ -162,10 +193,117 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public @NonNull ChunkData generateChunkData(
 | 
					    public void generateNoise(
 | 
				
			||||||
            @NonNull World world, @NonNull Random random, int x, int z,
 | 
					            @NotNull final WorldInfo worldInfo,
 | 
				
			||||||
            @NonNull BiomeGrid biome
 | 
					            @NotNull final Random random,
 | 
				
			||||||
 | 
					            final int chunkX,
 | 
				
			||||||
 | 
					            final int chunkZ,
 | 
				
			||||||
 | 
					            @NotNull final ChunkData chunkData
 | 
				
			||||||
    ) {
 | 
					    ) {
 | 
				
			||||||
 | 
					        if (this.platformGenerator != this) {
 | 
				
			||||||
 | 
					            this.platformGenerator.generateNoise(worldInfo, random, chunkX, chunkZ, chunkData);
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        int minY = chunkData.getMinHeight();
 | 
				
			||||||
 | 
					        int maxY = chunkData.getMaxHeight();
 | 
				
			||||||
 | 
					        GenChunk result = new GenChunk(minY, maxY);
 | 
				
			||||||
 | 
					        // Set the chunk location
 | 
				
			||||||
 | 
					        result.setChunk(new ChunkWrapper(worldInfo.getName(), chunkX, chunkZ));
 | 
				
			||||||
 | 
					        // Set the result data
 | 
				
			||||||
 | 
					        result.setChunkData(chunkData);
 | 
				
			||||||
 | 
					        result.result = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Catch any exceptions (as exceptions usually thrown)
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            generate(BlockVector2.at(chunkX, chunkZ), worldInfo.getName(), result, false);
 | 
				
			||||||
 | 
					        } catch (Throwable e) {
 | 
				
			||||||
 | 
					            LOGGER.error("Error attempting to generate chunk.", e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void generateSurface(
 | 
				
			||||||
 | 
					            @NotNull final WorldInfo worldInfo,
 | 
				
			||||||
 | 
					            @NotNull final Random random,
 | 
				
			||||||
 | 
					            final int chunkX,
 | 
				
			||||||
 | 
					            final int chunkZ,
 | 
				
			||||||
 | 
					            @NotNull final ChunkData chunkData
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					        if (platformGenerator != this) {
 | 
				
			||||||
 | 
					            platformGenerator.generateSurface(worldInfo, random, chunkX, chunkZ, chunkData);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void generateBedrock(
 | 
				
			||||||
 | 
					            @NotNull final WorldInfo worldInfo,
 | 
				
			||||||
 | 
					            @NotNull final Random random,
 | 
				
			||||||
 | 
					            final int chunkX,
 | 
				
			||||||
 | 
					            final int chunkZ,
 | 
				
			||||||
 | 
					            @NotNull final ChunkData chunkData
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					        if (platformGenerator != this) {
 | 
				
			||||||
 | 
					            platformGenerator.generateBedrock(worldInfo, random, chunkX, chunkZ, chunkData);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void generateCaves(
 | 
				
			||||||
 | 
					            @NotNull final WorldInfo worldInfo,
 | 
				
			||||||
 | 
					            @NotNull final Random random,
 | 
				
			||||||
 | 
					            final int chunkX,
 | 
				
			||||||
 | 
					            final int chunkZ,
 | 
				
			||||||
 | 
					            @NotNull final ChunkData chunkData
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					        if (platformGenerator != this) {
 | 
				
			||||||
 | 
					            platformGenerator.generateCaves(worldInfo, random, chunkX, chunkZ, chunkData);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public @Nullable BiomeProvider getDefaultBiomeProvider(@NotNull final WorldInfo worldInfo) {
 | 
				
			||||||
 | 
					        if (platformGenerator != this) {
 | 
				
			||||||
 | 
					            return platformGenerator.getDefaultBiomeProvider(worldInfo);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return biomeProvider;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int getBaseHeight(
 | 
				
			||||||
 | 
					            @NotNull final WorldInfo worldInfo,
 | 
				
			||||||
 | 
					            @NotNull final Random random,
 | 
				
			||||||
 | 
					            final int x,
 | 
				
			||||||
 | 
					            final int z,
 | 
				
			||||||
 | 
					            @NotNull final HeightMap heightMap
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					        PlotArea area = getPlotArea(worldInfo.getName(), x, z);
 | 
				
			||||||
 | 
					        if (area instanceof ClassicPlotWorld cpw) {
 | 
				
			||||||
 | 
					            // Default to plot height being the heighest point before decoration (i.e. roads, walls etc.)
 | 
				
			||||||
 | 
					            return cpw.PLOT_HEIGHT;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return super.getBaseHeight(worldInfo, random, x, z, heightMap);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The entire method is deprecated, but kept for compatibility with versions lower than or equal to 1.16.2.
 | 
				
			||||||
 | 
					     * The method will be removed in future versions, because WorldEdit and FastAsyncWorldEdit only support the latest point
 | 
				
			||||||
 | 
					     * release.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @SuppressWarnings("deprecation") // The entire method is deprecated, but kept for compatibility with <=1.16.2
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    @Deprecated(since = "7.0.0")
 | 
				
			||||||
 | 
					    public @NonNull ChunkData generateChunkData(
 | 
				
			||||||
 | 
					            @NonNull World world, @NonNull Random random, int x, int z, @NonNull BiomeGrid biome
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					        if (useNewGenerationMethods) {
 | 
				
			||||||
 | 
					            if (this.platformGenerator != this) {
 | 
				
			||||||
 | 
					                return this.platformGenerator.generateChunkData(world, random, x, z, biome);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                // Throw exception to be caught by the server that indicates the new generation API is being used.
 | 
				
			||||||
 | 
					                throw new UnsupportedOperationException("Using new generation methods. This method is unsupported.");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        int minY = BukkitWorld.getMinWorldHeight(world);
 | 
					        int minY = BukkitWorld.getMinWorldHeight(world);
 | 
				
			||||||
        int maxY = BukkitWorld.getMaxWorldHeight(world);
 | 
					        int maxY = BukkitWorld.getMaxWorldHeight(world);
 | 
				
			||||||
        GenChunk result = new GenChunk(minY, maxY);
 | 
					        GenChunk result = new GenChunk(minY, maxY);
 | 
				
			||||||
@@ -175,7 +313,6 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
 | 
				
			|||||||
                    for (int chunkZ = 0; chunkZ < 16; chunkZ++) {
 | 
					                    for (int chunkZ = 0; chunkZ < 16; chunkZ++) {
 | 
				
			||||||
                        for (int y = minY; y < maxY; y++) {
 | 
					                        for (int y = minY; y < maxY; y++) {
 | 
				
			||||||
                            biome.setBiome(chunkX, y, chunkZ, Biome.PLAINS);
 | 
					                            biome.setBiome(chunkX, y, chunkZ, Biome.PLAINS);
 | 
				
			||||||
 | 
					 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -195,35 +332,32 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
 | 
				
			|||||||
            if (this.platformGenerator != this) {
 | 
					            if (this.platformGenerator != this) {
 | 
				
			||||||
                return this.platformGenerator.generateChunkData(world, random, x, z, biome);
 | 
					                return this.platformGenerator.generateChunkData(world, random, x, z, biome);
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                generate(BlockVector2.at(x, z), world, result);
 | 
					                generate(BlockVector2.at(x, z), world.getName(), result, true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } catch (Throwable e) {
 | 
					        } catch (Throwable e) {
 | 
				
			||||||
            e.printStackTrace();
 | 
					            LOGGER.error("Error attempting to load world into PlotSquared.", e);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        // Return the result data
 | 
					        // Return the result data
 | 
				
			||||||
        return result.getChunkData();
 | 
					        return result.getChunkData();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void generate(BlockVector2 loc, World world, ScopedQueueCoordinator result) {
 | 
					    private void generate(BlockVector2 loc, String world, ZeroedDelegateScopedQueueCoordinator result, boolean biomes) {
 | 
				
			||||||
        // Load if improperly loaded
 | 
					        // Load if improperly loaded
 | 
				
			||||||
        if (!this.loaded) {
 | 
					        if (!this.loaded) {
 | 
				
			||||||
            checkLoaded(world);
 | 
					            synchronized (this) {
 | 
				
			||||||
 | 
					                PlotSquared.get().loadWorld(world, this);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        // Process the chunk
 | 
					        // Process the chunk
 | 
				
			||||||
        if (ChunkManager.preProcessChunk(loc, result)) {
 | 
					        if (ChunkManager.preProcessChunk(loc, result)) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        PlotArea area = this.plotAreaManager.getPlotArea(world.getName(), null);
 | 
					        PlotArea area = getPlotArea(world, loc.getX(), loc.getZ());
 | 
				
			||||||
        if (area == null && (area = this.plotAreaManager.getPlotArea(this.levelName, null)) == null) {
 | 
					 | 
				
			||||||
            throw new IllegalStateException(
 | 
					 | 
				
			||||||
                    "Cannot regenerate chunk that does not belong to a plot area." + " Location: " + loc
 | 
					 | 
				
			||||||
                            + ", world: " + world);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            this.plotGenerator.generateChunk(result, area);
 | 
					            this.plotGenerator.generateChunk(result, area, biomes);
 | 
				
			||||||
        } catch (Throwable e) {
 | 
					        } catch (Throwable e) {
 | 
				
			||||||
            // Recover from generator error
 | 
					            // Recover from generator error
 | 
				
			||||||
            e.printStackTrace();
 | 
					            LOGGER.error("Error attempting to generate chunk.", e);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ChunkManager.postProcessChunk(loc, result);
 | 
					        ChunkManager.postProcessChunk(loc, result);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -277,4 +411,63 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
 | 
				
			|||||||
        return this.levelName;
 | 
					        return this.levelName;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private synchronized PlotArea getPlotArea(String name, int chunkX, int chunkZ) {
 | 
				
			||||||
 | 
					        // Load if improperly loaded
 | 
				
			||||||
 | 
					        if (!this.loaded) {
 | 
				
			||||||
 | 
					            PlotSquared.get().loadWorld(name, this);
 | 
				
			||||||
 | 
					            // Do not set loaded to true as we want to ensure spawn limits are set when "loading" is actually able to be
 | 
				
			||||||
 | 
					            // completed properly.
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (lastPlotArea != null && name.equals(this.levelName) && chunkX == lastChunkX && chunkZ == lastChunkZ) {
 | 
				
			||||||
 | 
					            return lastPlotArea;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        BlockVector3 loc = BlockVector3.at(chunkX << 4, 0, chunkZ << 4);
 | 
				
			||||||
 | 
					        if (lastPlotArea != null && lastPlotArea.getRegion().contains(loc) && lastPlotArea.getRegion().contains(loc)) {
 | 
				
			||||||
 | 
					            return lastPlotArea;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        PlotArea area = UncheckedWorldLocation.at(name, loc).getPlotArea();
 | 
				
			||||||
 | 
					        if (area == null) {
 | 
				
			||||||
 | 
					            throw new IllegalStateException(String.format(
 | 
				
			||||||
 | 
					                    "Cannot generate chunk that does not belong to a plot area. World: %s",
 | 
				
			||||||
 | 
					                    name
 | 
				
			||||||
 | 
					            ));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.lastChunkX = chunkX;
 | 
				
			||||||
 | 
					        this.lastChunkZ = chunkZ;
 | 
				
			||||||
 | 
					        return this.lastPlotArea = area;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Biome provider should never need to be accessed outside of this class.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private final class BukkitPlotBiomeProvider extends BiomeProvider {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private static final List<Biome> BIOMES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        static {
 | 
				
			||||||
 | 
					            Set<Biome> disabledBiomes = EnumSet.of(Biome.CUSTOM);
 | 
				
			||||||
 | 
					            if (PlotSquared.platform().serverVersion()[1] <= 19) {
 | 
				
			||||||
 | 
					                final Biome cherryGrove = Registry.BIOME.get(NamespacedKey.minecraft("cherry_grove"));
 | 
				
			||||||
 | 
					                if (cherryGrove != null) {
 | 
				
			||||||
 | 
					                    disabledBiomes.add(cherryGrove);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            BIOMES = Arrays.stream(Biome.values())
 | 
				
			||||||
 | 
					                    .filter(not(disabledBiomes::contains))
 | 
				
			||||||
 | 
					                    .toList();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @Override
 | 
				
			||||||
 | 
					        public @NotNull Biome getBiome(@NotNull final WorldInfo worldInfo, final int x, final int y, final int z) {
 | 
				
			||||||
 | 
					            PlotArea area = getPlotArea(worldInfo.getName(), x >> 4, z >> 4);
 | 
				
			||||||
 | 
					            return BukkitAdapter.adapt(plotGenerator.getBiome(area, x, y, z));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @Override
 | 
				
			||||||
 | 
					        public @NotNull List<Biome> getBiomes(@NotNull final WorldInfo worldInfo) {
 | 
				
			||||||
 | 
					            return BIOMES; // Allow all biomes
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,9 +24,10 @@ import com.plotsquared.core.generator.IndependentPlotGenerator;
 | 
				
			|||||||
import com.plotsquared.core.location.Location;
 | 
					import com.plotsquared.core.location.Location;
 | 
				
			||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					import com.plotsquared.core.plot.PlotArea;
 | 
				
			||||||
import com.plotsquared.core.plot.PlotId;
 | 
					import com.plotsquared.core.plot.PlotId;
 | 
				
			||||||
import com.plotsquared.core.queue.ScopedQueueCoordinator;
 | 
					import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
 | 
				
			||||||
import com.plotsquared.core.util.MathMan;
 | 
					import com.plotsquared.core.util.MathMan;
 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
					import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
				
			||||||
 | 
					import com.sk89q.worldedit.world.biome.BiomeType;
 | 
				
			||||||
import org.bukkit.World;
 | 
					import org.bukkit.World;
 | 
				
			||||||
import org.bukkit.block.Biome;
 | 
					import org.bukkit.block.Biome;
 | 
				
			||||||
import org.bukkit.generator.BlockPopulator;
 | 
					import org.bukkit.generator.BlockPopulator;
 | 
				
			||||||
@@ -49,6 +50,11 @@ final class DelegatePlotGenerator extends IndependentPlotGenerator {
 | 
				
			|||||||
    public void initialize(PlotArea area) {
 | 
					    public void initialize(PlotArea area) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public BiomeType getBiome(final PlotArea settings, final int x, final int y, final int z) {
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public String getName() {
 | 
					    public String getName() {
 | 
				
			||||||
        return this.chunkGenerator.getClass().getName();
 | 
					        return this.chunkGenerator.getClass().getName();
 | 
				
			||||||
@@ -60,7 +66,7 @@ final class DelegatePlotGenerator extends IndependentPlotGenerator {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void generateChunk(final ScopedQueueCoordinator result, PlotArea settings) {
 | 
					    public void generateChunk(final ZeroedDelegateScopedQueueCoordinator result, PlotArea settings, boolean biomes) {
 | 
				
			||||||
        World world = BukkitUtil.getWorld(this.world);
 | 
					        World world = BukkitUtil.getWorld(this.world);
 | 
				
			||||||
        Location min = result.getMin();
 | 
					        Location min = result.getMin();
 | 
				
			||||||
        int chunkX = min.getX() >> 4;
 | 
					        int chunkX = min.getX() >> 4;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,7 @@ import com.plotsquared.core.location.UncheckedWorldLocation;
 | 
				
			|||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					import com.plotsquared.core.plot.PlotArea;
 | 
				
			||||||
import com.plotsquared.core.plot.world.SinglePlotArea;
 | 
					import com.plotsquared.core.plot.world.SinglePlotArea;
 | 
				
			||||||
import com.plotsquared.core.queue.QueueCoordinator;
 | 
					import com.plotsquared.core.queue.QueueCoordinator;
 | 
				
			||||||
import com.plotsquared.core.queue.ScopedQueueCoordinator;
 | 
					import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitWorld;
 | 
					import com.sk89q.worldedit.bukkit.BukkitWorld;
 | 
				
			||||||
import com.sk89q.worldedit.util.SideEffectSet;
 | 
					import com.sk89q.worldedit.util.SideEffectSet;
 | 
				
			||||||
import org.bukkit.Chunk;
 | 
					import org.bukkit.Chunk;
 | 
				
			||||||
@@ -65,7 +65,7 @@ final class LegacyBlockStatePopulator extends BlockPopulator {
 | 
				
			|||||||
        queue.setChunkObject(source);
 | 
					        queue.setChunkObject(source);
 | 
				
			||||||
        Location min = UncheckedWorldLocation.at(world.getName(), chunkMinX, world.getMinHeight(), chunkMinZ);
 | 
					        Location min = UncheckedWorldLocation.at(world.getName(), chunkMinX, world.getMinHeight(), chunkMinZ);
 | 
				
			||||||
        Location max = UncheckedWorldLocation.at(world.getName(), chunkMinX + 15, world.getMaxHeight(), chunkMinZ + 15);
 | 
					        Location max = UncheckedWorldLocation.at(world.getName(), chunkMinX + 15, world.getMaxHeight(), chunkMinZ + 15);
 | 
				
			||||||
        ScopedQueueCoordinator offsetChunkQueue = new ScopedQueueCoordinator(queue, min, max);
 | 
					        ZeroedDelegateScopedQueueCoordinator offsetChunkQueue = new ZeroedDelegateScopedQueueCoordinator(queue, min, max);
 | 
				
			||||||
        this.plotGenerator.populateChunk(offsetChunkQueue, area);
 | 
					        this.plotGenerator.populateChunk(offsetChunkQueue, area);
 | 
				
			||||||
        queue.enqueue();
 | 
					        queue.enqueue();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,6 +33,7 @@ import com.plotsquared.core.plot.PlotArea;
 | 
				
			|||||||
import com.plotsquared.core.plot.flag.implementations.BlockBurnFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.BlockBurnFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.BreakFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.BreakFlag;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.flag.implementations.ConcreteHardenFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.CoralDryFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.CoralDryFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.CropGrowFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.CropGrowFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
 | 
				
			||||||
@@ -55,23 +56,24 @@ import com.plotsquared.core.plot.flag.implementations.VineGrowFlag;
 | 
				
			|||||||
import com.plotsquared.core.plot.flag.types.BlockTypeWrapper;
 | 
					import com.plotsquared.core.plot.flag.types.BlockTypeWrapper;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.types.BooleanFlag;
 | 
					import com.plotsquared.core.plot.flag.types.BooleanFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.PlotFlagUtil;
 | 
					import com.plotsquared.core.util.PlotFlagUtil;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskManager;
 | 
					import com.plotsquared.core.util.task.TaskManager;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskTime;
 | 
					import com.plotsquared.core.util.task.TaskTime;
 | 
				
			||||||
import com.sk89q.worldedit.WorldEdit;
 | 
					import com.sk89q.worldedit.WorldEdit;
 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
					import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
				
			||||||
import com.sk89q.worldedit.world.block.BlockType;
 | 
					import com.sk89q.worldedit.world.block.BlockType;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
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;
 | 
				
			||||||
import org.bukkit.block.data.BlockData;
 | 
					import org.bukkit.block.data.BlockData;
 | 
				
			||||||
import org.bukkit.block.data.type.Dispenser;
 | 
					import org.bukkit.block.data.type.Dispenser;
 | 
				
			||||||
 | 
					import org.bukkit.block.data.type.Farmland;
 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					import org.bukkit.entity.Entity;
 | 
				
			||||||
import org.bukkit.entity.Fireball;
 | 
					import org.bukkit.entity.Fireball;
 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
@@ -99,6 +101,7 @@ import org.bukkit.event.block.BlockSpreadEvent;
 | 
				
			|||||||
import org.bukkit.event.block.CauldronLevelChangeEvent;
 | 
					import org.bukkit.event.block.CauldronLevelChangeEvent;
 | 
				
			||||||
import org.bukkit.event.block.EntityBlockFormEvent;
 | 
					import org.bukkit.event.block.EntityBlockFormEvent;
 | 
				
			||||||
import org.bukkit.event.block.LeavesDecayEvent;
 | 
					import org.bukkit.event.block.LeavesDecayEvent;
 | 
				
			||||||
 | 
					import org.bukkit.event.block.MoistureChangeEvent;
 | 
				
			||||||
import org.bukkit.event.block.SpongeAbsorbEvent;
 | 
					import org.bukkit.event.block.SpongeAbsorbEvent;
 | 
				
			||||||
import org.bukkit.event.world.StructureGrowEvent;
 | 
					import org.bukkit.event.world.StructureGrowEvent;
 | 
				
			||||||
import org.bukkit.projectiles.BlockProjectileSource;
 | 
					import org.bukkit.projectiles.BlockProjectileSource;
 | 
				
			||||||
@@ -113,6 +116,10 @@ import java.util.UUID;
 | 
				
			|||||||
import java.util.stream.Collectors;
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
import java.util.stream.Stream;
 | 
					import java.util.stream.Stream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static org.bukkit.Tag.CORALS;
 | 
				
			||||||
 | 
					import static org.bukkit.Tag.CORAL_BLOCKS;
 | 
				
			||||||
 | 
					import static org.bukkit.Tag.WALL_CORALS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@SuppressWarnings("unused")
 | 
					@SuppressWarnings("unused")
 | 
				
			||||||
public class BlockEventListener implements Listener {
 | 
					public class BlockEventListener implements Listener {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -275,13 +282,23 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
        if (plot != null) {
 | 
					        if (plot != null) {
 | 
				
			||||||
            if (area.notifyIfOutsideBuildArea(pp, location.getY())) {
 | 
					            if (area.notifyIfOutsideBuildArea(pp, location.getY())) {
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
 | 
					                pp.sendMessage(
 | 
				
			||||||
 | 
					                        TranslatableCaption.of("height.height_limit"),
 | 
				
			||||||
 | 
					                        TagResolver.builder()
 | 
				
			||||||
 | 
					                                .tag("minheight", Tag.inserting(Component.text(area.getMinBuildHeight())))
 | 
				
			||||||
 | 
					                                .tag("maxheight", Tag.inserting(Component.text(area.getMaxBuildHeight())))
 | 
				
			||||||
 | 
					                                .build()
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (!plot.hasOwner()) {
 | 
					            if (!plot.hasOwner()) {
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
@@ -295,10 +312,13 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_OTHER)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    plot.debug(player.getName() + " could not place " + event.getBlock().getType()
 | 
					                    plot.debug(player.getName() + " could not place " + event.getBlock().getType()
 | 
				
			||||||
@@ -306,7 +326,7 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
 | 
					            } else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("done.building_restricted")
 | 
					                            TranslatableCaption.of("done.building_restricted")
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
@@ -322,10 +342,13 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
                            + " did not fall because of disable-physics = true");
 | 
					                            + " did not fall because of disable-physics = true");
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
 | 
					        } else if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
 | 
				
			||||||
            pp.sendMessage(
 | 
					            pp.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.no_permission_event"),
 | 
					                    TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                    Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD))
 | 
					                    TagResolver.resolver(
 | 
				
			||||||
 | 
					                            "node",
 | 
				
			||||||
 | 
					                            Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD)
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            event.setCancelled(true);
 | 
					            event.setCancelled(true);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -344,22 +367,30 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
            BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
 | 
					            BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
 | 
				
			||||||
            // == rather than <= as we only care about the "ground level" not being destroyed
 | 
					            // == rather than <= as we only care about the "ground level" not being destroyed
 | 
				
			||||||
            if (event.getBlock().getY() == area.getMinGenHeight()) {
 | 
					            if (event.getBlock().getY() == area.getMinGenHeight()) {
 | 
				
			||||||
                if (!Permissions
 | 
					                if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_GROUNDLEVEL)) {
 | 
				
			||||||
                        .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_GROUNDLEVEL)) {
 | 
					 | 
				
			||||||
                    plotPlayer.sendMessage(
 | 
					                    plotPlayer.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_GROUNDLEVEL))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_GROUNDLEVEL)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else if (area.notifyIfOutsideBuildArea(plotPlayer, location.getY())) {
 | 
					            } else if (area.notifyIfOutsideBuildArea(plotPlayer, location.getY())) {
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
 | 
					                plotPlayer.sendMessage(
 | 
				
			||||||
 | 
					                        TranslatableCaption.of("height.height_limit"),
 | 
				
			||||||
 | 
					                        TagResolver.builder()
 | 
				
			||||||
 | 
					                                .tag("minheight", Tag.inserting(Component.text(area.getMinBuildHeight())))
 | 
				
			||||||
 | 
					                                .tag("maxheight", Tag.inserting(Component.text(area.getMaxBuildHeight())))
 | 
				
			||||||
 | 
					                                .build()
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (!plot.hasOwner()) {
 | 
					            if (!plot.hasOwner()) {
 | 
				
			||||||
                if (!Permissions
 | 
					                if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED, true)) {
 | 
				
			||||||
                        .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_UNOWNED, true)) {
 | 
					 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
@@ -373,17 +404,19 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (Permissions
 | 
					                if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
 | 
				
			||||||
                        .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
 | 
					 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                plotPlayer.sendMessage(
 | 
					                plotPlayer.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission_event"),
 | 
					                        TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                        Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_OTHER))
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                "node",
 | 
				
			||||||
 | 
					                                Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_OTHER)
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
            } else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
 | 
					            } else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
 | 
				
			||||||
                if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
					                if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
				
			||||||
                    plotPlayer.sendMessage(
 | 
					                    plotPlayer.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("done.building_restricted")
 | 
					                            TranslatableCaption.of("done.building_restricted")
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
@@ -394,7 +427,7 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        BukkitPlayer pp = BukkitUtil.adapt(player);
 | 
					        BukkitPlayer pp = BukkitUtil.adapt(player);
 | 
				
			||||||
        if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_ROAD)) {
 | 
					        if (pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_ROAD)) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (this.worldEdit != null && pp.getAttribute("worldedit")) {
 | 
					        if (this.worldEdit != null && pp.getAttribute("worldedit")) {
 | 
				
			||||||
@@ -405,7 +438,10 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        pp.sendMessage(
 | 
					        pp.sendMessage(
 | 
				
			||||||
                TranslatableCaption.of("permission.no_permission_event"),
 | 
					                TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_ROAD))
 | 
					                TagResolver.resolver(
 | 
				
			||||||
 | 
					                        "node",
 | 
				
			||||||
 | 
					                        Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_ROAD)
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        event.setCancelled(true);
 | 
					        event.setCancelled(true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -479,18 +515,18 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
                    BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
 | 
					                    BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
 | 
				
			||||||
                    if (plot != null) {
 | 
					                    if (plot != null) {
 | 
				
			||||||
                        if (!plot.hasOwner()) {
 | 
					                        if (!plot.hasOwner()) {
 | 
				
			||||||
                            if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) {
 | 
					                            if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) {
 | 
				
			||||||
                                return;
 | 
					                                return;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        } else if (!plot.isAdded(plotPlayer.getUUID())) {
 | 
					                        } else if (!plot.isAdded(plotPlayer.getUUID())) {
 | 
				
			||||||
                            if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
 | 
					                            if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
 | 
				
			||||||
                                return;
 | 
					                                return;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        } else {
 | 
					                        } else {
 | 
				
			||||||
                            return;
 | 
					                            return;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_ROAD)) {
 | 
					                        if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD)) {
 | 
				
			||||||
                            return;
 | 
					                            return;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        if (this.worldEdit != null && plotPlayer.getAttribute("worldedit")) {
 | 
					                        if (this.worldEdit != null && plotPlayer.getAttribute("worldedit")) {
 | 
				
			||||||
@@ -538,19 +574,25 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
            event.setCancelled(true);
 | 
					            event.setCancelled(true);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (SNOW.contains(event.getNewState().getType())) {
 | 
					        if (org.bukkit.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;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Tag.ICE.isTagged(event.getNewState().getType())) {
 | 
					        if (org.bukkit.Tag.ICE.isTagged(event.getNewState().getType())) {
 | 
				
			||||||
            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);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        if (event.getNewState().getType().toString().endsWith("CONCRETE")) {
 | 
				
			||||||
 | 
					            if (!plot.getFlag(ConcreteHardenFlag.class)) {
 | 
				
			||||||
 | 
					                plot.debug("Concrete powder could not harden because concrete-harden = false");
 | 
				
			||||||
 | 
					                event.setCancelled(true);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
 | 
					    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
 | 
				
			||||||
@@ -570,9 +612,9 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Class<? extends BooleanFlag<?>> flag;
 | 
					        Class<? extends BooleanFlag<?>> flag;
 | 
				
			||||||
        if (SNOW.contains(event.getNewState().getType())) {
 | 
					        if (org.bukkit.Tag.SNOW.isTagged(event.getNewState().getType())) {
 | 
				
			||||||
            flag = SnowFormFlag.class;
 | 
					            flag = SnowFormFlag.class;
 | 
				
			||||||
        } else if (Tag.ICE.isTagged(event.getNewState().getType())) {
 | 
					        } else if (org.bukkit.Tag.ICE.isTagged(event.getNewState().getType())) {
 | 
				
			||||||
            flag = IceFormFlag.class;
 | 
					            flag = IceFormFlag.class;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
@@ -635,8 +677,7 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            if (!plot.hasOwner()) {
 | 
					            if (!plot.hasOwner()) {
 | 
				
			||||||
                BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
 | 
					                BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
 | 
				
			||||||
                if (Permissions
 | 
					                if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) {
 | 
				
			||||||
                        .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) {
 | 
					 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
@@ -648,8 +689,7 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
                Block block = event.getBlock();
 | 
					                Block block = event.getBlock();
 | 
				
			||||||
                if (destroy
 | 
					                if (destroy
 | 
				
			||||||
                        .contains(BlockTypeWrapper.get(BukkitAdapter.asBlockType(block.getType())))
 | 
					                        .contains(BlockTypeWrapper.get(BukkitAdapter.asBlockType(block.getType())))
 | 
				
			||||||
                        || Permissions
 | 
					                        || plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
 | 
				
			||||||
                        .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
 | 
					 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                plot.debug(player.getName() + " could not break " + block.getType()
 | 
					                plot.debug(player.getName() + " could not break " + block.getType()
 | 
				
			||||||
@@ -660,7 +700,7 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
 | 
					        BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
 | 
				
			||||||
        if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_ROAD)) {
 | 
					        if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_ROAD)) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        event.setCancelled(true);
 | 
					        event.setCancelled(true);
 | 
				
			||||||
@@ -680,14 +720,14 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Material blockType = block.getType();
 | 
					        Material blockType = block.getType();
 | 
				
			||||||
        if (Tag.ICE.isTagged(blockType)) {
 | 
					        if (org.bukkit.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);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (SNOW.contains(blockType)) {
 | 
					        if (org.bukkit.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);
 | 
				
			||||||
@@ -701,7 +741,7 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Tag.CORAL_BLOCKS.isTagged(blockType) || Tag.CORALS.isTagged(blockType) || Tag.WALL_CORALS.isTagged(blockType)) {
 | 
					        if (CORAL_BLOCKS.isTagged(blockType) || CORALS.isTagged(blockType) || WALL_CORALS.isTagged(blockType)) {
 | 
				
			||||||
            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);
 | 
				
			||||||
@@ -709,6 +749,43 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
 | 
				
			||||||
 | 
					    public void onMoistureChange(MoistureChangeEvent event) {
 | 
				
			||||||
 | 
					        Block block = event.getBlock();
 | 
				
			||||||
 | 
					        Location location = BukkitUtil.adapt(block.getLocation());
 | 
				
			||||||
 | 
					        PlotArea area = location.getPlotArea();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (area == null) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Plot plot = area.getOwnedPlot(location);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (plot == null) {
 | 
				
			||||||
 | 
					            event.setCancelled(true);
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (block.getBlockData() instanceof Farmland farmland && event
 | 
				
			||||||
 | 
					                .getNewState()
 | 
				
			||||||
 | 
					                .getBlockData() instanceof Farmland newFarmland) {
 | 
				
			||||||
 | 
					            int currentMoisture = farmland.getMoisture();
 | 
				
			||||||
 | 
					            int newMoisture = newFarmland.getMoisture();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // farmland gets moisturizes
 | 
				
			||||||
 | 
					            if (newMoisture > currentMoisture) {
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (plot.getFlag(SoilDryFlag.class)) {
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            plot.debug("Soil could not dry because soil-dry = false");
 | 
				
			||||||
 | 
					            event.setCancelled(true);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
 | 
					    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
 | 
				
			||||||
    public void onChange(BlockFromToEvent event) {
 | 
					    public void onChange(BlockFromToEvent event) {
 | 
				
			||||||
        Block fromBlock = event.getBlock();
 | 
					        Block fromBlock = event.getBlock();
 | 
				
			||||||
@@ -754,7 +831,10 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (toPlot != null) {
 | 
					        if (toPlot != null) {
 | 
				
			||||||
            if (!toArea.contains(fromLocation.getX(), fromLocation.getZ()) || !Objects.equals(toPlot, toArea.getOwnedPlot(fromLocation))) {
 | 
					            if (!toArea.contains(fromLocation.getX(), fromLocation.getZ()) || !Objects.equals(
 | 
				
			||||||
 | 
					                    toPlot,
 | 
				
			||||||
 | 
					                    toArea.getOwnedPlot(fromLocation)
 | 
				
			||||||
 | 
					            )) {
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -770,7 +850,10 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
                toPlot.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 (!toArea.contains(fromLocation.getX(), fromLocation.getZ()) || !Objects.equals(null, toArea.getOwnedPlot(fromLocation))) {
 | 
					        } 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();
 | 
				
			||||||
@@ -1040,6 +1123,7 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
            if (plot != null) {
 | 
					            if (plot != null) {
 | 
				
			||||||
                plot.debug("Explosion was cancelled because explosion = false");
 | 
					                plot.debug("Explosion was cancelled because explosion = false");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        event.blockList().removeIf(blox -> !plot.equals(area.getOwnedPlot(BukkitUtil.adapt(blox.getLocation()))));
 | 
					        event.blockList().removeIf(blox -> !plot.equals(area.getOwnedPlot(BukkitUtil.adapt(blox.getLocation()))));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -1088,32 +1172,39 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (plot == null) {
 | 
					            if (plot == null) {
 | 
				
			||||||
                if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, BlockIgnitionFlag.class, true) && !Permissions.hasPermission(
 | 
					                if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, BlockIgnitionFlag.class, true) && !pp.hasPermission(
 | 
				
			||||||
                        pp,
 | 
					 | 
				
			||||||
                        Permission.PERMISSION_ADMIN_BUILD_ROAD
 | 
					                        Permission.PERMISSION_ADMIN_BUILD_ROAD
 | 
				
			||||||
                )) {
 | 
					                )) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else if (!plot.hasOwner()) {
 | 
					            } else if (!plot.hasOwner()) {
 | 
				
			||||||
                if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, BlockIgnitionFlag.class, true) && !Permissions.hasPermission(
 | 
					                if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, BlockIgnitionFlag.class, true) && !pp.hasPermission(
 | 
				
			||||||
                        pp,
 | 
					 | 
				
			||||||
                        Permission.PERMISSION_ADMIN_BUILD_UNOWNED
 | 
					                        Permission.PERMISSION_ADMIN_BUILD_UNOWNED
 | 
				
			||||||
                )) {
 | 
					                )) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else if (!plot.isAdded(pp.getUUID())) {
 | 
					            } else if (!plot.isAdded(pp.getUUID())) {
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_OTHER)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -1234,17 +1325,27 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        for (final BlockState state : event.getReplacedBlockStates()) {
 | 
					        for (final BlockState state : event.getReplacedBlockStates()) {
 | 
				
			||||||
            Location currentLocation = BukkitUtil.adapt(state.getLocation());
 | 
					            Location currentLocation = BukkitUtil.adapt(state.getLocation());
 | 
				
			||||||
            if (!Permissions.hasPermission(
 | 
					            if (!pp.hasPermission(
 | 
				
			||||||
                    pp,
 | 
					 | 
				
			||||||
                    Permission.PERMISSION_ADMIN_BUILD_ROAD
 | 
					                    Permission.PERMISSION_ADMIN_BUILD_ROAD
 | 
				
			||||||
            ) && !(Objects.equals(currentLocation.getPlot(), plot))) {
 | 
					            ) && !(Objects.equals(currentLocation.getPlot(), plot))) {
 | 
				
			||||||
                pp.sendMessage(
 | 
					                pp.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission_event"),
 | 
					                        TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                        Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD))
 | 
					                        TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (currentLocation.getY() >= area.getMaxBuildHeight() || currentLocation.getY() < area.getMinBuildHeight()) {
 | 
				
			||||||
 | 
					                pp.sendMessage(
 | 
				
			||||||
 | 
					                        TranslatableCaption.of("height.height_limit"),
 | 
				
			||||||
 | 
					                        TagResolver.builder()
 | 
				
			||||||
 | 
					                                .tag("minheight", Tag.inserting(Component.text(area.getMinBuildHeight())))
 | 
				
			||||||
 | 
					                                .tag("maxheight", Tag.inserting(Component.text(area.getMaxBuildHeight())))
 | 
				
			||||||
 | 
					                                .build()
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
                if (area.notifyIfOutsideBuildArea(pp, currentLocation.getY())) {
 | 
					                if (area.notifyIfOutsideBuildArea(pp, currentLocation.getY())) {
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
@@ -1252,4 +1353,6 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,7 @@ import com.plotsquared.core.plot.Plot;
 | 
				
			|||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					import com.plotsquared.core.plot.PlotArea;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.flag.implementations.SculkSensorInteractFlag;
 | 
				
			||||||
import com.plotsquared.core.util.PlotFlagUtil;
 | 
					import com.plotsquared.core.util.PlotFlagUtil;
 | 
				
			||||||
import org.bukkit.Material;
 | 
					import org.bukkit.Material;
 | 
				
			||||||
import org.bukkit.block.Block;
 | 
					import org.bukkit.block.Block;
 | 
				
			||||||
@@ -92,12 +93,16 @@ public class BlockEventListener117 implements Listener {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Plot plot = location.getOwnedPlot();
 | 
					        Plot plot = location.getOwnedPlot();
 | 
				
			||||||
        if (plot == null && !PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, MiscInteractFlag.class, true) || plot != null && !plot.getFlag(
 | 
					        if (plot == null && !PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(
 | 
				
			||||||
                MiscInteractFlag.class)) {
 | 
					                area,
 | 
				
			||||||
 | 
					                MiscInteractFlag.class,
 | 
				
			||||||
 | 
					                true
 | 
				
			||||||
 | 
					        ) || plot != null && (!plot.getFlag(MiscInteractFlag.class) || !plot.getFlag(SculkSensorInteractFlag.class))) {
 | 
				
			||||||
            if (plotPlayer != null) {
 | 
					            if (plotPlayer != null) {
 | 
				
			||||||
                if (plot != null) {
 | 
					                if (plot != null) {
 | 
				
			||||||
                    if (!plot.isAdded(plotPlayer.getUUID())) {
 | 
					                    if (!plot.isAdded(plotPlayer.getUUID())) {
 | 
				
			||||||
                        plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because misc-interact = false");
 | 
					                        plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because both " +
 | 
				
			||||||
 | 
					                                "sculk-sensor-interact and misc-interact = false");
 | 
				
			||||||
                        event.setCancelled(true);
 | 
					                        event.setCancelled(true);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -108,13 +113,15 @@ public class BlockEventListener117 implements Listener {
 | 
				
			|||||||
                if (plot != null) {
 | 
					                if (plot != null) {
 | 
				
			||||||
                    if (itemThrower == null && (itemThrower = item.getOwner()) == null) {
 | 
					                    if (itemThrower == null && (itemThrower = item.getOwner()) == null) {
 | 
				
			||||||
                        plot.debug(
 | 
					                        plot.debug(
 | 
				
			||||||
                                "A thrown item couldn't trigger sculk sensors because misc-interact = false and the item's owner could not be resolved.");
 | 
					                                "A thrown item couldn't trigger sculk sensors because both sculk-sensor-interact and " +
 | 
				
			||||||
 | 
					                                        "misc-interact = false and the item's owner could not be resolved.");
 | 
				
			||||||
                        event.setCancelled(true);
 | 
					                        event.setCancelled(true);
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    if (!plot.isAdded(itemThrower)) {
 | 
					                    if (!plot.isAdded(itemThrower)) {
 | 
				
			||||||
                        if (!plot.isAdded(itemThrower)) {
 | 
					                        if (!plot.isAdded(itemThrower)) {
 | 
				
			||||||
                            plot.debug("A thrown item couldn't trigger sculk sensors because misc-interact = false");
 | 
					                            plot.debug("A thrown item couldn't trigger sculk sensors because both sculk-sensor-interact and " +
 | 
				
			||||||
 | 
					                                    "misc-interact = false");
 | 
				
			||||||
                            event.setCancelled(true);
 | 
					                            event.setCancelled(true);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -133,7 +140,6 @@ public class BlockEventListener117 implements Listener {
 | 
				
			|||||||
        if (area == null) {
 | 
					        if (area == null) {
 | 
				
			||||||
            for (int i = blocks.size() - 1; i >= 0; i--) {
 | 
					            for (int i = blocks.size() - 1; i >= 0; i--) {
 | 
				
			||||||
                Location blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
 | 
					                Location blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
 | 
				
			||||||
                blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
 | 
					 | 
				
			||||||
                if (blockLocation.isPlotArea()) {
 | 
					                if (blockLocation.isPlotArea()) {
 | 
				
			||||||
                    blocks.remove(i);
 | 
					                    blocks.remove(i);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,7 @@ import com.plotsquared.core.plot.Plot;
 | 
				
			|||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					import com.plotsquared.core.plot.PlotArea;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.plot.world.SinglePlotArea;
 | 
					import com.plotsquared.core.plot.world.SinglePlotArea;
 | 
				
			||||||
 | 
					import com.plotsquared.core.util.ReflectionUtils;
 | 
				
			||||||
import com.plotsquared.core.util.ReflectionUtils.RefClass;
 | 
					import com.plotsquared.core.util.ReflectionUtils.RefClass;
 | 
				
			||||||
import com.plotsquared.core.util.ReflectionUtils.RefField;
 | 
					import com.plotsquared.core.util.ReflectionUtils.RefField;
 | 
				
			||||||
import com.plotsquared.core.util.ReflectionUtils.RefMethod;
 | 
					import com.plotsquared.core.util.ReflectionUtils.RefMethod;
 | 
				
			||||||
@@ -64,9 +65,11 @@ public class ChunkListener implements Listener {
 | 
				
			|||||||
    private final PlotAreaManager plotAreaManager;
 | 
					    private final PlotAreaManager plotAreaManager;
 | 
				
			||||||
    private final int version;
 | 
					    private final int version;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private RefMethod methodSetUnsaved;
 | 
				
			||||||
    private RefMethod methodGetHandleChunk;
 | 
					    private RefMethod methodGetHandleChunk;
 | 
				
			||||||
    private RefMethod methodGetHandleWorld;
 | 
					    private RefMethod methodGetHandleWorld;
 | 
				
			||||||
    private RefField mustSave;
 | 
					    private RefField mustNotSave;
 | 
				
			||||||
 | 
					    private Object objChunkStatusFull = null;
 | 
				
			||||||
    /*
 | 
					    /*
 | 
				
			||||||
    private RefMethod methodGetFullChunk;
 | 
					    private RefMethod methodGetFullChunk;
 | 
				
			||||||
    private RefMethod methodGetBukkitChunk;
 | 
					    private RefMethod methodGetBukkitChunk;
 | 
				
			||||||
@@ -79,7 +82,6 @@ public class ChunkListener implements Listener {
 | 
				
			|||||||
    */
 | 
					    */
 | 
				
			||||||
    private Chunk lastChunk;
 | 
					    private Chunk lastChunk;
 | 
				
			||||||
    private boolean ignoreUnload = false;
 | 
					    private boolean ignoreUnload = false;
 | 
				
			||||||
    private boolean isTrueForNotSave = true;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Inject
 | 
					    @Inject
 | 
				
			||||||
    public ChunkListener(final @NonNull PlotAreaManager plotAreaManager) {
 | 
					    public ChunkListener(final @NonNull PlotAreaManager plotAreaManager) {
 | 
				
			||||||
@@ -90,22 +92,27 @@ public class ChunkListener implements Listener {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            RefClass classCraftWorld = getRefClass("{cb}.CraftWorld");
 | 
					            RefClass classCraftWorld = getRefClass("{cb}.CraftWorld");
 | 
				
			||||||
            this.methodGetHandleWorld = classCraftWorld.getMethod("getHandle");
 | 
					 | 
				
			||||||
            RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
 | 
					            RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
 | 
				
			||||||
 | 
					            ReflectionUtils.RefClass classChunkAccess = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
 | 
				
			||||||
 | 
					            this.methodSetUnsaved = classChunkAccess.getMethod("a", boolean.class);
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
                this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle");
 | 
					                this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle");
 | 
				
			||||||
 | 
					            } catch (NoSuchMethodException ignored) {
 | 
				
			||||||
 | 
					                try {
 | 
				
			||||||
 | 
					                    RefClass classChunkStatus = getRefClass("net.minecraft.world.level.chunk.ChunkStatus");
 | 
				
			||||||
 | 
					                    this.objChunkStatusFull = classChunkStatus.getRealClass().getField("n").get(null);
 | 
				
			||||||
 | 
					                    this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle", classChunkStatus.getRealClass());
 | 
				
			||||||
 | 
					                } catch (NoSuchMethodException ex) {
 | 
				
			||||||
 | 
					                    throw new RuntimeException(ex);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                if (version < 17) {
 | 
					                if (version < 17) {
 | 
				
			||||||
                    RefClass classChunk = getRefClass("{nms}.Chunk");
 | 
					                    RefClass classChunk = getRefClass("{nms}.Chunk");
 | 
				
			||||||
                    if (version == 13) {
 | 
					                    this.mustNotSave = classChunk.getField("mustNotSave");
 | 
				
			||||||
                        this.mustSave = classChunk.getField("mustSave");
 | 
					 | 
				
			||||||
                        this.isTrueForNotSave = false;
 | 
					 | 
				
			||||||
                    } else {
 | 
					 | 
				
			||||||
                        this.mustSave = classChunk.getField("mustNotSave");
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
 | 
					                    RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
 | 
				
			||||||
                    this.mustSave = classChunk.getField("mustNotSave");
 | 
					                    this.mustNotSave = classChunk.getField("mustNotSave");
 | 
				
			||||||
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } catch (NoSuchFieldException e) {
 | 
					            } catch (NoSuchFieldException e) {
 | 
				
			||||||
                e.printStackTrace();
 | 
					                e.printStackTrace();
 | 
				
			||||||
@@ -167,10 +174,13 @@ public class ChunkListener implements Listener {
 | 
				
			|||||||
        if (safe && shouldSave(world, chunk.getX(), chunk.getZ())) {
 | 
					        if (safe && shouldSave(world, chunk.getX(), chunk.getZ())) {
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Object c = this.methodGetHandleChunk.of(chunk).call();
 | 
					        Object c = objChunkStatusFull != null
 | 
				
			||||||
        RefField.RefExecutor field = this.mustSave.of(c);
 | 
					                ? this.methodGetHandleChunk.of(chunk).call(objChunkStatusFull)
 | 
				
			||||||
        if ((Boolean) field.get() != isTrueForNotSave) {
 | 
					                : this.methodGetHandleChunk.of(chunk).call();
 | 
				
			||||||
            field.set(isTrueForNotSave);
 | 
					        RefField.RefExecutor field = this.mustNotSave.of(c);
 | 
				
			||||||
 | 
					        methodSetUnsaved.of(c).call(false);
 | 
				
			||||||
 | 
					        if (!((Boolean) field.get())) {
 | 
				
			||||||
 | 
					            field.set(true);
 | 
				
			||||||
            if (chunk.isLoaded()) {
 | 
					            if (chunk.isLoaded()) {
 | 
				
			||||||
                ignoreUnload = true;
 | 
					                ignoreUnload = true;
 | 
				
			||||||
                chunk.unload(false);
 | 
					                chunk.unload(false);
 | 
				
			||||||
@@ -234,7 +244,8 @@ public class ChunkListener implements Listener {
 | 
				
			|||||||
        Chunk chunk = event.getChunk();
 | 
					        Chunk chunk = event.getChunk();
 | 
				
			||||||
        if (Settings.Chunk_Processor.AUTO_TRIM) {
 | 
					        if (Settings.Chunk_Processor.AUTO_TRIM) {
 | 
				
			||||||
            String world = chunk.getWorld().getName();
 | 
					            String world = chunk.getWorld().getName();
 | 
				
			||||||
            if ((!Settings.Enabled_Components.WORLDS || !SinglePlotArea.isSinglePlotWorld(world)) && this.plotAreaManager.hasPlotArea(world)) {
 | 
					            if ((!Settings.Enabled_Components.WORLDS || !SinglePlotArea.isSinglePlotWorld(world)) && this.plotAreaManager.hasPlotArea(
 | 
				
			||||||
 | 
					                    world)) {
 | 
				
			||||||
                if (unloadChunk(world, chunk, true)) {
 | 
					                if (unloadChunk(world, chunk, true)) {
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,7 +37,6 @@ import com.plotsquared.core.plot.flag.implementations.ExplosionFlag;
 | 
				
			|||||||
import com.plotsquared.core.plot.flag.implementations.InvincibleFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.InvincibleFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.PlotFlagUtil;
 | 
					import com.plotsquared.core.util.PlotFlagUtil;
 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
					import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
				
			||||||
import com.sk89q.worldedit.world.block.BlockType;
 | 
					import com.sk89q.worldedit.world.block.BlockType;
 | 
				
			||||||
@@ -146,54 +145,38 @@ public class EntityEventListener implements Listener {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason();
 | 
					        CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason();
 | 
				
			||||||
        switch (reason.toString()) {
 | 
					        switch (reason.toString()) {
 | 
				
			||||||
            case "DISPENSE_EGG":
 | 
					            case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> {
 | 
				
			||||||
            case "EGG":
 | 
					 | 
				
			||||||
            case "OCELOT_BABY":
 | 
					 | 
				
			||||||
            case "SPAWNER_EGG":
 | 
					 | 
				
			||||||
                if (!area.isSpawnEggs()) {
 | 
					                if (!area.isSpawnEggs()) {
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                break;
 | 
					            }
 | 
				
			||||||
            case "REINFORCEMENTS":
 | 
					            case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
 | 
				
			||||||
            case "NATURAL":
 | 
					                    "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL",
 | 
				
			||||||
            case "MOUNT":
 | 
					                    "DUPLICATION", "FROZEN", "SPELL" -> {
 | 
				
			||||||
            case "PATROL":
 | 
					 | 
				
			||||||
            case "RAID":
 | 
					 | 
				
			||||||
            case "SHEARED":
 | 
					 | 
				
			||||||
            case "SILVERFISH_BLOCK":
 | 
					 | 
				
			||||||
            case "ENDER_PEARL":
 | 
					 | 
				
			||||||
            case "TRAP":
 | 
					 | 
				
			||||||
            case "VILLAGE_DEFENSE":
 | 
					 | 
				
			||||||
            case "VILLAGE_INVASION":
 | 
					 | 
				
			||||||
            case "BEEHIVE":
 | 
					 | 
				
			||||||
            case "CHUNK_GEN":
 | 
					 | 
				
			||||||
                if (!area.isMobSpawning()) {
 | 
					                if (!area.isMobSpawning()) {
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                break;
 | 
					            }
 | 
				
			||||||
            case "BREEDING":
 | 
					            case "BREEDING" -> {
 | 
				
			||||||
                if (!area.isSpawnBreeding()) {
 | 
					                if (!area.isSpawnBreeding()) {
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                break;
 | 
					            }
 | 
				
			||||||
            case "BUILD_IRONGOLEM":
 | 
					            case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
 | 
				
			||||||
            case "BUILD_SNOWMAN":
 | 
					 | 
				
			||||||
            case "BUILD_WITHER":
 | 
					 | 
				
			||||||
            case "CUSTOM":
 | 
					 | 
				
			||||||
                if (!area.isSpawnCustom() && entity.getType() != EntityType.ARMOR_STAND) {
 | 
					                if (!area.isSpawnCustom() && entity.getType() != EntityType.ARMOR_STAND) {
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                break;
 | 
					            }
 | 
				
			||||||
            case "SPAWNER":
 | 
					            case "SPAWNER" -> {
 | 
				
			||||||
                if (!area.isMobSpawnerSpawning()) {
 | 
					                if (!area.isMobSpawnerSpawning()) {
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                break;
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Plot plot = area.getOwnedPlotAbs(location);
 | 
					        Plot plot = area.getOwnedPlotAbs(location);
 | 
				
			||||||
        if (plot == null) {
 | 
					        if (plot == null) {
 | 
				
			||||||
@@ -371,14 +354,13 @@ public class EntityEventListener implements Listener {
 | 
				
			|||||||
            if (shooter instanceof Player) {
 | 
					            if (shooter instanceof Player) {
 | 
				
			||||||
                PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter);
 | 
					                PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter);
 | 
				
			||||||
                if (plot == null) {
 | 
					                if (plot == null) {
 | 
				
			||||||
                    if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
 | 
					                    if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
 | 
				
			||||||
                        entity.remove();
 | 
					                        entity.remove();
 | 
				
			||||||
                        event.setCancelled(true);
 | 
					                        event.setCancelled(true);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (plot.isAdded(pp.getUUID()) || Permissions
 | 
					                if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
 | 
				
			||||||
                        .hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
 | 
					 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                entity.remove();
 | 
					                entity.remove();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,6 @@ 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;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.ForcefieldFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.ForcefieldFlag;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
import org.bukkit.util.Vector;
 | 
					import org.bukkit.util.Vector;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -109,8 +108,7 @@ public class ForceFieldListener {
 | 
				
			|||||||
            if (plot.isAdded(uuid)) {
 | 
					            if (plot.isAdded(uuid)) {
 | 
				
			||||||
                Set<PlotPlayer<?>> players = getNearbyPlayers(player, plot);
 | 
					                Set<PlotPlayer<?>> players = getNearbyPlayers(player, plot);
 | 
				
			||||||
                for (PlotPlayer<?> oPlayer : players) {
 | 
					                for (PlotPlayer<?> oPlayer : players) {
 | 
				
			||||||
                    if (!Permissions
 | 
					                    if (!oPlayer.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_FORCEFIELD)) {
 | 
				
			||||||
                            .hasPermission(oPlayer, Permission.PERMISSION_ADMIN_ENTRY_FORCEFIELD)) {
 | 
					 | 
				
			||||||
                        ((BukkitPlayer) oPlayer).player
 | 
					                        ((BukkitPlayer) oPlayer).player
 | 
				
			||||||
                                .setVelocity(calculateVelocity(plotPlayer, oPlayer));
 | 
					                                .setVelocity(calculateVelocity(plotPlayer, oPlayer));
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -120,8 +118,7 @@ public class ForceFieldListener {
 | 
				
			|||||||
                if (oPlayer == null) {
 | 
					                if (oPlayer == null) {
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!Permissions
 | 
					                if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_FORCEFIELD)) {
 | 
				
			||||||
                        .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_ENTRY_FORCEFIELD)) {
 | 
					 | 
				
			||||||
                    player.setVelocity(calculateVelocity(oPlayer, plotPlayer));
 | 
					                    player.setVelocity(calculateVelocity(oPlayer, plotPlayer));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,9 +43,10 @@ import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
				
			|||||||
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.types.BooleanFlag;
 | 
					import com.plotsquared.core.plot.flag.types.BooleanFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.PlotFlagUtil;
 | 
					import com.plotsquared.core.util.PlotFlagUtil;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.bukkit.Chunk;
 | 
					import org.bukkit.Chunk;
 | 
				
			||||||
import org.bukkit.block.Block;
 | 
					import org.bukkit.block.Block;
 | 
				
			||||||
import org.bukkit.block.TileState;
 | 
					import org.bukkit.block.TileState;
 | 
				
			||||||
@@ -177,59 +178,41 @@ public class PaperListener implements Listener {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        CreatureSpawnEvent.SpawnReason reason = event.getReason();
 | 
					        CreatureSpawnEvent.SpawnReason reason = event.getReason();
 | 
				
			||||||
        switch (reason.toString()) {
 | 
					        switch (reason.toString()) {
 | 
				
			||||||
            case "DISPENSE_EGG":
 | 
					            case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> {
 | 
				
			||||||
            case "EGG":
 | 
					 | 
				
			||||||
            case "OCELOT_BABY":
 | 
					 | 
				
			||||||
            case "SPAWNER_EGG":
 | 
					 | 
				
			||||||
                if (!area.isSpawnEggs()) {
 | 
					                if (!area.isSpawnEggs()) {
 | 
				
			||||||
                    event.setShouldAbortSpawn(true);
 | 
					                    event.setShouldAbortSpawn(true);
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                break;
 | 
					            }
 | 
				
			||||||
            case "REINFORCEMENTS":
 | 
					            case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL", "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> {
 | 
				
			||||||
            case "NATURAL":
 | 
					 | 
				
			||||||
            case "MOUNT":
 | 
					 | 
				
			||||||
            case "PATROL":
 | 
					 | 
				
			||||||
            case "RAID":
 | 
					 | 
				
			||||||
            case "SHEARED":
 | 
					 | 
				
			||||||
            case "SILVERFISH_BLOCK":
 | 
					 | 
				
			||||||
            case "ENDER_PEARL":
 | 
					 | 
				
			||||||
            case "TRAP":
 | 
					 | 
				
			||||||
            case "VILLAGE_DEFENSE":
 | 
					 | 
				
			||||||
            case "VILLAGE_INVASION":
 | 
					 | 
				
			||||||
            case "BEEHIVE":
 | 
					 | 
				
			||||||
            case "CHUNK_GEN":
 | 
					 | 
				
			||||||
                if (!area.isMobSpawning()) {
 | 
					                if (!area.isMobSpawning()) {
 | 
				
			||||||
                    event.setShouldAbortSpawn(true);
 | 
					                    event.setShouldAbortSpawn(true);
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                break;
 | 
					            }
 | 
				
			||||||
            case "BREEDING":
 | 
					            case "BREEDING" -> {
 | 
				
			||||||
                if (!area.isSpawnBreeding()) {
 | 
					                if (!area.isSpawnBreeding()) {
 | 
				
			||||||
                    event.setShouldAbortSpawn(true);
 | 
					                    event.setShouldAbortSpawn(true);
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                break;
 | 
					            }
 | 
				
			||||||
            case "BUILD_IRONGOLEM":
 | 
					            case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
 | 
				
			||||||
            case "BUILD_SNOWMAN":
 | 
					 | 
				
			||||||
            case "BUILD_WITHER":
 | 
					 | 
				
			||||||
            case "CUSTOM":
 | 
					 | 
				
			||||||
                if (!area.isSpawnCustom() && event.getType() != EntityType.ARMOR_STAND) {
 | 
					                if (!area.isSpawnCustom() && event.getType() != EntityType.ARMOR_STAND) {
 | 
				
			||||||
                    event.setShouldAbortSpawn(true);
 | 
					                    event.setShouldAbortSpawn(true);
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                break;
 | 
					            }
 | 
				
			||||||
            case "SPAWNER":
 | 
					            case "SPAWNER" -> {
 | 
				
			||||||
                if (!area.isMobSpawnerSpawning()) {
 | 
					                if (!area.isMobSpawnerSpawning()) {
 | 
				
			||||||
                    event.setShouldAbortSpawn(true);
 | 
					                    event.setShouldAbortSpawn(true);
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                break;
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Plot plot = location.getOwnedPlotAbs();
 | 
					        Plot plot = location.getOwnedPlotAbs();
 | 
				
			||||||
        if (plot == null) {
 | 
					        if (plot == null) {
 | 
				
			||||||
@@ -303,7 +286,7 @@ public class PaperListener implements Listener {
 | 
				
			|||||||
            final PlotPlayer<?> plotPlayer = BukkitUtil.adapt(event.getPlayer());
 | 
					            final PlotPlayer<?> plotPlayer = BukkitUtil.adapt(event.getPlayer());
 | 
				
			||||||
            plotPlayer.sendMessage(
 | 
					            plotPlayer.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("errors.tile_entity_cap_reached"),
 | 
					                    TranslatableCaption.of("errors.tile_entity_cap_reached"),
 | 
				
			||||||
                    Template.of("amount", String.valueOf(Settings.Chunk_Processor.MAX_TILES))
 | 
					                    TagResolver.resolver("amount", Tag.inserting(Component.text(Settings.Chunk_Processor.MAX_TILES)))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            event.setCancelled(true);
 | 
					            event.setCancelled(true);
 | 
				
			||||||
            event.setBuild(false);
 | 
					            event.setBuild(false);
 | 
				
			||||||
@@ -335,32 +318,40 @@ public class PaperListener implements Listener {
 | 
				
			|||||||
        Plot plot = location.getOwnedPlot();
 | 
					        Plot plot = location.getOwnedPlot();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (plot == null) {
 | 
					        if (plot == null) {
 | 
				
			||||||
            if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true) && !Permissions.hasPermission(
 | 
					            if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true) && !pp.hasPermission(
 | 
				
			||||||
                    pp,
 | 
					 | 
				
			||||||
                    Permission.PERMISSION_ADMIN_PROJECTILE_ROAD
 | 
					                    Permission.PERMISSION_ADMIN_PROJECTILE_ROAD
 | 
				
			||||||
            )) {
 | 
					            )) {
 | 
				
			||||||
                pp.sendMessage(
 | 
					                pp.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission_event"),
 | 
					                        TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                        Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD))
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                "node",
 | 
				
			||||||
 | 
					                                Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD)
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                entity.remove();
 | 
					                entity.remove();
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else if (!plot.hasOwner()) {
 | 
					        } else if (!plot.hasOwner()) {
 | 
				
			||||||
            if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
 | 
					            if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
 | 
				
			||||||
                pp.sendMessage(
 | 
					                pp.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission_event"),
 | 
					                        TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                        Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED))
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                "node",
 | 
				
			||||||
 | 
					                                Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                entity.remove();
 | 
					                entity.remove();
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else if (!plot.isAdded(pp.getUUID())) {
 | 
					        } else if (!plot.isAdded(pp.getUUID())) {
 | 
				
			||||||
            if (!plot.getFlag(ProjectilesFlag.class)) {
 | 
					            if (!plot.getFlag(ProjectilesFlag.class)) {
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    entity.remove();
 | 
					                    entity.remove();
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
@@ -448,9 +439,11 @@ public class PaperListener implements Listener {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private boolean getBooleanFlagValue(@NonNull FlagContainer container,
 | 
					    private boolean getBooleanFlagValue(
 | 
				
			||||||
 | 
					            @NonNull FlagContainer container,
 | 
				
			||||||
            @NonNull Class<? extends BooleanFlag<?>> flagClass,
 | 
					            @NonNull Class<? extends BooleanFlag<?>> flagClass,
 | 
				
			||||||
                                        boolean defaultValue) {
 | 
					            boolean defaultValue
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
        BooleanFlag<?> flag = container.getFlag(flagClass);
 | 
					        BooleanFlag<?> flag = container.getFlag(flagClass);
 | 
				
			||||||
        return flag == null ? defaultValue : flag.getValue();
 | 
					        return flag == null ? defaultValue : flag.getValue();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,91 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 * PlotSquared, a land and world management plugin for Minecraft.
 | 
					 | 
				
			||||||
 * Copyright (C) IntellectualSites <https://intellectualsites.com>
 | 
					 | 
				
			||||||
 * Copyright (C) IntellectualSites team and contributors
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 | 
				
			||||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
					 | 
				
			||||||
 * (at your option) any later version.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
 * GNU General Public License for more details.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * You should have received a copy of the GNU General Public License
 | 
					 | 
				
			||||||
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
package com.plotsquared.bukkit.listener;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.google.inject.Inject;
 | 
					 | 
				
			||||||
import com.plotsquared.bukkit.util.BukkitUtil;
 | 
					 | 
				
			||||||
import com.plotsquared.core.configuration.Settings;
 | 
					 | 
				
			||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
					 | 
				
			||||||
import com.plotsquared.core.location.Location;
 | 
					 | 
				
			||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					 | 
				
			||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					 | 
				
			||||||
import org.bukkit.block.Banner;
 | 
					 | 
				
			||||||
import org.bukkit.block.Beacon;
 | 
					 | 
				
			||||||
import org.bukkit.block.BlockState;
 | 
					 | 
				
			||||||
import org.bukkit.block.CommandBlock;
 | 
					 | 
				
			||||||
import org.bukkit.block.Comparator;
 | 
					 | 
				
			||||||
import org.bukkit.block.Conduit;
 | 
					 | 
				
			||||||
import org.bukkit.block.Container;
 | 
					 | 
				
			||||||
import org.bukkit.block.CreatureSpawner;
 | 
					 | 
				
			||||||
import org.bukkit.block.DaylightDetector;
 | 
					 | 
				
			||||||
import org.bukkit.block.EnchantingTable;
 | 
					 | 
				
			||||||
import org.bukkit.block.EndGateway;
 | 
					 | 
				
			||||||
import org.bukkit.block.EnderChest;
 | 
					 | 
				
			||||||
import org.bukkit.block.Jukebox;
 | 
					 | 
				
			||||||
import org.bukkit.block.Sign;
 | 
					 | 
				
			||||||
import org.bukkit.block.Skull;
 | 
					 | 
				
			||||||
import org.bukkit.block.Structure;
 | 
					 | 
				
			||||||
import org.bukkit.block.data.type.Bed;
 | 
					 | 
				
			||||||
import org.bukkit.event.EventHandler;
 | 
					 | 
				
			||||||
import org.bukkit.event.block.BlockPlaceEvent;
 | 
					 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @deprecated P2 effectively no longer supports 1.13
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
@Deprecated(forRemoval = true, since = "6.10.4")
 | 
					 | 
				
			||||||
public class PaperListener113 extends PaperListener {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Inject
 | 
					 | 
				
			||||||
    public PaperListener113(@NonNull PlotAreaManager plotAreaManager) {
 | 
					 | 
				
			||||||
        super(plotAreaManager);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @EventHandler
 | 
					 | 
				
			||||||
    public void onBlockPlace(BlockPlaceEvent event) {
 | 
					 | 
				
			||||||
        if (!Settings.Paper_Components.TILE_ENTITY_CHECK || !Settings.Enabled_Components.CHUNK_PROCESSOR) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        BlockState state = event.getBlock().getState(false);
 | 
					 | 
				
			||||||
        if (!(state instanceof Banner || state instanceof Beacon || state instanceof Bed || state instanceof CommandBlock
 | 
					 | 
				
			||||||
                || state instanceof Comparator || state instanceof Conduit || state instanceof Container || state instanceof CreatureSpawner
 | 
					 | 
				
			||||||
                || state instanceof DaylightDetector || state instanceof EnchantingTable || state instanceof EnderChest || state instanceof EndGateway
 | 
					 | 
				
			||||||
                || state instanceof Jukebox || state instanceof Sign || state instanceof Skull || state instanceof Structure)) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        final Location location = BukkitUtil.adapt(event.getBlock().getLocation());
 | 
					 | 
				
			||||||
        final PlotArea plotArea = location.getPlotArea();
 | 
					 | 
				
			||||||
        if (plotArea == null) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        final int tileEntityCount = event.getBlock().getChunk().getTileEntities(false).length;
 | 
					 | 
				
			||||||
        if (tileEntityCount >= Settings.Chunk_Processor.MAX_TILES) {
 | 
					 | 
				
			||||||
            final PlotPlayer<?> plotPlayer = BukkitUtil.adapt(event.getPlayer());
 | 
					 | 
				
			||||||
            plotPlayer.sendMessage(
 | 
					 | 
				
			||||||
                    TranslatableCaption.of("errors.tile_entity_cap_reached"),
 | 
					 | 
				
			||||||
                    Template.of("amount", String.valueOf(Settings.Chunk_Processor.MAX_TILES))
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
            event.setCancelled(true);
 | 
					 | 
				
			||||||
            event.setBuild(false);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -67,7 +67,6 @@ import com.plotsquared.core.plot.flag.implementations.VillagerInteractFlag;
 | 
				
			|||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.MathMan;
 | 
					import com.plotsquared.core.util.MathMan;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.PlotFlagUtil;
 | 
					import com.plotsquared.core.util.PlotFlagUtil;
 | 
				
			||||||
import com.plotsquared.core.util.PremiumVerification;
 | 
					import com.plotsquared.core.util.PremiumVerification;
 | 
				
			||||||
import com.plotsquared.core.util.entity.EntityCategories;
 | 
					import com.plotsquared.core.util.entity.EntityCategories;
 | 
				
			||||||
@@ -78,12 +77,13 @@ import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
				
			|||||||
import com.sk89q.worldedit.world.block.BlockType;
 | 
					import com.sk89q.worldedit.world.block.BlockType;
 | 
				
			||||||
import io.papermc.lib.PaperLib;
 | 
					import io.papermc.lib.PaperLib;
 | 
				
			||||||
import net.kyori.adventure.text.Component;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.minimessage.MiniMessage;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.standard.StandardTags;
 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					import org.bukkit.Bukkit;
 | 
				
			||||||
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;
 | 
				
			||||||
@@ -273,14 +273,16 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
        Plot plot = plotPlayer.getCurrentPlot();
 | 
					        Plot plot = plotPlayer.getCurrentPlot();
 | 
				
			||||||
        // Check WorldEdit
 | 
					        // Check WorldEdit
 | 
				
			||||||
        switch (parts[0]) {
 | 
					        switch (parts[0]) {
 | 
				
			||||||
            case "up":
 | 
					            case "up", "worldedit:up" -> {
 | 
				
			||||||
            case "worldedit:up":
 | 
					                if (plot == null || (!plot.isAdded(plotPlayer.getUUID()) && !plotPlayer.hasPermission(
 | 
				
			||||||
                if (plot == null || (!plot.isAdded(plotPlayer.getUUID()) && !Permissions
 | 
					                        Permission.PERMISSION_ADMIN_BUILD_OTHER,
 | 
				
			||||||
                        .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER, true))) {
 | 
					                        true
 | 
				
			||||||
 | 
					                ))) {
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        if (plot == null && !area.isRoadFlags()) {
 | 
					        if (plot == null && !area.isRoadFlags()) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -291,7 +293,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
        if (blockedCommands.isEmpty()) {
 | 
					        if (blockedCommands.isEmpty()) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_BLOCKED_CMDS)) {
 | 
					        if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_BLOCKED_CMDS)) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        // When using namespaced commands, we're not interested in the namespace
 | 
					        // When using namespaced commands, we're not interested in the namespace
 | 
				
			||||||
@@ -310,7 +312,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    perm = "plots.admin.command.blocked-cmds.road";
 | 
					                    perm = "plots.admin.command.blocked-cmds.road";
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!Permissions.hasPermission(plotPlayer, perm)) {
 | 
					                if (!plotPlayer.hasPermission(perm)) {
 | 
				
			||||||
                    plotPlayer.sendMessage(TranslatableCaption.of("blockedcmds.command_blocked"));
 | 
					                    plotPlayer.sendMessage(TranslatableCaption.of("blockedcmds.command_blocked"));
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -367,6 +369,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
 | 
					    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
 | 
				
			||||||
 | 
					    @SuppressWarnings("deprecation") // Paper deprecation
 | 
				
			||||||
    public void onConnect(PlayerJoinEvent event) {
 | 
					    public void onConnect(PlayerJoinEvent event) {
 | 
				
			||||||
        final Player player = event.getPlayer();
 | 
					        final Player player = event.getPlayer();
 | 
				
			||||||
        PlotSquared.platform().playerManager().removePlayer(player.getUniqueId());
 | 
					        PlotSquared.platform().playerManager().removePlayer(player.getUniqueId());
 | 
				
			||||||
@@ -397,11 +400,15 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
                && PremiumVerification.isPremium() && UpdateUtility.hasUpdate) {
 | 
					                && PremiumVerification.isPremium() && UpdateUtility.hasUpdate) {
 | 
				
			||||||
            Caption boundary = TranslatableCaption.of("update.update_boundary");
 | 
					            Caption boundary = TranslatableCaption.of("update.update_boundary");
 | 
				
			||||||
            Caption updateNotification = TranslatableCaption.of("update.update_notification");
 | 
					            Caption updateNotification = TranslatableCaption.of("update.update_notification");
 | 
				
			||||||
            Template internalVersion = Template.of("p2version", UpdateUtility.internalVersion.versionString());
 | 
					 | 
				
			||||||
            Template spigotVersion = Template.of("spigotversion", UpdateUtility.spigotVersion);
 | 
					 | 
				
			||||||
            Template downloadUrl = Template.of("downloadurl", "https://www.spigotmc.org/resources/77506/updates");
 | 
					 | 
				
			||||||
            pp.sendMessage(boundary);
 | 
					            pp.sendMessage(boundary);
 | 
				
			||||||
            pp.sendMessage(updateNotification, internalVersion, spigotVersion, downloadUrl);
 | 
					            pp.sendMessage(
 | 
				
			||||||
 | 
					                    updateNotification,
 | 
				
			||||||
 | 
					                    TagResolver.builder()
 | 
				
			||||||
 | 
					                            .tag("p2version", Tag.inserting(Component.text(UpdateUtility.internalVersion.versionString())))
 | 
				
			||||||
 | 
					                            .tag("spigotversion", Tag.inserting(Component.text(UpdateUtility.spigotVersion)))
 | 
				
			||||||
 | 
					                            .tag("downloadurl", Tag.preProcessParsed("https://www.spigotmc.org/resources/77506/updates"))
 | 
				
			||||||
 | 
					                            .build()
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
            pp.sendMessage(boundary);
 | 
					            pp.sendMessage(boundary);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -453,7 +460,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
                            .equals(BukkitUtil.adaptComplete(to)))) {
 | 
					                            .equals(BukkitUtil.adaptComplete(to)))) {
 | 
				
			||||||
                        pp.sendMessage(
 | 
					                        pp.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("deny.no_enter"),
 | 
					                                TranslatableCaption.of("deny.no_enter"),
 | 
				
			||||||
                                Template.of("plot", plot.toString())
 | 
					                                TagResolver.resolver("plot", Tag.inserting(Component.text(plot.toString())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        event.setCancelled(true);
 | 
					                        event.setCancelled(true);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -566,10 +573,14 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
            if (now == null) {
 | 
					            if (now == null) {
 | 
				
			||||||
                try (final MetaDataAccess<Boolean> kickAccess =
 | 
					                try (final MetaDataAccess<Boolean> kickAccess =
 | 
				
			||||||
                             pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
 | 
					                             pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
 | 
				
			||||||
                    if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) {
 | 
					                    if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(
 | 
				
			||||||
 | 
					                            false)) {
 | 
				
			||||||
                        pp.sendMessage(
 | 
					                        pp.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission_event"),
 | 
					                                TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                                Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_EXIT_DENIED))
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "node",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Permission.PERMISSION_ADMIN_EXIT_DENIED)
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        this.tmpTeleport = false;
 | 
					                        this.tmpTeleport = false;
 | 
				
			||||||
                        if (lastPlot.equals(BukkitUtil.adapt(from).getPlot())) {
 | 
					                        if (lastPlot.equals(BukkitUtil.adapt(from).getPlot())) {
 | 
				
			||||||
@@ -587,7 +598,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
            } else if (!plotListener.plotEntry(pp, now) && this.tmpTeleport) {
 | 
					            } else if (!plotListener.plotEntry(pp, now) && this.tmpTeleport) {
 | 
				
			||||||
                pp.sendMessage(
 | 
					                pp.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("deny.no_enter"),
 | 
					                        TranslatableCaption.of("deny.no_enter"),
 | 
				
			||||||
                        Template.of("plot", now.toString())
 | 
					                        TagResolver.resolver("plot", Tag.inserting(Component.text(now.toString())))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                this.tmpTeleport = false;
 | 
					                this.tmpTeleport = false;
 | 
				
			||||||
                to.setX(from.getBlockX());
 | 
					                to.setX(from.getBlockX());
 | 
				
			||||||
@@ -600,7 +611,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
            int border = area.getBorder();
 | 
					            int border = area.getBorder();
 | 
				
			||||||
            int x1;
 | 
					            int x1;
 | 
				
			||||||
            if (x2 > border && this.tmpTeleport) {
 | 
					            if (x2 > border && this.tmpTeleport) {
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
 | 
				
			||||||
                    to.setX(border - 1);
 | 
					                    to.setX(border - 1);
 | 
				
			||||||
                    this.tmpTeleport = false;
 | 
					                    this.tmpTeleport = false;
 | 
				
			||||||
                    player.teleport(event.getTo());
 | 
					                    player.teleport(event.getTo());
 | 
				
			||||||
@@ -610,7 +621,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
                    pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
 | 
					                    pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else if (x2 < -border && this.tmpTeleport) {
 | 
					            } else if (x2 < -border && this.tmpTeleport) {
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
 | 
				
			||||||
                    to.setX(-border + 1);
 | 
					                    to.setX(-border + 1);
 | 
				
			||||||
                    this.tmpTeleport = false;
 | 
					                    this.tmpTeleport = false;
 | 
				
			||||||
                    player.teleport(event.getTo());
 | 
					                    player.teleport(event.getTo());
 | 
				
			||||||
@@ -620,7 +631,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
                    pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
 | 
					                    pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else if (((x1 = MathMan.roundInt(from.getX())) >= border && x2 <= border) || (x1 <= -border && x2 >= -border)) {
 | 
					            } else if (((x1 = MathMan.roundInt(from.getX())) >= border && x2 <= border) || (x1 <= -border && x2 >= -border)) {
 | 
				
			||||||
                if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
 | 
					                if (pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
 | 
				
			||||||
                    pp.sendMessage(TranslatableCaption.of("border.bypass.entered"));
 | 
					                    pp.sendMessage(TranslatableCaption.of("border.bypass.entered"));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -656,10 +667,14 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
            if (plot == null) {
 | 
					            if (plot == null) {
 | 
				
			||||||
                try (final MetaDataAccess<Boolean> kickAccess =
 | 
					                try (final MetaDataAccess<Boolean> kickAccess =
 | 
				
			||||||
                             pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
 | 
					                             pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
 | 
				
			||||||
                    if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) {
 | 
					                    if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(
 | 
				
			||||||
 | 
					                            false)) {
 | 
				
			||||||
                        pp.sendMessage(
 | 
					                        pp.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission_event"),
 | 
					                                TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                                Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_EXIT_DENIED))
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "node",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Permission.PERMISSION_ADMIN_EXIT_DENIED)
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        this.tmpTeleport = false;
 | 
					                        this.tmpTeleport = false;
 | 
				
			||||||
                        if (lastPlot.equals(BukkitUtil.adapt(from).getPlot())) {
 | 
					                        if (lastPlot.equals(BukkitUtil.adapt(from).getPlot())) {
 | 
				
			||||||
@@ -677,7 +692,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
            } else if (!plotListener.plotEntry(pp, plot) && this.tmpTeleport) {
 | 
					            } else if (!plotListener.plotEntry(pp, plot) && this.tmpTeleport) {
 | 
				
			||||||
                pp.sendMessage(
 | 
					                pp.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("deny.no_enter"),
 | 
					                        TranslatableCaption.of("deny.no_enter"),
 | 
				
			||||||
                        Template.of("plot", plot.toString())
 | 
					                        TagResolver.resolver("plot", Tag.inserting(Component.text(plot.toString())))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                this.tmpTeleport = false;
 | 
					                this.tmpTeleport = false;
 | 
				
			||||||
                player.teleport(from);
 | 
					                player.teleport(from);
 | 
				
			||||||
@@ -691,7 +706,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
            int border = area.getBorder();
 | 
					            int border = area.getBorder();
 | 
				
			||||||
            int z1;
 | 
					            int z1;
 | 
				
			||||||
            if (z2 > border && this.tmpTeleport) {
 | 
					            if (z2 > border && this.tmpTeleport) {
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
 | 
				
			||||||
                    to.setZ(border - 1);
 | 
					                    to.setZ(border - 1);
 | 
				
			||||||
                    this.tmpTeleport = false;
 | 
					                    this.tmpTeleport = false;
 | 
				
			||||||
                    player.teleport(event.getTo());
 | 
					                    player.teleport(event.getTo());
 | 
				
			||||||
@@ -701,7 +716,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
                    pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
 | 
					                    pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else if (z2 < -border && this.tmpTeleport) {
 | 
					            } else if (z2 < -border && this.tmpTeleport) {
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
 | 
				
			||||||
                    to.setZ(-border + 1);
 | 
					                    to.setZ(-border + 1);
 | 
				
			||||||
                    this.tmpTeleport = false;
 | 
					                    this.tmpTeleport = false;
 | 
				
			||||||
                    player.teleport(event.getTo());
 | 
					                    player.teleport(event.getTo());
 | 
				
			||||||
@@ -711,7 +726,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
                    pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
 | 
					                    pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else if (((z1 = MathMan.roundInt(from.getZ())) >= border && z2 <= border) || (z1 <= -border && z2 >= -border)) {
 | 
					            } else if (((z1 = MathMan.roundInt(from.getZ())) >= border && z2 <= border) || (z1 <= -border && z2 >= -border)) {
 | 
				
			||||||
                if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
 | 
					                if (pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
 | 
				
			||||||
                    pp.sendMessage(TranslatableCaption.of("border.bypass.entered"));
 | 
					                    pp.sendMessage(TranslatableCaption.of("border.bypass.entered"));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -719,6 +734,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @EventHandler(priority = EventPriority.LOW)
 | 
					    @EventHandler(priority = EventPriority.LOW)
 | 
				
			||||||
 | 
					    @SuppressWarnings("deprecation") // Paper deprecation
 | 
				
			||||||
    public void onChat(AsyncPlayerChatEvent event) {
 | 
					    public void onChat(AsyncPlayerChatEvent event) {
 | 
				
			||||||
        if (event.isCancelled()) {
 | 
					        if (event.isCancelled()) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
@@ -738,8 +754,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
                || area.isForcingPlotChat())) {
 | 
					                || area.isForcingPlotChat())) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (plot.isDenied(plotPlayer.getUUID()) && !Permissions
 | 
					        if (plot.isDenied(plotPlayer.getUUID()) && !plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_CHAT_BYPASS)) {
 | 
				
			||||||
                .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_CHAT_BYPASS)) {
 | 
					 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        event.setCancelled(true);
 | 
					        event.setCancelled(true);
 | 
				
			||||||
@@ -762,46 +777,34 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
        PlotId id = plot.getId();
 | 
					        PlotId id = plot.getId();
 | 
				
			||||||
        String worldName = plot.getWorldName();
 | 
					        String worldName = plot.getWorldName();
 | 
				
			||||||
        Caption msg = TranslatableCaption.of("chat.plot_chat_format");
 | 
					        Caption msg = TranslatableCaption.of("chat.plot_chat_format");
 | 
				
			||||||
        Template msgTemplate;
 | 
					        TagResolver.Builder builder = TagResolver.builder();
 | 
				
			||||||
        Template worldNameTemplate = Template.of("world", worldName);
 | 
					        builder.tag("world", Tag.inserting(Component.text(worldName)));
 | 
				
			||||||
        Template plotTemplate = Template.of("plot_id", id.toString());
 | 
					        builder.tag("plot_id", Tag.inserting(Component.text(id.toString())));
 | 
				
			||||||
        Template senderTemplate = Template.of("sender", sender);
 | 
					        builder.tag("sender", Tag.inserting(Component.text(sender)));
 | 
				
			||||||
        // If we do/don't want colour, we need to be careful about how to go about it, as players could attempt either <gold></gold> or &6 etc.
 | 
					 | 
				
			||||||
        // In both cases, we want to use a Component Template to ensure that the player cannot use any placeholders in their message on purpose
 | 
					 | 
				
			||||||
        //  or accidentally, as component templates are done at the end. We also need to deserialize from legacy color codes to a Component if
 | 
					 | 
				
			||||||
        //  allowing colour.
 | 
					 | 
				
			||||||
        if (plotPlayer.hasPermission("plots.chat.color")) {
 | 
					        if (plotPlayer.hasPermission("plots.chat.color")) {
 | 
				
			||||||
            msgTemplate = Template
 | 
					            builder.tag("msg", Tag.inserting(MiniMessage.miniMessage().deserialize(
 | 
				
			||||||
                    .of(
 | 
					                    message,
 | 
				
			||||||
                            "msg",
 | 
					                    TagResolver.resolver(StandardTags.color(), StandardTags.gradient(),
 | 
				
			||||||
                            BukkitUtil.LEGACY_COMPONENT_SERIALIZER.deserialize(ChatColor.translateAlternateColorCodes(
 | 
					                            StandardTags.rainbow(), StandardTags.decorations()
 | 
				
			||||||
                                    '&',
 | 
					                    )
 | 
				
			||||||
                                    message
 | 
					            )));
 | 
				
			||||||
                            ))
 | 
					 | 
				
			||||||
                    );
 | 
					 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            msgTemplate = Template.of("msg", BukkitUtil.MINI_MESSAGE.deserialize(
 | 
					            builder.tag("msg", Tag.inserting(Component.text(message)));
 | 
				
			||||||
                    ChatColor.stripColor(BukkitUtil.LEGACY_COMPONENT_SERIALIZER.serialize(Component.text(message)))));
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        for (PlotPlayer<?> receiver : plotRecipients) {
 | 
					        for (PlotPlayer<?> receiver : plotRecipients) {
 | 
				
			||||||
            receiver.sendMessage(msg, worldNameTemplate, msgTemplate, plotTemplate, senderTemplate);
 | 
					            receiver.sendMessage(msg, builder.build());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!spies.isEmpty()) {
 | 
					        if (!spies.isEmpty()) {
 | 
				
			||||||
            Caption spymsg = TranslatableCaption.of("chat.plot_chat_spy_format");
 | 
					            Caption spymsg = TranslatableCaption.of("chat.plot_chat_spy_format");
 | 
				
			||||||
            Template plotidTemplate = Template.of("plot_id", id.getX() + ";" + id.getY());
 | 
					 | 
				
			||||||
            Template spysenderTemplate = Template.of("sender", sender);
 | 
					 | 
				
			||||||
            Template spymessageTemplate = Template.of("msg", Component.text(message));
 | 
					 | 
				
			||||||
            for (PlotPlayer<?> player : spies) {
 | 
					            for (PlotPlayer<?> player : spies) {
 | 
				
			||||||
                player.sendMessage(spymsg, worldNameTemplate, plotidTemplate, spysenderTemplate, spymessageTemplate);
 | 
					                player.sendMessage(spymsg, builder.tag("message", Tag.inserting(Component.text(message))).build());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Settings.Chat.LOG_PLOTCHAT_TO_CONSOLE) {
 | 
					        if (Settings.Chat.LOG_PLOTCHAT_TO_CONSOLE) {
 | 
				
			||||||
            Caption spymsg = TranslatableCaption.of("chat.plot_chat_spy_format");
 | 
					            Caption spymsg = TranslatableCaption.of("chat.plot_chat_spy_format");
 | 
				
			||||||
            Template plotidTemplate = Template.of("plot_id", id.getX() + ";" + id.getY());
 | 
					            ConsolePlayer.getConsole().sendMessage(
 | 
				
			||||||
            Template spysenderTemplate = Template.of("sender", sender);
 | 
					                    spymsg,
 | 
				
			||||||
            Template spymessageTemplate = Template.of("msg", Component.text(message));
 | 
					                    builder.tag("message", Tag.inserting(Component.text(message))).build()
 | 
				
			||||||
            ConsolePlayer.getConsole().sendMessage(spymsg, worldNameTemplate, plotidTemplate, spysenderTemplate,
 | 
					 | 
				
			||||||
                    spymessageTemplate
 | 
					 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -824,7 +827,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
            plotListener.plotExit(pp, plot);
 | 
					            plotListener.plotExit(pp, plot);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (this.worldEdit != null) {
 | 
					        if (this.worldEdit != null) {
 | 
				
			||||||
            if (!Permissions.hasPermission(pp, Permission.PERMISSION_WORLDEDIT_BYPASS)) {
 | 
					            if (!pp.hasPermission(Permission.PERMISSION_WORLDEDIT_BYPASS)) {
 | 
				
			||||||
                if (pp.getAttribute("worldedit")) {
 | 
					                if (pp.getAttribute("worldedit")) {
 | 
				
			||||||
                    pp.removeAttribute("worldedit");
 | 
					                    pp.removeAttribute("worldedit");
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -880,8 +883,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
            final Plot plot = pp.getCurrentPlot();
 | 
					            final Plot plot = pp.getCurrentPlot();
 | 
				
			||||||
            if (plot != null) {
 | 
					            if (plot != null) {
 | 
				
			||||||
                if (plot.getFlag(PreventCreativeCopyFlag.class) && !plot
 | 
					                if (plot.getFlag(PreventCreativeCopyFlag.class) && !plot
 | 
				
			||||||
                        .isAdded(player.getUniqueId()) && !Permissions
 | 
					                        .isAdded(player.getUniqueId()) && !pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
 | 
				
			||||||
                        .hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
 | 
					 | 
				
			||||||
                    final ItemStack newStack =
 | 
					                    final ItemStack newStack =
 | 
				
			||||||
                            new ItemStack(newItem.getType(), newItem.getAmount());
 | 
					                            new ItemStack(newItem.getType(), newItem.getAmount());
 | 
				
			||||||
                    event.setCursor(newStack);
 | 
					                    event.setCursor(newStack);
 | 
				
			||||||
@@ -943,28 +945,37 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
        Plot plot = area.getPlotAbs(location);
 | 
					        Plot plot = area.getPlotAbs(location);
 | 
				
			||||||
        boolean cancelled = false;
 | 
					        boolean cancelled = false;
 | 
				
			||||||
        if (plot == null) {
 | 
					        if (plot == null) {
 | 
				
			||||||
            if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_ROAD)) {
 | 
					            if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD)) {
 | 
				
			||||||
                pp.sendMessage(
 | 
					                pp.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission_event"),
 | 
					                        TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                        Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_ROAD))
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                "node",
 | 
				
			||||||
 | 
					                                Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_ROAD)
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                cancelled = true;
 | 
					                cancelled = true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else if (!plot.hasOwner()) {
 | 
					        } else if (!plot.hasOwner()) {
 | 
				
			||||||
            if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) {
 | 
					            if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) {
 | 
				
			||||||
                pp.sendMessage(
 | 
					                pp.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission_event"),
 | 
					                        TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                        Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED))
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                "node",
 | 
				
			||||||
 | 
					                                Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                cancelled = true;
 | 
					                cancelled = true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            UUID uuid = pp.getUUID();
 | 
					            UUID uuid = pp.getUUID();
 | 
				
			||||||
            if (!plot.isAdded(uuid)) {
 | 
					            if (!plot.isAdded(uuid)) {
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_OTHER))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_OTHER)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    cancelled = true;
 | 
					                    cancelled = true;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -998,29 +1009,34 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
        Plot plot = location.getPlotAbs();
 | 
					        Plot plot = location.getPlotAbs();
 | 
				
			||||||
        BukkitPlayer pp = BukkitUtil.adapt(e.getPlayer());
 | 
					        BukkitPlayer pp = BukkitUtil.adapt(e.getPlayer());
 | 
				
			||||||
        if (plot == null) {
 | 
					        if (plot == null) {
 | 
				
			||||||
            if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, MiscInteractFlag.class, true) && !Permissions.hasPermission(
 | 
					            if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, MiscInteractFlag.class, true) && !pp.hasPermission(
 | 
				
			||||||
                    pp,
 | 
					 | 
				
			||||||
                    Permission.PERMISSION_ADMIN_INTERACT_ROAD
 | 
					                    Permission.PERMISSION_ADMIN_INTERACT_ROAD
 | 
				
			||||||
            )) {
 | 
					            )) {
 | 
				
			||||||
                pp.sendMessage(
 | 
					                pp.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission_event"),
 | 
					                        TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                        Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_ROAD))
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                "node",
 | 
				
			||||||
 | 
					                                Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_ROAD)
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                e.setCancelled(true);
 | 
					                e.setCancelled(true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
 | 
					            if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
				
			||||||
                    pp.sendMessage(TranslatableCaption.of("done.building_restricted"));
 | 
					                    pp.sendMessage(TranslatableCaption.of("done.building_restricted"));
 | 
				
			||||||
                    e.setCancelled(true);
 | 
					                    e.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (!plot.hasOwner()) {
 | 
					            if (!plot.hasOwner()) {
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, "plots.admin.interact.unowned")) {
 | 
					                if (!pp.hasPermission("plots.admin.interact.unowned")) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    e.setCancelled(true);
 | 
					                    e.setCancelled(true);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -1032,10 +1048,13 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
                if (plot.getFlag(MiscInteractFlag.class)) {
 | 
					                if (plot.getFlag(MiscInteractFlag.class)) {
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_OTHER))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_OTHER)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    e.setCancelled(true);
 | 
					                    e.setCancelled(true);
 | 
				
			||||||
                    plot.debug(pp.getName() + " could not interact with " + entity.getType()
 | 
					                    plot.debug(pp.getName() + " could not interact with " + entity.getType()
 | 
				
			||||||
@@ -1046,6 +1065,7 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @EventHandler(priority = EventPriority.LOW)
 | 
					    @EventHandler(priority = EventPriority.LOW)
 | 
				
			||||||
 | 
					    @SuppressWarnings("deprecation") // Paper deprecation
 | 
				
			||||||
    public void onCancelledInteract(PlayerInteractEvent event) {
 | 
					    public void onCancelledInteract(PlayerInteractEvent event) {
 | 
				
			||||||
        if (event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_AIR) {
 | 
					        if (event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_AIR) {
 | 
				
			||||||
            Player player = event.getPlayer();
 | 
					            Player player = event.getPlayer();
 | 
				
			||||||
@@ -1099,13 +1119,13 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
        Location location = BukkitUtil.adapt(block.getLocation());
 | 
					        Location location = BukkitUtil.adapt(block.getLocation());
 | 
				
			||||||
        Action action = event.getAction();
 | 
					        Action action = event.getAction();
 | 
				
			||||||
        switch (action) {
 | 
					        switch (action) {
 | 
				
			||||||
            case PHYSICAL: {
 | 
					            case PHYSICAL -> {
 | 
				
			||||||
                eventType = PlayerBlockEventType.TRIGGER_PHYSICAL;
 | 
					                eventType = PlayerBlockEventType.TRIGGER_PHYSICAL;
 | 
				
			||||||
                blocktype1 = BukkitAdapter.asBlockType(block.getType());
 | 
					                blocktype1 = BukkitAdapter.asBlockType(block.getType());
 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            //todo rearrange the right click code. it is all over the place.
 | 
					            //todo rearrange the right click code. it is all over the place.
 | 
				
			||||||
            case RIGHT_CLICK_BLOCK: {
 | 
					            case RIGHT_CLICK_BLOCK -> {
 | 
				
			||||||
                Material blockType = block.getType();
 | 
					                Material blockType = block.getType();
 | 
				
			||||||
                eventType = PlayerBlockEventType.INTERACT_BLOCK;
 | 
					                eventType = PlayerBlockEventType.INTERACT_BLOCK;
 | 
				
			||||||
                blocktype1 = BukkitAdapter.asBlockType(block.getType());
 | 
					                blocktype1 = BukkitAdapter.asBlockType(block.getType());
 | 
				
			||||||
@@ -1127,22 +1147,17 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                // in the following, lb needs to have the material of the item in hand i.e. type
 | 
					                // in the following, lb needs to have the material of the item in hand i.e. type
 | 
				
			||||||
                switch (type.toString()) {
 | 
					                switch (type.toString()) {
 | 
				
			||||||
                    case "REDSTONE":
 | 
					                    case "REDSTONE", "STRING", "PUMPKIN_SEEDS", "MELON_SEEDS", "COCOA_BEANS", "WHEAT_SEEDS", "BEETROOT_SEEDS",
 | 
				
			||||||
                    case "STRING":
 | 
					                            "SWEET_BERRIES", "GLOW_BERRIES" -> {
 | 
				
			||||||
                    case "PUMPKIN_SEEDS":
 | 
					 | 
				
			||||||
                    case "MELON_SEEDS":
 | 
					 | 
				
			||||||
                    case "COCOA_BEANS":
 | 
					 | 
				
			||||||
                    case "WHEAT_SEEDS":
 | 
					 | 
				
			||||||
                    case "BEETROOT_SEEDS":
 | 
					 | 
				
			||||||
                    case "SWEET_BERRIES":
 | 
					 | 
				
			||||||
                    case "GLOW_BERRIES":
 | 
					 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    default:
 | 
					                    }
 | 
				
			||||||
 | 
					                    default -> {
 | 
				
			||||||
                        //eventType = PlayerBlockEventType.PLACE_BLOCK;
 | 
					                        //eventType = PlayerBlockEventType.PLACE_BLOCK;
 | 
				
			||||||
                        if (type.isBlock()) {
 | 
					                        if (type.isBlock()) {
 | 
				
			||||||
                            return;
 | 
					                            return;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                if (PaperLib.isPaper()) {
 | 
					                if (PaperLib.isPaper()) {
 | 
				
			||||||
                    if (MaterialTags.SPAWN_EGGS.isTagged(type) || Material.EGG.equals(type)) {
 | 
					                    if (MaterialTags.SPAWN_EGGS.isTagged(type) || Material.EGG.equals(type)) {
 | 
				
			||||||
                        eventType = PlayerBlockEventType.SPAWN_MOB;
 | 
					                        eventType = PlayerBlockEventType.SPAWN_MOB;
 | 
				
			||||||
@@ -1155,14 +1170,14 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (type.isEdible()) {
 | 
					                if (type.isEdible()) {
 | 
				
			||||||
                    //Allow all players to eat while also allowing the block place event ot be fired
 | 
					                    //Allow all players to eat while also allowing the block place event to be fired
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (type == Material.ARMOR_STAND) {
 | 
					                if (type == Material.ARMOR_STAND) {
 | 
				
			||||||
                    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)) {
 | 
					                if (org.bukkit.Tag.ITEMS_BOATS.isTagged(type) || MINECARTS.contains(type)) {
 | 
				
			||||||
                    eventType = PlayerBlockEventType.PLACE_VEHICLE;
 | 
					                    eventType = PlayerBlockEventType.PLACE_VEHICLE;
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -1174,9 +1189,8 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
                    eventType = PlayerBlockEventType.READ;
 | 
					                    eventType = PlayerBlockEventType.READ;
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case LEFT_CLICK_BLOCK: {
 | 
					            case LEFT_CLICK_BLOCK -> {
 | 
				
			||||||
                Material blockType = block.getType();
 | 
					                Material blockType = block.getType();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // todo: when the code above is rearranged, it would be great to beautify this as well.
 | 
					                // todo: when the code above is rearranged, it would be great to beautify this as well.
 | 
				
			||||||
@@ -1187,11 +1201,11 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                eventType = PlayerBlockEventType.INTERACT_BLOCK;
 | 
					                eventType = PlayerBlockEventType.INTERACT_BLOCK;
 | 
				
			||||||
                blocktype1 = BukkitAdapter.asBlockType(block.getType());
 | 
					                blocktype1 = BukkitAdapter.asBlockType(block.getType());
 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            default:
 | 
					            default -> {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        if (this.worldEdit != null && pp.getAttribute("worldedit")) {
 | 
					        if (this.worldEdit != null && pp.getAttribute("worldedit")) {
 | 
				
			||||||
            if (event.getMaterial() == Material.getMaterial(this.worldEdit.getConfiguration().wandItem)) {
 | 
					            if (event.getMaterial() == Material.getMaterial(this.worldEdit.getConfiguration().wandItem)) {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
@@ -1257,34 +1271,40 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
        BukkitPlayer pp = BukkitUtil.adapt(event.getPlayer());
 | 
					        BukkitPlayer pp = BukkitUtil.adapt(event.getPlayer());
 | 
				
			||||||
        Plot plot = area.getPlot(location);
 | 
					        Plot plot = area.getPlot(location);
 | 
				
			||||||
        if (plot == null) {
 | 
					        if (plot == null) {
 | 
				
			||||||
            if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
 | 
					            if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            pp.sendMessage(
 | 
					            pp.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.no_permission_event"),
 | 
					                    TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                    Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD))
 | 
					                    TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            event.setCancelled(true);
 | 
					            event.setCancelled(true);
 | 
				
			||||||
        } else if (!plot.hasOwner()) {
 | 
					        } else if (!plot.hasOwner()) {
 | 
				
			||||||
            if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
 | 
					            if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            pp.sendMessage(
 | 
					            pp.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.no_permission_event"),
 | 
					                    TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                    Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED))
 | 
					                    TagResolver.resolver(
 | 
				
			||||||
 | 
					                            "node",
 | 
				
			||||||
 | 
					                            Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            event.setCancelled(true);
 | 
					            event.setCancelled(true);
 | 
				
			||||||
        } else if (!plot.isAdded(pp.getUUID())) {
 | 
					        } else if (!plot.isAdded(pp.getUUID())) {
 | 
				
			||||||
            if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
					            if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            pp.sendMessage(
 | 
					            pp.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.no_permission_event"),
 | 
					                    TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                    Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER))
 | 
					                    TagResolver.resolver(
 | 
				
			||||||
 | 
					                            "node",
 | 
				
			||||||
 | 
					                            Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_OTHER)
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            event.setCancelled(true);
 | 
					            event.setCancelled(true);
 | 
				
			||||||
        } else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
 | 
					        } else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
 | 
				
			||||||
            if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
					            if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
				
			||||||
                pp.sendMessage(
 | 
					                pp.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("done.building_restricted")
 | 
					                        TranslatableCaption.of("done.building_restricted")
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
@@ -1322,34 +1342,40 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
        BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
 | 
					        BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
 | 
				
			||||||
        Plot plot = area.getPlot(location);
 | 
					        Plot plot = area.getPlot(location);
 | 
				
			||||||
        if (plot == null) {
 | 
					        if (plot == null) {
 | 
				
			||||||
            if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
 | 
					            if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            plotPlayer.sendMessage(
 | 
					            plotPlayer.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.no_permission_event"),
 | 
					                    TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                    Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD))
 | 
					                    TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            event.setCancelled(true);
 | 
					            event.setCancelled(true);
 | 
				
			||||||
        } else if (!plot.hasOwner()) {
 | 
					        } else if (!plot.hasOwner()) {
 | 
				
			||||||
            if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
 | 
					            if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            plotPlayer.sendMessage(
 | 
					            plotPlayer.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.no_permission_event"),
 | 
					                    TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                    Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED))
 | 
					                    TagResolver.resolver(
 | 
				
			||||||
 | 
					                            "node",
 | 
				
			||||||
 | 
					                            Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            event.setCancelled(true);
 | 
					            event.setCancelled(true);
 | 
				
			||||||
        } else if (!plot.isAdded(plotPlayer.getUUID())) {
 | 
					        } else if (!plot.isAdded(plotPlayer.getUUID())) {
 | 
				
			||||||
            if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
					            if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            plotPlayer.sendMessage(
 | 
					            plotPlayer.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.no_permission_event"),
 | 
					                    TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                    Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER))
 | 
					                    TagResolver.resolver(
 | 
				
			||||||
 | 
					                            "node",
 | 
				
			||||||
 | 
					                            Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_OTHER)
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            event.setCancelled(true);
 | 
					            event.setCancelled(true);
 | 
				
			||||||
        } else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
 | 
					        } else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
 | 
				
			||||||
            if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
					            if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
				
			||||||
                plotPlayer.sendMessage(
 | 
					                plotPlayer.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("done.building_restricted")
 | 
					                        TranslatableCaption.of("done.building_restricted")
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
@@ -1374,19 +1400,25 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
        BukkitPlayer pp = BukkitUtil.adapt(p);
 | 
					        BukkitPlayer pp = BukkitUtil.adapt(p);
 | 
				
			||||||
        Plot plot = area.getPlot(location);
 | 
					        Plot plot = area.getPlot(location);
 | 
				
			||||||
        if (plot == null) {
 | 
					        if (plot == null) {
 | 
				
			||||||
            if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
 | 
					            if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
 | 
				
			||||||
                pp.sendMessage(
 | 
					                pp.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission_event"),
 | 
					                        TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                        Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD))
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                "node",
 | 
				
			||||||
 | 
					                                Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD)
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            if (!plot.hasOwner()) {
 | 
					            if (!plot.hasOwner()) {
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -1394,10 +1426,13 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            if (!plot.isAdded(pp.getUUID())) {
 | 
					            if (!plot.isAdded(pp.getUUID())) {
 | 
				
			||||||
                if (!plot.getFlag(HangingPlaceFlag.class)) {
 | 
					                if (!plot.getFlag(HangingPlaceFlag.class)) {
 | 
				
			||||||
                    if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
					                    if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
				
			||||||
                        pp.sendMessage(
 | 
					                        pp.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission_event"),
 | 
					                                TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                                Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER))
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "node",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_OTHER)
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        event.setCancelled(true);
 | 
					                        event.setCancelled(true);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -1423,18 +1458,24 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
            BukkitPlayer pp = BukkitUtil.adapt(p);
 | 
					            BukkitPlayer pp = BukkitUtil.adapt(p);
 | 
				
			||||||
            Plot plot = area.getPlot(location);
 | 
					            Plot plot = area.getPlot(location);
 | 
				
			||||||
            if (plot == null) {
 | 
					            if (plot == null) {
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_ROAD)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_ROAD)) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_ROAD))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_ROAD)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else if (!plot.hasOwner()) {
 | 
					            } else if (!plot.hasOwner()) {
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -1442,10 +1483,13 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
                if (plot.getFlag(HangingBreakFlag.class)) {
 | 
					                if (plot.getFlag(HangingBreakFlag.class)) {
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_OTHER))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_OTHER)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    plot.debug(p.getName()
 | 
					                    plot.debug(p.getName()
 | 
				
			||||||
@@ -1463,21 +1507,25 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
                Plot plot = area.getPlot(BukkitUtil.adapt(event.getEntity().getLocation()));
 | 
					                Plot plot = area.getPlot(BukkitUtil.adapt(event.getEntity().getLocation()));
 | 
				
			||||||
                if (plot != null) {
 | 
					                if (plot != null) {
 | 
				
			||||||
                    if (!plot.hasOwner()) {
 | 
					                    if (!plot.hasOwner()) {
 | 
				
			||||||
                        if (!Permissions
 | 
					                        if (!player.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) {
 | 
				
			||||||
                                .hasPermission(player, Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) {
 | 
					 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("permission.no_permission_event"),
 | 
					                                    TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                                    Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED))
 | 
					                                    TagResolver.resolver(
 | 
				
			||||||
 | 
					                                            "node",
 | 
				
			||||||
 | 
					                                            Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)
 | 
				
			||||||
 | 
					                                    )
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                            event.setCancelled(true);
 | 
					                            event.setCancelled(true);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    } else if (!plot.isAdded(player.getUUID())) {
 | 
					                    } else if (!plot.isAdded(player.getUUID())) {
 | 
				
			||||||
                        if (!plot.getFlag(HangingBreakFlag.class)) {
 | 
					                        if (!plot.getFlag(HangingBreakFlag.class)) {
 | 
				
			||||||
                            if (!Permissions
 | 
					                            if (!player.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
 | 
				
			||||||
                                    .hasPermission(player, Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
 | 
					 | 
				
			||||||
                                player.sendMessage(
 | 
					                                player.sendMessage(
 | 
				
			||||||
                                        TranslatableCaption.of("permission.no_permission_event"),
 | 
					                                        TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                                        Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_OTHER))
 | 
					                                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                                "node",
 | 
				
			||||||
 | 
					                                                Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_OTHER)
 | 
				
			||||||
 | 
					                                        )
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                                event.setCancelled(true);
 | 
					                                event.setCancelled(true);
 | 
				
			||||||
                                plot.debug(player.getName()
 | 
					                                plot.debug(player.getName()
 | 
				
			||||||
@@ -1506,18 +1554,24 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
        BukkitPlayer pp = BukkitUtil.adapt(p);
 | 
					        BukkitPlayer pp = BukkitUtil.adapt(p);
 | 
				
			||||||
        Plot plot = area.getPlot(location);
 | 
					        Plot plot = area.getPlot(location);
 | 
				
			||||||
        if (plot == null && !area.isRoadFlags()) {
 | 
					        if (plot == null && !area.isRoadFlags()) {
 | 
				
			||||||
            if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_ROAD)) {
 | 
					            if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD)) {
 | 
				
			||||||
                pp.sendMessage(
 | 
					                pp.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission_event"),
 | 
					                        TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                        Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_ROAD))
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                "node",
 | 
				
			||||||
 | 
					                                Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_ROAD)
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else if (plot != null && !plot.hasOwner()) {
 | 
					        } else if (plot != null && !plot.hasOwner()) {
 | 
				
			||||||
            if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) {
 | 
					            if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) {
 | 
				
			||||||
                pp.sendMessage(
 | 
					                pp.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission_event"),
 | 
					                        TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                        Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED))
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                "node",
 | 
				
			||||||
 | 
					                                Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -1572,10 +1626,13 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
 | 
					            if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
 | 
				
			||||||
                pp.sendMessage(
 | 
					                pp.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission_event"),
 | 
					                        TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                        Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_OTHER))
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                "node",
 | 
				
			||||||
 | 
					                                Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_OTHER)
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -1594,22 +1651,27 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
            BukkitPlayer pp = BukkitUtil.adapt(p);
 | 
					            BukkitPlayer pp = BukkitUtil.adapt(p);
 | 
				
			||||||
            Plot plot = area.getPlot(location);
 | 
					            Plot plot = area.getPlot(location);
 | 
				
			||||||
            if (plot == null) {
 | 
					            if (plot == null) {
 | 
				
			||||||
                if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, VehicleBreakFlag.class, true) && !Permissions.hasPermission(
 | 
					                if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, VehicleBreakFlag.class, true) && !pp.hasPermission(
 | 
				
			||||||
                        pp,
 | 
					 | 
				
			||||||
                        Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD
 | 
					                        Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD
 | 
				
			||||||
                )) {
 | 
					                )) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                if (!plot.hasOwner()) {
 | 
					                if (!plot.hasOwner()) {
 | 
				
			||||||
                    if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_UNOWNED)) {
 | 
					                    if (!pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_UNOWNED)) {
 | 
				
			||||||
                        pp.sendMessage(
 | 
					                        pp.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission_event"),
 | 
					                                TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                                Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_UNOWNED))
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "node",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_UNOWNED)
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        event.setCancelled(true);
 | 
					                        event.setCancelled(true);
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
@@ -1620,10 +1682,13 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
                    if (plot.getFlag(VehicleBreakFlag.class)) {
 | 
					                    if (plot.getFlag(VehicleBreakFlag.class)) {
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_OTHER)) {
 | 
					                    if (!pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_OTHER)) {
 | 
				
			||||||
                        pp.sendMessage(
 | 
					                        pp.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission_event"),
 | 
					                                TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                                Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_OTHER))
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "node",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_OTHER)
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        event.setCancelled(true);
 | 
					                        event.setCancelled(true);
 | 
				
			||||||
                        plot.debug(pp.getName()
 | 
					                        plot.debug(pp.getName()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,9 +30,9 @@ import com.plotsquared.core.plot.PlotArea;
 | 
				
			|||||||
import com.plotsquared.core.plot.PlotHandler;
 | 
					import com.plotsquared.core.plot.PlotHandler;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.PlotFlagUtil;
 | 
					import com.plotsquared.core.util.PlotFlagUtil;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					import org.bukkit.entity.Entity;
 | 
				
			||||||
import org.bukkit.entity.LivingEntity;
 | 
					import org.bukkit.entity.LivingEntity;
 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
@@ -106,32 +106,40 @@ public class ProjectileEventListener implements Listener {
 | 
				
			|||||||
        Plot plot = location.getOwnedPlot();
 | 
					        Plot plot = location.getOwnedPlot();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (plot == null) {
 | 
					        if (plot == null) {
 | 
				
			||||||
            if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true) && !Permissions.hasPermission(
 | 
					            if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true) && !pp.hasPermission(
 | 
				
			||||||
                    pp,
 | 
					 | 
				
			||||||
                    Permission.PERMISSION_ADMIN_PROJECTILE_ROAD
 | 
					                    Permission.PERMISSION_ADMIN_PROJECTILE_ROAD
 | 
				
			||||||
            )) {
 | 
					            )) {
 | 
				
			||||||
                pp.sendMessage(
 | 
					                pp.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission_event"),
 | 
					                        TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                        Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD))
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                "node",
 | 
				
			||||||
 | 
					                                Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD)
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                entity.remove();
 | 
					                entity.remove();
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else if (!plot.hasOwner()) {
 | 
					        } else if (!plot.hasOwner()) {
 | 
				
			||||||
            if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
 | 
					            if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
 | 
				
			||||||
                pp.sendMessage(
 | 
					                pp.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission_event"),
 | 
					                        TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                        Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED))
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                "node",
 | 
				
			||||||
 | 
					                                Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                entity.remove();
 | 
					                entity.remove();
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else if (!plot.isAdded(pp.getUUID())) {
 | 
					        } else if (!plot.isAdded(pp.getUUID())) {
 | 
				
			||||||
            if (!plot.getFlag(ProjectilesFlag.class)) {
 | 
					            if (!plot.getFlag(ProjectilesFlag.class)) {
 | 
				
			||||||
                if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    entity.remove();
 | 
					                    entity.remove();
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
@@ -170,8 +178,7 @@ public class ProjectileEventListener implements Listener {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter);
 | 
					            PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter);
 | 
				
			||||||
            if (plot == null) {
 | 
					            if (plot == null) {
 | 
				
			||||||
                if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true) && !Permissions.hasPermission(
 | 
					                if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true) && !pp.hasPermission(
 | 
				
			||||||
                        pp,
 | 
					 | 
				
			||||||
                        Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED
 | 
					                        Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED
 | 
				
			||||||
                )) {
 | 
					                )) {
 | 
				
			||||||
                    entity.remove();
 | 
					                    entity.remove();
 | 
				
			||||||
@@ -179,8 +186,8 @@ public class ProjectileEventListener implements Listener {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (plot.isAdded(pp.getUUID()) || Permissions
 | 
					            if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag(
 | 
				
			||||||
                    .hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag(ProjectilesFlag.class)) {
 | 
					                    ProjectilesFlag.class)) {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            entity.remove();
 | 
					            entity.remove();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,45 +31,39 @@ import org.bukkit.event.Listener;
 | 
				
			|||||||
import org.bukkit.event.world.ChunkEvent;
 | 
					import org.bukkit.event.world.ChunkEvent;
 | 
				
			||||||
import org.bukkit.event.world.ChunkLoadEvent;
 | 
					import org.bukkit.event.world.ChunkLoadEvent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.lang.reflect.Field;
 | 
					 | 
				
			||||||
import java.lang.reflect.Method;
 | 
					import java.lang.reflect.Method;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
 | 
					import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class SingleWorldListener implements Listener {
 | 
					public class SingleWorldListener implements Listener {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private final Method methodGetHandleChunk;
 | 
					    private final Method methodSetUnsaved;
 | 
				
			||||||
    private Field shouldSave = null;
 | 
					    private Method methodGetHandleChunk;
 | 
				
			||||||
 | 
					    private Object objChunkStatusFull = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public SingleWorldListener() throws Exception {
 | 
					    public SingleWorldListener() throws Exception {
 | 
				
			||||||
        ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
 | 
					        ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
 | 
				
			||||||
        this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod();
 | 
					        ReflectionUtils.RefClass classChunkAccess = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
 | 
				
			||||||
 | 
					        this.methodSetUnsaved = classChunkAccess.getMethod("a", boolean.class).getRealMethod();
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            if (PlotSquared.platform().serverVersion()[1] < 17) {
 | 
					            this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod();
 | 
				
			||||||
                ReflectionUtils.RefClass classChunk = getRefClass("{nms}.Chunk");
 | 
					        } catch (NoSuchMethodException ignored) {
 | 
				
			||||||
                if (PlotSquared.platform().serverVersion()[1] == 13) {
 | 
					            try {
 | 
				
			||||||
                    this.shouldSave = classChunk.getField("mustSave").getRealField();
 | 
					                ReflectionUtils.RefClass classChunkStatus = getRefClass("net.minecraft.world.level.chunk.ChunkStatus");
 | 
				
			||||||
                } else {
 | 
					                this.objChunkStatusFull = classChunkStatus.getRealClass().getField("n").get(null);
 | 
				
			||||||
                    this.shouldSave = classChunk.getField("s").getRealField();
 | 
					                this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle", classChunkStatus.getRealClass()).getRealMethod();
 | 
				
			||||||
 | 
					            } catch (NoSuchMethodException ex) {
 | 
				
			||||||
 | 
					                throw new RuntimeException(ex);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            } else if (PlotSquared.platform().serverVersion()[1] == 17) {
 | 
					 | 
				
			||||||
                ReflectionUtils.RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
 | 
					 | 
				
			||||||
                this.shouldSave = classChunk.getField("r").getRealField();
 | 
					 | 
				
			||||||
            } else if (PlotSquared.platform().serverVersion()[1] == 18) {
 | 
					 | 
				
			||||||
                ReflectionUtils.RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
 | 
					 | 
				
			||||||
                this.shouldSave = classChunk.getField("b").getRealField();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } catch (NoSuchFieldException e) {
 | 
					 | 
				
			||||||
            e.printStackTrace();
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void markChunkAsClean(Chunk chunk) {
 | 
					    public void markChunkAsClean(Chunk chunk) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            Object nmsChunk = methodGetHandleChunk.invoke(chunk);
 | 
					            Object nmsChunk = objChunkStatusFull != null
 | 
				
			||||||
            if (shouldSave != null) {
 | 
					                    ? this.methodGetHandleChunk.invoke(chunk, objChunkStatusFull)
 | 
				
			||||||
                this.shouldSave.set(nmsChunk, false);
 | 
					                    : this.methodGetHandleChunk.invoke(chunk);
 | 
				
			||||||
            }
 | 
					            methodSetUnsaved.invoke(nmsChunk, false);
 | 
				
			||||||
        } catch (Throwable e) {
 | 
					        } catch (Throwable e) {
 | 
				
			||||||
            e.printStackTrace();
 | 
					            e.printStackTrace();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -85,7 +79,12 @@ public class SingleWorldListener implements Listener {
 | 
				
			|||||||
        if (!SinglePlotArea.isSinglePlotWorld(name)) {
 | 
					        if (!SinglePlotArea.isSinglePlotWorld(name)) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        int x = event.getChunk().getX();
 | 
				
			||||||
 | 
					        int z = event.getChunk().getZ();
 | 
				
			||||||
 | 
					        if (x < 16 && x > -16 && z < 16 && z > -16) {
 | 
				
			||||||
 | 
					            // Allow spawn to generate
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        markChunkAsClean(event.getChunk());
 | 
					        markChunkAsClean(event.getChunk());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,63 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 * PlotSquared, a land and world management plugin for Minecraft.
 | 
					 | 
				
			||||||
 * Copyright (C) IntellectualSites <https://intellectualsites.com>
 | 
					 | 
				
			||||||
 * Copyright (C) IntellectualSites team and contributors
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 | 
				
			||||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
					 | 
				
			||||||
 * (at your option) any later version.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
 * GNU General Public License for more details.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * You should have received a copy of the GNU General Public License
 | 
					 | 
				
			||||||
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
package com.plotsquared.bukkit.managers;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
import com.google.inject.Singleton;
 | 
					 | 
				
			||||||
import org.bukkit.World;
 | 
					 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
					 | 
				
			||||||
import se.hyperver.hyperverse.Hyperverse;
 | 
					 | 
				
			||||||
import se.hyperver.hyperverse.world.WorldConfiguration;
 | 
					 | 
				
			||||||
import se.hyperver.hyperverse.world.WorldConfigurationBuilder;
 | 
					 | 
				
			||||||
import se.hyperver.hyperverse.world.WorldFeatures;
 | 
					 | 
				
			||||||
import se.hyperver.hyperverse.world.WorldType;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Hyperverse implementation is currently put on ice until Hyperverse is released on a stable line and deployed to the central
 | 
					 | 
				
			||||||
repository.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@Singleton
 | 
					 | 
				
			||||||
public class HyperverseWorldManager extends BukkitWorldManager {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public @Nullable World handleWorldCreation(@NonNull String worldName, @Nullable String generator) {
 | 
					 | 
				
			||||||
        // First let Bukkit register the world
 | 
					 | 
				
			||||||
        this.setGenerator(worldName, generator);
 | 
					 | 
				
			||||||
        // Create the world
 | 
					 | 
				
			||||||
        final WorldConfigurationBuilder worldConfigurationBuilder = WorldConfiguration.builder()
 | 
					 | 
				
			||||||
                .setName(worldName).setType(WorldType.OVER_WORLD);
 | 
					 | 
				
			||||||
        if (generator != null) {
 | 
					 | 
				
			||||||
            worldConfigurationBuilder.setGenerator(generator).setWorldFeatures(WorldFeatures.FLATLAND);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            return Hyperverse.getApi().createWorld(worldConfigurationBuilder.createWorldConfiguration())
 | 
					 | 
				
			||||||
                    .getBukkitWorld();
 | 
					 | 
				
			||||||
        } catch (final Exception e) {
 | 
					 | 
				
			||||||
            e.printStackTrace();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return null;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public String getName() {
 | 
					 | 
				
			||||||
        return "bukkit-hyperverse";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
@@ -30,8 +30,9 @@ import org.checkerframework.checker.nullness.qual.Nullable;
 | 
				
			|||||||
 *
 | 
					 *
 | 
				
			||||||
 * @deprecated Deprecated and scheduled for removal without replacement
 | 
					 * @deprecated Deprecated and scheduled for removal without replacement
 | 
				
			||||||
 *         in favor of the build in setup wizard.
 | 
					 *         in favor of the build in setup wizard.
 | 
				
			||||||
 | 
					 *         However, this class will be kept around for a while, given it's not a maintenance burden.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@Deprecated(forRemoval = true, since = "6.0.0")
 | 
					@Deprecated
 | 
				
			||||||
@Singleton
 | 
					@Singleton
 | 
				
			||||||
public class MultiverseWorldManager extends BukkitWorldManager {
 | 
					public class MultiverseWorldManager extends BukkitWorldManager {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,7 +52,7 @@ public class MVdWPlaceholders {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Subscribe
 | 
					    @Subscribe
 | 
				
			||||||
    public void onNewPlaceholder(final PlaceholderRegistry.@NonNull PlaceholderAddedEvent event) {
 | 
					    public void onNewPlaceholder(final PlaceholderRegistry.@NonNull PlaceholderAddedEvent event) {
 | 
				
			||||||
        this.addPlaceholder(event.getPlaceholder());
 | 
					        this.addPlaceholder(event.placeholder());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void addPlaceholder(final @NonNull Placeholder placeholder) {
 | 
					    private void addPlaceholder(final @NonNull Placeholder placeholder) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -87,4 +87,9 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer {
 | 
				
			|||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public boolean hasPermission(@NonNull final String permission, final boolean notify) {
 | 
				
			||||||
 | 
					        return hasPermission(permission);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -67,24 +67,15 @@ public class BukkitPlayer extends PlotPlayer<Player> {
 | 
				
			|||||||
    private String name;
 | 
					    private String name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * <p>Please do not use this method. Instead use
 | 
					 | 
				
			||||||
     * BukkitUtil.getPlayer(Player), as it caches player objects.</p>
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param plotAreaManager   PlotAreaManager instance
 | 
					     * @param plotAreaManager   PlotAreaManager instance
 | 
				
			||||||
     * @param eventDispatcher   EventDispatcher instance
 | 
					     * @param eventDispatcher   EventDispatcher instance
 | 
				
			||||||
     * @param player            Bukkit player instance
 | 
					     * @param player            Bukkit player instance
 | 
				
			||||||
     * @param permissionHandler PermissionHandler instance
 | 
					     * @param permissionHandler PermissionHandler instance
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public BukkitPlayer(
 | 
					    BukkitPlayer(
 | 
				
			||||||
            final @NonNull PlotAreaManager plotAreaManager, final @NonNull EventDispatcher eventDispatcher,
 | 
					            final @NonNull PlotAreaManager plotAreaManager,
 | 
				
			||||||
            final @NonNull Player player, final @NonNull PermissionHandler permissionHandler
 | 
					            final @NonNull EventDispatcher eventDispatcher,
 | 
				
			||||||
    ) {
 | 
					            final @NonNull Player player,
 | 
				
			||||||
        this(plotAreaManager, eventDispatcher, player, false, permissionHandler);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public BukkitPlayer(
 | 
					 | 
				
			||||||
            final @NonNull PlotAreaManager plotAreaManager, final @NonNull
 | 
					 | 
				
			||||||
            EventDispatcher eventDispatcher, final @NonNull Player player,
 | 
					 | 
				
			||||||
            final boolean realPlayer,
 | 
					            final boolean realPlayer,
 | 
				
			||||||
            final @NonNull PermissionHandler permissionHandler
 | 
					            final @NonNull PermissionHandler permissionHandler
 | 
				
			||||||
    ) {
 | 
					    ) {
 | 
				
			||||||
@@ -185,6 +176,10 @@ public class BukkitPlayer extends PlotPlayer<Player> {
 | 
				
			|||||||
            final Set<PermissionAttachmentInfo> effective = player.getEffectivePermissions();
 | 
					            final Set<PermissionAttachmentInfo> effective = player.getEffectivePermissions();
 | 
				
			||||||
            if (!effective.isEmpty()) {
 | 
					            if (!effective.isEmpty()) {
 | 
				
			||||||
                for (PermissionAttachmentInfo attach : effective) {
 | 
					                for (PermissionAttachmentInfo attach : effective) {
 | 
				
			||||||
 | 
					                    // Ignore all "false" permissions
 | 
				
			||||||
 | 
					                    if (!attach.getValue()) {
 | 
				
			||||||
 | 
					                        continue;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                    String permStr = attach.getPermission();
 | 
					                    String permStr = attach.getPermission();
 | 
				
			||||||
                    if (permStr.startsWith(stubPlus)) {
 | 
					                    if (permStr.startsWith(stubPlus)) {
 | 
				
			||||||
                        hasAny = true;
 | 
					                        hasAny = true;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -70,7 +70,7 @@ public class BukkitPlayerManager extends PlayerManager<BukkitPlayer, Player> {
 | 
				
			|||||||
        if (player == null || !player.isOnline()) {
 | 
					        if (player == null || !player.isOnline()) {
 | 
				
			||||||
            throw new NoSuchPlayerException(uuid);
 | 
					            throw new NoSuchPlayerException(uuid);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, player, this.permissionHandler);
 | 
					        return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, player, false, this.permissionHandler);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Nullable
 | 
					    @Nullable
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -239,9 +239,11 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator {
 | 
				
			|||||||
     * server's main thread.
 | 
					     * server's main thread.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private void processChunk(final @NonNull Chunk chunk) {
 | 
					    private void processChunk(final @NonNull Chunk chunk) {
 | 
				
			||||||
 | 
					        /* Chunk#isLoaded does not necessarily return true shortly after PaperLib#getChunkAtAsync completes, but the chunk is
 | 
				
			||||||
 | 
					        still loaded.
 | 
				
			||||||
        if (!chunk.isLoaded()) {
 | 
					        if (!chunk.isLoaded()) {
 | 
				
			||||||
            throw new IllegalArgumentException(String.format("Chunk %d;%d is is not loaded", chunk.getX(), chunk.getZ()));
 | 
					            throw new IllegalArgumentException(String.format("Chunk %d;%d is is not loaded", chunk.getX(), chunk.getZ());
 | 
				
			||||||
        }
 | 
					        }*/
 | 
				
			||||||
        if (finished) {
 | 
					        if (finished) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,7 @@ import com.plotsquared.bukkit.util.BukkitBlockUtil;
 | 
				
			|||||||
import com.plotsquared.bukkit.util.BukkitUtil;
 | 
					import com.plotsquared.bukkit.util.BukkitUtil;
 | 
				
			||||||
import com.plotsquared.core.location.ChunkWrapper;
 | 
					import com.plotsquared.core.location.ChunkWrapper;
 | 
				
			||||||
import com.plotsquared.core.location.Location;
 | 
					import com.plotsquared.core.location.Location;
 | 
				
			||||||
import com.plotsquared.core.queue.ScopedQueueCoordinator;
 | 
					import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
 | 
				
			||||||
import com.plotsquared.core.util.ChunkUtil;
 | 
					import com.plotsquared.core.util.ChunkUtil;
 | 
				
			||||||
import com.plotsquared.core.util.PatternUtil;
 | 
					import com.plotsquared.core.util.PatternUtil;
 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
					import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
				
			||||||
@@ -44,8 +44,11 @@ import org.checkerframework.checker.nullness.qual.Nullable;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import java.util.Arrays;
 | 
					import java.util.Arrays;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Internal use only. Subject to changes at any time.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
@DoNotUse
 | 
					@DoNotUse
 | 
				
			||||||
public class GenChunk extends ScopedQueueCoordinator {
 | 
					public class GenChunk extends ZeroedDelegateScopedQueueCoordinator {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public final Biome[] biomes;
 | 
					    public final Biome[] biomes;
 | 
				
			||||||
    public BlockState[][] result;
 | 
					    public BlockState[][] result;
 | 
				
			||||||
@@ -59,7 +62,6 @@ public class GenChunk extends ScopedQueueCoordinator {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @param minY minimum world Y, inclusive
 | 
					     * @param minY minimum world Y, inclusive
 | 
				
			||||||
     * @param maxY maximum world Y, inclusive
 | 
					     * @param maxY maximum world Y, inclusive
 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @since 6.6.0
 | 
					     * @since 6.6.0
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public GenChunk(int minY, int maxY) {
 | 
					    public GenChunk(int minY, int maxY) {
 | 
				
			||||||
@@ -107,9 +109,9 @@ public class GenChunk extends ScopedQueueCoordinator {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public void setChunk(@NonNull ChunkWrapper wrap) {
 | 
					    public void setChunk(@NonNull ChunkWrapper wrap) {
 | 
				
			||||||
        chunk = null;
 | 
					        chunk = null;
 | 
				
			||||||
        world = wrap.world;
 | 
					        world = wrap.world();
 | 
				
			||||||
        chunkX = wrap.x;
 | 
					        chunkX = wrap.x();
 | 
				
			||||||
        chunkZ = wrap.z;
 | 
					        chunkZ = wrap.z();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,8 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
package com.plotsquared.bukkit.schematic;
 | 
					package com.plotsquared.bukkit.schematic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.destroystokyo.paper.profile.PlayerProfile;
 | 
				
			||||||
 | 
					import com.destroystokyo.paper.profile.ProfileProperty;
 | 
				
			||||||
import com.plotsquared.bukkit.util.BukkitUtil;
 | 
					import com.plotsquared.bukkit.util.BukkitUtil;
 | 
				
			||||||
import com.sk89q.jnbt.ByteTag;
 | 
					import com.sk89q.jnbt.ByteTag;
 | 
				
			||||||
import com.sk89q.jnbt.CompoundTag;
 | 
					import com.sk89q.jnbt.CompoundTag;
 | 
				
			||||||
@@ -28,16 +30,22 @@ import com.sk89q.jnbt.Tag;
 | 
				
			|||||||
import com.sk89q.worldedit.blocks.BaseItemStack;
 | 
					import com.sk89q.worldedit.blocks.BaseItemStack;
 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
					import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
				
			||||||
import com.sk89q.worldedit.world.item.ItemType;
 | 
					import com.sk89q.worldedit.world.item.ItemType;
 | 
				
			||||||
 | 
					import io.papermc.lib.PaperLib;
 | 
				
			||||||
 | 
					import org.apache.logging.log4j.LogManager;
 | 
				
			||||||
 | 
					import org.apache.logging.log4j.Logger;
 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					import org.bukkit.Bukkit;
 | 
				
			||||||
import org.bukkit.ChatColor;
 | 
					import org.bukkit.ChatColor;
 | 
				
			||||||
 | 
					import org.bukkit.DyeColor;
 | 
				
			||||||
import org.bukkit.World;
 | 
					import org.bukkit.World;
 | 
				
			||||||
 | 
					import org.bukkit.block.Banner;
 | 
				
			||||||
import org.bukkit.block.Block;
 | 
					import org.bukkit.block.Block;
 | 
				
			||||||
import org.bukkit.block.Container;
 | 
					import org.bukkit.block.Container;
 | 
				
			||||||
import org.bukkit.block.Sign;
 | 
					import org.bukkit.block.Sign;
 | 
				
			||||||
import org.bukkit.block.Skull;
 | 
					import org.bukkit.block.Skull;
 | 
				
			||||||
 | 
					import org.bukkit.block.banner.Pattern;
 | 
				
			||||||
 | 
					import org.bukkit.block.banner.PatternType;
 | 
				
			||||||
import org.bukkit.enchantments.Enchantment;
 | 
					import org.bukkit.enchantments.Enchantment;
 | 
				
			||||||
import org.bukkit.inventory.Inventory;
 | 
					import org.bukkit.inventory.Inventory;
 | 
				
			||||||
import org.bukkit.inventory.InventoryHolder;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					import org.bukkit.inventory.ItemStack;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -46,20 +54,15 @@ import java.util.HashMap;
 | 
				
			|||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
import java.util.Map.Entry;
 | 
					import java.util.Map.Entry;
 | 
				
			||||||
 | 
					import java.util.Objects;
 | 
				
			||||||
 | 
					import java.util.UUID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class StateWrapper {
 | 
					public class StateWrapper {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public org.bukkit.block.BlockState state = null;
 | 
					    public CompoundTag tag;
 | 
				
			||||||
    public CompoundTag tag = null;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    private boolean paperErrorTextureSent = false;
 | 
				
			||||||
     * @deprecated in favour of using WE methods for obtaining NBT, specifically by obtaining a
 | 
					    private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + StateWrapper.class.getSimpleName());
 | 
				
			||||||
     *         {@link com.sk89q.worldedit.world.block.BaseBlock} and then using {@link com.sk89q.worldedit.world.block.BaseBlock#getNbtData()}
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    @Deprecated(forRemoval = true, since = "6.9.0")
 | 
					 | 
				
			||||||
    public StateWrapper(org.bukkit.block.BlockState state) {
 | 
					 | 
				
			||||||
        this.state = state;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public StateWrapper(CompoundTag tag) {
 | 
					    public StateWrapper(CompoundTag tag) {
 | 
				
			||||||
        this.tag = tag;
 | 
					        this.tag = tag;
 | 
				
			||||||
@@ -237,9 +240,8 @@ public class StateWrapper {
 | 
				
			|||||||
                        return true;
 | 
					                        return true;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    String player = skullOwner.getString("Name");
 | 
					                    String player = skullOwner.getString("Name");
 | 
				
			||||||
                    if (player == null || player.isEmpty()) {
 | 
					
 | 
				
			||||||
                        return false;
 | 
					                    if (player != null && !player.isEmpty()) {
 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                        try {
 | 
					                        try {
 | 
				
			||||||
                            skull.setOwningPlayer(Bukkit.getOfflinePlayer(player));
 | 
					                            skull.setOwningPlayer(Bukkit.getOfflinePlayer(player));
 | 
				
			||||||
                            skull.update(true);
 | 
					                            skull.update(true);
 | 
				
			||||||
@@ -248,31 +250,61 @@ public class StateWrapper {
 | 
				
			|||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        return true;
 | 
					                        return true;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                return false;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					                    final CompoundTag properties = (CompoundTag) skullOwner.getValue().get("Properties");
 | 
				
			||||||
     * Get a CompoundTag of the contents of a block's inventory (chest, furnace, etc.).
 | 
					                    if (properties == null) {
 | 
				
			||||||
     *
 | 
					                        return false;
 | 
				
			||||||
     * @deprecated in favour of using WorldEdit methods for obtaining NBT, specifically by obtaining a
 | 
					 | 
				
			||||||
     *         {@link com.sk89q.worldedit.world.block.BaseBlock} and then using {@link com.sk89q.worldedit.world.block.BaseBlock#getNbtData()}
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    @Deprecated(forRemoval = true, since = "6.9.0")
 | 
					 | 
				
			||||||
    public CompoundTag getTag() {
 | 
					 | 
				
			||||||
        if (this.tag != null) {
 | 
					 | 
				
			||||||
            return this.tag;
 | 
					 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
        if (this.state instanceof InventoryHolder inv) {
 | 
					                    final ListTag textures = properties.getListTag("textures");
 | 
				
			||||||
            ItemStack[] contents = inv.getInventory().getContents();
 | 
					                    if (textures.getValue().isEmpty()) {
 | 
				
			||||||
            Map<String, Tag> values = new HashMap<>();
 | 
					                        return false;
 | 
				
			||||||
            values.put("Items", new ListTag(CompoundTag.class, serializeInventory(contents)));
 | 
					 | 
				
			||||||
            return new CompoundTag(values);
 | 
					 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					                    final CompoundTag textureCompound = (CompoundTag) textures.getValue().get(0);
 | 
				
			||||||
 | 
					                    if (textureCompound == null) {
 | 
				
			||||||
 | 
					                        return false;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    String textureValue = textureCompound.getString("Value");
 | 
				
			||||||
 | 
					                    if (textureValue == null) {
 | 
				
			||||||
 | 
					                        return false;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    if (!PaperLib.isPaper()) {
 | 
				
			||||||
 | 
					                        if (!paperErrorTextureSent) {
 | 
				
			||||||
 | 
					                            paperErrorTextureSent = true;
 | 
				
			||||||
 | 
					                            LOGGER.error("Failed to populate skull data in your road schematic - This is a Spigot limitation.");
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        return false;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    final PlayerProfile profile = Bukkit.createProfile(UUID.randomUUID());
 | 
				
			||||||
 | 
					                    profile.setProperty(new ProfileProperty("textures", textureValue));
 | 
				
			||||||
 | 
					                    skull.setPlayerProfile(profile);
 | 
				
			||||||
 | 
					                    skull.update(true);
 | 
				
			||||||
 | 
					                    return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            case "banner" -> {
 | 
				
			||||||
 | 
					                if (state instanceof Banner banner) {
 | 
				
			||||||
 | 
					                    List<Tag> patterns = this.tag.getListTag("Patterns").getValue();
 | 
				
			||||||
 | 
					                    if (patterns == null || patterns.isEmpty()) {
 | 
				
			||||||
 | 
					                        return false;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    banner.setPatterns(patterns.stream().map(t -> (CompoundTag) t).map(compoundTag -> {
 | 
				
			||||||
 | 
					                        DyeColor color = DyeColor.getByWoolData((byte) compoundTag.getInt("Color"));
 | 
				
			||||||
 | 
					                        PatternType patternType = PatternType.getByIdentifier(compoundTag.getString("Pattern"));
 | 
				
			||||||
 | 
					                        if (color == null || patternType == null) {
 | 
				
			||||||
                            return null;
 | 
					                            return null;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					                        return new Pattern(color, patternType);
 | 
				
			||||||
 | 
					                    }).filter(Objects::nonNull).toList());
 | 
				
			||||||
 | 
					                    banner.update(true);
 | 
				
			||||||
 | 
					                    return true;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public String getId() {
 | 
					    public String getId() {
 | 
				
			||||||
        String tileid = this.tag.getString("id").toLowerCase();
 | 
					        String tileid = this.tag.getString("id").toLowerCase();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,10 +40,11 @@ import com.plotsquared.core.plot.flag.implementations.PvpFlag;
 | 
				
			|||||||
import com.plotsquared.core.plot.flag.implementations.TamedAttackFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.TamedAttackFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.VehicleCapFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.VehicleCapFlag;
 | 
				
			||||||
import com.plotsquared.core.util.EntityUtil;
 | 
					import com.plotsquared.core.util.EntityUtil;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.entity.EntityCategories;
 | 
					import com.plotsquared.core.util.entity.EntityCategories;
 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
					import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.bukkit.entity.Arrow;
 | 
					import org.bukkit.entity.Arrow;
 | 
				
			||||||
import org.bukkit.entity.Creature;
 | 
					import org.bukkit.entity.Creature;
 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					import org.bukkit.entity.Entity;
 | 
				
			||||||
@@ -168,8 +169,7 @@ public class BukkitEntityUtil {
 | 
				
			|||||||
                if (plot != null && (plot.getFlag(HangingBreakFlag.class) || plot
 | 
					                if (plot != null && (plot.getFlag(HangingBreakFlag.class) || plot
 | 
				
			||||||
                        .isAdded(plotPlayer.getUUID()))) {
 | 
					                        .isAdded(plotPlayer.getUUID()))) {
 | 
				
			||||||
                    if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
 | 
					                    if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
 | 
				
			||||||
                        if (!Permissions
 | 
					                        if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
				
			||||||
                                .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
 | 
					 | 
				
			||||||
                            plotPlayer.sendMessage(
 | 
					                            plotPlayer.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("done.building_restricted")
 | 
					                                    TranslatableCaption.of("done.building_restricted")
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
@@ -178,10 +178,13 @@ public class BukkitEntityUtil {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    return true;
 | 
					                    return true;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY + "." + stub)) {
 | 
					                if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY + "." + stub)) {
 | 
				
			||||||
                    plotPlayer.sendMessage(
 | 
					                    plotPlayer.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_ADMIN_DESTROY + "." + stub)
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_DESTROY + "." + stub))
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -190,10 +193,13 @@ public class BukkitEntityUtil {
 | 
				
			|||||||
                        .isAdded(plotPlayer.getUUID()))) {
 | 
					                        .isAdded(plotPlayer.getUUID()))) {
 | 
				
			||||||
                    return true;
 | 
					                    return true;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY + "." + stub)) {
 | 
					                if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY + "." + stub)) {
 | 
				
			||||||
                    plotPlayer.sendMessage(
 | 
					                    plotPlayer.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_ADMIN_DESTROY + "." + stub)
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_DESTROY + "." + stub))
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    if (plot != null) {
 | 
					                    if (plot != null) {
 | 
				
			||||||
                        plot.debug(player.getName()
 | 
					                        plot.debug(player.getName()
 | 
				
			||||||
@@ -211,10 +217,13 @@ public class BukkitEntityUtil {
 | 
				
			|||||||
                        .getFlag(PveFlag.class))) {
 | 
					                        .getFlag(PveFlag.class))) {
 | 
				
			||||||
                    return true;
 | 
					                    return true;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
 | 
					                if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
 | 
				
			||||||
                    plotPlayer.sendMessage(
 | 
					                    plotPlayer.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_ADMIN_PVE + "." + stub)
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVE + "." + stub))
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    if (plot != null) {
 | 
					                    if (plot != null) {
 | 
				
			||||||
                        plot.debug(player.getName() + " could not attack " + entityType
 | 
					                        plot.debug(player.getName() + " could not attack " + entityType
 | 
				
			||||||
@@ -232,10 +241,13 @@ public class BukkitEntityUtil {
 | 
				
			|||||||
                        .getFlag(PveFlag.class))) {
 | 
					                        .getFlag(PveFlag.class))) {
 | 
				
			||||||
                    return true;
 | 
					                    return true;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
 | 
					                if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
 | 
				
			||||||
                    plotPlayer.sendMessage(
 | 
					                    plotPlayer.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_ADMIN_PVE + "." + stub)
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVE + "." + stub))
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    if (plot != null) {
 | 
					                    if (plot != null) {
 | 
				
			||||||
                        plot.debug(player.getName() + " could not attack " + entityType
 | 
					                        plot.debug(player.getName() + " could not attack " + entityType
 | 
				
			||||||
@@ -245,11 +257,13 @@ public class BukkitEntityUtil {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            } else if (EntityCategories.PLAYER.contains(entityType)) {
 | 
					            } else if (EntityCategories.PLAYER.contains(entityType)) {
 | 
				
			||||||
                if (isPlot) {
 | 
					                if (isPlot) {
 | 
				
			||||||
                    if (!plot.getFlag(PvpFlag.class) && !Permissions
 | 
					                    if (!plot.getFlag(PvpFlag.class) && !plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVP + "." + stub)) {
 | 
				
			||||||
                            .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVP + "." + stub)) {
 | 
					 | 
				
			||||||
                        plotPlayer.sendMessage(
 | 
					                        plotPlayer.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission_event"),
 | 
					                                TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                                Template.of("node", Permission.PERMISSION_ADMIN_PVP + "." + stub)
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "node",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVP + "." + stub))
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        plot.debug(player.getName() + " could not attack " + entityType
 | 
					                        plot.debug(player.getName() + " could not attack " + entityType
 | 
				
			||||||
                                + " because pve = false");
 | 
					                                + " because pve = false");
 | 
				
			||||||
@@ -260,10 +274,13 @@ public class BukkitEntityUtil {
 | 
				
			|||||||
                } else if (roadFlags && area.getRoadFlag(PvpFlag.class)) {
 | 
					                } else if (roadFlags && area.getRoadFlag(PvpFlag.class)) {
 | 
				
			||||||
                    return true;
 | 
					                    return true;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVP + "." + stub)) {
 | 
					                if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVP + "." + stub)) {
 | 
				
			||||||
                    plotPlayer.sendMessage(
 | 
					                    plotPlayer.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_ADMIN_PVP + "." + stub)
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVP + "." + stub))
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -277,10 +294,13 @@ public class BukkitEntityUtil {
 | 
				
			|||||||
                        .getFlag(PveFlag.class))) {
 | 
					                        .getFlag(PveFlag.class))) {
 | 
				
			||||||
                    return true;
 | 
					                    return true;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
 | 
					                if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
 | 
				
			||||||
                    plotPlayer.sendMessage(
 | 
					                    plotPlayer.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_ADMIN_PVE + "." + stub)
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVE + "." + stub))
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    if (plot != null) {
 | 
					                    if (plot != null) {
 | 
				
			||||||
                        plot.debug(player.getName() + " could not attack " + entityType
 | 
					                        plot.debug(player.getName() + " could not attack " + entityType
 | 
				
			||||||
@@ -299,10 +319,13 @@ public class BukkitEntityUtil {
 | 
				
			|||||||
                } else if (roadFlags && area.getRoadFlag(PveFlag.class)) {
 | 
					                } else if (roadFlags && area.getRoadFlag(PveFlag.class)) {
 | 
				
			||||||
                    return true;
 | 
					                    return true;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
 | 
					                if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
 | 
				
			||||||
                    plotPlayer.sendMessage(
 | 
					                    plotPlayer.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission_event"),
 | 
					                            TranslatableCaption.of("permission.no_permission_event"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_ADMIN_PVE + "." + stub)
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVE + "." + stub))
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    if (plot != null) {
 | 
					                    if (plot != null) {
 | 
				
			||||||
                        plot.debug(player.getName() + " could not attack " + entityType
 | 
					                        plot.debug(player.getName() + " could not attack " + entityType
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,6 +44,7 @@ import java.util.stream.IntStream;
 | 
				
			|||||||
@Singleton
 | 
					@Singleton
 | 
				
			||||||
public class BukkitInventoryUtil extends InventoryUtil {
 | 
					public class BukkitInventoryUtil extends InventoryUtil {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @SuppressWarnings("deprecation") // Paper deprecation
 | 
				
			||||||
    private static @Nullable ItemStack getItem(PlotItemStack item) {
 | 
					    private static @Nullable ItemStack getItem(PlotItemStack item) {
 | 
				
			||||||
        if (item == null) {
 | 
					        if (item == null) {
 | 
				
			||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
@@ -56,7 +57,7 @@ public class BukkitInventoryUtil extends InventoryUtil {
 | 
				
			|||||||
        ItemMeta meta = null;
 | 
					        ItemMeta meta = null;
 | 
				
			||||||
        if (item.getName() != null) {
 | 
					        if (item.getName() != null) {
 | 
				
			||||||
            meta = stack.getItemMeta();
 | 
					            meta = stack.getItemMeta();
 | 
				
			||||||
            Component nameComponent = BukkitUtil.MINI_MESSAGE.parse(item.getName());
 | 
					            Component nameComponent = BukkitUtil.MINI_MESSAGE.deserialize(item.getName());
 | 
				
			||||||
            meta.setDisplayName(BukkitUtil.LEGACY_COMPONENT_SERIALIZER.serialize(nameComponent));
 | 
					            meta.setDisplayName(BukkitUtil.LEGACY_COMPONENT_SERIALIZER.serialize(nameComponent));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (item.getLore() != null) {
 | 
					        if (item.getLore() != null) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,7 +30,7 @@ import com.plotsquared.core.plot.PlotArea;
 | 
				
			|||||||
import com.plotsquared.core.plot.PlotManager;
 | 
					import com.plotsquared.core.plot.PlotManager;
 | 
				
			||||||
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.queue.ScopedQueueCoordinator;
 | 
					import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
 | 
				
			||||||
import com.plotsquared.core.util.ChunkManager;
 | 
					import com.plotsquared.core.util.ChunkManager;
 | 
				
			||||||
import com.plotsquared.core.util.RegionManager;
 | 
					import com.plotsquared.core.util.RegionManager;
 | 
				
			||||||
import com.plotsquared.core.util.WorldUtil;
 | 
					import com.plotsquared.core.util.WorldUtil;
 | 
				
			||||||
@@ -257,9 +257,9 @@ public class BukkitRegionManager extends RegionManager {
 | 
				
			|||||||
            map.saveEntitiesOut(Bukkit.getWorld(world.getName()).getChunkAt(x, z), currentPlotClear);
 | 
					            map.saveEntitiesOut(Bukkit.getWorld(world.getName()).getChunkAt(x, z), currentPlotClear);
 | 
				
			||||||
            AugmentedUtils.bypass(
 | 
					            AugmentedUtils.bypass(
 | 
				
			||||||
                    ignoreAugment,
 | 
					                    ignoreAugment,
 | 
				
			||||||
                    () -> ChunkManager.setChunkInPlotArea(null, new RunnableVal<ScopedQueueCoordinator>() {
 | 
					                    () -> ChunkManager.setChunkInPlotArea(null, new RunnableVal<ZeroedDelegateScopedQueueCoordinator>() {
 | 
				
			||||||
                        @Override
 | 
					                        @Override
 | 
				
			||||||
                        public void run(ScopedQueueCoordinator value) {
 | 
					                        public void run(ZeroedDelegateScopedQueueCoordinator value) {
 | 
				
			||||||
                            Location min = value.getMin();
 | 
					                            Location min = value.getMin();
 | 
				
			||||||
                            int bx = min.getX();
 | 
					                            int bx = min.getX();
 | 
				
			||||||
                            int bz = min.getZ();
 | 
					                            int bz = min.getZ();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -67,6 +67,7 @@ public class BukkitSetupUtils extends SetupUtils {
 | 
				
			|||||||
        this.worldFile = worldFile;
 | 
					        this.worldFile = worldFile;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @SuppressWarnings("deprecation") // Paper deprecation
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void updateGenerators(final boolean force) {
 | 
					    public void updateGenerators(final boolean force) {
 | 
				
			||||||
        if (loaded && !SetupUtils.generators.isEmpty() && !force) {
 | 
					        if (loaded && !SetupUtils.generators.isEmpty() && !force) {
 | 
				
			||||||
@@ -124,7 +125,7 @@ public class BukkitSetupUtils extends SetupUtils {
 | 
				
			|||||||
    public String setupWorld(PlotAreaBuilder builder) {
 | 
					    public String setupWorld(PlotAreaBuilder builder) {
 | 
				
			||||||
        this.updateGenerators(false);
 | 
					        this.updateGenerators(false);
 | 
				
			||||||
        ConfigurationNode[] steps = builder.settingsNodesWrapper() == null ?
 | 
					        ConfigurationNode[] steps = builder.settingsNodesWrapper() == null ?
 | 
				
			||||||
                new ConfigurationNode[0] : builder.settingsNodesWrapper().getSettingsNodes();
 | 
					                new ConfigurationNode[0] : builder.settingsNodesWrapper().settingsNodes();
 | 
				
			||||||
        String world = builder.worldName();
 | 
					        String world = builder.worldName();
 | 
				
			||||||
        PlotAreaType type = builder.plotAreaType();
 | 
					        PlotAreaType type = builder.plotAreaType();
 | 
				
			||||||
        String worldPath = "worlds." + builder.worldName();
 | 
					        String worldPath = "worlds." + builder.worldName();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -45,7 +45,7 @@ import com.sk89q.worldedit.world.block.BlockTypes;
 | 
				
			|||||||
import io.papermc.lib.PaperLib;
 | 
					import io.papermc.lib.PaperLib;
 | 
				
			||||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
 | 
					import net.kyori.adventure.platform.bukkit.BukkitAudiences;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
 | 
					import net.kyori.adventure.text.minimessage.MiniMessage;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
 | 
					import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
 | 
				
			||||||
import org.apache.logging.log4j.LogManager;
 | 
					import org.apache.logging.log4j.LogManager;
 | 
				
			||||||
import org.apache.logging.log4j.Logger;
 | 
					import org.apache.logging.log4j.Logger;
 | 
				
			||||||
@@ -333,7 +333,7 @@ public class BukkitUtil extends WorldUtil {
 | 
				
			|||||||
    @SuppressWarnings("deprecation")
 | 
					    @SuppressWarnings("deprecation")
 | 
				
			||||||
    public void setSign(
 | 
					    public void setSign(
 | 
				
			||||||
            final @NonNull Location location, final @NonNull Caption[] lines,
 | 
					            final @NonNull Location location, final @NonNull Caption[] lines,
 | 
				
			||||||
            final @NonNull Template... replacements
 | 
					            final @NonNull TagResolver... replacements
 | 
				
			||||||
    ) {
 | 
					    ) {
 | 
				
			||||||
        ensureLoaded(location.getWorldName(), location.getX(), location.getZ(), chunk -> {
 | 
					        ensureLoaded(location.getWorldName(), location.getX(), location.getZ(), chunk -> {
 | 
				
			||||||
            PlotArea area = location.getPlotArea();
 | 
					            PlotArea area = location.getPlotArea();
 | 
				
			||||||
@@ -366,8 +366,9 @@ public class BukkitUtil extends WorldUtil {
 | 
				
			|||||||
            final org.bukkit.block.BlockState blockstate = block.getState();
 | 
					            final org.bukkit.block.BlockState blockstate = block.getState();
 | 
				
			||||||
            if (blockstate instanceof final Sign sign) {
 | 
					            if (blockstate instanceof final Sign sign) {
 | 
				
			||||||
                for (int i = 0; i < lines.length; i++) {
 | 
					                for (int i = 0; i < lines.length; i++) {
 | 
				
			||||||
                    sign.setLine(i, LEGACY_COMPONENT_SERIALIZER
 | 
					                    sign.setLine(i, LEGACY_COMPONENT_SERIALIZER.serialize(
 | 
				
			||||||
                            .serialize(MINI_MESSAGE.parse(lines[i].getComponent(LocaleHolder.console()), replacements)));
 | 
					                            MINI_MESSAGE.deserialize(lines[i].getComponent(LocaleHolder.console()), replacements)
 | 
				
			||||||
 | 
					                    ));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                sign.update(true, false);
 | 
					                sign.update(true, false);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,6 @@ import org.bukkit.Bukkit;
 | 
				
			|||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
import java.util.Objects;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class BukkitWorld implements World<org.bukkit.World> {
 | 
					public class BukkitWorld implements World<org.bukkit.World> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -133,14 +132,6 @@ public class BukkitWorld implements World<org.bukkit.World> {
 | 
				
			|||||||
        return world.hashCode();
 | 
					        return world.hashCode();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @deprecated This method is not meant to be invoked or overridden, with no replacement.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    @Deprecated(forRemoval = true, since = "6.6.0")
 | 
					 | 
				
			||||||
    protected boolean canEqual(final Object other) {
 | 
					 | 
				
			||||||
        return other instanceof BukkitWorld;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public String toString() {
 | 
					    public String toString() {
 | 
				
			||||||
        return "BukkitWorld(world=" + this.world + ")";
 | 
					        return "BukkitWorld(world=" + this.world + ")";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,78 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * PlotSquared, a land and world management plugin for Minecraft.
 | 
				
			||||||
 | 
					 * Copyright (C) IntellectualSites <https://intellectualsites.com>
 | 
				
			||||||
 | 
					 * Copyright (C) IntellectualSites team and contributors
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					 * the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					 * GNU General Public License for more details.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					package com.plotsquared.bukkit.util;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.intellectualsites.annotations.NotPublic;
 | 
				
			||||||
 | 
					import com.plotsquared.core.PlotSquared;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.nio.file.Files;
 | 
				
			||||||
 | 
					import java.nio.file.Path;
 | 
				
			||||||
 | 
					import java.nio.file.Paths;
 | 
				
			||||||
 | 
					import java.util.stream.Stream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * This is a helper class which replaces older syntax no longer supported by MiniMessage with replacements in messages_%.json.
 | 
				
			||||||
 | 
					 * MiniMessage changed the syntax between major releases. To warrant a smooth upgrade, we attempt to replace any occurrences
 | 
				
			||||||
 | 
					 * while loading PlotSquared.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @since 7.0.0
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@NotPublic
 | 
				
			||||||
 | 
					public class TranslationUpdateManager {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void upgradeTranslationFile() throws IOException {
 | 
				
			||||||
 | 
					        String suggestCommand = "suggest_command";
 | 
				
			||||||
 | 
					        String suggestCommandReplacement = "run_command";
 | 
				
			||||||
 | 
					        String minHeight = "minHeight";
 | 
				
			||||||
 | 
					        String minheightReplacement = "minheight";
 | 
				
			||||||
 | 
					        String maxHeight = "maxHeight";
 | 
				
			||||||
 | 
					        String maxheightReplacement = "maxheight";
 | 
				
			||||||
 | 
					        String usedGrants = "usedGrants";
 | 
				
			||||||
 | 
					        String usedGrantsReplacement = "used_grants";
 | 
				
			||||||
 | 
					        String remainingGrants = "remainingGrants";
 | 
				
			||||||
 | 
					        String rremainingGrantsReplacement = "remaining_grants";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try (Stream<Path> paths = Files.walk(Paths.get(PlotSquared.platform().getDirectory().toPath().resolve("lang").toUri()))) {
 | 
				
			||||||
 | 
					            paths
 | 
				
			||||||
 | 
					                    .filter(Files::isRegularFile)
 | 
				
			||||||
 | 
					                    .filter(p -> p.getFileName().toString().matches("messages_[a-z]{2}\\.json"))
 | 
				
			||||||
 | 
					                    .forEach(p -> {
 | 
				
			||||||
 | 
					                        replaceInFile(p, suggestCommand, suggestCommandReplacement);
 | 
				
			||||||
 | 
					                        replaceInFile(p, minHeight, minheightReplacement);
 | 
				
			||||||
 | 
					                        replaceInFile(p, maxHeight, maxheightReplacement);
 | 
				
			||||||
 | 
					                        replaceInFile(p, usedGrants, usedGrantsReplacement);
 | 
				
			||||||
 | 
					                        replaceInFile(p, remainingGrants, rremainingGrantsReplacement);
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static void replaceInFile(Path path, String searchText, String replacementText) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            String content = Files.readString(path);
 | 
				
			||||||
 | 
					            if (content.contains(searchText)) {
 | 
				
			||||||
 | 
					                content = content.replaceAll(searchText, replacementText);
 | 
				
			||||||
 | 
					                Files.writeString(path, content);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } catch (IOException e) {
 | 
				
			||||||
 | 
					            e.printStackTrace();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -35,7 +35,7 @@ import org.bukkit.scheduler.BukkitTask;
 | 
				
			|||||||
import javax.net.ssl.HttpsURLConnection;
 | 
					import javax.net.ssl.HttpsURLConnection;
 | 
				
			||||||
import java.io.IOException;
 | 
					import java.io.IOException;
 | 
				
			||||||
import java.io.InputStreamReader;
 | 
					import java.io.InputStreamReader;
 | 
				
			||||||
import java.net.URL;
 | 
					import java.net.URI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class UpdateUtility implements Listener {
 | 
					public class UpdateUtility implements Listener {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -54,12 +54,14 @@ public class UpdateUtility implements Listener {
 | 
				
			|||||||
        internalVersion = PlotSquared.get().getVersion();
 | 
					        internalVersion = PlotSquared.get().getVersion();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @SuppressWarnings({"deprecation", "DefaultCharset"}) // Suppress Json deprecation, we can't use features from gson 2.8.1 and newer yet
 | 
					    @SuppressWarnings({"deprecation", "DefaultCharset"})
 | 
				
			||||||
 | 
					    // Suppress Json deprecation, we can't use features from gson 2.8.1 and newer yet
 | 
				
			||||||
    public void updateChecker() {
 | 
					    public void updateChecker() {
 | 
				
			||||||
        task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> {
 | 
					        task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> {
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                HttpsURLConnection connection = (HttpsURLConnection) new URL(
 | 
					                HttpsURLConnection connection = (HttpsURLConnection) URI.create(
 | 
				
			||||||
                        "https://api.spigotmc.org/simple/0.1/index.php?action=getResource&id=77506")
 | 
					                        "https://api.spigotmc.org/simple/0.2/index.php?action=getResource&id=77506")
 | 
				
			||||||
 | 
					                        .toURL()
 | 
				
			||||||
                        .openConnection();
 | 
					                        .openConnection();
 | 
				
			||||||
                connection.setRequestMethod("GET");
 | 
					                connection.setRequestMethod("GET");
 | 
				
			||||||
                JsonObject result = new JsonParser()
 | 
					                JsonObject result = new JsonParser()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -94,11 +94,6 @@ public class FaweRegionManager extends BukkitRegionManager {
 | 
				
			|||||||
        delegate.swap(pos1, pos2, swapPos, whenDone);
 | 
					        delegate.swap(pos1, pos2, swapPos, whenDone);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public void setBiome(CuboidRegion region, int extendBiome, BiomeType biome, String world, Runnable whenDone) {
 | 
					 | 
				
			||||||
        delegate.setBiome(region, extendBiome, biome, world, whenDone);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void setBiome(CuboidRegion region, int extendBiome, BiomeType biome, PlotArea area, Runnable whenDone) {
 | 
					    public void setBiome(CuboidRegion region, int extendBiome, BiomeType biome, PlotArea area, Runnable whenDone) {
 | 
				
			||||||
        delegate.setBiome(region, extendBiome, biome, area.getWorldName(), whenDone);
 | 
					        delegate.setBiome(region, extendBiome, biome, area.getWorldName(), whenDone);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -80,4 +80,3 @@ public class FaweSchematicHandler extends SchematicHandler {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -111,8 +111,8 @@ public class SQLiteUUIDService implements UUIDService, Consumer<List<UUIDMapping
 | 
				
			|||||||
        try (final PreparedStatement statement = getConnection()
 | 
					        try (final PreparedStatement statement = getConnection()
 | 
				
			||||||
                .prepareStatement("INSERT OR REPLACE INTO `usercache` (`uuid`, `username`) VALUES(?, ?)")) {
 | 
					                .prepareStatement("INSERT OR REPLACE INTO `usercache` (`uuid`, `username`) VALUES(?, ?)")) {
 | 
				
			||||||
            for (final UUIDMapping mapping : uuidWrappers) {
 | 
					            for (final UUIDMapping mapping : uuidWrappers) {
 | 
				
			||||||
                statement.setString(1, mapping.getUuid().toString());
 | 
					                statement.setString(1, mapping.uuid().toString());
 | 
				
			||||||
                statement.setString(2, mapping.getUsername());
 | 
					                statement.setString(2, mapping.username());
 | 
				
			||||||
                statement.executeUpdate();
 | 
					                statement.executeUpdate();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } catch (SQLException e) {
 | 
					        } catch (SQLException e) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,16 +4,16 @@ api-version: "1.13"
 | 
				
			|||||||
version: "${version}"
 | 
					version: "${version}"
 | 
				
			||||||
load: STARTUP
 | 
					load: STARTUP
 | 
				
			||||||
description: "Easy, yet powerful Plot World generation and management."
 | 
					description: "Easy, yet powerful Plot World generation and management."
 | 
				
			||||||
authors: [Citymonstret, Empire92, MattBDev, dordsor21, NotMyFault, SirYwell]
 | 
					authors: [ Citymonstret, Empire92, MattBDev, dordsor21, NotMyFault, SirYwell ]
 | 
				
			||||||
website: https://www.spigotmc.org/resources/77506/
 | 
					website: https://www.spigotmc.org/resources/77506/
 | 
				
			||||||
softdepend: [Vault, PlaceholderAPI, Essentials, LuckPerms, BungeePerms, MVdWPlaceholderAPI]
 | 
					softdepend: [ Vault, PlaceholderAPI, Essentials, LuckPerms, BungeePerms, MVdWPlaceholderAPI ]
 | 
				
			||||||
loadbefore: [MultiWorld, Multiverse-Core]
 | 
					loadbefore: [ MultiWorld, Multiverse-Core ]
 | 
				
			||||||
depend: [WorldEdit]
 | 
					depend: [ WorldEdit ]
 | 
				
			||||||
database: false
 | 
					database: false
 | 
				
			||||||
commands:
 | 
					commands:
 | 
				
			||||||
  plots:
 | 
					  plots:
 | 
				
			||||||
    description: Plot command.
 | 
					    description: Plot command.
 | 
				
			||||||
    aliases: [p,plot,ps,plotsquared,p2,2,plotme]
 | 
					    aliases: [ p,plot,ps,plotsquared,p2,2,plotme ]
 | 
				
			||||||
    permission: plots.use
 | 
					    permission: plots.use
 | 
				
			||||||
    permission-message: "You are lacking the permission node 'plots.use'"
 | 
					    permission-message: "You are lacking the permission node 'plots.use'"
 | 
				
			||||||
permissions:
 | 
					permissions:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,76 +0,0 @@
 | 
				
			|||||||
# Contributor Covenant Code of Conduct
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Our Pledge
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
In the interest of fostering an open and welcoming environment, we as
 | 
					 | 
				
			||||||
contributors and maintainers pledge to making participation in our project and
 | 
					 | 
				
			||||||
our community a harassment-free experience for everyone, regardless of age, body
 | 
					 | 
				
			||||||
size, disability, ethnicity, sex characteristics, gender identity and expression,
 | 
					 | 
				
			||||||
level of experience, education, socio-economic status, nationality, personal
 | 
					 | 
				
			||||||
appearance, race, religion, or sexual identity and orientation.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Our Standards
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Examples of behavior that contributes to creating a positive environment
 | 
					 | 
				
			||||||
include:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* Using welcoming and inclusive language
 | 
					 | 
				
			||||||
* Being respectful of differing viewpoints and experiences
 | 
					 | 
				
			||||||
* Gracefully accepting constructive criticism
 | 
					 | 
				
			||||||
* Focusing on what is best for the community
 | 
					 | 
				
			||||||
* Showing empathy towards other community members
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Examples of unacceptable behavior by participants include:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* The use of sexualized language or imagery and unwelcome sexual attention or
 | 
					 | 
				
			||||||
 advances
 | 
					 | 
				
			||||||
* Trolling, insulting/derogatory comments, and personal or political attacks
 | 
					 | 
				
			||||||
* Public or private harassment
 | 
					 | 
				
			||||||
* Publishing others' private information, such as a physical or electronic
 | 
					 | 
				
			||||||
 address, without explicit permission
 | 
					 | 
				
			||||||
* Other conduct which could reasonably be considered inappropriate in a
 | 
					 | 
				
			||||||
 professional setting
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Our Responsibilities
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Project maintainers are responsible for clarifying the standards of acceptable
 | 
					 | 
				
			||||||
behavior and are expected to take appropriate and fair corrective action in
 | 
					 | 
				
			||||||
response to any instances of unacceptable behavior.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Project maintainers have the right and responsibility to remove, edit, or
 | 
					 | 
				
			||||||
reject comments, commits, code, wiki edits, issues, and other contributions
 | 
					 | 
				
			||||||
that are not aligned to this Code of Conduct, or to ban temporarily or
 | 
					 | 
				
			||||||
permanently any contributor for other behaviors that they deem inappropriate,
 | 
					 | 
				
			||||||
threatening, offensive, or harmful.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Scope
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
This Code of Conduct applies both within project spaces and in public spaces
 | 
					 | 
				
			||||||
when an individual is representing the project or its community. Examples of
 | 
					 | 
				
			||||||
representing a project or community include using an official project e-mail
 | 
					 | 
				
			||||||
address, posting via an official social media account, or acting as an appointed
 | 
					 | 
				
			||||||
representative at an online or offline event. Representation of a project may be
 | 
					 | 
				
			||||||
further defined and clarified by project maintainers.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Enforcement
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
 | 
					 | 
				
			||||||
reported by contacting the project team at contact@intellectualsites.com. All
 | 
					 | 
				
			||||||
complaints will be reviewed and investigated and will result in a response that
 | 
					 | 
				
			||||||
is deemed necessary and appropriate to the circumstances. The project team is
 | 
					 | 
				
			||||||
obligated to maintain confidentiality with regard to the reporter of an incident.
 | 
					 | 
				
			||||||
Further details of specific enforcement policies may be posted separately.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Project maintainers who do not follow or enforce the Code of Conduct in good
 | 
					 | 
				
			||||||
faith may face temporary or permanent repercussions as determined by other
 | 
					 | 
				
			||||||
members of the project's leadership.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Attribution
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
 | 
					 | 
				
			||||||
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[homepage]: https://www.contributor-covenant.org
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
For answers to common questions about this code of conduct, see
 | 
					 | 
				
			||||||
https://www.contributor-covenant.org/faq
 | 
					 | 
				
			||||||
@@ -2,18 +2,18 @@ import java.time.format.DateTimeFormatter
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
dependencies {
 | 
					dependencies {
 | 
				
			||||||
    // Expected everywhere.
 | 
					    // Expected everywhere.
 | 
				
			||||||
    compileOnlyApi("org.checkerframework:checker-qual")
 | 
					    compileOnlyApi(libs.checkerqual)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Minecraft expectations
 | 
					    // Minecraft expectations
 | 
				
			||||||
    compileOnlyApi("com.google.code.gson:gson")
 | 
					    compileOnlyApi(libs.gson)
 | 
				
			||||||
    compileOnly("com.google.guava:guava")
 | 
					    compileOnly(libs.guava)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Platform expectations
 | 
					    // Platform expectations
 | 
				
			||||||
    compileOnlyApi("org.yaml:snakeyaml")
 | 
					    compileOnlyApi(libs.snakeyaml)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Adventure
 | 
					    // Adventure
 | 
				
			||||||
    api("net.kyori:adventure-api")
 | 
					    api(libs.adventureApi)
 | 
				
			||||||
    api("net.kyori:adventure-text-minimessage")
 | 
					    api(libs.adventureMiniMessage)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Guice
 | 
					    // Guice
 | 
				
			||||||
    api(libs.guice) {
 | 
					    api(libs.guice) {
 | 
				
			||||||
@@ -31,19 +31,19 @@ dependencies {
 | 
				
			|||||||
        exclude(group = "dummypermscompat")
 | 
					        exclude(group = "dummypermscompat")
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    testImplementation(libs.worldeditCore)
 | 
					    testImplementation(libs.worldeditCore)
 | 
				
			||||||
    compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Core") { isTransitive = false }
 | 
					    compileOnly(libs.faweBukkit) { isTransitive = false }
 | 
				
			||||||
    testImplementation("com.fastasyncworldedit:FastAsyncWorldEdit-Core") { isTransitive = false }
 | 
					    testImplementation(libs.faweCore) { isTransitive = false }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Logging
 | 
					    // Logging
 | 
				
			||||||
    compileOnlyApi("org.apache.logging.log4j:log4j-api")
 | 
					    compileOnlyApi(libs.log4j)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Other libraries
 | 
					    // Other libraries
 | 
				
			||||||
    api(libs.prtree)
 | 
					    api(libs.prtree)
 | 
				
			||||||
    api(libs.aopalliance)
 | 
					    api(libs.aopalliance)
 | 
				
			||||||
    api(libs.cloudServices)
 | 
					    api(libs.cloudServices)
 | 
				
			||||||
    api(libs.arkitektonika)
 | 
					    api(libs.arkitektonika)
 | 
				
			||||||
    api("com.intellectualsites.paster:Paster")
 | 
					    api(libs.paster)
 | 
				
			||||||
    api("com.intellectualsites.informative-annotations:informative-annotations")
 | 
					    api(libs.informativeAnnotations)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tasks.processResources {
 | 
					tasks.processResources {
 | 
				
			||||||
@@ -57,20 +57,28 @@ tasks.processResources {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    doLast {
 | 
					    doLast {
 | 
				
			||||||
        copy {
 | 
					        copy {
 | 
				
			||||||
            from(File("$rootDir/LICENSE"))
 | 
					            from(layout.buildDirectory.file("$rootDir/LICENSE"))
 | 
				
			||||||
            into("$buildDir/resources/main/")
 | 
					            into(layout.buildDirectory.dir("resources/main"))
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tasks {
 | 
					tasks {
 | 
				
			||||||
    withType<Javadoc> {
 | 
					    withType<Javadoc> {
 | 
				
			||||||
 | 
					        val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
 | 
				
			||||||
        val opt = options as StandardJavadocDocletOptions
 | 
					        val opt = options as StandardJavadocDocletOptions
 | 
				
			||||||
        opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString())
 | 
					        opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString())
 | 
				
			||||||
        opt.links("https://jd.adventure.kyori.net/api/4.9.3/")
 | 
					        opt.links("https://jd.advntr.dev/api/4.14.0/")
 | 
				
			||||||
 | 
					        opt.links("https://jd.advntr.dev/text-minimessage/4.14.0/")
 | 
				
			||||||
        opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
 | 
					        opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
 | 
				
			||||||
        opt.links("https://checkerframework.org/api/")
 | 
					        opt.links("https://checkerframework.org/api/")
 | 
				
			||||||
        opt.links("https://javadoc.io/doc/com.intellectualsites.informative-annotations/informative-annotations/latest/")
 | 
					        opt.links("https://javadocs.dev/com.intellectualsites.informative-annotations/informative-annotations/"
 | 
				
			||||||
 | 
					                + libs.informativeAnnotations.get().versionConstraint.toString())
 | 
				
			||||||
 | 
					        opt.isLinkSource = true
 | 
				
			||||||
 | 
					        opt.bottom(File("$rootDir/javadocfooter.html").readText())
 | 
				
			||||||
 | 
					        opt.isUse = true
 | 
				
			||||||
        opt.encoding("UTF-8")
 | 
					        opt.encoding("UTF-8")
 | 
				
			||||||
 | 
					        opt.keyWords()
 | 
				
			||||||
 | 
					        opt.addStringOption("-since", isRelease)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,7 +30,7 @@ import com.plotsquared.core.util.ChunkManager;
 | 
				
			|||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.SchematicHandler;
 | 
					import com.plotsquared.core.util.SchematicHandler;
 | 
				
			||||||
import com.plotsquared.core.util.query.PlotQuery;
 | 
					import com.plotsquared.core.util.query.PlotQuery;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
					import org.checkerframework.checker.nullness.qual.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -145,7 +145,7 @@ public class PlotAPI {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public void sendConsoleMessage(
 | 
					    public void sendConsoleMessage(
 | 
				
			||||||
            final @NonNull String message,
 | 
					            final @NonNull String message,
 | 
				
			||||||
            final @NonNull Template @NonNull ... replacements
 | 
					            final @NonNull TagResolver @NonNull ... replacements
 | 
				
			||||||
    ) {
 | 
					    ) {
 | 
				
			||||||
        ConsolePlayer.getConsole().sendMessage(StaticCaption.of(message), replacements);
 | 
					        ConsolePlayer.getConsole().sendMessage(StaticCaption.of(message), replacements);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -158,7 +158,7 @@ public class PlotAPI {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public void sendConsoleMessage(
 | 
					    public void sendConsoleMessage(
 | 
				
			||||||
            final @NonNull Caption caption,
 | 
					            final @NonNull Caption caption,
 | 
				
			||||||
            final @NonNull Template @NonNull ... replacements
 | 
					            final @NonNull TagResolver @NonNull ... replacements
 | 
				
			||||||
    ) {
 | 
					    ) {
 | 
				
			||||||
        ConsolePlayer.getConsole().sendMessage(caption, replacements);
 | 
					        ConsolePlayer.getConsole().sendMessage(caption, replacements);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -84,7 +84,7 @@ import java.io.InputStream;
 | 
				
			|||||||
import java.io.InputStreamReader;
 | 
					import java.io.InputStreamReader;
 | 
				
			||||||
import java.io.ObjectInputStream;
 | 
					import java.io.ObjectInputStream;
 | 
				
			||||||
import java.io.ObjectOutputStream;
 | 
					import java.io.ObjectOutputStream;
 | 
				
			||||||
import java.net.MalformedURLException;
 | 
					import java.net.URI;
 | 
				
			||||||
import java.net.URISyntaxException;
 | 
					import java.net.URISyntaxException;
 | 
				
			||||||
import java.net.URL;
 | 
					import java.net.URL;
 | 
				
			||||||
import java.nio.file.Files;
 | 
					import java.nio.file.Files;
 | 
				
			||||||
@@ -210,9 +210,10 @@ public class PlotSquared {
 | 
				
			|||||||
            try {
 | 
					            try {
 | 
				
			||||||
                URL logurl = PlotSquared.class.getProtectionDomain().getCodeSource().getLocation();
 | 
					                URL logurl = PlotSquared.class.getProtectionDomain().getCodeSource().getLocation();
 | 
				
			||||||
                this.jarFile = new File(
 | 
					                this.jarFile = new File(
 | 
				
			||||||
                        new URL(logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file"))
 | 
					                        URI.create(
 | 
				
			||||||
                                .toURI().getPath());
 | 
					                                logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file"))
 | 
				
			||||||
            } catch (MalformedURLException | URISyntaxException | SecurityException e) {
 | 
					                                .getPath());
 | 
				
			||||||
 | 
					            } catch (URISyntaxException | SecurityException e) {
 | 
				
			||||||
                e.printStackTrace();
 | 
					                e.printStackTrace();
 | 
				
			||||||
                this.jarFile = new File(this.platform.getDirectory().getParentFile(), "PlotSquared.jar");
 | 
					                this.jarFile = new File(this.platform.getDirectory().getParentFile(), "PlotSquared.jar");
 | 
				
			||||||
                if (!this.jarFile.exists()) {
 | 
					                if (!this.jarFile.exists()) {
 | 
				
			||||||
@@ -270,7 +271,11 @@ public class PlotSquared {
 | 
				
			|||||||
            captionMap = this.captionLoader.loadAll(this.platform.getDirectory().toPath().resolve("lang"));
 | 
					            captionMap = this.captionLoader.loadAll(this.platform.getDirectory().toPath().resolve("lang"));
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            String fileName = "messages_" + Settings.Enabled_Components.DEFAULT_LOCALE + ".json";
 | 
					            String fileName = "messages_" + Settings.Enabled_Components.DEFAULT_LOCALE + ".json";
 | 
				
			||||||
            captionMap = this.captionLoader.loadOrCreateSingle(this.platform.getDirectory().toPath().resolve("lang").resolve(fileName));
 | 
					            captionMap = this.captionLoader.loadOrCreateSingle(this.platform
 | 
				
			||||||
 | 
					                    .getDirectory()
 | 
				
			||||||
 | 
					                    .toPath()
 | 
				
			||||||
 | 
					                    .resolve("lang")
 | 
				
			||||||
 | 
					                    .resolve(fileName));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        this.captionMaps.put(TranslatableCaption.DEFAULT_NAMESPACE, captionMap);
 | 
					        this.captionMaps.put(TranslatableCaption.DEFAULT_NAMESPACE, captionMap);
 | 
				
			||||||
        LOGGER.info(
 | 
					        LOGGER.info(
 | 
				
			||||||
@@ -790,7 +795,9 @@ public class PlotSquared {
 | 
				
			|||||||
        if (world.equals("CheckingPlotSquaredGenerator")) {
 | 
					        if (world.equals("CheckingPlotSquaredGenerator")) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        this.getPlotAreaManager().addWorld(world);
 | 
					        if (!this.getPlotAreaManager().addWorld(world)) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        Set<String> worlds;
 | 
					        Set<String> worlds;
 | 
				
			||||||
        if (this.worldConfiguration.contains("worlds")) {
 | 
					        if (this.worldConfiguration.contains("worlds")) {
 | 
				
			||||||
            worlds = this.worldConfiguration.getConfigurationSection("worlds").getKeys(false);
 | 
					            worlds = this.worldConfiguration.getConfigurationSection("worlds").getKeys(false);
 | 
				
			||||||
@@ -1009,7 +1016,7 @@ public class PlotSquared {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Setup the configuration for a plot world based on world arguments.
 | 
					     * Setup the configuration for a plot world based on world arguments.
 | 
				
			||||||
     *
 | 
					     * <p>
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * <i>e.g. /mv create <world> normal -g PlotSquared:<args></i>
 | 
					     * <i>e.g. /mv create <world> normal -g PlotSquared:<args></i>
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
@@ -1275,7 +1282,7 @@ public class PlotSquared {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Setup the database connection.
 | 
					     * Set up the database connection.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public void setupDatabase() {
 | 
					    public void setupDatabase() {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -200,7 +200,7 @@ public class PlayerBackupProfile implements BackupProfile {
 | 
				
			|||||||
                                    if (value) {
 | 
					                                    if (value) {
 | 
				
			||||||
                                        future.complete(null);
 | 
					                                        future.complete(null);
 | 
				
			||||||
                                    } else {
 | 
					                                    } else {
 | 
				
			||||||
                                        future.completeExceptionally(new RuntimeException(MINI_MESSAGE.stripTokens(
 | 
					                                        future.completeExceptionally(new RuntimeException(MINI_MESSAGE.escapeTags(
 | 
				
			||||||
                                                TranslatableCaption
 | 
					                                                TranslatableCaption
 | 
				
			||||||
                                                        .of("schematics.schematic_paste_failed")
 | 
					                                                        .of("schematics.schematic_paste_failed")
 | 
				
			||||||
                                                        .getComponent(ConsolePlayer.getConsole()))));
 | 
					                                                        .getComponent(ConsolePlayer.getConsole()))));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,13 +24,14 @@ import com.google.inject.Inject;
 | 
				
			|||||||
import com.google.inject.Singleton;
 | 
					import com.google.inject.Singleton;
 | 
				
			||||||
import com.plotsquared.core.PlotSquared;
 | 
					import com.plotsquared.core.PlotSquared;
 | 
				
			||||||
import com.plotsquared.core.configuration.Settings;
 | 
					import com.plotsquared.core.configuration.Settings;
 | 
				
			||||||
import com.plotsquared.core.configuration.caption.Templates;
 | 
					 | 
				
			||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
					import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
				
			||||||
import com.plotsquared.core.inject.factory.PlayerBackupProfileFactory;
 | 
					import com.plotsquared.core.inject.factory.PlayerBackupProfileFactory;
 | 
				
			||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
import com.plotsquared.core.plot.Plot;
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskManager;
 | 
					import com.plotsquared.core.util.task.TaskManager;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
					import org.checkerframework.checker.nullness.qual.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -100,7 +101,7 @@ public class SimpleBackupManager implements BackupManager {
 | 
				
			|||||||
            if (player != null) {
 | 
					            if (player != null) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("backups.backup_automatic_started"),
 | 
					                        TranslatableCaption.of("backups.backup_automatic_started"),
 | 
				
			||||||
                        Template.of("plot", plot.getId().toString())
 | 
					                        TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            profile.createBackup().whenComplete((backup, throwable) -> {
 | 
					            profile.createBackup().whenComplete((backup, throwable) -> {
 | 
				
			||||||
@@ -108,7 +109,7 @@ public class SimpleBackupManager implements BackupManager {
 | 
				
			|||||||
                    if (player != null) {
 | 
					                    if (player != null) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("backups.backup_automatic_failure"),
 | 
					                                TranslatableCaption.of("backups.backup_automatic_failure"),
 | 
				
			||||||
                                Templates.of("reason", throwable.getMessage())
 | 
					                                TagResolver.resolver("reason", Tag.inserting(Component.text(throwable.getMessage())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    throwable.printStackTrace();
 | 
					                    throwable.printStackTrace();
 | 
				
			||||||
@@ -135,13 +136,9 @@ public class SimpleBackupManager implements BackupManager {
 | 
				
			|||||||
        return this.backupLimit;
 | 
					        return this.backupLimit;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static final class PlotCacheKey {
 | 
					    private record PlotCacheKey(
 | 
				
			||||||
 | 
					            Plot plot
 | 
				
			||||||
        private final Plot plot;
 | 
					    ) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
        private PlotCacheKey(Plot plot) {
 | 
					 | 
				
			||||||
            this.plot = plot;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public boolean equals(final Object o) {
 | 
					        public boolean equals(final Object o) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,6 +19,7 @@
 | 
				
			|||||||
package com.plotsquared.core.command;
 | 
					package com.plotsquared.core.command;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.google.inject.Inject;
 | 
					import com.google.inject.Inject;
 | 
				
			||||||
 | 
					import com.plotsquared.core.PlotSquared;
 | 
				
			||||||
import com.plotsquared.core.configuration.Settings;
 | 
					import com.plotsquared.core.configuration.Settings;
 | 
				
			||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
					import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
				
			||||||
import com.plotsquared.core.database.DBFunc;
 | 
					import com.plotsquared.core.database.DBFunc;
 | 
				
			||||||
@@ -26,12 +27,13 @@ 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;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.PlayerManager;
 | 
					import com.plotsquared.core.util.PlayerManager;
 | 
				
			||||||
import com.plotsquared.core.util.TabCompletions;
 | 
					import com.plotsquared.core.util.TabCompletions;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal2;
 | 
					import com.plotsquared.core.util.task.RunnableVal2;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal3;
 | 
					import com.plotsquared.core.util.task.RunnableVal3;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
@@ -58,19 +60,21 @@ public class Add extends Command {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public CompletableFuture<Boolean> execute(
 | 
					    public CompletableFuture<Boolean> execute(
 | 
				
			||||||
            final PlotPlayer<?> player, String[] args,
 | 
					            final PlotPlayer<?> player,
 | 
				
			||||||
 | 
					            String[] args,
 | 
				
			||||||
            RunnableVal3<Command, Runnable, Runnable> confirm,
 | 
					            RunnableVal3<Command, Runnable, Runnable> confirm,
 | 
				
			||||||
            RunnableVal2<Command, CommandResult> whenDone
 | 
					            RunnableVal2<Command, CommandResult> whenDone
 | 
				
			||||||
    ) throws CommandException {
 | 
					    ) throws CommandException {
 | 
				
			||||||
        final Plot plot = check(player.getCurrentPlot(), TranslatableCaption.of("errors.not_in_plot"));
 | 
					        final Plot plot = check(player.getCurrentPlot(), TranslatableCaption.of("errors.not_in_plot"));
 | 
				
			||||||
        checkTrue(plot.hasOwner(), TranslatableCaption.of("info.plot_unowned"));
 | 
					        checkTrue(plot.hasOwner(), TranslatableCaption.of("info.plot_unowned"));
 | 
				
			||||||
        checkTrue(
 | 
					        checkTrue(
 | 
				
			||||||
                plot.isOwner(player.getUUID()) || Permissions
 | 
					                plot.isOwner(player.getUUID()) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_TRUST),
 | 
				
			||||||
                        .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_TRUST),
 | 
					 | 
				
			||||||
                TranslatableCaption.of("permission.no_plot_perms")
 | 
					                TranslatableCaption.of("permission.no_plot_perms")
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        checkTrue(args.length == 1, TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					        checkTrue(
 | 
				
			||||||
                Template.of("value", "/plot add <player | *>")
 | 
					                args.length == 1,
 | 
				
			||||||
 | 
					                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
 | 
					                TagResolver.resolver("value", Tag.inserting(Component.text("/plot add <player | *>")))
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        final CompletableFuture<Boolean> future = new CompletableFuture<>();
 | 
					        final CompletableFuture<Boolean> future = new CompletableFuture<>();
 | 
				
			||||||
        PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> {
 | 
					        PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> {
 | 
				
			||||||
@@ -80,7 +84,7 @@ public class Add extends Command {
 | 
				
			|||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("errors.invalid_player"),
 | 
					                            TranslatableCaption.of("errors.invalid_player"),
 | 
				
			||||||
                            Template.of("value", args[0])
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                future.completeExceptionally(throwable);
 | 
					                future.completeExceptionally(throwable);
 | 
				
			||||||
@@ -88,18 +92,24 @@ public class Add extends Command {
 | 
				
			|||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    checkTrue(!uuids.isEmpty(), TranslatableCaption.of("errors.invalid_player"),
 | 
					                    checkTrue(!uuids.isEmpty(), TranslatableCaption.of("errors.invalid_player"),
 | 
				
			||||||
                            Template.of("value", args[0])
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    Iterator<UUID> iterator = uuids.iterator();
 | 
					                    Iterator<UUID> iterator = uuids.iterator();
 | 
				
			||||||
                    int size = plot.getTrusted().size() + plot.getMembers().size();
 | 
					                    int size = plot.getTrusted().size() + plot.getMembers().size();
 | 
				
			||||||
                    while (iterator.hasNext()) {
 | 
					                    while (iterator.hasNext()) {
 | 
				
			||||||
                        UUID uuid = iterator.next();
 | 
					                        UUID uuid = iterator.next();
 | 
				
			||||||
                        if (uuid == DBFunc.EVERYONE && !(
 | 
					                        if (uuid == DBFunc.EVERYONE && !(player.hasPermission(Permission.PERMISSION_TRUST_EVERYONE) || player.hasPermission(
 | 
				
			||||||
                                Permissions.hasPermission(player, Permission.PERMISSION_TRUST_EVERYONE) || Permissions
 | 
					                                Permission.PERMISSION_ADMIN_COMMAND_TRUST))) {
 | 
				
			||||||
                                        .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_TRUST))) {
 | 
					 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("errors.invalid_player"),
 | 
					                                    TranslatableCaption.of("errors.invalid_player"),
 | 
				
			||||||
                                    Template.of("value", PlayerManager.resolveName(uuid).getComponent(player))
 | 
					                                    PlotSquared
 | 
				
			||||||
 | 
					                                            .platform()
 | 
				
			||||||
 | 
					                                            .playerManager()
 | 
				
			||||||
 | 
					                                            .getUsernameCaption(uuid)
 | 
				
			||||||
 | 
					                                            .thenApply(caption -> TagResolver.resolver(
 | 
				
			||||||
 | 
					                                                    "value",
 | 
				
			||||||
 | 
					                                                    Tag.inserting(caption.toComponent(player))
 | 
				
			||||||
 | 
					                                            ))
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                            iterator.remove();
 | 
					                            iterator.remove();
 | 
				
			||||||
                            continue;
 | 
					                            continue;
 | 
				
			||||||
@@ -107,7 +117,11 @@ public class Add extends Command {
 | 
				
			|||||||
                        if (plot.isOwner(uuid)) {
 | 
					                        if (plot.isOwner(uuid)) {
 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("member.already_added"),
 | 
					                                    TranslatableCaption.of("member.already_added"),
 | 
				
			||||||
                                    Template.of("player", PlayerManager.resolveName(uuid).getComponent(player))
 | 
					                                    PlotSquared.platform().playerManager().getUsernameCaption(uuid)
 | 
				
			||||||
 | 
					                                            .thenApply(caption -> TagResolver.resolver(
 | 
				
			||||||
 | 
					                                                    "player",
 | 
				
			||||||
 | 
					                                                    Tag.inserting(caption.toComponent(player))
 | 
				
			||||||
 | 
					                                            ))
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                            iterator.remove();
 | 
					                            iterator.remove();
 | 
				
			||||||
                            continue;
 | 
					                            continue;
 | 
				
			||||||
@@ -115,7 +129,11 @@ public class Add extends Command {
 | 
				
			|||||||
                        if (plot.getMembers().contains(uuid)) {
 | 
					                        if (plot.getMembers().contains(uuid)) {
 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("member.already_added"),
 | 
					                                    TranslatableCaption.of("member.already_added"),
 | 
				
			||||||
                                    Template.of("player", PlayerManager.resolveName(uuid).getComponent(player))
 | 
					                                    PlotSquared.platform().playerManager().getUsernameCaption(uuid)
 | 
				
			||||||
 | 
					                                            .thenApply(caption -> TagResolver.resolver(
 | 
				
			||||||
 | 
					                                                    "player",
 | 
				
			||||||
 | 
					                                                    Tag.inserting(caption.toComponent(player))
 | 
				
			||||||
 | 
					                                            ))
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                            iterator.remove();
 | 
					                            iterator.remove();
 | 
				
			||||||
                            continue;
 | 
					                            continue;
 | 
				
			||||||
@@ -124,11 +142,11 @@ public class Add extends Command {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    checkTrue(!uuids.isEmpty(), null);
 | 
					                    checkTrue(!uuids.isEmpty(), null);
 | 
				
			||||||
                    int localAddSize = plot.getMembers().size();
 | 
					                    int localAddSize = plot.getMembers().size();
 | 
				
			||||||
                    int maxAddSize = Permissions.hasPermissionRange(player, Permission.PERMISSION_ADD, Settings.Limit.MAX_PLOTS);
 | 
					                    int maxAddSize = player.hasPermissionRange(Permission.PERMISSION_ADD, Settings.Limit.MAX_PLOTS);
 | 
				
			||||||
                    if (localAddSize >= maxAddSize) {
 | 
					                    if (localAddSize >= maxAddSize) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("members.plot_max_members_added"),
 | 
					                                TranslatableCaption.of("members.plot_max_members_added"),
 | 
				
			||||||
                                Template.of("amount", String.valueOf(localAddSize))
 | 
					                                TagResolver.resolver("amount", Tag.inserting(Component.text(localAddSize)))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,9 +26,10 @@ 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;
 | 
				
			||||||
import com.plotsquared.core.util.MathMan;
 | 
					import com.plotsquared.core.util.MathMan;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.query.PlotQuery;
 | 
					import com.plotsquared.core.util.query.PlotQuery;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
@@ -92,7 +93,10 @@ public class Alias extends SubCommand {
 | 
				
			|||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ALIAS_SET))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ALIAS_SET)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -108,7 +112,10 @@ public class Alias extends SubCommand {
 | 
				
			|||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_ALIAS_REMOVE))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_ALIAS_REMOVE)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -149,13 +156,16 @@ public class Alias extends SubCommand {
 | 
				
			|||||||
                    .anyMatch()) {
 | 
					                    .anyMatch()) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("alias.alias_is_taken"),
 | 
					                        TranslatableCaption.of("alias.alias_is_taken"),
 | 
				
			||||||
                        Template.of("alias", alias)
 | 
					                        TagResolver.resolver("alias", Tag.inserting(Component.text(alias)))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Settings.UUID.OFFLINE) {
 | 
					            if (Settings.UUID.OFFLINE) {
 | 
				
			||||||
                plot.setAlias(alias);
 | 
					                plot.setAlias(alias);
 | 
				
			||||||
                player.sendMessage(TranslatableCaption.of("alias.alias_set_to"), Template.of("alias", alias));
 | 
					                player.sendMessage(
 | 
				
			||||||
 | 
					                        TranslatableCaption.of("alias.alias_set_to"),
 | 
				
			||||||
 | 
					                        TagResolver.resolver("alias", Tag.inserting(Component.text(alias)))
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            PlotSquared.get().getImpromptuUUIDPipeline().getSingle(alias, ((uuid, throwable) -> {
 | 
					            PlotSquared.get().getImpromptuUUIDPipeline().getSingle(alias, ((uuid, throwable) -> {
 | 
				
			||||||
@@ -164,13 +174,13 @@ public class Alias extends SubCommand {
 | 
				
			|||||||
                } else if (uuid != null) {
 | 
					                } else if (uuid != null) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("alias.alias_is_taken"),
 | 
					                            TranslatableCaption.of("alias.alias_is_taken"),
 | 
				
			||||||
                            Template.of("alias", alias)
 | 
					                            TagResolver.resolver("alias", Tag.inserting(Component.text(alias)))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    plot.setAlias(alias);
 | 
					                    plot.setAlias(alias);
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("alias.alias_set_to"),
 | 
					                            TranslatableCaption.of("alias.alias_set_to"),
 | 
				
			||||||
                            Template.of("alias", alias)
 | 
					                            TagResolver.resolver("alias", Tag.inserting(Component.text(alias)))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }));
 | 
					            }));
 | 
				
			||||||
@@ -182,7 +192,7 @@ public class Alias extends SubCommand {
 | 
				
			|||||||
        if (!plot.getAlias().isEmpty()) {
 | 
					        if (!plot.getAlias().isEmpty()) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("alias.alias_removed"),
 | 
					                    TranslatableCaption.of("alias.alias_removed"),
 | 
				
			||||||
                    Template.of("alias", alias)
 | 
					                    TagResolver.resolver("alias", Tag.inserting(Component.text(alias)))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
@@ -194,7 +204,7 @@ public class Alias extends SubCommand {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private boolean isPermitted(PlotPlayer<?> player, Permission permission) {
 | 
					    private boolean isPermitted(PlotPlayer<?> player, Permission permission) {
 | 
				
			||||||
        return Permissions.hasPermission(player, permission);
 | 
					        return player.hasPermission(permission);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,6 @@ import com.plotsquared.core.configuration.ConfigurationSection;
 | 
				
			|||||||
import com.plotsquared.core.configuration.ConfigurationUtil;
 | 
					import com.plotsquared.core.configuration.ConfigurationUtil;
 | 
				
			||||||
import com.plotsquared.core.configuration.Settings;
 | 
					import com.plotsquared.core.configuration.Settings;
 | 
				
			||||||
import com.plotsquared.core.configuration.caption.CaptionHolder;
 | 
					import com.plotsquared.core.configuration.caption.CaptionHolder;
 | 
				
			||||||
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.configuration.file.YamlConfiguration;
 | 
					import com.plotsquared.core.configuration.file.YamlConfiguration;
 | 
				
			||||||
import com.plotsquared.core.events.TeleportCause;
 | 
					import com.plotsquared.core.events.TeleportCause;
 | 
				
			||||||
@@ -48,7 +47,6 @@ import com.plotsquared.core.queue.QueueCoordinator;
 | 
				
			|||||||
import com.plotsquared.core.setup.PlotAreaBuilder;
 | 
					import com.plotsquared.core.setup.PlotAreaBuilder;
 | 
				
			||||||
import com.plotsquared.core.util.FileUtils;
 | 
					import com.plotsquared.core.util.FileUtils;
 | 
				
			||||||
import com.plotsquared.core.util.MathMan;
 | 
					import com.plotsquared.core.util.MathMan;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.RegionUtil;
 | 
					import com.plotsquared.core.util.RegionUtil;
 | 
				
			||||||
import com.plotsquared.core.util.SchematicHandler;
 | 
					import com.plotsquared.core.util.SchematicHandler;
 | 
				
			||||||
import com.plotsquared.core.util.SetupUtils;
 | 
					import com.plotsquared.core.util.SetupUtils;
 | 
				
			||||||
@@ -57,6 +55,7 @@ import com.plotsquared.core.util.TabCompletions;
 | 
				
			|||||||
import com.plotsquared.core.util.WorldUtil;
 | 
					import com.plotsquared.core.util.WorldUtil;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal3;
 | 
					import com.plotsquared.core.util.task.RunnableVal3;
 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					import com.sk89q.worldedit.EditSession;
 | 
				
			||||||
 | 
					import com.sk89q.worldedit.EditSessionBuilder;
 | 
				
			||||||
import com.sk89q.worldedit.LocalSession;
 | 
					import com.sk89q.worldedit.LocalSession;
 | 
				
			||||||
import com.sk89q.worldedit.WorldEdit;
 | 
					import com.sk89q.worldedit.WorldEdit;
 | 
				
			||||||
import com.sk89q.worldedit.entity.Player;
 | 
					import com.sk89q.worldedit.entity.Player;
 | 
				
			||||||
@@ -69,7 +68,9 @@ import com.sk89q.worldedit.math.BlockVector3;
 | 
				
			|||||||
import com.sk89q.worldedit.regions.CuboidRegion;
 | 
					import com.sk89q.worldedit.regions.CuboidRegion;
 | 
				
			||||||
import com.sk89q.worldedit.regions.Region;
 | 
					import com.sk89q.worldedit.regions.Region;
 | 
				
			||||||
import com.sk89q.worldedit.world.World;
 | 
					import com.sk89q.worldedit.world.World;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.File;
 | 
					import java.io.File;
 | 
				
			||||||
@@ -138,17 +139,20 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                    player.sendMessage(RequiredType.CONSOLE.getErrorMessage());
 | 
					                    player.sendMessage(RequiredType.CONSOLE.getErrorMessage());
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_CREATE)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_AREA_CREATE)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_AREA_CREATE))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_AREA_CREATE)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (args.length < 2) {
 | 
					                if (args.length < 2) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("single.single_area_needs_name"),
 | 
					                            TranslatableCaption.of("single.single_area_needs_name"),
 | 
				
			||||||
                            Template.of("command", "/plot area single <name>")
 | 
					                            TagResolver.resolver("command", Tag.inserting(Component.text("/plot area single <name>")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -229,10 +233,9 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                try (final ClipboardWriter clipboardWriter = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(new FileOutputStream(
 | 
					                try (final ClipboardWriter clipboardWriter = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(new FileOutputStream(
 | 
				
			||||||
                        file))) {
 | 
					                        file))) {
 | 
				
			||||||
                    final BlockArrayClipboard clipboard = new BlockArrayClipboard(selectedRegion);
 | 
					                    final BlockArrayClipboard clipboard = new BlockArrayClipboard(selectedRegion);
 | 
				
			||||||
                    final EditSession editSession = WorldEdit
 | 
					                    EditSessionBuilder editSessionBuilder = WorldEdit.getInstance().newEditSessionBuilder();
 | 
				
			||||||
                            .getInstance()
 | 
					                    editSessionBuilder.world(selectedRegion.getWorld());
 | 
				
			||||||
                            .getEditSessionFactory()
 | 
					                    final EditSession editSession = editSessionBuilder.build();
 | 
				
			||||||
                            .getEditSession(selectedRegion.getWorld(), -1);
 | 
					 | 
				
			||||||
                    final ForwardExtentCopy forwardExtentCopy =
 | 
					                    final ForwardExtentCopy forwardExtentCopy =
 | 
				
			||||||
                            new ForwardExtentCopy(editSession, selectedRegion, clipboard, selectedRegion.getMinimumPoint());
 | 
					                            new ForwardExtentCopy(editSession, selectedRegion, clipboard, selectedRegion.getMinimumPoint());
 | 
				
			||||||
                    forwardExtentCopy.setCopyingBiomes(true);
 | 
					                    forwardExtentCopy.setCopyingBiomes(true);
 | 
				
			||||||
@@ -280,7 +283,7 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("errors.error_create"),
 | 
					                                TranslatableCaption.of("errors.error_create"),
 | 
				
			||||||
                                Template.of("world", hybridPlotWorld.getWorldName())
 | 
					                                TagResolver.resolver("world", Tag.inserting(Component.text(hybridPlotWorld.getWorldName())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
@@ -288,10 +291,13 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "c", "setup", "create" -> {
 | 
					            case "c", "setup", "create" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_CREATE)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_AREA_CREATE)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_AREA_CREATE))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_AREA_CREATE)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -299,7 +305,10 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                    case 1:
 | 
					                    case 1:
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                                Templates.of("value", "/plot area create [world[:id]] [<modifier>=<value>]...")
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "value",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Component.text("/plot area create [world[:id]] [<modifier>=<value>]..."))
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    case 2:
 | 
					                    case 2:
 | 
				
			||||||
@@ -313,7 +322,11 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                                if (area == null) {
 | 
					                                if (area == null) {
 | 
				
			||||||
                                    player.sendMessage(
 | 
					                                    player.sendMessage(
 | 
				
			||||||
                                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                                            Templates.of("value", "/plot area create [world[:id]] [<modifier>=<value>]...")
 | 
					                                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                                    "value",
 | 
				
			||||||
 | 
					                                                    Tag.inserting(Component.text(
 | 
				
			||||||
 | 
					                                                            "/plot area create [world[:id]] [<modifier>=<value>]..."))
 | 
				
			||||||
 | 
					                                            )
 | 
				
			||||||
                                    );
 | 
					                                    );
 | 
				
			||||||
                                    return false;
 | 
					                                    return false;
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
@@ -324,12 +337,18 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                                );
 | 
					                                );
 | 
				
			||||||
                                player.sendMessage(
 | 
					                                player.sendMessage(
 | 
				
			||||||
                                        TranslatableCaption.of("set.set_attribute"),
 | 
					                                        TranslatableCaption.of("set.set_attribute"),
 | 
				
			||||||
                                        Template.of("attribute", "area_pos1"),
 | 
					                                        TagResolver.builder()
 | 
				
			||||||
                                        Template.of("value", location.getX() + "," + location.getZ())
 | 
					                                                .tag("attribute", Tag.inserting(Component.text("area_pos1")))
 | 
				
			||||||
 | 
					                                                .tag("value", Tag.inserting(
 | 
				
			||||||
 | 
					                                                        Component.text(location.getX())
 | 
				
			||||||
 | 
					                                                                .append(Component.text(","))
 | 
				
			||||||
 | 
					                                                                .append(Component.text(location.getZ()))
 | 
				
			||||||
 | 
					                                                ))
 | 
				
			||||||
 | 
					                                                .build()
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                                player.sendMessage(
 | 
					                                player.sendMessage(
 | 
				
			||||||
                                        TranslatableCaption.of("area.set_pos2"),
 | 
					                                        TranslatableCaption.of("area.set_pos2"),
 | 
				
			||||||
                                        Template.of("command", "/plot area create pos2")
 | 
					                                        TagResolver.resolver("command", Tag.inserting(Component.text("/plot area create pos2")))
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                                return true;
 | 
					                                return true;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
@@ -343,7 +362,11 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                                if (area == null) {
 | 
					                                if (area == null) {
 | 
				
			||||||
                                    player.sendMessage(
 | 
					                                    player.sendMessage(
 | 
				
			||||||
                                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                                            Templates.of("value", "/plot area create [world[:id]] [<modifier>=<value>]...")
 | 
					                                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                                    "value",
 | 
				
			||||||
 | 
					                                                    Tag.inserting(Component.text(
 | 
				
			||||||
 | 
					                                                            "/plot area create [world[:id]] [<modifier>=<value>]..."))
 | 
				
			||||||
 | 
					                                            )
 | 
				
			||||||
                                    );
 | 
					                                    );
 | 
				
			||||||
                                    return false;
 | 
					                                    return false;
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
@@ -370,7 +393,10 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                                if (!areas.isEmpty()) {
 | 
					                                if (!areas.isEmpty()) {
 | 
				
			||||||
                                    player.sendMessage(
 | 
					                                    player.sendMessage(
 | 
				
			||||||
                                            TranslatableCaption.of("cluster.cluster_intersection"),
 | 
					                                            TranslatableCaption.of("cluster.cluster_intersection"),
 | 
				
			||||||
                                            Template.of("cluster", areas.iterator().next().toString())
 | 
					                                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                                    "cluster",
 | 
				
			||||||
 | 
					                                                    Tag.inserting(areas.iterator().next())
 | 
				
			||||||
 | 
					                                            )
 | 
				
			||||||
                                    );
 | 
					                                    );
 | 
				
			||||||
                                    return false;
 | 
					                                    return false;
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
@@ -396,8 +422,7 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                                        player.sendMessage(TranslatableCaption.of("setup.setup_finished"));
 | 
					                                        player.sendMessage(TranslatableCaption.of("setup.setup_finished"));
 | 
				
			||||||
                                        if (area.getTerrain() != PlotAreaTerrainType.ALL) {
 | 
					                                        if (area.getTerrain() != PlotAreaTerrainType.ALL) {
 | 
				
			||||||
                                            QueueCoordinator queue = blockQueue.getNewQueue(worldUtil.getWeWorld(world));
 | 
					                                            QueueCoordinator queue = blockQueue.getNewQueue(worldUtil.getWeWorld(world));
 | 
				
			||||||
                                            queue.setChunkConsumer(chunk -> AugmentedUtils.generate(
 | 
					                                            queue.setChunkConsumer(chunk -> AugmentedUtils.generateChunk(
 | 
				
			||||||
                                                    null,
 | 
					 | 
				
			||||||
                                                    world,
 | 
					                                                    world,
 | 
				
			||||||
                                                    chunk.getX(),
 | 
					                                                    chunk.getX(),
 | 
				
			||||||
                                                    chunk.getZ(),
 | 
					                                                    chunk.getZ(),
 | 
				
			||||||
@@ -409,7 +434,7 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                                    } else {
 | 
					                                    } else {
 | 
				
			||||||
                                        player.sendMessage(
 | 
					                                        player.sendMessage(
 | 
				
			||||||
                                                TranslatableCaption.of("errors.error_create"),
 | 
					                                                TranslatableCaption.of("errors.error_create"),
 | 
				
			||||||
                                                Template.of("world", area.getWorldName())
 | 
					                                                TagResolver.resolver("world", Tag.inserting(Component.text(area.getWorldName())))
 | 
				
			||||||
                                        );
 | 
					                                        );
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
                                };
 | 
					                                };
 | 
				
			||||||
@@ -443,7 +468,7 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                        if (other != null && Objects.equals(pa.getId(), other.getId())) {
 | 
					                        if (other != null && Objects.equals(pa.getId(), other.getId())) {
 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("setup.setup_world_taken"),
 | 
					                                    TranslatableCaption.of("setup.setup_world_taken"),
 | 
				
			||||||
                                    Template.of("value", pa.toString())
 | 
					                                    TagResolver.resolver("value", Tag.inserting(Component.text(pa.getId())))
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                            return false;
 | 
					                            return false;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
@@ -458,8 +483,13 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                            if (pair.length != 2) {
 | 
					                            if (pair.length != 2) {
 | 
				
			||||||
                                player.sendMessage(
 | 
					                                player.sendMessage(
 | 
				
			||||||
                                        TranslatableCaption.of("commandconfig.command_syntax_extended"),
 | 
					                                        TranslatableCaption.of("commandconfig.command_syntax_extended"),
 | 
				
			||||||
                                        Template.of("value1,", getCommandString()),
 | 
					                                        TagResolver.builder()
 | 
				
			||||||
                                        Template.of("value2", " create [world[:id]] [<modifier>=<value>]...")
 | 
					                                                .tag("value1", Tag.inserting(Component.text(getCommandString())))
 | 
				
			||||||
 | 
					                                                .tag(
 | 
				
			||||||
 | 
					                                                        "value2",
 | 
				
			||||||
 | 
					                                                        Tag.inserting(Component.text("create [world[:id]] [<modifier>=<value>]..."))
 | 
				
			||||||
 | 
					                                                )
 | 
				
			||||||
 | 
					                                                .build()
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                                return false;
 | 
					                                return false;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
@@ -495,8 +525,14 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                                default -> {
 | 
					                                default -> {
 | 
				
			||||||
                                    player.sendMessage(
 | 
					                                    player.sendMessage(
 | 
				
			||||||
                                            TranslatableCaption.of("commandconfig.command_syntax_extended"),
 | 
					                                            TranslatableCaption.of("commandconfig.command_syntax_extended"),
 | 
				
			||||||
                                            Template.of("value1", getCommandString()),
 | 
					                                            TagResolver.builder()
 | 
				
			||||||
                                            Template.of("value2", " create [world[:id]] [<modifier>=<value>]...")
 | 
					                                                    .tag("value1", Tag.inserting(Component.text(getCommandString())))
 | 
				
			||||||
 | 
					                                                    .tag(
 | 
				
			||||||
 | 
					                                                            "value2",
 | 
				
			||||||
 | 
					                                                            Tag.inserting(Component.text(
 | 
				
			||||||
 | 
					                                                                    " create [world[:id]] [<modifier>=<value>]..."))
 | 
				
			||||||
 | 
					                                                    )
 | 
				
			||||||
 | 
					                                                    .build()
 | 
				
			||||||
                                    );
 | 
					                                    );
 | 
				
			||||||
                                    return false;
 | 
					                                    return false;
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
@@ -506,7 +542,7 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                            if (this.worldUtil.isWorld(pa.getWorldName())) {
 | 
					                            if (this.worldUtil.isWorld(pa.getWorldName())) {
 | 
				
			||||||
                                player.sendMessage(
 | 
					                                player.sendMessage(
 | 
				
			||||||
                                        TranslatableCaption.of("setup.setup_world_taken"),
 | 
					                                        TranslatableCaption.of("setup.setup_world_taken"),
 | 
				
			||||||
                                        Template.of("value", pa.getWorldName())
 | 
					                                        TagResolver.resolver("value", Tag.inserting(Component.text(pa.getWorldName())))
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                                return false;
 | 
					                                return false;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
@@ -527,7 +563,7 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                                } else {
 | 
					                                } else {
 | 
				
			||||||
                                    player.sendMessage(
 | 
					                                    player.sendMessage(
 | 
				
			||||||
                                            TranslatableCaption.of("errors.error_create"),
 | 
					                                            TranslatableCaption.of("errors.error_create"),
 | 
				
			||||||
                                            Template.of("world", pa.getWorldName())
 | 
					                                            TagResolver.resolver("world", Tag.inserting(Component.text(pa.getWorldName())))
 | 
				
			||||||
                                    );
 | 
					                                    );
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                                try {
 | 
					                                try {
 | 
				
			||||||
@@ -546,12 +582,18 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                        if (pa.getId() == null) {
 | 
					                        if (pa.getId() == null) {
 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                                    Template.of("value", getUsage())
 | 
					                                    TagResolver.resolver("value", Tag.inserting(Component.text(getUsage())))
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("commandconfig.command_syntax_extended"),
 | 
					                                    TranslatableCaption.of("commandconfig.command_syntax_extended"),
 | 
				
			||||||
                                    Template.of("value1", getCommandString()),
 | 
					                                    TagResolver.builder()
 | 
				
			||||||
                                    Template.of("value2", " create [world[:id]] [<modifier>=<value>]...")
 | 
					                                            .tag("value1", Tag.inserting(Component.text(getCommandString())))
 | 
				
			||||||
 | 
					                                            .tag(
 | 
				
			||||||
 | 
					                                                    "value2",
 | 
				
			||||||
 | 
					                                                    Tag.inserting(Component.text(
 | 
				
			||||||
 | 
					                                                            " create [world[:id]] [<modifier>=<value>]..."))
 | 
				
			||||||
 | 
					                                            )
 | 
				
			||||||
 | 
					                                            .build()
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                            return false;
 | 
					                            return false;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
@@ -568,17 +610,20 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                        metaData.computeIfAbsent(player.getUUID(), missingUUID -> new HashMap<>()).put("area_create_area", pa);
 | 
					                        metaData.computeIfAbsent(player.getUUID(), missingUUID -> new HashMap<>()).put("area_create_area", pa);
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("single.get_position"),
 | 
					                                TranslatableCaption.of("single.get_position"),
 | 
				
			||||||
                                Template.of("command", getCommandString())
 | 
					                                TagResolver.resolver("command", Tag.inserting(Component.text(getCommandString())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "i", "info" -> {
 | 
					            case "i", "info" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_INFO)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_AREA_INFO)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_AREA_INFO))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_AREA_INFO)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -589,15 +634,20 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                    default -> {
 | 
					                    default -> {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("commandconfig.command_syntax_extended"),
 | 
					                                TranslatableCaption.of("commandconfig.command_syntax_extended"),
 | 
				
			||||||
                                Template.of("value1", getCommandString()),
 | 
					                                TagResolver.builder()
 | 
				
			||||||
                                Template.of("value2", " info [area]")
 | 
					                                        .tag("value1", Tag.inserting(Component.text(getCommandString())))
 | 
				
			||||||
 | 
					                                        .tag("value2", Tag.inserting(Component.text(" info [area]")))
 | 
				
			||||||
 | 
					                                        .build()
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (area == null) {
 | 
					                if (area == null) {
 | 
				
			||||||
                    if (args.length == 2) {
 | 
					                    if (args.length == 2) {
 | 
				
			||||||
                        player.sendMessage(TranslatableCaption.of("errors.not_valid_plot_world"), Template.of("value", args[1]));
 | 
					                        player.sendMessage(
 | 
				
			||||||
 | 
					                                TranslatableCaption.of("errors.not_valid_plot_world"),
 | 
				
			||||||
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text(args[1])))
 | 
				
			||||||
 | 
					                        );
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
 | 
					                        player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -621,42 +671,35 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                    percent = claimed == 0 ? 0 : 100d * claimed / Integer.MAX_VALUE;
 | 
					                    percent = claimed == 0 ? 0 : 100d * claimed / Integer.MAX_VALUE;
 | 
				
			||||||
                    region = "N/A";
 | 
					                    region = "N/A";
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                Template headerTemplate = Template.of(
 | 
					                TagResolver resolver = TagResolver.builder()
 | 
				
			||||||
 | 
					                        .tag(
 | 
				
			||||||
                                "header",
 | 
					                                "header",
 | 
				
			||||||
                        TranslatableCaption.of("info.plot_info_header").getComponent(player)
 | 
					                                Tag.inserting(TranslatableCaption.of("info.plot_info_header").toComponent(player))
 | 
				
			||||||
                );
 | 
					                        )
 | 
				
			||||||
                Template nameTemplate = Template.of("name", name);
 | 
					                        .tag("name", Tag.inserting(Component.text(name)))
 | 
				
			||||||
                Template typeTemplate = Template.of("type", area.getType().name());
 | 
					                        .tag("type", Tag.inserting(Component.text(area.getType().name())))
 | 
				
			||||||
                Template terrainTemplate = Template.of("terrain", area.getTerrain().name());
 | 
					                        .tag("terrain", Tag.inserting(Component.text(area.getTerrain().name())))
 | 
				
			||||||
                Template usageTemplate = Template.of("usage", String.format("%.2f", percent));
 | 
					                        .tag("usage", Tag.inserting(Component.text(String.format("%.2f", percent))))
 | 
				
			||||||
                Template claimedTemplate = Template.of("claimed", String.valueOf(claimed));
 | 
					                        .tag("claimed", Tag.inserting(Component.text(claimed)))
 | 
				
			||||||
                Template clustersTemplate = Template.of("clusters", String.valueOf(clusters));
 | 
					                        .tag("clusters", Tag.inserting(Component.text(clusters)))
 | 
				
			||||||
                Template regionTemplate = Template.of("region", region);
 | 
					                        .tag("region", Tag.inserting(Component.text(region)))
 | 
				
			||||||
                Template generatorTemplate = Template.of("generator", generator);
 | 
					                        .tag("generator", Tag.inserting(Component.text(generator)))
 | 
				
			||||||
                Template footerTemplate = Template.of(
 | 
					                        .tag(
 | 
				
			||||||
                                "footer",
 | 
					                                "footer",
 | 
				
			||||||
                        TranslatableCaption.of("info.plot_info_footer").getComponent(player)
 | 
					                                Tag.inserting(TranslatableCaption.of("info.plot_info_footer").toComponent(player))
 | 
				
			||||||
                );
 | 
					                        )
 | 
				
			||||||
                player.sendMessage(
 | 
					                        .build();
 | 
				
			||||||
                        TranslatableCaption.of("info.area_info_format"),
 | 
					                player.sendMessage(TranslatableCaption.of("info.area_info_format"), resolver);
 | 
				
			||||||
                        headerTemplate,
 | 
					 | 
				
			||||||
                        nameTemplate,
 | 
					 | 
				
			||||||
                        typeTemplate,
 | 
					 | 
				
			||||||
                        terrainTemplate,
 | 
					 | 
				
			||||||
                        usageTemplate,
 | 
					 | 
				
			||||||
                        claimedTemplate,
 | 
					 | 
				
			||||||
                        clustersTemplate,
 | 
					 | 
				
			||||||
                        regionTemplate,
 | 
					 | 
				
			||||||
                        generatorTemplate,
 | 
					 | 
				
			||||||
                        footerTemplate
 | 
					 | 
				
			||||||
                );
 | 
					 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "l", "list" -> {
 | 
					            case "l", "list" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_LIST)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_AREA_LIST)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_AREA_LIST))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_AREA_LIST)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -673,8 +716,10 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                    default:
 | 
					                    default:
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("commandconfig.command_syntax_extended"),
 | 
					                                TranslatableCaption.of("commandconfig.command_syntax_extended"),
 | 
				
			||||||
                                Template.of("value1", getCommandString()),
 | 
					                                TagResolver.builder()
 | 
				
			||||||
                                Template.of("value2", " list [#]")
 | 
					                                        .tag("value1", Tag.inserting(Component.text(getCommandString())))
 | 
				
			||||||
 | 
					                                        .tag("value2", Tag.inserting(Component.text(" list [#]")))
 | 
				
			||||||
 | 
					                                        .build()
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -700,46 +745,39 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                            percent = claimed == 0 ? 0 : (double) claimed / Short.MAX_VALUE * Short.MAX_VALUE;
 | 
					                            percent = claimed == 0 ? 0 : (double) claimed / Short.MAX_VALUE * Short.MAX_VALUE;
 | 
				
			||||||
                            region = "N/A";
 | 
					                            region = "N/A";
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        Template claimedTemplate = Template.of("claimed", String.valueOf(claimed));
 | 
					                        Component tooltip = MINI_MESSAGE.deserialize(
 | 
				
			||||||
                        Template usageTemplate = Template.of("usage", String.format("%.2f", percent) + "%");
 | 
					 | 
				
			||||||
                        Template clustersTemplate = Template.of("clusters", String.valueOf(clusters));
 | 
					 | 
				
			||||||
                        Template regionTemplate = Template.of("region", region);
 | 
					 | 
				
			||||||
                        Template generatorTemplate = Template.of("generator", generator);
 | 
					 | 
				
			||||||
                        String tooltip = MINI_MESSAGE.serialize(MINI_MESSAGE
 | 
					 | 
				
			||||||
                                .parse(
 | 
					 | 
				
			||||||
                                TranslatableCaption.of("info.area_list_tooltip").getComponent(player),
 | 
					                                TranslatableCaption.of("info.area_list_tooltip").getComponent(player),
 | 
				
			||||||
                                        claimedTemplate,
 | 
					                                TagResolver.builder()
 | 
				
			||||||
                                        usageTemplate,
 | 
					                                        .tag("claimed", Tag.inserting(Component.text(claimed)))
 | 
				
			||||||
                                        clustersTemplate,
 | 
					                                        .tag("usage", Tag.inserting(Component.text(String.format("%.2f", percent) + "%")))
 | 
				
			||||||
                                        regionTemplate,
 | 
					                                        .tag("clusters", Tag.inserting(Component.text(clusters)))
 | 
				
			||||||
                                        generatorTemplate
 | 
					                                        .tag("region", Tag.inserting(Component.text(region)))
 | 
				
			||||||
                                ));
 | 
					                                        .tag("generator", Tag.inserting(Component.text(generator)))
 | 
				
			||||||
                        Template tooltipTemplate = Template.of("hover_info", tooltip);
 | 
					                                        .build()
 | 
				
			||||||
                        Template visitcmdTemplate = Template.of("command_tp", "/plot area tp " + area);
 | 
					 | 
				
			||||||
                        Template infocmdTemplate = Template.of("command_info", "/plot area info " + area);
 | 
					 | 
				
			||||||
                        Template numberTemplate = Template.of("number", String.valueOf(i));
 | 
					 | 
				
			||||||
                        Template nameTemplate = Template.of("area_name", name);
 | 
					 | 
				
			||||||
                        Template typeTemplate = Template.of("area_type", area.getType().name());
 | 
					 | 
				
			||||||
                        Template terrainTemplate = Template.of("area_terrain", area.getTerrain().name());
 | 
					 | 
				
			||||||
                        caption.set(TranslatableCaption.of("info.area_list_item"));
 | 
					 | 
				
			||||||
                        caption.setTemplates(
 | 
					 | 
				
			||||||
                                tooltipTemplate,
 | 
					 | 
				
			||||||
                                visitcmdTemplate,
 | 
					 | 
				
			||||||
                                numberTemplate,
 | 
					 | 
				
			||||||
                                nameTemplate,
 | 
					 | 
				
			||||||
                                typeTemplate,
 | 
					 | 
				
			||||||
                                terrainTemplate,
 | 
					 | 
				
			||||||
                                infocmdTemplate
 | 
					 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
 | 
					                        TagResolver resolver = TagResolver.builder()
 | 
				
			||||||
 | 
					                                .tag("hover_info", Tag.inserting(tooltip))
 | 
				
			||||||
 | 
					                                .tag("command_tp", Tag.preProcessParsed("/plot area tp " + name))
 | 
				
			||||||
 | 
					                                .tag("command_info", Tag.preProcessParsed("/plot area info " + name))
 | 
				
			||||||
 | 
					                                .tag("number", Tag.inserting(Component.text(i)))
 | 
				
			||||||
 | 
					                                .tag("area_name", Tag.inserting(Component.text(name)))
 | 
				
			||||||
 | 
					                                .tag("area_type", Tag.inserting(Component.text(area.getType().name())))
 | 
				
			||||||
 | 
					                                .tag("area_terrain", Tag.inserting(Component.text(area.getTerrain().name())))
 | 
				
			||||||
 | 
					                                .build();
 | 
				
			||||||
 | 
					                        caption.set(TranslatableCaption.of("info.area_list_item"));
 | 
				
			||||||
 | 
					                        caption.setTagResolvers(resolver);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }, "/plot area list", TranslatableCaption.of("list.area_list_header_paged"));
 | 
					                }, "/plot area list", TranslatableCaption.of("list.area_list_header_paged"));
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "regen", "clear", "reset", "regenerate" -> {
 | 
					            case "regen", "clear", "reset", "regenerate" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_REGEN)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_AREA_REGEN)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_AREA_REGEN))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_AREA_REGEN)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -751,13 +789,12 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                if (area.getType() != PlotAreaType.PARTIAL) {
 | 
					                if (area.getType() != PlotAreaType.PARTIAL) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("single.delete_world_region"),
 | 
					                            TranslatableCaption.of("single.delete_world_region"),
 | 
				
			||||||
                            Template.of("world", area.getWorldName())
 | 
					                            TagResolver.resolver("world", Tag.inserting(Component.text(area.getWorldName())))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                QueueCoordinator queue = blockQueue.getNewQueue(worldUtil.getWeWorld(area.getWorldName()));
 | 
					                QueueCoordinator queue = blockQueue.getNewQueue(worldUtil.getWeWorld(area.getWorldName()));
 | 
				
			||||||
                queue.setChunkConsumer(chunk -> AugmentedUtils.generate(
 | 
					                queue.setChunkConsumer(chunk -> AugmentedUtils.generateChunk(
 | 
				
			||||||
                        null,
 | 
					 | 
				
			||||||
                        area.getWorldName(),
 | 
					                        area.getWorldName(),
 | 
				
			||||||
                        chunk.getX(),
 | 
					                        chunk.getX(),
 | 
				
			||||||
                        chunk.getZ(),
 | 
					                        chunk.getZ(),
 | 
				
			||||||
@@ -769,23 +806,26 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "goto", "v", "teleport", "visit", "tp" -> {
 | 
					            case "goto", "v", "teleport", "visit", "tp" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_TP)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_AREA_TP)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_AREA_TP))
 | 
					                            TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_AREA_TP))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (args.length != 2) {
 | 
					                if (args.length != 2) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Template.of("value", "/plot area tp [area]")
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text("/plot area tp [area]")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                PlotArea area = this.plotAreaManager.getPlotAreaByString(args[1]);
 | 
					                PlotArea area = this.plotAreaManager.getPlotAreaByString(args[1]);
 | 
				
			||||||
                if (area == null) {
 | 
					                if (area == null) {
 | 
				
			||||||
                    player.sendMessage(TranslatableCaption.of("errors.not_valid_plot_world"), Template.of("value", args[1]));
 | 
					                    player.sendMessage(
 | 
				
			||||||
 | 
					                            TranslatableCaption.of("errors.not_valid_plot_world"),
 | 
				
			||||||
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text(args[1])))
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                Location center;
 | 
					                Location center;
 | 
				
			||||||
@@ -825,19 +865,19 @@ public class Area extends SubCommand {
 | 
				
			|||||||
    public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
 | 
					    public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
 | 
				
			||||||
        if (args.length == 1) {
 | 
					        if (args.length == 1) {
 | 
				
			||||||
            final List<String> completions = new LinkedList<>();
 | 
					            final List<String> completions = new LinkedList<>();
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_CREATE)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_AREA_CREATE)) {
 | 
				
			||||||
                completions.add("create");
 | 
					                completions.add("create");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_CREATE)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_AREA_CREATE)) {
 | 
				
			||||||
                completions.add("single");
 | 
					                completions.add("single");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_LIST)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_AREA_LIST)) {
 | 
				
			||||||
                completions.add("list");
 | 
					                completions.add("list");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_INFO)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_AREA_INFO)) {
 | 
				
			||||||
                completions.add("info");
 | 
					                completions.add("info");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_TP)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_AREA_TP)) {
 | 
				
			||||||
                completions.add("tp");
 | 
					                completions.add("tp");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            final List<Command> commands = completions.stream().filter(completion -> completion
 | 
					            final List<Command> commands = completions.stream().filter(completion -> completion
 | 
				
			||||||
@@ -852,7 +892,7 @@ public class Area extends SubCommand {
 | 
				
			|||||||
                            CommandCategory.ADMINISTRATION
 | 
					                            CommandCategory.ADMINISTRATION
 | 
				
			||||||
                    ) {
 | 
					                    ) {
 | 
				
			||||||
                    }).collect(Collectors.toCollection(LinkedList::new));
 | 
					                    }).collect(Collectors.toCollection(LinkedList::new));
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_AREA) && args[0].length() > 0) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_AREA) && args[0].length() > 0) {
 | 
				
			||||||
                commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
					                commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return commands;
 | 
					            return commands;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,16 +35,18 @@ import com.plotsquared.core.player.PlotPlayer;
 | 
				
			|||||||
import com.plotsquared.core.plot.Plot;
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					import com.plotsquared.core.plot.PlotArea;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
 | 
					import com.plotsquared.core.services.plots.AutoQuery;
 | 
				
			||||||
import com.plotsquared.core.services.plots.AutoService;
 | 
					import com.plotsquared.core.services.plots.AutoService;
 | 
				
			||||||
import com.plotsquared.core.util.EconHandler;
 | 
					import com.plotsquared.core.util.EconHandler;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.PlotExpression;
 | 
					import com.plotsquared.core.util.PlotExpression;
 | 
				
			||||||
import com.plotsquared.core.util.task.AutoClaimFinishTask;
 | 
					import com.plotsquared.core.util.task.AutoClaimFinishTask;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal;
 | 
					import com.plotsquared.core.util.task.RunnableVal;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskManager;
 | 
					import com.plotsquared.core.util.task.TaskManager;
 | 
				
			||||||
import io.leangen.geantyref.TypeToken;
 | 
					import io.leangen.geantyref.TypeToken;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
					import org.checkerframework.checker.nullness.qual.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -110,13 +112,13 @@ public class Auto extends SubCommand {
 | 
				
			|||||||
                    if (diff < 0 && grantedPlots < sizeX * sizeZ) {
 | 
					                    if (diff < 0 && grantedPlots < sizeX * sizeZ) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
					                                TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
				
			||||||
                                Template.of("amount", String.valueOf(diff + grantedPlots))
 | 
					                                TagResolver.resolver("amount", Tag.inserting(Component.text(diff + grantedPlots)))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    } else if (diff >= 0 && grantedPlots + diff < sizeX * sizeZ) {
 | 
					                    } else if (diff >= 0 && grantedPlots + diff < sizeX * sizeZ) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
					                                TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
				
			||||||
                                Template.of("amount", String.valueOf(diff + grantedPlots))
 | 
					                                TagResolver.resolver("amount", Tag.inserting(Component.text(diff + grantedPlots)))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
@@ -128,15 +130,16 @@ public class Auto extends SubCommand {
 | 
				
			|||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("economy.removed_granted_plot"),
 | 
					                                TranslatableCaption.of("economy.removed_granted_plot"),
 | 
				
			||||||
                                Template.of("usedGrants", String.valueOf(grantedPlots - left)),
 | 
					                                TagResolver.builder()
 | 
				
			||||||
                                Template.of("remainingGrants", String.valueOf(left))
 | 
					                                        .tag("used_grants", Tag.inserting(Component.text(grantedPlots - left)))
 | 
				
			||||||
 | 
					                                        .tag("remaining_grants", Tag.inserting(Component.text(left)))
 | 
				
			||||||
 | 
					                                        .build()
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
					                            TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
				
			||||||
                            Template.of("amount", String.valueOf(player.getAllowedPlots())
 | 
					                            TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))
 | 
				
			||||||
                            )
 | 
					 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -215,7 +218,7 @@ public class Auto extends SubCommand {
 | 
				
			|||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Template.of("value", getUsage())
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text(getUsage())))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return true;
 | 
					                    return true;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -238,7 +241,7 @@ public class Auto extends SubCommand {
 | 
				
			|||||||
        if (event.getEventResult() == Result.DENY) {
 | 
					        if (event.getEventResult() == Result.DENY) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("events.event_denied"),
 | 
					                    TranslatableCaption.of("events.event_denied"),
 | 
				
			||||||
                    Template.of("value", "Auto claim")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("Auto claim")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -246,17 +249,17 @@ public class Auto extends SubCommand {
 | 
				
			|||||||
        sizeX = event.getSizeX();
 | 
					        sizeX = event.getSizeX();
 | 
				
			||||||
        sizeZ = event.getSizeZ();
 | 
					        sizeZ = event.getSizeZ();
 | 
				
			||||||
        schematic = event.getSchematic();
 | 
					        schematic = event.getSchematic();
 | 
				
			||||||
        if (!force && mega && !Permissions.hasPermission(player, Permission.PERMISSION_AUTO_MEGA)) {
 | 
					        if (!force && mega && !player.hasPermission(Permission.PERMISSION_AUTO_MEGA)) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.no_permission"),
 | 
					                    TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                    Template.of("node", String.valueOf(Permission.PERMISSION_AUTO_MEGA))
 | 
					                    TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_AUTO_MEGA))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!force && sizeX * sizeZ > Settings.Claim.MAX_AUTO_AREA) {
 | 
					        if (!force && sizeX * sizeZ > Settings.Claim.MAX_AUTO_AREA) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.cant_claim_more_plots_num"),
 | 
					                    TranslatableCaption.of("permission.cant_claim_more_plots_num"),
 | 
				
			||||||
                    Template.of("amount", String.valueOf(Settings.Claim.MAX_AUTO_AREA))
 | 
					                    TagResolver.resolver("amount", Tag.inserting(Component.text(Settings.Claim.MAX_AUTO_AREA)))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -274,29 +277,32 @@ public class Auto extends SubCommand {
 | 
				
			|||||||
            if (!plotarea.hasSchematic(schematic)) {
 | 
					            if (!plotarea.hasSchematic(schematic)) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("schematics.schematic_invalid_named"),
 | 
					                        TranslatableCaption.of("schematics.schematic_invalid_named"),
 | 
				
			||||||
                        Template.of("schemname", schematic),
 | 
					                        TagResolver.builder()
 | 
				
			||||||
                        Template.of("reason", "non-existent")
 | 
					                                .tag("schemname", Tag.inserting(Component.text(schematic)))
 | 
				
			||||||
 | 
					                                .tag("reason", Tag.inserting(Component.text("non-existent")))
 | 
				
			||||||
 | 
					                                .build()
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (!force && !Permissions.hasPermission(
 | 
					            if (!force && !player.hasPermission(
 | 
				
			||||||
                    player,
 | 
					 | 
				
			||||||
                    Permission.PERMISSION_CLAIM_SCHEMATIC.format(schematic)
 | 
					                    Permission.PERMISSION_CLAIM_SCHEMATIC.format(schematic)
 | 
				
			||||||
            ) && !Permissions
 | 
					            ) && !player.hasPermission("plots.admin.command.schematic")) {
 | 
				
			||||||
                    .hasPermission(player, "plots.admin.command.schematic")) {
 | 
					 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission"),
 | 
					                        TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                        Template.of("node", "plots.claim.%s0")
 | 
					                        TagResolver.resolver("node", Tag.inserting(Component.text("plots.claim.%s0")))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (this.econHandler != null && plotarea.useEconomy()) {
 | 
					        if (this.econHandler != null && plotarea.useEconomy() && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
 | 
				
			||||||
            PlotExpression costExp = plotarea.getPrices().get("claim");
 | 
					            PlotExpression costExp = plotarea.getPrices().get("claim");
 | 
				
			||||||
 | 
					            PlotExpression mergeCostExp = plotarea.getPrices().get("merge");
 | 
				
			||||||
 | 
					            int size = sizeX * sizeZ;
 | 
				
			||||||
 | 
					            double mergeCost = size <= 1 || mergeCostExp == null ? 0d : mergeCostExp.evaluate(size);
 | 
				
			||||||
            double cost = costExp.evaluate(Settings.Limit.GLOBAL ?
 | 
					            double cost = costExp.evaluate(Settings.Limit.GLOBAL ?
 | 
				
			||||||
                    player.getPlotCount() :
 | 
					                    player.getPlotCount() :
 | 
				
			||||||
                    player.getPlotCount(plotarea.getWorldName()));
 | 
					                    player.getPlotCount(plotarea.getWorldName()));
 | 
				
			||||||
            cost = (sizeX * sizeZ) * cost;
 | 
					            cost = size * cost + mergeCost;
 | 
				
			||||||
            if (cost > 0d) {
 | 
					            if (cost > 0d) {
 | 
				
			||||||
                if (!this.econHandler.isSupported()) {
 | 
					                if (!this.econHandler.isSupported()) {
 | 
				
			||||||
                    player.sendMessage(TranslatableCaption.of("economy.vault_or_consumer_null"));
 | 
					                    player.sendMessage(TranslatableCaption.of("economy.vault_or_consumer_null"));
 | 
				
			||||||
@@ -305,21 +311,26 @@ public class Auto extends SubCommand {
 | 
				
			|||||||
                if (!force && this.econHandler.getMoney(player) < cost) {
 | 
					                if (!force && this.econHandler.getMoney(player) < cost) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("economy.cannot_afford_plot"),
 | 
					                            TranslatableCaption.of("economy.cannot_afford_plot"),
 | 
				
			||||||
                            Template.of("money", this.econHandler.format(cost)),
 | 
					                            TagResolver.builder()
 | 
				
			||||||
                            Template.of("balance", this.econHandler.format(this.econHandler.getMoney(player)))
 | 
					                                    .tag("money", Tag.inserting(Component.text(this.econHandler.format(cost))))
 | 
				
			||||||
 | 
					                                    .tag(
 | 
				
			||||||
 | 
					                                            "balance",
 | 
				
			||||||
 | 
					                                            Tag.inserting(Component.text(this.econHandler.format(this.econHandler.getMoney(player))))
 | 
				
			||||||
 | 
					                                    )
 | 
				
			||||||
 | 
					                                    .build()
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                this.econHandler.withdrawMoney(player, cost);
 | 
					                this.econHandler.withdrawMoney(player, cost);
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("economy.removed_balance"),
 | 
					                        TranslatableCaption.of("economy.removed_balance"),
 | 
				
			||||||
                        Template.of("money", this.econHandler.format(cost))
 | 
					                        TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(cost))))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        List<Plot> plots = this.servicePipeline
 | 
					        List<Plot> plots = this.servicePipeline
 | 
				
			||||||
                .pump(new AutoService.AutoQuery(player, null, sizeX, sizeZ, plotarea))
 | 
					                .pump(new AutoQuery(player, null, sizeX, sizeZ, plotarea))
 | 
				
			||||||
                .through(AutoService.class)
 | 
					                .through(AutoService.class)
 | 
				
			||||||
                .getResult();
 | 
					                .getResult();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -347,7 +358,7 @@ public class Auto extends SubCommand {
 | 
				
			|||||||
            if (!force && mergeEvent.getEventResult() == Result.DENY) {
 | 
					            if (!force && mergeEvent.getEventResult() == Result.DENY) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("events.event_denied"),
 | 
					                        TranslatableCaption.of("events.event_denied"),
 | 
				
			||||||
                        Template.of("value", "Auto merge")
 | 
					                        TagResolver.resolver("value", Tag.inserting(Component.text("Auto merge")))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,10 +27,11 @@ import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
				
			|||||||
import com.plotsquared.core.permissions.Permission;
 | 
					import com.plotsquared.core.permissions.Permission;
 | 
				
			||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
import com.plotsquared.core.plot.Plot;
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal2;
 | 
					import com.plotsquared.core.util.task.RunnableVal2;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal3;
 | 
					import com.plotsquared.core.util.task.RunnableVal3;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.nio.file.Files;
 | 
					import java.nio.file.Files;
 | 
				
			||||||
@@ -67,7 +68,7 @@ public final class Backup extends Command {
 | 
				
			|||||||
    private static boolean sendMessage(PlotPlayer<?> player) {
 | 
					    private static boolean sendMessage(PlotPlayer<?> player) {
 | 
				
			||||||
        player.sendMessage(
 | 
					        player.sendMessage(
 | 
				
			||||||
                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                Template.of("value", "/plot backup <save | list | load>")
 | 
					                TagResolver.resolver("value", Tag.inserting(Component.text("/plot backup <save | list | load>")))
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -135,34 +136,44 @@ public final class Backup extends Command {
 | 
				
			|||||||
        } else if (!plot.hasOwner()) {
 | 
					        } else if (!plot.hasOwner()) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("backups.backup_impossible"),
 | 
					                    TranslatableCaption.of("backups.backup_impossible"),
 | 
				
			||||||
                    Template.of("plot", TranslatableCaption.of("generic.generic_unowned").getComponent(player))
 | 
					                    TagResolver.resolver("plot", Tag.inserting(
 | 
				
			||||||
 | 
					                            TranslatableCaption.of("generic.generic_unowned").toComponent(player)
 | 
				
			||||||
 | 
					                    ))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        } else if (plot.getVolume() > Integer.MAX_VALUE) {
 | 
					        } else if (plot.getVolume() > Integer.MAX_VALUE) {
 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large"));
 | 
					            player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large"));
 | 
				
			||||||
        } else if (plot.isMerged()) {
 | 
					        } else if (plot.isMerged()) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("backups.backup_impossible"),
 | 
					                    TranslatableCaption.of("backups.backup_impossible"),
 | 
				
			||||||
                    Template.of("plot", TranslatableCaption.of("generic.generic_merged").getComponent(player))
 | 
					                    TagResolver.resolver("plot", Tag.inserting(
 | 
				
			||||||
 | 
					                            TranslatableCaption.of("generic.generic_merged").toComponent(player)
 | 
				
			||||||
 | 
					                    ))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        } else if (!plot.isOwner(player.getUUID()) && !Permissions
 | 
					        } else if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_BACKUP_OTHER)) {
 | 
				
			||||||
                .hasPermission(player, Permission.PERMISSION_ADMIN_BACKUP_OTHER)) {
 | 
					 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.no_permission"),
 | 
					                    TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                    Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BACKUP_OTHER))
 | 
					                    TagResolver.resolver(
 | 
				
			||||||
 | 
					                            "node",
 | 
				
			||||||
 | 
					                            Tag.inserting(Permission.PERMISSION_ADMIN_BACKUP_OTHER)
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            final BackupProfile backupProfile = Objects.requireNonNull(this.backupManager.getProfile(plot));
 | 
					            final BackupProfile backupProfile = Objects.requireNonNull(this.backupManager.getProfile(plot));
 | 
				
			||||||
            if (backupProfile instanceof NullBackupProfile) {
 | 
					            if (backupProfile instanceof NullBackupProfile) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("backups.backup_impossible"),
 | 
					                        TranslatableCaption.of("backups.backup_impossible"),
 | 
				
			||||||
                        Template.of("plot", TranslatableCaption.of("generic.generic_other").getComponent(player))
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                "plot", Tag.inserting(TranslatableCaption
 | 
				
			||||||
 | 
					                                        .of("generic.generic_other")
 | 
				
			||||||
 | 
					                                        .toComponent(player))
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                backupProfile.createBackup().whenComplete((backup, throwable) -> {
 | 
					                backupProfile.createBackup().whenComplete((backup, throwable) -> {
 | 
				
			||||||
                    if (throwable != null) {
 | 
					                    if (throwable != null) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("backups.backup_save_failed"),
 | 
					                                TranslatableCaption.of("backups.backup_save_failed"),
 | 
				
			||||||
                                Template.of("reason", throwable.getMessage())
 | 
					                                TagResolver.resolver("reason", Tag.inserting(Component.text(throwable.getMessage())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        throwable.printStackTrace();
 | 
					                        throwable.printStackTrace();
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
@@ -189,50 +200,64 @@ public final class Backup extends Command {
 | 
				
			|||||||
        } else if (!plot.hasOwner()) {
 | 
					        } else if (!plot.hasOwner()) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("backups.backup_impossible"),
 | 
					                    TranslatableCaption.of("backups.backup_impossible"),
 | 
				
			||||||
                    Template.of("plot", TranslatableCaption.of("generic.generic_unowned").getComponent(player))
 | 
					                    TagResolver.resolver("plot", Tag.inserting(
 | 
				
			||||||
 | 
					                            TranslatableCaption.of("generic.generic_unowned").toComponent(player)
 | 
				
			||||||
 | 
					                    ))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        } else if (plot.isMerged()) {
 | 
					        } else if (plot.isMerged()) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("backups.backup_impossible"),
 | 
					                    TranslatableCaption.of("backups.backup_impossible"),
 | 
				
			||||||
                    Template.of("plot", TranslatableCaption.of("generic.generic_merged").getComponent(player))
 | 
					                    TagResolver.resolver("plot", Tag.inserting(
 | 
				
			||||||
 | 
					                            TranslatableCaption.of("generic.generic_merged").toComponent(player)
 | 
				
			||||||
 | 
					                    ))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        } else if (plot.getVolume() > Integer.MAX_VALUE) {
 | 
					        } else if (plot.getVolume() > Integer.MAX_VALUE) {
 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large"));
 | 
					            player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large"));
 | 
				
			||||||
        } else if (!plot.isOwner(player.getUUID()) && !Permissions
 | 
					        } else if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_BACKUP_OTHER)) {
 | 
				
			||||||
                .hasPermission(player, Permission.PERMISSION_ADMIN_BACKUP_OTHER)) {
 | 
					 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.no_permission"),
 | 
					                    TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                    Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BACKUP_OTHER))
 | 
					                    TagResolver.resolver(
 | 
				
			||||||
 | 
					                            "node",
 | 
				
			||||||
 | 
					                            Tag.inserting(Permission.PERMISSION_ADMIN_BACKUP_OTHER)
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            final BackupProfile backupProfile = Objects.requireNonNull(this.backupManager.getProfile(plot));
 | 
					            final BackupProfile backupProfile = Objects.requireNonNull(this.backupManager.getProfile(plot));
 | 
				
			||||||
            if (backupProfile instanceof NullBackupProfile) {
 | 
					            if (backupProfile instanceof NullBackupProfile) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("backups.backup_impossible"),
 | 
					                        TranslatableCaption.of("backups.backup_impossible"),
 | 
				
			||||||
                        Template.of("plot", TranslatableCaption.of("generic.generic_other").getComponent(player))
 | 
					                        TagResolver.resolver("plot", Tag.inserting(
 | 
				
			||||||
 | 
					                                TranslatableCaption.of("generic.generic_other").toComponent(player)
 | 
				
			||||||
 | 
					                        ))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                backupProfile.listBackups().whenComplete((backups, throwable) -> {
 | 
					                backupProfile.listBackups().whenComplete((backups, throwable) -> {
 | 
				
			||||||
                    if (throwable != null) {
 | 
					                    if (throwable != null) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("backups.backup_list_failed"),
 | 
					                                TranslatableCaption.of("backups.backup_list_failed"),
 | 
				
			||||||
                                Template.of("reason", throwable.getMessage())
 | 
					                                TagResolver.resolver("reason", Tag.inserting(Component.text(throwable.getMessage())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        throwable.printStackTrace();
 | 
					                        throwable.printStackTrace();
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("backups.backup_list_header"),
 | 
					                                TranslatableCaption.of("backups.backup_list_header"),
 | 
				
			||||||
                                Template.of("plot", plot.getId().toCommaSeparatedString())
 | 
					                                TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toCommaSeparatedString())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        try {
 | 
					                        try {
 | 
				
			||||||
                            for (int i = 0; i < backups.size(); i++) {
 | 
					                            for (int i = 0; i < backups.size(); i++) {
 | 
				
			||||||
                                player.sendMessage(
 | 
					                                player.sendMessage(
 | 
				
			||||||
                                        TranslatableCaption.of("backups.backup_list_entry"),
 | 
					                                        TranslatableCaption.of("backups.backup_list_entry"),
 | 
				
			||||||
                                        Template.of("number", Integer.toString(i + 1)),
 | 
					                                        TagResolver.builder()
 | 
				
			||||||
                                        Template.of("value", DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.ofInstant(
 | 
					                                                .tag("number", Tag.inserting(Component.text(i + 1)))
 | 
				
			||||||
 | 
					                                                .tag(
 | 
				
			||||||
 | 
					                                                        "value",
 | 
				
			||||||
 | 
					                                                        Tag.inserting(Component.text(DateTimeFormatter.RFC_1123_DATE_TIME.format(
 | 
				
			||||||
 | 
					                                                                ZonedDateTime.ofInstant(
 | 
				
			||||||
                                                                        Instant.ofEpochMilli(backups.get(i).getCreationTime()),
 | 
					                                                                        Instant.ofEpochMilli(backups.get(i).getCreationTime()),
 | 
				
			||||||
                                                                        ZoneId.systemDefault()
 | 
					                                                                        ZoneId.systemDefault()
 | 
				
			||||||
                                        )))
 | 
					                                                                ))))
 | 
				
			||||||
 | 
					                                                )
 | 
				
			||||||
 | 
					                                                .build()
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        } catch (final Exception e) {
 | 
					                        } catch (final Exception e) {
 | 
				
			||||||
@@ -260,25 +285,31 @@ public final class Backup extends Command {
 | 
				
			|||||||
        } else if (!plot.hasOwner()) {
 | 
					        } else if (!plot.hasOwner()) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("backups.backup_impossible"),
 | 
					                    TranslatableCaption.of("backups.backup_impossible"),
 | 
				
			||||||
                    Template.of("plot", TranslatableCaption.of("generic.generic_unowned").getComponent(player))
 | 
					                    TagResolver.resolver("plot", Tag.inserting(
 | 
				
			||||||
 | 
					                            TranslatableCaption.of("generic.generic_unowned").toComponent(player)
 | 
				
			||||||
 | 
					                    ))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        } else if (plot.isMerged()) {
 | 
					        } else if (plot.isMerged()) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("backups.backup_impossible"),
 | 
					                    TranslatableCaption.of("backups.backup_impossible"),
 | 
				
			||||||
                    Template.of("plot", TranslatableCaption.of("generic.generic_merged").getComponent(player))
 | 
					                    TagResolver.resolver("plot", Tag.inserting(
 | 
				
			||||||
 | 
					                            TranslatableCaption.of("generic.generic_merged").toComponent(player)
 | 
				
			||||||
 | 
					                    ))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        } else if (plot.getVolume() > Integer.MAX_VALUE) {
 | 
					        } else if (plot.getVolume() > Integer.MAX_VALUE) {
 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large"));
 | 
					            player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large"));
 | 
				
			||||||
        } else if (!plot.isOwner(player.getUUID()) && !Permissions
 | 
					        } else if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_BACKUP_OTHER)) {
 | 
				
			||||||
                .hasPermission(player, Permission.PERMISSION_ADMIN_BACKUP_OTHER)) {
 | 
					 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.no_permission"),
 | 
					                    TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                    Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BACKUP_OTHER))
 | 
					                    TagResolver.resolver(
 | 
				
			||||||
 | 
					                            "node",
 | 
				
			||||||
 | 
					                            Tag.inserting(Permission.PERMISSION_ADMIN_BACKUP_OTHER)
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        } else if (args.length == 0) {
 | 
					        } else if (args.length == 0) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                    Template.of("value", "Usage: /plot backup save/list/load")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("Usage: /plot backup save/list/load")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            final int number;
 | 
					            final int number;
 | 
				
			||||||
@@ -287,7 +318,7 @@ public final class Backup extends Command {
 | 
				
			|||||||
            } catch (final Exception e) {
 | 
					            } catch (final Exception e) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("invalid.not_a_number"),
 | 
					                        TranslatableCaption.of("invalid.not_a_number"),
 | 
				
			||||||
                        Template.of("value", args[0])
 | 
					                        TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -295,23 +326,27 @@ public final class Backup extends Command {
 | 
				
			|||||||
            if (backupProfile instanceof NullBackupProfile) {
 | 
					            if (backupProfile instanceof NullBackupProfile) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("backups.backup_impossible"),
 | 
					                        TranslatableCaption.of("backups.backup_impossible"),
 | 
				
			||||||
                        Template.of("plot", TranslatableCaption.of("generic.generic_other").getComponent(player))
 | 
					                        TagResolver.resolver("plot", Tag.inserting(
 | 
				
			||||||
 | 
					                                TranslatableCaption.of("generic.generic_other").toComponent(player)
 | 
				
			||||||
 | 
					                        ))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                backupProfile.listBackups().whenComplete((backups, throwable) -> {
 | 
					                backupProfile.listBackups().whenComplete((backups, throwable) -> {
 | 
				
			||||||
                    if (throwable != null) {
 | 
					                    if (throwable != null) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("backups.backup_load_failure"),
 | 
					                                TranslatableCaption.of("backups.backup_load_failure"),
 | 
				
			||||||
                                Template.of("reason", throwable.getMessage())
 | 
					                                TagResolver.resolver("reason", Tag.inserting(Component.text(throwable.getMessage())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        throwable.printStackTrace();
 | 
					                        throwable.printStackTrace();
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        if (number < 1 || number > backups.size()) {
 | 
					                        if (number < 1 || number > backups.size()) {
 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("backups.backup_impossible"),
 | 
					                                    TranslatableCaption.of("backups.backup_impossible"),
 | 
				
			||||||
                                    Template.of(
 | 
					                                    TagResolver.resolver(
 | 
				
			||||||
                                            "plot",
 | 
					                                            "plot",
 | 
				
			||||||
                                            TranslatableCaption.of("generic.generic_invalid_choice").getComponent(player)
 | 
					                                            Tag.inserting(TranslatableCaption
 | 
				
			||||||
 | 
					                                                    .of("generic.generic_invalid_choice")
 | 
				
			||||||
 | 
					                                                    .toComponent(player))
 | 
				
			||||||
                                    )
 | 
					                                    )
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                        } else {
 | 
					                        } else {
 | 
				
			||||||
@@ -321,9 +356,11 @@ public final class Backup extends Command {
 | 
				
			|||||||
                                    .exists(backup.getFile())) {
 | 
					                                    .exists(backup.getFile())) {
 | 
				
			||||||
                                player.sendMessage(
 | 
					                                player.sendMessage(
 | 
				
			||||||
                                        TranslatableCaption.of("backups.backup_impossible"),
 | 
					                                        TranslatableCaption.of("backups.backup_impossible"),
 | 
				
			||||||
                                        Template.of(
 | 
					                                        TagResolver.resolver(
 | 
				
			||||||
                                                "plot",
 | 
					                                                "plot",
 | 
				
			||||||
                                                TranslatableCaption.of("generic.generic_invalid_choice").getComponent(player)
 | 
					                                                Tag.inserting(TranslatableCaption
 | 
				
			||||||
 | 
					                                                        .of("generic.generic_invalid_choice")
 | 
				
			||||||
 | 
					                                                        .toComponent(player))
 | 
				
			||||||
                                        )
 | 
					                                        )
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                            } else {
 | 
					                            } else {
 | 
				
			||||||
@@ -333,7 +370,10 @@ public final class Backup extends Command {
 | 
				
			|||||||
                                                    if (error != null) {
 | 
					                                                    if (error != null) {
 | 
				
			||||||
                                                        player.sendMessage(
 | 
					                                                        player.sendMessage(
 | 
				
			||||||
                                                                TranslatableCaption.of("backups.backup_load_failure"),
 | 
					                                                                TranslatableCaption.of("backups.backup_load_failure"),
 | 
				
			||||||
                                                                Template.of("reason", error.getMessage())
 | 
					                                                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                                                        "reason",
 | 
				
			||||||
 | 
					                                                                        Tag.inserting(Component.text(error.getMessage()))
 | 
				
			||||||
 | 
					                                                                )
 | 
				
			||||||
                                                        );
 | 
					                                                        );
 | 
				
			||||||
                                                    } else {
 | 
					                                                    } else {
 | 
				
			||||||
                                                        player.sendMessage(TranslatableCaption.of("backups.backup_load_success"));
 | 
					                                                        player.sendMessage(TranslatableCaption.of("backups.backup_load_success"));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,7 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
package com.plotsquared.core.command;
 | 
					package com.plotsquared.core.command;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.plotsquared.core.configuration.caption.StaticCaption;
 | 
				
			||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
					import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
				
			||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
import com.plotsquared.core.plot.Plot;
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
@@ -25,7 +26,9 @@ import com.plotsquared.core.util.StringMan;
 | 
				
			|||||||
import com.sk89q.worldedit.command.util.SuggestionHelper;
 | 
					import com.sk89q.worldedit.command.util.SuggestionHelper;
 | 
				
			||||||
import com.sk89q.worldedit.world.biome.BiomeType;
 | 
					import com.sk89q.worldedit.world.biome.BiomeType;
 | 
				
			||||||
import com.sk89q.worldedit.world.biome.BiomeTypes;
 | 
					import com.sk89q.worldedit.world.biome.BiomeTypes;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
import java.util.Locale;
 | 
					import java.util.Locale;
 | 
				
			||||||
@@ -47,16 +50,13 @@ public class Biome extends SetCommand {
 | 
				
			|||||||
        } catch (final Exception ignore) {
 | 
					        } catch (final Exception ignore) {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (biome == null) {
 | 
					        if (biome == null) {
 | 
				
			||||||
            String biomes = StringMan.join(
 | 
					            String separator = TranslatableCaption.of("blocklist.block_list_separator").getComponent(player);
 | 
				
			||||||
                    BiomeType.REGISTRY.values(),
 | 
					 | 
				
			||||||
                    MINI_MESSAGE.serialize(MINI_MESSAGE.parse(TranslatableCaption
 | 
					 | 
				
			||||||
                            .of("blocklist.block_list_separator")
 | 
					 | 
				
			||||||
                            .getComponent(player)))
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("biome.need_biome"));
 | 
					            player.sendMessage(TranslatableCaption.of("biome.need_biome"));
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("commandconfig.subcommand_set_options_header"),
 | 
					                    StaticCaption.of(
 | 
				
			||||||
                    Template.of("values", biomes)
 | 
					                            TranslatableCaption.of("commandconfig.subcommand_set_options_header_only").getComponent(player)
 | 
				
			||||||
 | 
					                                    + StringMan.join(BiomeType.REGISTRY.values(), separator)
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -73,7 +73,7 @@ public class Biome extends SetCommand {
 | 
				
			|||||||
            plot.removeRunning();
 | 
					            plot.removeRunning();
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("biome.biome_set_to"),
 | 
					                    TranslatableCaption.of("biome.biome_set_to"),
 | 
				
			||||||
                    Template.of("value", value.toLowerCase())
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text(value.toLowerCase())))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,7 +32,9 @@ import com.plotsquared.core.util.EconHandler;
 | 
				
			|||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal2;
 | 
					import com.plotsquared.core.util.task.RunnableVal2;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal3;
 | 
					import com.plotsquared.core.util.task.RunnableVal3;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
@@ -84,7 +86,7 @@ public class Buy extends Command {
 | 
				
			|||||||
        checkTrue(
 | 
					        checkTrue(
 | 
				
			||||||
                player.getPlotCount() + plots.size() <= player.getAllowedPlots(),
 | 
					                player.getPlotCount() + plots.size() <= player.getAllowedPlots(),
 | 
				
			||||||
                TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
					                TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
				
			||||||
                Template.of("amount", String.valueOf(player.getAllowedPlots()))
 | 
					                TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        double price = plot.getFlag(PriceFlag.class);
 | 
					        double price = plot.getFlag(PriceFlag.class);
 | 
				
			||||||
        if (price <= 0) {
 | 
					        if (price <= 0) {
 | 
				
			||||||
@@ -97,8 +99,10 @@ public class Buy extends Command {
 | 
				
			|||||||
        checkTrue(
 | 
					        checkTrue(
 | 
				
			||||||
                this.econHandler.getMoney(player) >= price,
 | 
					                this.econHandler.getMoney(player) >= price,
 | 
				
			||||||
                TranslatableCaption.of("economy.cannot_afford_plot"),
 | 
					                TranslatableCaption.of("economy.cannot_afford_plot"),
 | 
				
			||||||
                Template.of("money", this.econHandler.format(price)),
 | 
					                TagResolver.builder()
 | 
				
			||||||
                Template.of("balance", this.econHandler.format(this.econHandler.getMoney(player)))
 | 
					                        .tag("money", Tag.inserting(Component.text(this.econHandler.format(price))))
 | 
				
			||||||
 | 
					                        .tag("balance", Tag.inserting(Component.text(this.econHandler.format(this.econHandler.getMoney(player)))))
 | 
				
			||||||
 | 
					                        .build()
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        this.econHandler.withdrawMoney(player, price);
 | 
					        this.econHandler.withdrawMoney(player, price);
 | 
				
			||||||
        // Failure
 | 
					        // Failure
 | 
				
			||||||
@@ -106,7 +110,7 @@ public class Buy extends Command {
 | 
				
			|||||||
        confirm.run(this, () -> {
 | 
					        confirm.run(this, () -> {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("economy.removed_balance"),
 | 
					                    TranslatableCaption.of("economy.removed_balance"),
 | 
				
			||||||
                    Template.of("money", this.econHandler.format(price))
 | 
					                    TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price))))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            this.econHandler.depositMoney(PlotSquared.platform().playerManager().getOfflinePlayer(plot.getOwnerAbs()), price);
 | 
					            this.econHandler.depositMoney(PlotSquared.platform().playerManager().getOfflinePlayer(plot.getOwnerAbs()), price);
 | 
				
			||||||
@@ -115,9 +119,11 @@ public class Buy extends Command {
 | 
				
			|||||||
            if (owner != null) {
 | 
					            if (owner != null) {
 | 
				
			||||||
                owner.sendMessage(
 | 
					                owner.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("economy.plot_sold"),
 | 
					                        TranslatableCaption.of("economy.plot_sold"),
 | 
				
			||||||
                        Template.of("plot", plot.getId().toString()),
 | 
					                        TagResolver.builder()
 | 
				
			||||||
                        Template.of("player", player.getName()),
 | 
					                                .tag("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
				
			||||||
                        Template.of("price", this.econHandler.format(price))
 | 
					                                .tag("player", Tag.inserting(Component.text(player.getName())))
 | 
				
			||||||
 | 
					                                .tag("price", Tag.inserting(Component.text(this.econHandler.format(price))))
 | 
				
			||||||
 | 
					                                .build()
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(PriceFlag.class);
 | 
					            PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(PriceFlag.class);
 | 
				
			||||||
@@ -129,7 +135,7 @@ public class Buy extends Command {
 | 
				
			|||||||
            plot.getPlotModificationManager().setSign(player.getName());
 | 
					            plot.getPlotModificationManager().setSign(player.getName());
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("working.claimed"),
 | 
					                    TranslatableCaption.of("working.claimed"),
 | 
				
			||||||
                    Template.of("plot", plot.getId().toString())
 | 
					                    TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            whenDone.run(Buy.this, CommandResult.SUCCESS);
 | 
					            whenDone.run(Buy.this, CommandResult.SUCCESS);
 | 
				
			||||||
        }, () -> {
 | 
					        }, () -> {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,8 +29,10 @@ import com.plotsquared.core.plot.flag.implementations.HostileCapFlag;
 | 
				
			|||||||
import com.plotsquared.core.plot.flag.implementations.MiscCapFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.MiscCapFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.MobCapFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.MobCapFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.VehicleCapFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.VehicleCapFlag;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.ComponentLike;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import static com.plotsquared.core.util.entity.EntityCategories.CAP_ANIMAL;
 | 
					import static com.plotsquared.core.util.entity.EntityCategories.CAP_ANIMAL;
 | 
				
			||||||
import static com.plotsquared.core.util.entity.EntityCategories.CAP_ENTITY;
 | 
					import static com.plotsquared.core.util.entity.EntityCategories.CAP_ENTITY;
 | 
				
			||||||
@@ -51,11 +53,10 @@ public class Caps extends SubCommand {
 | 
				
			|||||||
            player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
 | 
					            player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!plot.isAdded(player.getUUID()) && !Permissions
 | 
					        if (!plot.isAdded(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_CAPS_OTHER)) {
 | 
				
			||||||
                .hasPermission(player, Permission.PERMISSION_ADMIN_CAPS_OTHER)) {
 | 
					 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.no_permission"),
 | 
					                    TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                    Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_CAPS_OTHER))
 | 
					                    TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_ADMIN_CAPS_OTHER))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -82,15 +83,17 @@ public class Caps extends SubCommand {
 | 
				
			|||||||
        final int current = countedEntities[type];
 | 
					        final int current = countedEntities[type];
 | 
				
			||||||
        final int max = plot.getFlag(capFlag);
 | 
					        final int max = plot.getFlag(capFlag);
 | 
				
			||||||
        final String percentage = String.format("%.1f", 100 * ((float) current / max));
 | 
					        final String percentage = String.format("%.1f", 100 * ((float) current / max));
 | 
				
			||||||
        String maxBeautified = max >= Integer.MAX_VALUE
 | 
					        ComponentLike maxBeautified = max >= Integer.MAX_VALUE
 | 
				
			||||||
                ? TranslatableCaption.of("info.infinite").getComponent(player)
 | 
					                ? TranslatableCaption.of("info.infinite").toComponent(player)
 | 
				
			||||||
                : String.valueOf(max);
 | 
					                : Component.text(max);
 | 
				
			||||||
        player.sendMessage(
 | 
					        player.sendMessage(
 | 
				
			||||||
                TranslatableCaption.of("info.plot_caps_format"),
 | 
					                TranslatableCaption.of("info.plot_caps_format"),
 | 
				
			||||||
                Template.of("cap", name),
 | 
					                TagResolver.builder()
 | 
				
			||||||
                Template.of("current", String.valueOf(current)),
 | 
					                        .tag("cap", Tag.inserting(Component.text(name)))
 | 
				
			||||||
                Template.of("limit", maxBeautified),
 | 
					                        .tag("current", Tag.inserting(Component.text(current)))
 | 
				
			||||||
                Template.of("percentage", percentage)
 | 
					                        .tag("limit", Tag.inserting(maxBeautified))
 | 
				
			||||||
 | 
					                        .tag("percentage", Tag.inserting(Component.text(percentage)))
 | 
				
			||||||
 | 
					                        .build()
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,54 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 * PlotSquared, a land and world management plugin for Minecraft.
 | 
					 | 
				
			||||||
 * Copyright (C) IntellectualSites <https://intellectualsites.com>
 | 
					 | 
				
			||||||
 * Copyright (C) IntellectualSites team and contributors
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 | 
				
			||||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
					 | 
				
			||||||
 * (at your option) any later version.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
 * GNU General Public License for more details.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * You should have received a copy of the GNU General Public License
 | 
					 | 
				
			||||||
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
package com.plotsquared.core.command;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
					 | 
				
			||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					 | 
				
			||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @deprecated In favor of "/plot toggle chat" and
 | 
					 | 
				
			||||||
 *         scheduled for removal within the next major release.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
@Deprecated(forRemoval = true, since = "6.0.0")
 | 
					 | 
				
			||||||
@CommandDeclaration(command = "chat",
 | 
					 | 
				
			||||||
        usage = "/plot chat",
 | 
					 | 
				
			||||||
        permission = "plots.chat",
 | 
					 | 
				
			||||||
        category = CommandCategory.CHAT,
 | 
					 | 
				
			||||||
        requiredType = RequiredType.PLAYER)
 | 
					 | 
				
			||||||
public class Chat extends SubCommand {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public boolean onCommand(PlotPlayer<?> player, String[] args) {
 | 
					 | 
				
			||||||
        PlotArea area = player.getPlotAreaAbs();
 | 
					 | 
				
			||||||
        check(area, TranslatableCaption.of("errors.not_in_plot_world"));
 | 
					 | 
				
			||||||
        player.sendMessage(
 | 
					 | 
				
			||||||
                TranslatableCaption.of("errors.deprecated_commands"),
 | 
					 | 
				
			||||||
                Template.of("replacement", "/plot toggle chat")
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
        if (player.getPlotAreaAbs().isForcingPlotChat()) {
 | 
					 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("chat.plot_chat_forced"));
 | 
					 | 
				
			||||||
            return true;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        MainCommand.getInstance().toggle.chat(this, player, args, null, null);
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -35,10 +35,11 @@ import com.plotsquared.core.plot.Plot;
 | 
				
			|||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					import com.plotsquared.core.plot.PlotArea;
 | 
				
			||||||
import com.plotsquared.core.util.EconHandler;
 | 
					import com.plotsquared.core.util.EconHandler;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.PlotExpression;
 | 
					import com.plotsquared.core.util.PlotExpression;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskManager;
 | 
					import com.plotsquared.core.util.task.TaskManager;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.apache.logging.log4j.LogManager;
 | 
					import org.apache.logging.log4j.LogManager;
 | 
				
			||||||
import org.apache.logging.log4j.Logger;
 | 
					import org.apache.logging.log4j.Logger;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
@@ -82,7 +83,7 @@ public class Claim extends SubCommand {
 | 
				
			|||||||
        if (event.getEventResult() == Result.DENY) {
 | 
					        if (event.getEventResult() == Result.DENY) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("events.event_denied"),
 | 
					                    TranslatableCaption.of("events.event_denied"),
 | 
				
			||||||
                    Template.of("value", "Claim")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("Claim")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -101,14 +102,14 @@ public class Claim extends SubCommand {
 | 
				
			|||||||
                    if (grants <= 0) {
 | 
					                    if (grants <= 0) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
					                                TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
				
			||||||
                                Template.of("amount", String.valueOf(grants))
 | 
					                                TagResolver.resolver("amount", Tag.inserting(Component.text(grants)))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        metaDataAccess.remove();
 | 
					                        metaDataAccess.remove();
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
					                            TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
				
			||||||
                            Template.of("amount", String.valueOf(player.getAllowedPlots()))
 | 
					                            TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -123,23 +124,24 @@ public class Claim extends SubCommand {
 | 
				
			|||||||
                    if (!area.hasSchematic(schematic)) {
 | 
					                    if (!area.hasSchematic(schematic)) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("schematics.schematic_invalid_named"),
 | 
					                                TranslatableCaption.of("schematics.schematic_invalid_named"),
 | 
				
			||||||
                                Template.of("schemname", schematic),
 | 
					                                TagResolver.builder()
 | 
				
			||||||
                                Template.of("reason", "non-existent")
 | 
					                                        .tag("schemname", Tag.inserting(Component.text(schematic)))
 | 
				
			||||||
 | 
					                                        .tag("reason", Tag.inserting(Component.text("non-existent")))
 | 
				
			||||||
 | 
					                                        .build()
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    if (!Permissions.hasPermission(player, Permission.PERMISSION_CLAIM_SCHEMATIC
 | 
					                    if (!player.hasPermission(Permission.PERMISSION_CLAIM_SCHEMATIC
 | 
				
			||||||
                            .format(schematic)) && !Permissions.hasPermission(
 | 
					                            .format(schematic)) && !player.hasPermission(
 | 
				
			||||||
                            player,
 | 
					 | 
				
			||||||
                            "plots.admin.command.schematic"
 | 
					                            "plots.admin.command.schematic"
 | 
				
			||||||
                    ) && !force) {
 | 
					                    ) && !force) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_schematic_permission"),
 | 
					                                TranslatableCaption.of("permission.no_schematic_permission"),
 | 
				
			||||||
                                Template.of("value", schematic)
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text(schematic)))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (this.econHandler.isEnabled(area) && !force) {
 | 
					            if (this.econHandler.isEnabled(area) && !force && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
 | 
				
			||||||
                PlotExpression costExr = area.getPrices().get("claim");
 | 
					                PlotExpression costExr = area.getPrices().get("claim");
 | 
				
			||||||
                double cost = costExr.evaluate(currentPlots);
 | 
					                double cost = costExr.evaluate(currentPlots);
 | 
				
			||||||
                if (cost > 0d) {
 | 
					                if (cost > 0d) {
 | 
				
			||||||
@@ -150,16 +152,28 @@ public class Claim extends SubCommand {
 | 
				
			|||||||
                    if (this.econHandler.getMoney(player) < cost) {
 | 
					                    if (this.econHandler.getMoney(player) < cost) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("economy.cannot_afford_plot"),
 | 
					                                TranslatableCaption.of("economy.cannot_afford_plot"),
 | 
				
			||||||
                                Template.of("money", this.econHandler.format(cost)),
 | 
					                                TagResolver.builder()
 | 
				
			||||||
                                Template.of("balance", this.econHandler.format(this.econHandler.getMoney(player)))
 | 
					                                        .tag("money", Tag.inserting(Component.text(this.econHandler.format(cost))))
 | 
				
			||||||
 | 
					                                        .tag(
 | 
				
			||||||
 | 
					                                                "balance",
 | 
				
			||||||
 | 
					                                                Tag.inserting(Component.text(this.econHandler.format(this.econHandler.getMoney(
 | 
				
			||||||
 | 
					                                                        player))))
 | 
				
			||||||
 | 
					                                        )
 | 
				
			||||||
 | 
					                                        .build()
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    this.econHandler.withdrawMoney(player, cost);
 | 
					                    this.econHandler.withdrawMoney(player, cost);
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("economy.removed_balance"),
 | 
					                            TranslatableCaption.of("economy.removed_balance"),
 | 
				
			||||||
                            Template.of("money", this.econHandler.format(cost)),
 | 
					                            TagResolver.builder()
 | 
				
			||||||
                            Template.of("balance", this.econHandler.format(this.econHandler.getMoney(player)))
 | 
					                                    .tag("money", Tag.inserting(Component.text(this.econHandler.format(cost))))
 | 
				
			||||||
 | 
					                                    .tag(
 | 
				
			||||||
 | 
					                                            "balance",
 | 
				
			||||||
 | 
					                                            Tag.inserting(Component.text(this.econHandler.format(this.econHandler.getMoney(
 | 
				
			||||||
 | 
					                                                    player))))
 | 
				
			||||||
 | 
					                                    )
 | 
				
			||||||
 | 
					                                    .build()
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -171,12 +185,14 @@ public class Claim extends SubCommand {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("economy.removed_granted_plot"),
 | 
					                        TranslatableCaption.of("economy.removed_granted_plot"),
 | 
				
			||||||
                        Template.of("usedGrants", String.valueOf((grants - 1))),
 | 
					                        TagResolver.builder()
 | 
				
			||||||
                        Template.of("remainingGrants", String.valueOf(grants))
 | 
					                                .tag("used_grants", Tag.inserting(Component.text(grants - 1)))
 | 
				
			||||||
 | 
					                                .tag("remaining_grants", Tag.inserting(Component.text(grants)))
 | 
				
			||||||
 | 
					                                .build()
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
 | 
					        if (!player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
 | 
				
			||||||
            int border = area.getBorder();
 | 
					            int border = area.getBorder();
 | 
				
			||||||
            if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border && !force) {
 | 
					            if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border && !force) {
 | 
				
			||||||
                player.sendMessage(TranslatableCaption.of("border.denied"));
 | 
					                player.sendMessage(TranslatableCaption.of("border.denied"));
 | 
				
			||||||
@@ -198,7 +214,7 @@ public class Claim extends SubCommand {
 | 
				
			|||||||
                        if (mergeEvent.getEventResult() == Result.DENY) {
 | 
					                        if (mergeEvent.getEventResult() == Result.DENY) {
 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("events.event_denied"),
 | 
					                                    TranslatableCaption.of("events.event_denied"),
 | 
				
			||||||
                                    Template.of("value", "Auto merge on claim")
 | 
					                                    TagResolver.resolver("value", Tag.inserting(Component.text("Auto merge on claim")))
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                        } else {
 | 
					                        } else {
 | 
				
			||||||
                            if (plot.getPlotModificationManager().autoMerge(
 | 
					                            if (plot.getPlotModificationManager().autoMerge(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,11 +32,12 @@ import com.plotsquared.core.plot.flag.implementations.AnalysisFlag;
 | 
				
			|||||||
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
				
			||||||
import com.plotsquared.core.queue.GlobalBlockQueue;
 | 
					import com.plotsquared.core.queue.GlobalBlockQueue;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal2;
 | 
					import com.plotsquared.core.util.task.RunnableVal2;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal3;
 | 
					import com.plotsquared.core.util.task.RunnableVal3;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskManager;
 | 
					import com.plotsquared.core.util.task.TaskManager;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.concurrent.CompletableFuture;
 | 
					import java.util.concurrent.CompletableFuture;
 | 
				
			||||||
@@ -79,7 +80,7 @@ public class Clear extends Command {
 | 
				
			|||||||
        if (eventResult == Result.DENY) {
 | 
					        if (eventResult == Result.DENY) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("events.event_denied"),
 | 
					                    TranslatableCaption.of("events.event_denied"),
 | 
				
			||||||
                    Template.of("value", "Clear")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("Clear")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return CompletableFuture.completedFuture(true);
 | 
					            return CompletableFuture.completedFuture(true);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -89,13 +90,14 @@ public class Clear extends Command {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        boolean force = eventResult == Result.FORCE;
 | 
					        boolean force = eventResult == Result.FORCE;
 | 
				
			||||||
        checkTrue(
 | 
					        checkTrue(
 | 
				
			||||||
                force || plot.isOwner(player.getUUID()) || Permissions
 | 
					                force || plot.isOwner(player.getUUID()) || player.hasPermission("plots.admin.command.clear"),
 | 
				
			||||||
                        .hasPermission(player, "plots.admin.command.clear"),
 | 
					 | 
				
			||||||
                TranslatableCaption.of("permission.no_plot_perms")
 | 
					                TranslatableCaption.of("permission.no_plot_perms")
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        checkTrue(plot.getRunning() == 0, TranslatableCaption.of("errors.wait_for_timer"));
 | 
					        checkTrue(plot.getRunning() == 0, TranslatableCaption.of("errors.wait_for_timer"));
 | 
				
			||||||
        checkTrue(force || !Settings.Done.RESTRICT_BUILDING || !DoneFlag.isDone(plot) || Permissions
 | 
					        checkTrue(
 | 
				
			||||||
                .hasPermission(player, "plots.continue"), TranslatableCaption.of("done.done_already_done"));
 | 
					                force || !Settings.Done.RESTRICT_BUILDING || !DoneFlag.isDone(plot) || player.hasPermission("plots.continue"),
 | 
				
			||||||
 | 
					                TranslatableCaption.of("done.done_already_done")
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
        confirm.run(this, () -> {
 | 
					        confirm.run(this, () -> {
 | 
				
			||||||
            if (Settings.Teleport.ON_CLEAR) {
 | 
					            if (Settings.Teleport.ON_CLEAR) {
 | 
				
			||||||
                plot.getPlayersInPlot().forEach(playerInPlot -> plot.teleportPlayer(playerInPlot, TeleportCause.COMMAND_CLEAR,
 | 
					                plot.getPlayersInPlot().forEach(playerInPlot -> plot.teleportPlayer(playerInPlot, TeleportCause.COMMAND_CLEAR,
 | 
				
			||||||
@@ -105,9 +107,7 @@ public class Clear extends Command {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            BackupManager.backup(player, plot, () -> {
 | 
					            BackupManager.backup(player, plot, () -> {
 | 
				
			||||||
                final long start = System.currentTimeMillis();
 | 
					                final long start = System.currentTimeMillis();
 | 
				
			||||||
                boolean result = plot.getPlotModificationManager().clear(true, false, player, () -> {
 | 
					                boolean result = plot.getPlotModificationManager().clear(true, false, player, () -> TaskManager.runTask(() -> {
 | 
				
			||||||
                    plot.getPlotModificationManager().unlink();
 | 
					 | 
				
			||||||
                    TaskManager.runTask(() -> {
 | 
					 | 
				
			||||||
                    plot.removeRunning();
 | 
					                    plot.removeRunning();
 | 
				
			||||||
                    // If the state changes, then mark it as no longer done
 | 
					                    // If the state changes, then mark it as no longer done
 | 
				
			||||||
                    if (DoneFlag.isDone(plot)) {
 | 
					                    if (DoneFlag.isDone(plot)) {
 | 
				
			||||||
@@ -130,11 +130,12 @@ public class Clear extends Command {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("working.clearing_done"),
 | 
					                            TranslatableCaption.of("working.clearing_done"),
 | 
				
			||||||
                                Template.of("amount", String.valueOf(System.currentTimeMillis() - start)),
 | 
					                            TagResolver.builder()
 | 
				
			||||||
                                Template.of("plot", plot.getId().toString())
 | 
					                                    .tag("amount", Tag.inserting(Component.text(System.currentTimeMillis() - start)))
 | 
				
			||||||
 | 
					                                    .tag("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
				
			||||||
 | 
					                                    .build()
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    });
 | 
					                }));
 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
                if (!result) {
 | 
					                if (!result) {
 | 
				
			||||||
                    player.sendMessage(TranslatableCaption.of("errors.wait_for_timer"));
 | 
					                    player.sendMessage(TranslatableCaption.of("errors.wait_for_timer"));
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,20 +32,26 @@ import com.plotsquared.core.plot.Plot;
 | 
				
			|||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					import com.plotsquared.core.plot.PlotArea;
 | 
				
			||||||
import com.plotsquared.core.plot.PlotCluster;
 | 
					import com.plotsquared.core.plot.PlotCluster;
 | 
				
			||||||
import com.plotsquared.core.plot.PlotId;
 | 
					import com.plotsquared.core.plot.PlotId;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					import com.plotsquared.core.util.ComponentHelper;
 | 
				
			||||||
import com.plotsquared.core.util.TabCompletions;
 | 
					import com.plotsquared.core.util.TabCompletions;
 | 
				
			||||||
import com.plotsquared.core.util.query.PlotQuery;
 | 
					import com.plotsquared.core.util.query.PlotQuery;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.format.NamedTextColor;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.format.Style;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
import java.util.Collections;
 | 
					import java.util.Collections;
 | 
				
			||||||
import java.util.HashSet;
 | 
					import java.util.HashSet;
 | 
				
			||||||
import java.util.LinkedList;
 | 
					import java.util.LinkedList;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Objects;
 | 
				
			||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
import java.util.UUID;
 | 
					import java.util.UUID;
 | 
				
			||||||
import java.util.concurrent.TimeoutException;
 | 
					import java.util.concurrent.TimeoutException;
 | 
				
			||||||
import java.util.stream.Collectors;
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					import java.util.stream.Stream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@CommandDeclaration(command = "cluster",
 | 
					@CommandDeclaration(command = "cluster",
 | 
				
			||||||
        aliases = "clusters",
 | 
					        aliases = "clusters",
 | 
				
			||||||
@@ -54,36 +60,39 @@ import java.util.stream.Collectors;
 | 
				
			|||||||
        permission = "plots.cluster")
 | 
					        permission = "plots.cluster")
 | 
				
			||||||
public class Cluster extends SubCommand {
 | 
					public class Cluster extends SubCommand {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    private static final Component[] AVAILABLE_ARGS = Stream.of(
 | 
				
			||||||
    public boolean onCommand(PlotPlayer<?> player, String[] args) {
 | 
					            "list", "create", "delete", "resize", "invite", "kick", "leave", "helpers", "tp", "sethome"
 | 
				
			||||||
 | 
					    ).map(s -> Component.text(s).style(Style.style(NamedTextColor.DARK_AQUA))).toArray(Component[]::new);
 | 
				
			||||||
 | 
					    private static final Component SEPARATOR = Component.text(", ").style(Style.style(NamedTextColor.GRAY));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // list, create, delete, resize, invite, kick, leave, helpers, tp, sethome
 | 
					    // list, create, delete, resize, invite, kick, leave, helpers, tp, sethome
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public boolean onCommand(PlotPlayer<?> player, String[] args) {
 | 
				
			||||||
        if (args.length == 0) {
 | 
					        if (args.length == 0) {
 | 
				
			||||||
            // return arguments
 | 
					            // return arguments
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("cluster.cluster_available_args"),
 | 
					                    TranslatableCaption.of("cluster.cluster_available_args"),
 | 
				
			||||||
                    Template.of(
 | 
					                    TagResolver.resolver("list", Tag.inserting(ComponentHelper.join(AVAILABLE_ARGS, SEPARATOR)))
 | 
				
			||||||
                            "list",
 | 
					 | 
				
			||||||
                            "<dark_aqua>list</dark_aqua><gray>, </gray><dark_aqua>create</dark_aqua><gray>, </gray><dark_aqua>delete</dark_aqua><gray>, </gray><dark_aqua>resize</dark_aqua><gray>, </gray><dark_aqua>invite</dark_aqua><gray>, </gray><dark_aqua>kick</dark_aqua><gray>, </gray><dark_aqua>leave</dark_aqua><gray>, </gray><dark_aqua>members</dark_aqua><gray>, </gray><dark_aqua>info</dark_aqua><gray>, </gray><dark_aqua>tp</dark_aqua><gray>, </gray><dark_aqua>sethome</dark_aqua>"
 | 
					 | 
				
			||||||
                    )
 | 
					 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        String sub = args[0].toLowerCase();
 | 
					        String sub = args[0].toLowerCase();
 | 
				
			||||||
        switch (sub) {
 | 
					        switch (sub) {
 | 
				
			||||||
            case "l":
 | 
					            case "l", "list" -> {
 | 
				
			||||||
            case "list": {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_CLUSTER_LIST)) {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_LIST)) {
 | 
					 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_LIST))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_CLUSTER_LIST)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (args.length != 1) {
 | 
					                if (args.length != 1) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Template.of("value", "/plot cluster list")
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster list")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -95,7 +104,7 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                Set<PlotCluster> clusters = area.getClusters();
 | 
					                Set<PlotCluster> clusters = area.getClusters();
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("cluster.cluster_list_heading"),
 | 
					                        TranslatableCaption.of("cluster.cluster_list_heading"),
 | 
				
			||||||
                        Template.of("amount", clusters.size() + "")
 | 
					                        TagResolver.resolver("amount", Tag.inserting(Component.text(clusters.size())))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                for (PlotCluster cluster : clusters) {
 | 
					                for (PlotCluster cluster : clusters) {
 | 
				
			||||||
                    // Ignore unmanaged clusters
 | 
					                    // Ignore unmanaged clusters
 | 
				
			||||||
@@ -103,33 +112,35 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                    if (player.getUUID().equals(cluster.owner)) {
 | 
					                    if (player.getUUID().equals(cluster.owner)) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("cluster.cluster_list_element_owner"),
 | 
					                                TranslatableCaption.of("cluster.cluster_list_element_owner"),
 | 
				
			||||||
                                Template.of("cluster", name)
 | 
					                                TagResolver.resolver("cluster", Tag.inserting(Component.text(name)))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    } else if (cluster.helpers.contains(player.getUUID())) {
 | 
					                    } else if (cluster.helpers.contains(player.getUUID())) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("cluster.cluster_list_element_helpers"),
 | 
					                                TranslatableCaption.of("cluster.cluster_list_element_helpers"),
 | 
				
			||||||
                                Template.of("cluster", name)
 | 
					                                TagResolver.resolver("cluster", Tag.inserting(Component.text(name)))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    } else if (cluster.invited.contains(player.getUUID())) {
 | 
					                    } else if (cluster.invited.contains(player.getUUID())) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("cluster.cluster_list_element_invited"),
 | 
					                                TranslatableCaption.of("cluster.cluster_list_element_invited"),
 | 
				
			||||||
                                Template.of("cluster", name)
 | 
					                                TagResolver.resolver("cluster", Tag.inserting(Component.text(name)))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("cluster.cluster_list_element"),
 | 
					                                TranslatableCaption.of("cluster.cluster_list_element"),
 | 
				
			||||||
                                Template.of("cluster", cluster.toString())
 | 
					                                TagResolver.resolver("cluster", Tag.inserting(Component.text(cluster.toString())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "c":
 | 
					            case "c", "create" -> {
 | 
				
			||||||
            case "create": {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_CLUSTER_CREATE)) {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_CREATE)) {
 | 
					 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_CREATE))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_CLUSTER_CREATE)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -141,7 +152,10 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                if (args.length != 4) {
 | 
					                if (args.length != 4) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Template.of("value", "/plot cluster create <name> <id-bot> <id-top>")
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "value",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Component.text("/plot cluster create <name> <id-bot> <id-top>"))
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -151,7 +165,7 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                if (currentClusters >= player.getAllowedPlots()) {
 | 
					                if (currentClusters >= player.getAllowedPlots()) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.cant_claim_more_clusters"),
 | 
					                            TranslatableCaption.of("permission.cant_claim_more_clusters"),
 | 
				
			||||||
                            Template.of("amount", String.valueOf(player.getAllowedPlots()))
 | 
					                            TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                PlotId pos1;
 | 
					                PlotId pos1;
 | 
				
			||||||
@@ -169,7 +183,7 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                if (area.getCluster(name) != null) {
 | 
					                if (area.getCluster(name) != null) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("alias.alias_is_taken"),
 | 
					                            TranslatableCaption.of("alias.alias_is_taken"),
 | 
				
			||||||
                            Template.of("alias", name)
 | 
					                            TagResolver.resolver("alias", Tag.inserting(Component.text(name)))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -183,7 +197,7 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                if (cluster != null) {
 | 
					                if (cluster != null) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("cluster.cluster_intersection"),
 | 
					                            TranslatableCaption.of("cluster.cluster_intersection"),
 | 
				
			||||||
                            Template.of("cluster", cluster.getName())
 | 
					                            TagResolver.resolver("cluster", Tag.inserting(Component.text(cluster.getName())))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -191,20 +205,22 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                if (!area.contains(pos1) || !area.contains(pos2)) {
 | 
					                if (!area.contains(pos1) || !area.contains(pos2)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("cluster.cluster_outside"),
 | 
					                            TranslatableCaption.of("cluster.cluster_outside"),
 | 
				
			||||||
                            Template.of("area", String.valueOf(area))
 | 
					                            TagResolver.resolver("area", Tag.inserting(Component.text(area.toString())))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                Set<Plot> plots = area.getPlotSelectionOwned(pos1, pos2);
 | 
					                Set<Plot> plots = area.getPlotSelectionOwned(pos1, pos2);
 | 
				
			||||||
                if (!plots.isEmpty()) {
 | 
					                if (!plots.isEmpty()) {
 | 
				
			||||||
                    if (!Permissions
 | 
					                    if (!player.hasPermission(Permission.PERMISSION_CLUSTER_CREATE_OTHER)) {
 | 
				
			||||||
                            .hasPermission(player, Permission.PERMISSION_CLUSTER_CREATE_OTHER)) {
 | 
					 | 
				
			||||||
                        UUID uuid = player.getUUID();
 | 
					                        UUID uuid = player.getUUID();
 | 
				
			||||||
                        for (Plot plot : plots) {
 | 
					                        for (Plot plot : plots) {
 | 
				
			||||||
                            if (!plot.isOwner(uuid)) {
 | 
					                            if (!plot.isOwner(uuid)) {
 | 
				
			||||||
                                player.sendMessage(
 | 
					                                player.sendMessage(
 | 
				
			||||||
                                        TranslatableCaption.of("permission.no_permission"),
 | 
					                                        TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                                        Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_CREATE_OTHER))
 | 
					                                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                                "node",
 | 
				
			||||||
 | 
					                                                Tag.inserting(Permission.PERMISSION_CLUSTER_CREATE_OTHER)
 | 
				
			||||||
 | 
					                                        )
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                                return false;
 | 
					                                return false;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
@@ -219,14 +235,17 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    current = player.getPlayerClusterCount(player.getLocation().getWorldName());
 | 
					                    current = player.getPlayerClusterCount(player.getLocation().getWorldName());
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                int allowed = Permissions
 | 
					                int allowed = player.hasPermissionRange(
 | 
				
			||||||
                        .hasPermissionRange(player, Permission.PERMISSION_CLUSTER_SIZE,
 | 
					                        Permission.PERMISSION_CLUSTER_SIZE,
 | 
				
			||||||
                        Settings.Limit.MAX_PLOTS
 | 
					                        Settings.Limit.MAX_PLOTS
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                if (current + cluster.getArea() > allowed) {
 | 
					                if (current + cluster.getArea() > allowed) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_CLUSTER_SIZE + "." + (current + cluster.getArea()))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Component.text(Permission.PERMISSION_CLUSTER_SIZE + "." + (current + cluster.getArea())))
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -245,24 +264,25 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("cluster.cluster_created"),
 | 
					                        TranslatableCaption.of("cluster.cluster_created"),
 | 
				
			||||||
                        Template.of("name", name)
 | 
					                        TagResolver.resolver("name", Tag.inserting(Component.text(name)))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "disband":
 | 
					            case "disband", "del", "delete" -> {
 | 
				
			||||||
            case "del":
 | 
					                if (!player.hasPermission(Permission.PERMISSION_CLUSTER_DELETE)) {
 | 
				
			||||||
            case "delete": {
 | 
					 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_DELETE)) {
 | 
					 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_DELETE))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_CLUSTER_DELETE)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (args.length != 1 && args.length != 2) {
 | 
					                if (args.length != 1 && args.length != 2) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Template.of("value", "/plot cluster delete [name]")
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster delete [name]")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -277,7 +297,7 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                    if (cluster == null) {
 | 
					                    if (cluster == null) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("cluster.invalid_cluster_name"),
 | 
					                                TranslatableCaption.of("cluster.invalid_cluster_name"),
 | 
				
			||||||
                                Template.of("cluster", args[1])
 | 
					                                TagResolver.resolver("cluster", Tag.inserting(Component.text(args[1])))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -289,35 +309,39 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!cluster.owner.equals(player.getUUID())) {
 | 
					                if (!cluster.owner.equals(player.getUUID())) {
 | 
				
			||||||
                    if (!Permissions
 | 
					                    if (!player.hasPermission(Permission.PERMISSION_CLUSTER_DELETE_OTHER)) {
 | 
				
			||||||
                            .hasPermission(player, Permission.PERMISSION_CLUSTER_DELETE_OTHER)) {
 | 
					 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission"),
 | 
					                                TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                                Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_DELETE_OTHER))
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "node",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Permission.PERMISSION_CLUSTER_DELETE_OTHER)
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                DBFunc.delete(cluster);
 | 
					                DBFunc.delete(cluster);
 | 
				
			||||||
                player.sendMessage(TranslatableCaption.of("cluster.cluster_deleted"), Template.of(
 | 
					                player.sendMessage(TranslatableCaption.of("cluster.cluster_deleted"), TagResolver.resolver(
 | 
				
			||||||
                        "cluster",
 | 
					                        "cluster",
 | 
				
			||||||
                        String.valueOf(cluster)
 | 
					                        Tag.inserting(Component.text(cluster.toString()))
 | 
				
			||||||
                ));
 | 
					                ));
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "res":
 | 
					            case "res", "resize" -> {
 | 
				
			||||||
            case "resize": {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE)) {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_RESIZE)) {
 | 
					 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_RESIZE))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_CLUSTER_RESIZE)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (args.length != 3) {
 | 
					                if (args.length != 3) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Template.of("value", "/plot cluster resize [name]")
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster resize [name]")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -347,11 +371,13 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!cluster.hasHelperRights(player.getUUID())) {
 | 
					                if (!cluster.hasHelperRights(player.getUUID())) {
 | 
				
			||||||
                    if (!Permissions
 | 
					                    if (!player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE_OTHER)) {
 | 
				
			||||||
                            .hasPermission(player, Permission.PERMISSION_CLUSTER_RESIZE_OTHER)) {
 | 
					 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission"),
 | 
					                                TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                                Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_RESIZE_OTHER))
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "node",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Permission.PERMISSION_CLUSTER_RESIZE_OTHER)
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -361,34 +387,37 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                if (intersect != null) {
 | 
					                if (intersect != null) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("cluster.cluster_intersection"),
 | 
					                            TranslatableCaption.of("cluster.cluster_intersection"),
 | 
				
			||||||
                            Template.of("cluster", intersect.getName())
 | 
					                            TagResolver.resolver("cluster", Tag.inserting(Component.text(intersect.getName())))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                Set<Plot> existing = area.getPlotSelectionOwned(cluster.getP1(), cluster.getP2());
 | 
					                Set<Plot> existing = area.getPlotSelectionOwned(cluster.getP1(), cluster.getP2());
 | 
				
			||||||
                Set<Plot> newPlots = area.getPlotSelectionOwned(pos1, pos2);
 | 
					                Set<Plot> newPlots = area.getPlotSelectionOwned(pos1, pos2);
 | 
				
			||||||
                // Set<Plot> removed = (HashSet<Plot>) existing.clone();
 | 
					 | 
				
			||||||
                Set<Plot> removed = new HashSet<>(existing);
 | 
					                Set<Plot> removed = new HashSet<>(existing);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                removed.removeAll(newPlots);
 | 
					                removed.removeAll(newPlots);
 | 
				
			||||||
                // Check expand / shrink
 | 
					                // Check expand / shrink
 | 
				
			||||||
                if (!removed.isEmpty()) {
 | 
					                if (!removed.isEmpty()) {
 | 
				
			||||||
                    if (!Permissions
 | 
					                    if (!player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE_SHRINK)) {
 | 
				
			||||||
                            .hasPermission(player, Permission.PERMISSION_CLUSTER_RESIZE_SHRINK)) {
 | 
					 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission"),
 | 
					                                TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                                Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_RESIZE_SHRINK))
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "node",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Permission.PERMISSION_CLUSTER_RESIZE_SHRINK)
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                newPlots.removeAll(existing);
 | 
					                newPlots.removeAll(existing);
 | 
				
			||||||
                if (!newPlots.isEmpty()) {
 | 
					                if (!newPlots.isEmpty()) {
 | 
				
			||||||
                    if (!Permissions
 | 
					                    if (!player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE_EXPAND)) {
 | 
				
			||||||
                            .hasPermission(player, Permission.PERMISSION_CLUSTER_RESIZE_EXPAND)) {
 | 
					 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission"),
 | 
					                                TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                                Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_RESIZE_EXPAND))
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "node",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Permission.PERMISSION_CLUSTER_RESIZE_EXPAND)
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -401,13 +430,16 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                    current = player.getPlayerClusterCount(player.getLocation().getWorldName());
 | 
					                    current = player.getPlayerClusterCount(player.getLocation().getWorldName());
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                current -= cluster.getArea() + (1 + pos2.getX() - pos1.getX()) * (1 + pos2.getY() - pos1.getY());
 | 
					                current -= cluster.getArea() + (1 + pos2.getX() - pos1.getX()) * (1 + pos2.getY() - pos1.getY());
 | 
				
			||||||
                int allowed = Permissions.hasPermissionRange(player, Permission.PERMISSION_CLUSTER,
 | 
					                int allowed = player.hasPermissionRange(
 | 
				
			||||||
 | 
					                        Permission.PERMISSION_CLUSTER,
 | 
				
			||||||
                        Settings.Limit.MAX_PLOTS
 | 
					                        Settings.Limit.MAX_PLOTS
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                if (current + cluster.getArea() > allowed) {
 | 
					                if (current + cluster.getArea() > allowed) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_CLUSTER + "." + (current + cluster.getArea()))
 | 
					                            TagResolver.resolver("node", Tag.inserting(Component.text(
 | 
				
			||||||
 | 
					                                    Permission.PERMISSION_CLUSTER + "." + (current + cluster.getArea())
 | 
				
			||||||
 | 
					                            )))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -416,20 +448,21 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                player.sendMessage(TranslatableCaption.of("cluster.cluster_resized"));
 | 
					                player.sendMessage(TranslatableCaption.of("cluster.cluster_resized"));
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "add":
 | 
					            case "add", "inv", "invite" -> {
 | 
				
			||||||
            case "inv":
 | 
					                if (!player.hasPermission(Permission.PERMISSION_CLUSTER_INVITE)) {
 | 
				
			||||||
            case "invite": {
 | 
					 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_INVITE)) {
 | 
					 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_INVITE))
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_CLUSTER_INVITE)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (args.length != 2) {
 | 
					                if (args.length != 2) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Template.of("value", "/plot cluster invite <player>")
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster invite <player>")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -444,11 +477,13 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!cluster.hasHelperRights(player.getUUID())) {
 | 
					                if (!cluster.hasHelperRights(player.getUUID())) {
 | 
				
			||||||
                    if (!Permissions
 | 
					                    if (!player.hasPermission(Permission.PERMISSION_CLUSTER_INVITE_OTHER)) {
 | 
				
			||||||
                            .hasPermission(player, Permission.PERMISSION_CLUSTER_INVITE_OTHER)) {
 | 
					 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission"),
 | 
					                                TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                                Template.of("node", Permission.PERMISSION_CLUSTER_INVITE_OTHER.toString())
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "node",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Permission.PERMISSION_CLUSTER_INVITE_OTHER)
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -461,7 +496,7 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                            } else if (throwable != null) {
 | 
					                            } else if (throwable != null) {
 | 
				
			||||||
                                player.sendMessage(
 | 
					                                player.sendMessage(
 | 
				
			||||||
                                        TranslatableCaption.of("errors.invalid_player"),
 | 
					                                        TranslatableCaption.of("errors.invalid_player"),
 | 
				
			||||||
                                        Template.of("value", args[1])
 | 
					                                        TagResolver.resolver("value", Tag.inserting(Component.text(args[1])))
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                            } else {
 | 
					                            } else {
 | 
				
			||||||
                                if (!cluster.isAdded(uuid)) {
 | 
					                                if (!cluster.isAdded(uuid)) {
 | 
				
			||||||
@@ -473,7 +508,7 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                                    if (otherPlayer != null) {
 | 
					                                    if (otherPlayer != null) {
 | 
				
			||||||
                                        player.sendMessage(
 | 
					                                        player.sendMessage(
 | 
				
			||||||
                                                TranslatableCaption.of("cluster.cluster_invited"),
 | 
					                                                TranslatableCaption.of("cluster.cluster_invited"),
 | 
				
			||||||
                                                Template.of("cluster", cluster.getName())
 | 
					                                                TagResolver.resolver("cluster", Tag.inserting(Component.text(cluster.getName())))
 | 
				
			||||||
                                        );
 | 
					                                        );
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
@@ -482,20 +517,21 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                        });
 | 
					                        });
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "k":
 | 
					            case "k", "remove", "kick" -> {
 | 
				
			||||||
            case "remove":
 | 
					                if (!player.hasPermission(Permission.PERMISSION_CLUSTER_KICK)) {
 | 
				
			||||||
            case "kick": {
 | 
					 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_KICK)) {
 | 
					 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_CLUSTER_KICK.toString())
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_CLUSTER_KICK)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (args.length != 2) {
 | 
					                if (args.length != 2) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Template.of("value", "/plot cluster kick <player>")
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster kick <player>")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -509,11 +545,13 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!cluster.hasHelperRights(player.getUUID())) {
 | 
					                if (!cluster.hasHelperRights(player.getUUID())) {
 | 
				
			||||||
                    if (!Permissions
 | 
					                    if (!player.hasPermission(Permission.PERMISSION_CLUSTER_KICK_OTHER)) {
 | 
				
			||||||
                            .hasPermission(player, Permission.PERMISSION_CLUSTER_KICK_OTHER)) {
 | 
					 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission"),
 | 
					                                TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                                Template.of("node", Permission.PERMISSION_CLUSTER_KICK_OTHER.toString())
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "node",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Permission.PERMISSION_CLUSTER_KICK_OTHER)
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -526,7 +564,7 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                            } else if (throwable != null) {
 | 
					                            } else if (throwable != null) {
 | 
				
			||||||
                                player.sendMessage(
 | 
					                                player.sendMessage(
 | 
				
			||||||
                                        TranslatableCaption.of("errors.invalid_player"),
 | 
					                                        TranslatableCaption.of("errors.invalid_player"),
 | 
				
			||||||
                                        Template.of("value", args[1])
 | 
					                                        TagResolver.resolver("value", Tag.inserting(Component.text(args[1])))
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                            } else {
 | 
					                            } else {
 | 
				
			||||||
                                // Can't kick if the player is yourself, the owner, or not added to the cluster
 | 
					                                // Can't kick if the player is yourself, the owner, or not added to the cluster
 | 
				
			||||||
@@ -534,7 +572,7 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                                        || !cluster.isAdded(uuid)) {
 | 
					                                        || !cluster.isAdded(uuid)) {
 | 
				
			||||||
                                    player.sendMessage(
 | 
					                                    player.sendMessage(
 | 
				
			||||||
                                            TranslatableCaption.of("cluster.cannot_kick_player"),
 | 
					                                            TranslatableCaption.of("cluster.cannot_kick_player"),
 | 
				
			||||||
                                            Template.of("value", cluster.getName())
 | 
					                                            TagResolver.resolver("value", Tag.inserting(Component.text(cluster.getName())))
 | 
				
			||||||
                                    );
 | 
					                                    );
 | 
				
			||||||
                                } else {
 | 
					                                } else {
 | 
				
			||||||
                                    if (cluster.helpers.contains(uuid)) {
 | 
					                                    if (cluster.helpers.contains(uuid)) {
 | 
				
			||||||
@@ -549,7 +587,7 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                                    if (player2 != null) {
 | 
					                                    if (player2 != null) {
 | 
				
			||||||
                                        player.sendMessage(
 | 
					                                        player.sendMessage(
 | 
				
			||||||
                                                TranslatableCaption.of("cluster.cluster_removed"),
 | 
					                                                TranslatableCaption.of("cluster.cluster_removed"),
 | 
				
			||||||
                                                Template.of("cluster", cluster.getName())
 | 
					                                                TagResolver.resolver("cluster", Tag.inserting(Component.text(cluster.getName())))
 | 
				
			||||||
                                        );
 | 
					                                        );
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
                                    removePlayerPlots(cluster, uuid, player2.getLocation().getWorldName());
 | 
					                                    removePlayerPlots(cluster, uuid, player2.getLocation().getWorldName());
 | 
				
			||||||
@@ -559,19 +597,21 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                        });
 | 
					                        });
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "quit":
 | 
					            case "quit", "leave" -> {
 | 
				
			||||||
            case "leave": {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_CLUSTER_LEAVE)) {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_LEAVE)) {
 | 
					 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_CLUSTER_LEAVE.toString())
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_CLUSTER_LEAVE)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (args.length != 1 && args.length != 2) {
 | 
					                if (args.length != 1 && args.length != 2) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Template.of("value", "/plot cluster leave [name]")
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster leave [name]")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -585,7 +625,7 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                    if (cluster == null) {
 | 
					                    if (cluster == null) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("cluster.invalid_cluster_name"),
 | 
					                                TranslatableCaption.of("cluster.invalid_cluster_name"),
 | 
				
			||||||
                                Template.of("cluster", args[1])
 | 
					                                TagResolver.resolver("cluster", Tag.inserting(Component.text(args[1])))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -613,23 +653,29 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                DBFunc.removeInvited(cluster, uuid);
 | 
					                DBFunc.removeInvited(cluster, uuid);
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("cluster.cluster_removed"),
 | 
					                        TranslatableCaption.of("cluster.cluster_removed"),
 | 
				
			||||||
                        Template.of("cluster", cluster.getName())
 | 
					                        TagResolver.resolver("cluster", Tag.inserting(Component.text(cluster.getName())))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                removePlayerPlots(cluster, uuid, player.getLocation().getWorldName());
 | 
					                removePlayerPlots(cluster, uuid, player.getLocation().getWorldName());
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "members": {
 | 
					            case "members" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_HELPERS)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_CLUSTER_HELPERS)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_CLUSTER_HELPERS.toString())
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Component.text(Permission.PERMISSION_CLUSTER_HELPERS.toString()))
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (args.length != 3) {
 | 
					                if (args.length != 3) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Template.of("value", "/plot cluster members <add | remove> <player>")
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "value",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Component.text("/plot cluster members <add | remove> <player>"))
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -650,7 +696,7 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                            } else if (throwable != null) {
 | 
					                            } else if (throwable != null) {
 | 
				
			||||||
                                player.sendMessage(
 | 
					                                player.sendMessage(
 | 
				
			||||||
                                        TranslatableCaption.of("errors.invalid_player"),
 | 
					                                        TranslatableCaption.of("errors.invalid_player"),
 | 
				
			||||||
                                        Template.of("value", args[2])
 | 
					                                        TagResolver.resolver("value", Tag.inserting(Component.text(args[2])))
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                            } else {
 | 
					                            } else {
 | 
				
			||||||
                                if (args[1].equalsIgnoreCase("add")) {
 | 
					                                if (args[1].equalsIgnoreCase("add")) {
 | 
				
			||||||
@@ -664,27 +710,30 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                                } else {
 | 
					                                } else {
 | 
				
			||||||
                                    player.sendMessage(
 | 
					                                    player.sendMessage(
 | 
				
			||||||
                                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                                            Template.of("value", "/plot cluster members <add | remove> <player>")
 | 
					                                            TagResolver.resolver("value", Tag.inserting(Component.text(
 | 
				
			||||||
 | 
					                                                    "/plot cluster members <add | remove> <player>"
 | 
				
			||||||
 | 
					                                            )))
 | 
				
			||||||
                                    );
 | 
					                                    );
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        });
 | 
					                        });
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "spawn":
 | 
					            case "spawn", "home", "tp" -> {
 | 
				
			||||||
            case "home":
 | 
					                if (!player.hasPermission(Permission.PERMISSION_CLUSTER_TP)) {
 | 
				
			||||||
            case "tp": {
 | 
					 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_TP)) {
 | 
					 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_CLUSTER_TP.toString())
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_CLUSTER_TP)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (args.length != 2) {
 | 
					                if (args.length != 2) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Template.of("value", "/plot cluster tp <name>")
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster tp <name>")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -697,16 +746,19 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                if (cluster == null) {
 | 
					                if (cluster == null) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("cluster.invalid_cluster_name"),
 | 
					                            TranslatableCaption.of("cluster.invalid_cluster_name"),
 | 
				
			||||||
                            Template.of("cluster", args[1])
 | 
					                            TagResolver.resolver("cluster", Tag.inserting(Component.text(args[1])))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                UUID uuid = player.getUUID();
 | 
					                UUID uuid = player.getUUID();
 | 
				
			||||||
                if (!cluster.isAdded(uuid)) {
 | 
					                if (!cluster.isAdded(uuid)) {
 | 
				
			||||||
                    if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_TP_OTHER)) {
 | 
					                    if (!player.hasPermission(Permission.PERMISSION_CLUSTER_TP_OTHER)) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission"),
 | 
					                                TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                                Template.of("node", Permission.PERMISSION_CLUSTER_TP_OTHER.toString())
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "node",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Permission.PERMISSION_CLUSTER_TP_OTHER)
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -715,21 +767,21 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                player.sendMessage(TranslatableCaption.of("cluster.cluster_teleporting"));
 | 
					                player.sendMessage(TranslatableCaption.of("cluster.cluster_teleporting"));
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "i":
 | 
					            case "i", "info", "show", "information" -> {
 | 
				
			||||||
            case "info":
 | 
					                if (!player.hasPermission(Permission.PERMISSION_CLUSTER_INFO)) {
 | 
				
			||||||
            case "show":
 | 
					 | 
				
			||||||
            case "information": {
 | 
					 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_INFO)) {
 | 
					 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_CLUSTER_TP.toString())
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "node",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Permission.PERMISSION_CLUSTER_TP)
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (args.length != 1 && args.length != 2) {
 | 
					                if (args.length != 1 && args.length != 2) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Template.of("value", "/plot cluster info [name]")
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster info [name]")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                PlotArea area = player.getApplicablePlotArea();
 | 
					                PlotArea area = player.getApplicablePlotArea();
 | 
				
			||||||
@@ -743,7 +795,7 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                    if (cluster == null) {
 | 
					                    if (cluster == null) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("cluster.invalid_cluster_name"),
 | 
					                                TranslatableCaption.of("cluster.invalid_cluster_name"),
 | 
				
			||||||
                                Template.of("cluster", args[1])
 | 
					                                TagResolver.resolver("cluster", Tag.inserting(Component.text(args[1])))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -762,47 +814,36 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                                player.sendMessage(TranslatableCaption.of("players.fetching_players_timeout"));
 | 
					                                player.sendMessage(TranslatableCaption.of("players.fetching_players_timeout"));
 | 
				
			||||||
                            } else {
 | 
					                            } else {
 | 
				
			||||||
                                final String owner;
 | 
					                                final String owner;
 | 
				
			||||||
                                if (username == null) {
 | 
					                                owner = Objects.requireNonNullElse(username, "unknown");
 | 
				
			||||||
                                    owner = "unknown";
 | 
					 | 
				
			||||||
                                } else {
 | 
					 | 
				
			||||||
                                    owner = username;
 | 
					 | 
				
			||||||
                                }
 | 
					 | 
				
			||||||
                                String name = cluster.getName();
 | 
					                                String name = cluster.getName();
 | 
				
			||||||
                                String size = (cluster.getP2().getX() - cluster.getP1().getX() + 1) + "x" + (
 | 
					                                String size = (cluster.getP2().getX() - cluster.getP1().getX() + 1) + "x" + (
 | 
				
			||||||
                                        cluster.getP2().getY() - cluster.getP1().getY() + 1);
 | 
					                                        cluster.getP2().getY() - cluster.getP1().getY() + 1);
 | 
				
			||||||
                                String rights = cluster.isAdded(player.getUUID()) + "";
 | 
					                                String rights = cluster.isAdded(player.getUUID()) + "";
 | 
				
			||||||
                                Caption message = TranslatableCaption.of("cluster.cluster_info");
 | 
					                                Caption message = TranslatableCaption.of("cluster.cluster_info");
 | 
				
			||||||
                                Template idTemplate = Template.of("id", id);
 | 
					                                TagResolver resolver = TagResolver.builder()
 | 
				
			||||||
                                Template ownerTemplate = Template.of("owner", owner);
 | 
					                                        .tag("id", Tag.inserting(Component.text(id)))
 | 
				
			||||||
                                Template nameTemplate = Template.of("name", name);
 | 
					                                        .tag("owner", Tag.inserting(Component.text(owner)))
 | 
				
			||||||
                                Template sizeTemplate = Template.of("size", size);
 | 
					                                        .tag("name", Tag.inserting(Component.text(name)))
 | 
				
			||||||
                                Template rightsTemplate = Template.of("rights", rights);
 | 
					                                        .tag("size", Tag.inserting(Component.text(size)))
 | 
				
			||||||
                                player.sendMessage(
 | 
					                                        .tag("rights", Tag.inserting(Component.text(rights)))
 | 
				
			||||||
                                        message,
 | 
					                                        .build();
 | 
				
			||||||
                                        idTemplate,
 | 
					                                player.sendMessage(message, resolver);
 | 
				
			||||||
                                        ownerTemplate,
 | 
					 | 
				
			||||||
                                        nameTemplate,
 | 
					 | 
				
			||||||
                                        sizeTemplate,
 | 
					 | 
				
			||||||
                                        rightsTemplate
 | 
					 | 
				
			||||||
                                );
 | 
					 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        });
 | 
					                        });
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "sh":
 | 
					            case "sh", "setspawn", "sethome" -> {
 | 
				
			||||||
            case "setspawn":
 | 
					                if (!player.hasPermission(Permission.PERMISSION_CLUSTER_SETHOME)) {
 | 
				
			||||||
            case "sethome": {
 | 
					 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_SETHOME)) {
 | 
					 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_CLUSTER_SETHOME.toString())
 | 
					                            TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_CLUSTER_SETHOME))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (args.length != 1 && args.length != 2) {
 | 
					                if (args.length != 1 && args.length != 2) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Template.of("value", "/plot cluster sethome")
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster sethome")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -816,11 +857,13 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!cluster.hasHelperRights(player.getUUID())) {
 | 
					                if (!cluster.hasHelperRights(player.getUUID())) {
 | 
				
			||||||
                    if (!Permissions
 | 
					                    if (!player.hasPermission(Permission.PERMISSION_CLUSTER_SETHOME_OTHER)) {
 | 
				
			||||||
                            .hasPermission(player, Permission.PERMISSION_CLUSTER_SETHOME_OTHER)) {
 | 
					 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission"),
 | 
					                                TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                                Template.of("node", Permission.PERMISSION_CLUSTER_SETHOME_OTHER.toString())
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "node",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Permission.PERMISSION_CLUSTER_SETHOME_OTHER)
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -839,10 +882,7 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        player.sendMessage(
 | 
					        player.sendMessage(
 | 
				
			||||||
                TranslatableCaption.of("cluster.cluster_available_args"),
 | 
					                TranslatableCaption.of("cluster.cluster_available_args"),
 | 
				
			||||||
                Template.of(
 | 
					                TagResolver.resolver("list", Tag.inserting(ComponentHelper.join(AVAILABLE_ARGS, SEPARATOR)))
 | 
				
			||||||
                        "list",
 | 
					 | 
				
			||||||
                        "<dark_aqua>list</dark_aqua><gray>, </gray><dark_aqua>create</dark_aqua><gray>, </gray><dark_aqua>delete</dark_aqua><gray>, </gray><dark_aqua>resize</dark_aqua><gray>, </gray><dark_aqua>invite</dark_aqua><gray>, </gray><dark_aqua>kick</dark_aqua><gray>, </gray><dark_aqua>leave</dark_aqua><gray>, </gray><dark_aqua>members</dark_aqua><gray>, </gray><dark_aqua>info</dark_aqua><gray>, </gray><dark_aqua>tp</dark_aqua><gray>, </gray><dark_aqua>sethome</dark_aqua>"
 | 
					 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -869,37 +909,37 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
    public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
 | 
					    public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
 | 
				
			||||||
        if (args.length == 1) {
 | 
					        if (args.length == 1) {
 | 
				
			||||||
            final List<String> completions = new LinkedList<>();
 | 
					            final List<String> completions = new LinkedList<>();
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_LIST)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_CLUSTER_LIST)) {
 | 
				
			||||||
                completions.add("list");
 | 
					                completions.add("list");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_CREATE)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_CLUSTER_CREATE)) {
 | 
				
			||||||
                completions.add("create");
 | 
					                completions.add("create");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_DELETE)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_CLUSTER_DELETE)) {
 | 
				
			||||||
                completions.add("delete");
 | 
					                completions.add("delete");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_RESIZE)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE)) {
 | 
				
			||||||
                completions.add("resize");
 | 
					                completions.add("resize");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_INVITE)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_CLUSTER_INVITE)) {
 | 
				
			||||||
                completions.add("invite");
 | 
					                completions.add("invite");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_KICK)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_CLUSTER_KICK)) {
 | 
				
			||||||
                completions.add("kick");
 | 
					                completions.add("kick");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_KICK)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_CLUSTER_KICK)) {
 | 
				
			||||||
                completions.add("leave");
 | 
					                completions.add("leave");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_HELPERS)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_CLUSTER_HELPERS)) {
 | 
				
			||||||
                completions.add("members");
 | 
					                completions.add("members");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_INFO)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_CLUSTER_INFO)) {
 | 
				
			||||||
                completions.add("info");
 | 
					                completions.add("info");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_TP)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_CLUSTER_TP)) {
 | 
				
			||||||
                completions.add("tp");
 | 
					                completions.add("tp");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_SETHOME)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_CLUSTER_SETHOME)) {
 | 
				
			||||||
                completions.add("sethome");
 | 
					                completions.add("sethome");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            final List<Command> commands = completions.stream().filter(completion -> completion
 | 
					            final List<Command> commands = completions.stream().filter(completion -> completion
 | 
				
			||||||
@@ -914,7 +954,7 @@ public class Cluster extends SubCommand {
 | 
				
			|||||||
                            CommandCategory.ADMINISTRATION
 | 
					                            CommandCategory.ADMINISTRATION
 | 
				
			||||||
                    ) {
 | 
					                    ) {
 | 
				
			||||||
                    }).collect(Collectors.toCollection(LinkedList::new));
 | 
					                    }).collect(Collectors.toCollection(LinkedList::new));
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER) && args[0].length() > 0) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_CLUSTER) && args[0].length() > 0) {
 | 
				
			||||||
                commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
					                commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return commands;
 | 
					            return commands;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,9 @@ import com.plotsquared.core.player.PlayerMetaDataKeys;
 | 
				
			|||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskManager;
 | 
					import com.plotsquared.core.util.task.TaskManager;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskTime;
 | 
					import com.plotsquared.core.util.task.TaskTime;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
					import org.checkerframework.checker.nullness.qual.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class CmdConfirm {
 | 
					public class CmdConfirm {
 | 
				
			||||||
@@ -52,9 +54,11 @@ public class CmdConfirm {
 | 
				
			|||||||
        if (commandStr != null) {
 | 
					        if (commandStr != null) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("confirm.requires_confirm"),
 | 
					                    TranslatableCaption.of("confirm.requires_confirm"),
 | 
				
			||||||
                    Template.of("command", commandStr),
 | 
					                    TagResolver.builder()
 | 
				
			||||||
                    Template.of("timeout", String.valueOf(Settings.Confirmation.CONFIRMATION_TIMEOUT_SECONDS)),
 | 
					                            .tag("command", Tag.inserting(Component.text(commandStr)))
 | 
				
			||||||
                    Template.of("value", "/plot confirm")
 | 
					                            .tag("timeout", Tag.inserting(Component.text(Settings.Confirmation.CONFIRMATION_TIMEOUT_SECONDS)))
 | 
				
			||||||
 | 
					                            .tag("value", Tag.inserting(Component.text("/plot confirm")))
 | 
				
			||||||
 | 
					                            .build()
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        TaskManager.runTaskLater(() -> {
 | 
					        TaskManager.runTaskLater(() -> {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,13 +25,14 @@ import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
				
			|||||||
import com.plotsquared.core.permissions.PermissionHolder;
 | 
					import com.plotsquared.core.permissions.PermissionHolder;
 | 
				
			||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
import com.plotsquared.core.util.MathMan;
 | 
					import com.plotsquared.core.util.MathMan;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.StringComparison;
 | 
					import com.plotsquared.core.util.StringComparison;
 | 
				
			||||||
import com.plotsquared.core.util.StringMan;
 | 
					import com.plotsquared.core.util.StringMan;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal2;
 | 
					import com.plotsquared.core.util.task.RunnableVal2;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal3;
 | 
					import com.plotsquared.core.util.task.RunnableVal3;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
 | 
					import net.kyori.adventure.text.minimessage.MiniMessage;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
					import org.checkerframework.checker.nullness.qual.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.lang.reflect.InvocationTargetException;
 | 
					import java.lang.reflect.InvocationTargetException;
 | 
				
			||||||
@@ -256,10 +257,14 @@ public abstract class Command {
 | 
				
			|||||||
            max = c.size();
 | 
					            max = c.size();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        // Send the header
 | 
					        // Send the header
 | 
				
			||||||
        Template curTemplate = Template.of("cur", String.valueOf(page + 1));
 | 
					        player.sendMessage(
 | 
				
			||||||
        Template maxTemplate = Template.of("max", String.valueOf(totalPages + 1));
 | 
					                header,
 | 
				
			||||||
        Template amountTemplate = Template.of("amount", String.valueOf(c.size()));
 | 
					                TagResolver.builder()
 | 
				
			||||||
        player.sendMessage(header, curTemplate, maxTemplate, amountTemplate);
 | 
					                        .tag("cur", Tag.inserting(Component.text(page + 1)))
 | 
				
			||||||
 | 
					                        .tag("max", Tag.inserting(Component.text(totalPages + 1)))
 | 
				
			||||||
 | 
					                        .tag("amount", Tag.inserting(Component.text(c.size())))
 | 
				
			||||||
 | 
					                        .build()
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
        // Send the page content
 | 
					        // Send the page content
 | 
				
			||||||
        List<T> subList = c.subList(page * size, max);
 | 
					        List<T> subList = c.subList(page * size, max);
 | 
				
			||||||
        int i = page * size;
 | 
					        int i = page * size;
 | 
				
			||||||
@@ -267,13 +272,24 @@ public abstract class Command {
 | 
				
			|||||||
            i++;
 | 
					            i++;
 | 
				
			||||||
            final CaptionHolder msg = new CaptionHolder();
 | 
					            final CaptionHolder msg = new CaptionHolder();
 | 
				
			||||||
            add.run(i, obj, msg);
 | 
					            add.run(i, obj, msg);
 | 
				
			||||||
            player.sendMessage(msg.get(), msg.getTemplates());
 | 
					            player.sendMessage(msg.get(), msg.getTagResolvers());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        // Send the footer
 | 
					        // Send the footer
 | 
				
			||||||
        Template command1 = Template.of("command1", baseCommand + " " + page);
 | 
					        player.sendMessage(
 | 
				
			||||||
        Template command2 = Template.of("command2", baseCommand + " " + (page + 2));
 | 
					                TranslatableCaption.of("list.page_turn"),
 | 
				
			||||||
        Template clickable = Template.of("clickable", TranslatableCaption.of("list.clickable").getComponent(player));
 | 
					                TagResolver.builder()
 | 
				
			||||||
        player.sendMessage(TranslatableCaption.of("list.page_turn"), command1, command2, clickable);
 | 
					                        .tag("cur", Tag.inserting(Component.text(page + 1)))
 | 
				
			||||||
 | 
					                        .tag(
 | 
				
			||||||
 | 
					                                "command1",
 | 
				
			||||||
 | 
					                                Tag.preProcessParsed(baseCommand + " " + page)
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                        .tag("command2", Tag.preProcessParsed(baseCommand + " " + (page + 2)))
 | 
				
			||||||
 | 
					                        .tag(
 | 
				
			||||||
 | 
					                                "clickable",
 | 
				
			||||||
 | 
					                                Tag.inserting(TranslatableCaption.of("list.clickable").toComponent(player))
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                        .build()
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@@ -325,7 +341,7 @@ public abstract class Command {
 | 
				
			|||||||
            if (commands.isEmpty()) {
 | 
					            if (commands.isEmpty()) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("commandconfig.did_you_mean"),
 | 
					                        TranslatableCaption.of("commandconfig.did_you_mean"),
 | 
				
			||||||
                        Template.of("value", MainCommand.getInstance().help.getUsage())
 | 
					                        TagResolver.resolver("value", Tag.inserting(Component.text(MainCommand.getInstance().help.getUsage())))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return CompletableFuture.completedFuture(false);
 | 
					                return CompletableFuture.completedFuture(false);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -346,7 +362,7 @@ public abstract class Command {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("commandconfig.did_you_mean"),
 | 
					                    TranslatableCaption.of("commandconfig.did_you_mean"),
 | 
				
			||||||
                    Template.of("value", cmd.getUsage())
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text(cmd.getUsage())))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return CompletableFuture.completedFuture(false);
 | 
					            return CompletableFuture.completedFuture(false);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -381,7 +397,7 @@ public abstract class Command {
 | 
				
			|||||||
                // TODO improve or remove the Argument system
 | 
					                // TODO improve or remove the Argument system
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                        TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                        Template.of("value", StringMan.join(fullSplit, " "))
 | 
					                        TagResolver.resolver("value", Tag.inserting(Component.text(StringMan.join(fullSplit, " "))))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -466,11 +482,11 @@ public abstract class Command {
 | 
				
			|||||||
            if (message) {
 | 
					            if (message) {
 | 
				
			||||||
                player.sendMessage(this.required.getErrorMessage());
 | 
					                player.sendMessage(this.required.getErrorMessage());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else if (!Permissions.hasPermission(player, getPermission())) {
 | 
					        } else if (!player.hasPermission(getPermission())) {
 | 
				
			||||||
            if (message) {
 | 
					            if (message) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission"),
 | 
					                        TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                        Template.of("node", getPermission())
 | 
					                        TagResolver.resolver("node", Tag.inserting(Component.text(getPermission())))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
@@ -495,7 +511,7 @@ public abstract class Command {
 | 
				
			|||||||
    public void sendUsage(PlotPlayer<?> player) {
 | 
					    public void sendUsage(PlotPlayer<?> player) {
 | 
				
			||||||
        player.sendMessage(
 | 
					        player.sendMessage(
 | 
				
			||||||
                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                Template.of("value", getUsage())
 | 
					                TagResolver.resolver("value", Tag.inserting(Component.text(getUsage())))
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -543,9 +559,10 @@ public abstract class Command {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
 | 
					    public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
 | 
				
			||||||
        switch (args.length) {
 | 
					        switch (args.length) {
 | 
				
			||||||
            case 0:
 | 
					            case 0 -> {
 | 
				
			||||||
                return this.allCommands;
 | 
					                return this.allCommands;
 | 
				
			||||||
            case 1:
 | 
					            }
 | 
				
			||||||
 | 
					            case 1 -> {
 | 
				
			||||||
                String arg = args[0].toLowerCase();
 | 
					                String arg = args[0].toLowerCase();
 | 
				
			||||||
                if (space) {
 | 
					                if (space) {
 | 
				
			||||||
                    Command cmd = getCommand(arg);
 | 
					                    Command cmd = getCommand(arg);
 | 
				
			||||||
@@ -564,7 +581,8 @@ public abstract class Command {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    return commands;
 | 
					                    return commands;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            default:
 | 
					            }
 | 
				
			||||||
 | 
					            default -> {
 | 
				
			||||||
                Command cmd = getCommand(args[0]);
 | 
					                Command cmd = getCommand(args[0]);
 | 
				
			||||||
                if (cmd != null) {
 | 
					                if (cmd != null) {
 | 
				
			||||||
                    return cmd.tab(player, Arrays.copyOfRange(args, 1, args.length), space);
 | 
					                    return cmd.tab(player, Arrays.copyOfRange(args, 1, args.length), space);
 | 
				
			||||||
@@ -573,6 +591,7 @@ public abstract class Command {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public String toString() {
 | 
					    public String toString() {
 | 
				
			||||||
@@ -599,13 +618,13 @@ public abstract class Command {
 | 
				
			|||||||
        return this.getFullId().hashCode();
 | 
					        return this.getFullId().hashCode();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void checkTrue(boolean mustBeTrue, Caption message, Template... args) {
 | 
					    public void checkTrue(boolean mustBeTrue, Caption message, TagResolver... args) {
 | 
				
			||||||
        if (!mustBeTrue) {
 | 
					        if (!mustBeTrue) {
 | 
				
			||||||
            throw new CommandException(message, args);
 | 
					            throw new CommandException(message, args);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public <T> T check(T object, Caption message, Template... args) {
 | 
					    public <T> T check(T object, Caption message, TagResolver... args) {
 | 
				
			||||||
        if (object == null) {
 | 
					        if (object == null) {
 | 
				
			||||||
            throw new CommandException(message, args);
 | 
					            throw new CommandException(message, args);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -621,10 +640,10 @@ public abstract class Command {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public static class CommandException extends RuntimeException {
 | 
					    public static class CommandException extends RuntimeException {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private final Template[] args;
 | 
					 | 
				
			||||||
        private final Caption message;
 | 
					        private final Caption message;
 | 
				
			||||||
 | 
					        private final TagResolver[] args;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public CommandException(final @Nullable Caption message, final Template... args) {
 | 
					        public CommandException(final @Nullable Caption message, final TagResolver... args) {
 | 
				
			||||||
            this.message = message;
 | 
					            this.message = message;
 | 
				
			||||||
            this.args = args;
 | 
					            this.args = args;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,7 @@
 | 
				
			|||||||
package com.plotsquared.core.command;
 | 
					package com.plotsquared.core.command;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.plotsquared.core.configuration.caption.Caption;
 | 
					import com.plotsquared.core.configuration.caption.Caption;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -34,7 +34,7 @@ public interface CommandCaller {
 | 
				
			|||||||
     * @param caption      Caption to send
 | 
					     * @param caption      Caption to send
 | 
				
			||||||
     * @param replacements Variable replacements
 | 
					     * @param replacements Variable replacements
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    void sendMessage(@NonNull Caption caption, @NonNull Template... replacements);
 | 
					    void sendMessage(@NonNull Caption caption, @NonNull TagResolver... replacements);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Check the player's permissions. <i>Will be cached if permission caching is enabled.</i>
 | 
					     * Check the player's permissions. <i>Will be cached if permission caching is enabled.</i>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,10 @@ import com.plotsquared.core.configuration.caption.Caption;
 | 
				
			|||||||
import com.plotsquared.core.configuration.caption.LocaleHolder;
 | 
					import com.plotsquared.core.configuration.caption.LocaleHolder;
 | 
				
			||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
					import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
				
			||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.MiniMessage;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.NotNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * CommandCategory.
 | 
					 * CommandCategory.
 | 
				
			||||||
@@ -80,7 +83,7 @@ public enum CommandCategory implements Caption {
 | 
				
			|||||||
    // TODO this method shouldn't be invoked
 | 
					    // TODO this method shouldn't be invoked
 | 
				
			||||||
    @Deprecated
 | 
					    @Deprecated
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public String toString() {
 | 
					    public @NotNull String toString() {
 | 
				
			||||||
        return this.caption.getComponent(LocaleHolder.console());
 | 
					        return this.caption.getComponent(LocaleHolder.console());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -90,6 +93,11 @@ public enum CommandCategory implements Caption {
 | 
				
			|||||||
        return this.caption.getComponent(localeHolder);
 | 
					        return this.caption.getComponent(localeHolder);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public @NonNull Component toComponent(@NonNull final LocaleHolder localeHolder) {
 | 
				
			||||||
 | 
					        return MiniMessage.miniMessage().deserialize(getComponent(localeHolder));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Checks if a player has access to this command category
 | 
					     * Checks if a player has access to this command category
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
@@ -101,4 +109,5 @@ public enum CommandCategory implements Caption {
 | 
				
			|||||||
        return !MainCommand.getInstance().getCommands(this, player).isEmpty();
 | 
					        return !MainCommand.getInstance().getCommands(this, player).isEmpty();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,9 @@ import com.plotsquared.core.plot.comment.CommentInbox;
 | 
				
			|||||||
import com.plotsquared.core.plot.comment.CommentManager;
 | 
					import com.plotsquared.core.plot.comment.CommentManager;
 | 
				
			||||||
import com.plotsquared.core.plot.comment.PlotComment;
 | 
					import com.plotsquared.core.plot.comment.PlotComment;
 | 
				
			||||||
import com.plotsquared.core.util.StringMan;
 | 
					import com.plotsquared.core.util.StringMan;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Arrays;
 | 
					import java.util.Arrays;
 | 
				
			||||||
import java.util.Locale;
 | 
					import java.util.Locale;
 | 
				
			||||||
@@ -44,8 +46,10 @@ public class Comment extends SubCommand {
 | 
				
			|||||||
        if (args.length < 2) {
 | 
					        if (args.length < 2) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("comment.comment_syntax"),
 | 
					                    TranslatableCaption.of("comment.comment_syntax"),
 | 
				
			||||||
                    Template.of("command", "/plot comment [X;Z]"),
 | 
					                    TagResolver.builder()
 | 
				
			||||||
                    Template.of("list", StringMan.join(CommentManager.inboxes.keySet(), "|"))
 | 
					                            .tag("command", Tag.inserting(Component.text("/plot comment [X;Z]")))
 | 
				
			||||||
 | 
					                            .tag("list", Tag.inserting(Component.text(StringMan.join(CommentManager.inboxes.keySet(), "|"))))
 | 
				
			||||||
 | 
					                            .build()
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -64,8 +68,10 @@ public class Comment extends SubCommand {
 | 
				
			|||||||
            if (args.length < 3) {
 | 
					            if (args.length < 3) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("comment.comment_syntax"),
 | 
					                        TranslatableCaption.of("comment.comment_syntax"),
 | 
				
			||||||
                        Template.of("command", "/plot comment [X;Z]"),
 | 
					                        TagResolver.builder()
 | 
				
			||||||
                        Template.of("list", StringMan.join(CommentManager.inboxes.keySet(), "|"))
 | 
					                                .tag("command", Tag.inserting(Component.text("/plot comment [X;Z]")))
 | 
				
			||||||
 | 
					                                .tag("list", Tag.inserting(Component.text(StringMan.join(CommentManager.inboxes.keySet(), "|"))))
 | 
				
			||||||
 | 
					                                .build()
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -76,8 +82,10 @@ public class Comment extends SubCommand {
 | 
				
			|||||||
        if (inbox == null) {
 | 
					        if (inbox == null) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("comment.comment_syntax"),
 | 
					                    TranslatableCaption.of("comment.comment_syntax"),
 | 
				
			||||||
                    Template.of("command", "/plot comment [X;Z]"),
 | 
					                    TagResolver.builder()
 | 
				
			||||||
                    Template.of("list", StringMan.join(CommentManager.inboxes.keySet(), "|"))
 | 
					                            .tag("command", Tag.inserting(Component.text("/plot comment [X;Z]")))
 | 
				
			||||||
 | 
					                            .tag("list", Tag.inserting(Component.text(StringMan.join(CommentManager.inboxes.keySet(), "|"))))
 | 
				
			||||||
 | 
					                            .build()
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -97,8 +105,10 @@ public class Comment extends SubCommand {
 | 
				
			|||||||
            player.sendMessage(TranslatableCaption.of("comment.no_plot_inbox"));
 | 
					            player.sendMessage(TranslatableCaption.of("comment.no_plot_inbox"));
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("comment.comment_syntax"),
 | 
					                    TranslatableCaption.of("comment.comment_syntax"),
 | 
				
			||||||
                    Template.of("command", "/plot comment [X;Z]"),
 | 
					                    TagResolver.builder()
 | 
				
			||||||
                    Template.of("list", StringMan.join(CommentManager.inboxes.keySet(), "|"))
 | 
					                            .tag("command", Tag.inserting(Component.text("/plot comment [X;Z]")))
 | 
				
			||||||
 | 
					                            .tag("list", Tag.inserting(Component.text(StringMan.join(CommentManager.inboxes.keySet(), "|"))))
 | 
				
			||||||
 | 
					                            .build()
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,9 @@ import com.plotsquared.core.util.MathMan;
 | 
				
			|||||||
import com.plotsquared.core.util.WorldUtil;
 | 
					import com.plotsquared.core.util.WorldUtil;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskManager;
 | 
					import com.plotsquared.core.util.task.TaskManager;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskTime;
 | 
					import com.plotsquared.core.util.task.TaskTime;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
@@ -68,7 +70,9 @@ public class Condense extends SubCommand {
 | 
				
			|||||||
        if (args.length != 2 && args.length != 3) {
 | 
					        if (args.length != 2 && args.length != 3) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                    Template.of("value", "/plot condense <area> <start | stop | info> [radius]")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text(
 | 
				
			||||||
 | 
					                            "/plot condense <area> <start | stop | info> [radius]"
 | 
				
			||||||
 | 
					                    )))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -82,7 +86,10 @@ public class Condense extends SubCommand {
 | 
				
			|||||||
                if (args.length == 2) {
 | 
					                if (args.length == 2) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Template.of("value", "/plot condense" + area + " start <radius>")
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "value",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Component.text("/plot condense" + area + " start " + "<radius>"))
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -181,8 +188,10 @@ public class Condense extends SubCommand {
 | 
				
			|||||||
                                    if (result.get()) {
 | 
					                                    if (result.get()) {
 | 
				
			||||||
                                        player.sendMessage(
 | 
					                                        player.sendMessage(
 | 
				
			||||||
                                                TranslatableCaption.of("condense.moving"),
 | 
					                                                TranslatableCaption.of("condense.moving"),
 | 
				
			||||||
                                                Template.of("origin", String.valueOf(origin)),
 | 
					                                                TagResolver.builder()
 | 
				
			||||||
                                                Template.of("possible", String.valueOf(possible))
 | 
					                                                        .tag("origin", Tag.inserting(Component.text(origin.toString())))
 | 
				
			||||||
 | 
					                                                        .tag("possible", Tag.inserting(Component.text(possible.toString())))
 | 
				
			||||||
 | 
					                                                        .build()
 | 
				
			||||||
                                        );
 | 
					                                        );
 | 
				
			||||||
                                        TaskManager.runTaskLater(task, TaskTime.ticks(1L));
 | 
					                                        TaskManager.runTaskLater(task, TaskTime.ticks(1L));
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
@@ -202,7 +211,7 @@ public class Condense extends SubCommand {
 | 
				
			|||||||
                        if (i >= free.size()) {
 | 
					                        if (i >= free.size()) {
 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("condense.skipping"),
 | 
					                                    TranslatableCaption.of("condense.skipping"),
 | 
				
			||||||
                                    Template.of("plot", String.valueOf(origin))
 | 
					                                    TagResolver.resolver("plot", Tag.inserting(Component.text(origin.toString())))
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -223,7 +232,10 @@ public class Condense extends SubCommand {
 | 
				
			|||||||
                if (args.length == 2) {
 | 
					                if (args.length == 2) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Template.of("value", "/plot condense " + area + " info <radius>")
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                    "value",
 | 
				
			||||||
 | 
					                                    Tag.inserting(Component.text("/plot condense " + area + " info <radius>"))
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -244,20 +256,20 @@ public class Condense extends SubCommand {
 | 
				
			|||||||
                player.sendMessage(TranslatableCaption.of("condense.default_eval"));
 | 
					                player.sendMessage(TranslatableCaption.of("condense.default_eval"));
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("condense.minimum_radius"),
 | 
					                        TranslatableCaption.of("condense.minimum_radius"),
 | 
				
			||||||
                        Template.of("minimumRadius", String.valueOf(minimumRadius))
 | 
					                        TagResolver.resolver("minimumRadius", Tag.inserting(Component.text(minimumRadius)))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("condense.minimum_radius"),
 | 
					                        TranslatableCaption.of("condense.maximum_moved"),
 | 
				
			||||||
                        Template.of("maxMove", String.valueOf(maxMove))
 | 
					                        TagResolver.resolver("maxMove", Tag.inserting(Component.text(maxMove)))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                player.sendMessage(TranslatableCaption.of("condense.input_eval"));
 | 
					                player.sendMessage(TranslatableCaption.of("condense.input_eval"));
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("condense.input_radius"),
 | 
					                        TranslatableCaption.of("condense.input_radius"),
 | 
				
			||||||
                        Template.of("radius", String.valueOf(radius))
 | 
					                        TagResolver.resolver("radius", Tag.inserting(Component.text(radius)))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("condense.estimated_moves"),
 | 
					                        TranslatableCaption.of("condense.estimated_moves"),
 | 
				
			||||||
                        Template.of("userMove", String.valueOf(userMove))
 | 
					                        TagResolver.resolver("userMove", Tag.inserting(Component.text(userMove)))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                player.sendMessage(TranslatableCaption.of("condense.eta"));
 | 
					                player.sendMessage(TranslatableCaption.of("condense.eta"));
 | 
				
			||||||
                player.sendMessage(TranslatableCaption.of("condense.radius_measured"));
 | 
					                player.sendMessage(TranslatableCaption.of("condense.radius_measured"));
 | 
				
			||||||
@@ -266,7 +278,10 @@ public class Condense extends SubCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        player.sendMessage(
 | 
					        player.sendMessage(
 | 
				
			||||||
                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                Template.of("value", "/plot condense " + area.getWorldName() + " <start | stop | info> [radius]")
 | 
					                TagResolver.resolver(
 | 
				
			||||||
 | 
					                        "value",
 | 
				
			||||||
 | 
					                        Tag.inserting(Component.text("/plot condense " + area.getWorldName() + " <start | stop | info> [radius]"))
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,8 +29,9 @@ import com.plotsquared.core.plot.Plot;
 | 
				
			|||||||
import com.plotsquared.core.plot.flag.PlotFlag;
 | 
					import com.plotsquared.core.plot.flag.PlotFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@CommandDeclaration(command = "continue",
 | 
					@CommandDeclaration(command = "continue",
 | 
				
			||||||
@@ -53,11 +54,12 @@ public class Continue extends SubCommand {
 | 
				
			|||||||
            player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
 | 
					            player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!plot.isOwner(player.getUUID()) && !Permissions
 | 
					        if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_CONTINUE)) {
 | 
				
			||||||
                .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_CONTINUE)) {
 | 
					 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.no_permission"),
 | 
					                    TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                    Template.of("node", TranslatableCaption.of("permission.no_plot_perms").getComponent(player))
 | 
					                    TagResolver.resolver("node", Tag.inserting(
 | 
				
			||||||
 | 
					                            TranslatableCaption.of("permission.no_plot_perms").toComponent(player)
 | 
				
			||||||
 | 
					                    ))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -70,7 +72,7 @@ public class Continue extends SubCommand {
 | 
				
			|||||||
                < player.getPlotCount() + size)) {
 | 
					                < player.getPlotCount() + size)) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
					                    TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
				
			||||||
                    Template.of("amount", String.valueOf(player.getAllowedPlots()))
 | 
					                    TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -84,7 +86,7 @@ public class Continue extends SubCommand {
 | 
				
			|||||||
        if (event.getEventResult() == Result.DENY) {
 | 
					        if (event.getEventResult() == Result.DENY) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("events.event_denied"),
 | 
					                    TranslatableCaption.of("events.event_denied"),
 | 
				
			||||||
                    Template.of("value", "Done flag removal")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("Done flag removal")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,8 +23,9 @@ import com.plotsquared.core.location.Location;
 | 
				
			|||||||
import com.plotsquared.core.permissions.Permission;
 | 
					import com.plotsquared.core.permissions.Permission;
 | 
				
			||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
import com.plotsquared.core.plot.Plot;
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@CommandDeclaration(command = "copy",
 | 
					@CommandDeclaration(command = "copy",
 | 
				
			||||||
        permission = "plots.copy",
 | 
					        permission = "plots.copy",
 | 
				
			||||||
@@ -42,15 +43,14 @@ public class Copy extends SubCommand {
 | 
				
			|||||||
            player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
 | 
					            player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!plot1.isOwner(player.getUUID()) && !Permissions
 | 
					        if (!plot1.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN.toString())) {
 | 
				
			||||||
                .hasPermission(player, Permission.PERMISSION_ADMIN.toString())) {
 | 
					 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
 | 
					            player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (args.length != 1) {
 | 
					        if (args.length != 1) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                    Template.of("value", "/plot copy <X;Z>")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("/plot copy <X;Z>")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -69,8 +69,12 @@ public class Copy extends SubCommand {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        plot1.getPlotModificationManager().copy(plot2, player).thenAccept(result -> {
 | 
					        plot1.getPlotModificationManager().copy(plot2, player).thenAccept(result -> {
 | 
				
			||||||
            if (result) {
 | 
					            if (result) {
 | 
				
			||||||
                player.sendMessage(TranslatableCaption.of("move.copy_success"), Template.of("origin", String.valueOf(plot1)),
 | 
					                player.sendMessage(
 | 
				
			||||||
                        Template.of("target", String.valueOf(plot2))
 | 
					                        TranslatableCaption.of("move.copy_success"),
 | 
				
			||||||
 | 
					                        TagResolver.builder()
 | 
				
			||||||
 | 
					                                .tag("origin", Tag.inserting(Component.text(plot1.toString())))
 | 
				
			||||||
 | 
					                                .tag("target", Tag.inserting(Component.text(plot2.toString())))
 | 
				
			||||||
 | 
					                                .build()
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                player.sendMessage(TranslatableCaption.of("move.requires_unowned"));
 | 
					                player.sendMessage(TranslatableCaption.of("move.requires_unowned"));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,9 @@ import com.plotsquared.core.generator.HybridUtils;
 | 
				
			|||||||
import com.plotsquared.core.location.Location;
 | 
					import com.plotsquared.core.location.Location;
 | 
				
			||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
import com.plotsquared.core.plot.Plot;
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@CommandDeclaration(command = "createroadschematic",
 | 
					@CommandDeclaration(command = "createroadschematic",
 | 
				
			||||||
@@ -61,7 +63,7 @@ public class CreateRoadSchematic extends SubCommand {
 | 
				
			|||||||
        this.hybridUtils.setupRoadSchematic(plot);
 | 
					        this.hybridUtils.setupRoadSchematic(plot);
 | 
				
			||||||
        player.sendMessage(
 | 
					        player.sendMessage(
 | 
				
			||||||
                TranslatableCaption.of("schematics.schematic_road_created"),
 | 
					                TranslatableCaption.of("schematics.schematic_road_created"),
 | 
				
			||||||
                Template.of("command", "/plot debugroadregen")
 | 
					                TagResolver.resolver("command", Tag.inserting(Component.text("/plot debugroadregen")))
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,7 +40,9 @@ import com.plotsquared.core.util.EventDispatcher;
 | 
				
			|||||||
import com.plotsquared.core.util.FileUtils;
 | 
					import com.plotsquared.core.util.FileUtils;
 | 
				
			||||||
import com.plotsquared.core.util.query.PlotQuery;
 | 
					import com.plotsquared.core.util.query.PlotQuery;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskManager;
 | 
					import com.plotsquared.core.util.task.TaskManager;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.File;
 | 
					import java.io.File;
 | 
				
			||||||
@@ -101,7 +103,10 @@ public class DatabaseCommand extends SubCommand {
 | 
				
			|||||||
        if (args.length < 1) {
 | 
					        if (args.length < 1) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                    Template.of("value", "/plot database [area] <sqlite | mysql | import>")
 | 
					                    TagResolver.resolver(
 | 
				
			||||||
 | 
					                            "value",
 | 
				
			||||||
 | 
					                            Tag.inserting(Component.text("/plot database [area] <sqlite | mysql | import>"))
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -116,7 +121,7 @@ public class DatabaseCommand extends SubCommand {
 | 
				
			|||||||
        if (args.length < 1) {
 | 
					        if (args.length < 1) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                    Template.of("value", "/plot database [area] <sqlite|mysql|import>")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("/plot database [area] <sqlite|mysql|import>")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("database.arg"));
 | 
					            player.sendMessage(TranslatableCaption.of("database.arg"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
@@ -129,7 +134,10 @@ public class DatabaseCommand extends SubCommand {
 | 
				
			|||||||
                    if (args.length < 2) {
 | 
					                    if (args.length < 2) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                                Template.of("value", "/plot database import <sqlite file> [prefix]")
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "value",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Component.text("/plot database import <sqlite file> [prefix]"))
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -140,7 +148,7 @@ public class DatabaseCommand extends SubCommand {
 | 
				
			|||||||
                    if (!file.exists()) {
 | 
					                    if (!file.exists()) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("database.does_not_exist"),
 | 
					                                TranslatableCaption.of("database.does_not_exist"),
 | 
				
			||||||
                                Template.of("value", String.valueOf(file))
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text(file.toString())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -184,8 +192,10 @@ public class DatabaseCommand extends SubCommand {
 | 
				
			|||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
                                    player.sendMessage(
 | 
					                                    player.sendMessage(
 | 
				
			||||||
                                            TranslatableCaption.of("database.skipping_duplicated_plot"),
 | 
					                                            TranslatableCaption.of("database.skipping_duplicated_plot"),
 | 
				
			||||||
                                            Template.of("plot", String.valueOf(plot)),
 | 
					                                            TagResolver.builder()
 | 
				
			||||||
                                            Template.of("id", String.valueOf(plot.temp))
 | 
					                                                    .tag("plot", Tag.inserting(Component.text(plot.toString())))
 | 
				
			||||||
 | 
					                                                    .tag("id", Tag.inserting(Component.text(plot.temp)))
 | 
				
			||||||
 | 
					                                                    .build()
 | 
				
			||||||
                                    );
 | 
					                                    );
 | 
				
			||||||
                                    continue;
 | 
					                                    continue;
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,12 +29,12 @@ import com.plotsquared.core.util.WorldUtil;
 | 
				
			|||||||
import com.plotsquared.core.util.entity.EntityCategories;
 | 
					import com.plotsquared.core.util.entity.EntityCategories;
 | 
				
			||||||
import com.plotsquared.core.util.entity.EntityCategory;
 | 
					import com.plotsquared.core.util.entity.EntityCategory;
 | 
				
			||||||
import com.plotsquared.core.util.query.PlotQuery;
 | 
					import com.plotsquared.core.util.query.PlotQuery;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskManager;
 | 
					 | 
				
			||||||
import com.plotsquared.core.uuid.UUIDMapping;
 | 
					import com.plotsquared.core.uuid.UUIDMapping;
 | 
				
			||||||
import com.sk89q.worldedit.world.entity.EntityType;
 | 
					import com.sk89q.worldedit.world.entity.EntityType;
 | 
				
			||||||
import net.kyori.adventure.text.Component;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
import net.kyori.adventure.text.TextComponent;
 | 
					import net.kyori.adventure.text.TextComponent;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
@@ -68,7 +68,10 @@ public class Debug extends SubCommand {
 | 
				
			|||||||
        if (args.length == 0) {
 | 
					        if (args.length == 0) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                    Template.of("value", "/plot debug <loadedchunks | player | debug-players | entitytypes | msg>")
 | 
					                    TagResolver.resolver(
 | 
				
			||||||
 | 
					                            "value",
 | 
				
			||||||
 | 
					                            Tag.inserting(Component.text("/plot debug <player | debug-players | entitytypes | msg>"))
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (args.length > 0) {
 | 
					        if (args.length > 0) {
 | 
				
			||||||
@@ -81,21 +84,11 @@ public class Debug extends SubCommand {
 | 
				
			|||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (args.length > 0 && "loadedchunks".equalsIgnoreCase(args[0])) {
 | 
					 | 
				
			||||||
            final long start = System.currentTimeMillis();
 | 
					 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("debug.fetching_loaded_chunks"));
 | 
					 | 
				
			||||||
            TaskManager.runTaskAsync(() -> player.sendMessage(StaticCaption
 | 
					 | 
				
			||||||
                    .of("Loaded chunks: " + this.worldUtil
 | 
					 | 
				
			||||||
                            .getChunkChunks(player.getLocation().getWorldName())
 | 
					 | 
				
			||||||
                            .size() + " (" + (System.currentTimeMillis()
 | 
					 | 
				
			||||||
                            - start) + "ms) using thread: " + Thread.currentThread().getName())));
 | 
					 | 
				
			||||||
            return true;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (args.length > 0 && "uuids".equalsIgnoreCase(args[0])) {
 | 
					        if (args.length > 0 && "uuids".equalsIgnoreCase(args[0])) {
 | 
				
			||||||
            final Collection<UUIDMapping> mappings = PlotSquared.get().getImpromptuUUIDPipeline().getAllImmediately();
 | 
					            final Collection<UUIDMapping> mappings = PlotSquared.get().getImpromptuUUIDPipeline().getAllImmediately();
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("debug.cached_uuids"),
 | 
					                    TranslatableCaption.of("debug.cached_uuids"),
 | 
				
			||||||
                    Template.of("value", String.valueOf(mappings.size()))
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text(mappings.size())))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -104,7 +97,7 @@ public class Debug extends SubCommand {
 | 
				
			|||||||
            for (final PlotPlayer<?> pp : PlotPlayer.getDebugModePlayers()) {
 | 
					            for (final PlotPlayer<?> pp : PlotPlayer.getDebugModePlayers()) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("debug.player_in_debugmode_list"),
 | 
					                        TranslatableCaption.of("debug.player_in_debugmode_list"),
 | 
				
			||||||
                        Template.of("value", pp.getName())
 | 
					                        TagResolver.resolver("value", Tag.inserting(Component.text(pp.getName())))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
@@ -114,10 +107,11 @@ public class Debug extends SubCommand {
 | 
				
			|||||||
            player.sendMessage(TranslatableCaption.of("debug.entity_categories"));
 | 
					            player.sendMessage(TranslatableCaption.of("debug.entity_categories"));
 | 
				
			||||||
            EntityCategory.REGISTRY.forEach(category -> {
 | 
					            EntityCategory.REGISTRY.forEach(category -> {
 | 
				
			||||||
                final StringBuilder builder =
 | 
					                final StringBuilder builder =
 | 
				
			||||||
                        new StringBuilder("§7- §6").append(category.getId()).append("§7: §6");
 | 
					                        new StringBuilder("<gray>-</gray> <gold>").append(category.getId()).append("</gold><gray>: <gold>");
 | 
				
			||||||
                for (final EntityType entityType : category.getAll()) {
 | 
					                for (final EntityType entityType : category.getAll()) {
 | 
				
			||||||
                    builder.append(entityType.getId()).append(" ");
 | 
					                    builder.append(entityType.getId()).append(" ");
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                builder.append("</gold>");
 | 
				
			||||||
                player.sendMessage(StaticCaption.of("<prefix>" + builder));
 | 
					                player.sendMessage(StaticCaption.of("<prefix>" + builder));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            EntityType.REGISTRY.values().stream().sorted(Comparator.comparing(EntityType::getId))
 | 
					            EntityType.REGISTRY.values().stream().sorted(Comparator.comparing(EntityType::getId))
 | 
				
			||||||
@@ -137,28 +131,53 @@ public class Debug extends SubCommand {
 | 
				
			|||||||
                .getCaptionMap(TranslatableCaption.DEFAULT_NAMESPACE)
 | 
					                .getCaptionMap(TranslatableCaption.DEFAULT_NAMESPACE)
 | 
				
			||||||
                .getCaptions();
 | 
					                .getCaptions();
 | 
				
			||||||
        TextComponent.Builder information = Component.text();
 | 
					        TextComponent.Builder information = Component.text();
 | 
				
			||||||
        Component header = MINI_MESSAGE.parse(TranslatableCaption.of("debug.debug_header").getComponent(player) + "\n");
 | 
					        Component header = TranslatableCaption.of("debug.debug_header").toComponent(player)
 | 
				
			||||||
 | 
					                .append(Component.newline());
 | 
				
			||||||
        String line = TranslatableCaption.of("debug.debug_line").getComponent(player) + "\n";
 | 
					        String line = TranslatableCaption.of("debug.debug_line").getComponent(player) + "\n";
 | 
				
			||||||
        String section = TranslatableCaption.of("debug.debug_section").getComponent(player) + "\n";
 | 
					        String section = TranslatableCaption.of("debug.debug_section").getComponent(player) + "\n";
 | 
				
			||||||
        information.append(header);
 | 
					        information.append(header);
 | 
				
			||||||
        information.append(MINI_MESSAGE.parse(section, Template.of("val", "PlotArea")));
 | 
					        information.append(MINI_MESSAGE.deserialize(
 | 
				
			||||||
 | 
					                section,
 | 
				
			||||||
 | 
					                TagResolver.resolver("val", Tag.inserting(Component.text("PlotArea")))
 | 
				
			||||||
 | 
					        ));
 | 
				
			||||||
        information.append(MINI_MESSAGE
 | 
					        information.append(MINI_MESSAGE
 | 
				
			||||||
                .parse(
 | 
					                .deserialize(
 | 
				
			||||||
                        line,
 | 
					                        line,
 | 
				
			||||||
                        Template.of("var", "Plot Worlds"),
 | 
					                        TagResolver.builder()
 | 
				
			||||||
                        Template.of("val", StringMan.join(this.plotAreaManager.getAllPlotAreas(), ", "))
 | 
					                                .tag("var", Tag.inserting(Component.text("Plot Worlds")))
 | 
				
			||||||
 | 
					                                .tag(
 | 
				
			||||||
 | 
					                                        "val",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Component.text(StringMan.join(
 | 
				
			||||||
 | 
					                                                this.plotAreaManager.getAllPlotAreas(),
 | 
				
			||||||
 | 
					                                                ", "
 | 
				
			||||||
 | 
					                                        )))
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
 | 
					                                .build()
 | 
				
			||||||
                ));
 | 
					                ));
 | 
				
			||||||
        information.append(
 | 
					        information.append(
 | 
				
			||||||
                MINI_MESSAGE.parse(
 | 
					                MINI_MESSAGE.deserialize(
 | 
				
			||||||
                        line,
 | 
					                        line,
 | 
				
			||||||
                        Template.of("var", "Owned Plots"),
 | 
					                        TagResolver.builder()
 | 
				
			||||||
                        Template.of("val", String.valueOf(PlotQuery.newQuery().allPlots().count()))
 | 
					                                .tag("var", Tag.inserting(Component.text("Owned Plots")))
 | 
				
			||||||
 | 
					                                .tag(
 | 
				
			||||||
 | 
					                                        "val",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Component.text(PlotQuery.newQuery().allPlots().count()))
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
 | 
					                                .build()
 | 
				
			||||||
                ));
 | 
					                ));
 | 
				
			||||||
        information.append(MINI_MESSAGE.parse(section, Template.of("val", "Messages")));
 | 
					        information.append(MINI_MESSAGE.deserialize(
 | 
				
			||||||
        information.append(MINI_MESSAGE.parse(
 | 
					                section,
 | 
				
			||||||
 | 
					                TagResolver.resolver("val", Tag.inserting(Component.text("Messages")))
 | 
				
			||||||
 | 
					        ));
 | 
				
			||||||
 | 
					        information.append(MINI_MESSAGE.deserialize(
 | 
				
			||||||
                line,
 | 
					                line,
 | 
				
			||||||
                Template.of("var", "Total Messages"),
 | 
					                TagResolver.builder()
 | 
				
			||||||
                Template.of("val", String.valueOf(captions.size()))
 | 
					                        .tag("var", Tag.inserting(Component.text("Total Messages")))
 | 
				
			||||||
 | 
					                        .tag(
 | 
				
			||||||
 | 
					                                "val",
 | 
				
			||||||
 | 
					                                Tag.inserting(Component.text(captions.size()))
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                        .build()
 | 
				
			||||||
        ));
 | 
					        ));
 | 
				
			||||||
        player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(information.build())));
 | 
					        player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(information.build())));
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
@@ -166,7 +185,7 @@ public class Debug extends SubCommand {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public Collection<Command> tab(final PlotPlayer<?> player, String[] args, boolean space) {
 | 
					    public Collection<Command> tab(final PlotPlayer<?> player, String[] args, boolean space) {
 | 
				
			||||||
        return Stream.of("loadedchunks", "debug-players", "entitytypes")
 | 
					        return Stream.of("debug-players", "entitytypes")
 | 
				
			||||||
                .filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH)))
 | 
					                .filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH)))
 | 
				
			||||||
                .map(value -> new Command(null, false, value, "plots.admin", RequiredType.NONE, null) {
 | 
					                .map(value -> new Command(null, false, value, "plots.admin", RequiredType.NONE, null) {
 | 
				
			||||||
                }).collect(Collectors.toList());
 | 
					                }).collect(Collectors.toList());
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,6 @@ import com.plotsquared.core.generator.HybridUtils;
 | 
				
			|||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
import com.plotsquared.core.plot.Plot;
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					import com.plotsquared.core.plot.PlotArea;
 | 
				
			||||||
import com.plotsquared.core.plot.expiration.ExpireManager;
 | 
					 | 
				
			||||||
import com.plotsquared.core.plot.expiration.PlotAnalysis;
 | 
					import com.plotsquared.core.plot.expiration.PlotAnalysis;
 | 
				
			||||||
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;
 | 
				
			||||||
@@ -37,12 +36,13 @@ import com.plotsquared.core.util.EventDispatcher;
 | 
				
			|||||||
import com.plotsquared.core.util.StringMan;
 | 
					import com.plotsquared.core.util.StringMan;
 | 
				
			||||||
import com.plotsquared.core.util.query.PlotQuery;
 | 
					import com.plotsquared.core.util.query.PlotQuery;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal;
 | 
					import com.plotsquared.core.util.task.RunnableVal;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Arrays;
 | 
					import java.util.Arrays;
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
import java.util.HashSet;
 | 
					 | 
				
			||||||
import java.util.LinkedHashSet;
 | 
					import java.util.LinkedHashSet;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Locale;
 | 
					import java.util.Locale;
 | 
				
			||||||
@@ -97,7 +97,7 @@ public class DebugExec extends SubCommand {
 | 
				
			|||||||
                    if (analysis != null) {
 | 
					                    if (analysis != null) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("debugexec.changes_column"),
 | 
					                                TranslatableCaption.of("debugexec.changes_column"),
 | 
				
			||||||
                                Template.of("value", String.valueOf(analysis.changes))
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text(analysis.changes)))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return true;
 | 
					                        return true;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -107,7 +107,7 @@ public class DebugExec extends SubCommand {
 | 
				
			|||||||
                        public void run(PlotAnalysis value) {
 | 
					                        public void run(PlotAnalysis value) {
 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("debugexec.analyze_done"),
 | 
					                                    TranslatableCaption.of("debugexec.analyze_done"),
 | 
				
			||||||
                                    Template.of("command", "/plot debugexec analyze")
 | 
					                                    TagResolver.resolver("command", Tag.inserting(Component.text("/plot debugexec analyze")))
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    });
 | 
					                    });
 | 
				
			||||||
@@ -117,7 +117,10 @@ public class DebugExec extends SubCommand {
 | 
				
			|||||||
                    if (args.length != 2) {
 | 
					                    if (args.length != 2) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                                Template.of("value", "/plot debugexec analyze <threshold>")
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "value",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Component.text("/plot debugexec analyze <threshold>"))
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        player.sendMessage(TranslatableCaption.of("debugexec.threshold_default"));
 | 
					                        player.sendMessage(TranslatableCaption.of("debugexec.threshold_default"));
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
@@ -128,7 +131,7 @@ public class DebugExec extends SubCommand {
 | 
				
			|||||||
                    } catch (NumberFormatException ignored) {
 | 
					                    } catch (NumberFormatException ignored) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("debugexec.invalid_threshold"),
 | 
					                                TranslatableCaption.of("debugexec.invalid_threshold"),
 | 
				
			||||||
                                Template.of("value", args[1])
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text(args[1])))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        player.sendMessage(TranslatableCaption.of("debugexec.threshold_default_double"));
 | 
					                        player.sendMessage(TranslatableCaption.of("debugexec.threshold_default_double"));
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
@@ -159,7 +162,7 @@ public class DebugExec extends SubCommand {
 | 
				
			|||||||
                    if (args.length != 2) {
 | 
					                    if (args.length != 2) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                                Template.of("value", "/plot debugexec remove-flag <flag>")
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text("/plot debugexec remove-flag <flag>")))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -177,7 +180,7 @@ public class DebugExec extends SubCommand {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("debugexec.cleared_flag"),
 | 
					                            TranslatableCaption.of("debugexec.cleared_flag"),
 | 
				
			||||||
                            Template.of("value", flag)
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text(flag)))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return true;
 | 
					                    return true;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -185,7 +188,10 @@ public class DebugExec extends SubCommand {
 | 
				
			|||||||
                    if (args.length != 2) {
 | 
					                    if (args.length != 2) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                                Template.of("value", "Invalid syntax: /plot debugexec start-rgar <world>")
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "value",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Component.text("Invalid syntax: /plot debugexec start-rgar <world>"))
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -193,7 +199,7 @@ public class DebugExec extends SubCommand {
 | 
				
			|||||||
                    if (area == null) {
 | 
					                    if (area == null) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("errors.not_valid_plot_world"),
 | 
					                                TranslatableCaption.of("errors.not_valid_plot_world"),
 | 
				
			||||||
                                Template.of("value", args[1])
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text(args[1])))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,7 +31,9 @@ import com.plotsquared.core.inject.annotations.WorldFile;
 | 
				
			|||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
import com.plotsquared.core.util.PremiumVerification;
 | 
					import com.plotsquared.core.util.PremiumVerification;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskManager;
 | 
					import com.plotsquared.core.util.task.TaskManager;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.File;
 | 
					import java.io.File;
 | 
				
			||||||
@@ -131,8 +133,10 @@ public class DebugPaste extends SubCommand {
 | 
				
			|||||||
                } catch (IOException ignored) {
 | 
					                } catch (IOException ignored) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("debugpaste.latest_log"),
 | 
					                            TranslatableCaption.of("debugpaste.latest_log"),
 | 
				
			||||||
                            Template.of("file", "latest.log"),
 | 
					                            TagResolver.builder()
 | 
				
			||||||
                            Template.of("size", "14MB")
 | 
					                                    .tag("file", Tag.inserting(Component.text("latest.log")))
 | 
				
			||||||
 | 
					                                    .tag("size", Tag.inserting(Component.text("14MB")))
 | 
				
			||||||
 | 
					                                    .build()
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -141,7 +145,7 @@ public class DebugPaste extends SubCommand {
 | 
				
			|||||||
                } catch (final IllegalArgumentException ignored) {
 | 
					                } catch (final IllegalArgumentException ignored) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("debugpaste.empty_file"),
 | 
					                            TranslatableCaption.of("debugpaste.empty_file"),
 | 
				
			||||||
                            Template.of("file", "settings.yml")
 | 
					                            TagResolver.resolver("file", Tag.inserting(Component.text("settings.yml")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                try {
 | 
					                try {
 | 
				
			||||||
@@ -149,7 +153,7 @@ public class DebugPaste extends SubCommand {
 | 
				
			|||||||
                } catch (final IllegalArgumentException ignored) {
 | 
					                } catch (final IllegalArgumentException ignored) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("debugpaste.empty_file"),
 | 
					                            TranslatableCaption.of("debugpaste.empty_file"),
 | 
				
			||||||
                            Template.of("file", "worlds.yml")
 | 
					                            TagResolver.resolver("file", Tag.inserting(Component.text("worlds.yml")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -162,7 +166,7 @@ public class DebugPaste extends SubCommand {
 | 
				
			|||||||
                } catch (final IOException ignored) {
 | 
					                } catch (final IOException ignored) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("debugpaste.skip_multiverse"),
 | 
					                            TranslatableCaption.of("debugpaste.skip_multiverse"),
 | 
				
			||||||
                            Template.of("file", "worlds.yml")
 | 
					                            TagResolver.resolver("file", Tag.inserting(Component.text("worlds.yml")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -177,20 +181,20 @@ public class DebugPaste extends SubCommand {
 | 
				
			|||||||
                                String.format("https://athion.net/ISPaster/paste/view/%s", pasteId);
 | 
					                                String.format("https://athion.net/ISPaster/paste/view/%s", pasteId);
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("debugpaste.debug_report_created"),
 | 
					                                TranslatableCaption.of("debugpaste.debug_report_created"),
 | 
				
			||||||
                                Template.of("url", link)
 | 
					                                TagResolver.resolver("url", Tag.preProcessParsed(link))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        final String responseMessage = jsonObject.get("response").getAsString();
 | 
					                        final String responseMessage = jsonObject.get("response").getAsString();
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("debugpaste.creation_failed"),
 | 
					                                TranslatableCaption.of("debugpaste.creation_failed"),
 | 
				
			||||||
                                Template.of("value", responseMessage)
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text(responseMessage)))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                } catch (final Throwable throwable) {
 | 
					                } catch (final Throwable throwable) {
 | 
				
			||||||
                    throwable.printStackTrace();
 | 
					                    throwable.printStackTrace();
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("debugpaste.creation_failed"),
 | 
					                            TranslatableCaption.of("debugpaste.creation_failed"),
 | 
				
			||||||
                            Template.of("value", throwable.getMessage())
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text(throwable.getMessage())))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } catch (IOException e) {
 | 
					            } catch (IOException e) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,9 @@ import com.plotsquared.core.plot.Plot;
 | 
				
			|||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					import com.plotsquared.core.plot.PlotArea;
 | 
				
			||||||
import com.plotsquared.core.plot.PlotManager;
 | 
					import com.plotsquared.core.plot.PlotManager;
 | 
				
			||||||
import com.plotsquared.core.queue.QueueCoordinator;
 | 
					import com.plotsquared.core.queue.QueueCoordinator;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Arrays;
 | 
					import java.util.Arrays;
 | 
				
			||||||
@@ -60,7 +62,7 @@ public class DebugRoadRegen extends SubCommand {
 | 
				
			|||||||
        if (args.length < 1) {
 | 
					        if (args.length < 1) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                    Template.of("value", DebugRoadRegen.USAGE)
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text(DebugRoadRegen.USAGE)))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -73,24 +75,28 @@ public class DebugRoadRegen extends SubCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        String kind = args[0].toLowerCase();
 | 
					        String kind = args[0].toLowerCase();
 | 
				
			||||||
        switch (kind) {
 | 
					        switch (kind) {
 | 
				
			||||||
            case "plot":
 | 
					            case "plot" -> {
 | 
				
			||||||
                return regenPlot(player);
 | 
					                return regenPlot(player);
 | 
				
			||||||
            case "region":
 | 
					            }
 | 
				
			||||||
 | 
					            case "region" -> {
 | 
				
			||||||
                return regenRegion(player, Arrays.copyOfRange(args, 1, args.length));
 | 
					                return regenRegion(player, Arrays.copyOfRange(args, 1, args.length));
 | 
				
			||||||
            default:
 | 
					            }
 | 
				
			||||||
 | 
					            default -> {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                        TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                        Template.of("value", DebugRoadRegen.USAGE)
 | 
					                        TagResolver.resolver("value", Tag.inserting(Component.text(DebugRoadRegen.USAGE)))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public boolean regenPlot(PlotPlayer<?> player) {
 | 
					    public boolean regenPlot(PlotPlayer<?> player) {
 | 
				
			||||||
        Location location = player.getLocation();
 | 
					        Location location = player.getLocation();
 | 
				
			||||||
        PlotArea area = location.getPlotArea();
 | 
					        PlotArea area = location.getPlotArea();
 | 
				
			||||||
        if (area == null) {
 | 
					        if (area == null) {
 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
 | 
					            player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Plot plot = player.getCurrentPlot();
 | 
					        Plot plot = player.getCurrentPlot();
 | 
				
			||||||
        if (plot == null) {
 | 
					        if (plot == null) {
 | 
				
			||||||
@@ -103,11 +109,11 @@ public class DebugRoadRegen extends SubCommand {
 | 
				
			|||||||
            queue.setCompleteTask(() -> {
 | 
					            queue.setCompleteTask(() -> {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("debugroadregen.regen_done"),
 | 
					                        TranslatableCaption.of("debugroadregen.regen_done"),
 | 
				
			||||||
                        Template.of("value", plot.getId().toString())
 | 
					                        TagResolver.resolver("value", Tag.inserting(Component.text(plot.getId().toString())))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("debugroadregen.regen_all"),
 | 
					                        TranslatableCaption.of("debugroadregen.regen_all"),
 | 
				
			||||||
                        Template.of("value", "/plot regenallroads")
 | 
					                        TagResolver.resolver("value", Tag.inserting(Component.text("/plot regenallroads")))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            manager.createRoadEast(plot, queue);
 | 
					            manager.createRoadEast(plot, queue);
 | 
				
			||||||
@@ -126,18 +132,18 @@ public class DebugRoadRegen extends SubCommand {
 | 
				
			|||||||
            } catch (NumberFormatException ignored) {
 | 
					            } catch (NumberFormatException ignored) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("invalid.not_valid_number"),
 | 
					                        TranslatableCaption.of("invalid.not_valid_number"),
 | 
				
			||||||
                        Template.of("value", "0, 256")
 | 
					                        TagResolver.resolver("value", Tag.inserting(Component.text("0, 256")))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                        TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                        Template.of("value", DebugRoadRegen.USAGE)
 | 
					                        TagResolver.resolver("value", Tag.inserting(Component.text(DebugRoadRegen.USAGE)))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else if (args.length != 0) {
 | 
					        } else if (args.length != 0) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                    Template.of("value", DebugRoadRegen.USAGE)
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text(DebugRoadRegen.USAGE)))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -155,11 +161,11 @@ public class DebugRoadRegen extends SubCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        player.sendMessage(
 | 
					        player.sendMessage(
 | 
				
			||||||
                TranslatableCaption.of("debugroadregen.schematic"),
 | 
					                TranslatableCaption.of("debugroadregen.schematic"),
 | 
				
			||||||
                Template.of("command", "/plot createroadschematic")
 | 
					                TagResolver.resolver("command", Tag.inserting(Component.text("/plot createroadschematic")))
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        player.sendMessage(
 | 
					        player.sendMessage(
 | 
				
			||||||
                TranslatableCaption.of("debugroadregen.regenallroads"),
 | 
					                TranslatableCaption.of("debugroadregen.regenallroads"),
 | 
				
			||||||
                Template.of("command", "/plot regenallroads")
 | 
					                TagResolver.resolver("command", Tag.inserting(Component.text("/plot regenallroads")))
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        boolean result = this.hybridUtils.scheduleSingleRegionRoadUpdate(plot, height);
 | 
					        boolean result = this.hybridUtils.scheduleSingleRegionRoadUpdate(plot, height);
 | 
				
			||||||
        if (!result) {
 | 
					        if (!result) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,10 +30,11 @@ import com.plotsquared.core.plot.Plot;
 | 
				
			|||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					import com.plotsquared.core.plot.PlotArea;
 | 
				
			||||||
import com.plotsquared.core.util.EconHandler;
 | 
					import com.plotsquared.core.util.EconHandler;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.PlotExpression;
 | 
					import com.plotsquared.core.util.PlotExpression;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskManager;
 | 
					import com.plotsquared.core.util.task.TaskManager;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -78,13 +79,12 @@ public class Delete extends SubCommand {
 | 
				
			|||||||
        if (eventResult == Result.DENY) {
 | 
					        if (eventResult == Result.DENY) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("events.event_denied"),
 | 
					                    TranslatableCaption.of("events.event_denied"),
 | 
				
			||||||
                    Template.of("value", "Delete")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("Delete")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        boolean force = eventResult == Result.FORCE;
 | 
					        boolean force = eventResult == Result.FORCE;
 | 
				
			||||||
        if (!force && !plot.isOwner(player.getUUID()) && !Permissions
 | 
					        if (!force && !plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DELETE)) {
 | 
				
			||||||
                .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DELETE)) {
 | 
					 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
 | 
					            player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -114,14 +114,17 @@ public class Delete extends SubCommand {
 | 
				
			|||||||
                        this.econHandler.depositMoney(player, value);
 | 
					                        this.econHandler.depositMoney(player, value);
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("economy.added_balance"),
 | 
					                                TranslatableCaption.of("economy.added_balance"),
 | 
				
			||||||
                                Template.of("money", this.econHandler.format(value))
 | 
					                                TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(value))))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("working.deleting_done"),
 | 
					                        TranslatableCaption.of("working.deleting_done"),
 | 
				
			||||||
                        Template.of("amount", String.valueOf(System.currentTimeMillis() - start)),
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
                        Template.of("plot", plot.getId().toString())
 | 
					                                "amount",
 | 
				
			||||||
 | 
					                                Tag.inserting(Component.text(String.valueOf(System.currentTimeMillis() - start)))
 | 
				
			||||||
 | 
					                        ),
 | 
				
			||||||
 | 
					                        TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                eventDispatcher.callPostDelete(plot);
 | 
					                eventDispatcher.callPostDelete(plot);
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,12 +30,13 @@ import com.plotsquared.core.player.PlotPlayer;
 | 
				
			|||||||
import com.plotsquared.core.plot.Plot;
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.PlayerManager;
 | 
					import com.plotsquared.core.util.PlayerManager;
 | 
				
			||||||
import com.plotsquared.core.util.TabCompletions;
 | 
					import com.plotsquared.core.util.TabCompletions;
 | 
				
			||||||
import com.plotsquared.core.util.WorldUtil;
 | 
					import com.plotsquared.core.util.WorldUtil;
 | 
				
			||||||
import com.sk89q.worldedit.world.gamemode.GameModes;
 | 
					import com.sk89q.worldedit.world.gamemode.GameModes;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
@@ -79,18 +80,17 @@ public class Deny extends SubCommand {
 | 
				
			|||||||
            player.sendMessage(TranslatableCaption.of("info.plot_unowned"));
 | 
					            player.sendMessage(TranslatableCaption.of("info.plot_unowned"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!plot.isOwner(player.getUUID()) && !Permissions
 | 
					        if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DENY)) {
 | 
				
			||||||
                .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DENY)) {
 | 
					 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
 | 
					            player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        int maxDenySize = Permissions.hasPermissionRange(player, Permission.PERMISSION_DENY, Settings.Limit.MAX_PLOTS);
 | 
					        int maxDenySize = player.hasPermissionRange(Permission.PERMISSION_DENY, Settings.Limit.MAX_PLOTS);
 | 
				
			||||||
        int size = plot.getDenied().size();
 | 
					        int size = plot.getDenied().size();
 | 
				
			||||||
        if (size >= maxDenySize) {
 | 
					        if (size >= maxDenySize) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("members.plot_max_members_denied"),
 | 
					                    TranslatableCaption.of("members.plot_max_members_denied"),
 | 
				
			||||||
                    Template.of("amount", String.valueOf(size))
 | 
					                    TagResolver.resolver("amount", Tag.inserting(Component.text(size)))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -101,16 +101,15 @@ public class Deny extends SubCommand {
 | 
				
			|||||||
            } else if (throwable != null || uuids.isEmpty()) {
 | 
					            } else if (throwable != null || uuids.isEmpty()) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("errors.invalid_player"),
 | 
					                        TranslatableCaption.of("errors.invalid_player"),
 | 
				
			||||||
                        Template.of("value", args[0])
 | 
					                        TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                for (UUID uuid : uuids) {
 | 
					                for (UUID uuid : uuids) {
 | 
				
			||||||
                    if (uuid == DBFunc.EVERYONE && !(
 | 
					                    if (uuid == DBFunc.EVERYONE && !(
 | 
				
			||||||
                            Permissions.hasPermission(player, Permission.PERMISSION_DENY_EVERYONE) || Permissions
 | 
					                            player.hasPermission(Permission.PERMISSION_DENY_EVERYONE) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DENY))) {
 | 
				
			||||||
                                    .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DENY))) {
 | 
					 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("errors.invalid_player"),
 | 
					                                TranslatableCaption.of("errors.invalid_player"),
 | 
				
			||||||
                                Template.of("value", args[0])
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    } else if (plot.isOwner(uuid)) {
 | 
					                    } else if (plot.isOwner(uuid)) {
 | 
				
			||||||
                        player.sendMessage(TranslatableCaption.of("deny.cant_remove_owner"));
 | 
					                        player.sendMessage(TranslatableCaption.of("deny.cant_remove_owner"));
 | 
				
			||||||
@@ -118,7 +117,11 @@ public class Deny extends SubCommand {
 | 
				
			|||||||
                    } else if (plot.getDenied().contains(uuid)) {
 | 
					                    } else if (plot.getDenied().contains(uuid)) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("member.already_added"),
 | 
					                                TranslatableCaption.of("member.already_added"),
 | 
				
			||||||
                                Template.of("player", PlayerManager.resolveName(uuid).getComponent(player))
 | 
					                                PlotSquared.platform().playerManager().getUsernameCaption(uuid)
 | 
				
			||||||
 | 
					                                        .thenApply(caption -> TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "player",
 | 
				
			||||||
 | 
					                                        Tag.inserting(caption.toComponent(player))
 | 
				
			||||||
 | 
					                                ))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,9 @@ import com.plotsquared.core.player.PlotPlayer;
 | 
				
			|||||||
import com.plotsquared.core.plot.Plot;
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.DescriptionFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.DescriptionFlag;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@CommandDeclaration(command = "setdescription",
 | 
					@CommandDeclaration(command = "setdescription",
 | 
				
			||||||
@@ -54,7 +56,7 @@ public class Desc extends SetCommand {
 | 
				
			|||||||
            if (event.getEventResult() == Result.DENY) {
 | 
					            if (event.getEventResult() == Result.DENY) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("events.event_denied"),
 | 
					                        TranslatableCaption.of("events.event_denied"),
 | 
				
			||||||
                        Template.of("value", "Description removal")
 | 
					                        TagResolver.resolver("value", Tag.inserting(Component.text("Description removal")))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -69,7 +71,7 @@ public class Desc extends SetCommand {
 | 
				
			|||||||
        if (event.getEventResult() == Result.DENY) {
 | 
					        if (event.getEventResult() == Result.DENY) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("events.event_denied"),
 | 
					                    TranslatableCaption.of("events.event_denied"),
 | 
				
			||||||
                    Template.of("value", "Description set")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("Description set")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,6 @@ package com.plotsquared.core.command;
 | 
				
			|||||||
import com.google.inject.Inject;
 | 
					import com.google.inject.Inject;
 | 
				
			||||||
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.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.TabCompletions;
 | 
					import com.plotsquared.core.util.TabCompletions;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -54,7 +53,7 @@ public class Dislike extends SubCommand {
 | 
				
			|||||||
    public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
 | 
					    public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
 | 
				
			||||||
        if (args.length == 1) {
 | 
					        if (args.length == 1) {
 | 
				
			||||||
            final List<String> completions = new LinkedList<>();
 | 
					            final List<String> completions = new LinkedList<>();
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS)) {
 | 
				
			||||||
                completions.add("purge");
 | 
					                completions.add("purge");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            final List<Command> commands = completions.stream().filter(completion -> completion
 | 
					            final List<Command> commands = completions.stream().filter(completion -> completion
 | 
				
			||||||
@@ -62,7 +61,7 @@ public class Dislike extends SubCommand {
 | 
				
			|||||||
                            .startsWith(args[0].toLowerCase()))
 | 
					                            .startsWith(args[0].toLowerCase()))
 | 
				
			||||||
                    .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) {
 | 
					                    .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) {
 | 
				
			||||||
                    }).collect(Collectors.toCollection(LinkedList::new));
 | 
					                    }).collect(Collectors.toCollection(LinkedList::new));
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_RATE) && args[0].length() > 0) {
 | 
				
			||||||
                commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
					                commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return commands;
 | 
					            return commands;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,9 +34,10 @@ import com.plotsquared.core.plot.expiration.PlotAnalysis;
 | 
				
			|||||||
import com.plotsquared.core.plot.flag.PlotFlag;
 | 
					import com.plotsquared.core.plot.flag.PlotFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal;
 | 
					import com.plotsquared.core.util.task.RunnableVal;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@CommandDeclaration(command = "done",
 | 
					@CommandDeclaration(command = "done",
 | 
				
			||||||
@@ -70,13 +71,12 @@ public class Done extends SubCommand {
 | 
				
			|||||||
        if (event.getEventResult() == Result.DENY) {
 | 
					        if (event.getEventResult() == Result.DENY) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("events.event_denied"),
 | 
					                    TranslatableCaption.of("events.event_denied"),
 | 
				
			||||||
                    Template.of("value", "Done")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("Done")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        boolean force = event.getEventResult() == Result.FORCE;
 | 
					        boolean force = event.getEventResult() == Result.FORCE;
 | 
				
			||||||
        if (!force && !plot.isOwner(player.getUUID()) && !Permissions
 | 
					        if (!force && !plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DONE)) {
 | 
				
			||||||
                .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DONE)) {
 | 
					 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
 | 
					            player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -91,7 +91,7 @@ public class Done extends SubCommand {
 | 
				
			|||||||
        plot.addRunning();
 | 
					        plot.addRunning();
 | 
				
			||||||
        player.sendMessage(
 | 
					        player.sendMessage(
 | 
				
			||||||
                TranslatableCaption.of("web.generating_link"),
 | 
					                TranslatableCaption.of("web.generating_link"),
 | 
				
			||||||
                Template.of("plot", plot.getId().toString())
 | 
					                TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        final Settings.Auto_Clear doneRequirements = Settings.AUTO_CLEAR.get("done");
 | 
					        final Settings.Auto_Clear doneRequirements = Settings.AUTO_CLEAR.get("done");
 | 
				
			||||||
        if (PlotSquared.platform().expireManager() == null || doneRequirements == null) {
 | 
					        if (PlotSquared.platform().expireManager() == null || doneRequirements == null) {
 | 
				
			||||||
@@ -103,7 +103,7 @@ public class Done extends SubCommand {
 | 
				
			|||||||
                public void run(PlotAnalysis value) {
 | 
					                public void run(PlotAnalysis value) {
 | 
				
			||||||
                    plot.removeRunning();
 | 
					                    plot.removeRunning();
 | 
				
			||||||
                    boolean result =
 | 
					                    boolean result =
 | 
				
			||||||
                            value.getComplexity(doneRequirements) <= doneRequirements.THRESHOLD;
 | 
					                            value.getComplexity(doneRequirements) >= doneRequirements.THRESHOLD;
 | 
				
			||||||
                    finish(plot, player, result);
 | 
					                    finish(plot, player, result);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,14 +27,15 @@ import com.plotsquared.core.player.PlotPlayer;
 | 
				
			|||||||
import com.plotsquared.core.plot.Plot;
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.PlotUploader;
 | 
					import com.plotsquared.core.util.PlotUploader;
 | 
				
			||||||
import com.plotsquared.core.util.SchematicHandler;
 | 
					import com.plotsquared.core.util.SchematicHandler;
 | 
				
			||||||
import com.plotsquared.core.util.StringMan;
 | 
					import com.plotsquared.core.util.StringMan;
 | 
				
			||||||
import com.plotsquared.core.util.TabCompletions;
 | 
					import com.plotsquared.core.util.TabCompletions;
 | 
				
			||||||
import com.plotsquared.core.util.WorldUtil;
 | 
					import com.plotsquared.core.util.WorldUtil;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal;
 | 
					import com.plotsquared.core.util.task.RunnableVal;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.net.URL;
 | 
					import java.net.URL;
 | 
				
			||||||
@@ -87,13 +88,11 @@ public class Download extends SubCommand {
 | 
				
			|||||||
            player.sendMessage(TranslatableCaption.of("info.plot_unowned"));
 | 
					            player.sendMessage(TranslatableCaption.of("info.plot_unowned"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if ((Settings.Done.REQUIRED_FOR_DOWNLOAD && !DoneFlag.isDone(plot)) && !Permissions
 | 
					        if ((Settings.Done.REQUIRED_FOR_DOWNLOAD && !DoneFlag.isDone(plot)) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DOWNLOAD)) {
 | 
				
			||||||
                .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DOWNLOAD)) {
 | 
					 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("done.done_not_done"));
 | 
					            player.sendMessage(TranslatableCaption.of("done.done_not_done"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!plot.isOwner(player.getUUID()) && !Permissions
 | 
					        if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN.toString())) {
 | 
				
			||||||
                .hasPermission(player, Permission.PERMISSION_ADMIN.toString())) {
 | 
					 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
 | 
					            player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -111,10 +110,13 @@ public class Download extends SubCommand {
 | 
				
			|||||||
            upload(player, plot);
 | 
					            upload(player, plot);
 | 
				
			||||||
        } else if (args.length == 1 && StringMan
 | 
					        } else if (args.length == 1 && StringMan
 | 
				
			||||||
                .isEqualIgnoreCaseToAny(args[0], "mcr", "world", "mca")) {
 | 
					                .isEqualIgnoreCaseToAny(args[0], "mcr", "world", "mca")) {
 | 
				
			||||||
            if (!Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD_WORLD)) {
 | 
					            if (!player.hasPermission(Permission.PERMISSION_DOWNLOAD_WORLD)) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission"),
 | 
					                        TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                        Template.of("node", Permission.PERMISSION_DOWNLOAD_WORLD.toString())
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                "node",
 | 
				
			||||||
 | 
					                                Tag.inserting(Permission.PERMISSION_DOWNLOAD_WORLD)
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -128,18 +130,24 @@ public class Download extends SubCommand {
 | 
				
			|||||||
                    if (url == null) {
 | 
					                    if (url == null) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("web.generating_link_failed"),
 | 
					                                TranslatableCaption.of("web.generating_link_failed"),
 | 
				
			||||||
                                Template.of("plot", plot.getId().toString())
 | 
					                                TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    player.sendMessage(TranslatableCaption.of("web.generation_link_success_legacy_world"), Template.of("url", url.toString()));
 | 
					                    player.sendMessage(
 | 
				
			||||||
 | 
					                            TranslatableCaption.of("web.generation_link_success_legacy_world"),
 | 
				
			||||||
 | 
					                            TagResolver.resolver("url", Tag.inserting(Component.text(url.toString())))
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            sendUsage(player);
 | 
					            sendUsage(player);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        player.sendMessage(TranslatableCaption.of("web.generating_link"), Template.of("plot", plot.getId().toString()));
 | 
					        player.sendMessage(
 | 
				
			||||||
 | 
					                TranslatableCaption.of("web.generating_link"),
 | 
				
			||||||
 | 
					                TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -147,10 +155,10 @@ public class Download extends SubCommand {
 | 
				
			|||||||
    public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
 | 
					    public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
 | 
				
			||||||
        if (args.length == 1) {
 | 
					        if (args.length == 1) {
 | 
				
			||||||
            final List<String> completions = new LinkedList<>();
 | 
					            final List<String> completions = new LinkedList<>();
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_DOWNLOAD)) {
 | 
				
			||||||
                completions.add("schem");
 | 
					                completions.add("schem");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD_WORLD)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_DOWNLOAD_WORLD)) {
 | 
				
			||||||
                completions.add("world");
 | 
					                completions.add("world");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            final List<Command> commands = completions.stream().filter(completion -> completion
 | 
					            final List<Command> commands = completions.stream().filter(completion -> completion
 | 
				
			||||||
@@ -165,7 +173,7 @@ public class Download extends SubCommand {
 | 
				
			|||||||
                            CommandCategory.ADMINISTRATION
 | 
					                            CommandCategory.ADMINISTRATION
 | 
				
			||||||
                    ) {
 | 
					                    ) {
 | 
				
			||||||
                    }).collect(Collectors.toCollection(LinkedList::new));
 | 
					                    }).collect(Collectors.toCollection(LinkedList::new));
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD) && args[0].length() > 0) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_DOWNLOAD) && args[0].length() > 0) {
 | 
				
			||||||
                commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
					                commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return commands;
 | 
					            return commands;
 | 
				
			||||||
@@ -177,20 +185,25 @@ public class Download extends SubCommand {
 | 
				
			|||||||
        if (Settings.Web.LEGACY_WEBINTERFACE) {
 | 
					        if (Settings.Web.LEGACY_WEBINTERFACE) {
 | 
				
			||||||
            schematicHandler
 | 
					            schematicHandler
 | 
				
			||||||
                    .getCompoundTag(plot)
 | 
					                    .getCompoundTag(plot)
 | 
				
			||||||
                    .whenComplete((compoundTag, throwable) -> {
 | 
					                    .whenComplete((compoundTag, throwable) -> schematicHandler.upload(
 | 
				
			||||||
                        schematicHandler.upload(compoundTag, null, null, new RunnableVal<>() {
 | 
					                            compoundTag,
 | 
				
			||||||
 | 
					                            null,
 | 
				
			||||||
 | 
					                            null,
 | 
				
			||||||
 | 
					                            new RunnableVal<>() {
 | 
				
			||||||
                                @Override
 | 
					                                @Override
 | 
				
			||||||
                                public void run(URL value) {
 | 
					                                public void run(URL value) {
 | 
				
			||||||
                                    plot.removeRunning();
 | 
					                                    plot.removeRunning();
 | 
				
			||||||
                                    player.sendMessage(
 | 
					                                    player.sendMessage(
 | 
				
			||||||
                                            TranslatableCaption.of("web.generation_link_success"),
 | 
					                                            TranslatableCaption.of("web.generation_link_success"),
 | 
				
			||||||
                                        Template.of("download", value.toString()),
 | 
					                                            TagResolver.builder()
 | 
				
			||||||
                                        Template.of("delete", "Not available")
 | 
					                                                    .tag("download", Tag.preProcessParsed(value.toString()))
 | 
				
			||||||
 | 
					                                                    .tag("delete", Tag.preProcessParsed("Not available"))
 | 
				
			||||||
 | 
					                                                    .build()
 | 
				
			||||||
                                    );
 | 
					                                    );
 | 
				
			||||||
                                    player.sendMessage(StaticCaption.of(value.toString()));
 | 
					                                    player.sendMessage(StaticCaption.of(value.toString()));
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                        });
 | 
					                            }
 | 
				
			||||||
                    });
 | 
					                    ));
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        // TODO legacy support
 | 
					        // TODO legacy support
 | 
				
			||||||
@@ -199,13 +212,15 @@ public class Download extends SubCommand {
 | 
				
			|||||||
                    if (throwable != null || !result.isSuccess()) {
 | 
					                    if (throwable != null || !result.isSuccess()) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("web.generating_link_failed"),
 | 
					                                TranslatableCaption.of("web.generating_link_failed"),
 | 
				
			||||||
                                Template.of("plot", plot.getId().toString())
 | 
					                                TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("web.generation_link_success"),
 | 
					                                TranslatableCaption.of("web.generation_link_success"),
 | 
				
			||||||
                                Template.of("download", result.getDownloadUrl()),
 | 
					                                TagResolver.builder()
 | 
				
			||||||
                                Template.of("delete", result.getDeletionUrl())
 | 
					                                        .tag("download", Tag.preProcessParsed(result.getDownloadUrl()))
 | 
				
			||||||
 | 
					                                        .tag("delete", Tag.preProcessParsed(result.getDeletionUrl()))
 | 
				
			||||||
 | 
					                                        .build()
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,6 @@ import com.plotsquared.core.PlotSquared;
 | 
				
			|||||||
import com.plotsquared.core.configuration.Settings;
 | 
					import com.plotsquared.core.configuration.Settings;
 | 
				
			||||||
import com.plotsquared.core.configuration.caption.CaptionUtility;
 | 
					import com.plotsquared.core.configuration.caption.CaptionUtility;
 | 
				
			||||||
import com.plotsquared.core.configuration.caption.StaticCaption;
 | 
					import com.plotsquared.core.configuration.caption.StaticCaption;
 | 
				
			||||||
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.events.PlotFlagAddEvent;
 | 
					import com.plotsquared.core.events.PlotFlagAddEvent;
 | 
				
			||||||
import com.plotsquared.core.events.PlotFlagRemoveEvent;
 | 
					import com.plotsquared.core.events.PlotFlagRemoveEvent;
 | 
				
			||||||
@@ -40,7 +39,6 @@ import com.plotsquared.core.plot.flag.types.IntegerFlag;
 | 
				
			|||||||
import com.plotsquared.core.plot.flag.types.ListFlag;
 | 
					import com.plotsquared.core.plot.flag.types.ListFlag;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.MathMan;
 | 
					import com.plotsquared.core.util.MathMan;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.StringComparison;
 | 
					import com.plotsquared.core.util.StringComparison;
 | 
				
			||||||
import com.plotsquared.core.util.StringMan;
 | 
					import com.plotsquared.core.util.StringMan;
 | 
				
			||||||
import com.plotsquared.core.util.helpmenu.HelpMenu;
 | 
					import com.plotsquared.core.util.helpmenu.HelpMenu;
 | 
				
			||||||
@@ -48,7 +46,9 @@ import com.plotsquared.core.util.task.RunnableVal2;
 | 
				
			|||||||
import com.plotsquared.core.util.task.RunnableVal3;
 | 
					import com.plotsquared.core.util.task.RunnableVal3;
 | 
				
			||||||
import net.kyori.adventure.text.Component;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
import net.kyori.adventure.text.TextComponent;
 | 
					import net.kyori.adventure.text.TextComponent;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.format.Style;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
					import org.checkerframework.checker.nullness.qual.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -85,7 +85,10 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
    private static boolean sendMessage(PlotPlayer<?> player) {
 | 
					    private static boolean sendMessage(PlotPlayer<?> player) {
 | 
				
			||||||
        player.sendMessage(
 | 
					        player.sendMessage(
 | 
				
			||||||
                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                Template.of("value", "/plot flag <set | remove | add | list | info> <flag> <value>")
 | 
					                TagResolver.resolver(
 | 
				
			||||||
 | 
					                        "value",
 | 
				
			||||||
 | 
					                        Tag.inserting(Component.text("/plot flag <set | remove | add | list | info> <flag> <value>"))
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -111,9 +114,9 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
                if (!result) {
 | 
					                if (!result) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of(
 | 
					                            TagResolver.resolver(
 | 
				
			||||||
                                    "node",
 | 
					                                    "node",
 | 
				
			||||||
                                    perm + "." + numeric
 | 
					                                    Tag.inserting(Component.text(perm + "." + numeric))
 | 
				
			||||||
                            )
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -128,18 +131,23 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
                            key.toLowerCase(),
 | 
					                            key.toLowerCase(),
 | 
				
			||||||
                            entry.toString().toLowerCase()
 | 
					                            entry.toString().toLowerCase()
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    final boolean result = Permissions.hasPermission(player, permission);
 | 
					                    final boolean result = player.hasPermission(permission);
 | 
				
			||||||
                    if (!result) {
 | 
					                    if (!result) {
 | 
				
			||||||
                        player.sendMessage(TranslatableCaption.of("permission.no_permission"), Template.of("node", permission));
 | 
					                        player.sendMessage(
 | 
				
			||||||
 | 
					                                TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
 | 
					                                TagResolver.resolver("node", Tag.inserting(Component.text(permission)))
 | 
				
			||||||
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } catch (final FlagParseException e) {
 | 
					            } catch (final FlagParseException e) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("flag.flag_parse_error"),
 | 
					                        TranslatableCaption.of("flag.flag_parse_error"),
 | 
				
			||||||
                        Template.of("flag_name", flag.getName()),
 | 
					                        TagResolver.builder()
 | 
				
			||||||
                        Template.of("flag_value", e.getValue()),
 | 
					                                .tag("flag_name", Tag.inserting(Component.text(flag.getName())))
 | 
				
			||||||
                        Template.of("error", e.getErrorMessage().getComponent(player))
 | 
					                                .tag("flag_value", Tag.inserting(Component.text(e.getValue())))
 | 
				
			||||||
 | 
					                                .tag("error", Tag.inserting(e.getErrorMessage().toComponent(player)))
 | 
				
			||||||
 | 
					                                .build()
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            } catch (final Exception e) {
 | 
					            } catch (final Exception e) {
 | 
				
			||||||
@@ -150,13 +158,16 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
        boolean result;
 | 
					        boolean result;
 | 
				
			||||||
        String basePerm = Permission.PERMISSION_SET_FLAG_KEY.format(key.toLowerCase());
 | 
					        String basePerm = Permission.PERMISSION_SET_FLAG_KEY.format(key.toLowerCase());
 | 
				
			||||||
        if (flag.isValuedPermission()) {
 | 
					        if (flag.isValuedPermission()) {
 | 
				
			||||||
            result = Permissions.hasKeyedPermission(player, basePerm, value);
 | 
					            result = player.hasKeyedPermission(basePerm, value);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            result = Permissions.hasPermission(player, basePerm);
 | 
					            result = player.hasPermission(basePerm);
 | 
				
			||||||
            perm = basePerm;
 | 
					            perm = basePerm;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!result) {
 | 
					        if (!result) {
 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("permission.no_permission"), Template.of("node", perm));
 | 
					            player.sendMessage(
 | 
				
			||||||
 | 
					                    TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
 | 
					                    TagResolver.resolver("node", Tag.inserting(Component.text(perm)))
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return result;
 | 
					        return result;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -177,11 +188,10 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
            player.sendMessage(TranslatableCaption.of("working.plot_not_claimed"));
 | 
					            player.sendMessage(TranslatableCaption.of("working.plot_not_claimed"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!plot.isOwner(player.getUUID()) && !Permissions
 | 
					        if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_SET_FLAG_OTHER)) {
 | 
				
			||||||
                .hasPermission(player, Permission.PERMISSION_SET_FLAG_OTHER)) {
 | 
					 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.no_permission"),
 | 
					                    TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                    Template.of("node", String.valueOf(Permission.PERMISSION_SET_FLAG_OTHER))
 | 
					                    TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_SET_FLAG_OTHER))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -216,7 +226,7 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
                    if (best != null) {
 | 
					                    if (best != null) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("flag.not_valid_flag_suggested"),
 | 
					                                TranslatableCaption.of("flag.not_valid_flag_suggested"),
 | 
				
			||||||
                                Template.of("value", best)
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text(best)))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        suggested = true;
 | 
					                        suggested = true;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -325,7 +335,7 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
        if (args.length < 2) {
 | 
					        if (args.length < 2) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                    Template.of("value", "/plot flag set <flag> <value>")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("/plot flag set <flag> <value>")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -338,7 +348,7 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
        if (event.getEventResult() == Result.DENY) {
 | 
					        if (event.getEventResult() == Result.DENY) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("events.event_denied"),
 | 
					                    TranslatableCaption.of("events.event_denied"),
 | 
				
			||||||
                    Template.of("value", "Flag set")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("Flag set")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -354,15 +364,21 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
        } catch (final FlagParseException e) {
 | 
					        } catch (final FlagParseException e) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("flag.flag_parse_error"),
 | 
					                    TranslatableCaption.of("flag.flag_parse_error"),
 | 
				
			||||||
                    Template.of("flag_name", plotFlag.getName()),
 | 
					                    TagResolver.builder()
 | 
				
			||||||
                    Template.of("flag_value", e.getValue()),
 | 
					                            .tag("flag_name", Tag.inserting(Component.text(plotFlag.getName())))
 | 
				
			||||||
                    Template.of("error", e.getErrorMessage().getComponent(player))
 | 
					                            .tag("flag_value", Tag.inserting(Component.text(e.getValue())))
 | 
				
			||||||
 | 
					                            .tag("error", Tag.inserting(e.getErrorMessage().toComponent(player)))
 | 
				
			||||||
 | 
					                            .build()
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        plot.setFlag(parsed);
 | 
					        plot.setFlag(parsed);
 | 
				
			||||||
        player.sendMessage(TranslatableCaption.of("flag.flag_added"), Template.of("flag", String.valueOf(args[0])),
 | 
					        player.sendMessage(
 | 
				
			||||||
                Template.of("value", String.valueOf(parsed))
 | 
					                TranslatableCaption.of("flag.flag_added"),
 | 
				
			||||||
 | 
					                TagResolver.builder()
 | 
				
			||||||
 | 
					                        .tag("flag", Tag.inserting(Component.text(args[0])))
 | 
				
			||||||
 | 
					                        .tag("value", Tag.inserting(Component.text(parsed.toString())))
 | 
				
			||||||
 | 
					                        .build()
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -384,7 +400,7 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
        if (args.length < 2) {
 | 
					        if (args.length < 2) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                    Template.of("value", "/plot flag add <flag> <values>")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("/plot flag add <flag> <values>")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -397,7 +413,7 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
        if (event.getEventResult() == Result.DENY) {
 | 
					        if (event.getEventResult() == Result.DENY) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("events.event_denied"),
 | 
					                    TranslatableCaption.of("events.event_denied"),
 | 
				
			||||||
                    Template.of("value", "Flag add")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("Flag add")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -418,9 +434,11 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
        } catch (FlagParseException e) {
 | 
					        } catch (FlagParseException e) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("flag.flag_parse_error"),
 | 
					                    TranslatableCaption.of("flag.flag_parse_error"),
 | 
				
			||||||
                    Template.of("flag_name", plotFlag.getName()),
 | 
					                    TagResolver.builder()
 | 
				
			||||||
                    Template.of("flag_value", e.getValue()),
 | 
					                            .tag("flag_name", Tag.inserting(Component.text(plotFlag.getName())))
 | 
				
			||||||
                    Template.of("error", e.getErrorMessage().getComponent(player))
 | 
					                            .tag("flag_value", Tag.inserting(Component.text(e.getValue())))
 | 
				
			||||||
 | 
					                            .tag("error", Tag.inserting(e.getErrorMessage().toComponent(player)))
 | 
				
			||||||
 | 
					                            .build()
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -430,8 +448,12 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
            player.sendMessage(TranslatableCaption.of("flag.flag_not_added"));
 | 
					            player.sendMessage(TranslatableCaption.of("flag.flag_not_added"));
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        player.sendMessage(TranslatableCaption.of("flag.flag_added"), Template.of("flag", String.valueOf(args[0])),
 | 
					        player.sendMessage(
 | 
				
			||||||
                Template.of("value", String.valueOf(parsed))
 | 
					                TranslatableCaption.of("flag.flag_added"),
 | 
				
			||||||
 | 
					                TagResolver.builder()
 | 
				
			||||||
 | 
					                        .tag("flag", Tag.inserting(Component.text(args[0])))
 | 
				
			||||||
 | 
					                        .tag("value", Tag.inserting(Component.text(parsed.toString())))
 | 
				
			||||||
 | 
					                        .build()
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -453,7 +475,7 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
        if (args.length != 1 && args.length != 2) {
 | 
					        if (args.length != 1 && args.length != 2) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                    Template.of("value", "/plot flag remove <flag> [values]")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("/plot flag remove <flag> [values]")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -467,17 +489,20 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
        if (event.getEventResult() == Result.DENY) {
 | 
					        if (event.getEventResult() == Result.DENY) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("events.event_denied"),
 | 
					                    TranslatableCaption.of("events.event_denied"),
 | 
				
			||||||
                    Template.of("value", "Flag remove")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("Flag remove")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        boolean force = event.getEventResult() == Result.FORCE;
 | 
					        boolean force = event.getEventResult() == Result.FORCE;
 | 
				
			||||||
        flag = event.getFlag();
 | 
					        flag = event.getFlag();
 | 
				
			||||||
        if (!force && !Permissions.hasPermission(player, Permission.PERMISSION_SET_FLAG_KEY.format(args[0].toLowerCase()))) {
 | 
					        if (!force && !player.hasPermission(Permission.PERMISSION_SET_FLAG_KEY.format(args[0].toLowerCase()))) {
 | 
				
			||||||
            if (args.length != 2) {
 | 
					            if (args.length != 2) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("permission.no_permission"),
 | 
					                        TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                        Template.of("node", Permission.PERMISSION_SET_FLAG_KEY.format(args[0].toLowerCase()))
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
 | 
					                                "node",
 | 
				
			||||||
 | 
					                                Tag.inserting(Component.text(Permission.PERMISSION_SET_FLAG_KEY.format(args[0].toLowerCase())))
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -492,9 +517,11 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
            } catch (final FlagParseException e) {
 | 
					            } catch (final FlagParseException e) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("flag.flag_parse_error"),
 | 
					                        TranslatableCaption.of("flag.flag_parse_error"),
 | 
				
			||||||
                        Template.of("flag_name", flag.getName()),
 | 
					                        TagResolver.builder()
 | 
				
			||||||
                        Template.of("flag_value", e.getValue()),
 | 
					                                .tag("flag_name", Tag.inserting(Component.text(flag.getName())))
 | 
				
			||||||
                        Template.of("error", String.valueOf(e.getErrorMessage()))
 | 
					                                .tag("flag_value", Tag.inserting(Component.text(e.getValue())))
 | 
				
			||||||
 | 
					                                .tag("error", Tag.inserting(e.getErrorMessage().toComponent(player)))
 | 
				
			||||||
 | 
					                                .build()
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -505,10 +532,13 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
            if (list.removeAll((List) parsedFlag.getValue())) {
 | 
					            if (list.removeAll((List) parsedFlag.getValue())) {
 | 
				
			||||||
                if (list.isEmpty()) {
 | 
					                if (list.isEmpty()) {
 | 
				
			||||||
                    if (plot.removeFlag(flag)) {
 | 
					                    if (plot.removeFlag(flag)) {
 | 
				
			||||||
                        player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                "value",
 | 
					                                TranslatableCaption.of("flag.flag_removed"),
 | 
				
			||||||
                                String.valueOf(flagWithOldValue)
 | 
					                                TagResolver.builder()
 | 
				
			||||||
                        ));
 | 
					                                        .tag("flag", Tag.inserting(Component.text(args[0])))
 | 
				
			||||||
 | 
					                                        .tag("value", Tag.inserting(Component.text(flag.toString())))
 | 
				
			||||||
 | 
					                                        .build()
 | 
				
			||||||
 | 
					                        );
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        player.sendMessage(TranslatableCaption.of("flag.flag_not_removed"));
 | 
					                        player.sendMessage(TranslatableCaption.of("flag.flag_not_removed"));
 | 
				
			||||||
@@ -520,7 +550,10 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
                    if (addEvent.getEventResult() == Result.DENY) {
 | 
					                    if (addEvent.getEventResult() == Result.DENY) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("events.event_denied"),
 | 
					                                TranslatableCaption.of("events.event_denied"),
 | 
				
			||||||
                                Template.of("value", "Re-addition of " + plotFlag.getName())
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "value",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Component.text("Re-addition of " + plotFlag.getName()))
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -543,10 +576,13 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of(
 | 
					        player.sendMessage(
 | 
				
			||||||
                "value",
 | 
					                TranslatableCaption.of("flag.flag_removed"),
 | 
				
			||||||
                String.valueOf(flagWithOldValue)
 | 
					                TagResolver.builder()
 | 
				
			||||||
        ));
 | 
					                        .tag("flag", Tag.inserting(Component.text(args[0])))
 | 
				
			||||||
 | 
					                        .tag("value", Tag.inserting(Component.text(flag.toString())))
 | 
				
			||||||
 | 
					                        .build()
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @CommandDeclaration(command = "list",
 | 
					    @CommandDeclaration(command = "list",
 | 
				
			||||||
@@ -564,34 +600,35 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        final Map<String, ArrayList<String>> flags = new HashMap<>();
 | 
					        final Map<Component, ArrayList<String>> flags = new HashMap<>();
 | 
				
			||||||
        for (PlotFlag<?, ?> plotFlag : GlobalFlagContainer.getInstance().getRecognizedPlotFlags()) {
 | 
					        for (PlotFlag<?, ?> plotFlag : GlobalFlagContainer.getInstance().getRecognizedPlotFlags()) {
 | 
				
			||||||
            if (plotFlag instanceof InternalFlag) {
 | 
					            if (plotFlag instanceof InternalFlag) {
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            final String category = MINI_MESSAGE.stripTokens(plotFlag.getFlagCategory().getComponent(player));
 | 
					            final Component category = plotFlag.getFlagCategory().toComponent(player);
 | 
				
			||||||
            final Collection<String> flagList =
 | 
					            final Collection<String> flagList = flags.computeIfAbsent(category, k -> new ArrayList<>());
 | 
				
			||||||
                    flags.computeIfAbsent(category, k -> new ArrayList<>());
 | 
					 | 
				
			||||||
            flagList.add(plotFlag.getName());
 | 
					            flagList.add(plotFlag.getName());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (final Map.Entry<String, ArrayList<String>> entry : flags.entrySet()) {
 | 
					        for (final Map.Entry<Component, ArrayList<String>> entry : flags.entrySet()) {
 | 
				
			||||||
            Collections.sort(entry.getValue());
 | 
					            Collections.sort(entry.getValue());
 | 
				
			||||||
            Component category =
 | 
					            Component category =
 | 
				
			||||||
                    MINI_MESSAGE.parse(
 | 
					                    MINI_MESSAGE.deserialize(
 | 
				
			||||||
                            TranslatableCaption.of("flag.flag_list_categories").getComponent(player),
 | 
					                            TranslatableCaption.of("flag.flag_list_categories").getComponent(player),
 | 
				
			||||||
                            Template.of("category", entry.getKey())
 | 
					                            TagResolver.resolver("category", Tag.inserting(entry.getKey().style(Style.empty())))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
            TextComponent.Builder builder = Component.text().append(category);
 | 
					            TextComponent.Builder builder = Component.text().append(category);
 | 
				
			||||||
            final Iterator<String> flagIterator = entry.getValue().iterator();
 | 
					            final Iterator<String> flagIterator = entry.getValue().iterator();
 | 
				
			||||||
            while (flagIterator.hasNext()) {
 | 
					            while (flagIterator.hasNext()) {
 | 
				
			||||||
                final String flag = flagIterator.next();
 | 
					                final String flag = flagIterator.next();
 | 
				
			||||||
                builder.append(MINI_MESSAGE
 | 
					                builder.append(MINI_MESSAGE
 | 
				
			||||||
                        .parse(
 | 
					                        .deserialize(
 | 
				
			||||||
                                TranslatableCaption.of("flag.flag_list_flag").getComponent(player),
 | 
					                                TranslatableCaption.of("flag.flag_list_flag").getComponent(player),
 | 
				
			||||||
                                Template.of("command", "/plot flag info " + flag),
 | 
					                                TagResolver.builder()
 | 
				
			||||||
                                Template.of("flag", flag),
 | 
					                                        .tag("command", Tag.preProcessParsed("/plot flag info " + flag))
 | 
				
			||||||
                                Template.of("suffix", flagIterator.hasNext() ? ", " : "")
 | 
					                                        .tag("flag", Tag.inserting(Component.text(flag)))
 | 
				
			||||||
 | 
					                                        .tag("suffix", Tag.inserting(Component.text(flagIterator.hasNext() ? ", " : "")))
 | 
				
			||||||
 | 
					                                        .build()
 | 
				
			||||||
                        ));
 | 
					                        ));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.build())));
 | 
					            player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.build())));
 | 
				
			||||||
@@ -615,7 +652,7 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
        if (args.length < 1) {
 | 
					        if (args.length < 1) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                    TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                    Template.of("value", "/plot flag info <flag>")
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text("/plot flag info <flag>")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -623,11 +660,17 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
        if (plotFlag != null) {
 | 
					        if (plotFlag != null) {
 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("flag.flag_info_header"));
 | 
					            player.sendMessage(TranslatableCaption.of("flag.flag_info_header"));
 | 
				
			||||||
            // Flag name
 | 
					            // Flag name
 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("flag.flag_info_name"), Template.of("flag", plotFlag.getName()));
 | 
					            player.sendMessage(
 | 
				
			||||||
 | 
					                    TranslatableCaption.of("flag.flag_info_name"),
 | 
				
			||||||
 | 
					                    TagResolver.resolver("flag", Tag.inserting(Component.text(plotFlag.getName())))
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
            // Flag category
 | 
					            // Flag category
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("flag.flag_info_category"),
 | 
					                    TranslatableCaption.of("flag.flag_info_category"),
 | 
				
			||||||
                    Templates.of(player, "value", plotFlag.getFlagCategory())
 | 
					                    TagResolver.resolver(
 | 
				
			||||||
 | 
					                            "value",
 | 
				
			||||||
 | 
					                            Tag.inserting(plotFlag.getFlagCategory().toComponent(player))
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            // Flag description
 | 
					            // Flag description
 | 
				
			||||||
            // TODO maybe merge and \n instead?
 | 
					            // TODO maybe merge and \n instead?
 | 
				
			||||||
@@ -636,16 +679,18 @@ public final class FlagCommand extends Command {
 | 
				
			|||||||
            // Flag example
 | 
					            // Flag example
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("flag.flag_info_example"),
 | 
					                    TranslatableCaption.of("flag.flag_info_example"),
 | 
				
			||||||
                    Template.of("command", "/plot flag set"),
 | 
					                    TagResolver.builder()
 | 
				
			||||||
                    Template.of("flag", plotFlag.getName()),
 | 
					                            .tag("command", Tag.preProcessParsed("/plot flag set"))
 | 
				
			||||||
                    Template.of("value", plotFlag.getExample())
 | 
					                            .tag("flag", Tag.preProcessParsed(plotFlag.getName()))
 | 
				
			||||||
 | 
					                            .tag("value", Tag.preProcessParsed(plotFlag.getExample()))
 | 
				
			||||||
 | 
					                            .build()
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            // Default value
 | 
					            // Default value
 | 
				
			||||||
            final String defaultValue = player.getLocation().getPlotArea().getFlagContainer()
 | 
					            final String defaultValue = player.getLocation().getPlotArea().getFlagContainer()
 | 
				
			||||||
                    .getFlagErased(plotFlag.getClass()).toString();
 | 
					                    .getFlagErased(plotFlag.getClass()).toString();
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("flag.flag_info_default_value"),
 | 
					                    TranslatableCaption.of("flag.flag_info_default_value"),
 | 
				
			||||||
                    Template.of("value", defaultValue)
 | 
					                    TagResolver.resolver("value", Tag.inserting(Component.text(defaultValue)))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            // Footer. Done this way to prevent the duplicate-message-thingy from catching it
 | 
					            // Footer. Done this way to prevent the duplicate-message-thingy from catching it
 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("flag.flag_info_footer"));
 | 
					            player.sendMessage(TranslatableCaption.of("flag.flag_info_footer"));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,13 +26,14 @@ import com.plotsquared.core.permissions.Permission;
 | 
				
			|||||||
import com.plotsquared.core.player.MetaDataAccess;
 | 
					import com.plotsquared.core.player.MetaDataAccess;
 | 
				
			||||||
import com.plotsquared.core.player.PlayerMetaDataKeys;
 | 
					import com.plotsquared.core.player.PlayerMetaDataKeys;
 | 
				
			||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.PlayerManager;
 | 
					import com.plotsquared.core.util.PlayerManager;
 | 
				
			||||||
import com.plotsquared.core.util.TabCompletions;
 | 
					import com.plotsquared.core.util.TabCompletions;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal;
 | 
					import com.plotsquared.core.util.task.RunnableVal;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal2;
 | 
					import com.plotsquared.core.util.task.RunnableVal2;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal3;
 | 
					import com.plotsquared.core.util.task.RunnableVal3;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
import java.util.Collections;
 | 
					import java.util.Collections;
 | 
				
			||||||
@@ -64,15 +65,15 @@ public class Grant extends Command {
 | 
				
			|||||||
        checkTrue(
 | 
					        checkTrue(
 | 
				
			||||||
                args.length >= 1 && args.length <= 2,
 | 
					                args.length >= 1 && args.length <= 2,
 | 
				
			||||||
                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                Template.of("value", "/plot grant <check | add> [player]")
 | 
					                TagResolver.resolver("value", Tag.inserting(Component.text("/plot grant <check | add> [player]")))
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        final String arg0 = args[0].toLowerCase();
 | 
					        final String arg0 = args[0].toLowerCase();
 | 
				
			||||||
        switch (arg0) {
 | 
					        switch (arg0) {
 | 
				
			||||||
            case "add", "check" -> {
 | 
					            case "add", "check" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_GRANT.format(arg0))) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_GRANT.format(arg0))) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Template.of("node", Permission.PERMISSION_GRANT.format(arg0))
 | 
					                            TagResolver.resolver("node", Tag.inserting(Component.text(Permission.PERMISSION_GRANT.format(arg0))))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return CompletableFuture.completedFuture(false);
 | 
					                    return CompletableFuture.completedFuture(false);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -85,7 +86,7 @@ public class Grant extends Command {
 | 
				
			|||||||
                    } else if (throwable != null || uuids.size() != 1) {
 | 
					                    } else if (throwable != null || uuids.size() != 1) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("errors.invalid_player"),
 | 
					                                TranslatableCaption.of("errors.invalid_player"),
 | 
				
			||||||
                                Template.of("value", String.valueOf(uuids))
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text(String.valueOf(uuids))))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        final UUID uuid = uuids.iterator().next();
 | 
					                        final UUID uuid = uuids.iterator().next();
 | 
				
			||||||
@@ -96,7 +97,7 @@ public class Grant extends Command {
 | 
				
			|||||||
                                if (args[0].equalsIgnoreCase("check")) {
 | 
					                                if (args[0].equalsIgnoreCase("check")) {
 | 
				
			||||||
                                    player.sendMessage(
 | 
					                                    player.sendMessage(
 | 
				
			||||||
                                            TranslatableCaption.of("grants.granted_plots"),
 | 
					                                            TranslatableCaption.of("grants.granted_plots"),
 | 
				
			||||||
                                            Template.of("amount", String.valueOf(access.get().orElse(0)))
 | 
					                                            TagResolver.resolver("amount", Tag.inserting(Component.text(access.get().orElse(0))))
 | 
				
			||||||
                                    );
 | 
					                                    );
 | 
				
			||||||
                                } else {
 | 
					                                } else {
 | 
				
			||||||
                                    access.set(access.get().orElse(0) + 1);
 | 
					                                    access.set(access.get().orElse(0) + 1);
 | 
				
			||||||
@@ -116,7 +117,7 @@ public class Grant extends Command {
 | 
				
			|||||||
                                        }
 | 
					                                        }
 | 
				
			||||||
                                        player.sendMessage(
 | 
					                                        player.sendMessage(
 | 
				
			||||||
                                                TranslatableCaption.of("grants.granted_plots"),
 | 
					                                                TranslatableCaption.of("grants.granted_plots"),
 | 
				
			||||||
                                                Template.of("amount", String.valueOf(granted))
 | 
					                                                TagResolver.resolver("amount", Tag.inserting(Component.text(granted)))
 | 
				
			||||||
                                        );
 | 
					                                        );
 | 
				
			||||||
                                    } else { // add
 | 
					                                    } else { // add
 | 
				
			||||||
                                        int amount;
 | 
					                                        int amount;
 | 
				
			||||||
@@ -131,7 +132,7 @@ public class Grant extends Command {
 | 
				
			|||||||
                                        DBFunc.addPersistentMeta(uuid, key, rawData, replace);
 | 
					                                        DBFunc.addPersistentMeta(uuid, key, rawData, replace);
 | 
				
			||||||
                                        player.sendMessage(
 | 
					                                        player.sendMessage(
 | 
				
			||||||
                                                TranslatableCaption.of("grants.added"),
 | 
					                                                TranslatableCaption.of("grants.added"),
 | 
				
			||||||
                                                Template.of("grants", String.valueOf(amount))
 | 
					                                                TagResolver.resolver("grants", Tag.inserting(Component.text(amount)))
 | 
				
			||||||
                                        );
 | 
					                                        );
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
@@ -150,10 +151,10 @@ public class Grant extends Command {
 | 
				
			|||||||
    public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
 | 
					    public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
 | 
				
			||||||
        if (args.length == 1) {
 | 
					        if (args.length == 1) {
 | 
				
			||||||
            final List<String> completions = new LinkedList<>();
 | 
					            final List<String> completions = new LinkedList<>();
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_GRANT_ADD)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_GRANT_ADD)) {
 | 
				
			||||||
                completions.add("add");
 | 
					                completions.add("add");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_GRANT_CHECK)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_GRANT_CHECK)) {
 | 
				
			||||||
                completions.add("check");
 | 
					                completions.add("check");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            final List<Command> commands = completions.stream().filter(completion -> completion
 | 
					            final List<Command> commands = completions.stream().filter(completion -> completion
 | 
				
			||||||
@@ -168,7 +169,7 @@ public class Grant extends Command {
 | 
				
			|||||||
                            CommandCategory.ADMINISTRATION
 | 
					                            CommandCategory.ADMINISTRATION
 | 
				
			||||||
                    ) {
 | 
					                    ) {
 | 
				
			||||||
                    }).collect(Collectors.toCollection(LinkedList::new));
 | 
					                    }).collect(Collectors.toCollection(LinkedList::new));
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_GRANT_SINGLE) && args[0].length() > 0) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_GRANT_SINGLE) && args[0].length() > 0) {
 | 
				
			||||||
                commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
					                commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return commands;
 | 
					            return commands;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,8 @@ import com.plotsquared.core.util.task.RunnableVal2;
 | 
				
			|||||||
import com.plotsquared.core.util.task.RunnableVal3;
 | 
					import com.plotsquared.core.util.task.RunnableVal3;
 | 
				
			||||||
import net.kyori.adventure.text.Component;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
import net.kyori.adventure.text.TextComponent;
 | 
					import net.kyori.adventure.text.TextComponent;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
@@ -59,9 +60,10 @@ public class Help extends Command {
 | 
				
			|||||||
            RunnableVal2<Command, CommandResult> whenDone
 | 
					            RunnableVal2<Command, CommandResult> whenDone
 | 
				
			||||||
    ) {
 | 
					    ) {
 | 
				
			||||||
        switch (args.length) {
 | 
					        switch (args.length) {
 | 
				
			||||||
            case 0:
 | 
					            case 0 -> {
 | 
				
			||||||
                return displayHelp(player, null, 0);
 | 
					                return displayHelp(player, null, 0);
 | 
				
			||||||
            case 1:
 | 
					            }
 | 
				
			||||||
 | 
					            case 1 -> {
 | 
				
			||||||
                if (MathMan.isInteger(args[0])) {
 | 
					                if (MathMan.isInteger(args[0])) {
 | 
				
			||||||
                    try {
 | 
					                    try {
 | 
				
			||||||
                        return displayHelp(player, null, Integer.parseInt(args[0]));
 | 
					                        return displayHelp(player, null, Integer.parseInt(args[0]));
 | 
				
			||||||
@@ -71,7 +73,8 @@ public class Help extends Command {
 | 
				
			|||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    return displayHelp(player, args[0], 1);
 | 
					                    return displayHelp(player, args[0], 1);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            case 2:
 | 
					            }
 | 
				
			||||||
 | 
					            case 2 -> {
 | 
				
			||||||
                if (MathMan.isInteger(args[1])) {
 | 
					                if (MathMan.isInteger(args[1])) {
 | 
				
			||||||
                    try {
 | 
					                    try {
 | 
				
			||||||
                        return displayHelp(player, args[0], Integer.parseInt(args[1]));
 | 
					                        return displayHelp(player, args[0], Integer.parseInt(args[1]));
 | 
				
			||||||
@@ -80,8 +83,8 @@ public class Help extends Command {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return CompletableFuture.completedFuture(false);
 | 
					                return CompletableFuture.completedFuture(false);
 | 
				
			||||||
            default:
 | 
					            }
 | 
				
			||||||
                sendUsage(player);
 | 
					            default -> sendUsage(player);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return CompletableFuture.completedFuture(true);
 | 
					        return CompletableFuture.completedFuture(true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -110,27 +113,36 @@ public class Help extends Command {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            if (cat == null && page == 0) {
 | 
					            if (cat == null && page == 0) {
 | 
				
			||||||
                TextComponent.Builder builder = Component.text();
 | 
					                TextComponent.Builder builder = Component.text();
 | 
				
			||||||
                builder.append(MINI_MESSAGE.parse(TranslatableCaption.of("help.help_header").getComponent(player)));
 | 
					                builder.append(MINI_MESSAGE.deserialize(TranslatableCaption.of("help.help_header").getComponent(player)));
 | 
				
			||||||
                for (CommandCategory c : CommandCategory.values()) {
 | 
					                for (CommandCategory c : CommandCategory.values()) {
 | 
				
			||||||
                    if (!c.canAccess(player)) {
 | 
					                    if (!c.canAccess(player)) {
 | 
				
			||||||
                        continue;
 | 
					                        continue;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    builder.append(Component.newline()).append(MINI_MESSAGE
 | 
					                    builder.append(Component.newline()).append(MINI_MESSAGE
 | 
				
			||||||
                            .parse(
 | 
					                            .deserialize(
 | 
				
			||||||
                                    TranslatableCaption.of("help.help_info_item").getComponent(player),
 | 
					                                    TranslatableCaption.of("help.help_info_item").getComponent(player),
 | 
				
			||||||
                                    Template.of("command", "/plot help"),
 | 
					                                    TagResolver.builder()
 | 
				
			||||||
                                    Template.of("category", c.name().toLowerCase()),
 | 
					                                            .tag("command", Tag.inserting(Component.text("/plot help")))
 | 
				
			||||||
                                    Template.of("category_desc", c.getComponent(player))
 | 
					                                            .tag("category", Tag.inserting(Component.text(c.name().toLowerCase())))
 | 
				
			||||||
 | 
					                                            .tag("category_desc", Tag.inserting(c.toComponent(player)))
 | 
				
			||||||
 | 
					                                            .build()
 | 
				
			||||||
                            ));
 | 
					                            ));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                builder.append(Component.newline()).append(MINI_MESSAGE
 | 
					                builder.append(Component.newline()).append(MINI_MESSAGE
 | 
				
			||||||
                        .parse(
 | 
					                        .deserialize(
 | 
				
			||||||
                                TranslatableCaption.of("help.help_info_item").getComponent(player),
 | 
					                                TranslatableCaption.of("help.help_info_item").getComponent(player),
 | 
				
			||||||
                                Template.of("command", "/plot help"),
 | 
					                                TagResolver.builder()
 | 
				
			||||||
                                Template.of("category", "all"),
 | 
					                                        .tag("command", Tag.inserting(Component.text("/plot help")))
 | 
				
			||||||
                                Template.of("category_desc", "Display all commands")
 | 
					                                        .tag("category", Tag.inserting(Component.text("all")))
 | 
				
			||||||
 | 
					                                        .tag(
 | 
				
			||||||
 | 
					                                                "category_desc",
 | 
				
			||||||
 | 
					                                                Tag.inserting(TranslatableCaption
 | 
				
			||||||
 | 
					                                                        .of("help.help_display_all_commands")
 | 
				
			||||||
 | 
					                                                        .toComponent(player))
 | 
				
			||||||
 | 
					                                        )
 | 
				
			||||||
 | 
					                                        .build()
 | 
				
			||||||
                        ));
 | 
					                        ));
 | 
				
			||||||
                builder.append(Component.newline()).append(MINI_MESSAGE.parse(TranslatableCaption
 | 
					                builder.append(Component.newline()).append(MINI_MESSAGE.deserialize(TranslatableCaption
 | 
				
			||||||
                        .of("help.help_footer")
 | 
					                        .of("help.help_footer")
 | 
				
			||||||
                        .getComponent(player)));
 | 
					                        .getComponent(player)));
 | 
				
			||||||
                player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.asComponent())));
 | 
					                player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.asComponent())));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,13 +29,14 @@ import com.plotsquared.core.plot.PlotArea;
 | 
				
			|||||||
import com.plotsquared.core.plot.PlotId;
 | 
					import com.plotsquared.core.plot.PlotId;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.util.MathMan;
 | 
					import com.plotsquared.core.util.MathMan;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.TabCompletions;
 | 
					import com.plotsquared.core.util.TabCompletions;
 | 
				
			||||||
import com.plotsquared.core.util.query.PlotQuery;
 | 
					import com.plotsquared.core.util.query.PlotQuery;
 | 
				
			||||||
import com.plotsquared.core.util.query.SortingStrategy;
 | 
					import com.plotsquared.core.util.query.SortingStrategy;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal2;
 | 
					import com.plotsquared.core.util.task.RunnableVal2;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal3;
 | 
					import com.plotsquared.core.util.task.RunnableVal3;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
@@ -72,8 +73,10 @@ public class HomeCommand extends Command {
 | 
				
			|||||||
        } else if (plots.size() < page || page < 1) {
 | 
					        } else if (plots.size() < page || page < 1) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("invalid.number_not_in_range"),
 | 
					                    TranslatableCaption.of("invalid.number_not_in_range"),
 | 
				
			||||||
                    Template.of("min", "1"),
 | 
					                    TagResolver.builder()
 | 
				
			||||||
                    Template.of("max", String.valueOf(plots.size()))
 | 
					                            .tag("min", Tag.inserting(Component.text(1)))
 | 
				
			||||||
 | 
					                            .tag("max", Tag.inserting(Component.text(plots.size())))
 | 
				
			||||||
 | 
					                            .build()
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -104,11 +107,10 @@ public class HomeCommand extends Command {
 | 
				
			|||||||
        // /plot home <[area;]x;y>
 | 
					        // /plot home <[area;]x;y>
 | 
				
			||||||
        // /plot home <area> <x;y>
 | 
					        // /plot home <area> <x;y>
 | 
				
			||||||
        // /plot home <area> <page>
 | 
					        // /plot home <area> <page>
 | 
				
			||||||
        if (!Permissions.hasPermission(player, Permission.PERMISSION_VISIT_OWNED) && !Permissions
 | 
					        if (!player.hasPermission(Permission.PERMISSION_VISIT_OWNED) && !player.hasPermission(Permission.PERMISSION_HOME)) {
 | 
				
			||||||
                .hasPermission(player, Permission.PERMISSION_HOME)) {
 | 
					 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("permission.no_permission"),
 | 
					                    TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                    Template.of("node", Permission.PERMISSION_VISIT_OWNED.toString())
 | 
					                    TagResolver.resolver("node", Tag.inserting(Component.text(Permission.PERMISSION_VISIT_OWNED.toString())))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return CompletableFuture.completedFuture(false);
 | 
					            return CompletableFuture.completedFuture(false);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -130,7 +132,7 @@ public class HomeCommand extends Command {
 | 
				
			|||||||
                    } catch (NumberFormatException ignored) {
 | 
					                    } catch (NumberFormatException ignored) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("invalid.not_a_number"),
 | 
					                                TranslatableCaption.of("invalid.not_a_number"),
 | 
				
			||||||
                                Template.of("value", identifier)
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text(identifier)))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return CompletableFuture.completedFuture(false);
 | 
					                        return CompletableFuture.completedFuture(false);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -171,7 +173,7 @@ public class HomeCommand extends Command {
 | 
				
			|||||||
                    } catch (NumberFormatException ignored) {
 | 
					                    } catch (NumberFormatException ignored) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("invalid.not_a_number"),
 | 
					                                TranslatableCaption.of("invalid.not_a_number"),
 | 
				
			||||||
                                Template.of("value", identifier)
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text(identifier)))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return CompletableFuture.completedFuture(false);
 | 
					                        return CompletableFuture.completedFuture(false);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,6 @@ package com.plotsquared.core.command;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import com.google.inject.TypeLiteral;
 | 
					import com.google.inject.TypeLiteral;
 | 
				
			||||||
import com.plotsquared.core.configuration.caption.StaticCaption;
 | 
					import com.plotsquared.core.configuration.caption.StaticCaption;
 | 
				
			||||||
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.permissions.Permission;
 | 
					import com.plotsquared.core.permissions.Permission;
 | 
				
			||||||
import com.plotsquared.core.player.MetaDataAccess;
 | 
					import com.plotsquared.core.player.MetaDataAccess;
 | 
				
			||||||
@@ -30,13 +29,13 @@ import com.plotsquared.core.plot.Plot;
 | 
				
			|||||||
import com.plotsquared.core.plot.comment.CommentInbox;
 | 
					import com.plotsquared.core.plot.comment.CommentInbox;
 | 
				
			||||||
import com.plotsquared.core.plot.comment.CommentManager;
 | 
					import com.plotsquared.core.plot.comment.CommentManager;
 | 
				
			||||||
import com.plotsquared.core.plot.comment.PlotComment;
 | 
					import com.plotsquared.core.plot.comment.PlotComment;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.StringMan;
 | 
					import com.plotsquared.core.util.StringMan;
 | 
				
			||||||
import com.plotsquared.core.util.TabCompletions;
 | 
					import com.plotsquared.core.util.TabCompletions;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal;
 | 
					import com.plotsquared.core.util.task.RunnableVal;
 | 
				
			||||||
import net.kyori.adventure.text.Component;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
import net.kyori.adventure.text.TextComponent;
 | 
					import net.kyori.adventure.text.TextComponent;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
import java.util.Collections;
 | 
					import java.util.Collections;
 | 
				
			||||||
@@ -72,41 +71,44 @@ public class Inbox extends SubCommand {
 | 
				
			|||||||
            max = comments.length;
 | 
					            max = comments.length;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        TextComponent.Builder builder = Component.text();
 | 
					        TextComponent.Builder builder = Component.text();
 | 
				
			||||||
        builder.append(MINI_MESSAGE.parse(TranslatableCaption.of("list.comment_list_header_paged").getComponent(player) + '\n',
 | 
					        builder.append(MINI_MESSAGE.deserialize(
 | 
				
			||||||
                Template.of("amount", String.valueOf(comments.length)), Template.of("cur", String.valueOf(page + 1)),
 | 
					                TranslatableCaption.of("list.comment_list_header_paged").getComponent(player) + '\n',
 | 
				
			||||||
                Template.of("max", String.valueOf(totalPages + 1)), Template.of("word", "all")
 | 
					                TagResolver.builder()
 | 
				
			||||||
 | 
					                        .tag("amount", Tag.inserting(Component.text(comments.length)))
 | 
				
			||||||
 | 
					                        .tag("cur", Tag.inserting(Component.text(page + 1)))
 | 
				
			||||||
 | 
					                        .tag("max", Tag.inserting(Component.text(totalPages + 1)))
 | 
				
			||||||
 | 
					                        .tag("word", Tag.inserting(Component.text("all")))
 | 
				
			||||||
 | 
					                        .build()
 | 
				
			||||||
        ));
 | 
					        ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // This might work xD
 | 
					        // This might work xD
 | 
				
			||||||
        for (int x = page * 12; x < max; x++) {
 | 
					        for (int x = page * 12; x < max; x++) {
 | 
				
			||||||
            PlotComment comment = comments[x];
 | 
					            PlotComment comment = comments[x];
 | 
				
			||||||
            Component commentColored;
 | 
					            Component commentColored;
 | 
				
			||||||
            if (player.getName().equals(comment.senderName)) {
 | 
					            if (player.getName().equals(comment.senderName())) {
 | 
				
			||||||
                commentColored = MINI_MESSAGE
 | 
					                commentColored = MINI_MESSAGE
 | 
				
			||||||
                        .parse(
 | 
					                        .deserialize(
 | 
				
			||||||
                                TranslatableCaption.of("list.comment_list_by_lister").getComponent(player),
 | 
					                                TranslatableCaption.of("list.comment_list_by_lister").getComponent(player),
 | 
				
			||||||
                                Template.of("comment", comment.comment)
 | 
					                                TagResolver.resolver("comment", Tag.inserting(Component.text(comment.comment())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                commentColored = MINI_MESSAGE
 | 
					                commentColored = MINI_MESSAGE
 | 
				
			||||||
                        .parse(
 | 
					                        .deserialize(
 | 
				
			||||||
                                TranslatableCaption.of("list.comment_list_by_other").getComponent(player),
 | 
					                                TranslatableCaption.of("list.comment_list_by_other").getComponent(player),
 | 
				
			||||||
                                Template.of("comment", comment.comment)
 | 
					                                TagResolver.resolver("comment", Tag.inserting(Component.text(comment.comment())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Template number = Template.of("number", String.valueOf(x));
 | 
					            TagResolver resolver = TagResolver.builder()
 | 
				
			||||||
            Template world = Template.of("world", comment.world);
 | 
					                    .tag("number", Tag.inserting(Component.text(x)))
 | 
				
			||||||
            Template plot_id = Template.of("plot_id", comment.id.getX() + ";" + comment.id.getY());
 | 
					                    .tag("world", Tag.inserting(Component.text(comment.world())))
 | 
				
			||||||
            Template commenter = Template.of("commenter", comment.senderName);
 | 
					                    .tag("plot_id", Tag.inserting(Component.text(comment.id().getX() + ";" + comment.id().getY())))
 | 
				
			||||||
            Template commentTemplate = Template.of("comment", commentColored);
 | 
					                    .tag("commenter", Tag.inserting(Component.text(comment.senderName())))
 | 
				
			||||||
 | 
					                    .tag("comment", Tag.inserting(commentColored))
 | 
				
			||||||
 | 
					                    .build();
 | 
				
			||||||
            builder.append(MINI_MESSAGE
 | 
					            builder.append(MINI_MESSAGE
 | 
				
			||||||
                    .parse(
 | 
					                    .deserialize(
 | 
				
			||||||
                            TranslatableCaption.of("list.comment_list_comment").getComponent(player),
 | 
					                            TranslatableCaption.of("list.comment_list_comment").getComponent(player),
 | 
				
			||||||
                            number,
 | 
					                            resolver
 | 
				
			||||||
                            world,
 | 
					 | 
				
			||||||
                            plot_id,
 | 
					 | 
				
			||||||
                            commenter,
 | 
					 | 
				
			||||||
                            commentTemplate
 | 
					 | 
				
			||||||
                    ));
 | 
					                    ));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.build())));
 | 
					        player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.build())));
 | 
				
			||||||
@@ -135,7 +137,7 @@ public class Inbox extends SubCommand {
 | 
				
			|||||||
                                int unread = 0;
 | 
					                                int unread = 0;
 | 
				
			||||||
                                for (PlotComment comment : value) {
 | 
					                                for (PlotComment comment : value) {
 | 
				
			||||||
                                    total++;
 | 
					                                    total++;
 | 
				
			||||||
                                    if (comment.timestamp > CommentManager
 | 
					                                    if (comment.timestamp() > CommentManager
 | 
				
			||||||
                                            .getTimestamp(player, inbox.toString())) {
 | 
					                                            .getTimestamp(player, inbox.toString())) {
 | 
				
			||||||
                                        unread++;
 | 
					                                        unread++;
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
@@ -143,20 +145,23 @@ public class Inbox extends SubCommand {
 | 
				
			|||||||
                                if (total != 0) {
 | 
					                                if (total != 0) {
 | 
				
			||||||
                                    player.sendMessage(
 | 
					                                    player.sendMessage(
 | 
				
			||||||
                                            TranslatableCaption.of("comment.inbox_item"),
 | 
					                                            TranslatableCaption.of("comment.inbox_item"),
 | 
				
			||||||
                                            Template.of("value", inbox + " (" + total + '/' + unread + ')')
 | 
					                                            TagResolver.resolver(
 | 
				
			||||||
 | 
					                                                    "value",
 | 
				
			||||||
 | 
					                                                    Tag.inserting(Component.text(inbox + " (" + total + '/' + unread + ')'))
 | 
				
			||||||
 | 
					                                            )
 | 
				
			||||||
                                    );
 | 
					                                    );
 | 
				
			||||||
                                    return;
 | 
					                                    return;
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("comment.inbox_item"),
 | 
					                                    TranslatableCaption.of("comment.inbox_item"),
 | 
				
			||||||
                                    Template.of("value", inbox.toString())
 | 
					                                    TagResolver.resolver("value", Tag.inserting(Component.text(inbox.toString())))
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    })) {
 | 
					                    })) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("comment.inbox_item"),
 | 
					                                TranslatableCaption.of("comment.inbox_item"),
 | 
				
			||||||
                                Template.of("value", inbox.toString())
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text(inbox.toString())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -167,7 +172,10 @@ public class Inbox extends SubCommand {
 | 
				
			|||||||
        if (inbox == null) {
 | 
					        if (inbox == null) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("comment.invalid_inbox"),
 | 
					                    TranslatableCaption.of("comment.invalid_inbox"),
 | 
				
			||||||
                    Template.of("list", StringMan.join(CommentManager.inboxes.keySet(), ", "))
 | 
					                    TagResolver.resolver(
 | 
				
			||||||
 | 
					                            "list",
 | 
				
			||||||
 | 
					                            Tag.inserting(Component.text(StringMan.join(CommentManager.inboxes.keySet(), ", ")))
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -182,7 +190,7 @@ public class Inbox extends SubCommand {
 | 
				
			|||||||
        final int page;
 | 
					        final int page;
 | 
				
			||||||
        if (args.length > 1) {
 | 
					        if (args.length > 1) {
 | 
				
			||||||
            switch (args[1].toLowerCase()) {
 | 
					            switch (args[1].toLowerCase()) {
 | 
				
			||||||
                case "delete":
 | 
					                case "delete" -> {
 | 
				
			||||||
                    if (!inbox.canModify(plot, player)) {
 | 
					                    if (!inbox.canModify(plot, player)) {
 | 
				
			||||||
                        player.sendMessage(TranslatableCaption.of("comment.no_perm_inbox_modify"));
 | 
					                        player.sendMessage(TranslatableCaption.of("comment.no_perm_inbox_modify"));
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
@@ -190,7 +198,10 @@ public class Inbox extends SubCommand {
 | 
				
			|||||||
                    if (args.length != 3) {
 | 
					                    if (args.length != 3) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                                Template.of("value", "/plot inbox " + inbox + " delete <index>")
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "value",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Component.text("/plot inbox " + inbox + " delete <index>"))
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return true;
 | 
					                        return true;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -200,25 +211,27 @@ public class Inbox extends SubCommand {
 | 
				
			|||||||
                        if (index < 1) {
 | 
					                        if (index < 1) {
 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("comment.not_valid_inbox_index"),
 | 
					                                    TranslatableCaption.of("comment.not_valid_inbox_index"),
 | 
				
			||||||
                                    Templates.of("number", index)
 | 
					                                    TagResolver.resolver("number", Tag.inserting(Component.text(index)))
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                            return false;
 | 
					                            return false;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    } catch (NumberFormatException ignored) {
 | 
					                    } catch (NumberFormatException ignored) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                                Template.of("value", "/plot inbox " + inbox + " delete <index>")
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "value",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Component.text("/plot inbox " + inbox + " delete <index>"))
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
                    if (!inbox.getComments(plot, new RunnableVal<>() {
 | 
					                    if (!inbox.getComments(plot, new RunnableVal<>() {
 | 
				
			||||||
                        @Override
 | 
					                        @Override
 | 
				
			||||||
                        public void run(List<PlotComment> value) {
 | 
					                        public void run(List<PlotComment> value) {
 | 
				
			||||||
                            if (index > value.size()) {
 | 
					                            if (index > value.size()) {
 | 
				
			||||||
                                player.sendMessage(
 | 
					                                player.sendMessage(
 | 
				
			||||||
                                        TranslatableCaption.of("comment.not_valid_inbox_index"),
 | 
					                                        TranslatableCaption.of("comment.not_valid_inbox_index"),
 | 
				
			||||||
                                        Templates.of("number", index)
 | 
					                                        TagResolver.resolver("number", Tag.inserting(Component.text(index)))
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                                return;
 | 
					                                return;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
@@ -228,7 +241,7 @@ public class Inbox extends SubCommand {
 | 
				
			|||||||
                            if (success) {
 | 
					                            if (success) {
 | 
				
			||||||
                                player.sendMessage(
 | 
					                                player.sendMessage(
 | 
				
			||||||
                                        TranslatableCaption.of("comment.comment_removed_success"),
 | 
					                                        TranslatableCaption.of("comment.comment_removed_success"),
 | 
				
			||||||
                                        Template.of("value", comment.comment)
 | 
					                                        TagResolver.resolver("value", Tag.inserting(Component.text(comment.comment())))
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                            } else {
 | 
					                            } else {
 | 
				
			||||||
                                player.sendMessage(
 | 
					                                player.sendMessage(
 | 
				
			||||||
@@ -240,7 +253,8 @@ public class Inbox extends SubCommand {
 | 
				
			|||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    return true;
 | 
					                    return true;
 | 
				
			||||||
                case "clear":
 | 
					                }
 | 
				
			||||||
 | 
					                case "clear" -> {
 | 
				
			||||||
                    if (!inbox.canModify(plot, player)) {
 | 
					                    if (!inbox.canModify(plot, player)) {
 | 
				
			||||||
                        player.sendMessage(TranslatableCaption.of("comment.no_perm_inbox_modify"));
 | 
					                        player.sendMessage(TranslatableCaption.of("comment.no_perm_inbox_modify"));
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -249,12 +263,13 @@ public class Inbox extends SubCommand {
 | 
				
			|||||||
                    if (!comments.isEmpty()) {
 | 
					                    if (!comments.isEmpty()) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("comment.comment_removed_success"),
 | 
					                                TranslatableCaption.of("comment.comment_removed_success"),
 | 
				
			||||||
                                Template.of("value", String.valueOf(comments))
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text("*")))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        plot.getPlotCommentContainer().removeComments(comments);
 | 
					                        plot.getPlotCommentContainer().removeComments(comments);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    return true;
 | 
					                    return true;
 | 
				
			||||||
                default:
 | 
					                }
 | 
				
			||||||
 | 
					                default -> {
 | 
				
			||||||
                    try {
 | 
					                    try {
 | 
				
			||||||
                        page = Integer.parseInt(args[1]);
 | 
					                        page = Integer.parseInt(args[1]);
 | 
				
			||||||
                    } catch (NumberFormatException ignored) {
 | 
					                    } catch (NumberFormatException ignored) {
 | 
				
			||||||
@@ -262,6 +277,7 @@ public class Inbox extends SubCommand {
 | 
				
			|||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            page = 1;
 | 
					            page = 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -285,13 +301,13 @@ public class Inbox extends SubCommand {
 | 
				
			|||||||
    public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
 | 
					    public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
 | 
				
			||||||
        if (args.length == 1) {
 | 
					        if (args.length == 1) {
 | 
				
			||||||
            final List<String> completions = new LinkedList<>();
 | 
					            final List<String> completions = new LinkedList<>();
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_INBOX_READ_OWNER)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_INBOX_READ_OWNER)) {
 | 
				
			||||||
                completions.add("owner");
 | 
					                completions.add("owner");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_INBOX_READ_PUBLIC)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_INBOX_READ_PUBLIC)) {
 | 
				
			||||||
                completions.add("public");
 | 
					                completions.add("public");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_INBOX_READ_REPORT)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_INBOX_READ_REPORT)) {
 | 
				
			||||||
                completions.add("report");
 | 
					                completions.add("report");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            final List<Command> commands = completions.stream().filter(completion -> completion
 | 
					            final List<Command> commands = completions.stream().filter(completion -> completion
 | 
				
			||||||
@@ -299,7 +315,7 @@ public class Inbox extends SubCommand {
 | 
				
			|||||||
                            .startsWith(args[0].toLowerCase()))
 | 
					                            .startsWith(args[0].toLowerCase()))
 | 
				
			||||||
                    .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.CHAT) {
 | 
					                    .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.CHAT) {
 | 
				
			||||||
                    }).collect(Collectors.toCollection(LinkedList::new));
 | 
					                    }).collect(Collectors.toCollection(LinkedList::new));
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_INBOX) && args[0].length() > 0) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_INBOX) && args[0].length() > 0) {
 | 
				
			||||||
                commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
					                commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return commands;
 | 
					            return commands;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,9 +27,10 @@ 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;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.HideInfoFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.HideInfoFlag;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.TabCompletions;
 | 
					import com.plotsquared.core.util.TabCompletions;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
import java.util.Collections;
 | 
					import java.util.Collections;
 | 
				
			||||||
@@ -51,7 +52,8 @@ public class Info extends SubCommand {
 | 
				
			|||||||
            arg = args[0];
 | 
					            arg = args[0];
 | 
				
			||||||
            switch (arg) {
 | 
					            switch (arg) {
 | 
				
			||||||
                // TODO: (re?)implement /plot info inv. (it was never properly implemented)
 | 
					                // TODO: (re?)implement /plot info inv. (it was never properly implemented)
 | 
				
			||||||
                case "trusted", "alias", "biome", "denied", "flags", "id", "size", "members", "creationdate", "seen", "owner", "rating", "likes" -> plot = Plot
 | 
					                case "trusted", "alias", "biome", "denied", "flags", "id", "size", "members", "creationdate", "seen", "owner", "rating", "likes" ->
 | 
				
			||||||
 | 
					                        plot = Plot
 | 
				
			||||||
                                .getPlotFromString(player, null, false);
 | 
					                                .getPlotFromString(player, null, false);
 | 
				
			||||||
                default -> {
 | 
					                default -> {
 | 
				
			||||||
                    plot = Plot.getPlotFromString(player, arg, false);
 | 
					                    plot = Plot.getPlotFromString(player, arg, false);
 | 
				
			||||||
@@ -91,7 +93,10 @@ public class Info extends SubCommand {
 | 
				
			|||||||
                            .hasPermission(Permission.PERMISSION_AREA_INFO_FORCE.toString())) {
 | 
					                            .hasPermission(Permission.PERMISSION_AREA_INFO_FORCE.toString())) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission"),
 | 
					                                TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                                Template.of("node", Permission.PERMISSION_AREA_INFO_FORCE.toString())
 | 
					                                TagResolver.resolver(
 | 
				
			||||||
 | 
					                                        "node",
 | 
				
			||||||
 | 
					                                        Tag.inserting(Permission.PERMISSION_AREA_INFO_FORCE)
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return true;
 | 
					                        return true;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -113,7 +118,10 @@ public class Info extends SubCommand {
 | 
				
			|||||||
        if (!hasOwner && !containsEveryone && !trustedEveryone) {
 | 
					        if (!hasOwner && !containsEveryone && !trustedEveryone) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("info.plot_info_unclaimed"),
 | 
					                    TranslatableCaption.of("info.plot_info_unclaimed"),
 | 
				
			||||||
                    Template.of("plot", plot.getId().getX() + ";" + plot.getId().getY())
 | 
					                    TagResolver.resolver(
 | 
				
			||||||
 | 
					                            "plot",
 | 
				
			||||||
 | 
					                            Tag.inserting(Component.text(plot.getId().getX() + ";" + plot.getId().getY()))
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -144,7 +152,7 @@ public class Info extends SubCommand {
 | 
				
			|||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
 | 
					    public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
 | 
				
			||||||
        final List<String> completions = new LinkedList<>();
 | 
					        final List<String> completions = new LinkedList<>();
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_INFO_FORCE)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_AREA_INFO_FORCE)) {
 | 
				
			||||||
            completions.add("-f");
 | 
					            completions.add("-f");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -154,7 +162,7 @@ public class Info extends SubCommand {
 | 
				
			|||||||
                .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) {
 | 
					                .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) {
 | 
				
			||||||
                }).collect(Collectors.toCollection(LinkedList::new));
 | 
					                }).collect(Collectors.toCollection(LinkedList::new));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_INFO_FORCE) && args[0].length() > 0) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_AREA_INFO_FORCE) && args[0].length() > 0) {
 | 
				
			||||||
            commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
					            commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,11 +27,12 @@ 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;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.PlayerManager;
 | 
					import com.plotsquared.core.util.PlayerManager;
 | 
				
			||||||
import com.plotsquared.core.util.TabCompletions;
 | 
					import com.plotsquared.core.util.TabCompletions;
 | 
				
			||||||
import com.plotsquared.core.util.WorldUtil;
 | 
					import com.plotsquared.core.util.WorldUtil;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
@@ -70,8 +71,7 @@ public class Kick extends SubCommand {
 | 
				
			|||||||
            player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
 | 
					            player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if ((!plot.hasOwner() || !plot.isOwner(player.getUUID())) && !Permissions
 | 
					        if ((!plot.hasOwner() || !plot.isOwner(player.getUUID())) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_KICK)) {
 | 
				
			||||||
                .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_KICK)) {
 | 
					 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
 | 
					            player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -82,15 +82,14 @@ public class Kick extends SubCommand {
 | 
				
			|||||||
            } else if (throwable != null || uuids.isEmpty()) {
 | 
					            } else if (throwable != null || uuids.isEmpty()) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("errors.invalid_player"),
 | 
					                        TranslatableCaption.of("errors.invalid_player"),
 | 
				
			||||||
                        Template.of("value", args[0])
 | 
					                        TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                Set<PlotPlayer<?>> players = new HashSet<>();
 | 
					                Set<PlotPlayer<?>> players = new HashSet<>();
 | 
				
			||||||
                for (UUID uuid : uuids) {
 | 
					                for (UUID uuid : uuids) {
 | 
				
			||||||
                    if (uuid == DBFunc.EVERYONE) {
 | 
					                    if (uuid == DBFunc.EVERYONE) {
 | 
				
			||||||
                        for (PlotPlayer<?> pp : plot.getPlayersInPlot()) {
 | 
					                        for (PlotPlayer<?> pp : plot.getPlayersInPlot()) {
 | 
				
			||||||
                            if (pp == player || Permissions
 | 
					                            if (pp == player || pp.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_DENIED)) {
 | 
				
			||||||
                                    .hasPermission(pp, Permission.PERMISSION_ADMIN_ENTRY_DENIED)) {
 | 
					 | 
				
			||||||
                                continue;
 | 
					                                continue;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            players.add(pp);
 | 
					                            players.add(pp);
 | 
				
			||||||
@@ -106,22 +105,22 @@ public class Kick extends SubCommand {
 | 
				
			|||||||
                if (players.isEmpty()) {
 | 
					                if (players.isEmpty()) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("errors.invalid_player"),
 | 
					                            TranslatableCaption.of("errors.invalid_player"),
 | 
				
			||||||
                            Template.of("value", args[0])
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                for (PlotPlayer<?> player2 : players) {
 | 
					                for (PlotPlayer<?> player2 : players) {
 | 
				
			||||||
                    if (!plot.equals(player2.getCurrentPlot())) {
 | 
					                    if (!plot.equals(player2.getCurrentPlot())) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("errors.invalid_player"),
 | 
					                                TranslatableCaption.of("kick.player_not_in_plot"),
 | 
				
			||||||
                                Template.of("value", args[0])
 | 
					                                TagResolver.resolver("player", Tag.inserting(Component.text(player2.getName())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    if (Permissions.hasPermission(player2, Permission.PERMISSION_ADMIN_ENTRY_DENIED)) {
 | 
					                    if (player2.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_DENIED)) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("cluster.cannot_kick_player"),
 | 
					                                TranslatableCaption.of("kick.cannot_kick_player"),
 | 
				
			||||||
                                Template.of("name", player2.getName())
 | 
					                                TagResolver.resolver("player", Tag.inserting(Component.text(player2.getName())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,9 @@ import com.plotsquared.core.plot.Plot;
 | 
				
			|||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal2;
 | 
					import com.plotsquared.core.util.task.RunnableVal2;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal3;
 | 
					import com.plotsquared.core.util.task.RunnableVal3;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.UUID;
 | 
					import java.util.UUID;
 | 
				
			||||||
@@ -67,7 +69,7 @@ public class Leave extends Command {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("member.plot_left"),
 | 
					                        TranslatableCaption.of("member.plot_left"),
 | 
				
			||||||
                        Template.of("player", player.getName())
 | 
					                        TagResolver.resolver("player", Tag.inserting(Component.text(player.getName())))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,11 +30,12 @@ import com.plotsquared.core.plot.Plot;
 | 
				
			|||||||
import com.plotsquared.core.plot.Rating;
 | 
					import com.plotsquared.core.plot.Rating;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.TabCompletions;
 | 
					import com.plotsquared.core.util.TabCompletions;
 | 
				
			||||||
import com.plotsquared.core.util.query.PlotQuery;
 | 
					import com.plotsquared.core.util.query.PlotQuery;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskManager;
 | 
					import com.plotsquared.core.util.task.TaskManager;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
@@ -121,8 +122,7 @@ public class Like extends SubCommand {
 | 
				
			|||||||
                        player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
 | 
					                        player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    if (!Permissions
 | 
					                    if (!player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS, true)) {
 | 
				
			||||||
                            .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS, true)) {
 | 
					 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    plot.clearRatings();
 | 
					                    plot.clearRatings();
 | 
				
			||||||
@@ -153,7 +153,7 @@ public class Like extends SubCommand {
 | 
				
			|||||||
            if (oldRating != null) {
 | 
					            if (oldRating != null) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("ratings.rating_already_exists"),
 | 
					                        TranslatableCaption.of("ratings.rating_already_exists"),
 | 
				
			||||||
                        Template.of("plot", plot.getId().toString())
 | 
					                        TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -171,12 +171,12 @@ public class Like extends SubCommand {
 | 
				
			|||||||
                if (like) {
 | 
					                if (like) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("ratings.rating_liked"),
 | 
					                            TranslatableCaption.of("ratings.rating_liked"),
 | 
				
			||||||
                            Template.of("plot", plot.getId().toString())
 | 
					                            TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("ratings.rating_disliked"),
 | 
					                            TranslatableCaption.of("ratings.rating_disliked"),
 | 
				
			||||||
                            Template.of("plot", plot.getId().toString())
 | 
					                            TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -204,7 +204,7 @@ public class Like extends SubCommand {
 | 
				
			|||||||
    public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
 | 
					    public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
 | 
				
			||||||
        if (args.length == 1) {
 | 
					        if (args.length == 1) {
 | 
				
			||||||
            final List<String> completions = new LinkedList<>();
 | 
					            final List<String> completions = new LinkedList<>();
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS)) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS)) {
 | 
				
			||||||
                completions.add("purge");
 | 
					                completions.add("purge");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            final List<Command> commands = completions.stream().filter(completion -> completion
 | 
					            final List<Command> commands = completions.stream().filter(completion -> completion
 | 
				
			||||||
@@ -212,7 +212,7 @@ public class Like extends SubCommand {
 | 
				
			|||||||
                            .startsWith(args[0].toLowerCase()))
 | 
					                            .startsWith(args[0].toLowerCase()))
 | 
				
			||||||
                    .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) {
 | 
					                    .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) {
 | 
				
			||||||
                    }).collect(Collectors.toCollection(LinkedList::new));
 | 
					                    }).collect(Collectors.toCollection(LinkedList::new));
 | 
				
			||||||
            if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) {
 | 
					            if (player.hasPermission(Permission.PERMISSION_RATE) && args[0].length() > 0) {
 | 
				
			||||||
                commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
					                commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return commands;
 | 
					            return commands;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,6 @@ import com.plotsquared.core.PlotSquared;
 | 
				
			|||||||
import com.plotsquared.core.configuration.Settings;
 | 
					import com.plotsquared.core.configuration.Settings;
 | 
				
			||||||
import com.plotsquared.core.configuration.caption.Caption;
 | 
					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.TranslatableCaption;
 | 
					import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
				
			||||||
import com.plotsquared.core.database.DBFunc;
 | 
					import com.plotsquared.core.database.DBFunc;
 | 
				
			||||||
import com.plotsquared.core.permissions.Permission;
 | 
					import com.plotsquared.core.permissions.Permission;
 | 
				
			||||||
@@ -36,7 +35,6 @@ 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;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.PlayerManager;
 | 
					import com.plotsquared.core.util.PlayerManager;
 | 
				
			||||||
import com.plotsquared.core.util.StringComparison;
 | 
					import com.plotsquared.core.util.StringComparison;
 | 
				
			||||||
import com.plotsquared.core.util.StringMan;
 | 
					import com.plotsquared.core.util.StringMan;
 | 
				
			||||||
@@ -47,7 +45,8 @@ import com.plotsquared.core.util.task.RunnableVal3;
 | 
				
			|||||||
import com.plotsquared.core.uuid.UUIDMapping;
 | 
					import com.plotsquared.core.uuid.UUIDMapping;
 | 
				
			||||||
import net.kyori.adventure.text.Component;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
import net.kyori.adventure.text.TextComponent;
 | 
					import net.kyori.adventure.text.TextComponent;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
@@ -82,40 +81,40 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private String[] getArgumentList(PlotPlayer<?> player) {
 | 
					    private String[] getArgumentList(PlotPlayer<?> player) {
 | 
				
			||||||
        List<String> args = new ArrayList<>();
 | 
					        List<String> args = new ArrayList<>();
 | 
				
			||||||
        if (this.econHandler != null && Permissions.hasPermission(player, Permission.PERMISSION_LIST_FOR_SALE)) {
 | 
					        if (this.econHandler != null && player.hasPermission(Permission.PERMISSION_LIST_FOR_SALE)) {
 | 
				
			||||||
            args.add("forsale");
 | 
					            args.add("forsale");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_MINE)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_MINE)) {
 | 
				
			||||||
            args.add("mine");
 | 
					            args.add("mine");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_SHARED)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_SHARED)) {
 | 
				
			||||||
            args.add("shared");
 | 
					            args.add("shared");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_WORLD)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_WORLD)) {
 | 
				
			||||||
            args.add("world");
 | 
					            args.add("world");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_TOP)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_TOP)) {
 | 
				
			||||||
            args.add("top");
 | 
					            args.add("top");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_ALL)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_ALL)) {
 | 
				
			||||||
            args.add("all");
 | 
					            args.add("all");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_UNOWNED)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_UNOWNED)) {
 | 
				
			||||||
            args.add("unowned");
 | 
					            args.add("unowned");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_PLAYER)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_PLAYER)) {
 | 
				
			||||||
            args.add("<player>");
 | 
					            args.add("<player>");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_WORLD)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_WORLD)) {
 | 
				
			||||||
            args.add("<world>");
 | 
					            args.add("<world>");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_DONE)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_DONE)) {
 | 
				
			||||||
            args.add("done");
 | 
					            args.add("done");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_EXPIRED)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_EXPIRED)) {
 | 
				
			||||||
            args.add("expired");
 | 
					            args.add("expired");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_FUZZY)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_FUZZY)) {
 | 
				
			||||||
            args.add("fuzzy <search...>");
 | 
					            args.add("fuzzy <search...>");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return args.toArray(new String[args.size()]);
 | 
					        return args.toArray(new String[args.size()]);
 | 
				
			||||||
@@ -124,7 +123,7 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
    public void noArgs(PlotPlayer<?> player) {
 | 
					    public void noArgs(PlotPlayer<?> player) {
 | 
				
			||||||
        player.sendMessage(
 | 
					        player.sendMessage(
 | 
				
			||||||
                TranslatableCaption.of("commandconfig.subcommand_set_options_header"),
 | 
					                TranslatableCaption.of("commandconfig.subcommand_set_options_header"),
 | 
				
			||||||
                Templates.of("values", Arrays.toString(getArgumentList(player)))
 | 
					                TagResolver.resolver("values", Tag.inserting(Component.text(Arrays.toString(getArgumentList(player)))))
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -160,9 +159,14 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
            if (query == null) {
 | 
					            if (query == null) {
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("commandconfig.did_you_mean"),
 | 
					                        TranslatableCaption.of("commandconfig.did_you_mean"),
 | 
				
			||||||
                        Template.of(
 | 
					                        TagResolver.resolver(
 | 
				
			||||||
                                "value",
 | 
					                                "value",
 | 
				
			||||||
                                new StringComparison<>(args[0], new String[]{"mine", "shared", "world", "all"}).getBestMatch()
 | 
					                                Tag.inserting(Component.text(
 | 
				
			||||||
 | 
					                                        new StringComparison<>(
 | 
				
			||||||
 | 
					                                                args[0],
 | 
				
			||||||
 | 
					                                                new String[]{"mine", "shared", "world", "all"}
 | 
				
			||||||
 | 
					                                        ).getBestMatch()
 | 
				
			||||||
 | 
					                                ))
 | 
				
			||||||
                        )
 | 
					                        )
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
@@ -187,10 +191,10 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        switch (arg) {
 | 
					        switch (arg) {
 | 
				
			||||||
            case "mine" -> {
 | 
					            case "mine" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_MINE)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_LIST_MINE)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Templates.of("node", "plots.list.mine")
 | 
					                            TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.mine")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -202,10 +206,10 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
                        .withSortingStrategy(SortingStrategy.SORT_BY_TEMP));
 | 
					                        .withSortingStrategy(SortingStrategy.SORT_BY_TEMP));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "shared" -> {
 | 
					            case "shared" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_SHARED)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_LIST_SHARED)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Templates.of("node", "plots.list.shared")
 | 
					                            TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.shared")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -215,27 +219,27 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
                        .thatPasses(plot -> !plot.isOwnerAbs(player.getUUID())));
 | 
					                        .thatPasses(plot -> !plot.isOwnerAbs(player.getUUID())));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "world" -> {
 | 
					            case "world" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_WORLD)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_LIST_WORLD)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Templates.of("node", "plots.list.world")
 | 
					                            TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.world")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!Permissions.hasPermission(player, "plots.list.world." + world)) {
 | 
					                if (!player.hasPermission("plots.list.world." + world)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Templates.of("node", "plots.list.world." + world)
 | 
					                            TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.world." + world)))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                plotConsumer.accept(PlotQuery.newQuery().inWorld(world));
 | 
					                plotConsumer.accept(PlotQuery.newQuery().inWorld(world));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "expired" -> {
 | 
					            case "expired" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_EXPIRED)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_LIST_EXPIRED)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Templates.of("node", "plots.list.expired")
 | 
					                            TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.expired")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -246,17 +250,17 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "area" -> {
 | 
					            case "area" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_AREA)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_LIST_AREA)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Templates.of("node", "plots.list.area")
 | 
					                            TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.area")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (!Permissions.hasPermission(player, "plots.list.world." + world)) {
 | 
					                if (!player.hasPermission("plots.list.world." + world)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Templates.of("node", "plots.list.world." + world)
 | 
					                            TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.world." + world)))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -267,20 +271,20 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "all" -> {
 | 
					            case "all" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_ALL)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_LIST_ALL)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Templates.of("node", "plots.list.all")
 | 
					                            TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.all")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                plotConsumer.accept(PlotQuery.newQuery().allPlots());
 | 
					                plotConsumer.accept(PlotQuery.newQuery().allPlots());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "done" -> {
 | 
					            case "done" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_DONE)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_LIST_DONE)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Templates.of("node", "plots.list.done")
 | 
					                            TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.done")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -292,10 +296,10 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
                        .withSortingStrategy(SortingStrategy.SORT_BY_DONE));
 | 
					                        .withSortingStrategy(SortingStrategy.SORT_BY_DONE));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "top" -> {
 | 
					            case "top" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_TOP)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_LIST_TOP)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Templates.of("node", "plots.list.top")
 | 
					                            TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.top")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -303,10 +307,10 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
                plotConsumer.accept(PlotQuery.newQuery().allPlots().withSortingStrategy(SortingStrategy.SORT_BY_RATING));
 | 
					                plotConsumer.accept(PlotQuery.newQuery().allPlots().withSortingStrategy(SortingStrategy.SORT_BY_RATING));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "forsale" -> {
 | 
					            case "forsale" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_FOR_SALE)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_LIST_FOR_SALE)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Templates.of("node", "plots.list.forsale")
 | 
					                            TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.forsale")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -316,27 +320,27 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
                plotConsumer.accept(PlotQuery.newQuery().allPlots().thatPasses(plot -> plot.getFlag(PriceFlag.class) > 0));
 | 
					                plotConsumer.accept(PlotQuery.newQuery().allPlots().thatPasses(plot -> plot.getFlag(PriceFlag.class) > 0));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "unowned" -> {
 | 
					            case "unowned" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_UNOWNED)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_LIST_UNOWNED)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Templates.of("node", "plots.list.unowned")
 | 
					                            TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.unowned")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                plotConsumer.accept(PlotQuery.newQuery().allPlots().thatPasses(plot -> plot.getOwner() == null));
 | 
					                plotConsumer.accept(PlotQuery.newQuery().allPlots().thatPasses(plot -> plot.getOwner() == null));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "fuzzy" -> {
 | 
					            case "fuzzy" -> {
 | 
				
			||||||
                if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_FUZZY)) {
 | 
					                if (!player.hasPermission(Permission.PERMISSION_LIST_FUZZY)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("permission.no_permission"),
 | 
					                            TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                            Templates.of("node", "plots.list.fuzzy")
 | 
					                            TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.fuzzy")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (args.length < (page == -1 ? 2 : 3)) {
 | 
					                if (args.length < (page == -1 ? 2 : 3)) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                            Templates.of("value", "/plot list fuzzy <search...> [#]")
 | 
					                            TagResolver.resolver("value", Tag.inserting(Component.text("/plot list fuzzy <search...> [#]")))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -351,17 +355,17 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            default -> {
 | 
					            default -> {
 | 
				
			||||||
                if (this.plotAreaManager.hasPlotArea(args[0])) {
 | 
					                if (this.plotAreaManager.hasPlotArea(args[0])) {
 | 
				
			||||||
                    if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_WORLD)) {
 | 
					                    if (!player.hasPermission(Permission.PERMISSION_LIST_WORLD)) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission"),
 | 
					                                TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                                Templates.of("node", "plots.list.world")
 | 
					                                TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.world")))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    if (!Permissions.hasPermission(player, "plots.list.world." + args[0])) {
 | 
					                    if (!player.hasPermission("plots.list.world." + args[0])) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("permission.no_permission"),
 | 
					                                TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                                Templates.of("node", "plots.list.world." + args[0])
 | 
					                                TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.world." + args[0])))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -380,12 +384,15 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    if (uuid == null) {
 | 
					                    if (uuid == null) {
 | 
				
			||||||
                        player.sendMessage(TranslatableCaption.of("errors.invalid_player"), Templates.of("value", args[0]));
 | 
					                        player.sendMessage(
 | 
				
			||||||
 | 
					                                TranslatableCaption.of("errors.invalid_player"),
 | 
				
			||||||
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
 | 
				
			||||||
 | 
					                        );
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_PLAYER)) {
 | 
					                        if (!player.hasPermission(Permission.PERMISSION_LIST_PLAYER)) {
 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("permission.no_permission"),
 | 
					                                    TranslatableCaption.of("permission.no_permission"),
 | 
				
			||||||
                                    Templates.of("node", "plots.list.player")
 | 
					                                    TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.player")))
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                        } else {
 | 
					                        } else {
 | 
				
			||||||
                            sort[0] = false;
 | 
					                            sort[0] = false;
 | 
				
			||||||
@@ -421,32 +428,34 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    color = TranslatableCaption.of("info.plot_list_default");
 | 
					                    color = TranslatableCaption.of("info.plot_list_default");
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                Component trusted = MINI_MESSAGE.parse(
 | 
					                Component trusted = MINI_MESSAGE.deserialize(
 | 
				
			||||||
                        TranslatableCaption.of("info.plot_info_trusted").getComponent(player),
 | 
					                        TranslatableCaption.of("info.plot_info_trusted").getComponent(player),
 | 
				
			||||||
                        Template.of("trusted", PlayerManager.getPlayerList(plot.getTrusted(), player))
 | 
					                        TagResolver.resolver("trusted", Tag.inserting(PlayerManager.getPlayerList(plot.getTrusted(), player)))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                Component members = MINI_MESSAGE.parse(
 | 
					                Component members = MINI_MESSAGE.deserialize(
 | 
				
			||||||
                        TranslatableCaption.of("info.plot_info_members").getComponent(player),
 | 
					                        TranslatableCaption.of("info.plot_info_members").getComponent(player),
 | 
				
			||||||
                        Template.of("members", PlayerManager.getPlayerList(plot.getMembers(), player))
 | 
					                        TagResolver.resolver("members", Tag.inserting(PlayerManager.getPlayerList(plot.getMembers(), player)))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                Template command_tp = Template.of("command_tp", "/plot visit " + plot.getArea() + ";" + plot.getId());
 | 
					                TagResolver.Builder finalResolver = TagResolver.builder();
 | 
				
			||||||
                Template command_info = Template.of("command_info", "/plot info " + plot.getArea() + ";" + plot.getId());
 | 
					                finalResolver.tag(
 | 
				
			||||||
                Template hover_info =
 | 
					                        "command_tp",
 | 
				
			||||||
                        Template.of(
 | 
					                        Tag.preProcessParsed("/plot visit " + plot.getArea() + ";" + plot.getId())
 | 
				
			||||||
                                "hover_info",
 | 
					                );
 | 
				
			||||||
                                MINI_MESSAGE.serialize(Component
 | 
					                finalResolver.tag(
 | 
				
			||||||
                                        .text()
 | 
					                        "command_info",
 | 
				
			||||||
 | 
					                        Tag.preProcessParsed("/plot info " + plot.getArea() + ";" + plot.getId())
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					                finalResolver.tag("hover_info", Tag.inserting(
 | 
				
			||||||
 | 
					                        Component.text()
 | 
				
			||||||
                                .append(trusted)
 | 
					                                .append(trusted)
 | 
				
			||||||
                                .append(Component.newline())
 | 
					                                .append(Component.newline())
 | 
				
			||||||
                                .append(members)
 | 
					                                .append(members)
 | 
				
			||||||
                                        .asComponent())
 | 
					                                .asComponent()
 | 
				
			||||||
                        );
 | 
					                ));
 | 
				
			||||||
                Template numberTemplate = Template.of("number", String.valueOf(i));
 | 
					                finalResolver.tag("number", Tag.inserting(Component.text(i)));
 | 
				
			||||||
                Template plotTemplate = Template.of(
 | 
					                finalResolver.tag("plot", Tag.inserting(MINI_MESSAGE.deserialize(
 | 
				
			||||||
                        "plot",
 | 
					                        color.getComponent(player), TagResolver.resolver("plot", Tag.inserting(Component.text(plot.toString())))
 | 
				
			||||||
                        MINI_MESSAGE.parse(color.getComponent(player), Template.of("plot", plot.toString()))
 | 
					                )));
 | 
				
			||||||
                );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                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);
 | 
				
			||||||
@@ -455,35 +464,37 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
                String everyone = TranslatableCaption.of("info.plot_list_player_everyone").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)) {
 | 
					                if (plot.getFlag(ServerPlotFlag.class)) {
 | 
				
			||||||
                    Template serverTemplate = Template.of(
 | 
					                    TagResolver serverResolver = TagResolver.resolver(
 | 
				
			||||||
                            "info.server",
 | 
					                            "info.server",
 | 
				
			||||||
                            TranslatableCaption.of("info.server").getComponent(player)
 | 
					                            Tag.inserting(TranslatableCaption.of("info.server").toComponent(player))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    builder.append(MINI_MESSAGE.parse(server, serverTemplate));
 | 
					                    builder.append(MINI_MESSAGE.deserialize(server, serverResolver));
 | 
				
			||||||
                } else {
 | 
					                } 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);
 | 
				
			||||||
                        for (final UUIDMapping uuidMapping : names) {
 | 
					                        for (final UUIDMapping uuidMapping : names) {
 | 
				
			||||||
                            PlotPlayer<?> pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuidMapping.getUuid());
 | 
					                            PlotPlayer<?> pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuidMapping.uuid());
 | 
				
			||||||
                            Template prefixTemplate = Template.of("prefix", prefix);
 | 
					                            TagResolver resolver = TagResolver.builder()
 | 
				
			||||||
                            Template playerTemplate = Template.of("player", uuidMapping.getUsername());
 | 
					                                    .tag("prefix", Tag.inserting(Component.text(prefix)))
 | 
				
			||||||
 | 
					                                    .tag("player", Tag.inserting(Component.text(uuidMapping.username())))
 | 
				
			||||||
 | 
					                                    .build();
 | 
				
			||||||
                            if (pp != null) {
 | 
					                            if (pp != null) {
 | 
				
			||||||
                                builder.append(MINI_MESSAGE.parse(online, prefixTemplate, playerTemplate));
 | 
					                                builder.append(MINI_MESSAGE.deserialize(online, resolver));
 | 
				
			||||||
                            } else if (uuidMapping.getUsername().equalsIgnoreCase("unknown")) {
 | 
					                            } else if (uuidMapping.username().equalsIgnoreCase("unknown")) {
 | 
				
			||||||
                                Template unknownTemplate = Template.of(
 | 
					                                TagResolver unknownResolver = TagResolver.resolver(
 | 
				
			||||||
                                        "info.unknown",
 | 
					                                        "info.unknown",
 | 
				
			||||||
                                        TranslatableCaption.of("info.unknown").getComponent(player)
 | 
					                                        Tag.inserting(TranslatableCaption.of("info.unknown").toComponent(player))
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                                builder.append(MINI_MESSAGE.parse(unknown, unknownTemplate));
 | 
					                                builder.append(MINI_MESSAGE.deserialize(unknown, unknownResolver));
 | 
				
			||||||
                            } else if (uuidMapping.getUuid().equals(DBFunc.EVERYONE)) {
 | 
					                            } else if (uuidMapping.uuid().equals(DBFunc.EVERYONE)) {
 | 
				
			||||||
                                Template everyoneTemplate = Template.of(
 | 
					                                TagResolver everyoneResolver = TagResolver.resolver(
 | 
				
			||||||
                                        "info.everyone",
 | 
					                                        "info.everyone",
 | 
				
			||||||
                                        TranslatableCaption.of("info.everyone").getComponent(player)
 | 
					                                        Tag.inserting(TranslatableCaption.of("info.everyone").toComponent(player))
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                                builder.append(MINI_MESSAGE.parse(everyone, everyoneTemplate));
 | 
					                                builder.append(MINI_MESSAGE.deserialize(everyone, everyoneResolver));
 | 
				
			||||||
                            } else {
 | 
					                            } else {
 | 
				
			||||||
                                builder.append(MINI_MESSAGE.parse(offline, prefixTemplate, playerTemplate));
 | 
					                                builder.append(MINI_MESSAGE.deserialize(offline, resolver));
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            prefix = ", ";
 | 
					                            prefix = ", ";
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
@@ -499,15 +510,16 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("errors.invalid_player"),
 | 
					                                TranslatableCaption.of("errors.invalid_player"),
 | 
				
			||||||
                                Templates.of("value", playerBuilder.toString())
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text(playerBuilder.toString())))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    } 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());
 | 
					                finalResolver.tag("players", Tag.inserting(builder.asComponent()));
 | 
				
			||||||
 | 
					                finalResolver.tag("size", Tag.inserting(Component.text(plot.getConnectedPlots().size())));
 | 
				
			||||||
                caption.set(TranslatableCaption.of("info.plot_list_item"));
 | 
					                caption.set(TranslatableCaption.of("info.plot_list_item"));
 | 
				
			||||||
                caption.setTemplates(command_tp, command_info, hover_info, numberTemplate, plotTemplate, players);
 | 
					                caption.setTagResolvers(finalResolver.build());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }, "/plot list " + args[0], TranslatableCaption.of("list.plot_list_header_paged"));
 | 
					        }, "/plot list " + args[0], TranslatableCaption.of("list.plot_list_header_paged"));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -515,31 +527,31 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
 | 
					    public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
 | 
				
			||||||
        final List<String> completions = new LinkedList<>();
 | 
					        final List<String> completions = new LinkedList<>();
 | 
				
			||||||
        if (this.econHandler.isSupported() && Permissions.hasPermission(player, Permission.PERMISSION_LIST_FOR_SALE)) {
 | 
					        if (this.econHandler.isSupported() && player.hasPermission(Permission.PERMISSION_LIST_FOR_SALE)) {
 | 
				
			||||||
            completions.add("forsale");
 | 
					            completions.add("forsale");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_MINE)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_MINE)) {
 | 
				
			||||||
            completions.add("mine");
 | 
					            completions.add("mine");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_SHARED)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_SHARED)) {
 | 
				
			||||||
            completions.add("shared");
 | 
					            completions.add("shared");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_WORLD)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_WORLD)) {
 | 
				
			||||||
            completions.addAll(PlotSquared.platform().worldManager().getWorlds());
 | 
					            completions.addAll(PlotSquared.platform().worldManager().getWorlds());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_TOP)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_TOP)) {
 | 
				
			||||||
            completions.add("top");
 | 
					            completions.add("top");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_ALL)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_ALL)) {
 | 
				
			||||||
            completions.add("all");
 | 
					            completions.add("all");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_UNOWNED)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_UNOWNED)) {
 | 
				
			||||||
            completions.add("unowned");
 | 
					            completions.add("unowned");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_DONE)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_DONE)) {
 | 
				
			||||||
            completions.add("done");
 | 
					            completions.add("done");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_EXPIRED)) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_EXPIRED)) {
 | 
				
			||||||
            completions.add("expired");
 | 
					            completions.add("expired");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -549,7 +561,7 @@ public class ListCmd extends SubCommand {
 | 
				
			|||||||
                .map(completion -> new Command(null, true, completion, "", RequiredType.NONE, CommandCategory.TELEPORT) {
 | 
					                .map(completion -> new Command(null, true, completion, "", RequiredType.NONE, CommandCategory.TELEPORT) {
 | 
				
			||||||
                }).collect(Collectors.toCollection(LinkedList::new));
 | 
					                }).collect(Collectors.toCollection(LinkedList::new));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_PLAYER) && args[0].length() > 0) {
 | 
					        if (player.hasPermission(Permission.PERMISSION_LIST_PLAYER) && args[0].length() > 0) {
 | 
				
			||||||
            commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
					            commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,15 +31,17 @@ import com.plotsquared.core.plot.PlotArea;
 | 
				
			|||||||
import com.plotsquared.core.plot.PlotId;
 | 
					import com.plotsquared.core.plot.PlotId;
 | 
				
			||||||
import com.plotsquared.core.plot.schematic.Schematic;
 | 
					import com.plotsquared.core.plot.schematic.Schematic;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.util.Permissions;
 | 
					 | 
				
			||||||
import com.plotsquared.core.util.SchematicHandler;
 | 
					import com.plotsquared.core.util.SchematicHandler;
 | 
				
			||||||
import com.plotsquared.core.util.TimeUtil;
 | 
					import com.plotsquared.core.util.TimeUtil;
 | 
				
			||||||
import com.plotsquared.core.util.task.RunnableVal;
 | 
					import com.plotsquared.core.util.task.RunnableVal;
 | 
				
			||||||
import com.plotsquared.core.util.task.TaskManager;
 | 
					import com.plotsquared.core.util.task.TaskManager;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.Template;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.net.MalformedURLException;
 | 
					import java.net.MalformedURLException;
 | 
				
			||||||
 | 
					import java.net.URI;
 | 
				
			||||||
import java.net.URL;
 | 
					import java.net.URL;
 | 
				
			||||||
import java.util.Collections;
 | 
					import java.util.Collections;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
@@ -80,8 +82,7 @@ public class Load extends SubCommand {
 | 
				
			|||||||
            player.sendMessage(TranslatableCaption.of("info.plot_unowned"));
 | 
					            player.sendMessage(TranslatableCaption.of("info.plot_unowned"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!plot.isOwner(player.getUUID()) && !Permissions
 | 
					        if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_LOAD)) {
 | 
				
			||||||
                .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_LOAD)) {
 | 
					 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
 | 
					            player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -99,7 +100,7 @@ public class Load extends SubCommand {
 | 
				
			|||||||
                        // No schematics found:
 | 
					                        // No schematics found:
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("web.load_null"),
 | 
					                                TranslatableCaption.of("web.load_null"),
 | 
				
			||||||
                                Template.of("command", "/plot load")
 | 
					                                TagResolver.resolver("command", Tag.inserting(Component.text("/plot load")))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -110,13 +111,13 @@ public class Load extends SubCommand {
 | 
				
			|||||||
                        // use /plot load <index>
 | 
					                        // use /plot load <index>
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("invalid.not_valid_number"),
 | 
					                                TranslatableCaption.of("invalid.not_valid_number"),
 | 
				
			||||||
                                Template.of("value", "(1, " + schematics.size() + ')')
 | 
					                                TagResolver.resolver("value", Tag.inserting(Component.text("(1, " + schematics.size() + ')')))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    final URL url;
 | 
					                    final URL url;
 | 
				
			||||||
                    try {
 | 
					                    try {
 | 
				
			||||||
                        url = new URL(Settings.Web.URL + "saves/" + player.getUUID() + '/' + schematic);
 | 
					                        url = URI.create(Settings.Web.URL + "saves/" + player.getUUID() + '/' + schematic).toURL();
 | 
				
			||||||
                    } catch (MalformedURLException e) {
 | 
					                    } catch (MalformedURLException e) {
 | 
				
			||||||
                        e.printStackTrace();
 | 
					                        e.printStackTrace();
 | 
				
			||||||
                        player.sendMessage(TranslatableCaption.of("web.load_failed"));
 | 
					                        player.sendMessage(TranslatableCaption.of("web.load_failed"));
 | 
				
			||||||
@@ -130,7 +131,10 @@ public class Load extends SubCommand {
 | 
				
			|||||||
                            plot.removeRunning();
 | 
					                            plot.removeRunning();
 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("schematics.schematic_invalid"),
 | 
					                                    TranslatableCaption.of("schematics.schematic_invalid"),
 | 
				
			||||||
                                    Template.of("reason", "non-existent or not in gzip format")
 | 
					                                    TagResolver.resolver(
 | 
				
			||||||
 | 
					                                            "reason",
 | 
				
			||||||
 | 
					                                            Tag.inserting(Component.text("non-existent or not in gzip format"))
 | 
				
			||||||
 | 
					                                    )
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                            return;
 | 
					                            return;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
@@ -161,7 +165,7 @@ public class Load extends SubCommand {
 | 
				
			|||||||
                plot.removeRunning();
 | 
					                plot.removeRunning();
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					                        TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
                        Template.of("value", "/plot load <index>")
 | 
					                        TagResolver.resolver("value", Tag.inserting(Component.text("/plot load <index>")))
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -212,46 +216,9 @@ public class Load extends SubCommand {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("web.load_list"),
 | 
					                    TranslatableCaption.of("web.load_list"),
 | 
				
			||||||
                    Template.of("command", "/plot load #")
 | 
					                    TagResolver.resolver("command", Tag.inserting(Component.text("/plot load #")))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @deprecated Use {@link TimeUtil#secToTime(long)}
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    @Deprecated(forRemoval = true, since = "6.6.2")
 | 
					 | 
				
			||||||
    public String secToTime(long time) {
 | 
					 | 
				
			||||||
        StringBuilder toreturn = new StringBuilder();
 | 
					 | 
				
			||||||
        if (time >= 33868800) {
 | 
					 | 
				
			||||||
            int years = (int) (time / 33868800);
 | 
					 | 
				
			||||||
            time -= years * 33868800;
 | 
					 | 
				
			||||||
            toreturn.append(years).append("y ");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (time >= 604800) {
 | 
					 | 
				
			||||||
            int weeks = (int) (time / 604800);
 | 
					 | 
				
			||||||
            time -= weeks * 604800;
 | 
					 | 
				
			||||||
            toreturn.append(weeks).append("w ");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (time >= 86400) {
 | 
					 | 
				
			||||||
            int days = (int) (time / 86400);
 | 
					 | 
				
			||||||
            time -= days * 86400;
 | 
					 | 
				
			||||||
            toreturn.append(days).append("d ");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (time >= 3600) {
 | 
					 | 
				
			||||||
            int hours = (int) (time / 3600);
 | 
					 | 
				
			||||||
            time -= hours * 3600;
 | 
					 | 
				
			||||||
            toreturn.append(hours).append("h ");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (time >= 60) {
 | 
					 | 
				
			||||||
            int minutes = (int) (time / 60);
 | 
					 | 
				
			||||||
            time -= minutes * 60;
 | 
					 | 
				
			||||||
            toreturn.append(minutes).append("m ");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (toreturn.length() == 0 || (time > 0)) {
 | 
					 | 
				
			||||||
            toreturn.append(time).append("s ");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return toreturn.toString().trim();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user