Compare commits

..

1 Commits

Author SHA1 Message Date
ebbbb6c670 fix: annotate ExpireManager with @Inject 2022-10-17 18:58:39 +02:00
283 changed files with 6261 additions and 6568 deletions

View File

@ -13,6 +13,40 @@ ij_formatter_tags_enabled = false
ij_smart_tabs = false
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]
ij_java_align_consecutive_assignments = false
ij_java_align_consecutive_variable_declarations = false
@ -243,12 +277,63 @@ ij_java_wrap_comments = false
ij_java_wrap_first_method_in_call_chain = true
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]
ij_properties_align_group_field_declarations = false
ij_properties_keep_blank_lines = false
ij_properties_key_value_delimiter = equals
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]
ij_editorconfig_align_group_field_declarations = false
ij_editorconfig_space_after_colon = false
@ -257,6 +342,548 @@ ij_editorconfig_space_before_colon = false
ij_editorconfig_space_before_comma = false
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}]
ij_kotlin_align_in_columns_case_branch = false
ij_kotlin_align_multiline_binary_operation = false
@ -336,8 +963,7 @@ ij_kotlin_wrap_elvis_expressions = 1
ij_kotlin_wrap_expression_body_functions = 0
ij_kotlin_wrap_first_method_in_call_chain = false
[*.json]
[{*.har, *.jsb2, *.jsb3, *.json, .babelrc, .eslintrc, .stylelintrc, bowerrc, jest.config, mcmod.info}]
indent_size = 2
ij_json_keep_blank_lines_in_code = 0
ij_json_keep_indents_on_empty_lines = false

4
.gitattributes vendored
View File

@ -1,4 +0,0 @@
* text=auto
*.java text
*.jar binary

View File

@ -7,8 +7,8 @@ body:
attributes:
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.
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://github.com/IntellectualSites/PlotSquared/security/policy) GitHub form!
Only use this if you're absolutely sure that you found a bug and can reproduce it. For anything else, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.github.io/plotsquared-documentation/).
Do NOT use the public issue tracker to report security vulnerabilities! They are disclosed using [this](https://forms.gle/btgdRn9yhGtzEiGW8) form!
- type: dropdown
attributes:
@ -27,10 +27,6 @@ body:
description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first.
multiple: false
options:
- '1.20.4'
- '1.20'
- '1.19.4'
- '1.19.3'
- '1.19.2'
- '1.19.1'
- '1.19'

View File

@ -4,5 +4,5 @@ contact_links:
url: https://discord.gg/intellectualsites
about: Our support Discord, please ask questions and seek support here.
- name: PlotSquared Wiki
url: https://intellectualsites.gitbook.io/plotsquared/
url: https://intellectualsites.github.io/plotsquared-documentation/
about: Take a look at the wiki page for instructions how to setup PlotSquared and use its commands.

View File

@ -7,7 +7,7 @@ body:
attributes:
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.
For anything else than a feature request, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.gitbook.io/plotsquared/).
For anything else than a feature request, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.github.io/plotsquared-documentation/).
- type: textarea
attributes:

19
.github/renovate.json vendored
View File

@ -1,19 +0,0 @@
{
"$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"
]
}

View File

@ -1,7 +1,8 @@
name: Announce release on discord
on:
release:
types: [ published ]
types: [published]
jobs:
send_announcement:
runs-on: ubuntu-latest

View File

@ -1,21 +0,0 @@
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 ]
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v2
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: Clean Build
run: ./gradlew clean build

View File

@ -1,19 +1,18 @@
name: build
on:
push:
branches:
- main
on: [ pull_request, push ]
jobs:
build:
if: github.repository_owner == 'IntellectualSites'
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v2
uses: actions/checkout@v3
- name: Validate Gradle Wrapper"
uses: gradle/wrapper-validation-action@v1
- name: Setup Java
uses: actions/setup-java@v4
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17
@ -28,7 +27,7 @@ jobs:
echo "STATUS=release" >> $GITHUB_ENV
fi
- name: Publish Release
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v6'}}
run: ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository
env:
ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
@ -36,13 +35,13 @@ jobs:
ORG_GRADLE_PROJECT_signingKey: ${{ secrets.SIGNING_KEY }}
ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.SIGNING_PASSWORD }}
- name: Publish Snapshot
if: ${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main' }}
if: ${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v6' }}
run: ./gradlew publishToSonatype
env:
ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }}
- name: Publish core javadoc
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v6'}}
uses: cpina/github-action-push-to-another-repository@main
env:
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
@ -52,9 +51,9 @@ jobs:
destination-repository-name: 'plotsquared-javadocs'
user-email: ${{ secrets.USER_EMAIL }}
target-branch: main
target-directory: v7/core
target-directory: core
- name: Publish bukkit javadoc
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v6'}}
uses: cpina/github-action-push-to-another-repository@main
env:
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
@ -64,4 +63,4 @@ jobs:
destination-repository-name: 'plotsquared-javadocs'
user-email: ${{ secrets.USER_EMAIL }}
target-branch: main
target-directory: v7/bukkit
target-directory: bukkit

View File

@ -1,10 +1,11 @@
name: "CodeQL"
on:
push:
branches: [ main ]
branches: [ v6 ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ main ]
branches: [ v6 ]
jobs:
analyze:
@ -14,23 +15,23 @@ jobs:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'java' ]
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
uses: actions/checkout@v3
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
- name: Autobuild
uses: github/codeql-action/autobuild@v3
uses: github/codeql-action/autobuild@v2
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@v2

View File

@ -1,23 +0,0 @@
name: "Label conflicting PRs"
on:
push:
pull_request_target:
types: [ synchronize ]
pull_request:
types: [ synchronize ]
permissions:
pull-requests: write
jobs:
main:
if: github.event.pull_request.user.login != 'dependabot[bot]'
runs-on: ubuntu-latest
steps:
- name: Label conflicting PRs
uses: eps1lon/actions-label-merge-conflict@v2.1.0
with:
dirtyLabel: "unresolved-merge-conflict"
repoToken: "${{ secrets.GITHUB_TOKEN }}"
commentOnDirty: "Please take a moment and address the merge conflicts of your pull request. Thanks!"
continueOnMissingPermissions: true

View File

@ -1,17 +1,19 @@
name: draft release
on:
push:
branches:
- main
- v6
pull_request:
types: [ opened, reopened, synchronize ]
pull_request_target:
types: [ opened, reopened, synchronize ]
jobs:
update_release_draft:
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v6
- uses: release-drafter/release-drafter@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

3
.gitignore vendored
View File

@ -137,6 +137,3 @@ docs/
build/
.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
View File

@ -1,144 +1,48 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
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">
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" id="svg2" xml:space="preserve" width="4000" height="3333.3333" viewBox="0 0 4000 3333.3333" sodipodi:docname="PlotSquared.ai">
<metadata id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<cc:Work rdf:about="">
<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>
</rdf:RDF>
</metadata>
<defs
id="defs6">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath18">
<path
d="M 0,2500 H 3000 V 0 H 0 Z"
id="path16" />
<defs id="defs6">
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath18">
<path d="M 0,2500 H 3000 V 0 H 0 Z" id="path16" />
</clipPath>
</defs>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
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" />
<sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="640" inkscape:window-height="480" id="namedview4" />
<g id="g10" inkscape:groupmode="layer" inkscape:label="PlotSquared" transform="matrix(1.3333333,0,0,-1.3333333,0,3333.3333)">
<g id="g12">
<g id="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
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 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
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 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
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 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
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 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
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 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
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 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
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 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
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 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>

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -18,23 +18,23 @@ repositories {
}
dependencies {
api(projects.plotsquaredCore)
api(projects.plotSquaredCore)
// Metrics
implementation(libs.bstatsBukkit)
implementation("org.bstats:bstats-bukkit")
// Paper
compileOnly(libs.paper)
implementation(libs.paperlib)
compileOnly("io.papermc.paper:paper-api")
implementation("io.papermc:paperlib")
// Plugins
compileOnly(libs.worldeditBukkit) {
exclude(group = "org.bukkit")
exclude(group = "org.spigotmc")
}
compileOnly(libs.faweBukkit) { isTransitive = false }
testImplementation(libs.faweBukkit) { isTransitive = false }
compileOnly(libs.vault) {
compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false }
testImplementation("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false }
compileOnly("com.github.MilkBowl:VaultAPI") {
exclude(group = "org.bukkit")
}
compileOnly(libs.placeholderapi)
@ -44,15 +44,16 @@ dependencies {
// Other libraries
implementation(libs.squirrelid) { isTransitive = false }
implementation(libs.serverlib)
implementation("dev.notmyfault.serverlib:ServerLib")
// Our libraries
implementation(libs.arkitektonika)
implementation(libs.paster)
implementation(libs.informativeAnnotations)
implementation(libs.http4j)
implementation("com.intellectualsites.paster:Paster")
implementation("com.intellectualsites.informative-annotations:informative-annotations")
// Adventure
implementation(libs.adventureBukkit)
implementation("net.kyori:adventure-platform-bukkit")
}
tasks.processResources {
@ -62,12 +63,10 @@ tasks.processResources {
}
tasks.named<ShadowJar>("shadowJar") {
dependsOn(":plotsquared-core:shadowJar")
dependencies {
exclude(dependency("org.checkerframework:"))
}
relocate("net.kyori.option", "com.plotsquared.core.configuration.option")
relocate("net.kyori.adventure", "com.plotsquared.core.configuration.adventure")
relocate("net.kyori.examination", "com.plotsquared.core.configuration.examination")
relocate("io.papermc.lib", "com.plotsquared.bukkit.paperlib")
@ -89,7 +88,7 @@ tasks.named<ShadowJar>("shadowJar") {
relocate("javax.inject", "com.plotsquared.core.annotation.inject")
relocate("net.jcip", "com.plotsquared.core.annotations.jcip")
relocate("edu.umd.cs.findbugs", "com.plotsquared.core.annotations.findbugs")
relocate("com.intellectualsites.annotations", "com.plotsquared.core.annotations.informative")
relocate("com.intellectualsites.informative-annotations", "com.plotsquared.core.annotation.informative")
// Get rid of all the libs which are 100% unused.
minimize()
@ -99,19 +98,13 @@ tasks.named<ShadowJar>("shadowJar") {
tasks {
withType<Javadoc> {
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
val opt = options as StandardJavadocDocletOptions
opt.links("https://jd.papermc.io/paper/1.20/")
opt.links("https://jd.papermc.io/paper/1.18/")
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/")
opt.links("https://jd.advntr.dev/api/4.14.0/")
opt.links("https://jd.adventure.kyori.net/api/4.9.3/")
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
// opt.links("https://checkerframework.org/api/")
opt.isLinkSource = true
opt.bottom(File("$rootDir/javadocfooter.html").readText())
opt.isUse = true
opt.links("https://checkerframework.org/api/")
opt.encoding("UTF-8")
opt.keyWords()
opt.addStringOption("-since", isRelease)
}
}

View File

@ -36,8 +36,8 @@ import com.plotsquared.bukkit.listener.ChunkListener;
import com.plotsquared.bukkit.listener.EntityEventListener;
import com.plotsquared.bukkit.listener.EntitySpawnListener;
import com.plotsquared.bukkit.listener.PaperListener;
import com.plotsquared.bukkit.listener.PaperListener113;
import com.plotsquared.bukkit.listener.PlayerEventListener;
import com.plotsquared.bukkit.listener.PlayerEventListener1201;
import com.plotsquared.bukkit.listener.ProjectileEventListener;
import com.plotsquared.bukkit.listener.ServerListener;
import com.plotsquared.bukkit.listener.SingleWorldListener;
@ -50,7 +50,6 @@ import com.plotsquared.bukkit.player.BukkitPlayerManager;
import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.bukkit.util.BukkitWorld;
import com.plotsquared.bukkit.util.SetGenCB;
import com.plotsquared.bukkit.util.TranslationUpdateManager;
import com.plotsquared.bukkit.util.UpdateUtility;
import com.plotsquared.bukkit.util.task.BukkitTaskManager;
import com.plotsquared.bukkit.util.task.PaperTimeConverter;
@ -73,8 +72,6 @@ import com.plotsquared.core.configuration.Storage;
import com.plotsquared.core.configuration.caption.ChatFormatter;
import com.plotsquared.core.configuration.file.YamlConfiguration;
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.IndependentPlotGenerator;
import com.plotsquared.core.generator.SingleWorldGenerator;
@ -113,7 +110,6 @@ import com.plotsquared.core.uuid.CacheUUIDService;
import com.plotsquared.core.uuid.UUIDPipeline;
import com.plotsquared.core.uuid.offline.OfflineModeUUIDService;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import io.papermc.lib.PaperLib;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component;
@ -136,14 +132,12 @@ import org.bukkit.generator.ChunkGenerator;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.incendo.serverlib.ServerLib;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
@ -254,7 +248,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
}
@Override
@SuppressWarnings("deprecation") // Paper deprecation
public void onEnable() {
this.pluginName = getDescription().getName();
@ -298,12 +291,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
);
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);
if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) {
@ -360,9 +347,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
if (Settings.Enabled_Components.EVENTS) {
getServer().getPluginManager().registerEvents(injector().getInstance(PlayerEventListener.class), this);
if ((serverVersion()[1] == 20 && serverVersion()[2] >= 1) || serverVersion()[1] > 20) {
getServer().getPluginManager().registerEvents(injector().getInstance(PlayerEventListener1201.class), this);
}
getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener.class), this);
if (serverVersion()[1] >= 17) {
getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener117.class), this);
@ -372,7 +356,11 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
getServer().getPluginManager().registerEvents(injector().getInstance(ServerListener.class), this);
getServer().getPluginManager().registerEvents(injector().getInstance(EntitySpawnListener.class), this);
if (PaperLib.isPaper() && Settings.Paper_Components.PAPER_LISTENERS) {
getServer().getPluginManager().registerEvents(injector().getInstance(PaperListener.class), this);
if (serverVersion()[1] == 13) {
getServer().getPluginManager().registerEvents(injector().getInstance(PaperListener113.class), this);
} else {
getServer().getPluginManager().registerEvents(injector().getInstance(PaperListener.class), this);
}
} else {
getServer().getPluginManager().registerEvents(injector().getInstance(SpigotListener.class), this);
}
@ -556,7 +544,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
this.startMetrics();
if (Settings.Enabled_Components.WORLDS) {
TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(10L));
TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(1L));
try {
singleWorldListener = injector().getInstance(SingleWorldListener.class);
Bukkit.getPluginManager().registerEvents(singleWorldListener, this);
@ -779,14 +767,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
Iterator<Entity> iterator = entities.iterator();
while (iterator.hasNext()) {
Entity entity = iterator.next();
//noinspection ConstantValue - getEntitySpawnReason annotated as NotNull, but is not NotNull. lol.
if (PaperLib.isPaper() && entity.getEntitySpawnReason() != null && "CUSTOM".equals(entity.getEntitySpawnReason().name())) {
continue;
}
// Fallback for Spigot not having Entity#getEntitySpawnReason
if (entity.getMetadata("ps_custom_spawned").stream().anyMatch(MetadataValue::asBoolean)) {
continue;
}
switch (entity.getType().toString()) {
case "EGG":
case "FISHING_HOOK":
@ -826,7 +806,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
case "MINECART_MOB_SPAWNER":
case "ENDER_CRYSTAL":
case "MINECART_TNT":
case "CHEST_BOAT":
case "BOAT":
if (Settings.Enabled_Components.KILL_ROAD_VEHICLES) {
com.plotsquared.core.location.Location location = BukkitUtil.adapt(entity.getLocation());
@ -836,7 +815,8 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
if (entity.hasMetadata("ps-tmp-teleport")) {
continue;
}
this.removeRoadEntity(entity, iterator);
iterator.remove();
entity.remove();
}
continue;
}
@ -849,7 +829,8 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
if (entity.hasMetadata("ps-tmp-teleport")) {
continue;
}
this.removeRoadEntity(entity, iterator);
iterator.remove();
entity.remove();
}
}
continue;
@ -859,7 +840,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
case "DROPPED_ITEM":
if (Settings.Enabled_Components.KILL_ROAD_ITEMS
&& plotArea.getOwnedPlotAbs(BukkitUtil.adapt(entity.getLocation())) == null) {
this.removeRoadEntity(entity, iterator);
entity.remove();
}
// dropped item
continue;
@ -875,7 +856,8 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
if (livingEntity.isLeashed() && !Settings.Enabled_Components.KILL_OWNED_ROAD_MOBS) {
continue;
}
if (entity.hasMetadata("keep")) {
List<MetadataValue> keep = entity.getMetadata("keep");
if (!keep.isEmpty()) {
continue;
}
@ -889,7 +871,8 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
if (entity.hasMetadata("ps-tmp-teleport")) {
continue;
}
this.removeRoadEntity(entity, iterator);
iterator.remove();
entity.remove();
}
}
}
@ -994,7 +977,8 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
if (entity.hasMetadata("ps-tmp-teleport")) {
continue;
}
this.removeRoadEntity(entity, iterator);
iterator.remove();
entity.remove();
}
}
} else {
@ -1005,7 +989,8 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
if (entity.hasMetadata("ps-tmp-teleport")) {
continue;
}
this.removeRoadEntity(entity, iterator);
iterator.remove();
entity.remove();
}
}
}
@ -1019,17 +1004,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
}), 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
public @Nullable
final ChunkGenerator getDefaultWorldGenerator(
@ -1174,7 +1148,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
return new BukkitPlotGenerator(world, generator, this.plotAreaManager);
}
@SuppressWarnings("deprecation") // Paper deprecation
@Override
public @NonNull String pluginsFormatted() {
StringBuilder msg = new StringBuilder();
@ -1191,37 +1164,18 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
.append(" • Load Before: ").append(p.getDescription().getLoadBefore()).append("\n")
.append(" • Dependencies: ").append(p.getDescription().getDepend()).append("\n")
.append(" • Soft Dependencies: ").append(p.getDescription().getSoftDepend()).append("\n");
List<RegisteredServiceProvider<?>> providers = Bukkit.getServicesManager().getRegistrations(p);
if (!providers.isEmpty()) {
msg.append(" • Provided Services: \n");
for (RegisteredServiceProvider<?> provider : providers) {
msg.append("")
.append(provider.getService().getName()).append(" = ")
.append(provider.getProvider().getClass().getName())
.append(" (priority: ").append(provider.getPriority()).append(")")
.append("\n");
}
}
}
return msg.toString();
}
@Override
@SuppressWarnings({"ConstantConditions", "deprecation"}) // Paper deprecation
@SuppressWarnings("ConstantConditions")
public @NonNull String worldEditImplementations() {
StringBuilder msg = new StringBuilder();
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) {
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());
} else {
msg.append("WorldEdit: ").append(Bukkit.getPluginManager().getPlugin("WorldEdit").getDescription().getVersion());

View File

@ -33,7 +33,6 @@ import org.bukkit.entity.Ageable;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Bat;
import org.bukkit.entity.Boat;
import org.bukkit.entity.Breedable;
import org.bukkit.entity.ChestedHorse;
import org.bukkit.entity.EnderDragon;
import org.bukkit.entity.Entity;
@ -75,7 +74,6 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
private HorseStats horse;
private boolean noGravity;
@SuppressWarnings("deprecation") // Deprecation exists since 1.20, while we support 1.16 onwards
public ReplicatingEntityWrapper(Entity entity, short depth) {
super(entity);
@ -103,26 +101,50 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
this.noGravity = true;
}
switch (entity.getType().toString()) {
case "BOAT" -> {
case "BOAT":
Boat boat = (Boat) entity;
this.dataByte = getOrdinal(TreeSpecies.values(), boat.getWoodType());
return;
}
case "ARROW", "EGG", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "EXPERIENCE_ORB", "FALLING_BLOCK", "FIREBALL",
"FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND", "MINECART_MOB_SPAWNER",
"MINECART_TNT", "PLAYER", "PRIMED_TNT", "SLIME", "SMALL_FIREBALL", "SNOWBALL", "MINECART_FURNACE", "SPLASH_POTION",
"THROWN_EXP_BOTTLE", "WITHER_SKULL", "UNKNOWN", "SPECTRAL_ARROW", "SHULKER_BULLET", "DRAGON_FIREBALL", "AREA_EFFECT_CLOUD",
"TRIDENT", "LLAMA_SPIT" -> {
case "ARROW":
case "EGG":
case "ENDER_CRYSTAL":
case "ENDER_PEARL":
case "ENDER_SIGNAL":
case "EXPERIENCE_ORB":
case "FALLING_BLOCK":
case "FIREBALL":
case "FIREWORK":
case "FISHING_HOOK":
case "LEASH_HITCH":
case "LIGHTNING":
case "MINECART":
case "MINECART_COMMAND":
case "MINECART_MOB_SPAWNER":
case "MINECART_TNT":
case "PLAYER":
case "PRIMED_TNT":
case "SLIME":
case "SMALL_FIREBALL":
case "SNOWBALL":
case "MINECART_FURNACE":
case "SPLASH_POTION":
case "THROWN_EXP_BOTTLE":
case "WITHER_SKULL":
case "UNKNOWN":
case "SPECTRAL_ARROW":
case "SHULKER_BULLET":
case "DRAGON_FIREBALL":
case "AREA_EFFECT_CLOUD":
case "TRIDENT":
case "LLAMA_SPIT":
// Do this stuff later
return;
}
// MISC //
case "DROPPED_ITEM" -> {
case "DROPPED_ITEM":
Item item = (Item) entity;
this.stack = item.getItemStack();
return;
}
case "ITEM_FRAME" -> {
case "ITEM_FRAME":
this.x = Math.floor(this.getX());
this.y = Math.floor(this.getY());
this.z = Math.floor(this.getZ());
@ -130,8 +152,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
this.dataByte = getOrdinal(Rotation.values(), itemFrame.getRotation());
this.stack = itemFrame.getItem().clone();
return;
}
case "PAINTING" -> {
case "PAINTING":
this.x = Math.floor(this.getX());
this.y = Math.floor(this.getY());
this.z = Math.floor(this.getZ());
@ -144,17 +165,20 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
}
this.dataString = art.name();
return;
}
// END MISC //
// INVENTORY HOLDER //
case "MINECART_CHEST", "MINECART_HOPPER" -> {
case "MINECART_CHEST":
case "MINECART_HOPPER":
storeInventory((InventoryHolder) entity);
return;
}
// START LIVING ENTITY //
// START AGEABLE //
// START TAMEABLE //
case "HORSE", "DONKEY", "LLAMA", "MULE", "SKELETON_HORSE" -> {
case "HORSE":
case "DONKEY":
case "LLAMA":
case "MULE":
case "SKELETON_HORSE":
AbstractHorse horse = (AbstractHorse) entity;
this.horse = new HorseStats();
this.horse.jump = horse.getJumpStrength();
@ -166,21 +190,20 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
//this.horse.style = horse.getStyle();
//this.horse.color = horse.getColor();
storeTameable(horse);
storeBreedable(horse);
storeAgeable(horse);
storeLiving(horse);
storeInventory(horse);
return;
}
// END INVENTORY HOLDER //
case "WOLF", "OCELOT" -> {
case "WOLF":
case "OCELOT":
storeTameable((Tameable) entity);
storeBreedable((Breedable) entity);
storeAgeable((Ageable) entity);
storeLiving((LivingEntity) entity);
return;
}
// END TAMEABLE //
//todo fix sheep
case "SHEEP" -> {
case "SHEEP":
Sheep sheep = (Sheep) entity;
if (sheep.isSheared()) {
this.dataByte = (byte) 1;
@ -188,23 +211,26 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
this.dataByte = (byte) 0;
}
this.dataByte2 = sheep.getColor().getDyeData();
storeBreedable(sheep);
storeAgeable(sheep);
storeLiving(sheep);
return;
}
case "VILLAGER", "CHICKEN", "COW", "MUSHROOM_COW", "PIG", "TURTLE", "POLAR_BEAR" -> {
storeBreedable((Breedable) entity);
case "VILLAGER":
case "CHICKEN":
case "COW":
case "MUSHROOM_COW":
case "PIG":
case "TURTLE":
case "POLAR_BEAR":
storeAgeable((Ageable) entity);
storeLiving((LivingEntity) entity);
return;
}
case "RABBIT" -> {
case "RABBIT":
this.dataByte = getOrdinal(Rabbit.Type.values(), ((Rabbit) entity).getRabbitType());
storeBreedable((Breedable) entity);
storeAgeable((Ageable) entity);
storeLiving((LivingEntity) entity);
return;
}
// END AGEABLE //
case "ARMOR_STAND" -> {
case "ARMOR_STAND":
ArmorStand stand = (ArmorStand) entity;
this.inventory =
new ItemStack[]{stand.getItemInHand().clone(), stand.getHelmet().clone(),
@ -212,30 +238,37 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
stand.getBoots().clone()};
storeLiving(stand);
this.stand = new ArmorStandStats();
EulerAngle head = stand.getHeadPose();
this.stand.head[0] = (float) head.getX();
this.stand.head[1] = (float) head.getY();
this.stand.head[2] = (float) head.getZ();
EulerAngle body = stand.getBodyPose();
this.stand.body[0] = (float) body.getX();
this.stand.body[1] = (float) body.getY();
this.stand.body[2] = (float) body.getZ();
EulerAngle leftLeg = stand.getLeftLegPose();
this.stand.leftLeg[0] = (float) leftLeg.getX();
this.stand.leftLeg[1] = (float) leftLeg.getY();
this.stand.leftLeg[2] = (float) leftLeg.getZ();
EulerAngle rightLeg = stand.getRightLegPose();
this.stand.rightLeg[0] = (float) rightLeg.getX();
this.stand.rightLeg[1] = (float) rightLeg.getY();
this.stand.rightLeg[2] = (float) rightLeg.getZ();
EulerAngle leftArm = stand.getLeftArmPose();
this.stand.leftArm[0] = (float) leftArm.getX();
this.stand.leftArm[1] = (float) leftArm.getY();
this.stand.leftArm[2] = (float) leftArm.getZ();
EulerAngle rightArm = stand.getRightArmPose();
this.stand.rightArm[0] = (float) rightArm.getX();
this.stand.rightArm[1] = (float) rightArm.getY();
this.stand.rightArm[2] = (float) rightArm.getZ();
if (stand.hasArms()) {
this.stand.arms = true;
}
@ -249,38 +282,53 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
this.stand.small = true;
}
return;
}
case "ENDERMITE" -> {
case "ENDERMITE":
return;
}
case "BAT" -> {
case "BAT":
if (((Bat) entity).isAwake()) {
this.dataByte = (byte) 1;
} else {
this.dataByte = (byte) 0;
}
return;
}
case "ENDER_DRAGON" -> {
case "ENDER_DRAGON":
EnderDragon entity1 = (EnderDragon) entity;
this.dataByte = (byte) entity1.getPhase().ordinal();
return;
}
case "SKELETON", "WITHER_SKELETON", "GUARDIAN", "ELDER_GUARDIAN", "GHAST", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN",
"ZOMBIFIED_PIGLIN", "PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH",
"GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SHULKER", "SNOWMAN" -> {
case "SKELETON":
case "WITHER_SKELETON":
case "GUARDIAN":
case "ELDER_GUARDIAN":
case "GHAST":
case "MAGMA_CUBE":
case "SQUID":
case "PIG_ZOMBIE":
case "HOGLIN":
case "ZOMBIFIED_PIGLIN":
case "PIGLIN":
case "PIGLIN_BRUTE":
case "ZOMBIE":
case "WITHER":
case "WITCH":
case "SPIDER":
case "CAVE_SPIDER":
case "SILVERFISH":
case "GIANT":
case "ENDERMAN":
case "CREEPER":
case "BLAZE":
case "SHULKER":
case "SNOWMAN":
storeLiving((LivingEntity) entity);
return;
}
case "IRON_GOLEM" -> {
case "IRON_GOLEM":
if (((IronGolem) entity).isPlayerCreated()) {
this.dataByte = (byte) 1;
} else {
this.dataByte = (byte) 0;
}
storeLiving((LivingEntity) entity);
}
// END LIVING //
// END LIVING //
}
}
@ -383,11 +431,6 @@ 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) {
if (!this.aged.adult) {
entity.setBaby();
@ -398,11 +441,6 @@ 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) {
this.aged = new AgeableStats();
this.aged.age = aged.getAge();
@ -410,29 +448,6 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
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) {
this.tamed = new TameableStats();
this.tamed.owner = tamed.getOwner();
@ -450,15 +465,20 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
}
Entity entity;
switch (this.getType().toString()) {
case "DROPPED_ITEM" -> {
case "DROPPED_ITEM":
return world.dropItem(location, this.stack);
}
case "PLAYER", "LEASH_HITCH" -> {
case "PLAYER":
case "LEASH_HITCH":
return null;
}
case "ITEM_FRAME" -> entity = world.spawn(location, ItemFrame.class);
case "PAINTING" -> entity = world.spawn(location, Painting.class);
default -> entity = world.spawnEntity(location, this.getType());
case "ITEM_FRAME":
entity = world.spawn(location, ItemFrame.class);
break;
case "PAINTING":
entity = world.spawn(location, Painting.class);
break;
default:
entity = world.spawnEntity(location, this.getType());
break;
}
if (this.depth == 0) {
return entity;
@ -486,46 +506,72 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
entity.setGravity(false);
}
switch (entity.getType().toString()) {
case "BOAT" -> {
case "BOAT":
Boat boat = (Boat) entity;
boat.setWoodType(TreeSpecies.values()[dataByte]);
return entity;
}
case "SLIME" -> {
case "SLIME":
((Slime) entity).setSize(this.dataByte);
return entity;
}
case "ARROW", "EGG", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "DROPPED_ITEM", "EXPERIENCE_ORB", "FALLING_BLOCK",
"FIREBALL", "FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND",
"MINECART_MOB_SPAWNER", "MINECART_TNT", "PLAYER", "PRIMED_TNT", "SMALL_FIREBALL", "SNOWBALL",
"SPLASH_POTION", "THROWN_EXP_BOTTLE", "SPECTRAL_ARROW", "SHULKER_BULLET", "AREA_EFFECT_CLOUD",
"DRAGON_FIREBALL", "WITHER_SKULL", "MINECART_FURNACE", "LLAMA_SPIT", "TRIDENT", "UNKNOWN" -> {
case "ARROW":
case "EGG":
case "ENDER_CRYSTAL":
case "ENDER_PEARL":
case "ENDER_SIGNAL":
case "DROPPED_ITEM":
case "EXPERIENCE_ORB":
case "FALLING_BLOCK":
case "FIREBALL":
case "FIREWORK":
case "FISHING_HOOK":
case "LEASH_HITCH":
case "LIGHTNING":
case "MINECART":
case "MINECART_COMMAND":
case "MINECART_MOB_SPAWNER":
case "MINECART_TNT":
case "PLAYER":
case "PRIMED_TNT":
case "SMALL_FIREBALL":
case "SNOWBALL":
case "SPLASH_POTION":
case "THROWN_EXP_BOTTLE":
case "SPECTRAL_ARROW":
case "SHULKER_BULLET":
case "AREA_EFFECT_CLOUD":
case "DRAGON_FIREBALL":
case "WITHER_SKULL":
case "MINECART_FURNACE":
case "LLAMA_SPIT":
case "TRIDENT":
case "UNKNOWN":
// Do this stuff later
return entity;
}
// MISC //
case "ITEM_FRAME" -> {
case "ITEM_FRAME":
ItemFrame itemframe = (ItemFrame) entity;
itemframe.setRotation(Rotation.values()[this.dataByte]);
itemframe.setItem(this.stack);
return entity;
}
case "PAINTING" -> {
case "PAINTING":
Painting painting = (Painting) entity;
painting.setFacingDirection(BlockFace.values()[this.dataByte], true);
painting.setArt(Art.getByName(this.dataString), true);
return entity;
}
// END MISC //
// INVENTORY HOLDER //
case "MINECART_CHEST", "MINECART_HOPPER" -> {
case "MINECART_CHEST":
case "MINECART_HOPPER":
restoreInventory((InventoryHolder) entity);
return entity;
}
// START LIVING ENTITY //
// START AGEABLE //
// START TAMEABLE //
case "HORSE", "LLAMA", "SKELETON_HORSE", "DONKEY", "MULE" -> {
case "HORSE":
case "LLAMA":
case "SKELETON_HORSE":
case "DONKEY":
case "MULE":
AbstractHorse horse = (AbstractHorse) entity;
horse.setJumpStrength(this.horse.jump);
if (horse instanceof ChestedHorse) {
@ -536,20 +582,19 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
//horse.setStyle(this.horse.style);
//horse.setColor(this.horse.color);
restoreTameable(horse);
restoreBreedable(horse);
restoreAgeable(horse);
restoreLiving(horse);
restoreInventory(horse);
return entity;
}
// END INVENTORY HOLDER //
case "WOLF", "OCELOT" -> {
case "WOLF":
case "OCELOT":
restoreTameable((Tameable) entity);
restoreBreedable((Breedable) entity);
restoreAgeable((Ageable) entity);
restoreLiving((LivingEntity) entity);
return entity;
}
// END AGEABLE //
case "SHEEP" -> {
case "SHEEP":
Sheep sheep = (Sheep) entity;
if (this.dataByte == 1) {
sheep.setSheared(true);
@ -557,25 +602,28 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
if (this.dataByte2 != 0) {
sheep.setColor(DyeColor.getByDyeData(this.dataByte2));
}
restoreBreedable(sheep);
restoreAgeable(sheep);
restoreLiving(sheep);
return sheep;
}
case "VILLAGER", "CHICKEN", "COW", "TURTLE", "POLAR_BEAR", "MUSHROOM_COW", "PIG" -> {
restoreBreedable((Breedable) entity);
case "VILLAGER":
case "CHICKEN":
case "COW":
case "TURTLE":
case "POLAR_BEAR":
case "MUSHROOM_COW":
case "PIG":
restoreAgeable((Ageable) entity);
restoreLiving((LivingEntity) entity);
return entity;
}
// END AGEABLE //
case "RABBIT" -> {
case "RABBIT":
if (this.dataByte != 0) {
((Rabbit) entity).setRabbitType(Rabbit.Type.values()[this.dataByte]);
}
restoreBreedable((Breedable) entity);
restoreAgeable((Ageable) entity);
restoreLiving((LivingEntity) entity);
return entity;
}
case "ARMOR_STAND" -> {
case "ARMOR_STAND":
// CHECK positions
ArmorStand stand = (ArmorStand) entity;
if (this.inventory[0] != null) {
@ -645,38 +693,56 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
}
restoreLiving(stand);
return stand;
}
case "BAT" -> {
case "BAT":
if (this.dataByte != 0) {
((Bat) entity).setAwake(true);
}
restoreLiving((LivingEntity) entity);
return entity;
}
case "ENDER_DRAGON" -> {
case "ENDER_DRAGON":
if (this.dataByte != 0) {
((EnderDragon) entity).setPhase(EnderDragon.Phase.values()[this.dataByte]);
}
restoreLiving((LivingEntity) entity);
return entity;
}
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 "ENDERMITE":
case "GHAST":
case "MAGMA_CUBE":
case "SQUID":
case "PIG_ZOMBIE":
case "HOGLIN":
case "PIGLIN":
case "ZOMBIFIED_PIGLIN":
case "PIGLIN_BRUTE":
case "ZOMBIE":
case "WITHER":
case "WITCH":
case "SPIDER":
case "CAVE_SPIDER":
case "SILVERFISH":
case "GIANT":
case "ENDERMAN":
case "CREEPER":
case "BLAZE":
case "SNOWMAN":
case "SHULKER":
case "GUARDIAN":
case "ELDER_GUARDIAN":
case "SKELETON":
case "WITHER_SKELETON":
restoreLiving((LivingEntity) entity);
return entity;
}
case "IRON_GOLEM" -> {
case "IRON_GOLEM":
if (this.dataByte != 0) {
((IronGolem) entity).setPlayerCreated(true);
}
restoreLiving((LivingEntity) entity);
return entity;
}
default -> {
default:
if (Settings.DEBUG) {
LOGGER.info("Could not identify entity: {}", entity.getType());
}
return entity;
}
// END LIVING
}
}

View File

@ -24,8 +24,9 @@ import com.plotsquared.core.generator.IndependentPlotGenerator;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.location.UncheckedWorldLocation;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.plot.world.SinglePlotArea;
import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
import com.plotsquared.core.queue.ScopedQueueCoordinator;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.LimitedRegion;
import org.bukkit.generator.WorldInfo;
@ -46,6 +47,17 @@ final class BlockStatePopulator extends BlockPopulator {
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
public void populate(
@NonNull final WorldInfo worldInfo,
@ -68,7 +80,7 @@ final class BlockStatePopulator extends BlockPopulator {
worldInfo.getMaxHeight(),
(chunkZ << 4) + 15
);
ZeroedDelegateScopedQueueCoordinator offsetChunkQueue = new ZeroedDelegateScopedQueueCoordinator(wrapped, min, max);
ScopedQueueCoordinator offsetChunkQueue = new ScopedQueueCoordinator(wrapped, min, max);
this.plotGenerator.populateChunk(offsetChunkQueue, area);
}

View File

@ -22,47 +22,28 @@ import com.plotsquared.bukkit.queue.GenChunk;
import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.bukkit.util.BukkitWorld;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.generator.ClassicPlotWorld;
import com.plotsquared.core.generator.GeneratorWrapper;
import com.plotsquared.core.generator.IndependentPlotGenerator;
import com.plotsquared.core.generator.SingleWorldGenerator;
import com.plotsquared.core.location.ChunkWrapper;
import com.plotsquared.core.location.UncheckedWorldLocation;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
import com.plotsquared.core.queue.ScopedQueueCoordinator;
import com.plotsquared.core.util.ChunkManager;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
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.block.Biome;
import org.bukkit.generator.BiomeProvider;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.generator.WorldInfo;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import static java.util.function.Predicate.not;
public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrapper<ChunkGenerator> {
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitPlotGenerator.class.getSimpleName());
@SuppressWarnings("unused")
public final boolean PAPER_ASYNC_SAFE = true;
@ -71,15 +52,9 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
private final ChunkGenerator platformGenerator;
private final boolean full;
private final String levelName;
private final boolean useNewGenerationMethods;
private final BiomeProvider biomeProvider;
private List<BlockPopulator> populators;
private boolean loaded = false;
private PlotArea lastPlotArea;
private int lastChunkX = Integer.MIN_VALUE;
private int lastChunkZ = Integer.MIN_VALUE;
public BukkitPlotGenerator(
final @NonNull String name,
final @NonNull IndependentPlotGenerator generator,
@ -97,23 +72,18 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
this.populators.add(new LegacyBlockStatePopulator(this.plotGenerator));
}
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) {
if (cg instanceof BukkitPlotGenerator) {
throw new IllegalArgumentException("ChunkGenerator: " + cg
.getClass()
.getName() + " is already a BukkitPlotGenerator!");
throw new IllegalArgumentException("ChunkGenerator: " + cg.getClass().getName()
+ " is already a BukkitPlotGenerator!");
}
this.plotAreaManager = plotAreaManager;
this.levelName = world;
this.full = false;
this.platformGenerator = cg;
this.plotGenerator = new DelegatePlotGenerator(cg, world);
this.useNewGenerationMethods = PlotSquared.platform().serverVersion()[1] >= 19;
this.biomeProvider = null;
}
@Override
@ -141,7 +111,7 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
try {
checkLoaded(world);
} catch (Exception e) {
LOGGER.error("Error attempting to load world into PlotSquared.", e);
e.printStackTrace();
}
ArrayList<BlockPopulator> toAdd = new ArrayList<>();
List<BlockPopulator> existing = world.getPopulators();
@ -158,7 +128,6 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
return toAdd;
}
// Extracted to synchronized method for thread-safety, preventing multiple internal world load calls
private synchronized void checkLoaded(@NonNull World world) {
// Do not attempt to load configurations until WorldEdit has a platform ready.
if (!PlotSquared.get().isWeInitialised()) {
@ -184,7 +153,7 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
}
}
@SuppressWarnings("deprecation") // Kept for compatibility with <=1.17.1
@SuppressWarnings("deprecation")
private void setSpawnLimits(@NonNull World world, int limit) {
world.setAmbientSpawnLimit(limit);
world.setAnimalSpawnLimit(limit);
@ -193,117 +162,10 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
}
@Override
public void generateNoise(
@NotNull final WorldInfo worldInfo,
@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
@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 maxY = BukkitWorld.getMaxWorldHeight(world);
GenChunk result = new GenChunk(minY, maxY);
@ -313,6 +175,7 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
for (int chunkZ = 0; chunkZ < 16; chunkZ++) {
for (int y = minY; y < maxY; y++) {
biome.setBiome(chunkX, y, chunkZ, Biome.PLAINS);
}
}
}
@ -332,32 +195,35 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
if (this.platformGenerator != this) {
return this.platformGenerator.generateChunkData(world, random, x, z, biome);
} else {
generate(BlockVector2.at(x, z), world.getName(), result, true);
generate(BlockVector2.at(x, z), world, result);
}
} catch (Throwable e) {
LOGGER.error("Error attempting to load world into PlotSquared.", e);
e.printStackTrace();
}
// Return the result data
return result.getChunkData();
}
private void generate(BlockVector2 loc, String world, ZeroedDelegateScopedQueueCoordinator result, boolean biomes) {
private void generate(BlockVector2 loc, World world, ScopedQueueCoordinator result) {
// Load if improperly loaded
if (!this.loaded) {
synchronized (this) {
PlotSquared.get().loadWorld(world, this);
}
checkLoaded(world);
}
// Process the chunk
if (ChunkManager.preProcessChunk(loc, result)) {
return;
}
PlotArea area = getPlotArea(world, loc.getX(), loc.getZ());
PlotArea area = this.plotAreaManager.getPlotArea(world.getName(), null);
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 {
this.plotGenerator.generateChunk(result, area, biomes);
this.plotGenerator.generateChunk(result, area);
} catch (Throwable e) {
// Recover from generator error
LOGGER.error("Error attempting to generate chunk.", e);
e.printStackTrace();
}
ChunkManager.postProcessChunk(loc, result);
}
@ -411,63 +277,4 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
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
}
}
}

View File

@ -24,10 +24,9 @@ import com.plotsquared.core.generator.IndependentPlotGenerator;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.PlotId;
import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
import com.plotsquared.core.queue.ScopedQueueCoordinator;
import com.plotsquared.core.util.MathMan;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.world.biome.BiomeType;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.generator.BlockPopulator;
@ -50,11 +49,6 @@ final class DelegatePlotGenerator extends IndependentPlotGenerator {
public void initialize(PlotArea area) {
}
@Override
public BiomeType getBiome(final PlotArea settings, final int x, final int y, final int z) {
return null;
}
@Override
public String getName() {
return this.chunkGenerator.getClass().getName();
@ -66,7 +60,7 @@ final class DelegatePlotGenerator extends IndependentPlotGenerator {
}
@Override
public void generateChunk(final ZeroedDelegateScopedQueueCoordinator result, PlotArea settings, boolean biomes) {
public void generateChunk(final ScopedQueueCoordinator result, PlotArea settings) {
World world = BukkitUtil.getWorld(this.world);
Location min = result.getMin();
int chunkX = min.getX() >> 4;

View File

@ -26,13 +26,14 @@ import com.plotsquared.core.location.UncheckedWorldLocation;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.world.SinglePlotArea;
import com.plotsquared.core.queue.QueueCoordinator;
import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
import com.plotsquared.core.queue.ScopedQueueCoordinator;
import com.sk89q.worldedit.bukkit.BukkitWorld;
import com.sk89q.worldedit.util.SideEffectSet;
import org.bukkit.Chunk;
import org.bukkit.World;
import org.bukkit.generator.BlockPopulator;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull;
import java.util.Random;
@ -50,7 +51,7 @@ final class LegacyBlockStatePopulator extends BlockPopulator {
}
@Override
public void populate(@NonNull final World world, @NonNull final Random random, @NonNull final Chunk source) {
public void populate(@NotNull final World world, @NotNull final Random random, @NotNull final Chunk source) {
int chunkMinX = source.getX() << 4;
int chunkMinZ = source.getZ() << 4;
PlotArea area = Location.at(world.getName(), chunkMinX, 0, chunkMinZ).getPlotArea();
@ -65,7 +66,7 @@ final class LegacyBlockStatePopulator extends BlockPopulator {
queue.setChunkObject(source);
Location min = UncheckedWorldLocation.at(world.getName(), chunkMinX, world.getMinHeight(), chunkMinZ);
Location max = UncheckedWorldLocation.at(world.getName(), chunkMinX + 15, world.getMaxHeight(), chunkMinZ + 15);
ZeroedDelegateScopedQueueCoordinator offsetChunkQueue = new ZeroedDelegateScopedQueueCoordinator(queue, min, max);
ScopedQueueCoordinator offsetChunkQueue = new ScopedQueueCoordinator(queue, min, max);
this.plotGenerator.populateChunk(offsetChunkQueue, area);
queue.enqueue();
}

View File

@ -23,13 +23,13 @@ import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.google.inject.assistedinject.FactoryModuleBuilder;
import com.plotsquared.bukkit.BukkitPlatform;
import com.plotsquared.bukkit.listener.ServerListener;
import com.plotsquared.bukkit.listener.SingleWorldListener;
import com.plotsquared.bukkit.player.BukkitPlayerManager;
import com.plotsquared.bukkit.queue.BukkitChunkCoordinator;
import com.plotsquared.bukkit.queue.BukkitQueueCoordinator;
import com.plotsquared.bukkit.schematic.BukkitSchematicHandler;
import com.plotsquared.bukkit.util.BukkitChunkManager;
import com.plotsquared.bukkit.util.BukkitEconHandler;
import com.plotsquared.bukkit.util.BukkitInventoryUtil;
import com.plotsquared.bukkit.util.BukkitRegionManager;
import com.plotsquared.bukkit.util.BukkitSetupUtils;
@ -47,9 +47,6 @@ import com.plotsquared.core.inject.factory.ChunkCoordinatorBuilderFactory;
import com.plotsquared.core.inject.factory.ChunkCoordinatorFactory;
import com.plotsquared.core.inject.factory.HybridPlotWorldFactory;
import com.plotsquared.core.inject.factory.ProgressSubscriberFactory;
import com.plotsquared.core.player.OfflinePlotPlayer;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.world.DefaultPlotAreaManager;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.plot.world.SinglePlotAreaManager;
@ -75,8 +72,6 @@ import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.plugin.java.JavaPlugin;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.Objects;
public class BukkitModule extends AbstractModule {
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitModule.class.getSimpleName());
@ -133,64 +128,21 @@ public class BukkitModule extends AbstractModule {
@Provides
@Singleton
@NonNull EconHandler provideEconHandler() {
if (!Settings.Enabled_Components.ECONOMY || !Bukkit.getPluginManager().isPluginEnabled("Vault")) {
if (!Settings.Enabled_Components.ECONOMY) {
return EconHandler.nullEconHandler();
}
// Guice eagerly initializes singletons, so we need to bring the laziness ourselves
return new LazyEconHandler();
}
private static final class LazyEconHandler extends EconHandler implements ServerListener.MutableEconHandler {
private volatile EconHandler implementation;
public void setImplementation(EconHandler econHandler) {
this.implementation = econHandler;
if (Bukkit.getPluginManager().isPluginEnabled("Vault")) {
try {
BukkitEconHandler econHandler = new BukkitEconHandler();
if (!econHandler.init()) {
LOGGER.warn("Economy is enabled but no plugin is providing an economy service. Falling back...");
return EconHandler.nullEconHandler();
}
return econHandler;
} catch (final Exception ignored) {
}
}
@Override
public boolean init() {
return get().init();
}
@Override
public double getBalance(final PlotPlayer<?> player) {
return get().getBalance(player);
}
@Override
public void withdrawMoney(final PlotPlayer<?> player, final double amount) {
get().withdrawMoney(player, amount);
}
@Override
public void depositMoney(final PlotPlayer<?> player, final double amount) {
get().depositMoney(player, amount);
}
@Override
public void depositMoney(final OfflinePlotPlayer player, final double amount) {
get().depositMoney(player, amount);
}
@Override
public boolean isEnabled(final PlotArea plotArea) {
return get().isEnabled(plotArea);
}
@Override
public @NonNull String format(final double balance) {
return get().format(balance);
}
@Override
public boolean isSupported() {
return get().isSupported();
}
private EconHandler get() {
return Objects.requireNonNull(this.implementation, "EconHandler not ready yet.");
}
return EconHandler.nullEconHandler();
}
}

View File

@ -33,7 +33,6 @@ import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.flag.implementations.BlockBurnFlag;
import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag;
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.CropGrowFlag;
import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
@ -56,24 +55,21 @@ import com.plotsquared.core.plot.flag.implementations.VineGrowFlag;
import com.plotsquared.core.plot.flag.types.BlockTypeWrapper;
import com.plotsquared.core.plot.flag.types.BooleanFlag;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.PlotFlagUtil;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.util.task.TaskTime;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.world.block.BlockType;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.Dispenser;
import org.bukkit.block.data.type.Farmland;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Fireball;
import org.bukkit.entity.Player;
@ -101,9 +97,9 @@ import org.bukkit.event.block.BlockSpreadEvent;
import org.bukkit.event.block.CauldronLevelChangeEvent;
import org.bukkit.event.block.EntityBlockFormEvent;
import org.bukkit.event.block.LeavesDecayEvent;
import org.bukkit.event.block.MoistureChangeEvent;
import org.bukkit.event.block.SpongeAbsorbEvent;
import org.bukkit.event.world.StructureGrowEvent;
import org.bukkit.material.Directional;
import org.bukkit.projectiles.BlockProjectileSource;
import org.bukkit.util.Vector;
import org.checkerframework.checker.nullness.qual.NonNull;
@ -116,10 +112,6 @@ import java.util.UUID;
import java.util.stream.Collectors;
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")
public class BlockEventListener implements Listener {
@ -174,7 +166,7 @@ public class BlockEventListener implements Listener {
}
Plot plot = location.getOwnedPlot();
if (plot == null) {
if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, RedstoneFlag.class, false)) {
if (area.isRoadFlags() && !area.getRoadFlag(RedstoneFlag.class)) {
event.setNewCurrent(0);
}
return;
@ -261,10 +253,7 @@ public class BlockEventListener implements Listener {
final BlockFace facing = piston.getFacing();
location = location.add(facing.getModX(), facing.getModY(), facing.getModZ());
Plot newPlot = area.getOwnedPlotAbs(location);
if (plot.equals(newPlot)) {
return;
}
if (!plot.isMerged() || !plot.getConnectedPlots().contains(newPlot)) {
if (!plot.equals(newPlot)) {
event.setCancelled(true);
plot.debug("Prevented piston update because of invalid edge piston detection");
}
@ -285,23 +274,13 @@ public class BlockEventListener implements Listener {
if (plot != null) {
if (area.notifyIfOutsideBuildArea(pp, location.getY())) {
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;
}
if (!plot.hasOwner()) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED))
);
event.setCancelled(true);
return;
@ -315,13 +294,10 @@ public class BlockEventListener implements Listener {
return;
}
}
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER))
);
event.setCancelled(true);
plot.debug(player.getName() + " could not place " + event.getBlock().getType()
@ -329,7 +305,7 @@ public class BlockEventListener implements Listener {
return;
}
} else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
pp.sendMessage(
TranslatableCaption.of("done.building_restricted")
);
@ -345,13 +321,10 @@ public class BlockEventListener implements Listener {
+ " did not fall because of disable-physics = true");
}
}
} else if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
} else if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD))
);
event.setCancelled(true);
}
@ -370,30 +343,22 @@ public class BlockEventListener implements Listener {
BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
// == rather than <= as we only care about the "ground level" not being destroyed
if (event.getBlock().getY() == area.getMinGenHeight()) {
if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_GROUNDLEVEL)) {
if (!Permissions
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_GROUNDLEVEL)) {
plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_GROUNDLEVEL)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_GROUNDLEVEL))
);
event.setCancelled(true);
return;
}
} else if (area.notifyIfOutsideBuildArea(plotPlayer, location.getY())) {
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;
}
if (!plot.hasOwner()) {
if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED, true)) {
if (!Permissions
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_UNOWNED, true)) {
event.setCancelled(true);
}
return;
@ -407,19 +372,17 @@ public class BlockEventListener implements Listener {
return;
}
}
if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
if (Permissions
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
return;
}
plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_OTHER))
);
event.setCancelled(true);
} else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
plotPlayer.sendMessage(
TranslatableCaption.of("done.building_restricted")
);
@ -430,7 +393,7 @@ public class BlockEventListener implements Listener {
return;
}
BukkitPlayer pp = BukkitUtil.adapt(player);
if (pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_ROAD)) {
if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_ROAD)) {
return;
}
if (this.worldEdit != null && pp.getAttribute("worldedit")) {
@ -441,10 +404,7 @@ public class BlockEventListener implements Listener {
}
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_ROAD)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_ROAD))
);
event.setCancelled(true);
}
@ -518,18 +478,18 @@ public class BlockEventListener implements Listener {
BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
if (plot != null) {
if (!plot.hasOwner()) {
if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) {
if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) {
return;
}
} else if (!plot.isAdded(plotPlayer.getUUID())) {
if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
return;
}
} else {
return;
}
} else {
if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD)) {
if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_ROAD)) {
return;
}
if (this.worldEdit != null && plotPlayer.getAttribute("worldedit")) {
@ -577,25 +537,19 @@ public class BlockEventListener implements Listener {
event.setCancelled(true);
return;
}
if (org.bukkit.Tag.SNOW.isTagged(event.getNewState().getType())) {
if (SNOW.contains(event.getNewState().getType())) {
if (!plot.getFlag(SnowFormFlag.class)) {
plot.debug("Snow could not form because snow-form = false");
event.setCancelled(true);
}
return;
}
if (org.bukkit.Tag.ICE.isTagged(event.getNewState().getType())) {
if (Tag.ICE.isTagged(event.getNewState().getType())) {
if (!plot.getFlag(IceFormFlag.class)) {
plot.debug("Ice could not form because ice-form = false");
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)
@ -615,9 +569,9 @@ public class BlockEventListener implements Listener {
return;
}
Class<? extends BooleanFlag<?>> flag;
if (org.bukkit.Tag.SNOW.isTagged(event.getNewState().getType())) {
if (SNOW.contains(event.getNewState().getType())) {
flag = SnowFormFlag.class;
} else if (org.bukkit.Tag.ICE.isTagged(event.getNewState().getType())) {
} else if (Tag.ICE.isTagged(event.getNewState().getType())) {
flag = IceFormFlag.class;
} else {
return;
@ -680,7 +634,8 @@ public class BlockEventListener implements Listener {
}
if (!plot.hasOwner()) {
BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) {
if (Permissions
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) {
return;
}
event.setCancelled(true);
@ -692,7 +647,8 @@ public class BlockEventListener implements Listener {
Block block = event.getBlock();
if (destroy
.contains(BlockTypeWrapper.get(BukkitAdapter.asBlockType(block.getType())))
|| plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
|| Permissions
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
return;
}
plot.debug(player.getName() + " could not break " + block.getType()
@ -703,7 +659,7 @@ public class BlockEventListener implements Listener {
return;
}
BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_ROAD)) {
if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_ROAD)) {
return;
}
event.setCancelled(true);
@ -723,14 +679,14 @@ public class BlockEventListener implements Listener {
return;
}
Material blockType = block.getType();
if (org.bukkit.Tag.ICE.isTagged(blockType)) {
if (Tag.ICE.isTagged(blockType)) {
if (!plot.getFlag(IceMeltFlag.class)) {
plot.debug("Ice could not melt because ice-melt = false");
event.setCancelled(true);
}
return;
}
if (org.bukkit.Tag.SNOW.isTagged(blockType)) {
if (SNOW.contains(blockType)) {
if (!plot.getFlag(SnowMeltFlag.class)) {
plot.debug("Snow could not melt because snow-melt = false");
event.setCancelled(true);
@ -744,7 +700,7 @@ public class BlockEventListener implements Listener {
}
return;
}
if (CORAL_BLOCKS.isTagged(blockType) || CORALS.isTagged(blockType) || WALL_CORALS.isTagged(blockType)) {
if (Tag.CORAL_BLOCKS.isTagged(blockType) || Tag.CORALS.isTagged(blockType) || Tag.WALL_CORALS.isTagged(blockType)) {
if (!plot.getFlag(CoralDryFlag.class)) {
plot.debug("Coral could not dry because coral-dry = false");
event.setCancelled(true);
@ -752,43 +708,6 @@ 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)
public void onChange(BlockFromToEvent event) {
Block fromBlock = event.getBlock();
@ -834,10 +753,7 @@ public class BlockEventListener implements Listener {
}
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);
return;
}
@ -853,10 +769,7 @@ public class BlockEventListener implements Listener {
toPlot.debug("Liquid could not flow because liquid-flow = disabled");
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);
} else if (event.getBlock().isLiquid()) {
final org.bukkit.Location location = event.getBlock().getLocation();
@ -1012,9 +925,6 @@ public class BlockEventListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockDispense(BlockDispenseEvent event) {
if (!this.plotAreaManager.hasPlotArea(event.getBlock().getWorld().getName())) {
return;
}
Material type = event.getItem().getType();
switch (type.toString()) {
case "SHULKER_BOX", "WHITE_SHULKER_BOX", "ORANGE_SHULKER_BOX", "MAGENTA_SHULKER_BOX", "LIGHT_BLUE_SHULKER_BOX",
@ -1026,7 +936,7 @@ public class BlockEventListener implements Listener {
if (event.getBlock().getType() == Material.DROPPER) {
return;
}
BlockFace targetFace = ((Dispenser) event.getBlock().getBlockData()).getFacing();
BlockFace targetFace = ((Directional) event.getBlock().getState().getData()).getFacing();
Location location = BukkitUtil.adapt(event.getBlock().getRelative(targetFace).getLocation());
if (location.isPlotRoad()) {
event.setCancelled(true);
@ -1126,7 +1036,6 @@ public class BlockEventListener implements Listener {
if (plot != null) {
plot.debug("Explosion was cancelled because explosion = false");
}
return;
}
event.blockList().removeIf(blox -> !plot.equals(area.getOwnedPlot(BukkitUtil.adapt(blox.getLocation()))));
}
@ -1175,39 +1084,26 @@ public class BlockEventListener implements Listener {
return;
}
if (plot == null) {
if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, BlockIgnitionFlag.class, true) && !pp.hasPermission(
Permission.PERMISSION_ADMIN_BUILD_ROAD
)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD))
);
event.setCancelled(true);
}
} else if (!plot.hasOwner()) {
if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, BlockIgnitionFlag.class, true) && !pp.hasPermission(
Permission.PERMISSION_ADMIN_BUILD_UNOWNED
)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED))
);
event.setCancelled(true);
}
} else if (!plot.isAdded(pp.getUUID())) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER))
);
event.setCancelled(true);
}
@ -1328,34 +1224,22 @@ public class BlockEventListener implements Listener {
for (final BlockState state : event.getReplacedBlockStates()) {
Location currentLocation = BukkitUtil.adapt(state.getLocation());
if (!pp.hasPermission(
if (!Permissions.hasPermission(
pp,
Permission.PERMISSION_ADMIN_BUILD_ROAD
) && !(Objects.equals(currentLocation.getPlot(), plot))) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD))
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD))
);
event.setCancelled(true);
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())) {
event.setCancelled(true);
break;
}
if (area.notifyIfOutsideBuildArea(pp, currentLocation.getY())) {
event.setCancelled(true);
break;
}
}
}
}

View File

@ -26,8 +26,6 @@ import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag;
import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag;
import com.plotsquared.core.plot.flag.implementations.SculkSensorInteractFlag;
import com.plotsquared.core.util.PlotFlagUtil;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
@ -93,16 +91,11 @@ public class BlockEventListener117 implements Listener {
}
Plot plot = location.getOwnedPlot();
if (plot == null && !PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(
area,
MiscInteractFlag.class,
true
) || plot != null && (!plot.getFlag(MiscInteractFlag.class) || !plot.getFlag(SculkSensorInteractFlag.class))) {
if (plot == null || !plot.getFlag(MiscInteractFlag.class)) {
if (plotPlayer != null) {
if (plot != null) {
if (!plot.isAdded(plotPlayer.getUUID())) {
plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because both " +
"sculk-sensor-interact and misc-interact = false");
plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because misc-interact = false");
event.setCancelled(true);
}
}
@ -111,17 +104,9 @@ public class BlockEventListener117 implements Listener {
if (entity instanceof Item item) {
UUID itemThrower = item.getThrower();
if (plot != null) {
if (itemThrower == null && (itemThrower = item.getOwner()) == null) {
plot.debug(
"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);
return;
}
if (!plot.isAdded(itemThrower)) {
if (!plot.isAdded(itemThrower)) {
plot.debug("A thrown item couldn't trigger sculk sensors because both sculk-sensor-interact and " +
"misc-interact = false");
plot.debug("A thrown item couldn't trigger sculk sensors because misc-interact = false");
event.setCancelled(true);
}
}
@ -140,6 +125,7 @@ public class BlockEventListener117 implements Listener {
if (area == null) {
for (int i = blocks.size() - 1; i >= 0; i--) {
Location blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
if (blockLocation.isPlotArea()) {
blocks.remove(i);
}

View File

@ -26,7 +26,6 @@ import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.world.PlotAreaManager;
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.RefField;
import com.plotsquared.core.util.ReflectionUtils.RefMethod;
@ -65,11 +64,9 @@ public class ChunkListener implements Listener {
private final PlotAreaManager plotAreaManager;
private final int version;
private RefMethod methodSetUnsaved;
private RefMethod methodGetHandleChunk;
private RefMethod methodGetHandleWorld;
private RefField mustNotSave;
private Object objChunkStatusFull = null;
private RefField mustSave;
/*
private RefMethod methodGetFullChunk;
private RefMethod methodGetBukkitChunk;
@ -82,6 +79,7 @@ public class ChunkListener implements Listener {
*/
private Chunk lastChunk;
private boolean ignoreUnload = false;
private boolean isTrueForNotSave = true;
@Inject
public ChunkListener(final @NonNull PlotAreaManager plotAreaManager) {
@ -92,27 +90,22 @@ public class ChunkListener implements Listener {
}
try {
RefClass classCraftWorld = getRefClass("{cb}.CraftWorld");
this.methodGetHandleWorld = classCraftWorld.getMethod("getHandle");
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");
} 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);
}
}
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle");
try {
if (version < 17) {
RefClass classChunk = getRefClass("{nms}.Chunk");
this.mustNotSave = classChunk.getField("mustNotSave");
if (version == 13) {
this.mustSave = classChunk.getField("mustSave");
this.isTrueForNotSave = false;
} else {
this.mustSave = classChunk.getField("mustNotSave");
}
} else {
RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
this.mustNotSave = classChunk.getField("mustNotSave");
this.mustSave = classChunk.getField("mustNotSave");
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
@ -174,13 +167,10 @@ public class ChunkListener implements Listener {
if (safe && shouldSave(world, chunk.getX(), chunk.getZ())) {
return false;
}
Object c = objChunkStatusFull != null
? this.methodGetHandleChunk.of(chunk).call(objChunkStatusFull)
: this.methodGetHandleChunk.of(chunk).call();
RefField.RefExecutor field = this.mustNotSave.of(c);
methodSetUnsaved.of(c).call(false);
if (!((Boolean) field.get())) {
field.set(true);
Object c = this.methodGetHandleChunk.of(chunk).call();
RefField.RefExecutor field = this.mustSave.of(c);
if ((Boolean) field.get() != isTrueForNotSave) {
field.set(isTrueForNotSave);
if (chunk.isLoaded()) {
ignoreUnload = true;
chunk.unload(false);
@ -244,8 +234,7 @@ public class ChunkListener implements Listener {
Chunk chunk = event.getChunk();
if (Settings.Chunk_Processor.AUTO_TRIM) {
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)) {
return;
}

View File

@ -19,7 +19,6 @@
package com.plotsquared.bukkit.listener;
import com.google.inject.Inject;
import com.plotsquared.bukkit.BukkitPlatform;
import com.plotsquared.bukkit.player.BukkitPlayer;
import com.plotsquared.bukkit.util.BukkitEntityUtil;
import com.plotsquared.bukkit.util.BukkitUtil;
@ -36,13 +35,11 @@ import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
import com.plotsquared.core.plot.flag.implementations.EntityChangeBlockFlag;
import com.plotsquared.core.plot.flag.implementations.ExplosionFlag;
import com.plotsquared.core.plot.flag.implementations.InvincibleFlag;
import com.plotsquared.core.plot.flag.implementations.ProjectileChangeBlockFlag;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.PlotFlagUtil;
import com.plotsquared.core.util.Permissions;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.world.block.BlockType;
import io.papermc.lib.PaperLib;
import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.World;
@ -56,7 +53,6 @@ import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.entity.Vehicle;
import org.bukkit.event.Cancellable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@ -81,43 +77,52 @@ import java.util.List;
@SuppressWarnings("unused")
public class EntityEventListener implements Listener {
private final BukkitPlatform platform;
private final PlotAreaManager plotAreaManager;
private final EventDispatcher eventDispatcher;
private float lastRadius;
@Inject
public EntityEventListener(
final @NonNull BukkitPlatform platform,
final @NonNull PlotAreaManager plotAreaManager,
final @NonNull EventDispatcher eventDispatcher
) {
this.platform = platform;
this.plotAreaManager = plotAreaManager;
this.eventDispatcher = eventDispatcher;
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onEntityCombustByEntity(EntityCombustByEntityEvent event) {
onEntityDamageByEntityCommon(event.getCombuster(), event.getEntity(), EntityDamageEvent.DamageCause.FIRE_TICK, event);
EntityDamageByEntityEvent eventChange =
new EntityDamageByEntityEvent(
event.getCombuster(),
event.getEntity(),
EntityDamageEvent.DamageCause.FIRE_TICK,
event.getDuration()
);
onEntityDamageByEntityEvent(eventChange);
if (eventChange.isCancelled()) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) {
onEntityDamageByEntityCommon(event.getDamager(), event.getEntity(), event.getCause(), event);
}
private void onEntityDamageByEntityCommon(
final Entity damager,
final Entity victim,
final EntityDamageEvent.DamageCause cause,
final Cancellable event
) {
Entity damager = event.getDamager();
Location location = BukkitUtil.adapt(damager.getLocation());
if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) {
return;
}
if (!BukkitEntityUtil.entityDamage(damager, victim, cause)) {
Entity victim = event.getEntity();
/*
if (victim.getType().equals(EntityType.ITEM_FRAME)) {
Plot plot = BukkitUtil.getLocation(victim).getPlot();
if (plot != null && !plot.isAdded(damager.getUniqueId())) {
event.setCancelled(true);
return;
}
}
*/
if (!BukkitEntityUtil.entityDamage(damager, victim, event.getCause())) {
if (event.isCancelled()) {
if (victim instanceof Ageable ageable) {
if (ageable.getAge() == -24000) {
@ -138,55 +143,56 @@ public class EntityEventListener implements Listener {
if (area == null) {
return;
}
// Armour-stands are handled elsewhere and should not be handled by area-wide entity-spawn options
if (entity.getType() == EntityType.ARMOR_STAND) {
return;
}
CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason();
switch (reason.toString()) {
case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> {
case "DISPENSE_EGG":
case "EGG":
case "OCELOT_BABY":
case "SPAWNER_EGG":
if (!area.isSpawnEggs()) {
event.setCancelled(true);
return;
}
}
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
"TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL",
"FROZEN", "SPELL", "DEFAULT" -> {
break;
case "REINFORCEMENTS":
case "NATURAL":
case "MOUNT":
case "PATROL":
case "RAID":
case "SHEARED":
case "SILVERFISH_BLOCK":
case "ENDER_PEARL":
case "TRAP":
case "VILLAGE_DEFENSE":
case "VILLAGE_INVASION":
case "BEEHIVE":
case "CHUNK_GEN":
if (!area.isMobSpawning()) {
event.setCancelled(true);
return;
}
}
case "BREEDING", "DUPLICATION" -> {
break;
case "BREEDING":
if (!area.isSpawnBreeding()) {
event.setCancelled(true);
return;
}
}
case "CUSTOM" -> {
if (!area.isSpawnCustom()) {
break;
case "BUILD_IRONGOLEM":
case "BUILD_SNOWMAN":
case "BUILD_WITHER":
case "CUSTOM":
if (!area.isSpawnCustom() && entity.getType() != EntityType.ARMOR_STAND) {
event.setCancelled(true);
return;
}
// No need to clutter metadata if running paper
if (!PaperLib.isPaper()) {
entity.setMetadata("ps_custom_spawned", new FixedMetadataValue(this.platform, true));
}
return; // Don't cancel if mob spawning is disabled
}
case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER" -> {
if (!area.isSpawnCustom()) {
event.setCancelled(true);
return;
}
}
case "SPAWNER" -> {
break;
case "SPAWNER":
if (!area.isMobSpawnerSpawning()) {
event.setCancelled(true);
return;
}
}
break;
}
Plot plot = area.getOwnedPlotAbs(location);
if (plot == null) {
@ -255,7 +261,7 @@ public class EntityEventListener implements Listener {
}
Plot plot = location.getOwnedPlot();
if (plot == null) {
if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, InvincibleFlag.class, true)) {
if (area.isRoadFlags() && area.getRoadFlag(InvincibleFlag.class)) {
event.setCancelled(true);
}
return;
@ -364,13 +370,14 @@ public class EntityEventListener implements Listener {
if (shooter instanceof Player) {
PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter);
if (plot == null) {
if (area.isRoadFlags() && !area.getRoadFlag(ProjectileChangeBlockFlag.class) && !pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
entity.remove();
event.setCancelled(true);
}
return;
}
if (plot.isAdded(pp.getUUID()) || plot.getFlag(ProjectileChangeBlockFlag.class) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
if (plot.isAdded(pp.getUUID()) || Permissions
.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
return;
}
entity.remove();

View File

@ -120,15 +120,9 @@ public class EntitySpawnListener implements Listener {
Entity entity = event.getEntity();
Location location = BukkitUtil.adapt(entity.getLocation());
PlotArea area = location.getPlotArea();
if (!location.isPlotArea() || area == null) {
if (!location.isPlotArea()) {
return;
}
if (PaperLib.isPaper()) {
//noinspection ConstantValue - getEntitySpawnReason annotated as NotNull, but is not NotNull. lol.
if (area.isSpawnCustom() && entity.getEntitySpawnReason() != null && "CUSTOM".equals(entity.getEntitySpawnReason().name())) {
return;
}
}
Plot plot = location.getOwnedPlotAbs();
EntityType type = entity.getType();
if (plot == null) {

View File

@ -25,6 +25,7 @@ import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.flag.implementations.ForcefieldFlag;
import com.plotsquared.core.util.Permissions;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
@ -108,7 +109,8 @@ public class ForceFieldListener {
if (plot.isAdded(uuid)) {
Set<PlotPlayer<?>> players = getNearbyPlayers(player, plot);
for (PlotPlayer<?> oPlayer : players) {
if (!oPlayer.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_FORCEFIELD)) {
if (!Permissions
.hasPermission(oPlayer, Permission.PERMISSION_ADMIN_ENTRY_FORCEFIELD)) {
((BukkitPlayer) oPlayer).player
.setVelocity(calculateVelocity(plotPlayer, oPlayer));
}
@ -118,7 +120,8 @@ public class ForceFieldListener {
if (oPlayer == null) {
return;
}
if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_FORCEFIELD)) {
if (!Permissions
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_ENTRY_FORCEFIELD)) {
player.setVelocity(calculateVelocity(oPlayer, plotPlayer));
}
}

View File

@ -43,10 +43,8 @@ import com.plotsquared.core.plot.flag.implementations.DoneFlag;
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
import com.plotsquared.core.plot.flag.types.BooleanFlag;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.PlotFlagUtil;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import com.plotsquared.core.util.Permissions;
import net.kyori.adventure.text.minimessage.Template;
import org.bukkit.Chunk;
import org.bukkit.block.Block;
import org.bukkit.block.TileState;
@ -124,7 +122,7 @@ public class PaperListener implements Listener {
}
Slime slime = event.getEntity();
Block b = slime.getTargetBlockExact(4);
Block b = slime.getTargetBlock(4);
if (b == null) {
return;
}
@ -166,57 +164,71 @@ public class PaperListener implements Listener {
}
Location location = BukkitUtil.adapt(event.getSpawnLocation());
PlotArea area = location.getPlotArea();
if (area == null) {
if (!location.isPlotArea()) {
return;
}
// Armour-stands are handled elsewhere and should not be handled by area-wide entity-spawn options
if (event.getType() == EntityType.ARMOR_STAND) {
return;
}
// If entities are spawning... the chunk should be loaded?
//If entities are spawning... the chunk should be loaded?
Entity[] entities = event.getSpawnLocation().getChunk().getEntities();
if (entities.length >= Settings.Chunk_Processor.MAX_ENTITIES) {
if (entities.length > Settings.Chunk_Processor.MAX_ENTITIES) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
return;
}
CreatureSpawnEvent.SpawnReason reason = event.getReason();
switch (reason.toString()) {
case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> {
case "DISPENSE_EGG":
case "EGG":
case "OCELOT_BABY":
case "SPAWNER_EGG":
if (!area.isSpawnEggs()) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
return;
}
}
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL", "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> {
break;
case "REINFORCEMENTS":
case "NATURAL":
case "MOUNT":
case "PATROL":
case "RAID":
case "SHEARED":
case "SILVERFISH_BLOCK":
case "ENDER_PEARL":
case "TRAP":
case "VILLAGE_DEFENSE":
case "VILLAGE_INVASION":
case "BEEHIVE":
case "CHUNK_GEN":
if (!area.isMobSpawning()) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
return;
}
}
case "BREEDING" -> {
break;
case "BREEDING":
if (!area.isSpawnBreeding()) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
return;
}
}
case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
if (!area.isSpawnCustom()) {
break;
case "BUILD_IRONGOLEM":
case "BUILD_SNOWMAN":
case "BUILD_WITHER":
case "CUSTOM":
if (!area.isSpawnCustom() && event.getType() != EntityType.ARMOR_STAND) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
return;
}
}
case "SPAWNER" -> {
break;
case "SPAWNER":
if (!area.isMobSpawnerSpawning()) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
return;
}
}
break;
}
Plot plot = location.getOwnedPlotAbs();
if (plot == null) {
@ -290,7 +302,7 @@ public class PaperListener implements Listener {
final PlotPlayer<?> plotPlayer = BukkitUtil.adapt(event.getPlayer());
plotPlayer.sendMessage(
TranslatableCaption.of("errors.tile_entity_cap_reached"),
TagResolver.resolver("amount", Tag.inserting(Component.text(Settings.Chunk_Processor.MAX_TILES)))
Template.of("amount", String.valueOf(Settings.Chunk_Processor.MAX_TILES))
);
event.setCancelled(true);
event.setBuild(false);
@ -314,48 +326,36 @@ public class PaperListener implements Listener {
return;
}
Location location = BukkitUtil.adapt(entity.getLocation());
PlotArea area = location.getPlotArea();
if (area == null) {
if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) {
return;
}
PlotPlayer<Player> pp = BukkitUtil.adapt((Player) shooter);
Plot plot = location.getOwnedPlot();
if (plot == null) {
if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true) && !pp.hasPermission(
Permission.PERMISSION_ADMIN_PROJECTILE_ROAD
)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_ROAD)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD))
);
entity.remove();
event.setCancelled(true);
}
} else if (!plot.hasOwner()) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED))
);
entity.remove();
event.setCancelled(true);
}
} else if (!plot.isAdded(pp.getUUID())) {
if (!plot.getFlag(ProjectilesFlag.class)) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER))
);
entity.remove();
event.setCancelled(true);
@ -443,11 +443,9 @@ public class PaperListener implements Listener {
}
}
private boolean getBooleanFlagValue(
@NonNull FlagContainer container,
@NonNull Class<? extends BooleanFlag<?>> flagClass,
boolean defaultValue
) {
private boolean getBooleanFlagValue(@NonNull FlagContainer container,
@NonNull Class<? extends BooleanFlag<?>> flagClass,
boolean defaultValue) {
BooleanFlag<?> flag = container.getFlag(flagClass);
return flag == null ? defaultValue : flag.getValue();
}

View File

@ -0,0 +1,87 @@
/*
* 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;
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);
}
}
}

View File

@ -50,7 +50,6 @@ import com.plotsquared.core.plot.flag.implementations.DenyPortalsFlag;
import com.plotsquared.core.plot.flag.implementations.DenyTeleportFlag;
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
import com.plotsquared.core.plot.flag.implementations.DropProtectionFlag;
import com.plotsquared.core.plot.flag.implementations.EditSignFlag;
import com.plotsquared.core.plot.flag.implementations.HangingBreakFlag;
import com.plotsquared.core.plot.flag.implementations.HangingPlaceFlag;
import com.plotsquared.core.plot.flag.implementations.HostileInteractFlag;
@ -68,7 +67,7 @@ import com.plotsquared.core.plot.flag.implementations.VillagerInteractFlag;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.PlotFlagUtil;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PremiumVerification;
import com.plotsquared.core.util.entity.EntityCategories;
import com.plotsquared.core.util.task.TaskManager;
@ -78,17 +77,15 @@ import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.world.block.BlockType;
import io.papermc.lib.PaperLib;
import net.kyori.adventure.text.Component;
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 net.kyori.adventure.text.minimessage.Template;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.FluidCollisionMode;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
import org.bukkit.block.data.Waterlogged;
import org.bukkit.command.PluginCommand;
import org.bukkit.entity.ArmorStand;
@ -177,33 +174,6 @@ public class PlayerEventListener implements Listener {
Material.WRITABLE_BOOK,
Material.WRITTEN_BOOK
);
private static final Set<String> DYES;
static {
Set<String> mutableDyes = new HashSet<>(Set.of(
"WHITE_DYE",
"LIGHT_GRAY_DYE",
"GRAY_DYE",
"BLACK_DYE",
"BROWN_DYE",
"RED_DYE",
"ORANGE_DYE",
"YELLOW_DYE",
"LIME_DYE",
"GREEN_DYE",
"CYAN_DYE",
"LIGHT_BLUE_DYE",
"BLUE_DYE",
"PURPLE_DYE",
"MAGENTA_DYE",
"PINK_DYE",
"GLOW_INK_SAC"
));
int[] version = PlotSquared.platform().serverVersion();
if (version[1] >= 20 && version[2] >= 1) {
mutableDyes.add("HONEYCOMB");
}
DYES = Set.copyOf(mutableDyes);
}
private final EventDispatcher eventDispatcher;
private final WorldEdit worldEdit;
private final PlotAreaManager plotAreaManager;
@ -236,40 +206,6 @@ public class PlayerEventListener implements Listener {
this.plotListener = plotListener;
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerDyeSign(PlayerInteractEvent event) {
ItemStack itemStack = event.getItem();
if (itemStack == null) {
return;
}
Block block = event.getClickedBlock();
if (block != null && block.getState() instanceof Sign) {
if (DYES.contains(itemStack.getType().toString())) {
Location location = BukkitUtil.adapt(block.getLocation());
PlotArea area = location.getPlotArea();
if (area == null) {
return;
}
Plot plot = location.getOwnedPlot();
if (plot == null) {
if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, EditSignFlag.class, false)
&& !event.getPlayer().hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString())) {
event.setCancelled(true);
}
return;
}
if (plot.isAdded(event.getPlayer().getUniqueId())) {
return; // allow for added players
}
if (!plot.getFlag(EditSignFlag.class)
&& !event.getPlayer().hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER.toString())) {
plot.debug(event.getPlayer().getName() + " could not color the sign because of edit-sign = false");
event.setCancelled(true);
}
}
}
}
@EventHandler(ignoreCancelled = true)
public void onEffect(@NonNull EntityPotionEffectEvent event) {
if (Settings.Enabled_Components.DISABLE_BEACON_EFFECT_OVERFLOW ||
@ -336,15 +272,13 @@ public class PlayerEventListener implements Listener {
Plot plot = plotPlayer.getCurrentPlot();
// Check WorldEdit
switch (parts[0]) {
case "up", "worldedit:up" -> {
if (plot == null || (!plot.isAdded(plotPlayer.getUUID()) && !plotPlayer.hasPermission(
Permission.PERMISSION_ADMIN_BUILD_OTHER,
true
))) {
case "up":
case "worldedit:up":
if (plot == null || (!plot.isAdded(plotPlayer.getUUID()) && !Permissions
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER, true))) {
event.setCancelled(true);
return;
}
}
}
if (plot == null && !area.isRoadFlags()) {
return;
@ -356,7 +290,7 @@ public class PlayerEventListener implements Listener {
if (blockedCommands.isEmpty()) {
return;
}
if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_BLOCKED_CMDS)) {
if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_BLOCKED_CMDS)) {
return;
}
// When using namespaced commands, we're not interested in the namespace
@ -375,7 +309,7 @@ public class PlayerEventListener implements Listener {
} else {
perm = "plots.admin.command.blocked-cmds.road";
}
if (!plotPlayer.hasPermission(perm)) {
if (!Permissions.hasPermission(plotPlayer, perm)) {
plotPlayer.sendMessage(TranslatableCaption.of("blockedcmds.command_blocked"));
event.setCancelled(true);
}
@ -432,7 +366,6 @@ public class PlayerEventListener implements Listener {
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
@SuppressWarnings("deprecation") // Paper deprecation
public void onConnect(PlayerJoinEvent event) {
final Player player = event.getPlayer();
PlotSquared.platform().playerManager().removePlayer(player.getUniqueId());
@ -463,15 +396,11 @@ public class PlayerEventListener implements Listener {
&& PremiumVerification.isPremium() && UpdateUtility.hasUpdate) {
Caption boundary = TranslatableCaption.of("update.update_boundary");
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(
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(updateNotification, internalVersion, spigotVersion, downloadUrl);
pp.sendMessage(boundary);
}
}
@ -523,7 +452,7 @@ public class PlayerEventListener implements Listener {
.equals(BukkitUtil.adaptComplete(to)))) {
pp.sendMessage(
TranslatableCaption.of("deny.no_enter"),
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.toString())))
Template.of("plot", plot.toString())
);
event.setCancelled(true);
}
@ -636,14 +565,10 @@ public class PlayerEventListener implements Listener {
if (now == null) {
try (final MetaDataAccess<Boolean> kickAccess =
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(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_EXIT_DENIED)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_EXIT_DENIED))
);
this.tmpTeleport = false;
if (lastPlot.equals(BukkitUtil.adapt(from).getPlot())) {
@ -661,7 +586,7 @@ public class PlayerEventListener implements Listener {
} else if (!plotListener.plotEntry(pp, now) && this.tmpTeleport) {
pp.sendMessage(
TranslatableCaption.of("deny.no_enter"),
TagResolver.resolver("plot", Tag.inserting(Component.text(now.toString())))
Template.of("plot", now.toString())
);
this.tmpTeleport = false;
to.setX(from.getBlockX());
@ -671,10 +596,10 @@ public class PlayerEventListener implements Listener {
this.tmpTeleport = true;
return;
}
int border = area.getBorder(true);
int border = area.getBorder();
int x1;
if (x2 > border && this.tmpTeleport) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
to.setX(border - 1);
this.tmpTeleport = false;
player.teleport(event.getTo());
@ -684,7 +609,7 @@ public class PlayerEventListener implements Listener {
pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
}
} else if (x2 < -border && this.tmpTeleport) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
to.setX(-border + 1);
this.tmpTeleport = false;
player.teleport(event.getTo());
@ -694,7 +619,7 @@ public class PlayerEventListener implements Listener {
pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
}
} else if (((x1 = MathMan.roundInt(from.getX())) >= border && x2 <= border) || (x1 <= -border && x2 >= -border)) {
if (pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
pp.sendMessage(TranslatableCaption.of("border.bypass.entered"));
}
}
@ -730,14 +655,10 @@ public class PlayerEventListener implements Listener {
if (plot == null) {
try (final MetaDataAccess<Boolean> kickAccess =
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(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_EXIT_DENIED)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_EXIT_DENIED))
);
this.tmpTeleport = false;
if (lastPlot.equals(BukkitUtil.adapt(from).getPlot())) {
@ -755,7 +676,7 @@ public class PlayerEventListener implements Listener {
} else if (!plotListener.plotEntry(pp, plot) && this.tmpTeleport) {
pp.sendMessage(
TranslatableCaption.of("deny.no_enter"),
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.toString())))
Template.of("plot", plot.toString())
);
this.tmpTeleport = false;
player.teleport(from);
@ -766,10 +687,10 @@ public class PlayerEventListener implements Listener {
this.tmpTeleport = true;
return;
}
int border = area.getBorder(true);
int border = area.getBorder();
int z1;
if (z2 > border && this.tmpTeleport) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
to.setZ(border - 1);
this.tmpTeleport = false;
player.teleport(event.getTo());
@ -779,7 +700,7 @@ public class PlayerEventListener implements Listener {
pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
}
} else if (z2 < -border && this.tmpTeleport) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
to.setZ(-border + 1);
this.tmpTeleport = false;
player.teleport(event.getTo());
@ -789,7 +710,7 @@ public class PlayerEventListener implements Listener {
pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
}
} else if (((z1 = MathMan.roundInt(from.getZ())) >= border && z2 <= border) || (z1 <= -border && z2 >= -border)) {
if (pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
pp.sendMessage(TranslatableCaption.of("border.bypass.entered"));
}
}
@ -797,7 +718,6 @@ public class PlayerEventListener implements Listener {
}
@EventHandler(priority = EventPriority.LOW)
@SuppressWarnings("deprecation") // Paper deprecation
public void onChat(AsyncPlayerChatEvent event) {
if (event.isCancelled()) {
return;
@ -817,7 +737,8 @@ public class PlayerEventListener implements Listener {
|| area.isForcingPlotChat())) {
return;
}
if (plot.isDenied(plotPlayer.getUUID()) && !plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_CHAT_BYPASS)) {
if (plot.isDenied(plotPlayer.getUUID()) && !Permissions
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_CHAT_BYPASS)) {
return;
}
event.setCancelled(true);
@ -840,34 +761,46 @@ public class PlayerEventListener implements Listener {
PlotId id = plot.getId();
String worldName = plot.getWorldName();
Caption msg = TranslatableCaption.of("chat.plot_chat_format");
TagResolver.Builder builder = TagResolver.builder();
builder.tag("world", Tag.inserting(Component.text(worldName)));
builder.tag("plot_id", Tag.inserting(Component.text(id.toString())));
builder.tag("sender", Tag.inserting(Component.text(sender)));
Template msgTemplate;
Template worldNameTemplate = Template.of("world", worldName);
Template plotTemplate = Template.of("plot_id", id.toString());
Template senderTemplate = Template.of("sender", 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")) {
builder.tag("msg", Tag.inserting(MiniMessage.miniMessage().deserialize(
message,
TagResolver.resolver(StandardTags.color(), StandardTags.gradient(),
StandardTags.rainbow(), StandardTags.decorations()
)
)));
msgTemplate = Template
.of(
"msg",
BukkitUtil.LEGACY_COMPONENT_SERIALIZER.deserialize(ChatColor.translateAlternateColorCodes(
'&',
message
))
);
} else {
builder.tag("msg", Tag.inserting(Component.text(message)));
msgTemplate = Template.of("msg", BukkitUtil.MINI_MESSAGE.deserialize(
ChatColor.stripColor(BukkitUtil.LEGACY_COMPONENT_SERIALIZER.serialize(Component.text(message)))));
}
for (PlotPlayer<?> receiver : plotRecipients) {
receiver.sendMessage(msg, builder.build());
receiver.sendMessage(msg, worldNameTemplate, msgTemplate, plotTemplate, senderTemplate);
}
if (!spies.isEmpty()) {
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) {
player.sendMessage(spymsg, builder.tag("message", Tag.inserting(Component.text(message))).build());
player.sendMessage(spymsg, worldNameTemplate, plotidTemplate, spysenderTemplate, spymessageTemplate);
}
}
if (Settings.Chat.LOG_PLOTCHAT_TO_CONSOLE) {
Caption spymsg = TranslatableCaption.of("chat.plot_chat_spy_format");
ConsolePlayer.getConsole().sendMessage(
spymsg,
builder.tag("message", Tag.inserting(Component.text(message))).build()
Template plotidTemplate = Template.of("plot_id", id.getX() + ";" + id.getY());
Template spysenderTemplate = Template.of("sender", sender);
Template spymessageTemplate = Template.of("msg", Component.text(message));
ConsolePlayer.getConsole().sendMessage(spymsg, worldNameTemplate, plotidTemplate, spysenderTemplate,
spymessageTemplate
);
}
}
@ -890,7 +823,7 @@ public class PlayerEventListener implements Listener {
plotListener.plotExit(pp, plot);
}
if (this.worldEdit != null) {
if (!pp.hasPermission(Permission.PERMISSION_WORLDEDIT_BYPASS)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_WORLDEDIT_BYPASS)) {
if (pp.getAttribute("worldedit")) {
pp.removeAttribute("worldedit");
}
@ -946,7 +879,8 @@ public class PlayerEventListener implements Listener {
final Plot plot = pp.getCurrentPlot();
if (plot != null) {
if (plot.getFlag(PreventCreativeCopyFlag.class) && !plot
.isAdded(player.getUniqueId()) && !pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
.isAdded(player.getUniqueId()) && !Permissions
.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
final ItemStack newStack =
new ItemStack(newItem.getType(), newItem.getAmount());
event.setCursor(newStack);
@ -955,7 +889,8 @@ public class PlayerEventListener implements Listener {
}
} else {
PlotArea area = pp.getPlotAreaAbs();
if (area != null && PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, PreventCreativeCopyFlag.class, true)) {
if (area != null && area.isRoadFlags() && area
.getRoadFlag(PreventCreativeCopyFlag.class)) {
final ItemStack newStack =
new ItemStack(newItem.getType(), newItem.getAmount());
event.setCursor(newStack);
@ -1008,37 +943,28 @@ public class PlayerEventListener implements Listener {
Plot plot = area.getPlotAbs(location);
boolean cancelled = false;
if (plot == null) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_ROAD)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_ROAD)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_ROAD))
);
cancelled = true;
}
} else if (!plot.hasOwner()) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED))
);
cancelled = true;
}
} else {
UUID uuid = pp.getUUID();
if (!plot.isAdded(uuid)) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_OTHER))
);
cancelled = true;
}
@ -1072,34 +998,29 @@ public class PlayerEventListener implements Listener {
Plot plot = location.getPlotAbs();
BukkitPlayer pp = BukkitUtil.adapt(e.getPlayer());
if (plot == null) {
if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, MiscInteractFlag.class, true) && !pp.hasPermission(
Permission.PERMISSION_ADMIN_INTERACT_ROAD
)) {
if (!area.isRoadFlags() && !area.getRoadFlag(MiscInteractFlag.class) && !Permissions
.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_ROAD)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_ROAD)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_ROAD))
);
e.setCancelled(true);
}
} else {
if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
pp.sendMessage(TranslatableCaption.of("done.building_restricted"));
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
pp.sendMessage(
TranslatableCaption.of("done.building_restricted")
);
e.setCancelled(true);
return;
}
}
if (!plot.hasOwner()) {
if (!pp.hasPermission("plots.admin.interact.unowned")) {
if (!Permissions.hasPermission(pp, "plots.admin.interact.unowned")) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED))
);
e.setCancelled(true);
}
@ -1111,13 +1032,10 @@ public class PlayerEventListener implements Listener {
if (plot.getFlag(MiscInteractFlag.class)) {
return;
}
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_OTHER))
);
e.setCancelled(true);
plot.debug(pp.getName() + " could not interact with " + entity.getType()
@ -1128,7 +1046,6 @@ public class PlayerEventListener implements Listener {
}
@EventHandler(priority = EventPriority.LOW)
@SuppressWarnings("deprecation") // Paper deprecation
public void onCancelledInteract(PlayerInteractEvent event) {
if (event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_AIR) {
Player player = event.getPlayer();
@ -1182,13 +1099,13 @@ public class PlayerEventListener implements Listener {
Location location = BukkitUtil.adapt(block.getLocation());
Action action = event.getAction();
switch (action) {
case PHYSICAL -> {
case PHYSICAL: {
eventType = PlayerBlockEventType.TRIGGER_PHYSICAL;
blocktype1 = BukkitAdapter.asBlockType(block.getType());
break;
}
//todo rearrange the right click code. it is all over the place.
case RIGHT_CLICK_BLOCK -> {
case RIGHT_CLICK_BLOCK: {
Material blockType = block.getType();
eventType = PlayerBlockEventType.INTERACT_BLOCK;
blocktype1 = BukkitAdapter.asBlockType(block.getType());
@ -1210,16 +1127,21 @@ public class PlayerEventListener implements Listener {
// in the following, lb needs to have the material of the item in hand i.e. type
switch (type.toString()) {
case "REDSTONE", "STRING", "PUMPKIN_SEEDS", "MELON_SEEDS", "COCOA_BEANS", "WHEAT_SEEDS", "BEETROOT_SEEDS",
"SWEET_BERRIES", "GLOW_BERRIES" -> {
case "REDSTONE":
case "STRING":
case "PUMPKIN_SEEDS":
case "MELON_SEEDS":
case "COCOA_BEANS":
case "WHEAT_SEEDS":
case "BEETROOT_SEEDS":
case "SWEET_BERRIES":
case "GLOW_BERRIES":
return;
}
default -> {
default:
//eventType = PlayerBlockEventType.PLACE_BLOCK;
if (type.isBlock()) {
return;
}
}
}
if (PaperLib.isPaper()) {
if (MaterialTags.SPAWN_EGGS.isTagged(type) || Material.EGG.equals(type)) {
@ -1233,14 +1155,14 @@ public class PlayerEventListener implements Listener {
}
}
if (type.isEdible()) {
//Allow all players to eat while also allowing the block place event to be fired
//Allow all players to eat while also allowing the block place event ot be fired
return;
}
if (type == Material.ARMOR_STAND) {
location = BukkitUtil.adapt(block.getRelative(event.getBlockFace()).getLocation());
eventType = PlayerBlockEventType.PLACE_MISC;
}
if (org.bukkit.Tag.ITEMS_BOATS.isTagged(type) || MINECARTS.contains(type)) {
if (Tag.ITEMS_BOATS.isTagged(type) || MINECARTS.contains(type)) {
eventType = PlayerBlockEventType.PLACE_VEHICLE;
break;
}
@ -1252,8 +1174,9 @@ public class PlayerEventListener implements Listener {
eventType = PlayerBlockEventType.READ;
break;
}
break;
}
case LEFT_CLICK_BLOCK -> {
case LEFT_CLICK_BLOCK: {
Material blockType = block.getType();
// todo: when the code above is rearranged, it would be great to beautify this as well.
@ -1264,10 +1187,10 @@ public class PlayerEventListener implements Listener {
eventType = PlayerBlockEventType.INTERACT_BLOCK;
blocktype1 = BukkitAdapter.asBlockType(block.getType());
break;
}
default -> {
default:
return;
}
}
if (this.worldEdit != null && pp.getAttribute("worldedit")) {
if (event.getMaterial() == Material.getMaterial(this.worldEdit.getConfiguration().wandItem)) {
@ -1334,40 +1257,34 @@ public class PlayerEventListener implements Listener {
BukkitPlayer pp = BukkitUtil.adapt(event.getPlayer());
Plot plot = area.getPlot(location);
if (plot == null) {
if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
return;
}
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD))
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD))
);
event.setCancelled(true);
} else if (!plot.hasOwner()) {
if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
return;
}
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED))
);
event.setCancelled(true);
} else if (!plot.isAdded(pp.getUUID())) {
if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
return;
}
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER))
);
event.setCancelled(true);
} else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
pp.sendMessage(
TranslatableCaption.of("done.building_restricted")
);
@ -1405,40 +1322,34 @@ public class PlayerEventListener implements Listener {
BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
Plot plot = area.getPlot(location);
if (plot == null) {
if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
return;
}
plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD))
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD))
);
event.setCancelled(true);
} else if (!plot.hasOwner()) {
if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
return;
}
plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED))
);
event.setCancelled(true);
} else if (!plot.isAdded(plotPlayer.getUUID())) {
if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
return;
}
plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER))
);
event.setCancelled(true);
} else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
plotPlayer.sendMessage(
TranslatableCaption.of("done.building_restricted")
);
@ -1463,25 +1374,19 @@ public class PlayerEventListener implements Listener {
BukkitPlayer pp = BukkitUtil.adapt(p);
Plot plot = area.getPlot(location);
if (plot == null) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD))
);
event.setCancelled(true);
}
} else {
if (!plot.hasOwner()) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED))
);
event.setCancelled(true);
}
@ -1489,13 +1394,10 @@ public class PlayerEventListener implements Listener {
}
if (!plot.isAdded(pp.getUUID())) {
if (!plot.getFlag(HangingPlaceFlag.class)) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER))
);
event.setCancelled(true);
}
@ -1521,24 +1423,18 @@ public class PlayerEventListener implements Listener {
BukkitPlayer pp = BukkitUtil.adapt(p);
Plot plot = area.getPlot(location);
if (plot == null) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_ROAD)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_ROAD)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_ROAD)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_ROAD))
);
event.setCancelled(true);
}
} else if (!plot.hasOwner()) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED))
);
event.setCancelled(true);
}
@ -1546,13 +1442,10 @@ public class PlayerEventListener implements Listener {
if (plot.getFlag(HangingBreakFlag.class)) {
return;
}
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_OTHER))
);
event.setCancelled(true);
plot.debug(p.getName()
@ -1570,25 +1463,21 @@ public class PlayerEventListener implements Listener {
Plot plot = area.getPlot(BukkitUtil.adapt(event.getEntity().getLocation()));
if (plot != null) {
if (!plot.hasOwner()) {
if (!player.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) {
if (!Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED))
);
event.setCancelled(true);
}
} else if (!plot.isAdded(player.getUUID())) {
if (!plot.getFlag(HangingBreakFlag.class)) {
if (!player.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
if (!Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_DESTROY_OTHER)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_OTHER))
);
event.setCancelled(true);
plot.debug(player.getName()
@ -1617,24 +1506,18 @@ public class PlayerEventListener implements Listener {
BukkitPlayer pp = BukkitUtil.adapt(p);
Plot plot = area.getPlot(location);
if (plot == null && !area.isRoadFlags()) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_ROAD)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_ROAD)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_ROAD))
);
event.setCancelled(true);
}
} else if (plot != null && !plot.hasOwner()) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED))
);
event.setCancelled(true);
}
@ -1689,13 +1572,10 @@ public class PlayerEventListener implements Listener {
return;
}
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_OTHER)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_OTHER))
);
event.setCancelled(true);
}
@ -1714,27 +1594,19 @@ public class PlayerEventListener implements Listener {
BukkitPlayer pp = BukkitUtil.adapt(p);
Plot plot = area.getPlot(location);
if (plot == null) {
if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, VehicleBreakFlag.class, true) && !pp.hasPermission(
Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD
)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD))
);
event.setCancelled(true);
}
} else {
if (!plot.hasOwner()) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_UNOWNED)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_UNOWNED)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_UNOWNED)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_UNOWNED))
);
event.setCancelled(true);
return;
@ -1745,13 +1617,10 @@ public class PlayerEventListener implements Listener {
if (plot.getFlag(VehicleBreakFlag.class)) {
return;
}
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_OTHER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_OTHER)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_OTHER))
);
event.setCancelled(true);
plot.debug(pp.getName()
@ -1773,7 +1642,7 @@ public class PlayerEventListener implements Listener {
}
Plot plot = location.getOwnedPlot();
if (plot == null) {
if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ItemDropFlag.class, false)) {
if (area.isRoadFlags() && !area.getRoadFlag(ItemDropFlag.class)) {
event.setCancelled(true);
}
return;
@ -1799,7 +1668,7 @@ public class PlayerEventListener implements Listener {
}
Plot plot = location.getOwnedPlot();
if (plot == null) {
if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, DropProtectionFlag.class, true)) {
if (area.isRoadFlags() && area.getRoadFlag(DropProtectionFlag.class)) {
event.setCancelled(true);
}
return;
@ -1821,15 +1690,17 @@ public class PlayerEventListener implements Listener {
}
Plot plot = location.getOwnedPlot();
if (plot == null) {
if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, KeepInventoryFlag.class, true)) {
if (area.isRoadFlags() && area.getRoadFlag(KeepInventoryFlag.class)) {
event.setCancelled(true);
}
return;
}
if (plot.getFlag(KeepInventoryFlag.class)) {
plot.debug(event.getEntity().getName() + " kept their inventory because of keep-inventory = true");
event.getDrops().clear();
event.setKeepInventory(true);
if (plot.getFlag(KeepInventoryFlag.class)) {
plot.debug(event.getEntity().getName() + " kept their inventory because of keep-inventory = true");
event.getDrops().clear();
event.setKeepInventory(true);
}
}
}
@ -1854,14 +1725,16 @@ public class PlayerEventListener implements Listener {
}
Plot plot = location.getOwnedPlot();
if (plot == null) {
if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, DenyPortalTravelFlag.class, true)) {
if (area.isRoadFlags() && area.getRoadFlag(DenyPortalTravelFlag.class)) {
event.setCancelled(true);
}
return;
}
if (plot.getFlag(DenyPortalTravelFlag.class)) {
plot.debug(event.getPlayer().getName() + " did not travel thru a portal because of deny-portal-travel = true");
event.setCancelled(true);
if (plot.getFlag(DenyPortalTravelFlag.class)) {
plot.debug(event.getPlayer().getName() + " did not travel thru a portal because of deny-portal-travel = true");
event.setCancelled(true);
}
}
}
@ -1899,7 +1772,7 @@ public class PlayerEventListener implements Listener {
}
Plot plot = location.getOwnedPlot();
if (plot == null) {
if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, DenyPortalsFlag.class, true)) {
if (area.isRoadFlags() && area.getRoadFlag(DenyPortalsFlag.class)) {
event.setCancelled(true);
return;
}
@ -1928,14 +1801,16 @@ public class PlayerEventListener implements Listener {
}
Plot plot = location.getOwnedPlot();
if (plot == null) {
if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, LecternReadBookFlag.class, true)) {
if (area.isRoadFlags() && area.getRoadFlag(LecternReadBookFlag.class)) {
event.setCancelled(true);
}
return;
}
if (plot.getFlag(LecternReadBookFlag.class)) {
plot.debug(event.getPlayer().getName() + " could not take the book because of lectern-read-book = true");
event.setCancelled(true);
if (plot.getFlag(LecternReadBookFlag.class)) {
plot.debug(event.getPlayer().getName() + " could not take the book because of lectern-read-book = true");
event.setCancelled(true);
}
}
}

View File

@ -1,66 +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.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.flag.implementations.EditSignFlag;
import com.plotsquared.core.util.PlotFlagUtil;
import org.bukkit.block.Sign;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerSignOpenEvent;
/**
* For events since 1.20.1
* @since 7.2.1
*/
public class PlayerEventListener1201 implements Listener {
@EventHandler(ignoreCancelled = true)
@SuppressWarnings({"removal", "UnstableApiUsage"}) // thanks Paper, thanks Spigot
public void onPlayerSignOpenEvent(PlayerSignOpenEvent event) {
Sign sign = event.getSign();
Location location = BukkitUtil.adapt(sign.getLocation());
PlotArea area = location.getPlotArea();
if (area == null) {
return;
}
Plot plot = location.getOwnedPlot();
if (plot == null) {
if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, EditSignFlag.class, false)
&& !event.getPlayer().hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString())) {
event.setCancelled(true);
}
return;
}
if (plot.isAdded(event.getPlayer().getUniqueId())) {
return; // allow for added players
}
if (!plot.getFlag(EditSignFlag.class)
&& !event.getPlayer().hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER.toString())) {
plot.debug(event.getPlayer().getName() + " could not edit the sign because of edit-sign = false");
event.setCancelled(true);
}
}
}

View File

@ -30,9 +30,8 @@ import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.PlotHandler;
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.PlotFlagUtil;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import com.plotsquared.core.util.Permissions;
import net.kyori.adventure.text.minimessage.Template;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
@ -98,48 +97,36 @@ public class ProjectileEventListener implements Listener {
return;
}
Location location = BukkitUtil.adapt(entity.getLocation());
PlotArea area = location.getPlotArea();
if (area == null) {
if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) {
return;
}
PlotPlayer<Player> pp = BukkitUtil.adapt((Player) shooter);
Plot plot = location.getOwnedPlot();
if (plot == null) {
if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true) && !pp.hasPermission(
Permission.PERMISSION_ADMIN_PROJECTILE_ROAD
)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_ROAD)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD))
);
entity.remove();
event.setCancelled(true);
}
} else if (!plot.hasOwner()) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED))
);
entity.remove();
event.setCancelled(true);
}
} else if (!plot.isAdded(pp.getUUID())) {
if (!plot.getFlag(ProjectilesFlag.class)) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER))
);
entity.remove();
event.setCancelled(true);
@ -167,8 +154,6 @@ public class ProjectileEventListener implements Listener {
if (plot.isAdded(((Player) shooter).getUniqueId()) || plot.getFlag(ProjectilesFlag.class)) {
return;
}
} else if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true)) {
return;
}
entity.remove();
@ -178,16 +163,14 @@ public class ProjectileEventListener implements Listener {
PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter);
if (plot == null) {
if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true) && !pp.hasPermission(
Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED
)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) {
entity.remove();
event.setCancelled(true);
}
return;
}
if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag(
ProjectilesFlag.class)) {
if (plot.isAdded(pp.getUUID()) || Permissions
.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag(ProjectilesFlag.class)) {
return;
}
entity.remove();
@ -211,6 +194,7 @@ public class ProjectileEventListener implements Listener {
if (sPlot == null || !PlotHandler.sameOwners(plot, sPlot)) {
entity.remove();
event.setCancelled(true);
return;
}
}
}

View File

@ -21,14 +21,9 @@ package com.plotsquared.bukkit.listener;
import com.google.inject.Inject;
import com.plotsquared.bukkit.BukkitPlatform;
import com.plotsquared.bukkit.placeholder.MVdWPlaceholders;
import com.plotsquared.bukkit.util.BukkitEconHandler;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.player.ConsolePlayer;
import com.plotsquared.core.util.EconHandler;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@ -37,8 +32,6 @@ import org.checkerframework.checker.nullness.qual.NonNull;
public class ServerListener implements Listener {
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ServerListener.class.getSimpleName());
private final BukkitPlatform plugin;
@Inject
@ -52,29 +45,6 @@ public class ServerListener implements Listener {
new MVdWPlaceholders(this.plugin, this.plugin.placeholderRegistry());
ConsolePlayer.getConsole().sendMessage(TranslatableCaption.of("placeholder.hooked"));
}
if (Settings.Enabled_Components.ECONOMY && Bukkit.getPluginManager().isPluginEnabled("Vault")) {
EconHandler econHandler = new BukkitEconHandler();
try {
if (!econHandler.init()) {
LOGGER.warn("Economy is enabled but no plugin is providing an economy service. Falling back...");
econHandler = EconHandler.nullEconHandler();
}
} catch (final Exception ignored) {
econHandler = EconHandler.nullEconHandler();
}
if (PlotSquared.platform().econHandler() instanceof MutableEconHandler meh) {
meh.setImplementation(econHandler);
}
}
}
/**
* Internal use only. Required to implement lazy econ loading using Guice.
*
* @since 7.2.0
*/
public interface MutableEconHandler {
void setImplementation(EconHandler econHandler);
}
}

View File

@ -31,39 +31,45 @@ import org.bukkit.event.Listener;
import org.bukkit.event.world.ChunkEvent;
import org.bukkit.event.world.ChunkLoadEvent;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
public class SingleWorldListener implements Listener {
private final Method methodSetUnsaved;
private Method methodGetHandleChunk;
private Object objChunkStatusFull = null;
private final Method methodGetHandleChunk;
private Field shouldSave = null;
public SingleWorldListener() throws Exception {
ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
ReflectionUtils.RefClass classChunkAccess = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
this.methodSetUnsaved = classChunkAccess.getMethod("a", boolean.class).getRealMethod();
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod();
try {
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod();
} catch (NoSuchMethodException ignored) {
try {
ReflectionUtils.RefClass classChunkStatus = getRefClass("net.minecraft.world.level.chunk.ChunkStatus");
this.objChunkStatusFull = classChunkStatus.getRealClass().getField("n").get(null);
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle", classChunkStatus.getRealClass()).getRealMethod();
} catch (NoSuchMethodException ex) {
throw new RuntimeException(ex);
if (PlotSquared.platform().serverVersion()[1] < 17) {
ReflectionUtils.RefClass classChunk = getRefClass("{nms}.Chunk");
if (PlotSquared.platform().serverVersion()[1] == 13) {
this.shouldSave = classChunk.getField("mustSave").getRealField();
} else {
this.shouldSave = classChunk.getField("s").getRealField();
}
} 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) {
try {
Object nmsChunk = objChunkStatusFull != null
? this.methodGetHandleChunk.invoke(chunk, objChunkStatusFull)
: this.methodGetHandleChunk.invoke(chunk);
methodSetUnsaved.invoke(nmsChunk, false);
Object nmsChunk = methodGetHandleChunk.invoke(chunk);
if (shouldSave != null) {
this.shouldSave.set(nmsChunk, false);
}
} catch (Throwable e) {
e.printStackTrace();
}
@ -79,12 +85,7 @@ public class SingleWorldListener implements Listener {
if (!SinglePlotArea.isSinglePlotWorld(name)) {
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());
}

View File

@ -0,0 +1,63 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.plotsquared.bukkit.managers;
/*
import com.google.inject.Singleton;
import org.bukkit.World;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import se.hyperver.hyperverse.Hyperverse;
import se.hyperver.hyperverse.world.WorldConfiguration;
import se.hyperver.hyperverse.world.WorldConfigurationBuilder;
import se.hyperver.hyperverse.world.WorldFeatures;
import se.hyperver.hyperverse.world.WorldType;
Hyperverse implementation is currently put on ice until Hyperverse is released on a stable line and deployed to the central
repository.
@Singleton
public class HyperverseWorldManager extends BukkitWorldManager {
@Override
public @Nullable World handleWorldCreation(@NonNull String worldName, @Nullable String generator) {
// First let Bukkit register the world
this.setGenerator(worldName, generator);
// Create the world
final WorldConfigurationBuilder worldConfigurationBuilder = WorldConfiguration.builder()
.setName(worldName).setType(WorldType.OVER_WORLD);
if (generator != null) {
worldConfigurationBuilder.setGenerator(generator).setWorldFeatures(WorldFeatures.FLATLAND);
}
try {
return Hyperverse.getApi().createWorld(worldConfigurationBuilder.createWorldConfiguration())
.getBukkitWorld();
} catch (final Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public String getName() {
return "bukkit-hyperverse";
}
}
*/

View File

@ -30,9 +30,8 @@ import org.checkerframework.checker.nullness.qual.Nullable;
*
* @deprecated Deprecated and scheduled for removal without replacement
* 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
@Deprecated(forRemoval = true, since = "6.0.0")
@Singleton
public class MultiverseWorldManager extends BukkitWorldManager {

View File

@ -52,7 +52,7 @@ public class MVdWPlaceholders {
@Subscribe
public void onNewPlaceholder(final PlaceholderRegistry.@NonNull PlaceholderAddedEvent event) {
this.addPlaceholder(event.placeholder());
this.addPlaceholder(event.getPlaceholder());
}
private void addPlaceholder(final @NonNull Placeholder placeholder) {

View File

@ -20,8 +20,6 @@ package com.plotsquared.bukkit.placeholder;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
import com.plotsquared.core.util.query.PlotQuery;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import org.bukkit.entity.Player;
@ -85,20 +83,6 @@ public class PAPIPlaceholders extends PlaceholderExpansion {
return String.valueOf(pl.getPlotCount(identifier));
}
if (identifier.startsWith("base_plot_count_")) {
identifier = identifier.substring("base_plot_count_".length());
if (identifier.isEmpty()) {
return "";
}
return String.valueOf(PlotQuery.newQuery()
.ownedBy(pl)
.inWorld(identifier)
.whereBasePlot()
.thatPasses(plot -> !DoneFlag.isDone(plot))
.count());
}
// PlotSquared placeholders
return PlotSquared.platform().placeholderRegistry().getPlaceholderValue(identifier, pl);
}

View File

@ -43,7 +43,7 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer {
*/
public BukkitOfflinePlayer(
final @NonNull OfflinePlayer player, final @NonNull
PermissionHandler permissionHandler
PermissionHandler permissionHandler
) {
this.player = player;
this.permissionProfile = permissionHandler.getPermissionProfile(this)
@ -87,9 +87,4 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer {
);
}
@Override
public boolean hasPermission(@NonNull final String permission, final boolean notify) {
return hasPermission(permission);
}
}

View File

@ -32,7 +32,6 @@ import com.plotsquared.core.plot.PlotWeather;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.WorldUtil;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.world.item.ItemType;
@ -41,7 +40,6 @@ import io.papermc.lib.PaperLib;
import net.kyori.adventure.audience.Audience;
import org.bukkit.GameMode;
import org.bukkit.Sound;
import org.bukkit.SoundCategory;
import org.bukkit.WeatherType;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
@ -53,6 +51,7 @@ import org.bukkit.potion.PotionEffectType;
import org.checkerframework.checker.index.qual.NonNegative;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.Arrays;
import java.util.Set;
import java.util.UUID;
@ -68,15 +67,24 @@ public class BukkitPlayer extends PlotPlayer<Player> {
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 eventDispatcher EventDispatcher instance
* @param player Bukkit player instance
* @param permissionHandler PermissionHandler instance
*/
BukkitPlayer(
final @NonNull PlotAreaManager plotAreaManager,
final @NonNull EventDispatcher eventDispatcher,
final @NonNull Player player,
public BukkitPlayer(
final @NonNull PlotAreaManager plotAreaManager, final @NonNull EventDispatcher eventDispatcher,
final @NonNull Player player, final @NonNull PermissionHandler permissionHandler
) {
this(plotAreaManager, eventDispatcher, player, false, permissionHandler);
}
public BukkitPlayer(
final @NonNull PlotAreaManager plotAreaManager, final @NonNull
EventDispatcher eventDispatcher, final @NonNull Player player,
final boolean realPlayer,
final @NonNull PermissionHandler permissionHandler
) {
@ -121,9 +129,6 @@ public class BukkitPlayer extends PlotPlayer<Player> {
@Override
public boolean canTeleport(final @NonNull Location location) {
if (!WorldUtil.isValidLocation(location)) {
return false;
}
final org.bukkit.Location to = BukkitUtil.adapt(location);
final org.bukkit.Location from = player.getLocation();
PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to);
@ -162,7 +167,6 @@ public class BukkitPlayer extends PlotPlayer<Player> {
}
final String[] nodes = stub.split("\\.");
final StringBuilder n = new StringBuilder();
// Wildcard check from less specific permission to more specific permission
for (int i = 0; i < (nodes.length - 1); i++) {
n.append(nodes[i]).append(".");
if (!stub.equals(n + Permission.PERMISSION_STAR.toString())) {
@ -171,11 +175,9 @@ public class BukkitPlayer extends PlotPlayer<Player> {
}
}
}
// Wildcard check for the full permission
if (hasPermission(stub + ".*")) {
return Integer.MAX_VALUE;
}
// Permission value cache for iterative check
int max = 0;
if (CHECK_EFFECTIVE) {
boolean hasAny = false;
@ -183,10 +185,6 @@ public class BukkitPlayer extends PlotPlayer<Player> {
final Set<PermissionAttachmentInfo> effective = player.getEffectivePermissions();
if (!effective.isEmpty()) {
for (PermissionAttachmentInfo attach : effective) {
// Ignore all "false" permissions
if (!attach.getValue()) {
continue;
}
String permStr = attach.getPermission();
if (permStr.startsWith(stubPlus)) {
hasAny = true;
@ -225,7 +223,7 @@ public class BukkitPlayer extends PlotPlayer<Player> {
@Override
public void teleport(final @NonNull Location location, final @NonNull TeleportCause cause) {
if (!WorldUtil.isValidLocation(location)) {
if (Math.abs(location.getX()) >= 30000000 || Math.abs(location.getZ()) >= 30000000) {
return;
}
final org.bukkit.Location bukkitLocation =
@ -313,21 +311,18 @@ public class BukkitPlayer extends PlotPlayer<Player> {
@Override
public void playMusic(final @NonNull Location location, final @NonNull ItemType id) {
if (id == ItemTypes.AIR) {
if (PlotSquared.platform().serverVersion()[1] >= 19) {
player.stopSound(SoundCategory.MUSIC);
return;
// Let's just stop all the discs because why not?
for (final Sound sound : Arrays.stream(Sound.values())
.filter(sound -> sound.name().contains("DISC")).toList()) {
player.stopSound(sound);
}
// 1.18 and downwards require a specific Sound to stop (even tho the packet does not??)
for (final Sound sound : Sound.values()) {
if (sound.name().startsWith("MUSIC_DISC")) {
this.player.stopSound(sound, SoundCategory.MUSIC);
}
}
return;
// this.player.playEffect(BukkitUtil.getLocation(location), Effect.RECORD_PLAY, Material.AIR);
} else {
// this.player.playEffect(BukkitUtil.getLocation(location), Effect.RECORD_PLAY, id.to(Material.class));
this.player.playSound(BukkitUtil.adapt(location),
Sound.valueOf(BukkitAdapter.adapt(id).name()), Float.MAX_VALUE, 1f
);
}
this.player.playSound(BukkitUtil.adapt(location), Sound.valueOf(BukkitAdapter.adapt(id).name()),
SoundCategory.MUSIC, 1f, 1f
);
}
@SuppressWarnings("deprecation") // Needed for Spigot compatibility

View File

@ -70,7 +70,7 @@ public class BukkitPlayerManager extends PlayerManager<BukkitPlayer, Player> {
if (player == null || !player.isOnline()) {
throw new NoSuchPlayerException(uuid);
}
return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, player, false, this.permissionHandler);
return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, player, this.permissionHandler);
}
@Nullable

View File

@ -239,11 +239,9 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator {
* server's main thread.
*/
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()) {
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) {
return;
}

View File

@ -270,7 +270,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
if (getChunkObject() instanceof Chunk chunkObject) {
existing = chunkObject.getBlock(x & 15, y, z & 15);
} else {
existing = getBukkitWorld().getBlockAt(x, y, z);
existing = getBukkitWorld().getBlockAt(x, y, z);
}
final BlockState existingBaseBlock = BukkitAdapter.adapt(existing.getBlockData());
if (BukkitBlockUtil.get(existing).equals(existingBaseBlock) && existing.getBlockData().matches(blockData)) {

View File

@ -24,7 +24,7 @@ import com.plotsquared.bukkit.util.BukkitBlockUtil;
import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.location.ChunkWrapper;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
import com.plotsquared.core.queue.ScopedQueueCoordinator;
import com.plotsquared.core.util.ChunkUtil;
import com.plotsquared.core.util.PatternUtil;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
@ -44,11 +44,8 @@ import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.Arrays;
/**
* Internal use only. Subject to changes at any time.
*/
@DoNotUse
public class GenChunk extends ZeroedDelegateScopedQueueCoordinator {
public class GenChunk extends ScopedQueueCoordinator {
public final Biome[] biomes;
public BlockState[][] result;
@ -62,6 +59,7 @@ public class GenChunk extends ZeroedDelegateScopedQueueCoordinator {
/**
* @param minY minimum world Y, inclusive
* @param maxY maximum world Y, inclusive
*
* @since 6.6.0
*/
public GenChunk(int minY, int maxY) {
@ -109,9 +107,9 @@ public class GenChunk extends ZeroedDelegateScopedQueueCoordinator {
*/
public void setChunk(@NonNull ChunkWrapper wrap) {
chunk = null;
world = wrap.world();
chunkX = wrap.x();
chunkZ = wrap.z();
world = wrap.world;
chunkX = wrap.x;
chunkZ = wrap.z;
}
@Override

View File

@ -44,7 +44,6 @@ public class LimitedRegionWrapperQueue extends DelegateQueueCoordinator {
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + LimitedRegionWrapperQueue.class.getSimpleName());
private final LimitedRegion limitedRegion;
private boolean useOtherRestoreTagMethod = false;
/**
* @since 6.9.0
@ -66,18 +65,10 @@ public class LimitedRegionWrapperQueue extends DelegateQueueCoordinator {
CompoundTag tag = id.getNbtData();
StateWrapper sw = new StateWrapper(tag);
try {
if (useOtherRestoreTagMethod && getWorld() != null) {
sw.restoreTag(getWorld().getName(), x, y, z);
} else {
sw.restoreTag(limitedRegion.getBlockState(x, y, z).getBlock());
}
sw.restoreTag(limitedRegion.getBlockState(x, y, z).getBlock());
} catch (IllegalArgumentException e) {
LOGGER.error("Error attempting to populate tile entity into the world at location {},{},{}", x, y, z, e);
return false;
} catch (IllegalStateException e) {
useOtherRestoreTagMethod = true;
LOGGER.warn("IllegalStateException attempting to populate tile entity into the world at location {},{},{}. " +
"Possibly on <=1.17.1, switching to secondary method.", x, y, z, e);
}
}
return result;

View File

@ -18,8 +18,6 @@
*/
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.sk89q.jnbt.ByteTag;
import com.sk89q.jnbt.CompoundTag;
@ -30,22 +28,16 @@ import com.sk89q.jnbt.Tag;
import com.sk89q.worldedit.blocks.BaseItemStack;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
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.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.World;
import org.bukkit.block.Banner;
import org.bukkit.block.Block;
import org.bukkit.block.Container;
import org.bukkit.block.Sign;
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.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.checkerframework.checker.nullness.qual.NonNull;
@ -54,15 +46,20 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.UUID;
public class StateWrapper {
public CompoundTag tag;
public org.bukkit.block.BlockState state = null;
public CompoundTag tag = null;
private boolean paperErrorTextureSent = false;
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + StateWrapper.class.getSimpleName());
/**
* @deprecated in favour of using WE 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 StateWrapper(org.bukkit.block.BlockState state) {
this.state = state;
}
public StateWrapper(CompoundTag tag) {
this.tag = tag;
@ -240,64 +237,15 @@ public class StateWrapper {
return true;
}
String player = skullOwner.getString("Name");
if (player != null && !player.isEmpty()) {
try {
skull.setOwningPlayer(Bukkit.getOfflinePlayer(player));
skull.update(true);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
final CompoundTag properties = (CompoundTag) skullOwner.getValue().get("Properties");
if (properties == null) {
if (player == null || player.isEmpty()) {
return false;
}
final ListTag textures = properties.getListTag("textures");
if (textures.getValue().isEmpty()) {
return false;
try {
skull.setOwningPlayer(Bukkit.getOfflinePlayer(player));
skull.update(true);
} catch (Exception e) {
e.printStackTrace();
}
final CompoundTag textureCompound = (CompoundTag) textures.getValue().get(0);
if (textureCompound == null) {
return false;
}
String textureValue = textureCompound.getString("Value");
if (textureValue == null) {
return false;
}
if (!PaperLib.isPaper()) {
if (!paperErrorTextureSent) {
paperErrorTextureSent = true;
LOGGER.error("Failed to populate skull data in your road schematic - This is a Spigot limitation.");
}
return false;
}
final PlayerProfile profile = Bukkit.createProfile(UUID.randomUUID());
profile.setProperty(new ProfileProperty("textures", textureValue));
skull.setPlayerProfile(profile);
skull.update(true);
return true;
}
return false;
}
case "banner" -> {
if (state instanceof Banner banner) {
List<Tag> patterns = this.tag.getListTag("Patterns").getValue();
if (patterns == null || patterns.isEmpty()) {
return false;
}
banner.setPatterns(patterns.stream().map(t -> (CompoundTag) t).map(compoundTag -> {
DyeColor color = DyeColor.getByWoolData((byte) compoundTag.getInt("Color"));
PatternType patternType = PatternType.getByIdentifier(compoundTag.getString("Pattern"));
if (color == null || patternType == null) {
return null;
}
return new Pattern(color, patternType);
}).filter(Objects::nonNull).toList());
banner.update(true);
return true;
}
return false;
@ -306,6 +254,26 @@ public class StateWrapper {
return false;
}
/**
* Get a CompoundTag of the contents of a block's inventory (chest, furnace, etc.).
*
* @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) {
ItemStack[] contents = inv.getInventory().getContents();
Map<String, Tag> values = new HashMap<>();
values.put("Items", new ListTag(CompoundTag.class, serializeInventory(contents)));
return new CompoundTag(values);
}
return null;
}
public String getId() {
String tileid = this.tag.getString("id").toLowerCase();
if (tileid.startsWith("minecraft:")) {

View File

@ -40,11 +40,10 @@ import com.plotsquared.core.plot.flag.implementations.PvpFlag;
import com.plotsquared.core.plot.flag.implementations.TamedAttackFlag;
import com.plotsquared.core.plot.flag.implementations.VehicleCapFlag;
import com.plotsquared.core.util.EntityUtil;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.entity.EntityCategories;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Creature;
import org.bukkit.entity.Entity;
@ -169,7 +168,8 @@ public class BukkitEntityUtil {
if (plot != null && (plot.getFlag(HangingBreakFlag.class) || plot
.isAdded(plotPlayer.getUUID()))) {
if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
if (!Permissions
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
plotPlayer.sendMessage(
TranslatableCaption.of("done.building_restricted")
);
@ -178,13 +178,10 @@ public class BukkitEntityUtil {
}
return true;
}
if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY + "." + stub)) {
if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY + "." + stub)) {
plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_DESTROY + "." + stub))
)
Template.of("node", Permission.PERMISSION_ADMIN_DESTROY + "." + stub)
);
return false;
}
@ -193,13 +190,10 @@ public class BukkitEntityUtil {
.isAdded(plotPlayer.getUUID()))) {
return true;
}
if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY + "." + stub)) {
if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY + "." + stub)) {
plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_DESTROY + "." + stub))
)
Template.of("node", Permission.PERMISSION_ADMIN_DESTROY + "." + stub)
);
if (plot != null) {
plot.debug(player.getName()
@ -217,13 +211,10 @@ public class BukkitEntityUtil {
.getFlag(PveFlag.class))) {
return true;
}
if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVE + "." + stub))
)
Template.of("node", Permission.PERMISSION_ADMIN_PVE + "." + stub)
);
if (plot != null) {
plot.debug(player.getName() + " could not attack " + entityType
@ -241,13 +232,10 @@ public class BukkitEntityUtil {
.getFlag(PveFlag.class))) {
return true;
}
if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVE + "." + stub))
)
Template.of("node", Permission.PERMISSION_ADMIN_PVE + "." + stub)
);
if (plot != null) {
plot.debug(player.getName() + " could not attack " + entityType
@ -257,13 +245,11 @@ public class BukkitEntityUtil {
}
} else if (EntityCategories.PLAYER.contains(entityType)) {
if (isPlot) {
if (!plot.getFlag(PvpFlag.class) && !plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVP + "." + stub)) {
if (!plot.getFlag(PvpFlag.class) && !Permissions
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVP + "." + stub)) {
plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVP + "." + stub))
)
Template.of("node", Permission.PERMISSION_ADMIN_PVP + "." + stub)
);
plot.debug(player.getName() + " could not attack " + entityType
+ " because pve = false");
@ -274,13 +260,10 @@ public class BukkitEntityUtil {
} else if (roadFlags && area.getRoadFlag(PvpFlag.class)) {
return true;
}
if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVP + "." + stub)) {
if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVP + "." + stub)) {
plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVP + "." + stub))
)
Template.of("node", Permission.PERMISSION_ADMIN_PVP + "." + stub)
);
return false;
}
@ -294,13 +277,10 @@ public class BukkitEntityUtil {
.getFlag(PveFlag.class))) {
return true;
}
if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVE + "." + stub))
)
Template.of("node", Permission.PERMISSION_ADMIN_PVE + "." + stub)
);
if (plot != null) {
plot.debug(player.getName() + " could not attack " + entityType
@ -319,13 +299,10 @@ public class BukkitEntityUtil {
} else if (roadFlags && area.getRoadFlag(PveFlag.class)) {
return true;
}
if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVE + "." + stub)) {
plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver(
"node",
Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVE + "." + stub))
)
Template.of("node", Permission.PERMISSION_ADMIN_PVE + "." + stub)
);
if (plot != null) {
plot.debug(player.getName() + " could not attack " + entityType

View File

@ -44,7 +44,6 @@ import java.util.stream.IntStream;
@Singleton
public class BukkitInventoryUtil extends InventoryUtil {
@SuppressWarnings("deprecation") // Paper deprecation
private static @Nullable ItemStack getItem(PlotItemStack item) {
if (item == null) {
return null;
@ -57,7 +56,7 @@ public class BukkitInventoryUtil extends InventoryUtil {
ItemMeta meta = null;
if (item.getName() != null) {
meta = stack.getItemMeta();
Component nameComponent = BukkitUtil.MINI_MESSAGE.deserialize(item.getName());
Component nameComponent = BukkitUtil.MINI_MESSAGE.parse(item.getName());
meta.setDisplayName(BukkitUtil.LEGACY_COMPONENT_SERIALIZER.serialize(nameComponent));
}
if (item.getLore() != null) {

View File

@ -30,7 +30,7 @@ import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.PlotManager;
import com.plotsquared.core.queue.GlobalBlockQueue;
import com.plotsquared.core.queue.QueueCoordinator;
import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
import com.plotsquared.core.queue.ScopedQueueCoordinator;
import com.plotsquared.core.util.ChunkManager;
import com.plotsquared.core.util.RegionManager;
import com.plotsquared.core.util.WorldUtil;
@ -70,7 +70,7 @@ public class BukkitRegionManager extends RegionManager {
@Inject
public BukkitRegionManager(
@NonNull WorldUtil worldUtil, @NonNull GlobalBlockQueue blockQueue, @NonNull
ProgressSubscriberFactory subscriberFactory
ProgressSubscriberFactory subscriberFactory
) {
super(worldUtil, blockQueue, subscriberFactory);
this.blockQueue = blockQueue;
@ -257,9 +257,9 @@ public class BukkitRegionManager extends RegionManager {
map.saveEntitiesOut(Bukkit.getWorld(world.getName()).getChunkAt(x, z), currentPlotClear);
AugmentedUtils.bypass(
ignoreAugment,
() -> ChunkManager.setChunkInPlotArea(null, new RunnableVal<ZeroedDelegateScopedQueueCoordinator>() {
() -> ChunkManager.setChunkInPlotArea(null, new RunnableVal<ScopedQueueCoordinator>() {
@Override
public void run(ZeroedDelegateScopedQueueCoordinator value) {
public void run(ScopedQueueCoordinator value) {
Location min = value.getMin();
int bx = min.getX();
int bz = min.getZ();

View File

@ -67,7 +67,6 @@ public class BukkitSetupUtils extends SetupUtils {
this.worldFile = worldFile;
}
@SuppressWarnings("deprecation") // Paper deprecation
@Override
public void updateGenerators(final boolean force) {
if (loaded && !SetupUtils.generators.isEmpty() && !force) {
@ -125,7 +124,7 @@ public class BukkitSetupUtils extends SetupUtils {
public String setupWorld(PlotAreaBuilder builder) {
this.updateGenerators(false);
ConfigurationNode[] steps = builder.settingsNodesWrapper() == null ?
new ConfigurationNode[0] : builder.settingsNodesWrapper().settingsNodes();
new ConfigurationNode[0] : builder.settingsNodesWrapper().getSettingsNodes();
String world = builder.worldName();
PlotAreaType type = builder.plotAreaType();
String worldPath = "worlds." + builder.worldName();

View File

@ -45,7 +45,7 @@ import com.sk89q.worldedit.world.block.BlockTypes;
import io.papermc.lib.PaperLib;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@ -333,7 +333,7 @@ public class BukkitUtil extends WorldUtil {
@SuppressWarnings("deprecation")
public void setSign(
final @NonNull Location location, final @NonNull Caption[] lines,
final @NonNull TagResolver... replacements
final @NonNull Template... replacements
) {
ensureLoaded(location.getWorldName(), location.getX(), location.getZ(), chunk -> {
PlotArea area = location.getPlotArea();
@ -366,9 +366,8 @@ public class BukkitUtil extends WorldUtil {
final org.bukkit.block.BlockState blockstate = block.getState();
if (blockstate instanceof final Sign sign) {
for (int i = 0; i < lines.length; i++) {
sign.setLine(i, LEGACY_COMPONENT_SERIALIZER.serialize(
MINI_MESSAGE.deserialize(lines[i].getComponent(LocaleHolder.console()), replacements)
));
sign.setLine(i, LEGACY_COMPONENT_SERIALIZER
.serialize(MINI_MESSAGE.parse(lines[i].getComponent(LocaleHolder.console()), replacements)));
}
sign.update(true, false);
}

View File

@ -24,6 +24,7 @@ import org.bukkit.Bukkit;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.Map;
import java.util.Objects;
public class BukkitWorld implements World<org.bukkit.World> {
@ -132,6 +133,14 @@ public class BukkitWorld implements World<org.bukkit.World> {
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() {
return "BukkitWorld(world=" + this.world + ")";
}

View File

@ -1,98 +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.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 remainingGrantsReplacement = "remaining_grants";
String minimumRadius = "minimumRadius";
String minimumRadiusReplacement = "minimum_radius";
String maximumMoves = "maximumMoves";
String maximumMovesReplacement = "maximum_moves";
String userMove = "userMove";
String userMoveReplacement = "user_move";
// tag opening / closing characters are important, as the locale keys exist as well, which should not be replaced
String listInfoUnknown = "<info.unknown>";
String listInfoUnknownReplacement = "<unknown>";
String listInfoServer = "<info.server>";
String listInfoServerReplacement = "<server>";
String listInfoEveryone = "<info.everyone>";
String listInfoEveryoneReplacement = "<everyone>";
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, remainingGrantsReplacement);
replaceInFile(p, minimumRadius, minimumRadiusReplacement);
replaceInFile(p, maximumMoves, maximumMovesReplacement);
replaceInFile(p, userMove, userMoveReplacement);
replaceInFile(p, listInfoUnknown, listInfoUnknownReplacement);
replaceInFile(p, listInfoServer, listInfoServerReplacement);
replaceInFile(p, listInfoEveryone, listInfoEveryoneReplacement);
});
}
}
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();
}
}
}

View File

@ -35,7 +35,7 @@ import org.bukkit.scheduler.BukkitTask;
import javax.net.ssl.HttpsURLConnection;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URL;
public class UpdateUtility implements Listener {
@ -54,14 +54,12 @@ public class UpdateUtility implements Listener {
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() {
task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> {
try {
HttpsURLConnection connection = (HttpsURLConnection) URI.create(
"https://api.spigotmc.org/simple/0.2/index.php?action=getResource&id=77506")
.toURL()
HttpsURLConnection connection = (HttpsURLConnection) new URL(
"https://api.spigotmc.org/simple/0.1/index.php?action=getResource&id=77506")
.openConnection();
connection.setRequestMethod("GET");
JsonObject result = new JsonParser()

View File

@ -36,10 +36,9 @@ import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.world.biome.BiomeType;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
import java.util.Set;
public class FaweRegionManager extends BukkitRegionManager {
@ -47,7 +46,10 @@ public class FaweRegionManager extends BukkitRegionManager {
private final FaweDelegateRegionManager delegate = new FaweDelegateRegionManager();
@Inject
public FaweRegionManager(WorldUtil worldUtil, GlobalBlockQueue blockQueue, ProgressSubscriberFactory subscriberFactory) {
public FaweRegionManager(
@NonNull WorldUtil worldUtil, @NonNull GlobalBlockQueue blockQueue, @NonNull
ProgressSubscriberFactory subscriberFactory
) {
super(worldUtil, blockQueue, subscriberFactory);
}
@ -61,10 +63,7 @@ public class FaweRegionManager extends BukkitRegionManager {
@Nullable PlotPlayer<?> actor,
@Nullable QueueCoordinator queue
) {
return delegate.setCuboids(
area, regions, blocks, minY, maxY,
Objects.requireNonNullElseGet(queue, area::getQueue).getCompleteTask()
);
return delegate.setCuboids(area, regions, blocks, minY, maxY, queue.getCompleteTask());
}
@Override
@ -77,9 +76,9 @@ public class FaweRegionManager extends BukkitRegionManager {
@Override
public boolean handleClear(
@NonNull Plot plot,
@NotNull Plot plot,
@Nullable Runnable whenDone,
@NonNull PlotManager manager,
@NotNull PlotManager manager,
final @Nullable PlotPlayer<?> player
) {
if (!Settings.FAWE_Components.CLEAR || !(manager instanceof HybridPlotManager)) {
@ -99,6 +98,11 @@ public class FaweRegionManager extends BukkitRegionManager {
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
public void setBiome(CuboidRegion region, int extendBiome, BiomeType biome, PlotArea area, Runnable whenDone) {
delegate.setBiome(region, extendBiome, biome, area.getWorldName(), whenDone);
@ -116,7 +120,7 @@ public class FaweRegionManager extends BukkitRegionManager {
}
@Override
public boolean regenerateRegion(final @NotNull Location pos1, final @NotNull Location pos2, boolean ignore, final Runnable whenDone) {
public boolean regenerateRegion(final Location pos1, final Location pos2, boolean ignore, final Runnable whenDone) {
return delegate.regenerateRegion(pos1, pos2, ignore, whenDone);
}

View File

@ -29,7 +29,7 @@ import com.plotsquared.core.util.SchematicHandler;
import com.plotsquared.core.util.WorldUtil;
import com.plotsquared.core.util.task.RunnableVal;
import com.sk89q.jnbt.CompoundTag;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull;
import java.io.InputStream;
import java.net.URL;
@ -40,7 +40,7 @@ public class FaweSchematicHandler extends SchematicHandler {
private final FaweDelegateSchematicHandler delegate = new FaweDelegateSchematicHandler();
@Inject
public FaweSchematicHandler(WorldUtil worldUtil, ProgressSubscriberFactory subscriberFactory) {
public FaweSchematicHandler(@NotNull WorldUtil worldUtil, @NotNull ProgressSubscriberFactory subscriberFactory) {
super(worldUtil, subscriberFactory);
}
@ -75,8 +75,9 @@ public class FaweSchematicHandler extends SchematicHandler {
}
@Override
public Schematic getSchematic(@NonNull InputStream is) {
public Schematic getSchematic(@NotNull InputStream is) {
return delegate.getSchematic(is);
}
}

View File

@ -111,8 +111,8 @@ public class SQLiteUUIDService implements UUIDService, Consumer<List<UUIDMapping
try (final PreparedStatement statement = getConnection()
.prepareStatement("INSERT OR REPLACE INTO `usercache` (`uuid`, `username`) VALUES(?, ?)")) {
for (final UUIDMapping mapping : uuidWrappers) {
statement.setString(1, mapping.uuid().toString());
statement.setString(2, mapping.username());
statement.setString(1, mapping.getUuid().toString());
statement.setString(2, mapping.getUsername());
statement.executeUpdate();
}
} catch (SQLException e) {

View File

@ -4,16 +4,16 @@ api-version: "1.13"
version: "${version}"
load: STARTUP
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/
softdepend: [ Vault, PlaceholderAPI, Essentials, LuckPerms, BungeePerms, MVdWPlaceholderAPI ]
loadbefore: [ MultiWorld, Multiverse-Core ]
depend: [ WorldEdit ]
softdepend: [Vault, PlaceholderAPI, Essentials, LuckPerms, BungeePerms, MVdWPlaceholderAPI]
loadbefore: [MultiWorld, Multiverse-Core]
depend: [WorldEdit]
database: false
commands:
plots:
description: Plot command.
aliases: [ p,plot,ps,plotsquared,p2,2,plotme ]
aliases: [p,plot,ps,plotsquared,p2,2,plotme]
permission: plots.use
permission-message: "You are lacking the permission node 'plots.use'"
permissions:

76
CODE_OF_CONDUCT.md Normal file
View File

@ -0,0 +1,76 @@
# 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

View File

@ -2,18 +2,18 @@ import java.time.format.DateTimeFormatter
dependencies {
// Expected everywhere.
compileOnlyApi(libs.checkerqual)
compileOnlyApi("org.checkerframework:checker-qual")
// Minecraft expectations
compileOnlyApi(libs.gson)
compileOnly(libs.guava)
compileOnlyApi("com.google.code.gson:gson")
compileOnly("com.google.guava:guava")
// Platform expectations
compileOnlyApi(libs.snakeyaml)
compileOnlyApi("org.yaml:snakeyaml")
// Adventure
api(libs.adventureApi)
api(libs.adventureMiniMessage)
api("net.kyori:adventure-api")
api("net.kyori:adventure-text-minimessage")
// Guice
api(libs.guice) {
@ -31,19 +31,19 @@ dependencies {
exclude(group = "dummypermscompat")
}
testImplementation(libs.worldeditCore)
compileOnly(libs.faweBukkit) { isTransitive = false }
testImplementation(libs.faweCore) { isTransitive = false }
compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Core") { isTransitive = false }
testImplementation("com.fastasyncworldedit:FastAsyncWorldEdit-Core") { isTransitive = false }
// Logging
compileOnlyApi(libs.log4j)
compileOnlyApi("org.apache.logging.log4j:log4j-api")
// Other libraries
api(libs.prtree)
api(libs.aopalliance)
api(libs.cloudServices)
api(libs.arkitektonika)
api(libs.paster)
api(libs.informativeAnnotations)
api("com.intellectualsites.paster:Paster")
api("com.intellectualsites.informative-annotations:informative-annotations")
}
tasks.processResources {
@ -57,26 +57,20 @@ tasks.processResources {
doLast {
copy {
from(layout.buildDirectory.file("$rootDir/LICENSE"))
into(layout.buildDirectory.dir("resources/main"))
from(File("$rootDir/LICENSE"))
into("$buildDir/resources/main/")
}
}
}
tasks {
withType<Javadoc> {
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
val opt = options as StandardJavadocDocletOptions
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString())
opt.links("https://jd.advntr.dev/api/4.14.0/")
opt.links("https://jd.advntr.dev/text-minimessage/4.14.0/")
opt.links("https://jd.adventure.kyori.net/api/4.9.3/")
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
// opt.links("https://checkerframework.org/api/")
opt.isLinkSource = true
opt.bottom(File("$rootDir/javadocfooter.html").readText())
opt.isUse = true
opt.links("https://checkerframework.org/api/")
opt.links("https://javadoc.io/doc/com.intellectualsites.informative-annotations/informative-annotations/latest/")
opt.encoding("UTF-8")
opt.keyWords()
opt.addStringOption("-since", isRelease)
}
}

View File

@ -30,7 +30,7 @@ import com.plotsquared.core.util.ChunkManager;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.SchematicHandler;
import com.plotsquared.core.util.query.PlotQuery;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
@ -145,7 +145,7 @@ public class PlotAPI {
*/
public void sendConsoleMessage(
final @NonNull String message,
final @NonNull TagResolver @NonNull ... replacements
final @NonNull Template @NonNull ... replacements
) {
ConsolePlayer.getConsole().sendMessage(StaticCaption.of(message), replacements);
}
@ -158,7 +158,7 @@ public class PlotAPI {
*/
public void sendConsoleMessage(
final @NonNull Caption caption,
final @NonNull TagResolver @NonNull ... replacements
final @NonNull Template @NonNull ... replacements
) {
ConsolePlayer.getConsole().sendMessage(caption, replacements);
}

View File

@ -289,7 +289,7 @@ public interface PlotPlatform<P> extends LocaleHolder {
* Get the {@link ExpireManager} implementation for the platform
*
* @return Expire manager
* @since 6.10.2
* @since TODO
*/
default @NonNull ExpireManager expireManager() {
return injector().getInstance(ExpireManager.class);

View File

@ -84,7 +84,7 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.URI;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Files;
@ -210,10 +210,9 @@ public class PlotSquared {
try {
URL logurl = PlotSquared.class.getProtectionDomain().getCodeSource().getLocation();
this.jarFile = new File(
URI.create(
logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file"))
.getPath());
} catch (URISyntaxException | SecurityException e) {
new URL(logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file"))
.toURI().getPath());
} catch (MalformedURLException | URISyntaxException | SecurityException e) {
e.printStackTrace();
this.jarFile = new File(this.platform.getDirectory().getParentFile(), "PlotSquared.jar");
if (!this.jarFile.exists()) {
@ -271,11 +270,7 @@ public class PlotSquared {
captionMap = this.captionLoader.loadAll(this.platform.getDirectory().toPath().resolve("lang"));
} else {
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);
LOGGER.info(
@ -795,9 +790,7 @@ public class PlotSquared {
if (world.equals("CheckingPlotSquaredGenerator")) {
return;
}
if (!this.getPlotAreaManager().addWorld(world)) {
return;
}
this.getPlotAreaManager().addWorld(world);
Set<String> worlds;
if (this.worldConfiguration.contains("worlds")) {
worlds = this.worldConfiguration.getConfigurationSection("worlds").getKeys(false);
@ -1016,7 +1009,7 @@ public class PlotSquared {
/**
* Setup the configuration for a plot world based on world arguments.
* <p>
*
*
* <i>e.g. /mv create &lt;world&gt; normal -g PlotSquared:&lt;args&gt;</i>
*
@ -1282,7 +1275,7 @@ public class PlotSquared {
}
/**
* Set up the database connection.
* Setup the database connection.
*/
public void setupDatabase() {
try {

View File

@ -200,7 +200,7 @@ public class PlayerBackupProfile implements BackupProfile {
if (value) {
future.complete(null);
} else {
future.completeExceptionally(new RuntimeException(MINI_MESSAGE.escapeTags(
future.completeExceptionally(new RuntimeException(MINI_MESSAGE.stripTokens(
TranslatableCaption
.of("schematics.schematic_paste_failed")
.getComponent(ConsolePlayer.getConsole()))));

View File

@ -24,14 +24,13 @@ import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.Templates;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.inject.factory.PlayerBackupProfileFactory;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.util.task.TaskManager;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
@ -101,7 +100,7 @@ public class SimpleBackupManager implements BackupManager {
if (player != null) {
player.sendMessage(
TranslatableCaption.of("backups.backup_automatic_started"),
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
Template.of("plot", plot.getId().toString())
);
}
profile.createBackup().whenComplete((backup, throwable) -> {
@ -109,7 +108,7 @@ public class SimpleBackupManager implements BackupManager {
if (player != null) {
player.sendMessage(
TranslatableCaption.of("backups.backup_automatic_failure"),
TagResolver.resolver("reason", Tag.inserting(Component.text(throwable.getMessage())))
Templates.of("reason", throwable.getMessage())
);
}
throwable.printStackTrace();
@ -136,9 +135,13 @@ public class SimpleBackupManager implements BackupManager {
return this.backupLimit;
}
private record PlotCacheKey(
Plot plot
) {
private static final class PlotCacheKey {
private final Plot plot;
private PlotCacheKey(Plot plot) {
this.plot = plot;
}
@Override
public boolean equals(final Object o) {

View File

@ -19,7 +19,6 @@
package com.plotsquared.core.command;
import com.google.inject.Inject;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc;
@ -27,13 +26,12 @@ import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PlayerManager;
import com.plotsquared.core.util.TabCompletions;
import com.plotsquared.core.util.task.RunnableVal2;
import com.plotsquared.core.util.task.RunnableVal3;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.Collection;
@ -60,21 +58,19 @@ public class Add extends Command {
@Override
public CompletableFuture<Boolean> execute(
final PlotPlayer<?> player,
String[] args,
final PlotPlayer<?> player, String[] args,
RunnableVal3<Command, Runnable, Runnable> confirm,
RunnableVal2<Command, CommandResult> whenDone
) throws CommandException {
final Plot plot = check(player.getCurrentPlot(), TranslatableCaption.of("errors.not_in_plot"));
checkTrue(plot.hasOwner(), TranslatableCaption.of("info.plot_unowned"));
checkTrue(
plot.isOwner(player.getUUID()) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_TRUST),
plot.isOwner(player.getUUID()) || Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_TRUST),
TranslatableCaption.of("permission.no_plot_perms")
);
checkTrue(
args.length == 1,
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot add <player | *>")))
checkTrue(args.length == 1, TranslatableCaption.of("commandconfig.command_syntax"),
Template.of("value", "/plot add <player | *>")
);
final CompletableFuture<Boolean> future = new CompletableFuture<>();
PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> {
@ -84,7 +80,7 @@ public class Add extends Command {
} else {
player.sendMessage(
TranslatableCaption.of("errors.invalid_player"),
TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
Template.of("value", args[0])
);
}
future.completeExceptionally(throwable);
@ -92,24 +88,18 @@ public class Add extends Command {
} else {
try {
checkTrue(!uuids.isEmpty(), TranslatableCaption.of("errors.invalid_player"),
TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
Template.of("value", args[0])
);
Iterator<UUID> iterator = uuids.iterator();
int size = plot.getTrusted().size() + plot.getMembers().size();
while (iterator.hasNext()) {
UUID uuid = iterator.next();
if (uuid == DBFunc.EVERYONE && !(player.hasPermission(Permission.PERMISSION_TRUST_EVERYONE) || player.hasPermission(
Permission.PERMISSION_ADMIN_COMMAND_TRUST))) {
if (uuid == DBFunc.EVERYONE && !(
Permissions.hasPermission(player, Permission.PERMISSION_TRUST_EVERYONE) || Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_TRUST))) {
player.sendMessage(
TranslatableCaption.of("errors.invalid_player"),
PlotSquared
.platform()
.playerManager()
.getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"value",
Tag.inserting(caption.toComponent(player))
))
Template.of("value", PlayerManager.resolveName(uuid).getComponent(player))
);
iterator.remove();
continue;
@ -117,11 +107,7 @@ public class Add extends Command {
if (plot.isOwner(uuid)) {
player.sendMessage(
TranslatableCaption.of("member.already_added"),
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"player",
Tag.inserting(caption.toComponent(player))
))
Template.of("player", PlayerManager.resolveName(uuid).getComponent(player))
);
iterator.remove();
continue;
@ -129,11 +115,7 @@ public class Add extends Command {
if (plot.getMembers().contains(uuid)) {
player.sendMessage(
TranslatableCaption.of("member.already_added"),
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"player",
Tag.inserting(caption.toComponent(player))
))
Template.of("player", PlayerManager.resolveName(uuid).getComponent(player))
);
iterator.remove();
continue;
@ -142,11 +124,11 @@ public class Add extends Command {
}
checkTrue(!uuids.isEmpty(), null);
int localAddSize = plot.getMembers().size();
int maxAddSize = player.hasPermissionRange(Permission.PERMISSION_ADD, Settings.Limit.MAX_PLOTS);
int maxAddSize = Permissions.hasPermissionRange(player, Permission.PERMISSION_ADD, Settings.Limit.MAX_PLOTS);
if (localAddSize >= maxAddSize) {
player.sendMessage(
TranslatableCaption.of("members.plot_max_members_added"),
TagResolver.resolver("amount", Tag.inserting(Component.text(localAddSize)))
Template.of("amount", String.valueOf(localAddSize))
);
return;
}

View File

@ -26,10 +26,9 @@ import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.query.PlotQuery;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import java.util.ArrayList;
import java.util.Collection;
@ -93,10 +92,7 @@ public class Alias extends SubCommand {
} else {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ALIAS_SET)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ALIAS_SET))
);
}
}
@ -112,10 +108,7 @@ public class Alias extends SubCommand {
} else {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ALIAS_REMOVE)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ALIAS_REMOVE))
);
}
}
@ -156,16 +149,13 @@ public class Alias extends SubCommand {
.anyMatch()) {
player.sendMessage(
TranslatableCaption.of("alias.alias_is_taken"),
TagResolver.resolver("alias", Tag.inserting(Component.text(alias)))
Template.of("alias", alias)
);
return;
}
if (Settings.UUID.OFFLINE) {
plot.setAlias(alias);
player.sendMessage(
TranslatableCaption.of("alias.alias_set_to"),
TagResolver.resolver("alias", Tag.inserting(Component.text(alias)))
);
player.sendMessage(TranslatableCaption.of("alias.alias_set_to"), Template.of("alias", alias));
return;
}
PlotSquared.get().getImpromptuUUIDPipeline().getSingle(alias, ((uuid, throwable) -> {
@ -174,13 +164,13 @@ public class Alias extends SubCommand {
} else if (uuid != null) {
player.sendMessage(
TranslatableCaption.of("alias.alias_is_taken"),
TagResolver.resolver("alias", Tag.inserting(Component.text(alias)))
Template.of("alias", alias)
);
} else {
plot.setAlias(alias);
player.sendMessage(
TranslatableCaption.of("alias.alias_set_to"),
TagResolver.resolver("alias", Tag.inserting(Component.text(alias)))
Template.of("alias", alias)
);
}
}));
@ -192,7 +182,7 @@ public class Alias extends SubCommand {
if (!plot.getAlias().isEmpty()) {
player.sendMessage(
TranslatableCaption.of("alias.alias_removed"),
TagResolver.resolver("alias", Tag.inserting(Component.text(alias)))
Template.of("alias", alias)
);
} else {
player.sendMessage(
@ -204,7 +194,7 @@ public class Alias extends SubCommand {
}
private boolean isPermitted(PlotPlayer<?> player, Permission permission) {
return player.hasPermission(permission);
return Permissions.hasPermission(player, permission);
}
}

View File

@ -24,6 +24,7 @@ import com.plotsquared.core.configuration.ConfigurationSection;
import com.plotsquared.core.configuration.ConfigurationUtil;
import com.plotsquared.core.configuration.Settings;
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.file.YamlConfiguration;
import com.plotsquared.core.events.TeleportCause;
@ -47,6 +48,7 @@ import com.plotsquared.core.queue.QueueCoordinator;
import com.plotsquared.core.setup.PlotAreaBuilder;
import com.plotsquared.core.util.FileUtils;
import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.RegionUtil;
import com.plotsquared.core.util.SchematicHandler;
import com.plotsquared.core.util.SetupUtils;
@ -55,7 +57,6 @@ import com.plotsquared.core.util.TabCompletions;
import com.plotsquared.core.util.WorldUtil;
import com.plotsquared.core.util.task.RunnableVal3;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.EditSessionBuilder;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.entity.Player;
@ -68,9 +69,7 @@ import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.world.World;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.io.File;
@ -139,20 +138,17 @@ public class Area extends SubCommand {
player.sendMessage(RequiredType.CONSOLE.getErrorMessage());
return false;
}
if (!player.hasPermission(Permission.PERMISSION_AREA_CREATE)) {
if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_CREATE)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_AREA_CREATE)
)
Template.of("node", String.valueOf(Permission.PERMISSION_AREA_CREATE))
);
return false;
}
if (args.length < 2) {
player.sendMessage(
TranslatableCaption.of("single.single_area_needs_name"),
TagResolver.resolver("command", Tag.inserting(Component.text("/plot area single <name>")))
Template.of("command", "/plot area single <name>")
);
return false;
}
@ -233,9 +229,10 @@ public class Area extends SubCommand {
try (final ClipboardWriter clipboardWriter = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(new FileOutputStream(
file))) {
final BlockArrayClipboard clipboard = new BlockArrayClipboard(selectedRegion);
EditSessionBuilder editSessionBuilder = WorldEdit.getInstance().newEditSessionBuilder();
editSessionBuilder.world(selectedRegion.getWorld());
final EditSession editSession = editSessionBuilder.build();
final EditSession editSession = WorldEdit
.getInstance()
.getEditSessionFactory()
.getEditSession(selectedRegion.getWorld(), -1);
final ForwardExtentCopy forwardExtentCopy =
new ForwardExtentCopy(editSession, selectedRegion, clipboard, selectedRegion.getMinimumPoint());
forwardExtentCopy.setCopyingBiomes(true);
@ -283,7 +280,7 @@ public class Area extends SubCommand {
} else {
player.sendMessage(
TranslatableCaption.of("errors.error_create"),
TagResolver.resolver("world", Tag.inserting(Component.text(hybridPlotWorld.getWorldName())))
Template.of("world", hybridPlotWorld.getWorldName())
);
}
};
@ -291,13 +288,10 @@ public class Area extends SubCommand {
return true;
}
case "c", "setup", "create" -> {
if (!player.hasPermission(Permission.PERMISSION_AREA_CREATE)) {
if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_CREATE)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_AREA_CREATE)
)
Template.of("node", String.valueOf(Permission.PERMISSION_AREA_CREATE))
);
return false;
}
@ -305,10 +299,7 @@ public class Area extends SubCommand {
case 1:
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text("/plot area create [world[:id]] [<modifier>=<value>]..."))
)
Templates.of("value", "/plot area create [world[:id]] [<modifier>=<value>]...")
);
return false;
case 2:
@ -322,11 +313,7 @@ public class Area extends SubCommand {
if (area == null) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text(
"/plot area create [world[:id]] [<modifier>=<value>]..."))
)
Templates.of("value", "/plot area create [world[:id]] [<modifier>=<value>]...")
);
return false;
}
@ -337,18 +324,12 @@ public class Area extends SubCommand {
);
player.sendMessage(
TranslatableCaption.of("set.set_attribute"),
TagResolver.builder()
.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()
Template.of("attribute", "area_pos1"),
Template.of("value", location.getX() + "," + location.getZ())
);
player.sendMessage(
TranslatableCaption.of("area.set_pos2"),
TagResolver.resolver("command", Tag.inserting(Component.text("/plot area create pos2")))
Template.of("command", "/plot area create pos2")
);
return true;
}
@ -362,11 +343,7 @@ public class Area extends SubCommand {
if (area == null) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text(
"/plot area create [world[:id]] [<modifier>=<value>]..."))
)
Templates.of("value", "/plot area create [world[:id]] [<modifier>=<value>]...")
);
return false;
}
@ -393,10 +370,7 @@ public class Area extends SubCommand {
if (!areas.isEmpty()) {
player.sendMessage(
TranslatableCaption.of("cluster.cluster_intersection"),
TagResolver.resolver(
"cluster",
Tag.inserting(areas.iterator().next())
)
Template.of("cluster", areas.iterator().next().toString())
);
return false;
}
@ -422,7 +396,8 @@ public class Area extends SubCommand {
player.sendMessage(TranslatableCaption.of("setup.setup_finished"));
if (area.getTerrain() != PlotAreaTerrainType.ALL) {
QueueCoordinator queue = blockQueue.getNewQueue(worldUtil.getWeWorld(world));
queue.setChunkConsumer(chunk -> AugmentedUtils.generateChunk(
queue.setChunkConsumer(chunk -> AugmentedUtils.generate(
null,
world,
chunk.getX(),
chunk.getZ(),
@ -434,7 +409,7 @@ public class Area extends SubCommand {
} else {
player.sendMessage(
TranslatableCaption.of("errors.error_create"),
TagResolver.resolver("world", Tag.inserting(Component.text(area.getWorldName())))
Template.of("world", area.getWorldName())
);
}
};
@ -468,7 +443,7 @@ public class Area extends SubCommand {
if (other != null && Objects.equals(pa.getId(), other.getId())) {
player.sendMessage(
TranslatableCaption.of("setup.setup_world_taken"),
TagResolver.resolver("value", Tag.inserting(Component.text(pa.getId())))
Template.of("value", pa.toString())
);
return false;
}
@ -483,13 +458,8 @@ public class Area extends SubCommand {
if (pair.length != 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax_extended"),
TagResolver.builder()
.tag("value1", Tag.inserting(Component.text(getCommandString())))
.tag(
"value2",
Tag.inserting(Component.text("create [world[:id]] [<modifier>=<value>]..."))
)
.build()
Template.of("value1,", getCommandString()),
Template.of("value2", " create [world[:id]] [<modifier>=<value>]...")
);
return false;
}
@ -525,14 +495,8 @@ public class Area extends SubCommand {
default -> {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax_extended"),
TagResolver.builder()
.tag("value1", Tag.inserting(Component.text(getCommandString())))
.tag(
"value2",
Tag.inserting(Component.text(
" create [world[:id]] [<modifier>=<value>]..."))
)
.build()
Template.of("value1", getCommandString()),
Template.of("value2", " create [world[:id]] [<modifier>=<value>]...")
);
return false;
}
@ -542,7 +506,7 @@ public class Area extends SubCommand {
if (this.worldUtil.isWorld(pa.getWorldName())) {
player.sendMessage(
TranslatableCaption.of("setup.setup_world_taken"),
TagResolver.resolver("value", Tag.inserting(Component.text(pa.getWorldName())))
Template.of("value", pa.getWorldName())
);
return false;
}
@ -563,7 +527,7 @@ public class Area extends SubCommand {
} else {
player.sendMessage(
TranslatableCaption.of("errors.error_create"),
TagResolver.resolver("world", Tag.inserting(Component.text(pa.getWorldName())))
Template.of("world", pa.getWorldName())
);
}
try {
@ -582,18 +546,12 @@ public class Area extends SubCommand {
if (pa.getId() == null) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text(getUsage())))
Template.of("value", getUsage())
);
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax_extended"),
TagResolver.builder()
.tag("value1", Tag.inserting(Component.text(getCommandString())))
.tag(
"value2",
Tag.inserting(Component.text(
" create [world[:id]] [<modifier>=<value>]..."))
)
.build()
Template.of("value1", getCommandString()),
Template.of("value2", " create [world[:id]] [<modifier>=<value>]...")
);
return false;
}
@ -610,20 +568,17 @@ public class Area extends SubCommand {
metaData.computeIfAbsent(player.getUUID(), missingUUID -> new HashMap<>()).put("area_create_area", pa);
player.sendMessage(
TranslatableCaption.of("single.get_position"),
TagResolver.resolver("command", Tag.inserting(Component.text(getCommandString())))
Template.of("command", getCommandString())
);
break;
}
return true;
}
case "i", "info" -> {
if (!player.hasPermission(Permission.PERMISSION_AREA_INFO)) {
if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_INFO)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_AREA_INFO)
)
Template.of("node", String.valueOf(Permission.PERMISSION_AREA_INFO))
);
return false;
}
@ -634,20 +589,15 @@ public class Area extends SubCommand {
default -> {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax_extended"),
TagResolver.builder()
.tag("value1", Tag.inserting(Component.text(getCommandString())))
.tag("value2", Tag.inserting(Component.text(" info [area]")))
.build()
Template.of("value1", getCommandString()),
Template.of("value2", " info [area]")
);
return false;
}
}
if (area == null) {
if (args.length == 2) {
player.sendMessage(
TranslatableCaption.of("errors.not_valid_plot_world"),
TagResolver.resolver("value", Tag.inserting(Component.text(args[1])))
);
player.sendMessage(TranslatableCaption.of("errors.not_valid_plot_world"), Template.of("value", args[1]));
} else {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
}
@ -671,35 +621,42 @@ public class Area extends SubCommand {
percent = claimed == 0 ? 0 : 100d * claimed / Integer.MAX_VALUE;
region = "N/A";
}
TagResolver resolver = TagResolver.builder()
.tag(
"header",
Tag.inserting(TranslatableCaption.of("info.plot_info_header").toComponent(player))
)
.tag("name", Tag.inserting(Component.text(name)))
.tag("type", Tag.inserting(Component.text(area.getType().name())))
.tag("terrain", Tag.inserting(Component.text(area.getTerrain().name())))
.tag("usage", Tag.inserting(Component.text(String.format("%.2f", percent))))
.tag("claimed", Tag.inserting(Component.text(claimed)))
.tag("clusters", Tag.inserting(Component.text(clusters)))
.tag("region", Tag.inserting(Component.text(region)))
.tag("generator", Tag.inserting(Component.text(generator)))
.tag(
"footer",
Tag.inserting(TranslatableCaption.of("info.plot_info_footer").toComponent(player))
)
.build();
player.sendMessage(TranslatableCaption.of("info.area_info_format"), resolver);
Template headerTemplate = Template.of(
"header",
TranslatableCaption.of("info.plot_info_header").getComponent(player)
);
Template nameTemplate = Template.of("name", name);
Template typeTemplate = Template.of("type", area.getType().name());
Template terrainTemplate = Template.of("terrain", area.getTerrain().name());
Template usageTemplate = Template.of("usage", String.format("%.2f", percent));
Template claimedTemplate = Template.of("claimed", String.valueOf(claimed));
Template clustersTemplate = Template.of("clusters", String.valueOf(clusters));
Template regionTemplate = Template.of("region", region);
Template generatorTemplate = Template.of("generator", generator);
Template footerTemplate = Template.of(
"footer",
TranslatableCaption.of("info.plot_info_footer").getComponent(player)
);
player.sendMessage(
TranslatableCaption.of("info.area_info_format"),
headerTemplate,
nameTemplate,
typeTemplate,
terrainTemplate,
usageTemplate,
claimedTemplate,
clustersTemplate,
regionTemplate,
generatorTemplate,
footerTemplate
);
return true;
}
case "l", "list" -> {
if (!player.hasPermission(Permission.PERMISSION_AREA_LIST)) {
if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_LIST)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_AREA_LIST)
)
Template.of("node", String.valueOf(Permission.PERMISSION_AREA_LIST))
);
return false;
}
@ -716,10 +673,8 @@ public class Area extends SubCommand {
default:
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax_extended"),
TagResolver.builder()
.tag("value1", Tag.inserting(Component.text(getCommandString())))
.tag("value2", Tag.inserting(Component.text(" list [#]")))
.build()
Template.of("value1", getCommandString()),
Template.of("value2", " list [#]")
);
return false;
}
@ -745,39 +700,46 @@ public class Area extends SubCommand {
percent = claimed == 0 ? 0 : (double) claimed / Short.MAX_VALUE * Short.MAX_VALUE;
region = "N/A";
}
Component tooltip = MINI_MESSAGE.deserialize(
TranslatableCaption.of("info.area_list_tooltip").getComponent(player),
TagResolver.builder()
.tag("claimed", Tag.inserting(Component.text(claimed)))
.tag("usage", Tag.inserting(Component.text(String.format("%.2f", percent) + "%")))
.tag("clusters", Tag.inserting(Component.text(clusters)))
.tag("region", Tag.inserting(Component.text(region)))
.tag("generator", Tag.inserting(Component.text(generator)))
.build()
);
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();
Template claimedTemplate = Template.of("claimed", String.valueOf(claimed));
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),
claimedTemplate,
usageTemplate,
clustersTemplate,
regionTemplate,
generatorTemplate
));
Template tooltipTemplate = Template.of("hover_info", tooltip);
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.setTagResolvers(resolver);
caption.setTemplates(
tooltipTemplate,
visitcmdTemplate,
numberTemplate,
nameTemplate,
typeTemplate,
terrainTemplate,
infocmdTemplate
);
}
}, "/plot area list", TranslatableCaption.of("list.area_list_header_paged"));
return true;
}
case "regen", "clear", "reset", "regenerate" -> {
if (!player.hasPermission(Permission.PERMISSION_AREA_REGEN)) {
if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_REGEN)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_AREA_REGEN)
)
Template.of("node", String.valueOf(Permission.PERMISSION_AREA_REGEN))
);
return false;
}
@ -789,12 +751,13 @@ public class Area extends SubCommand {
if (area.getType() != PlotAreaType.PARTIAL) {
player.sendMessage(
TranslatableCaption.of("single.delete_world_region"),
TagResolver.resolver("world", Tag.inserting(Component.text(area.getWorldName())))
Template.of("world", area.getWorldName())
);
return false;
}
QueueCoordinator queue = blockQueue.getNewQueue(worldUtil.getWeWorld(area.getWorldName()));
queue.setChunkConsumer(chunk -> AugmentedUtils.generateChunk(
queue.setChunkConsumer(chunk -> AugmentedUtils.generate(
null,
area.getWorldName(),
chunk.getX(),
chunk.getZ(),
@ -806,26 +769,23 @@ public class Area extends SubCommand {
return true;
}
case "goto", "v", "teleport", "visit", "tp" -> {
if (!player.hasPermission(Permission.PERMISSION_AREA_TP)) {
if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_TP)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_AREA_TP))
Template.of("node", String.valueOf(Permission.PERMISSION_AREA_TP))
);
return false;
}
if (args.length != 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot area tp [area]")))
Template.of("value", "/plot area tp [area]")
);
return false;
}
PlotArea area = this.plotAreaManager.getPlotAreaByString(args[1]);
if (area == null) {
player.sendMessage(
TranslatableCaption.of("errors.not_valid_plot_world"),
TagResolver.resolver("value", Tag.inserting(Component.text(args[1])))
);
player.sendMessage(TranslatableCaption.of("errors.not_valid_plot_world"), Template.of("value", args[1]));
return false;
}
Location center;
@ -865,19 +825,19 @@ public class Area extends SubCommand {
public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
if (args.length == 1) {
final List<String> completions = new LinkedList<>();
if (player.hasPermission(Permission.PERMISSION_AREA_CREATE)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_CREATE)) {
completions.add("create");
}
if (player.hasPermission(Permission.PERMISSION_AREA_CREATE)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_CREATE)) {
completions.add("single");
}
if (player.hasPermission(Permission.PERMISSION_AREA_LIST)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_LIST)) {
completions.add("list");
}
if (player.hasPermission(Permission.PERMISSION_AREA_INFO)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_INFO)) {
completions.add("info");
}
if (player.hasPermission(Permission.PERMISSION_AREA_TP)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_TP)) {
completions.add("tp");
}
final List<Command> commands = completions.stream().filter(completion -> completion
@ -892,7 +852,7 @@ public class Area extends SubCommand {
CommandCategory.ADMINISTRATION
) {
}).collect(Collectors.toCollection(LinkedList::new));
if (player.hasPermission(Permission.PERMISSION_AREA) && args[0].length() > 0) {
if (Permissions.hasPermission(player, Permission.PERMISSION_AREA) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
}
return commands;

View File

@ -35,18 +35,16 @@ import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea;
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.util.EconHandler;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PlotExpression;
import com.plotsquared.core.util.task.AutoClaimFinishTask;
import com.plotsquared.core.util.task.RunnableVal;
import com.plotsquared.core.util.task.TaskManager;
import io.leangen.geantyref.TypeToken;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
@ -112,13 +110,13 @@ public class Auto extends SubCommand {
if (diff < 0 && grantedPlots < sizeX * sizeZ) {
player.sendMessage(
TranslatableCaption.of("permission.cant_claim_more_plots"),
TagResolver.resolver("amount", Tag.inserting(Component.text(diff + grantedPlots)))
Template.of("amount", String.valueOf(diff + grantedPlots))
);
return false;
} else if (diff >= 0 && grantedPlots + diff < sizeX * sizeZ) {
player.sendMessage(
TranslatableCaption.of("permission.cant_claim_more_plots"),
TagResolver.resolver("amount", Tag.inserting(Component.text(diff + grantedPlots)))
Template.of("amount", String.valueOf(diff + grantedPlots))
);
return false;
} else {
@ -130,16 +128,15 @@ public class Auto extends SubCommand {
}
player.sendMessage(
TranslatableCaption.of("economy.removed_granted_plot"),
TagResolver.builder()
.tag("used_grants", Tag.inserting(Component.text(grantedPlots - left)))
.tag("remaining_grants", Tag.inserting(Component.text(left)))
.build()
Template.of("usedGrants", String.valueOf(grantedPlots - left)),
Template.of("remainingGrants", String.valueOf(left))
);
}
} else {
player.sendMessage(
TranslatableCaption.of("permission.cant_claim_more_plots"),
TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))
Template.of("amount", String.valueOf(player.getAllowedPlots())
)
);
return false;
}
@ -218,7 +215,7 @@ public class Auto extends SubCommand {
} else {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text(getUsage())))
Template.of("value", getUsage())
);
return true;
}
@ -241,7 +238,7 @@ public class Auto extends SubCommand {
if (event.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Auto claim")))
Template.of("value", "Auto claim")
);
return true;
}
@ -249,17 +246,17 @@ public class Auto extends SubCommand {
sizeX = event.getSizeX();
sizeZ = event.getSizeZ();
schematic = event.getSchematic();
if (!force && mega && !player.hasPermission(Permission.PERMISSION_AUTO_MEGA)) {
if (!force && mega && !Permissions.hasPermission(player, Permission.PERMISSION_AUTO_MEGA)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_AUTO_MEGA))
Template.of("node", String.valueOf(Permission.PERMISSION_AUTO_MEGA))
);
return false;
}
if (!force && sizeX * sizeZ > Settings.Claim.MAX_AUTO_AREA) {
player.sendMessage(
TranslatableCaption.of("permission.cant_claim_more_plots_num"),
TagResolver.resolver("amount", Tag.inserting(Component.text(Settings.Claim.MAX_AUTO_AREA)))
Template.of("amount", String.valueOf(Settings.Claim.MAX_AUTO_AREA))
);
return false;
}
@ -277,32 +274,29 @@ public class Auto extends SubCommand {
if (!plotarea.hasSchematic(schematic)) {
player.sendMessage(
TranslatableCaption.of("schematics.schematic_invalid_named"),
TagResolver.builder()
.tag("schemname", Tag.inserting(Component.text(schematic)))
.tag("reason", Tag.inserting(Component.text("non-existent")))
.build()
Template.of("schemname", schematic),
Template.of("reason", "non-existent")
);
return true;
}
if (!force && !player.hasPermission(
if (!force && !Permissions.hasPermission(
player,
Permission.PERMISSION_CLAIM_SCHEMATIC.format(schematic)
) && !player.hasPermission("plots.admin.command.schematic")) {
) && !Permissions
.hasPermission(player, "plots.admin.command.schematic")) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver("node", Tag.inserting(Component.text("plots.claim.%s0")))
Template.of("node", "plots.claim.%s0")
);
return true;
}
}
if (this.econHandler != null && plotarea.useEconomy() && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
if (this.econHandler != null && plotarea.useEconomy()) {
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 ?
player.getPlotCount() :
player.getPlotCount(plotarea.getWorldName()));
cost = size * cost + mergeCost;
cost = (sizeX * sizeZ) * cost;
if (cost > 0d) {
if (!this.econHandler.isSupported()) {
player.sendMessage(TranslatableCaption.of("economy.vault_or_consumer_null"));
@ -311,26 +305,21 @@ public class Auto extends SubCommand {
if (!force && this.econHandler.getMoney(player) < cost) {
player.sendMessage(
TranslatableCaption.of("economy.cannot_afford_plot"),
TagResolver.builder()
.tag("money", Tag.inserting(Component.text(this.econHandler.format(cost))))
.tag(
"balance",
Tag.inserting(Component.text(this.econHandler.format(this.econHandler.getMoney(player))))
)
.build()
Template.of("money", this.econHandler.format(cost)),
Template.of("balance", this.econHandler.format(this.econHandler.getMoney(player)))
);
return false;
}
this.econHandler.withdrawMoney(player, cost);
player.sendMessage(
TranslatableCaption.of("economy.removed_balance"),
TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(cost))))
Template.of("money", this.econHandler.format(cost))
);
}
}
List<Plot> plots = this.servicePipeline
.pump(new AutoQuery(player, null, sizeX, sizeZ, plotarea))
.pump(new AutoService.AutoQuery(player, null, sizeX, sizeZ, plotarea))
.through(AutoService.class)
.getResult();
@ -358,7 +347,7 @@ public class Auto extends SubCommand {
if (!force && mergeEvent.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Auto merge")))
Template.of("value", "Auto merge")
);
return false;
}

View File

@ -27,11 +27,10 @@ import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer;
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.RunnableVal3;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.nio.file.Files;
@ -68,7 +67,7 @@ public final class Backup extends Command {
private static boolean sendMessage(PlotPlayer<?> player) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot backup <save | list | load>")))
Template.of("value", "/plot backup <save | list | load>")
);
return true;
}
@ -136,44 +135,34 @@ public final class Backup extends Command {
} else if (!plot.hasOwner()) {
player.sendMessage(
TranslatableCaption.of("backups.backup_impossible"),
TagResolver.resolver("plot", Tag.inserting(
TranslatableCaption.of("generic.generic_unowned").toComponent(player)
))
Template.of("plot", TranslatableCaption.of("generic.generic_unowned").getComponent(player))
);
} else if (plot.getVolume() > Integer.MAX_VALUE) {
player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large"));
} else if (plot.isMerged()) {
player.sendMessage(
TranslatableCaption.of("backups.backup_impossible"),
TagResolver.resolver("plot", Tag.inserting(
TranslatableCaption.of("generic.generic_merged").toComponent(player)
))
Template.of("plot", TranslatableCaption.of("generic.generic_merged").getComponent(player))
);
} else if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_BACKUP_OTHER)) {
} else if (!plot.isOwner(player.getUUID()) && !Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_BACKUP_OTHER)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BACKUP_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BACKUP_OTHER))
);
} else {
final BackupProfile backupProfile = Objects.requireNonNull(this.backupManager.getProfile(plot));
if (backupProfile instanceof NullBackupProfile) {
player.sendMessage(
TranslatableCaption.of("backups.backup_impossible"),
TagResolver.resolver(
"plot", Tag.inserting(TranslatableCaption
.of("generic.generic_other")
.toComponent(player))
)
Template.of("plot", TranslatableCaption.of("generic.generic_other").getComponent(player))
);
} else {
backupProfile.createBackup().whenComplete((backup, throwable) -> {
if (throwable != null) {
player.sendMessage(
TranslatableCaption.of("backups.backup_save_failed"),
TagResolver.resolver("reason", Tag.inserting(Component.text(throwable.getMessage())))
Template.of("reason", throwable.getMessage())
);
throwable.printStackTrace();
} else {
@ -200,64 +189,50 @@ public final class Backup extends Command {
} else if (!plot.hasOwner()) {
player.sendMessage(
TranslatableCaption.of("backups.backup_impossible"),
TagResolver.resolver("plot", Tag.inserting(
TranslatableCaption.of("generic.generic_unowned").toComponent(player)
))
Template.of("plot", TranslatableCaption.of("generic.generic_unowned").getComponent(player))
);
} else if (plot.isMerged()) {
player.sendMessage(
TranslatableCaption.of("backups.backup_impossible"),
TagResolver.resolver("plot", Tag.inserting(
TranslatableCaption.of("generic.generic_merged").toComponent(player)
))
Template.of("plot", TranslatableCaption.of("generic.generic_merged").getComponent(player))
);
} else if (plot.getVolume() > Integer.MAX_VALUE) {
player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large"));
} else if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_BACKUP_OTHER)) {
} else if (!plot.isOwner(player.getUUID()) && !Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_BACKUP_OTHER)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BACKUP_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BACKUP_OTHER))
);
} else {
final BackupProfile backupProfile = Objects.requireNonNull(this.backupManager.getProfile(plot));
if (backupProfile instanceof NullBackupProfile) {
player.sendMessage(
TranslatableCaption.of("backups.backup_impossible"),
TagResolver.resolver("plot", Tag.inserting(
TranslatableCaption.of("generic.generic_other").toComponent(player)
))
Template.of("plot", TranslatableCaption.of("generic.generic_other").getComponent(player))
);
} else {
backupProfile.listBackups().whenComplete((backups, throwable) -> {
if (throwable != null) {
player.sendMessage(
TranslatableCaption.of("backups.backup_list_failed"),
TagResolver.resolver("reason", Tag.inserting(Component.text(throwable.getMessage())))
Template.of("reason", throwable.getMessage())
);
throwable.printStackTrace();
} else {
player.sendMessage(
TranslatableCaption.of("backups.backup_list_header"),
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toCommaSeparatedString())))
Template.of("plot", plot.getId().toCommaSeparatedString())
);
try {
for (int i = 0; i < backups.size(); i++) {
player.sendMessage(
TranslatableCaption.of("backups.backup_list_entry"),
TagResolver.builder()
.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()),
ZoneId.systemDefault()
))))
)
.build()
Template.of("number", Integer.toString(i + 1)),
Template.of("value", DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.ofInstant(
Instant.ofEpochMilli(backups.get(i).getCreationTime()),
ZoneId.systemDefault()
)))
);
}
} catch (final Exception e) {
@ -285,31 +260,25 @@ public final class Backup extends Command {
} else if (!plot.hasOwner()) {
player.sendMessage(
TranslatableCaption.of("backups.backup_impossible"),
TagResolver.resolver("plot", Tag.inserting(
TranslatableCaption.of("generic.generic_unowned").toComponent(player)
))
Template.of("plot", TranslatableCaption.of("generic.generic_unowned").getComponent(player))
);
} else if (plot.isMerged()) {
player.sendMessage(
TranslatableCaption.of("backups.backup_impossible"),
TagResolver.resolver("plot", Tag.inserting(
TranslatableCaption.of("generic.generic_merged").toComponent(player)
))
Template.of("plot", TranslatableCaption.of("generic.generic_merged").getComponent(player))
);
} else if (plot.getVolume() > Integer.MAX_VALUE) {
player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large"));
} else if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_BACKUP_OTHER)) {
} else if (!plot.isOwner(player.getUUID()) && !Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_BACKUP_OTHER)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_ADMIN_BACKUP_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BACKUP_OTHER))
);
} else if (args.length == 0) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("Usage: /plot backup save/list/load")))
Template.of("value", "Usage: /plot backup save/list/load")
);
} else {
final int number;
@ -318,7 +287,7 @@ public final class Backup extends Command {
} catch (final Exception e) {
player.sendMessage(
TranslatableCaption.of("invalid.not_a_number"),
TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
Template.of("value", args[0])
);
return;
}
@ -326,27 +295,23 @@ public final class Backup extends Command {
if (backupProfile instanceof NullBackupProfile) {
player.sendMessage(
TranslatableCaption.of("backups.backup_impossible"),
TagResolver.resolver("plot", Tag.inserting(
TranslatableCaption.of("generic.generic_other").toComponent(player)
))
Template.of("plot", TranslatableCaption.of("generic.generic_other").getComponent(player))
);
} else {
backupProfile.listBackups().whenComplete((backups, throwable) -> {
if (throwable != null) {
player.sendMessage(
TranslatableCaption.of("backups.backup_load_failure"),
TagResolver.resolver("reason", Tag.inserting(Component.text(throwable.getMessage())))
Template.of("reason", throwable.getMessage())
);
throwable.printStackTrace();
} else {
if (number < 1 || number > backups.size()) {
player.sendMessage(
TranslatableCaption.of("backups.backup_impossible"),
TagResolver.resolver(
Template.of(
"plot",
Tag.inserting(TranslatableCaption
.of("generic.generic_invalid_choice")
.toComponent(player))
TranslatableCaption.of("generic.generic_invalid_choice").getComponent(player)
)
);
} else {
@ -356,11 +321,9 @@ public final class Backup extends Command {
.exists(backup.getFile())) {
player.sendMessage(
TranslatableCaption.of("backups.backup_impossible"),
TagResolver.resolver(
Template.of(
"plot",
Tag.inserting(TranslatableCaption
.of("generic.generic_invalid_choice")
.toComponent(player))
TranslatableCaption.of("generic.generic_invalid_choice").getComponent(player)
)
);
} else {
@ -370,10 +333,7 @@ public final class Backup extends Command {
if (error != null) {
player.sendMessage(
TranslatableCaption.of("backups.backup_load_failure"),
TagResolver.resolver(
"reason",
Tag.inserting(Component.text(error.getMessage()))
)
Template.of("reason", error.getMessage())
);
} else {
player.sendMessage(TranslatableCaption.of("backups.backup_load_success"));

View File

@ -18,7 +18,6 @@
*/
package com.plotsquared.core.command;
import com.plotsquared.core.configuration.caption.StaticCaption;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
@ -26,9 +25,7 @@ import com.plotsquared.core.util.StringMan;
import com.sk89q.worldedit.command.util.SuggestionHelper;
import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.biome.BiomeTypes;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import java.util.Collection;
import java.util.Locale;
@ -50,13 +47,16 @@ public class Biome extends SetCommand {
} catch (final Exception ignore) {
}
if (biome == null) {
String separator = TranslatableCaption.of("blocklist.block_list_separator").getComponent(player);
String biomes = StringMan.join(
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(
StaticCaption.of(
TranslatableCaption.of("commandconfig.subcommand_set_options_header_only").getComponent(player)
+ StringMan.join(BiomeType.REGISTRY.values(), separator)
)
TranslatableCaption.of("commandconfig.subcommand_set_options_header"),
Template.of("values", biomes)
);
return false;
}
@ -73,7 +73,7 @@ public class Biome extends SetCommand {
plot.removeRunning();
player.sendMessage(
TranslatableCaption.of("biome.biome_set_to"),
TagResolver.resolver("value", Tag.inserting(Component.text(value.toLowerCase())))
Template.of("value", value.toLowerCase())
);
});
return true;

View File

@ -21,9 +21,8 @@ package com.plotsquared.core.command;
import com.google.inject.Inject;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.events.PlayerBuyPlotEvent;
import com.plotsquared.core.events.PlotFlagRemoveEvent;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.player.OfflinePlotPlayer;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea;
@ -33,9 +32,7 @@ import com.plotsquared.core.util.EconHandler;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.task.RunnableVal2;
import com.plotsquared.core.util.task.RunnableVal3;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.Set;
@ -87,66 +84,53 @@ public class Buy extends Command {
checkTrue(
player.getPlotCount() + plots.size() <= player.getAllowedPlots(),
TranslatableCaption.of("permission.cant_claim_more_plots"),
TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))
Template.of("amount", String.valueOf(player.getAllowedPlots()))
);
double priceFlag = plot.getFlag(PriceFlag.class);
if (priceFlag <= 0) {
double price = plot.getFlag(PriceFlag.class);
if (price <= 0) {
throw new CommandException(TranslatableCaption.of("economy.not_for_sale"));
}
checkTrue(
this.econHandler.isSupported(),
TranslatableCaption.of("economy.vault_or_consumer_null")
);
PlayerBuyPlotEvent event = this.eventDispatcher.callPlayerBuyPlot(player, plot, priceFlag);
if (event.getEventResult() == Result.DENY) {
throw new CommandException(TranslatableCaption.of("economy.cannot_buy_blocked"));
}
double price = event.getEventResult() == Result.FORCE ? 0 : event.price();
if (this.econHandler.getMoney(player) < price) {
throw new CommandException(
TranslatableCaption.of("economy.cannot_afford_plot"),
TagResolver.builder()
.tag("money", Tag.inserting(Component.text(this.econHandler.format(price))))
.tag("balance", Tag.inserting(Component.text(this.econHandler.format(this.econHandler.getMoney(player)))))
.build()
);
}
checkTrue(
this.econHandler.getMoney(player) >= price,
TranslatableCaption.of("economy.cannot_afford_plot"),
Template.of("money", this.econHandler.format(price)),
Template.of("balance", this.econHandler.format(this.econHandler.getMoney(player)))
);
this.econHandler.withdrawMoney(player, price);
// Failure
// Success
confirm.run(this, () -> {
player.sendMessage(
TranslatableCaption.of("economy.removed_balance"),
TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price))))
Template.of("money", this.econHandler.format(price))
);
OfflinePlotPlayer previousOwner = PlotSquared.platform().playerManager().getOfflinePlayer(plot.getOwnerAbs());
this.econHandler.depositMoney(previousOwner, price);
this.econHandler.depositMoney(PlotSquared.platform().playerManager().getOfflinePlayer(plot.getOwnerAbs()), price);
PlotPlayer<?> owner = PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwnerAbs());
if (owner != null) {
owner.sendMessage(
TranslatableCaption.of("economy.plot_sold"),
TagResolver.builder()
.tag("plot", Tag.inserting(Component.text(plot.getId().toString())))
.tag("player", Tag.inserting(Component.text(player.getName())))
.tag("price", Tag.inserting(Component.text(this.econHandler.format(price))))
.build()
Template.of("plot", plot.getId().toString()),
Template.of("player", player.getName()),
Template.of("price", this.econHandler.format(price))
);
}
PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(PriceFlag.class);
if (this.eventDispatcher.callFlagRemove(plotFlag, plot).getEventResult() != Result.DENY) {
plot.removeFlag(plotFlag);
PlotFlagRemoveEvent event = this.eventDispatcher.callFlagRemove(plotFlag, plot);
if (event.getEventResult() != Result.DENY) {
plot.removeFlag(event.getFlag());
}
plot.setOwner(player.getUUID());
plot.getPlotModificationManager().setSign(player.getName());
player.sendMessage(
TranslatableCaption.of("working.claimed"),
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
Template.of("plot", plot.getId().toString())
);
this.eventDispatcher.callPostPlayerBuyPlot(player, previousOwner, plot, price);
whenDone.run(Buy.this, CommandResult.SUCCESS);
}, () -> {
this.econHandler.depositMoney(player, price);

View File

@ -29,10 +29,8 @@ import com.plotsquared.core.plot.flag.implementations.HostileCapFlag;
import com.plotsquared.core.plot.flag.implementations.MiscCapFlag;
import com.plotsquared.core.plot.flag.implementations.MobCapFlag;
import com.plotsquared.core.plot.flag.implementations.VehicleCapFlag;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import com.plotsquared.core.util.Permissions;
import net.kyori.adventure.text.minimessage.Template;
import static com.plotsquared.core.util.entity.EntityCategories.CAP_ANIMAL;
import static com.plotsquared.core.util.entity.EntityCategories.CAP_ENTITY;
@ -53,10 +51,11 @@ public class Caps extends SubCommand {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false;
}
if (!plot.isAdded(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_CAPS_OTHER)) {
if (!plot.isAdded(player.getUUID()) && !Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_CAPS_OTHER)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_ADMIN_CAPS_OTHER))
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_CAPS_OTHER))
);
return false;
}
@ -83,17 +82,15 @@ public class Caps extends SubCommand {
final int current = countedEntities[type];
final int max = plot.getFlag(capFlag);
final String percentage = String.format("%.1f", 100 * ((float) current / max));
ComponentLike maxBeautified = max >= Integer.MAX_VALUE
? TranslatableCaption.of("info.infinite").toComponent(player)
: Component.text(max);
String maxBeautified = max >= Integer.MAX_VALUE
? TranslatableCaption.of("info.infinite").getComponent(player)
: String.valueOf(max);
player.sendMessage(
TranslatableCaption.of("info.plot_caps_format"),
TagResolver.builder()
.tag("cap", Tag.inserting(Component.text(name)))
.tag("current", Tag.inserting(Component.text(current)))
.tag("limit", Tag.inserting(maxBeautified))
.tag("percentage", Tag.inserting(Component.text(percentage)))
.build()
Template.of("cap", name),
Template.of("current", String.valueOf(current)),
Template.of("limit", maxBeautified),
Template.of("percentage", percentage)
);
}

View File

@ -0,0 +1,54 @@
/*
* 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;
}
}

View File

@ -35,11 +35,10 @@ import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.util.EconHandler;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PlotExpression;
import com.plotsquared.core.util.task.TaskManager;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull;
@ -83,7 +82,7 @@ public class Claim extends SubCommand {
if (event.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Claim")))
Template.of("value", "Claim")
);
return true;
}
@ -102,14 +101,14 @@ public class Claim extends SubCommand {
if (grants <= 0) {
player.sendMessage(
TranslatableCaption.of("permission.cant_claim_more_plots"),
TagResolver.resolver("amount", Tag.inserting(Component.text(grants)))
Template.of("amount", String.valueOf(grants))
);
metaDataAccess.remove();
}
} else {
player.sendMessage(
TranslatableCaption.of("permission.cant_claim_more_plots"),
TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))
Template.of("amount", String.valueOf(player.getAllowedPlots()))
);
return false;
}
@ -124,24 +123,23 @@ public class Claim extends SubCommand {
if (!area.hasSchematic(schematic)) {
player.sendMessage(
TranslatableCaption.of("schematics.schematic_invalid_named"),
TagResolver.builder()
.tag("schemname", Tag.inserting(Component.text(schematic)))
.tag("reason", Tag.inserting(Component.text("non-existent")))
.build()
Template.of("schemname", schematic),
Template.of("reason", "non-existent")
);
}
if (!player.hasPermission(Permission.PERMISSION_CLAIM_SCHEMATIC
.format(schematic)) && !player.hasPermission(
if (!Permissions.hasPermission(player, Permission.PERMISSION_CLAIM_SCHEMATIC
.format(schematic)) && !Permissions.hasPermission(
player,
"plots.admin.command.schematic"
) && !force) {
player.sendMessage(
TranslatableCaption.of("permission.no_schematic_permission"),
TagResolver.resolver("value", Tag.inserting(Component.text(schematic)))
Template.of("value", schematic)
);
}
}
}
if (this.econHandler.isEnabled(area) && !force && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
if (this.econHandler.isEnabled(area) && !force) {
PlotExpression costExr = area.getPrices().get("claim");
double cost = costExr.evaluate(currentPlots);
if (cost > 0d) {
@ -152,28 +150,16 @@ public class Claim extends SubCommand {
if (this.econHandler.getMoney(player) < cost) {
player.sendMessage(
TranslatableCaption.of("economy.cannot_afford_plot"),
TagResolver.builder()
.tag("money", Tag.inserting(Component.text(this.econHandler.format(cost))))
.tag(
"balance",
Tag.inserting(Component.text(this.econHandler.format(this.econHandler.getMoney(
player))))
)
.build()
Template.of("money", this.econHandler.format(cost)),
Template.of("balance", this.econHandler.format(this.econHandler.getMoney(player)))
);
return false;
}
this.econHandler.withdrawMoney(player, cost);
player.sendMessage(
TranslatableCaption.of("economy.removed_balance"),
TagResolver.builder()
.tag("money", Tag.inserting(Component.text(this.econHandler.format(cost))))
.tag(
"balance",
Tag.inserting(Component.text(this.econHandler.format(this.econHandler.getMoney(
player))))
)
.build()
Template.of("money", this.econHandler.format(cost)),
Template.of("balance", this.econHandler.format(this.econHandler.getMoney(player)))
);
}
}
@ -185,15 +171,13 @@ public class Claim extends SubCommand {
}
player.sendMessage(
TranslatableCaption.of("economy.removed_granted_plot"),
TagResolver.builder()
.tag("used_grants", Tag.inserting(Component.text(grants - 1)))
.tag("remaining_grants", Tag.inserting(Component.text(grants)))
.build()
Template.of("usedGrants", String.valueOf((grants - 1))),
Template.of("remainingGrants", String.valueOf(grants))
);
}
}
if (!player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
int border = area.getBorder(false);
if (!Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
int border = area.getBorder();
if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border && !force) {
player.sendMessage(TranslatableCaption.of("border.denied"));
return false;
@ -214,7 +198,7 @@ public class Claim extends SubCommand {
if (mergeEvent.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Auto merge on claim")))
Template.of("value", "Auto merge on claim")
);
} else {
if (plot.getPlotModificationManager().autoMerge(

View File

@ -32,12 +32,11 @@ import com.plotsquared.core.plot.flag.implementations.AnalysisFlag;
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
import com.plotsquared.core.queue.GlobalBlockQueue;
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.RunnableVal3;
import com.plotsquared.core.util.task.TaskManager;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.concurrent.CompletableFuture;
@ -80,7 +79,7 @@ public class Clear extends Command {
if (eventResult == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Clear")))
Template.of("value", "Clear")
);
return CompletableFuture.completedFuture(true);
}
@ -90,14 +89,13 @@ public class Clear extends Command {
}
boolean force = eventResult == Result.FORCE;
checkTrue(
force || plot.isOwner(player.getUUID()) || player.hasPermission("plots.admin.command.clear"),
force || plot.isOwner(player.getUUID()) || Permissions
.hasPermission(player, "plots.admin.command.clear"),
TranslatableCaption.of("permission.no_plot_perms")
);
checkTrue(plot.getRunning() == 0, TranslatableCaption.of("errors.wait_for_timer"));
checkTrue(
force || !Settings.Done.RESTRICT_BUILDING || !DoneFlag.isDone(plot) || player.hasPermission("plots.continue"),
TranslatableCaption.of("done.done_already_done")
);
checkTrue(force || !Settings.Done.RESTRICT_BUILDING || !DoneFlag.isDone(plot) || Permissions
.hasPermission(player, "plots.continue"), TranslatableCaption.of("done.done_already_done"));
confirm.run(this, () -> {
if (Settings.Teleport.ON_CLEAR) {
plot.getPlayersInPlot().forEach(playerInPlot -> plot.teleportPlayer(playerInPlot, TeleportCause.COMMAND_CLEAR,
@ -107,36 +105,36 @@ public class Clear extends Command {
}
BackupManager.backup(player, plot, () -> {
final long start = System.currentTimeMillis();
boolean result = plot.getPlotModificationManager().clear(true, false, player, () -> TaskManager.runTask(() -> {
plot.removeRunning();
// If the state changes, then mark it as no longer done
if (DoneFlag.isDone(plot)) {
PlotFlag<?, ?> plotFlag =
plot.getFlagContainer().getFlag(DoneFlag.class);
PlotFlagRemoveEvent event = this.eventDispatcher
.callFlagRemove(plotFlag, plot);
if (event.getEventResult() != Result.DENY) {
plot.removeFlag(event.getFlag());
boolean result = plot.getPlotModificationManager().clear(true, false, player, () -> {
plot.getPlotModificationManager().unlink();
TaskManager.runTask(() -> {
plot.removeRunning();
// If the state changes, then mark it as no longer done
if (DoneFlag.isDone(plot)) {
PlotFlag<?, ?> plotFlag =
plot.getFlagContainer().getFlag(DoneFlag.class);
PlotFlagRemoveEvent event = this.eventDispatcher
.callFlagRemove(plotFlag, plot);
if (event.getEventResult() != Result.DENY) {
plot.removeFlag(event.getFlag());
}
}
}
if (!plot.getFlag(AnalysisFlag.class).isEmpty()) {
PlotFlag<?, ?> plotFlag =
plot.getFlagContainer().getFlag(AnalysisFlag.class);
PlotFlagRemoveEvent event = this.eventDispatcher
.callFlagRemove(plotFlag, plot);
if (event.getEventResult() != Result.DENY) {
plot.removeFlag(event.getFlag());
if (!plot.getFlag(AnalysisFlag.class).isEmpty()) {
PlotFlag<?, ?> plotFlag =
plot.getFlagContainer().getFlag(AnalysisFlag.class);
PlotFlagRemoveEvent event = this.eventDispatcher
.callFlagRemove(plotFlag, plot);
if (event.getEventResult() != Result.DENY) {
plot.removeFlag(event.getFlag());
}
}
}
player.sendMessage(
TranslatableCaption.of("working.clearing_done"),
TagResolver.builder()
.tag("amount", Tag.inserting(Component.text(System.currentTimeMillis() - start)))
.tag("plot", Tag.inserting(Component.text(plot.getId().toString())))
.build()
);
this.eventDispatcher.callPostPlotClear(player, plot);
}));
player.sendMessage(
TranslatableCaption.of("working.clearing_done"),
Template.of("amount", String.valueOf(System.currentTimeMillis() - start)),
Template.of("plot", plot.getId().toString())
);
});
});
if (!result) {
player.sendMessage(TranslatableCaption.of("errors.wait_for_timer"));
} else {

View File

@ -32,26 +32,20 @@ import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.PlotCluster;
import com.plotsquared.core.plot.PlotId;
import com.plotsquared.core.util.ComponentHelper;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.TabCompletions;
import com.plotsquared.core.util.query.PlotQuery;
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 net.kyori.adventure.text.minimessage.Template;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@CommandDeclaration(command = "cluster",
aliases = "clusters",
@ -60,39 +54,36 @@ import java.util.stream.Stream;
permission = "plots.cluster")
public class Cluster extends SubCommand {
private static final Component[] AVAILABLE_ARGS = Stream.of(
"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
@Override
public boolean onCommand(PlotPlayer<?> player, String[] args) {
// list, create, delete, resize, invite, kick, leave, helpers, tp, sethome
if (args.length == 0) {
// return arguments
player.sendMessage(
TranslatableCaption.of("cluster.cluster_available_args"),
TagResolver.resolver("list", Tag.inserting(ComponentHelper.join(AVAILABLE_ARGS, SEPARATOR)))
Template.of(
"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;
}
String sub = args[0].toLowerCase();
switch (sub) {
case "l", "list" -> {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_LIST)) {
case "l":
case "list": {
if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_LIST)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_LIST)
)
Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_LIST))
);
return false;
}
if (args.length != 1) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster list")))
Template.of("value", "/plot cluster list")
);
return false;
}
@ -104,7 +95,7 @@ public class Cluster extends SubCommand {
Set<PlotCluster> clusters = area.getClusters();
player.sendMessage(
TranslatableCaption.of("cluster.cluster_list_heading"),
TagResolver.resolver("amount", Tag.inserting(Component.text(clusters.size())))
Template.of("amount", clusters.size() + "")
);
for (PlotCluster cluster : clusters) {
// Ignore unmanaged clusters
@ -112,35 +103,33 @@ public class Cluster extends SubCommand {
if (player.getUUID().equals(cluster.owner)) {
player.sendMessage(
TranslatableCaption.of("cluster.cluster_list_element_owner"),
TagResolver.resolver("cluster", Tag.inserting(Component.text(name)))
Template.of("cluster", name)
);
} else if (cluster.helpers.contains(player.getUUID())) {
player.sendMessage(
TranslatableCaption.of("cluster.cluster_list_element_helpers"),
TagResolver.resolver("cluster", Tag.inserting(Component.text(name)))
Template.of("cluster", name)
);
} else if (cluster.invited.contains(player.getUUID())) {
player.sendMessage(
TranslatableCaption.of("cluster.cluster_list_element_invited"),
TagResolver.resolver("cluster", Tag.inserting(Component.text(name)))
Template.of("cluster", name)
);
} else {
player.sendMessage(
TranslatableCaption.of("cluster.cluster_list_element"),
TagResolver.resolver("cluster", Tag.inserting(Component.text(cluster.toString())))
Template.of("cluster", cluster.toString())
);
}
}
return true;
}
case "c", "create" -> {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_CREATE)) {
case "c":
case "create": {
if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_CREATE)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_CREATE)
)
Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_CREATE))
);
return false;
}
@ -152,10 +141,7 @@ public class Cluster extends SubCommand {
if (args.length != 4) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text("/plot cluster create <name> <id-bot> <id-top>"))
)
Template.of("value", "/plot cluster create <name> <id-bot> <id-top>")
);
return false;
}
@ -165,7 +151,7 @@ public class Cluster extends SubCommand {
if (currentClusters >= player.getAllowedPlots()) {
player.sendMessage(
TranslatableCaption.of("permission.cant_claim_more_clusters"),
TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))
Template.of("amount", String.valueOf(player.getAllowedPlots()))
);
}
PlotId pos1;
@ -183,7 +169,7 @@ public class Cluster extends SubCommand {
if (area.getCluster(name) != null) {
player.sendMessage(
TranslatableCaption.of("alias.alias_is_taken"),
TagResolver.resolver("alias", Tag.inserting(Component.text(name)))
Template.of("alias", name)
);
return false;
}
@ -197,7 +183,7 @@ public class Cluster extends SubCommand {
if (cluster != null) {
player.sendMessage(
TranslatableCaption.of("cluster.cluster_intersection"),
TagResolver.resolver("cluster", Tag.inserting(Component.text(cluster.getName())))
Template.of("cluster", cluster.getName())
);
return false;
}
@ -205,22 +191,20 @@ public class Cluster extends SubCommand {
if (!area.contains(pos1) || !area.contains(pos2)) {
player.sendMessage(
TranslatableCaption.of("cluster.cluster_outside"),
TagResolver.resolver("area", Tag.inserting(Component.text(area.toString())))
Template.of("area", String.valueOf(area))
);
return false;
}
Set<Plot> plots = area.getPlotSelectionOwned(pos1, pos2);
if (!plots.isEmpty()) {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_CREATE_OTHER)) {
if (!Permissions
.hasPermission(player, Permission.PERMISSION_CLUSTER_CREATE_OTHER)) {
UUID uuid = player.getUUID();
for (Plot plot : plots) {
if (!plot.isOwner(uuid)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_CREATE_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_CREATE_OTHER))
);
return false;
}
@ -235,17 +219,14 @@ public class Cluster extends SubCommand {
} else {
current = player.getPlayerClusterCount(player.getLocation().getWorldName());
}
int allowed = player.hasPermissionRange(
Permission.PERMISSION_CLUSTER_SIZE,
Settings.Limit.MAX_PLOTS
);
int allowed = Permissions
.hasPermissionRange(player, Permission.PERMISSION_CLUSTER_SIZE,
Settings.Limit.MAX_PLOTS
);
if (current + cluster.getArea() > allowed) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Component.text(Permission.PERMISSION_CLUSTER_SIZE + "." + (current + cluster.getArea())))
)
Template.of("node", Permission.PERMISSION_CLUSTER_SIZE + "." + (current + cluster.getArea()))
);
return false;
}
@ -264,25 +245,24 @@ public class Cluster extends SubCommand {
}
player.sendMessage(
TranslatableCaption.of("cluster.cluster_created"),
TagResolver.resolver("name", Tag.inserting(Component.text(name)))
Template.of("name", name)
);
return true;
}
case "disband", "del", "delete" -> {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_DELETE)) {
case "disband":
case "del":
case "delete": {
if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_DELETE)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_DELETE)
)
Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_DELETE))
);
return false;
}
if (args.length != 1 && args.length != 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster delete [name]")))
Template.of("value", "/plot cluster delete [name]")
);
return false;
}
@ -297,7 +277,7 @@ public class Cluster extends SubCommand {
if (cluster == null) {
player.sendMessage(
TranslatableCaption.of("cluster.invalid_cluster_name"),
TagResolver.resolver("cluster", Tag.inserting(Component.text(args[1])))
Template.of("cluster", args[1])
);
return false;
}
@ -309,39 +289,35 @@ public class Cluster extends SubCommand {
}
}
if (!cluster.owner.equals(player.getUUID())) {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_DELETE_OTHER)) {
if (!Permissions
.hasPermission(player, Permission.PERMISSION_CLUSTER_DELETE_OTHER)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_DELETE_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_DELETE_OTHER))
);
return false;
}
}
DBFunc.delete(cluster);
player.sendMessage(TranslatableCaption.of("cluster.cluster_deleted"), TagResolver.resolver(
player.sendMessage(TranslatableCaption.of("cluster.cluster_deleted"), Template.of(
"cluster",
Tag.inserting(Component.text(cluster.toString()))
String.valueOf(cluster)
));
return true;
}
case "res", "resize" -> {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE)) {
case "res":
case "resize": {
if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_RESIZE)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_RESIZE)
)
Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_RESIZE))
);
return false;
}
if (args.length != 3) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster resize [name]")))
Template.of("value", "/plot cluster resize [name]")
);
return false;
}
@ -371,13 +347,11 @@ public class Cluster extends SubCommand {
return false;
}
if (!cluster.hasHelperRights(player.getUUID())) {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE_OTHER)) {
if (!Permissions
.hasPermission(player, Permission.PERMISSION_CLUSTER_RESIZE_OTHER)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_RESIZE_OTHER)
)
Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_RESIZE_OTHER))
);
return false;
}
@ -387,37 +361,34 @@ public class Cluster extends SubCommand {
if (intersect != null) {
player.sendMessage(
TranslatableCaption.of("cluster.cluster_intersection"),
TagResolver.resolver("cluster", Tag.inserting(Component.text(intersect.getName())))
Template.of("cluster", intersect.getName())
);
return false;
}
Set<Plot> existing = area.getPlotSelectionOwned(cluster.getP1(), cluster.getP2());
Set<Plot> newPlots = area.getPlotSelectionOwned(pos1, pos2);
// Set<Plot> removed = (HashSet<Plot>) existing.clone();
Set<Plot> removed = new HashSet<>(existing);
removed.removeAll(newPlots);
// Check expand / shrink
if (!removed.isEmpty()) {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE_SHRINK)) {
if (!Permissions
.hasPermission(player, Permission.PERMISSION_CLUSTER_RESIZE_SHRINK)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_RESIZE_SHRINK)
)
Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_RESIZE_SHRINK))
);
return false;
}
}
newPlots.removeAll(existing);
if (!newPlots.isEmpty()) {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE_EXPAND)) {
if (!Permissions
.hasPermission(player, Permission.PERMISSION_CLUSTER_RESIZE_EXPAND)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_RESIZE_EXPAND)
)
Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_RESIZE_EXPAND))
);
return false;
}
@ -430,16 +401,13 @@ public class Cluster extends SubCommand {
current = player.getPlayerClusterCount(player.getLocation().getWorldName());
}
current -= cluster.getArea() + (1 + pos2.getX() - pos1.getX()) * (1 + pos2.getY() - pos1.getY());
int allowed = player.hasPermissionRange(
Permission.PERMISSION_CLUSTER,
int allowed = Permissions.hasPermissionRange(player, Permission.PERMISSION_CLUSTER,
Settings.Limit.MAX_PLOTS
);
if (current + cluster.getArea() > allowed) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver("node", Tag.inserting(Component.text(
Permission.PERMISSION_CLUSTER + "." + (current + cluster.getArea())
)))
Template.of("node", Permission.PERMISSION_CLUSTER + "." + (current + cluster.getArea()))
);
return false;
}
@ -448,21 +416,20 @@ public class Cluster extends SubCommand {
player.sendMessage(TranslatableCaption.of("cluster.cluster_resized"));
return true;
}
case "add", "inv", "invite" -> {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_INVITE)) {
case "add":
case "inv":
case "invite": {
if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_INVITE)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_INVITE)
)
Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_INVITE))
);
return false;
}
if (args.length != 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster invite <player>")))
Template.of("value", "/plot cluster invite <player>")
);
return false;
}
@ -477,13 +444,11 @@ public class Cluster extends SubCommand {
return false;
}
if (!cluster.hasHelperRights(player.getUUID())) {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_INVITE_OTHER)) {
if (!Permissions
.hasPermission(player, Permission.PERMISSION_CLUSTER_INVITE_OTHER)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_INVITE_OTHER)
)
Template.of("node", Permission.PERMISSION_CLUSTER_INVITE_OTHER.toString())
);
return false;
}
@ -496,7 +461,7 @@ public class Cluster extends SubCommand {
} else if (throwable != null) {
player.sendMessage(
TranslatableCaption.of("errors.invalid_player"),
TagResolver.resolver("value", Tag.inserting(Component.text(args[1])))
Template.of("value", args[1])
);
} else {
if (!cluster.isAdded(uuid)) {
@ -508,7 +473,7 @@ public class Cluster extends SubCommand {
if (otherPlayer != null) {
player.sendMessage(
TranslatableCaption.of("cluster.cluster_invited"),
TagResolver.resolver("cluster", Tag.inserting(Component.text(cluster.getName())))
Template.of("cluster", cluster.getName())
);
}
}
@ -517,21 +482,20 @@ public class Cluster extends SubCommand {
});
return true;
}
case "k", "remove", "kick" -> {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_KICK)) {
case "k":
case "remove":
case "kick": {
if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_KICK)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_KICK)
)
Template.of("node", Permission.PERMISSION_CLUSTER_KICK.toString())
);
return false;
}
if (args.length != 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster kick <player>")))
Template.of("value", "/plot cluster kick <player>")
);
return false;
}
@ -545,13 +509,11 @@ public class Cluster extends SubCommand {
return false;
}
if (!cluster.hasHelperRights(player.getUUID())) {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_KICK_OTHER)) {
if (!Permissions
.hasPermission(player, Permission.PERMISSION_CLUSTER_KICK_OTHER)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_KICK_OTHER)
)
Template.of("node", Permission.PERMISSION_CLUSTER_KICK_OTHER.toString())
);
return false;
}
@ -564,7 +526,7 @@ public class Cluster extends SubCommand {
} else if (throwable != null) {
player.sendMessage(
TranslatableCaption.of("errors.invalid_player"),
TagResolver.resolver("value", Tag.inserting(Component.text(args[1])))
Template.of("value", args[1])
);
} else {
// Can't kick if the player is yourself, the owner, or not added to the cluster
@ -572,7 +534,7 @@ public class Cluster extends SubCommand {
|| !cluster.isAdded(uuid)) {
player.sendMessage(
TranslatableCaption.of("cluster.cannot_kick_player"),
TagResolver.resolver("value", Tag.inserting(Component.text(cluster.getName())))
Template.of("value", cluster.getName())
);
} else {
if (cluster.helpers.contains(uuid)) {
@ -587,7 +549,7 @@ public class Cluster extends SubCommand {
if (player2 != null) {
player.sendMessage(
TranslatableCaption.of("cluster.cluster_removed"),
TagResolver.resolver("cluster", Tag.inserting(Component.text(cluster.getName())))
Template.of("cluster", cluster.getName())
);
}
removePlayerPlots(cluster, uuid, player2.getLocation().getWorldName());
@ -597,21 +559,19 @@ public class Cluster extends SubCommand {
});
return true;
}
case "quit", "leave" -> {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_LEAVE)) {
case "quit":
case "leave": {
if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_LEAVE)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_LEAVE)
)
Template.of("node", Permission.PERMISSION_CLUSTER_LEAVE.toString())
);
return false;
}
if (args.length != 1 && args.length != 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster leave [name]")))
Template.of("value", "/plot cluster leave [name]")
);
return false;
}
@ -625,7 +585,7 @@ public class Cluster extends SubCommand {
if (cluster == null) {
player.sendMessage(
TranslatableCaption.of("cluster.invalid_cluster_name"),
TagResolver.resolver("cluster", Tag.inserting(Component.text(args[1])))
Template.of("cluster", args[1])
);
return false;
}
@ -653,29 +613,23 @@ public class Cluster extends SubCommand {
DBFunc.removeInvited(cluster, uuid);
player.sendMessage(
TranslatableCaption.of("cluster.cluster_removed"),
TagResolver.resolver("cluster", Tag.inserting(Component.text(cluster.getName())))
Template.of("cluster", cluster.getName())
);
removePlayerPlots(cluster, uuid, player.getLocation().getWorldName());
return true;
}
case "members" -> {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_HELPERS)) {
case "members": {
if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_HELPERS)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Component.text(Permission.PERMISSION_CLUSTER_HELPERS.toString()))
)
Template.of("node", Permission.PERMISSION_CLUSTER_HELPERS.toString())
);
return false;
}
if (args.length != 3) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text("/plot cluster members <add | remove> <player>"))
)
Template.of("value", "/plot cluster members <add | remove> <player>")
);
return false;
}
@ -696,7 +650,7 @@ public class Cluster extends SubCommand {
} else if (throwable != null) {
player.sendMessage(
TranslatableCaption.of("errors.invalid_player"),
TagResolver.resolver("value", Tag.inserting(Component.text(args[2])))
Template.of("value", args[2])
);
} else {
if (args[1].equalsIgnoreCase("add")) {
@ -710,30 +664,27 @@ public class Cluster extends SubCommand {
} else {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text(
"/plot cluster members <add | remove> <player>"
)))
Template.of("value", "/plot cluster members <add | remove> <player>")
);
}
}
});
return true;
}
case "spawn", "home", "tp" -> {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_TP)) {
case "spawn":
case "home":
case "tp": {
if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_TP)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_TP)
)
Template.of("node", Permission.PERMISSION_CLUSTER_TP.toString())
);
return false;
}
if (args.length != 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster tp <name>")))
Template.of("value", "/plot cluster tp <name>")
);
return false;
}
@ -746,19 +697,16 @@ public class Cluster extends SubCommand {
if (cluster == null) {
player.sendMessage(
TranslatableCaption.of("cluster.invalid_cluster_name"),
TagResolver.resolver("cluster", Tag.inserting(Component.text(args[1])))
Template.of("cluster", args[1])
);
return false;
}
UUID uuid = player.getUUID();
if (!cluster.isAdded(uuid)) {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_TP_OTHER)) {
if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_TP_OTHER)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_TP_OTHER)
)
Template.of("node", Permission.PERMISSION_CLUSTER_TP_OTHER.toString())
);
return false;
}
@ -767,21 +715,21 @@ public class Cluster extends SubCommand {
player.sendMessage(TranslatableCaption.of("cluster.cluster_teleporting"));
return true;
}
case "i", "info", "show", "information" -> {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_INFO)) {
case "i":
case "info":
case "show":
case "information": {
if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_INFO)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_TP)
)
Template.of("node", Permission.PERMISSION_CLUSTER_TP.toString())
);
return false;
}
if (args.length != 1 && args.length != 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster info [name]")))
Template.of("value", "/plot cluster info [name]")
);
}
PlotArea area = player.getApplicablePlotArea();
@ -795,7 +743,7 @@ public class Cluster extends SubCommand {
if (cluster == null) {
player.sendMessage(
TranslatableCaption.of("cluster.invalid_cluster_name"),
TagResolver.resolver("cluster", Tag.inserting(Component.text(args[1])))
Template.of("cluster", args[1])
);
return false;
}
@ -814,36 +762,47 @@ public class Cluster extends SubCommand {
player.sendMessage(TranslatableCaption.of("players.fetching_players_timeout"));
} else {
final String owner;
owner = Objects.requireNonNullElse(username, "unknown");
if (username == null) {
owner = "unknown";
} else {
owner = username;
}
String name = cluster.getName();
String size = (cluster.getP2().getX() - cluster.getP1().getX() + 1) + "x" + (
cluster.getP2().getY() - cluster.getP1().getY() + 1);
String rights = cluster.isAdded(player.getUUID()) + "";
Caption message = TranslatableCaption.of("cluster.cluster_info");
TagResolver resolver = TagResolver.builder()
.tag("id", Tag.inserting(Component.text(id)))
.tag("owner", Tag.inserting(Component.text(owner)))
.tag("name", Tag.inserting(Component.text(name)))
.tag("size", Tag.inserting(Component.text(size)))
.tag("rights", Tag.inserting(Component.text(rights)))
.build();
player.sendMessage(message, resolver);
Template idTemplate = Template.of("id", id);
Template ownerTemplate = Template.of("owner", owner);
Template nameTemplate = Template.of("name", name);
Template sizeTemplate = Template.of("size", size);
Template rightsTemplate = Template.of("rights", rights);
player.sendMessage(
message,
idTemplate,
ownerTemplate,
nameTemplate,
sizeTemplate,
rightsTemplate
);
}
});
return true;
}
case "sh", "setspawn", "sethome" -> {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_SETHOME)) {
case "sh":
case "setspawn":
case "sethome": {
if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_SETHOME)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_CLUSTER_SETHOME))
Template.of("node", Permission.PERMISSION_CLUSTER_SETHOME.toString())
);
return false;
}
if (args.length != 1 && args.length != 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster sethome")))
Template.of("value", "/plot cluster sethome")
);
return false;
}
@ -857,13 +816,11 @@ public class Cluster extends SubCommand {
return false;
}
if (!cluster.hasHelperRights(player.getUUID())) {
if (!player.hasPermission(Permission.PERMISSION_CLUSTER_SETHOME_OTHER)) {
if (!Permissions
.hasPermission(player, Permission.PERMISSION_CLUSTER_SETHOME_OTHER)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_CLUSTER_SETHOME_OTHER)
)
Template.of("node", Permission.PERMISSION_CLUSTER_SETHOME_OTHER.toString())
);
return false;
}
@ -882,7 +839,10 @@ public class Cluster extends SubCommand {
}
player.sendMessage(
TranslatableCaption.of("cluster.cluster_available_args"),
TagResolver.resolver("list", Tag.inserting(ComponentHelper.join(AVAILABLE_ARGS, SEPARATOR)))
Template.of(
"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;
}
@ -909,37 +869,37 @@ public class Cluster extends SubCommand {
public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
if (args.length == 1) {
final List<String> completions = new LinkedList<>();
if (player.hasPermission(Permission.PERMISSION_CLUSTER_LIST)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_LIST)) {
completions.add("list");
}
if (player.hasPermission(Permission.PERMISSION_CLUSTER_CREATE)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_CREATE)) {
completions.add("create");
}
if (player.hasPermission(Permission.PERMISSION_CLUSTER_DELETE)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_DELETE)) {
completions.add("delete");
}
if (player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_RESIZE)) {
completions.add("resize");
}
if (player.hasPermission(Permission.PERMISSION_CLUSTER_INVITE)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_INVITE)) {
completions.add("invite");
}
if (player.hasPermission(Permission.PERMISSION_CLUSTER_KICK)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_KICK)) {
completions.add("kick");
}
if (player.hasPermission(Permission.PERMISSION_CLUSTER_KICK)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_KICK)) {
completions.add("leave");
}
if (player.hasPermission(Permission.PERMISSION_CLUSTER_HELPERS)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_HELPERS)) {
completions.add("members");
}
if (player.hasPermission(Permission.PERMISSION_CLUSTER_INFO)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_INFO)) {
completions.add("info");
}
if (player.hasPermission(Permission.PERMISSION_CLUSTER_TP)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_TP)) {
completions.add("tp");
}
if (player.hasPermission(Permission.PERMISSION_CLUSTER_SETHOME)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_SETHOME)) {
completions.add("sethome");
}
final List<Command> commands = completions.stream().filter(completion -> completion
@ -954,7 +914,7 @@ public class Cluster extends SubCommand {
CommandCategory.ADMINISTRATION
) {
}).collect(Collectors.toCollection(LinkedList::new));
if (player.hasPermission(Permission.PERMISSION_CLUSTER) && args[0].length() > 0) {
if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
}
return commands;

View File

@ -25,9 +25,7 @@ import com.plotsquared.core.player.PlayerMetaDataKeys;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.util.task.TaskTime;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.Nullable;
public class CmdConfirm {
@ -54,11 +52,9 @@ public class CmdConfirm {
if (commandStr != null) {
player.sendMessage(
TranslatableCaption.of("confirm.requires_confirm"),
TagResolver.builder()
.tag("command", Tag.inserting(Component.text(commandStr)))
.tag("timeout", Tag.inserting(Component.text(Settings.Confirmation.CONFIRMATION_TIMEOUT_SECONDS)))
.tag("value", Tag.inserting(Component.text("/plot confirm")))
.build()
Template.of("command", commandStr),
Template.of("timeout", String.valueOf(Settings.Confirmation.CONFIRMATION_TIMEOUT_SECONDS)),
Template.of("value", "/plot confirm")
);
}
TaskManager.runTaskLater(() -> {

View File

@ -25,14 +25,13 @@ import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.permissions.PermissionHolder;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.StringComparison;
import com.plotsquared.core.util.StringMan;
import com.plotsquared.core.util.task.RunnableVal2;
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.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.lang.reflect.InvocationTargetException;
@ -257,14 +256,10 @@ public abstract class Command {
max = c.size();
}
// Send the header
player.sendMessage(
header,
TagResolver.builder()
.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()
);
Template curTemplate = Template.of("cur", String.valueOf(page + 1));
Template maxTemplate = Template.of("max", String.valueOf(totalPages + 1));
Template amountTemplate = Template.of("amount", String.valueOf(c.size()));
player.sendMessage(header, curTemplate, maxTemplate, amountTemplate);
// Send the page content
List<T> subList = c.subList(page * size, max);
int i = page * size;
@ -272,24 +267,13 @@ public abstract class Command {
i++;
final CaptionHolder msg = new CaptionHolder();
add.run(i, obj, msg);
player.sendMessage(msg.get(), msg.getTagResolvers());
player.sendMessage(msg.get(), msg.getTemplates());
}
// Send the footer
player.sendMessage(
TranslatableCaption.of("list.page_turn"),
TagResolver.builder()
.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()
);
Template command1 = Template.of("command1", baseCommand + " " + page);
Template command2 = Template.of("command2", baseCommand + " " + (page + 2));
Template clickable = Template.of("clickable", TranslatableCaption.of("list.clickable").getComponent(player));
player.sendMessage(TranslatableCaption.of("list.page_turn"), command1, command2, clickable);
}
/**
@ -341,7 +325,7 @@ public abstract class Command {
if (commands.isEmpty()) {
player.sendMessage(
TranslatableCaption.of("commandconfig.did_you_mean"),
TagResolver.resolver("value", Tag.inserting(Component.text(MainCommand.getInstance().help.getUsage())))
Template.of("value", MainCommand.getInstance().help.getUsage())
);
return CompletableFuture.completedFuture(false);
}
@ -362,7 +346,7 @@ public abstract class Command {
}
player.sendMessage(
TranslatableCaption.of("commandconfig.did_you_mean"),
TagResolver.resolver("value", Tag.inserting(Component.text(cmd.getUsage())))
Template.of("value", cmd.getUsage())
);
return CompletableFuture.completedFuture(false);
}
@ -397,7 +381,7 @@ public abstract class Command {
// TODO improve or remove the Argument system
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text(StringMan.join(fullSplit, " "))))
Template.of("value", StringMan.join(fullSplit, " "))
);
return false;
}
@ -482,11 +466,11 @@ public abstract class Command {
if (message) {
player.sendMessage(this.required.getErrorMessage());
}
} else if (!player.hasPermission(getPermission())) {
} else if (!Permissions.hasPermission(player, getPermission())) {
if (message) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver("node", Tag.inserting(Component.text(getPermission())))
Template.of("node", getPermission())
);
}
} else {
@ -511,7 +495,7 @@ public abstract class Command {
public void sendUsage(PlotPlayer<?> player) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text(getUsage())))
Template.of("value", getUsage())
);
}
@ -559,10 +543,9 @@ public abstract class Command {
public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
switch (args.length) {
case 0 -> {
case 0:
return this.allCommands;
}
case 1 -> {
case 1:
String arg = args[0].toLowerCase();
if (space) {
Command cmd = getCommand(arg);
@ -581,15 +564,13 @@ public abstract class Command {
}
return commands;
}
}
default -> {
default:
Command cmd = getCommand(args[0]);
if (cmd != null) {
return cmd.tab(player, Arrays.copyOfRange(args, 1, args.length), space);
} else {
return null;
}
}
}
}
@ -618,13 +599,13 @@ public abstract class Command {
return this.getFullId().hashCode();
}
public void checkTrue(boolean mustBeTrue, Caption message, TagResolver... args) {
public void checkTrue(boolean mustBeTrue, Caption message, Template... args) {
if (!mustBeTrue) {
throw new CommandException(message, args);
}
}
public <T> T check(T object, Caption message, TagResolver... args) {
public <T> T check(T object, Caption message, Template... args) {
if (object == null) {
throw new CommandException(message, args);
}
@ -640,10 +621,10 @@ public abstract class Command {
public static class CommandException extends RuntimeException {
private final Template[] args;
private final Caption message;
private final TagResolver[] args;
public CommandException(final @Nullable Caption message, final TagResolver... args) {
public CommandException(final @Nullable Caption message, final Template... args) {
this.message = message;
this.args = args;
}

View File

@ -19,7 +19,7 @@
package com.plotsquared.core.command;
import com.plotsquared.core.configuration.caption.Caption;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
/**
@ -34,7 +34,7 @@ public interface CommandCaller {
* @param caption Caption to send
* @param replacements Variable replacements
*/
void sendMessage(@NonNull Caption caption, @NonNull TagResolver... replacements);
void sendMessage(@NonNull Caption caption, @NonNull Template... replacements);
/**
* Check the player's permissions. <i>Will be cached if permission caching is enabled.</i>

View File

@ -22,10 +22,7 @@ import com.plotsquared.core.configuration.caption.Caption;
import com.plotsquared.core.configuration.caption.LocaleHolder;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
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.jetbrains.annotations.NotNull;
/**
* CommandCategory.
@ -83,7 +80,7 @@ public enum CommandCategory implements Caption {
// TODO this method shouldn't be invoked
@Deprecated
@Override
public @NotNull String toString() {
public String toString() {
return this.caption.getComponent(LocaleHolder.console());
}
@ -93,11 +90,6 @@ public enum CommandCategory implements Caption {
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
*
@ -109,5 +101,4 @@ public enum CommandCategory implements Caption {
return !MainCommand.getInstance().getCommands(this, player).isEmpty();
}
}

View File

@ -27,9 +27,7 @@ import com.plotsquared.core.plot.comment.CommentInbox;
import com.plotsquared.core.plot.comment.CommentManager;
import com.plotsquared.core.plot.comment.PlotComment;
import com.plotsquared.core.util.StringMan;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import java.util.Arrays;
import java.util.Locale;
@ -46,10 +44,8 @@ public class Comment extends SubCommand {
if (args.length < 2) {
player.sendMessage(
TranslatableCaption.of("comment.comment_syntax"),
TagResolver.builder()
.tag("command", Tag.inserting(Component.text("/plot comment [X;Z]")))
.tag("list", Tag.inserting(Component.text(StringMan.join(CommentManager.inboxes.keySet(), "|"))))
.build()
Template.of("command", "/plot comment [X;Z]"),
Template.of("list", StringMan.join(CommentManager.inboxes.keySet(), "|"))
);
return false;
}
@ -68,10 +64,8 @@ public class Comment extends SubCommand {
if (args.length < 3) {
player.sendMessage(
TranslatableCaption.of("comment.comment_syntax"),
TagResolver.builder()
.tag("command", Tag.inserting(Component.text("/plot comment [X;Z]")))
.tag("list", Tag.inserting(Component.text(StringMan.join(CommentManager.inboxes.keySet(), "|"))))
.build()
Template.of("command", "/plot comment [X;Z]"),
Template.of("list", StringMan.join(CommentManager.inboxes.keySet(), "|"))
);
return false;
}
@ -82,10 +76,8 @@ public class Comment extends SubCommand {
if (inbox == null) {
player.sendMessage(
TranslatableCaption.of("comment.comment_syntax"),
TagResolver.builder()
.tag("command", Tag.inserting(Component.text("/plot comment [X;Z]")))
.tag("list", Tag.inserting(Component.text(StringMan.join(CommentManager.inboxes.keySet(), "|"))))
.build()
Template.of("command", "/plot comment [X;Z]"),
Template.of("list", StringMan.join(CommentManager.inboxes.keySet(), "|"))
);
return false;
}
@ -105,10 +97,8 @@ public class Comment extends SubCommand {
player.sendMessage(TranslatableCaption.of("comment.no_plot_inbox"));
player.sendMessage(
TranslatableCaption.of("comment.comment_syntax"),
TagResolver.builder()
.tag("command", Tag.inserting(Component.text("/plot comment [X;Z]")))
.tag("list", Tag.inserting(Component.text(StringMan.join(CommentManager.inboxes.keySet(), "|"))))
.build()
Template.of("command", "/plot comment [X;Z]"),
Template.of("list", StringMan.join(CommentManager.inboxes.keySet(), "|"))
);
return false;
}

View File

@ -29,9 +29,7 @@ import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.WorldUtil;
import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.util.task.TaskTime;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.ArrayList;
@ -70,9 +68,7 @@ public class Condense extends SubCommand {
if (args.length != 2 && args.length != 3) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text(
"/plot condense <area> <start | stop | info> [radius]"
)))
Template.of("value", "/plot condense <area> <start | stop | info> [radius]")
);
return false;
}
@ -86,10 +82,7 @@ public class Condense extends SubCommand {
if (args.length == 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text("/plot condense" + area + " start " + "<radius>"))
)
Template.of("value", "/plot condense" + area + " start <radius>")
);
return false;
}
@ -188,10 +181,8 @@ public class Condense extends SubCommand {
if (result.get()) {
player.sendMessage(
TranslatableCaption.of("condense.moving"),
TagResolver.builder()
.tag("origin", Tag.inserting(Component.text(origin.toString())))
.tag("possible", Tag.inserting(Component.text(possible.toString())))
.build()
Template.of("origin", String.valueOf(origin)),
Template.of("possible", String.valueOf(possible))
);
TaskManager.runTaskLater(task, TaskTime.ticks(1L));
}
@ -211,7 +202,7 @@ public class Condense extends SubCommand {
if (i >= free.size()) {
player.sendMessage(
TranslatableCaption.of("condense.skipping"),
TagResolver.resolver("plot", Tag.inserting(Component.text(origin.toString())))
Template.of("plot", String.valueOf(origin))
);
}
}
@ -232,10 +223,7 @@ public class Condense extends SubCommand {
if (args.length == 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text("/plot condense " + area + " info <radius>"))
)
Template.of("value", "/plot condense " + area + " info <radius>")
);
return false;
}
@ -256,20 +244,20 @@ public class Condense extends SubCommand {
player.sendMessage(TranslatableCaption.of("condense.default_eval"));
player.sendMessage(
TranslatableCaption.of("condense.minimum_radius"),
TagResolver.resolver("minimum_radius", Tag.inserting(Component.text(minimumRadius)))
Template.of("minimumRadius", String.valueOf(minimumRadius))
);
player.sendMessage(
TranslatableCaption.of("condense.maximum_moved"),
TagResolver.resolver("maximum_moves", Tag.inserting(Component.text(maxMove)))
TranslatableCaption.of("condense.minimum_radius"),
Template.of("maxMove", String.valueOf(maxMove))
);
player.sendMessage(TranslatableCaption.of("condense.input_eval"));
player.sendMessage(
TranslatableCaption.of("condense.input_radius"),
TagResolver.resolver("radius", Tag.inserting(Component.text(radius)))
Template.of("radius", String.valueOf(radius))
);
player.sendMessage(
TranslatableCaption.of("condense.estimated_moves"),
TagResolver.resolver("user_move", Tag.inserting(Component.text(userMove)))
Template.of("userMove", String.valueOf(userMove))
);
player.sendMessage(TranslatableCaption.of("condense.eta"));
player.sendMessage(TranslatableCaption.of("condense.radius_measured"));
@ -278,10 +266,7 @@ public class Condense extends SubCommand {
}
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text("/plot condense " + area.getWorldName() + " <start | stop | info> [radius]"))
)
Template.of("value", "/plot condense " + area.getWorldName() + " <start | stop | info> [radius]")
);
return false;
}

View File

@ -29,9 +29,8 @@ import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.flag.PlotFlag;
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
import com.plotsquared.core.util.EventDispatcher;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import com.plotsquared.core.util.Permissions;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
@CommandDeclaration(command = "continue",
@ -54,12 +53,11 @@ public class Continue extends SubCommand {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false;
}
if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_CONTINUE)) {
if (!plot.isOwner(player.getUUID()) && !Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_CONTINUE)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver("node", Tag.inserting(
TranslatableCaption.of("permission.no_plot_perms").toComponent(player)
))
Template.of("node", TranslatableCaption.of("permission.no_plot_perms").getComponent(player))
);
return false;
}
@ -72,7 +70,7 @@ public class Continue extends SubCommand {
< player.getPlotCount() + size)) {
player.sendMessage(
TranslatableCaption.of("permission.cant_claim_more_plots"),
TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))
Template.of("amount", String.valueOf(player.getAllowedPlots()))
);
return false;
}
@ -86,7 +84,7 @@ public class Continue extends SubCommand {
if (event.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Done flag removal")))
Template.of("value", "Done flag removal")
);
return true;
}

View File

@ -23,9 +23,8 @@ import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import com.plotsquared.core.util.Permissions;
import net.kyori.adventure.text.minimessage.Template;
@CommandDeclaration(command = "copy",
permission = "plots.copy",
@ -43,14 +42,15 @@ public class Copy extends SubCommand {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));
return false;
}
if (!plot1.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN.toString())) {
if (!plot1.isOwner(player.getUUID()) && !Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN.toString())) {
player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
return false;
}
if (args.length != 1) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot copy <X;Z>")))
Template.of("value", "/plot copy <X;Z>")
);
return false;
}
@ -69,12 +69,8 @@ public class Copy extends SubCommand {
plot1.getPlotModificationManager().copy(plot2, player).thenAccept(result -> {
if (result) {
player.sendMessage(
TranslatableCaption.of("move.copy_success"),
TagResolver.builder()
.tag("origin", Tag.inserting(Component.text(plot1.toString())))
.tag("target", Tag.inserting(Component.text(plot2.toString())))
.build()
player.sendMessage(TranslatableCaption.of("move.copy_success"), Template.of("origin", String.valueOf(plot1)),
Template.of("target", String.valueOf(plot2))
);
} else {
player.sendMessage(TranslatableCaption.of("move.requires_unowned"));

View File

@ -25,9 +25,7 @@ import com.plotsquared.core.generator.HybridUtils;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
@CommandDeclaration(command = "createroadschematic",
@ -63,7 +61,7 @@ public class CreateRoadSchematic extends SubCommand {
this.hybridUtils.setupRoadSchematic(plot);
player.sendMessage(
TranslatableCaption.of("schematics.schematic_road_created"),
TagResolver.resolver("command", Tag.inserting(Component.text("/plot debugroadregen")))
Template.of("command", "/plot debugroadregen")
);
return true;
}

View File

@ -40,9 +40,7 @@ import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.FileUtils;
import com.plotsquared.core.util.query.PlotQuery;
import com.plotsquared.core.util.task.TaskManager;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.io.File;
@ -103,10 +101,7 @@ public class DatabaseCommand extends SubCommand {
if (args.length < 1) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text("/plot database [area] <sqlite | mysql | import>"))
)
Template.of("value", "/plot database [area] <sqlite | mysql | import>")
);
return false;
}
@ -121,7 +116,7 @@ public class DatabaseCommand extends SubCommand {
if (args.length < 1) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot database [area] <sqlite|mysql|import>")))
Template.of("value", "/plot database [area] <sqlite|mysql|import>")
);
player.sendMessage(TranslatableCaption.of("database.arg"));
return false;
@ -134,10 +129,7 @@ public class DatabaseCommand extends SubCommand {
if (args.length < 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text("/plot database import <sqlite file> [prefix]"))
)
Template.of("value", "/plot database import <sqlite file> [prefix]")
);
return false;
}
@ -148,7 +140,7 @@ public class DatabaseCommand extends SubCommand {
if (!file.exists()) {
player.sendMessage(
TranslatableCaption.of("database.does_not_exist"),
TagResolver.resolver("value", Tag.inserting(Component.text(file.toString())))
Template.of("value", String.valueOf(file))
);
return false;
}
@ -192,10 +184,8 @@ public class DatabaseCommand extends SubCommand {
}
player.sendMessage(
TranslatableCaption.of("database.skipping_duplicated_plot"),
TagResolver.builder()
.tag("plot", Tag.inserting(Component.text(plot.toString())))
.tag("id", Tag.inserting(Component.text(plot.temp)))
.build()
Template.of("plot", String.valueOf(plot)),
Template.of("id", String.valueOf(plot.temp))
);
continue;
}

View File

@ -29,12 +29,12 @@ import com.plotsquared.core.util.WorldUtil;
import com.plotsquared.core.util.entity.EntityCategories;
import com.plotsquared.core.util.entity.EntityCategory;
import com.plotsquared.core.util.query.PlotQuery;
import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.uuid.UUIDMapping;
import com.sk89q.worldedit.world.entity.EntityType;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.Collection;
@ -68,10 +68,7 @@ public class Debug extends SubCommand {
if (args.length == 0) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text("/plot debug <player | debug-players | entitytypes | msg>"))
)
Template.of("value", "/plot debug <loadedchunks | player | debug-players | entitytypes | msg>")
);
}
if (args.length > 0) {
@ -84,11 +81,21 @@ public class Debug extends SubCommand {
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])) {
final Collection<UUIDMapping> mappings = PlotSquared.get().getImpromptuUUIDPipeline().getAllImmediately();
player.sendMessage(
TranslatableCaption.of("debug.cached_uuids"),
TagResolver.resolver("value", Tag.inserting(Component.text(mappings.size())))
Template.of("value", String.valueOf(mappings.size()))
);
return true;
}
@ -97,7 +104,7 @@ public class Debug extends SubCommand {
for (final PlotPlayer<?> pp : PlotPlayer.getDebugModePlayers()) {
player.sendMessage(
TranslatableCaption.of("debug.player_in_debugmode_list"),
TagResolver.resolver("value", Tag.inserting(Component.text(pp.getName())))
Template.of("value", pp.getName())
);
}
return true;
@ -107,11 +114,10 @@ public class Debug extends SubCommand {
player.sendMessage(TranslatableCaption.of("debug.entity_categories"));
EntityCategory.REGISTRY.forEach(category -> {
final StringBuilder builder =
new StringBuilder("<gray>-</gray> <gold>").append(category.getId()).append("</gold><gray>: <gold>");
new StringBuilder("§7- §6").append(category.getId()).append("§7: §6");
for (final EntityType entityType : category.getAll()) {
builder.append(entityType.getId()).append(" ");
}
builder.append("</gold>");
player.sendMessage(StaticCaption.of("<prefix>" + builder));
});
EntityType.REGISTRY.values().stream().sorted(Comparator.comparing(EntityType::getId))
@ -131,53 +137,28 @@ public class Debug extends SubCommand {
.getCaptionMap(TranslatableCaption.DEFAULT_NAMESPACE)
.getCaptions();
TextComponent.Builder information = Component.text();
Component header = TranslatableCaption.of("debug.debug_header").toComponent(player)
.append(Component.newline());
Component header = MINI_MESSAGE.parse(TranslatableCaption.of("debug.debug_header").getComponent(player) + "\n");
String line = TranslatableCaption.of("debug.debug_line").getComponent(player) + "\n";
String section = TranslatableCaption.of("debug.debug_section").getComponent(player) + "\n";
information.append(header);
information.append(MINI_MESSAGE.deserialize(
section,
TagResolver.resolver("val", Tag.inserting(Component.text("PlotArea")))
));
information.append(MINI_MESSAGE.parse(section, Template.of("val", "PlotArea")));
information.append(MINI_MESSAGE
.deserialize(
.parse(
line,
TagResolver.builder()
.tag("var", Tag.inserting(Component.text("Plot Worlds")))
.tag(
"val",
Tag.inserting(Component.text(StringMan.join(
this.plotAreaManager.getAllPlotAreas(),
", "
)))
)
.build()
Template.of("var", "Plot Worlds"),
Template.of("val", StringMan.join(this.plotAreaManager.getAllPlotAreas(), ", "))
));
information.append(
MINI_MESSAGE.deserialize(
MINI_MESSAGE.parse(
line,
TagResolver.builder()
.tag("var", Tag.inserting(Component.text("Owned Plots")))
.tag(
"val",
Tag.inserting(Component.text(PlotQuery.newQuery().allPlots().count()))
)
.build()
Template.of("var", "Owned Plots"),
Template.of("val", String.valueOf(PlotQuery.newQuery().allPlots().count()))
));
information.append(MINI_MESSAGE.deserialize(
section,
TagResolver.resolver("val", Tag.inserting(Component.text("Messages")))
));
information.append(MINI_MESSAGE.deserialize(
information.append(MINI_MESSAGE.parse(section, Template.of("val", "Messages")));
information.append(MINI_MESSAGE.parse(
line,
TagResolver.builder()
.tag("var", Tag.inserting(Component.text("Total Messages")))
.tag(
"val",
Tag.inserting(Component.text(captions.size()))
)
.build()
Template.of("var", "Total Messages"),
Template.of("val", String.valueOf(captions.size()))
));
player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(information.build())));
return true;
@ -185,7 +166,7 @@ public class Debug extends SubCommand {
@Override
public Collection<Command> tab(final PlotPlayer<?> player, String[] args, boolean space) {
return Stream.of("debug-players", "entitytypes")
return Stream.of("loadedchunks", "debug-players", "entitytypes")
.filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH)))
.map(value -> new Command(null, false, value, "plots.admin", RequiredType.NONE, null) {
}).collect(Collectors.toList());

View File

@ -28,6 +28,7 @@ import com.plotsquared.core.generator.HybridUtils;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
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.flag.GlobalFlagContainer;
import com.plotsquared.core.plot.flag.PlotFlag;
@ -36,13 +37,12 @@ import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.StringMan;
import com.plotsquared.core.util.query.PlotQuery;
import com.plotsquared.core.util.task.RunnableVal;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
@ -97,7 +97,7 @@ public class DebugExec extends SubCommand {
if (analysis != null) {
player.sendMessage(
TranslatableCaption.of("debugexec.changes_column"),
TagResolver.resolver("value", Tag.inserting(Component.text(analysis.changes)))
Template.of("value", String.valueOf(analysis.changes))
);
return true;
}
@ -107,7 +107,7 @@ public class DebugExec extends SubCommand {
public void run(PlotAnalysis value) {
player.sendMessage(
TranslatableCaption.of("debugexec.analyze_done"),
TagResolver.resolver("command", Tag.inserting(Component.text("/plot debugexec analyze")))
Template.of("command", "/plot debugexec analyze")
);
}
});
@ -117,10 +117,7 @@ public class DebugExec extends SubCommand {
if (args.length != 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text("/plot debugexec analyze <threshold>"))
)
Template.of("value", "/plot debugexec analyze <threshold>")
);
player.sendMessage(TranslatableCaption.of("debugexec.threshold_default"));
return false;
@ -131,7 +128,7 @@ public class DebugExec extends SubCommand {
} catch (NumberFormatException ignored) {
player.sendMessage(
TranslatableCaption.of("debugexec.invalid_threshold"),
TagResolver.resolver("value", Tag.inserting(Component.text(args[1])))
Template.of("value", args[1])
);
player.sendMessage(TranslatableCaption.of("debugexec.threshold_default_double"));
return false;
@ -162,7 +159,7 @@ public class DebugExec extends SubCommand {
if (args.length != 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot debugexec remove-flag <flag>")))
Template.of("value", "/plot debugexec remove-flag <flag>")
);
return false;
}
@ -180,7 +177,7 @@ public class DebugExec extends SubCommand {
}
player.sendMessage(
TranslatableCaption.of("debugexec.cleared_flag"),
TagResolver.resolver("value", Tag.inserting(Component.text(flag)))
Template.of("value", flag)
);
return true;
}
@ -188,10 +185,7 @@ public class DebugExec extends SubCommand {
if (args.length != 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text("Invalid syntax: /plot debugexec start-rgar <world>"))
)
Template.of("value", "Invalid syntax: /plot debugexec start-rgar <world>")
);
return false;
}
@ -199,7 +193,7 @@ public class DebugExec extends SubCommand {
if (area == null) {
player.sendMessage(
TranslatableCaption.of("errors.not_valid_plot_world"),
TagResolver.resolver("value", Tag.inserting(Component.text(args[1])))
Template.of("value", args[1])
);
return false;
}

View File

@ -31,9 +31,7 @@ import com.plotsquared.core.inject.annotations.WorldFile;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.util.PremiumVerification;
import com.plotsquared.core.util.task.TaskManager;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.io.File;
@ -71,9 +69,9 @@ public class DebugPaste extends SubCommand {
StringBuilder b = new StringBuilder();
b.append(
"""
# Welcome to this paste
# It is meant to provide us at IntellectualSites with better information about your problem
"""
# Welcome to this paste
# It is meant to provide us at IntellectualSites with better information about your problem
"""
);
b.append("# PlotSquared Information\n");
b.append("PlotSquared Version: ").append(PlotSquared.get().getVersion())
@ -133,10 +131,8 @@ public class DebugPaste extends SubCommand {
} catch (IOException ignored) {
player.sendMessage(
TranslatableCaption.of("debugpaste.latest_log"),
TagResolver.builder()
.tag("file", Tag.inserting(Component.text("latest.log")))
.tag("size", Tag.inserting(Component.text("14MB")))
.build()
Template.of("file", "latest.log"),
Template.of("size", "14MB")
);
}
@ -145,7 +141,7 @@ public class DebugPaste extends SubCommand {
} catch (final IllegalArgumentException ignored) {
player.sendMessage(
TranslatableCaption.of("debugpaste.empty_file"),
TagResolver.resolver("file", Tag.inserting(Component.text("settings.yml")))
Template.of("file", "settings.yml")
);
}
try {
@ -153,7 +149,7 @@ public class DebugPaste extends SubCommand {
} catch (final IllegalArgumentException ignored) {
player.sendMessage(
TranslatableCaption.of("debugpaste.empty_file"),
TagResolver.resolver("file", Tag.inserting(Component.text("worlds.yml")))
Template.of("file", "worlds.yml")
);
}
@ -166,7 +162,7 @@ public class DebugPaste extends SubCommand {
} catch (final IOException ignored) {
player.sendMessage(
TranslatableCaption.of("debugpaste.skip_multiverse"),
TagResolver.resolver("file", Tag.inserting(Component.text("worlds.yml")))
Template.of("file", "worlds.yml")
);
}
@ -181,20 +177,20 @@ public class DebugPaste extends SubCommand {
String.format("https://athion.net/ISPaster/paste/view/%s", pasteId);
player.sendMessage(
TranslatableCaption.of("debugpaste.debug_report_created"),
TagResolver.resolver("url", Tag.preProcessParsed(link))
Template.of("url", link)
);
} else {
final String responseMessage = jsonObject.get("response").getAsString();
player.sendMessage(
TranslatableCaption.of("debugpaste.creation_failed"),
TagResolver.resolver("value", Tag.inserting(Component.text(responseMessage)))
Template.of("value", responseMessage)
);
}
} catch (final Throwable throwable) {
throwable.printStackTrace();
player.sendMessage(
TranslatableCaption.of("debugpaste.creation_failed"),
TagResolver.resolver("value", Tag.inserting(Component.text(throwable.getMessage())))
Template.of("value", throwable.getMessage())
);
}
} catch (IOException e) {

View File

@ -28,9 +28,7 @@ import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.PlotManager;
import com.plotsquared.core.queue.QueueCoordinator;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.Arrays;
@ -62,7 +60,7 @@ public class DebugRoadRegen extends SubCommand {
if (args.length < 1) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text(DebugRoadRegen.USAGE)))
Template.of("value", DebugRoadRegen.USAGE)
);
return false;
}
@ -75,19 +73,16 @@ public class DebugRoadRegen extends SubCommand {
}
String kind = args[0].toLowerCase();
switch (kind) {
case "plot" -> {
case "plot":
return regenPlot(player);
}
case "region" -> {
case "region":
return regenRegion(player, Arrays.copyOfRange(args, 1, args.length));
}
default -> {
default:
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text(DebugRoadRegen.USAGE)))
Template.of("value", DebugRoadRegen.USAGE)
);
return false;
}
}
}
@ -96,7 +91,6 @@ public class DebugRoadRegen extends SubCommand {
PlotArea area = location.getPlotArea();
if (area == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
return false;
}
Plot plot = player.getCurrentPlot();
if (plot == null) {
@ -109,11 +103,11 @@ public class DebugRoadRegen extends SubCommand {
queue.setCompleteTask(() -> {
player.sendMessage(
TranslatableCaption.of("debugroadregen.regen_done"),
TagResolver.resolver("value", Tag.inserting(Component.text(plot.getId().toString())))
Template.of("value", plot.getId().toString())
);
player.sendMessage(
TranslatableCaption.of("debugroadregen.regen_all"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot regenallroads")))
Template.of("value", "/plot regenallroads")
);
});
manager.createRoadEast(plot, queue);
@ -132,18 +126,18 @@ public class DebugRoadRegen extends SubCommand {
} catch (NumberFormatException ignored) {
player.sendMessage(
TranslatableCaption.of("invalid.not_valid_number"),
TagResolver.resolver("value", Tag.inserting(Component.text("0, 256")))
Template.of("value", "0, 256")
);
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text(DebugRoadRegen.USAGE)))
Template.of("value", DebugRoadRegen.USAGE)
);
return false;
}
} else if (args.length != 0) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text(DebugRoadRegen.USAGE)))
Template.of("value", DebugRoadRegen.USAGE)
);
return false;
}
@ -161,11 +155,11 @@ public class DebugRoadRegen extends SubCommand {
}
player.sendMessage(
TranslatableCaption.of("debugroadregen.schematic"),
TagResolver.resolver("command", Tag.inserting(Component.text("/plot createroadschematic")))
Template.of("command", "/plot createroadschematic")
);
player.sendMessage(
TranslatableCaption.of("debugroadregen.regenallroads"),
TagResolver.resolver("command", Tag.inserting(Component.text("/plot regenallroads")))
Template.of("command", "/plot regenallroads")
);
boolean result = this.hybridUtils.scheduleSingleRegionRoadUpdate(plot, height);
if (!result) {

View File

@ -30,11 +30,10 @@ import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.util.EconHandler;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PlotExpression;
import com.plotsquared.core.util.task.TaskManager;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
@ -79,12 +78,13 @@ public class Delete extends SubCommand {
if (eventResult == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Delete")))
Template.of("value", "Delete")
);
return true;
}
boolean force = eventResult == Result.FORCE;
if (!force && !plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DELETE)) {
if (!force && !plot.isOwner(player.getUUID()) && !Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DELETE)) {
player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
return false;
}
@ -114,17 +114,14 @@ public class Delete extends SubCommand {
this.econHandler.depositMoney(player, value);
player.sendMessage(
TranslatableCaption.of("economy.added_balance"),
TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(value))))
Template.of("money", this.econHandler.format(value))
);
}
}
player.sendMessage(
TranslatableCaption.of("working.deleting_done"),
TagResolver.resolver(
"amount",
Tag.inserting(Component.text(String.valueOf(System.currentTimeMillis() - start)))
),
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
Template.of("amount", String.valueOf(System.currentTimeMillis() - start)),
Template.of("plot", plot.getId().toString())
);
eventDispatcher.callPostDelete(plot);
});

View File

@ -30,13 +30,12 @@ import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PlayerManager;
import com.plotsquared.core.util.TabCompletions;
import com.plotsquared.core.util.WorldUtil;
import com.sk89q.worldedit.world.gamemode.GameModes;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.Collection;
@ -80,17 +79,18 @@ public class Deny extends SubCommand {
player.sendMessage(TranslatableCaption.of("info.plot_unowned"));
return false;
}
if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DENY)) {
if (!plot.isOwner(player.getUUID()) && !Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DENY)) {
player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
return true;
}
int maxDenySize = player.hasPermissionRange(Permission.PERMISSION_DENY, Settings.Limit.MAX_PLOTS);
int maxDenySize = Permissions.hasPermissionRange(player, Permission.PERMISSION_DENY, Settings.Limit.MAX_PLOTS);
int size = plot.getDenied().size();
if (size >= maxDenySize) {
player.sendMessage(
TranslatableCaption.of("members.plot_max_members_denied"),
TagResolver.resolver("amount", Tag.inserting(Component.text(size)))
Template.of("amount", String.valueOf(size))
);
return false;
}
@ -101,15 +101,16 @@ public class Deny extends SubCommand {
} else if (throwable != null || uuids.isEmpty()) {
player.sendMessage(
TranslatableCaption.of("errors.invalid_player"),
TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
Template.of("value", args[0])
);
} else {
for (UUID uuid : uuids) {
if (uuid == DBFunc.EVERYONE && !(
player.hasPermission(Permission.PERMISSION_DENY_EVERYONE) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DENY))) {
Permissions.hasPermission(player, Permission.PERMISSION_DENY_EVERYONE) || Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DENY))) {
player.sendMessage(
TranslatableCaption.of("errors.invalid_player"),
TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
Template.of("value", args[0])
);
} else if (plot.isOwner(uuid)) {
player.sendMessage(TranslatableCaption.of("deny.cant_remove_owner"));
@ -117,11 +118,7 @@ public class Deny extends SubCommand {
} else if (plot.getDenied().contains(uuid)) {
player.sendMessage(
TranslatableCaption.of("member.already_added"),
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"player",
Tag.inserting(caption.toComponent(player))
))
Template.of("player", PlayerManager.resolveName(uuid).getComponent(player))
);
return;
} else {

View File

@ -27,9 +27,7 @@ import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.flag.implementations.DescriptionFlag;
import com.plotsquared.core.util.EventDispatcher;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
@CommandDeclaration(command = "setdescription",
@ -56,7 +54,7 @@ public class Desc extends SetCommand {
if (event.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Description removal")))
Template.of("value", "Description removal")
);
return false;
}
@ -71,7 +69,7 @@ public class Desc extends SetCommand {
if (event.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Description set")))
Template.of("value", "Description set")
);
return false;
}

View File

@ -21,6 +21,7 @@ package com.plotsquared.core.command;
import com.google.inject.Inject;
import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.TabCompletions;
import org.checkerframework.checker.nullness.qual.NonNull;
@ -53,7 +54,7 @@ public class Dislike extends SubCommand {
public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
if (args.length == 1) {
final List<String> completions = new LinkedList<>();
if (player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS)) {
completions.add("purge");
}
final List<Command> commands = completions.stream().filter(completion -> completion
@ -61,7 +62,7 @@ public class Dislike extends SubCommand {
.startsWith(args[0].toLowerCase()))
.map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) {
}).collect(Collectors.toCollection(LinkedList::new));
if (player.hasPermission(Permission.PERMISSION_RATE) && args[0].length() > 0) {
if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
}
return commands;

View File

@ -34,10 +34,9 @@ import com.plotsquared.core.plot.expiration.PlotAnalysis;
import com.plotsquared.core.plot.flag.PlotFlag;
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.task.RunnableVal;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
@CommandDeclaration(command = "done",
@ -71,12 +70,13 @@ public class Done extends SubCommand {
if (event.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Done")))
Template.of("value", "Done")
);
return true;
}
boolean force = event.getEventResult() == Result.FORCE;
if (!force && !plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DONE)) {
if (!force && !plot.isOwner(player.getUUID()) && !Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DONE)) {
player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
return false;
}
@ -91,10 +91,10 @@ public class Done extends SubCommand {
plot.addRunning();
player.sendMessage(
TranslatableCaption.of("web.generating_link"),
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
Template.of("plot", plot.getId().toString())
);
final Settings.Auto_Clear doneRequirements = Settings.AUTO_CLEAR.get("done");
if (PlotSquared.platform().expireManager() == null || doneRequirements == null || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DONE)) {
if (PlotSquared.platform().expireManager() == null || doneRequirements == null) {
finish(plot, player, true);
plot.removeRunning();
} else {
@ -103,7 +103,7 @@ public class Done extends SubCommand {
public void run(PlotAnalysis value) {
plot.removeRunning();
boolean result =
value.getComplexity(doneRequirements) >= doneRequirements.THRESHOLD;
value.getComplexity(doneRequirements) <= doneRequirements.THRESHOLD;
finish(plot, player, result);
}
});

View File

@ -20,21 +20,21 @@ package com.plotsquared.core.command;
import com.google.inject.Inject;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.StaticCaption;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PlotUploader;
import com.plotsquared.core.util.SchematicHandler;
import com.plotsquared.core.util.StringMan;
import com.plotsquared.core.util.TabCompletions;
import com.plotsquared.core.util.WorldUtil;
import com.plotsquared.core.util.task.RunnableVal;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.net.URL;
@ -87,11 +87,13 @@ public class Download extends SubCommand {
player.sendMessage(TranslatableCaption.of("info.plot_unowned"));
return false;
}
if ((Settings.Done.REQUIRED_FOR_DOWNLOAD && !DoneFlag.isDone(plot)) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DOWNLOAD)) {
if ((Settings.Done.REQUIRED_FOR_DOWNLOAD && !DoneFlag.isDone(plot)) && !Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DOWNLOAD)) {
player.sendMessage(TranslatableCaption.of("done.done_not_done"));
return false;
}
if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN.toString())) {
if (!plot.isOwner(player.getUUID()) && !Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN.toString())) {
player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
return false;
}
@ -109,13 +111,10 @@ public class Download extends SubCommand {
upload(player, plot);
} else if (args.length == 1 && StringMan
.isEqualIgnoreCaseToAny(args[0], "mcr", "world", "mca")) {
if (!player.hasPermission(Permission.PERMISSION_DOWNLOAD_WORLD)) {
if (!Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD_WORLD)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Permission.PERMISSION_DOWNLOAD_WORLD)
)
Template.of("node", Permission.PERMISSION_DOWNLOAD_WORLD.toString())
);
return false;
}
@ -129,26 +128,18 @@ public class Download extends SubCommand {
if (url == null) {
player.sendMessage(
TranslatableCaption.of("web.generating_link_failed"),
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
Template.of("plot", plot.getId().toString())
);
return;
}
player.sendMessage(
TranslatableCaption.of("web.generation_link_success_legacy_world"),
TagResolver.builder()
.tag("url", Tag.preProcessParsed(url.toString()))
.build()
);
player.sendMessage(TranslatableCaption.of("web.generation_link_success_legacy_world"), Template.of("url", url.toString()));
}
});
} else {
sendUsage(player);
return false;
}
player.sendMessage(
TranslatableCaption.of("web.generating_link"),
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
);
player.sendMessage(TranslatableCaption.of("web.generating_link"), Template.of("plot", plot.getId().toString()));
return true;
}
@ -156,10 +147,10 @@ public class Download extends SubCommand {
public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
if (args.length == 1) {
final List<String> completions = new LinkedList<>();
if (player.hasPermission(Permission.PERMISSION_DOWNLOAD)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD)) {
completions.add("schem");
}
if (player.hasPermission(Permission.PERMISSION_DOWNLOAD_WORLD)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD_WORLD)) {
completions.add("world");
}
final List<Command> commands = completions.stream().filter(completion -> completion
@ -174,7 +165,7 @@ public class Download extends SubCommand {
CommandCategory.ADMINISTRATION
) {
}).collect(Collectors.toCollection(LinkedList::new));
if (player.hasPermission(Permission.PERMISSION_DOWNLOAD) && args[0].length() > 0) {
if (Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
}
return commands;
@ -186,24 +177,20 @@ public class Download extends SubCommand {
if (Settings.Web.LEGACY_WEBINTERFACE) {
schematicHandler
.getCompoundTag(plot)
.whenComplete((compoundTag, throwable) -> schematicHandler.upload(
compoundTag,
null,
null,
new RunnableVal<>() {
@Override
public void run(URL value) {
plot.removeRunning();
player.sendMessage(
TranslatableCaption.of("web.generation_link_success"),
TagResolver.builder()
.tag("download", Tag.preProcessParsed(value.toString()))
.tag("delete", Tag.preProcessParsed("Not available"))
.build()
);
}
.whenComplete((compoundTag, throwable) -> {
schematicHandler.upload(compoundTag, null, null, new RunnableVal<>() {
@Override
public void run(URL value) {
plot.removeRunning();
player.sendMessage(
TranslatableCaption.of("web.generation_link_success"),
Template.of("download", value.toString()),
Template.of("delete", "Not available")
);
player.sendMessage(StaticCaption.of(value.toString()));
}
));
});
});
return;
}
// TODO legacy support
@ -212,15 +199,13 @@ public class Download extends SubCommand {
if (throwable != null || !result.isSuccess()) {
player.sendMessage(
TranslatableCaption.of("web.generating_link_failed"),
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
Template.of("plot", plot.getId().toString())
);
} else {
player.sendMessage(
TranslatableCaption.of("web.generation_link_success"),
TagResolver.builder()
.tag("download", Tag.preProcessParsed(result.getDownloadUrl()))
.tag("delete", Tag.preProcessParsed(result.getDeletionUrl()))
.build()
Template.of("download", result.getDownloadUrl()),
Template.of("delete", result.getDeletionUrl())
);
}
});

View File

@ -23,6 +23,7 @@ import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.CaptionUtility;
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.events.PlotFlagAddEvent;
import com.plotsquared.core.events.PlotFlagRemoveEvent;
@ -39,6 +40,7 @@ import com.plotsquared.core.plot.flag.types.IntegerFlag;
import com.plotsquared.core.plot.flag.types.ListFlag;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.StringComparison;
import com.plotsquared.core.util.StringMan;
import com.plotsquared.core.util.helpmenu.HelpMenu;
@ -46,9 +48,7 @@ import com.plotsquared.core.util.task.RunnableVal2;
import com.plotsquared.core.util.task.RunnableVal3;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
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 net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
@ -85,10 +85,7 @@ public final class FlagCommand extends Command {
private static boolean sendMessage(PlotPlayer<?> player) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text("/plot flag <set | remove | add | list | info> <flag> <value>"))
)
Template.of("value", "/plot flag <set | remove | add | list | info> <flag> <value>")
);
return true;
}
@ -103,10 +100,9 @@ public final class FlagCommand extends Command {
if (flag instanceof IntegerFlag && MathMan.isInteger(value)) {
try {
int numeric = Integer.parseInt(value);
// Getting full permission without ".<amount>" at the end
perm = perm.substring(0, perm.length() - value.length() - 1);
boolean result = false;
if (numeric >= 0) {
if (numeric > 0) {
int checkRange = PlotSquared.get().getPlatform().equalsIgnoreCase("bukkit") ?
numeric :
Settings.Limit.MAX_PLOTS;
@ -115,9 +111,9 @@ public final class FlagCommand extends Command {
if (!result) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
Template.of(
"node",
Tag.inserting(Component.text(perm + "." + numeric))
perm + "." + numeric
)
);
}
@ -132,23 +128,18 @@ public final class FlagCommand extends Command {
key.toLowerCase(),
entry.toString().toLowerCase()
);
final boolean result = player.hasPermission(permission);
final boolean result = Permissions.hasPermission(player, permission);
if (!result) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver("node", Tag.inserting(Component.text(permission)))
);
player.sendMessage(TranslatableCaption.of("permission.no_permission"), Template.of("node", permission));
return false;
}
}
} catch (final FlagParseException e) {
player.sendMessage(
TranslatableCaption.of("flag.flag_parse_error"),
TagResolver.builder()
.tag("flag_name", Tag.inserting(Component.text(flag.getName())))
.tag("flag_value", Tag.inserting(Component.text(e.getValue())))
.tag("error", Tag.inserting(e.getErrorMessage().toComponent(player)))
.build()
Template.of("flag_name", flag.getName()),
Template.of("flag_value", e.getValue()),
Template.of("error", e.getErrorMessage().getComponent(player))
);
return false;
} catch (final Exception e) {
@ -159,16 +150,13 @@ public final class FlagCommand extends Command {
boolean result;
String basePerm = Permission.PERMISSION_SET_FLAG_KEY.format(key.toLowerCase());
if (flag.isValuedPermission()) {
result = player.hasKeyedPermission(basePerm, value);
result = Permissions.hasKeyedPermission(player, basePerm, value);
} else {
result = player.hasPermission(basePerm);
result = Permissions.hasPermission(player, basePerm);
perm = basePerm;
}
if (!result) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver("node", Tag.inserting(Component.text(perm)))
);
player.sendMessage(TranslatableCaption.of("permission.no_permission"), Template.of("node", perm));
}
return result;
}
@ -189,10 +177,11 @@ public final class FlagCommand extends Command {
player.sendMessage(TranslatableCaption.of("working.plot_not_claimed"));
return false;
}
if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_SET_FLAG_OTHER)) {
if (!plot.isOwner(player.getUUID()) && !Permissions
.hasPermission(player, Permission.PERMISSION_SET_FLAG_OTHER)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_SET_FLAG_OTHER))
Template.of("node", String.valueOf(Permission.PERMISSION_SET_FLAG_OTHER))
);
return false;
}
@ -227,7 +216,7 @@ public final class FlagCommand extends Command {
if (best != null) {
player.sendMessage(
TranslatableCaption.of("flag.not_valid_flag_suggested"),
TagResolver.resolver("value", Tag.inserting(Component.text(best)))
Template.of("value", best)
);
suggested = true;
}
@ -336,7 +325,7 @@ public final class FlagCommand extends Command {
if (args.length < 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot flag set <flag> <value>")))
Template.of("value", "/plot flag set <flag> <value>")
);
return;
}
@ -349,7 +338,7 @@ public final class FlagCommand extends Command {
if (event.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Flag set")))
Template.of("value", "Flag set")
);
return;
}
@ -365,21 +354,15 @@ public final class FlagCommand extends Command {
} catch (final FlagParseException e) {
player.sendMessage(
TranslatableCaption.of("flag.flag_parse_error"),
TagResolver.builder()
.tag("flag_name", Tag.inserting(Component.text(plotFlag.getName())))
.tag("flag_value", Tag.inserting(Component.text(e.getValue())))
.tag("error", Tag.inserting(e.getErrorMessage().toComponent(player)))
.build()
Template.of("flag_name", plotFlag.getName()),
Template.of("flag_value", e.getValue()),
Template.of("error", e.getErrorMessage().getComponent(player))
);
return;
}
plot.setFlag(parsed);
player.sendMessage(
TranslatableCaption.of("flag.flag_added"),
TagResolver.builder()
.tag("flag", Tag.inserting(Component.text(args[0])))
.tag("value", Tag.inserting(Component.text(parsed.toString())))
.build()
player.sendMessage(TranslatableCaption.of("flag.flag_added"), Template.of("flag", String.valueOf(args[0])),
Template.of("value", String.valueOf(parsed))
);
}
@ -401,7 +384,7 @@ public final class FlagCommand extends Command {
if (args.length < 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot flag add <flag> <values>")))
Template.of("value", "/plot flag add <flag> <values>")
);
return;
}
@ -414,7 +397,7 @@ public final class FlagCommand extends Command {
if (event.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Flag add")))
Template.of("value", "Flag add")
);
return;
}
@ -435,11 +418,9 @@ public final class FlagCommand extends Command {
} catch (FlagParseException e) {
player.sendMessage(
TranslatableCaption.of("flag.flag_parse_error"),
TagResolver.builder()
.tag("flag_name", Tag.inserting(Component.text(plotFlag.getName())))
.tag("flag_value", Tag.inserting(Component.text(e.getValue())))
.tag("error", Tag.inserting(e.getErrorMessage().toComponent(player)))
.build()
Template.of("flag_name", plotFlag.getName()),
Template.of("flag_value", e.getValue()),
Template.of("error", e.getErrorMessage().getComponent(player))
);
return;
}
@ -449,12 +430,8 @@ public final class FlagCommand extends Command {
player.sendMessage(TranslatableCaption.of("flag.flag_not_added"));
return;
}
player.sendMessage(
TranslatableCaption.of("flag.flag_added"),
TagResolver.builder()
.tag("flag", Tag.inserting(Component.text(args[0])))
.tag("value", Tag.inserting(Component.text(parsed.toString())))
.build()
player.sendMessage(TranslatableCaption.of("flag.flag_added"), Template.of("flag", String.valueOf(args[0])),
Template.of("value", String.valueOf(parsed))
);
}
@ -476,7 +453,7 @@ public final class FlagCommand extends Command {
if (args.length != 1 && args.length != 2) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot flag remove <flag> [values]")))
Template.of("value", "/plot flag remove <flag> [values]")
);
return;
}
@ -490,20 +467,17 @@ public final class FlagCommand extends Command {
if (event.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Flag remove")))
Template.of("value", "Flag remove")
);
return;
}
boolean force = event.getEventResult() == Result.FORCE;
flag = event.getFlag();
if (!force && !player.hasPermission(Permission.PERMISSION_SET_FLAG_KEY.format(args[0].toLowerCase()))) {
if (!force && !Permissions.hasPermission(player, Permission.PERMISSION_SET_FLAG_KEY.format(args[0].toLowerCase()))) {
if (args.length != 2) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver(
"node",
Tag.inserting(Component.text(Permission.PERMISSION_SET_FLAG_KEY.format(args[0].toLowerCase())))
)
Template.of("node", Permission.PERMISSION_SET_FLAG_KEY.format(args[0].toLowerCase()))
);
return;
}
@ -518,11 +492,9 @@ public final class FlagCommand extends Command {
} catch (final FlagParseException e) {
player.sendMessage(
TranslatableCaption.of("flag.flag_parse_error"),
TagResolver.builder()
.tag("flag_name", Tag.inserting(Component.text(flag.getName())))
.tag("flag_value", Tag.inserting(Component.text(e.getValue())))
.tag("error", Tag.inserting(e.getErrorMessage().toComponent(player)))
.build()
Template.of("flag_name", flag.getName()),
Template.of("flag_value", e.getValue()),
Template.of("error", String.valueOf(e.getErrorMessage()))
);
return;
}
@ -533,13 +505,10 @@ public final class FlagCommand extends Command {
if (list.removeAll((List) parsedFlag.getValue())) {
if (list.isEmpty()) {
if (plot.removeFlag(flag)) {
player.sendMessage(
TranslatableCaption.of("flag.flag_removed"),
TagResolver.builder()
.tag("flag", Tag.inserting(Component.text(args[0])))
.tag("value", Tag.inserting(Component.text(flag.toString())))
.build()
);
player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of(
"value",
String.valueOf(flagWithOldValue)
));
return;
} else {
player.sendMessage(TranslatableCaption.of("flag.flag_not_removed"));
@ -551,10 +520,7 @@ public final class FlagCommand extends Command {
if (addEvent.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text("Re-addition of " + plotFlag.getName()))
)
Template.of("value", "Re-addition of " + plotFlag.getName())
);
return;
}
@ -577,13 +543,10 @@ public final class FlagCommand extends Command {
return;
}
}
player.sendMessage(
TranslatableCaption.of("flag.flag_removed"),
TagResolver.builder()
.tag("flag", Tag.inserting(Component.text(args[0])))
.tag("value", Tag.inserting(Component.text(flag.toString())))
.build()
);
player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of(
"value",
String.valueOf(flagWithOldValue)
));
}
@CommandDeclaration(command = "list",
@ -601,35 +564,34 @@ public final class FlagCommand extends Command {
return;
}
final Map<Component, ArrayList<String>> flags = new HashMap<>();
final Map<String, ArrayList<String>> flags = new HashMap<>();
for (PlotFlag<?, ?> plotFlag : GlobalFlagContainer.getInstance().getRecognizedPlotFlags()) {
if (plotFlag instanceof InternalFlag) {
continue;
}
final Component category = plotFlag.getFlagCategory().toComponent(player);
final Collection<String> flagList = flags.computeIfAbsent(category, k -> new ArrayList<>());
final String category = MINI_MESSAGE.stripTokens(plotFlag.getFlagCategory().getComponent(player));
final Collection<String> flagList =
flags.computeIfAbsent(category, k -> new ArrayList<>());
flagList.add(plotFlag.getName());
}
for (final Map.Entry<Component, ArrayList<String>> entry : flags.entrySet()) {
for (final Map.Entry<String, ArrayList<String>> entry : flags.entrySet()) {
Collections.sort(entry.getValue());
Component category =
MINI_MESSAGE.deserialize(
MINI_MESSAGE.parse(
TranslatableCaption.of("flag.flag_list_categories").getComponent(player),
TagResolver.resolver("category", Tag.inserting(entry.getKey().style(Style.empty())))
Template.of("category", entry.getKey())
);
TextComponent.Builder builder = Component.text().append(category);
final Iterator<String> flagIterator = entry.getValue().iterator();
while (flagIterator.hasNext()) {
final String flag = flagIterator.next();
builder.append(MINI_MESSAGE
.deserialize(
.parse(
TranslatableCaption.of("flag.flag_list_flag").getComponent(player),
TagResolver.builder()
.tag("command", Tag.preProcessParsed("/plot flag info " + flag))
.tag("flag", Tag.inserting(Component.text(flag)))
.tag("suffix", Tag.inserting(Component.text(flagIterator.hasNext() ? ", " : "")))
.build()
Template.of("command", "/plot flag info " + flag),
Template.of("flag", flag),
Template.of("suffix", flagIterator.hasNext() ? ", " : "")
));
}
player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.build())));
@ -653,7 +615,7 @@ public final class FlagCommand extends Command {
if (args.length < 1) {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot flag info <flag>")))
Template.of("value", "/plot flag info <flag>")
);
return;
}
@ -661,17 +623,11 @@ public final class FlagCommand extends Command {
if (plotFlag != null) {
player.sendMessage(TranslatableCaption.of("flag.flag_info_header"));
// Flag name
player.sendMessage(
TranslatableCaption.of("flag.flag_info_name"),
TagResolver.resolver("flag", Tag.inserting(Component.text(plotFlag.getName())))
);
player.sendMessage(TranslatableCaption.of("flag.flag_info_name"), Template.of("flag", plotFlag.getName()));
// Flag category
player.sendMessage(
TranslatableCaption.of("flag.flag_info_category"),
TagResolver.resolver(
"value",
Tag.inserting(plotFlag.getFlagCategory().toComponent(player))
)
Templates.of(player, "value", plotFlag.getFlagCategory())
);
// Flag description
// TODO maybe merge and \n instead?
@ -680,18 +636,16 @@ public final class FlagCommand extends Command {
// Flag example
player.sendMessage(
TranslatableCaption.of("flag.flag_info_example"),
TagResolver.builder()
.tag("command", Tag.preProcessParsed("/plot flag set"))
.tag("flag", Tag.preProcessParsed(plotFlag.getName()))
.tag("value", Tag.preProcessParsed(plotFlag.getExample()))
.build()
Template.of("command", "/plot flag set"),
Template.of("flag", plotFlag.getName()),
Template.of("value", plotFlag.getExample())
);
// Default value
final String defaultValue = player.getLocation().getPlotArea().getFlagContainer()
.getFlagErased(plotFlag.getClass()).toString();
player.sendMessage(
TranslatableCaption.of("flag.flag_info_default_value"),
TagResolver.resolver("value", Tag.inserting(Component.text(defaultValue)))
Template.of("value", defaultValue)
);
// Footer. Done this way to prevent the duplicate-message-thingy from catching it
player.sendMessage(TranslatableCaption.of("flag.flag_info_footer"));

View File

@ -26,14 +26,13 @@ import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.MetaDataAccess;
import com.plotsquared.core.player.PlayerMetaDataKeys;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PlayerManager;
import com.plotsquared.core.util.TabCompletions;
import com.plotsquared.core.util.task.RunnableVal;
import com.plotsquared.core.util.task.RunnableVal2;
import com.plotsquared.core.util.task.RunnableVal3;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.Template;
import java.util.Collection;
import java.util.Collections;
@ -65,15 +64,15 @@ public class Grant extends Command {
checkTrue(
args.length >= 1 && args.length <= 2,
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text("/plot grant <check | add> [player]")))
Template.of("value", "/plot grant <check | add> [player]")
);
final String arg0 = args[0].toLowerCase();
switch (arg0) {
case "add", "check" -> {
if (!player.hasPermission(Permission.PERMISSION_GRANT.format(arg0))) {
if (!Permissions.hasPermission(player, Permission.PERMISSION_GRANT.format(arg0))) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver("node", Tag.inserting(Component.text(Permission.PERMISSION_GRANT.format(arg0))))
Template.of("node", Permission.PERMISSION_GRANT.format(arg0))
);
return CompletableFuture.completedFuture(false);
}
@ -86,7 +85,7 @@ public class Grant extends Command {
} else if (throwable != null || uuids.size() != 1) {
player.sendMessage(
TranslatableCaption.of("errors.invalid_player"),
TagResolver.resolver("value", Tag.inserting(Component.text(String.valueOf(uuids))))
Template.of("value", String.valueOf(uuids))
);
} else {
final UUID uuid = uuids.iterator().next();
@ -97,7 +96,7 @@ public class Grant extends Command {
if (args[0].equalsIgnoreCase("check")) {
player.sendMessage(
TranslatableCaption.of("grants.granted_plots"),
TagResolver.resolver("amount", Tag.inserting(Component.text(access.get().orElse(0))))
Template.of("amount", String.valueOf(access.get().orElse(0)))
);
} else {
access.set(access.get().orElse(0) + 1);
@ -117,7 +116,7 @@ public class Grant extends Command {
}
player.sendMessage(
TranslatableCaption.of("grants.granted_plots"),
TagResolver.resolver("amount", Tag.inserting(Component.text(granted)))
Template.of("amount", String.valueOf(granted))
);
} else { // add
int amount;
@ -132,7 +131,7 @@ public class Grant extends Command {
DBFunc.addPersistentMeta(uuid, key, rawData, replace);
player.sendMessage(
TranslatableCaption.of("grants.added"),
TagResolver.resolver("grants", Tag.inserting(Component.text(amount)))
Template.of("grants", String.valueOf(amount))
);
}
}
@ -151,10 +150,10 @@ public class Grant extends Command {
public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
if (args.length == 1) {
final List<String> completions = new LinkedList<>();
if (player.hasPermission(Permission.PERMISSION_GRANT_ADD)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_GRANT_ADD)) {
completions.add("add");
}
if (player.hasPermission(Permission.PERMISSION_GRANT_CHECK)) {
if (Permissions.hasPermission(player, Permission.PERMISSION_GRANT_CHECK)) {
completions.add("check");
}
final List<Command> commands = completions.stream().filter(completion -> completion
@ -169,7 +168,7 @@ public class Grant extends Command {
CommandCategory.ADMINISTRATION
) {
}).collect(Collectors.toCollection(LinkedList::new));
if (player.hasPermission(Permission.PERMISSION_GRANT_SINGLE) && args[0].length() > 0) {
if (Permissions.hasPermission(player, Permission.PERMISSION_GRANT_SINGLE) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
}
return commands;

Some files were not shown because too many files have changed in this diff Show More