diff --git a/.editorconfig b/.editorconfig index 16b2c7ec4..b349e7425 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,40 +13,6 @@ 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 @@ -277,63 +243,12 @@ 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 @@ -342,548 +257,6 @@ 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 @@ -963,7 +336,8 @@ ij_kotlin_wrap_elvis_expressions = 1 ij_kotlin_wrap_expression_body_functions = 0 ij_kotlin_wrap_first_method_in_call_chain = false -[{*.har, *.jsb2, *.jsb3, *.json, .babelrc, .eslintrc, .stylelintrc, bowerrc, jest.config, mcmod.info}] + +[*.json] indent_size = 2 ij_json_keep_blank_lines_in_code = 0 ij_json_keep_indents_on_empty_lines = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..4c7cc4031 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +* text=auto + +*.java text +*.jar binary diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index ce357a5ab..06fa996c7 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -8,7 +8,7 @@ body: 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.github.io/plotsquared-documentation/). - Do NOT use the public issue tracker to report security vulnerabilities! They are disclosed using [this](https://forms.gle/btgdRn9yhGtzEiGW8) form! + Do NOT use the public issue tracker to report security vulnerabilities! They are disclosed using [this](https://github.com/IntellectualSites/PlotSquared/security/policy) GitHub form! - type: dropdown attributes: @@ -27,10 +27,15 @@ 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.1' + - '1.20' + - '1.19.4' + - '1.19.3' + - '1.19.2' + - '1.19.1' - '1.19' - '1.18.2' - '1.18.1' - - '1.18' - '1.17.1' - '1.16.5' validations: diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 000000000..a9e88c73c --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,13 @@ +{ + "$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"] +} diff --git a/.github/workflows/announce-release-on-discord.yml b/.github/workflows/announce-release-on-discord.yml new file mode 100644 index 000000000..8a25d0c1d --- /dev/null +++ b/.github/workflows/announce-release-on-discord.yml @@ -0,0 +1,24 @@ +name: Announce release on discord +on: + release: + types: [ published ] +jobs: + send_announcement: + runs-on: ubuntu-latest + steps: + - name: send custom message with args + env: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} + DISCORD_USERNAME: PlotSquared Release + DISCORD_AVATAR: https://raw.githubusercontent.com/IntellectualSites/Assets/main/plugins/PlotSquared/PlotSquared.png + uses: Ilshidur/action-discord@0.3.2 + with: + args: | + "<@&525015541815967744> <@&679322738552471574> <@&699293353862496266>" + "" + "<:plotsquared:730750385886593039> **PlotSquared ${{ github.event.release.tag_name }} has been released!**" + "" + "Click here to view changelog: https://github.com/IntellectualSites/PlotSquared/releases/tag/${{ github.event.release.tag_name }}" + "" + "The download is available at:" + "- Spigot: " diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml new file mode 100644 index 000000000..02b69cabc --- /dev/null +++ b/.github/workflows/build-pr.yml @@ -0,0 +1,21 @@ +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@v3 + - name: Validate Gradle Wrapper + uses: gradle/wrapper-validation-action@v1 + - name: Setup Java + uses: actions/setup-java@v3 + with: + distribution: temurin + java-version: 17 + - name: Clean Build + run: ./gradlew clean build diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bee920ea9..4a9dd532d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,15 +1,16 @@ name: build - -on: [ pull_request, push ] - +on: + push: + branches: + - main jobs: build: - if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }} + if: github.repository_owner == 'IntellectualSites' runs-on: ubuntu-latest steps: - name: Checkout Repository uses: actions/checkout@v3 - - name: Validate Gradle Wrapper" + - name: Validate Gradle Wrapper uses: gradle/wrapper-validation-action@v1 - name: Setup Java uses: actions/setup-java@v3 @@ -27,7 +28,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/v6'}} + if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}} run: ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository env: ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }} @@ -35,13 +36,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/v6' }} + if: ${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main' }} 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/v6'}} + # if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}} uses: cpina/github-action-push-to-another-repository@main env: SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }} @@ -51,9 +52,9 @@ jobs: destination-repository-name: 'plotsquared-javadocs' user-email: ${{ secrets.USER_EMAIL }} target-branch: main - target-directory: core + target-directory: v7/core - name: Publish bukkit javadoc - if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v6'}} + # if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}} uses: cpina/github-action-push-to-another-repository@main env: SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }} @@ -63,4 +64,4 @@ jobs: destination-repository-name: 'plotsquared-javadocs' user-email: ${{ secrets.USER_EMAIL }} target-branch: main - target-directory: bukkit + target-directory: v7/bukkit diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 42526cb92..1499881ec 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,11 +1,10 @@ name: "CodeQL" - on: push: - branches: [ v6 ] + branches: [ main ] pull_request: # The branches below must be a subset of the branches above - branches: [ v6 ] + branches: [ main ] jobs: analyze: @@ -15,23 +14,23 @@ jobs: actions: read contents: read security-events: write - strategy: fail-fast: false matrix: language: [ 'java' ] - steps: - name: Checkout repository uses: actions/checkout@v3 - + - name: Setup Java + uses: actions/setup-java@v3 + with: + distribution: temurin + java-version: 17 - name: Initialize CodeQL uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} - - name: Autobuild uses: github/codeql-action/autobuild@v2 - - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 6fa4b5347..2ad2264cf 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -1,14 +1,12 @@ name: draft release - on: push: branches: - - v6 + - main 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 }} diff --git a/.gitignore b/.gitignore index b0ccc3fff..0b17ea5b1 100644 --- a/.gitignore +++ b/.gitignore @@ -137,3 +137,7 @@ docs/ build/ .DS_Store +# Ignore run folders +run-[0-0].[0-9]/ +run-[0-0].[0-9].[0-9]/ + diff --git a/.idea/icon.svg b/.idea/icon.svg index 3bb9aa1aa..2be05c325 100644 --- a/.idea/icon.svg +++ b/.idea/icon.svg @@ -1,48 +1,144 @@ - - + + - + image/svg+xml - + - - - + + + - - - - - - + + + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + diff --git a/Bukkit/build.gradle.kts b/Bukkit/build.gradle.kts index 5b9bcbf21..abc3cea42 100644 --- a/Bukkit/build.gradle.kts +++ b/Bukkit/build.gradle.kts @@ -18,13 +18,13 @@ repositories { } dependencies { - api(projects.plotSquaredCore) + api(projects.plotsquaredCore) // Metrics implementation("org.bstats:bstats-bukkit") // Paper - compileOnly(libs.paper) + compileOnly("io.papermc.paper:paper-api") implementation("io.papermc:paperlib") // Plugins @@ -48,7 +48,6 @@ dependencies { // Our libraries implementation(libs.arkitektonika) - implementation(libs.http4j) implementation("com.intellectualsites.paster:Paster") implementation("com.intellectualsites.informative-annotations:informative-annotations") @@ -63,6 +62,7 @@ tasks.processResources { } tasks.named("shadowJar") { + dependsOn(":plotsquared-core:shadowJar") dependencies { exclude(dependency("org.checkerframework:")) } @@ -88,7 +88,7 @@ tasks.named("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.informative-annotations", "com.plotsquared.core.annotation.informative") + relocate("com.intellectualsites.annotations", "com.plotsquared.core.annotations.informative") // Get rid of all the libs which are 100% unused. minimize() @@ -98,13 +98,19 @@ tasks.named("shadowJar") { tasks { withType { + 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.18/") + opt.links("https://jd.papermc.io/paper/1.19/") opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString()) opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/") - opt.links("https://jd.adventure.kyori.net/api/4.9.3/") + opt.links("https://jd.advntr.dev/api/4.14.0/") opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/") opt.links("https://checkerframework.org/api/") + opt.isLinkSource = true + opt.bottom(File("$rootDir/javadocfooter.html").readText()) + opt.isUse = true opt.encoding("UTF-8") + opt.keyWords() + opt.addStringOption("-since", isRelease) } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java index 96bccd892..38a4e682a 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java @@ -36,11 +36,11 @@ 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.ProjectileEventListener; import com.plotsquared.bukkit.listener.ServerListener; import com.plotsquared.bukkit.listener.SingleWorldListener; +import com.plotsquared.bukkit.listener.SpigotListener; import com.plotsquared.bukkit.listener.WorldEvents; import com.plotsquared.bukkit.placeholder.PAPIPlaceholders; import com.plotsquared.bukkit.placeholder.PlaceholderFormatter; @@ -49,7 +49,7 @@ 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.UpdateUtility; +import com.plotsquared.bukkit.util.TranslationUpdateManager; import com.plotsquared.bukkit.util.task.BukkitTaskManager; import com.plotsquared.bukkit.util.task.PaperTimeConverter; import com.plotsquared.bukkit.util.task.SpigotTimeConverter; @@ -71,6 +71,8 @@ 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; @@ -109,6 +111,7 @@ 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; @@ -137,6 +140,7 @@ 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; @@ -290,11 +294,19 @@ 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); + /* TODO Enable update checker before v7 is released to GA if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) { injector.getInstance(UpdateUtility.class).updateChecker(); } + */ if (PremiumVerification.isPremium()) { LOGGER.info("PlotSquared version licensed to Spigot user {}", getUserID()); @@ -355,11 +367,9 @@ 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) { - if (serverVersion()[1] == 13) { - getServer().getPluginManager().registerEvents(injector().getInstance(PaperListener113.class), this); - } else { - getServer().getPluginManager().registerEvents(injector().getInstance(PaperListener.class), this); - } + getServer().getPluginManager().registerEvents(injector().getInstance(PaperListener.class), this); + } else { + getServer().getPluginManager().registerEvents(injector().getInstance(SpigotListener.class), this); } this.plotListener.startRunnable(); } @@ -656,20 +666,15 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl final @NonNull SQLiteUUIDService sqLiteUUIDService, final @NonNull CacheUUIDService cacheUUIDService ) { - // Load all uuids into a big chunky boi queue - final Queue uuidQueue = new LinkedBlockingQueue<>(); + // Record all unique UUID's and put them into a queue + final Set uuidSet = new HashSet<>(); PlotSquared.get().forEachPlotRaw(plot -> { - final Set uuids = new HashSet<>(); - uuids.add(plot.getOwnerAbs()); - uuids.addAll(plot.getMembers()); - uuids.addAll(plot.getTrusted()); - uuids.addAll(plot.getDenied()); - for (final UUID uuid : uuids) { - if (!uuidQueue.contains(uuid)) { - uuidQueue.add(uuid); - } - } + uuidSet.add(plot.getOwnerAbs()); + uuidSet.addAll(plot.getMembers()); + uuidSet.addAll(plot.getTrusted()); + uuidSet.addAll(plot.getDenied()); }); + final Queue uuidQueue = new LinkedBlockingQueue<>(uuidSet); LOGGER.info("(UUID) {} UUIDs will be cached", uuidQueue.size()); @@ -732,6 +737,11 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl this.getServer().getPluginManager().disablePlugin(this); } + @Override + public void shutdownServer() { + getServer().shutdown(); + } + private void registerCommands() { final BukkitCommand bukkitCommand = new BukkitCommand(); final PluginCommand plotCommand = getCommand("plots"); @@ -812,8 +822,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl if (entity.hasMetadata("ps-tmp-teleport")) { continue; } - iterator.remove(); - entity.remove(); + this.removeRoadEntity(entity, iterator); } continue; } @@ -826,8 +835,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl if (entity.hasMetadata("ps-tmp-teleport")) { continue; } - iterator.remove(); - entity.remove(); + this.removeRoadEntity(entity, iterator); } } continue; @@ -837,7 +845,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) { - entity.remove(); + this.removeRoadEntity(entity, iterator); } // dropped item continue; @@ -846,11 +854,11 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl // managed elsewhere continue; case "SHULKER": - if (Settings.Enabled_Components.KILL_ROAD_MOBS) { + if (Settings.Enabled_Components.KILL_ROAD_MOBS && (Settings.Enabled_Components.KILL_NAMED_ROAD_MOBS || entity.getCustomName() == null)) { LivingEntity livingEntity = (LivingEntity) entity; List meta = entity.getMetadata("shulkerPlot"); if (!meta.isEmpty()) { - if (livingEntity.isLeashed()) { + if (livingEntity.isLeashed() && !Settings.Enabled_Components.KILL_OWNED_ROAD_MOBS) { continue; } List keep = entity.getMetadata("keep"); @@ -863,15 +871,12 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl com.plotsquared.core.location.Location pLoc = BukkitUtil.adapt(entity.getLocation()); PlotArea area = pLoc.getPlotArea(); if (area != null) { - PlotId currentPlotId = area.getPlotAbs(pLoc).getId(); - if (!originalPlotId.equals(currentPlotId) && (currentPlotId == null || !area.getPlot( - originalPlotId) - .equals(area.getPlot(currentPlotId)))) { + Plot currentPlot = area.getPlotAbs(pLoc); + if (currentPlot == null || !originalPlotId.equals(currentPlot.getId())) { if (entity.hasMetadata("ps-tmp-teleport")) { continue; } - iterator.remove(); - entity.remove(); + this.removeRoadEntity(entity, iterator); } } } @@ -880,11 +885,11 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl com.plotsquared.core.location.Location pLoc = BukkitUtil.adapt(entity.getLocation()); PlotArea area = pLoc.getPlotArea(); if (area != null) { - PlotId currentPlotId = area.getPlotAbs(pLoc).getId(); - if (currentPlotId != null) { + Plot currentPlot = area.getPlotAbs(pLoc); + if (currentPlot != null) { entity.setMetadata( "shulkerPlot", - new FixedMetadataValue((Plugin) PlotSquared.platform(), currentPlotId) + new FixedMetadataValue((Plugin) PlotSquared.platform(), currentPlot.getId()) ); } } @@ -970,23 +975,24 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl || !entity.hasMetadata("keep")) { Entity passenger = entity.getPassenger(); if ((Settings.Enabled_Components.KILL_OWNED_ROAD_MOBS - || !(passenger instanceof Player)) && entity.getMetadata("keep").isEmpty()) { + || !((passenger instanceof Player) || livingEntity.isLeashed())) + && (Settings.Enabled_Components.KILL_NAMED_ROAD_MOBS || entity.getCustomName() == null) + && entity.getMetadata("keep").isEmpty()) { if (entity.hasMetadata("ps-tmp-teleport")) { continue; } - iterator.remove(); - entity.remove(); + this.removeRoadEntity(entity, iterator); } } } else { Entity passenger = entity.getPassenger(); - if ((Settings.Enabled_Components.KILL_OWNED_ROAD_MOBS - || !(passenger instanceof Player)) && entity.getMetadata("keep").isEmpty()) { + if ((Settings.Enabled_Components.KILL_OWNED_ROAD_MOBS || !(passenger instanceof Player)) + && (Settings.Enabled_Components.KILL_NAMED_ROAD_MOBS && entity.getCustomName() != null) + && entity.getMetadata("keep").isEmpty()) { if (entity.hasMetadata("ps-tmp-teleport")) { continue; } - iterator.remove(); - entity.remove(); + this.removeRoadEntity(entity, iterator); } } } @@ -1000,6 +1006,17 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl }), TaskTime.seconds(1L)); } + private void removeRoadEntity(Entity entity, Iterator entityIterator) { + RemoveRoadEntityEvent event = eventDispatcher.callRemoveRoadEntity(BukkitAdapter.adapt(entity)); + + if (event.getEventResult() == Result.DENY) { + return; + } + + entityIterator.remove(); + entity.remove(); + } + @Override public @Nullable final ChunkGenerator getDefaultWorldGenerator( @@ -1169,9 +1186,17 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl 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()); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/entity/ReplicatingEntityWrapper.java b/Bukkit/src/main/java/com/plotsquared/bukkit/entity/ReplicatingEntityWrapper.java index 63c137824..183710a8e 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/entity/ReplicatingEntityWrapper.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/entity/ReplicatingEntityWrapper.java @@ -101,50 +101,26 @@ 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": - 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": + } + 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" -> { // 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()); @@ -152,7 +128,8 @@ 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()); @@ -165,20 +142,17 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { } this.dataString = art.name(); return; + } // END MISC // // INVENTORY HOLDER // - case "MINECART_CHEST": - case "MINECART_HOPPER": + case "MINECART_CHEST", "MINECART_HOPPER" -> { storeInventory((InventoryHolder) entity); return; + } // START LIVING ENTITY // // START AGEABLE // // START TAMEABLE // - case "HORSE": - case "DONKEY": - case "LLAMA": - case "MULE": - case "SKELETON_HORSE": + case "HORSE", "DONKEY", "LLAMA", "MULE", "SKELETON_HORSE" -> { AbstractHorse horse = (AbstractHorse) entity; this.horse = new HorseStats(); this.horse.jump = horse.getJumpStrength(); @@ -194,16 +168,17 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { storeLiving(horse); storeInventory(horse); return; + } // END INVENTORY HOLDER // - case "WOLF": - case "OCELOT": + case "WOLF", "OCELOT" -> { storeTameable((Tameable) 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; @@ -214,23 +189,20 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { storeAgeable(sheep); storeLiving(sheep); return; - case "VILLAGER": - case "CHICKEN": - case "COW": - case "MUSHROOM_COW": - case "PIG": - case "TURTLE": - case "POLAR_BEAR": + } + case "VILLAGER", "CHICKEN", "COW", "MUSHROOM_COW", "PIG", "TURTLE", "POLAR_BEAR" -> { storeAgeable((Ageable) entity); storeLiving((LivingEntity) entity); return; - case "RABBIT": + } + case "RABBIT" -> { this.dataByte = getOrdinal(Rabbit.Type.values(), ((Rabbit) entity).getRabbitType()); 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(), @@ -238,37 +210,30 @@ 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; } @@ -282,53 +247,38 @@ 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": - 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": + } + 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" -> { 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 // } } @@ -465,20 +415,15 @@ 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": - case "LEASH_HITCH": + } + case "PLAYER", "LEASH_HITCH" -> { return null; - 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; + } + case "ITEM_FRAME" -> entity = world.spawn(location, ItemFrame.class); + case "PAINTING" -> entity = world.spawn(location, Painting.class); + default -> entity = world.spawnEntity(location, this.getType()); } if (this.depth == 0) { return entity; @@ -506,72 +451,46 @@ 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": - 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": + } + 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" -> { // 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": - case "MINECART_HOPPER": + case "MINECART_CHEST", "MINECART_HOPPER" -> { restoreInventory((InventoryHolder) entity); return entity; + } // START LIVING ENTITY // // START AGEABLE // // START TAMEABLE // - case "HORSE": - case "LLAMA": - case "SKELETON_HORSE": - case "DONKEY": - case "MULE": + case "HORSE", "LLAMA", "SKELETON_HORSE", "DONKEY", "MULE" -> { AbstractHorse horse = (AbstractHorse) entity; horse.setJumpStrength(this.horse.jump); if (horse instanceof ChestedHorse) { @@ -586,15 +505,16 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { restoreLiving(horse); restoreInventory(horse); return entity; + } // END INVENTORY HOLDER // - case "WOLF": - case "OCELOT": + case "WOLF", "OCELOT" -> { restoreTameable((Tameable) 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); @@ -605,25 +525,22 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { restoreAgeable(sheep); restoreLiving(sheep); return sheep; - case "VILLAGER": - case "CHICKEN": - case "COW": - case "TURTLE": - case "POLAR_BEAR": - case "MUSHROOM_COW": - case "PIG": + } + case "VILLAGER", "CHICKEN", "COW", "TURTLE", "POLAR_BEAR", "MUSHROOM_COW", "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]); } 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) { @@ -693,56 +610,38 @@ 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": - 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": + } + 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" -> { 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 } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/generator/BlockStatePopulator.java b/Bukkit/src/main/java/com/plotsquared/bukkit/generator/BlockStatePopulator.java index 691f90cd5..3280eedb9 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/generator/BlockStatePopulator.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/generator/BlockStatePopulator.java @@ -24,9 +24,8 @@ 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.ScopedQueueCoordinator; +import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator; import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.LimitedRegion; import org.bukkit.generator.WorldInfo; @@ -47,17 +46,6 @@ 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, @@ -80,7 +68,7 @@ final class BlockStatePopulator extends BlockPopulator { worldInfo.getMaxHeight(), (chunkZ << 4) + 15 ); - ScopedQueueCoordinator offsetChunkQueue = new ScopedQueueCoordinator(wrapped, min, max); + ZeroedDelegateScopedQueueCoordinator offsetChunkQueue = new ZeroedDelegateScopedQueueCoordinator(wrapped, min, max); this.plotGenerator.populateChunk(offsetChunkQueue, area); } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/generator/BukkitPlotGenerator.java b/Bukkit/src/main/java/com/plotsquared/bukkit/generator/BukkitPlotGenerator.java index 38e29ef3b..bfccaeb3d 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/generator/BukkitPlotGenerator.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/generator/BukkitPlotGenerator.java @@ -22,28 +22,47 @@ 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.ScopedQueueCoordinator; +import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator; 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 { + private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitPlotGenerator.class.getSimpleName()); + @SuppressWarnings("unused") public final boolean PAPER_ASYNC_SAFE = true; @@ -52,9 +71,15 @@ 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 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, @@ -72,18 +97,23 @@ 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 @@ -111,7 +141,7 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap try { checkLoaded(world); } catch (Exception e) { - e.printStackTrace(); + LOGGER.error("Error attempting to load world into PlotSquared.", e); } ArrayList toAdd = new ArrayList<>(); List existing = world.getPopulators(); @@ -128,6 +158,7 @@ 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()) { @@ -153,7 +184,7 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap } } - @SuppressWarnings("deprecation") + @SuppressWarnings("deprecation") // Kept for compatibility with <=1.17.1 private void setSpawnLimits(@NonNull World world, int limit) { world.setAmbientSpawnLimit(limit); world.setAnimalSpawnLimit(limit); @@ -162,10 +193,117 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap } @Override - public @NonNull ChunkData generateChunkData( - @NonNull World world, @NonNull Random random, int x, int z, - @NonNull BiomeGrid biome + 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 + ) { + 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); @@ -175,7 +313,6 @@ 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); - } } } @@ -195,35 +332,32 @@ 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, result); + generate(BlockVector2.at(x, z), world.getName(), result, true); } } catch (Throwable e) { - e.printStackTrace(); + LOGGER.error("Error attempting to load world into PlotSquared.", e); } // Return the result data return result.getChunkData(); } - private void generate(BlockVector2 loc, World world, ScopedQueueCoordinator result) { + private void generate(BlockVector2 loc, String world, ZeroedDelegateScopedQueueCoordinator result, boolean biomes) { // Load if improperly loaded if (!this.loaded) { - checkLoaded(world); + synchronized (this) { + PlotSquared.get().loadWorld(world, this); + } } // Process the chunk if (ChunkManager.preProcessChunk(loc, result)) { return; } - 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); - } + PlotArea area = getPlotArea(world, loc.getX(), loc.getZ()); try { - this.plotGenerator.generateChunk(result, area); + this.plotGenerator.generateChunk(result, area, biomes); } catch (Throwable e) { // Recover from generator error - e.printStackTrace(); + LOGGER.error("Error attempting to generate chunk.", e); } ChunkManager.postProcessChunk(loc, result); } @@ -277,4 +411,63 @@ 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 BIOMES; + + static { + Set 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 getBiomes(@NotNull final WorldInfo worldInfo) { + return BIOMES; // Allow all biomes + } + + } + } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/generator/DelegatePlotGenerator.java b/Bukkit/src/main/java/com/plotsquared/bukkit/generator/DelegatePlotGenerator.java index ce49e25fb..d55d5fd6c 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/generator/DelegatePlotGenerator.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/generator/DelegatePlotGenerator.java @@ -24,9 +24,10 @@ 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.ScopedQueueCoordinator; +import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator; 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; @@ -49,6 +50,11 @@ 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(); @@ -60,7 +66,7 @@ final class DelegatePlotGenerator extends IndependentPlotGenerator { } @Override - public void generateChunk(final ScopedQueueCoordinator result, PlotArea settings) { + public void generateChunk(final ZeroedDelegateScopedQueueCoordinator result, PlotArea settings, boolean biomes) { World world = BukkitUtil.getWorld(this.world); Location min = result.getMin(); int chunkX = min.getX() >> 4; diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/generator/LegacyBlockStatePopulator.java b/Bukkit/src/main/java/com/plotsquared/bukkit/generator/LegacyBlockStatePopulator.java index eb8ad0201..8b7278173 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/generator/LegacyBlockStatePopulator.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/generator/LegacyBlockStatePopulator.java @@ -26,14 +26,13 @@ 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.ScopedQueueCoordinator; +import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator; 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; @@ -51,7 +50,7 @@ final class LegacyBlockStatePopulator extends BlockPopulator { } @Override - public void populate(@NotNull final World world, @NotNull final Random random, @NotNull final Chunk source) { + public void populate(@NonNull final World world, @NonNull final Random random, @NonNull final Chunk source) { int chunkMinX = source.getX() << 4; int chunkMinZ = source.getZ() << 4; PlotArea area = Location.at(world.getName(), chunkMinX, 0, chunkMinZ).getPlotArea(); @@ -66,7 +65,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); - ScopedQueueCoordinator offsetChunkQueue = new ScopedQueueCoordinator(queue, min, max); + ZeroedDelegateScopedQueueCoordinator offsetChunkQueue = new ZeroedDelegateScopedQueueCoordinator(queue, min, max); this.plotGenerator.populateChunk(offsetChunkQueue, area); queue.enqueue(); } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java index 9d21c52e7..5f11ddf0c 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java @@ -55,22 +55,25 @@ 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.Permissions; +import com.plotsquared.core.util.PlotFlagUtil; 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.Bukkit; import org.bukkit.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.PistonMoveReaction; 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; @@ -98,9 +101,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; @@ -110,6 +113,12 @@ import java.util.List; import java.util.Objects; import java.util.Set; 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 { @@ -122,6 +131,11 @@ public class BlockEventListener implements Listener { Material.TURTLE_EGG, Material.TURTLE_SPAWN_EGG ); + private static final Set SNOW = Stream.of(Material.values()) // needed as Tag.SNOW isn't present in 1.16.5 + .filter(material -> material.name().contains("SNOW")) + .filter(Material::isBlock) + .collect(Collectors.toUnmodifiableSet()); + private final PlotAreaManager plotAreaManager; private final WorldEdit worldEdit; @@ -160,7 +174,7 @@ public class BlockEventListener implements Listener { } Plot plot = location.getOwnedPlot(); if (plot == null) { - if (area.isRoadFlags() && !area.getRoadFlag(RedstoneFlag.class)) { + if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, RedstoneFlag.class, false)) { event.setNewCurrent(0); } return; @@ -268,13 +282,23 @@ 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 (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_UNOWNED) + ) ); event.setCancelled(true); return; @@ -288,10 +312,13 @@ public class BlockEventListener implements Listener { return; } } - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_OTHER) + ) ); event.setCancelled(true); plot.debug(player.getName() + " could not place " + event.getBlock().getType() @@ -299,7 +326,7 @@ public class BlockEventListener implements Listener { return; } } else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) { pp.sendMessage( TranslatableCaption.of("done.building_restricted") ); @@ -315,10 +342,13 @@ public class BlockEventListener implements Listener { + " did not fall because of disable-physics = true"); } } - } else if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) { + } else if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD) + ) ); event.setCancelled(true); } @@ -337,22 +367,30 @@ 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 (!Permissions - .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_GROUNDLEVEL)) { + if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_GROUNDLEVEL)) { plotPlayer.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_GROUNDLEVEL)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_GROUNDLEVEL) + ) ); event.setCancelled(true); 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 (!Permissions - .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_UNOWNED, true)) { + if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED, true)) { event.setCancelled(true); } return; @@ -366,17 +404,19 @@ public class BlockEventListener implements Listener { return; } } - if (Permissions - .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_OTHER)) { + if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_OTHER)) { return; } plotPlayer.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_OTHER) + ) ); event.setCancelled(true); } else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { - if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) { + if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) { plotPlayer.sendMessage( TranslatableCaption.of("done.building_restricted") ); @@ -387,7 +427,7 @@ public class BlockEventListener implements Listener { return; } BukkitPlayer pp = BukkitUtil.adapt(player); - if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_ROAD)) { + if (pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_ROAD)) { return; } if (this.worldEdit != null && pp.getAttribute("worldedit")) { @@ -398,7 +438,10 @@ public class BlockEventListener implements Listener { } pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_ROAD)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_ROAD) + ) ); event.setCancelled(true); } @@ -436,6 +479,7 @@ public class BlockEventListener implements Listener { case "TWISTING_VINES": case "CAVE_VINES": case "VINE": + case "GLOW_BERRIES": if (!plot.getFlag(VineGrowFlag.class)) { plot.debug("Vine could not grow because vine-grow = false"); event.setCancelled(true); @@ -471,18 +515,18 @@ public class BlockEventListener implements Listener { BukkitPlayer plotPlayer = BukkitUtil.adapt(player); if (plot != null) { if (!plot.hasOwner()) { - if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) { + if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) { return; } } else if (!plot.isAdded(plotPlayer.getUUID())) { - if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_OTHER)) { + if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) { return; } } else { return; } } else { - if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_ROAD)) { + if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD)) { return; } if (this.worldEdit != null && plotPlayer.getAttribute("worldedit")) { @@ -530,14 +574,14 @@ public class BlockEventListener implements Listener { event.setCancelled(true); return; } - if (Tag.SNOW.isTagged(event.getNewState().getType())) { + if (org.bukkit.Tag.SNOW.isTagged(event.getNewState().getType())) { if (!plot.getFlag(SnowFormFlag.class)) { plot.debug("Snow could not form because snow-form = false"); event.setCancelled(true); } return; } - if (Tag.ICE.isTagged(event.getNewState().getType())) { + if (org.bukkit.Tag.ICE.isTagged(event.getNewState().getType())) { if (!plot.getFlag(IceFormFlag.class)) { plot.debug("Ice could not form because ice-form = false"); event.setCancelled(true); @@ -562,9 +606,9 @@ public class BlockEventListener implements Listener { return; } Class> flag; - if (Tag.SNOW.isTagged(event.getNewState().getType())) { + if (org.bukkit.Tag.SNOW.isTagged(event.getNewState().getType())) { flag = SnowFormFlag.class; - } else if (Tag.ICE.isTagged(event.getNewState().getType())) { + } else if (org.bukkit.Tag.ICE.isTagged(event.getNewState().getType())) { flag = IceFormFlag.class; } else { return; @@ -627,8 +671,7 @@ public class BlockEventListener implements Listener { } if (!plot.hasOwner()) { BukkitPlayer plotPlayer = BukkitUtil.adapt(player); - if (Permissions - .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) { + if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) { return; } event.setCancelled(true); @@ -640,8 +683,7 @@ public class BlockEventListener implements Listener { Block block = event.getBlock(); if (destroy .contains(BlockTypeWrapper.get(BukkitAdapter.asBlockType(block.getType()))) - || Permissions - .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_OTHER)) { + || plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_OTHER)) { return; } plot.debug(player.getName() + " could not break " + block.getType() @@ -652,7 +694,7 @@ public class BlockEventListener implements Listener { return; } BukkitPlayer plotPlayer = BukkitUtil.adapt(player); - if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_ROAD)) { + if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_ROAD)) { return; } event.setCancelled(true); @@ -672,14 +714,14 @@ public class BlockEventListener implements Listener { return; } Material blockType = block.getType(); - if (Tag.ICE.isTagged(blockType)) { + if (org.bukkit.Tag.ICE.isTagged(blockType)) { if (!plot.getFlag(IceMeltFlag.class)) { plot.debug("Ice could not melt because ice-melt = false"); event.setCancelled(true); } return; } - if (Tag.SNOW.isTagged(blockType)) { + if (org.bukkit.Tag.SNOW.isTagged(blockType)) { if (!plot.getFlag(SnowMeltFlag.class)) { plot.debug("Snow could not melt because snow-melt = false"); event.setCancelled(true); @@ -693,7 +735,7 @@ public class BlockEventListener implements Listener { } return; } - if (Tag.CORAL_BLOCKS.isTagged(blockType) || Tag.CORALS.isTagged(blockType)) { + if (CORAL_BLOCKS.isTagged(blockType) || CORALS.isTagged(blockType) || WALL_CORALS.isTagged(blockType)) { if (!plot.getFlag(CoralDryFlag.class)) { plot.debug("Coral could not dry because coral-dry = false"); event.setCancelled(true); @@ -701,6 +743,43 @@ public class BlockEventListener implements Listener { } } + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onMoistureChange(MoistureChangeEvent event) { + Block block = event.getBlock(); + Location location = BukkitUtil.adapt(block.getLocation()); + PlotArea area = location.getPlotArea(); + + if (area == null) { + return; + } + + Plot plot = area.getOwnedPlot(location); + + if (plot == null) { + event.setCancelled(true); + return; + } + + if (block.getBlockData() instanceof Farmland farmland && event + .getNewState() + .getBlockData() instanceof Farmland newFarmland) { + int currentMoisture = farmland.getMoisture(); + int newMoisture = newFarmland.getMoisture(); + + // farmland gets moisturizes + if (newMoisture > currentMoisture) { + return; + } + + if (plot.getFlag(SoilDryFlag.class)) { + return; + } + + plot.debug("Soil could not dry because soil-dry = false"); + event.setCancelled(true); + } + } + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onChange(BlockFromToEvent event) { Block fromBlock = event.getBlock(); @@ -746,7 +825,10 @@ 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; } @@ -762,7 +844,10 @@ 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(); @@ -918,6 +1003,9 @@ 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", @@ -929,7 +1017,7 @@ public class BlockEventListener implements Listener { if (event.getBlock().getType() == Material.DROPPER) { return; } - BlockFace targetFace = ((Directional) event.getBlock().getState().getData()).getFacing(); + BlockFace targetFace = ((Dispenser) event.getBlock().getBlockData()).getFacing(); Location location = BukkitUtil.adapt(event.getBlock().getRelative(targetFace).getLocation()); if (location.isPlotRoad()) { event.setCancelled(true); @@ -1029,6 +1117,7 @@ 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())))); } @@ -1077,26 +1166,39 @@ public class BlockEventListener implements Listener { return; } if (plot == null) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) { + if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, BlockIgnitionFlag.class, true) && !pp.hasPermission( + Permission.PERMISSION_ADMIN_BUILD_ROAD + )) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD) + ) ); event.setCancelled(true); } } else if (!plot.hasOwner()) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) { + if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, BlockIgnitionFlag.class, true) && !pp.hasPermission( + Permission.PERMISSION_ADMIN_BUILD_UNOWNED + )) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_UNOWNED) + ) ); event.setCancelled(true); } } else if (!plot.isAdded(pp.getUUID())) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_OTHER) + ) ); event.setCancelled(true); } @@ -1217,22 +1319,34 @@ public class BlockEventListener implements Listener { for (final BlockState state : event.getReplacedBlockStates()) { Location currentLocation = BukkitUtil.adapt(state.getLocation()); - if (!Permissions.hasPermission( - pp, + if (!pp.hasPermission( Permission.PERMISSION_ADMIN_BUILD_ROAD ) && !(Objects.equals(currentLocation.getPlot(), plot))) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD)) + TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD)) ); event.setCancelled(true); break; } - if (area.notifyIfOutsideBuildArea(pp, currentLocation.getY())) { - 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; + } } } + } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener117.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener117.java index 2d23515ad..0909001b4 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener117.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener117.java @@ -26,6 +26,8 @@ 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; @@ -91,11 +93,16 @@ public class BlockEventListener117 implements Listener { } Plot plot = location.getOwnedPlot(); - if (plot == null || !plot.getFlag(MiscInteractFlag.class)) { + if (plot == null && !PlotFlagUtil.isAreaRoadFlagsAndFlagEquals( + area, + MiscInteractFlag.class, + true + ) || plot != null && (!plot.getFlag(MiscInteractFlag.class) || !plot.getFlag(SculkSensorInteractFlag.class))) { if (plotPlayer != null) { if (plot != null) { if (!plot.isAdded(plotPlayer.getUUID())) { - plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because misc-interact = false"); + plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because both " + + "sculk-sensor-interact and misc-interact = false"); event.setCancelled(true); } } @@ -104,9 +111,17 @@ 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 misc-interact = false"); + plot.debug("A thrown item couldn't trigger sculk sensors because both sculk-sensor-interact and " + + "misc-interact = false"); event.setCancelled(true); } } @@ -125,7 +140,6 @@ 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); } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ChunkListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ChunkListener.java index b2326f32e..9af09527c 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ChunkListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ChunkListener.java @@ -234,7 +234,8 @@ 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; } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntityEventListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntityEventListener.java index bc28460e2..5ca02d00f 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntityEventListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntityEventListener.java @@ -37,7 +37,7 @@ import com.plotsquared.core.plot.flag.implementations.ExplosionFlag; import com.plotsquared.core.plot.flag.implementations.InvincibleFlag; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.util.EventDispatcher; -import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlotFlagUtil; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.world.block.BlockType; import org.bukkit.Material; @@ -145,54 +145,37 @@ public class EntityEventListener implements Listener { } CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason(); switch (reason.toString()) { - case "DISPENSE_EGG": - case "EGG": - case "OCELOT_BABY": - case "SPAWNER_EGG": + case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> { if (!area.isSpawnEggs()) { event.setCancelled(true); return; } - 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": + } + case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL", + "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> { if (!area.isMobSpawning()) { event.setCancelled(true); return; } - break; - case "BREEDING": + } + case "BREEDING" -> { if (!area.isSpawnBreeding()) { event.setCancelled(true); return; } - break; - case "BUILD_IRONGOLEM": - case "BUILD_SNOWMAN": - case "BUILD_WITHER": - case "CUSTOM": + } + case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> { if (!area.isSpawnCustom() && entity.getType() != EntityType.ARMOR_STAND) { event.setCancelled(true); return; } - break; - case "SPAWNER": + } + case "SPAWNER" -> { if (!area.isMobSpawnerSpawning()) { event.setCancelled(true); return; } - break; + } } Plot plot = area.getOwnedPlotAbs(location); if (plot == null) { @@ -261,7 +244,7 @@ public class EntityEventListener implements Listener { } Plot plot = location.getOwnedPlot(); if (plot == null) { - if (area.isRoadFlags() && area.getRoadFlag(InvincibleFlag.class)) { + if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, InvincibleFlag.class, true)) { event.setCancelled(true); } return; @@ -370,14 +353,13 @@ public class EntityEventListener implements Listener { if (shooter instanceof Player) { PlotPlayer pp = BukkitUtil.adapt((Player) shooter); if (plot == null) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) { entity.remove(); event.setCancelled(true); } return; } - if (plot.isAdded(pp.getUUID()) || Permissions - .hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) { + if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) { return; } entity.remove(); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntitySpawnListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntitySpawnListener.java index 77d694379..841f52970 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntitySpawnListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntitySpawnListener.java @@ -126,16 +126,16 @@ public class EntitySpawnListener implements Listener { Plot plot = location.getOwnedPlotAbs(); EntityType type = entity.getType(); if (plot == null) { + if (type == EntityType.DROPPED_ITEM) { + if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { + event.setCancelled(true); + } + return; + } if (!area.isMobSpawning()) { if (type == EntityType.PLAYER) { return; } - if (type == EntityType.DROPPED_ITEM) { - if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { - event.setCancelled(true); - } - return; - } if (type.isAlive()) { event.setCancelled(true); } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ForceFieldListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ForceFieldListener.java index 32c0ce853..d14a259b3 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ForceFieldListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ForceFieldListener.java @@ -18,7 +18,6 @@ */ package com.plotsquared.bukkit.listener; -import com.google.common.collect.Iterables; import com.plotsquared.bukkit.player.BukkitPlayer; import com.plotsquared.bukkit.util.BukkitUtil; import com.plotsquared.core.location.Location; @@ -26,7 +25,6 @@ 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; @@ -39,8 +37,11 @@ public class ForceFieldListener { private static Set> getNearbyPlayers(Player player, Plot plot) { Set> players = new HashSet<>(); - for (Player nearPlayer : Iterables - .filter(player.getNearbyEntities(5d, 5d, 5d), Player.class)) { + for (Player nearPlayer : player.getNearbyEntities(5d, 5d, 5d).stream() + .filter(entity -> entity instanceof Player) + .map(entity -> (Player) entity) + .toList() + ) { PlotPlayer plotPlayer; if ((plotPlayer = BukkitUtil.adapt(nearPlayer)) == null || !plot .equals(plotPlayer.getCurrentPlot())) { @@ -54,8 +55,11 @@ public class ForceFieldListener { } private static PlotPlayer hasNearbyPermitted(Player player, Plot plot) { - for (Player nearPlayer : Iterables - .filter(player.getNearbyEntities(5d, 5d, 5d), Player.class)) { + for (Player nearPlayer : player.getNearbyEntities(5d, 5d, 5d).stream() + .filter(entity -> entity instanceof Player) + .map(entity -> (Player) entity) + .toList() + ) { PlotPlayer plotPlayer; if ((plotPlayer = BukkitUtil.adapt(nearPlayer)) == null || !plot .equals(plotPlayer.getCurrentPlot())) { @@ -104,8 +108,7 @@ public class ForceFieldListener { if (plot.isAdded(uuid)) { Set> players = getNearbyPlayers(player, plot); for (PlotPlayer oPlayer : players) { - if (!Permissions - .hasPermission(oPlayer, Permission.PERMISSION_ADMIN_ENTRY_FORCEFIELD)) { + if (!oPlayer.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_FORCEFIELD)) { ((BukkitPlayer) oPlayer).player .setVelocity(calculateVelocity(plotPlayer, oPlayer)); } @@ -115,8 +118,7 @@ public class ForceFieldListener { if (oPlayer == null) { return; } - if (!Permissions - .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_ENTRY_FORCEFIELD)) { + if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_FORCEFIELD)) { player.setVelocity(calculateVelocity(oPlayer, plotPlayer)); } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PaperListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PaperListener.java index a2609fb23..0e058e9a1 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PaperListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PaperListener.java @@ -18,6 +18,7 @@ */ package com.plotsquared.bukkit.listener; +import com.destroystokyo.paper.event.block.BeaconEffectEvent; import com.destroystokyo.paper.event.entity.EntityPathfindEvent; import com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent; import com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent; @@ -36,11 +37,16 @@ import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; +import com.plotsquared.core.plot.flag.FlagContainer; +import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag; 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.Permissions; -import net.kyori.adventure.text.minimessage.Template; +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 org.bukkit.Chunk; import org.bukkit.block.Block; import org.bukkit.block.TileState; @@ -172,74 +178,56 @@ public class PaperListener implements Listener { } CreatureSpawnEvent.SpawnReason reason = event.getReason(); switch (reason.toString()) { - case "DISPENSE_EGG": - case "EGG": - case "OCELOT_BABY": - case "SPAWNER_EGG": + case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> { if (!area.isSpawnEggs()) { event.setShouldAbortSpawn(true); event.setCancelled(true); return; } - 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": + } + case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL", "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> { if (!area.isMobSpawning()) { event.setShouldAbortSpawn(true); event.setCancelled(true); return; } - break; - case "BREEDING": + } + case "BREEDING" -> { if (!area.isSpawnBreeding()) { event.setShouldAbortSpawn(true); event.setCancelled(true); return; } - break; - case "BUILD_IRONGOLEM": - case "BUILD_SNOWMAN": - case "BUILD_WITHER": - case "CUSTOM": + } + case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> { if (!area.isSpawnCustom() && event.getType() != EntityType.ARMOR_STAND) { event.setShouldAbortSpawn(true); event.setCancelled(true); return; } - break; - case "SPAWNER": + } + case "SPAWNER" -> { if (!area.isMobSpawnerSpawning()) { event.setShouldAbortSpawn(true); event.setCancelled(true); return; } - break; + } } Plot plot = location.getOwnedPlotAbs(); if (plot == null) { EntityType type = event.getType(); + // PreCreatureSpawnEvent **should** not be called for DROPPED_ITEM, just for the sake of consistency + if (type == EntityType.DROPPED_ITEM) { + if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { + event.setCancelled(true); + } + return; + } if (!area.isMobSpawning()) { if (type == EntityType.PLAYER) { return; } - if (type == EntityType.DROPPED_ITEM) { - if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { - event.setShouldAbortSpawn(true); - event.setCancelled(true); - } - return; - } if (type.isAlive()) { event.setShouldAbortSpawn(true); event.setCancelled(true); @@ -298,7 +286,7 @@ public class PaperListener implements Listener { 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)) + TagResolver.resolver("amount", Tag.inserting(Component.text(Settings.Chunk_Processor.MAX_TILES))) ); event.setCancelled(true); event.setBuild(false); @@ -322,36 +310,48 @@ public class PaperListener implements Listener { return; } Location location = BukkitUtil.adapt(entity.getLocation()); - if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) { + PlotArea area = location.getPlotArea(); + if (area == null) { return; } PlotPlayer pp = BukkitUtil.adapt((Player) shooter); Plot plot = location.getOwnedPlot(); if (plot == null) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_ROAD)) { + if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true) && !pp.hasPermission( + Permission.PERMISSION_ADMIN_PROJECTILE_ROAD + )) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD) + ) ); entity.remove(); event.setCancelled(true); } } else if (!plot.hasOwner()) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED) + ) ); entity.remove(); event.setCancelled(true); } } else if (!plot.isAdded(pp.getUUID())) { if (!plot.getFlag(ProjectilesFlag.class)) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) + ) ); entity.remove(); event.setCancelled(true); @@ -400,4 +400,52 @@ public class PaperListener implements Listener { } } + @EventHandler(ignoreCancelled = true) + public void onBeaconEffect(final BeaconEffectEvent event) { + Block block = event.getBlock(); + Location beaconLocation = BukkitUtil.adapt(block.getLocation()); + Plot beaconPlot = beaconLocation.getPlot(); + + PlotArea area = beaconLocation.getPlotArea(); + if (area == null) { + return; + } + + Player player = event.getPlayer(); + Location playerLocation = BukkitUtil.adapt(player.getLocation()); + + PlotPlayer plotPlayer = BukkitUtil.adapt(player); + Plot playerStandingPlot = playerLocation.getPlot(); + if (playerStandingPlot == null) { + FlagContainer container = area.getRoadFlagContainer(); + if (!getBooleanFlagValue(container, BeaconEffectsFlag.class, true) || + (beaconPlot != null && Settings.Enabled_Components.DISABLE_BEACON_EFFECT_OVERFLOW)) { + event.setCancelled(true); + } + return; + } + + FlagContainer container = playerStandingPlot.getFlagContainer(); + boolean plotBeaconEffects = getBooleanFlagValue(container, BeaconEffectsFlag.class, true); + if (playerStandingPlot.equals(beaconPlot)) { + if (!plotBeaconEffects) { + event.setCancelled(true); + } + return; + } + + if (!plotBeaconEffects || Settings.Enabled_Components.DISABLE_BEACON_EFFECT_OVERFLOW) { + event.setCancelled(true); + } + } + + private boolean getBooleanFlagValue( + @NonNull FlagContainer container, + @NonNull Class> flagClass, + boolean defaultValue + ) { + BooleanFlag flag = container.getFlag(flagClass); + return flag == null ? defaultValue : flag.getValue(); + } + } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PaperListener113.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PaperListener113.java deleted file mode 100644 index 722e58347..000000000 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PaperListener113.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * PlotSquared, a land and world management plugin for Minecraft. - * Copyright (C) IntellectualSites - * 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 . - */ -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); - } - } - -} diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java index 6eddc83e1..9beaa2ad9 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java @@ -67,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.Permissions; +import com.plotsquared.core.util.PlotFlagUtil; import com.plotsquared.core.util.PremiumVerification; import com.plotsquared.core.util.entity.EntityCategories; import com.plotsquared.core.util.task.TaskManager; @@ -77,12 +77,13 @@ 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.Template; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.kyori.adventure.text.minimessage.tag.standard.StandardTags; import org.bukkit.Bukkit; -import org.bukkit.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; @@ -106,6 +107,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.EntityPlaceEvent; +import org.bukkit.event.entity.EntityPotionEffectEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingPlaceEvent; @@ -142,6 +144,7 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; +import org.bukkit.potion.PotionEffect; import org.bukkit.util.Vector; import org.checkerframework.checker.nullness.qual.NonNull; @@ -204,6 +207,29 @@ public class PlayerEventListener implements Listener { this.plotListener = plotListener; } + @EventHandler(ignoreCancelled = true) + public void onEffect(@NonNull EntityPotionEffectEvent event) { + if (Settings.Enabled_Components.DISABLE_BEACON_EFFECT_OVERFLOW || + event.getCause() != EntityPotionEffectEvent.Cause.BEACON || + !(event.getEntity() instanceof Player player)) { + return; + } + + UUID uuid = player.getUniqueId(); + PotionEffect effect = event.getNewEffect(); + if (effect == null) { + PotionEffect oldEffect = event.getOldEffect(); + if (oldEffect != null) { + String name = oldEffect.getType().getName(); + plotListener.addEffect(uuid, name, -1); + } + } else { + long expiresAt = System.currentTimeMillis() + effect.getDuration() * 50L; //Convert ticks to milliseconds + String name = effect.getType().getName(); + plotListener.addEffect(uuid, name, expiresAt); + } + } + @EventHandler public void onVehicleEntityCollision(VehicleEntityCollisionEvent e) { if (e.getVehicle().getType() == EntityType.BOAT) { @@ -247,13 +273,15 @@ public class PlayerEventListener implements Listener { Plot plot = plotPlayer.getCurrentPlot(); // Check WorldEdit switch (parts[0]) { - case "up": - case "worldedit:up": - if (plot == null || (!plot.isAdded(plotPlayer.getUUID()) && !Permissions - .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER, true))) { + case "up", "worldedit:up" -> { + if (plot == null || (!plot.isAdded(plotPlayer.getUUID()) && !plotPlayer.hasPermission( + Permission.PERMISSION_ADMIN_BUILD_OTHER, + true + ))) { event.setCancelled(true); return; } + } } if (plot == null && !area.isRoadFlags()) { return; @@ -265,7 +293,7 @@ public class PlayerEventListener implements Listener { if (blockedCommands.isEmpty()) { return; } - if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_BLOCKED_CMDS)) { + if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_BLOCKED_CMDS)) { return; } // When using namespaced commands, we're not interested in the namespace @@ -284,7 +312,7 @@ public class PlayerEventListener implements Listener { } else { perm = "plots.admin.command.blocked-cmds.road"; } - if (!Permissions.hasPermission(plotPlayer, perm)) { + if (!plotPlayer.hasPermission(perm)) { plotPlayer.sendMessage(TranslatableCaption.of("blockedcmds.command_blocked")); event.setCancelled(true); } @@ -371,11 +399,15 @@ 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, internalVersion, spigotVersion, downloadUrl); + pp.sendMessage( + updateNotification, + TagResolver.builder() + .tag("p2version", Tag.inserting(Component.text(UpdateUtility.internalVersion.versionString()))) + .tag("spigotversion", Tag.inserting(Component.text(UpdateUtility.spigotVersion))) + .tag("downloadurl", Tag.preProcessParsed("https://www.spigotmc.org/resources/77506/updates")) + .build() + ); pp.sendMessage(boundary); } } @@ -427,7 +459,7 @@ public class PlayerEventListener implements Listener { .equals(BukkitUtil.adaptComplete(to)))) { pp.sendMessage( TranslatableCaption.of("deny.no_enter"), - Template.of("plot", plot.toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.toString()))) ); event.setCancelled(true); } @@ -540,10 +572,14 @@ public class PlayerEventListener implements Listener { if (now == null) { try (final MetaDataAccess 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"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_EXIT_DENIED)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_EXIT_DENIED) + ) ); this.tmpTeleport = false; if (lastPlot.equals(BukkitUtil.adapt(from).getPlot())) { @@ -561,7 +597,7 @@ public class PlayerEventListener implements Listener { } else if (!plotListener.plotEntry(pp, now) && this.tmpTeleport) { pp.sendMessage( TranslatableCaption.of("deny.no_enter"), - Template.of("plot", now.toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(now.toString()))) ); this.tmpTeleport = false; to.setX(from.getBlockX()); @@ -574,7 +610,7 @@ public class PlayerEventListener implements Listener { int border = area.getBorder(); int x1; if (x2 > border && this.tmpTeleport) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { to.setX(border - 1); this.tmpTeleport = false; player.teleport(event.getTo()); @@ -584,7 +620,7 @@ public class PlayerEventListener implements Listener { pp.sendMessage(TranslatableCaption.of("border.bypass.exited")); } } else if (x2 < -border && this.tmpTeleport) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { to.setX(-border + 1); this.tmpTeleport = false; player.teleport(event.getTo()); @@ -594,7 +630,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 (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { + if (pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { pp.sendMessage(TranslatableCaption.of("border.bypass.entered")); } } @@ -630,10 +666,14 @@ public class PlayerEventListener implements Listener { if (plot == null) { try (final MetaDataAccess 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"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_EXIT_DENIED)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_EXIT_DENIED) + ) ); this.tmpTeleport = false; if (lastPlot.equals(BukkitUtil.adapt(from).getPlot())) { @@ -651,7 +691,7 @@ public class PlayerEventListener implements Listener { } else if (!plotListener.plotEntry(pp, plot) && this.tmpTeleport) { pp.sendMessage( TranslatableCaption.of("deny.no_enter"), - Template.of("plot", plot.toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.toString()))) ); this.tmpTeleport = false; player.teleport(from); @@ -665,7 +705,7 @@ public class PlayerEventListener implements Listener { int border = area.getBorder(); int z1; if (z2 > border && this.tmpTeleport) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { to.setZ(border - 1); this.tmpTeleport = false; player.teleport(event.getTo()); @@ -675,7 +715,7 @@ public class PlayerEventListener implements Listener { pp.sendMessage(TranslatableCaption.of("border.bypass.exited")); } } else if (z2 < -border && this.tmpTeleport) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { to.setZ(-border + 1); this.tmpTeleport = false; player.teleport(event.getTo()); @@ -685,7 +725,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 (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { + if (pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { pp.sendMessage(TranslatableCaption.of("border.bypass.entered")); } } @@ -712,8 +752,7 @@ public class PlayerEventListener implements Listener { || area.isForcingPlotChat())) { return; } - if (plot.isDenied(plotPlayer.getUUID()) && !Permissions - .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_CHAT_BYPASS)) { + if (plot.isDenied(plotPlayer.getUUID()) && !plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_CHAT_BYPASS)) { return; } event.setCancelled(true); @@ -736,46 +775,34 @@ public class PlayerEventListener implements Listener { PlotId id = plot.getId(); String worldName = plot.getWorldName(); Caption msg = TranslatableCaption.of("chat.plot_chat_format"); - 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 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. + 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))); if (plotPlayer.hasPermission("plots.chat.color")) { - msgTemplate = Template - .of( - "msg", - BukkitUtil.LEGACY_COMPONENT_SERIALIZER.deserialize(ChatColor.translateAlternateColorCodes( - '&', - message - )) - ); + builder.tag("msg", Tag.inserting(MiniMessage.miniMessage().deserialize( + message, + TagResolver.resolver(StandardTags.color(), StandardTags.gradient(), + StandardTags.rainbow(), StandardTags.decorations() + ) + ))); } else { - msgTemplate = Template.of("msg", BukkitUtil.MINI_MESSAGE.deserialize( - ChatColor.stripColor(BukkitUtil.LEGACY_COMPONENT_SERIALIZER.serialize(Component.text(message))))); + builder.tag("msg", Tag.inserting(Component.text(message))); } for (PlotPlayer receiver : plotRecipients) { - receiver.sendMessage(msg, worldNameTemplate, msgTemplate, plotTemplate, senderTemplate); + receiver.sendMessage(msg, builder.build()); } 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, worldNameTemplate, plotidTemplate, spysenderTemplate, spymessageTemplate); + player.sendMessage(spymsg, builder.tag("message", Tag.inserting(Component.text(message))).build()); } } if (Settings.Chat.LOG_PLOTCHAT_TO_CONSOLE) { 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)); - ConsolePlayer.getConsole().sendMessage(spymsg, worldNameTemplate, plotidTemplate, spysenderTemplate, - spymessageTemplate + ConsolePlayer.getConsole().sendMessage( + spymsg, + builder.tag("message", Tag.inserting(Component.text(message))).build() ); } } @@ -798,7 +825,7 @@ public class PlayerEventListener implements Listener { plotListener.plotExit(pp, plot); } if (this.worldEdit != null) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_WORLDEDIT_BYPASS)) { + if (!pp.hasPermission(Permission.PERMISSION_WORLDEDIT_BYPASS)) { if (pp.getAttribute("worldedit")) { pp.removeAttribute("worldedit"); } @@ -854,8 +881,7 @@ public class PlayerEventListener implements Listener { final Plot plot = pp.getCurrentPlot(); if (plot != null) { if (plot.getFlag(PreventCreativeCopyFlag.class) && !plot - .isAdded(player.getUniqueId()) && !Permissions - .hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_OTHER)) { + .isAdded(player.getUniqueId()) && !pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) { final ItemStack newStack = new ItemStack(newItem.getType(), newItem.getAmount()); event.setCursor(newStack); @@ -864,8 +890,7 @@ public class PlayerEventListener implements Listener { } } else { PlotArea area = pp.getPlotAreaAbs(); - if (area != null && area.isRoadFlags() && area - .getRoadFlag(PreventCreativeCopyFlag.class)) { + if (area != null && PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, PreventCreativeCopyFlag.class, true)) { final ItemStack newStack = new ItemStack(newItem.getType(), newItem.getAmount()); event.setCursor(newStack); @@ -918,28 +943,37 @@ public class PlayerEventListener implements Listener { Plot plot = area.getPlotAbs(location); boolean cancelled = false; if (plot == null) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_ROAD)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_ROAD)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_ROAD) + ) ); cancelled = true; } } else if (!plot.hasOwner()) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED) + ) ); cancelled = true; } } else { UUID uuid = pp.getUUID(); if (!plot.isAdded(uuid)) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_OTHER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_OTHER) + ) ); cancelled = true; } @@ -973,29 +1007,34 @@ public class PlayerEventListener implements Listener { Plot plot = location.getPlotAbs(); BukkitPlayer pp = BukkitUtil.adapt(e.getPlayer()); if (plot == null) { - if (!area.isRoadFlags() && !area.getRoadFlag(MiscInteractFlag.class) && !Permissions - .hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_ROAD)) { + if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, MiscInteractFlag.class, true) && !pp.hasPermission( + Permission.PERMISSION_ADMIN_INTERACT_ROAD + )) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_ROAD)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_ROAD) + ) ); e.setCancelled(true); } } else { if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) { - pp.sendMessage( - TranslatableCaption.of("done.building_restricted") - ); + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) { + pp.sendMessage(TranslatableCaption.of("done.building_restricted")); e.setCancelled(true); return; } } if (!plot.hasOwner()) { - if (!Permissions.hasPermission(pp, "plots.admin.interact.unowned")) { + if (!pp.hasPermission("plots.admin.interact.unowned")) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED) + ) ); e.setCancelled(true); } @@ -1007,10 +1046,13 @@ public class PlayerEventListener implements Listener { if (plot.getFlag(MiscInteractFlag.class)) { return; } - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_OTHER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_OTHER) + ) ); e.setCancelled(true); plot.debug(pp.getName() + " could not interact with " + entity.getType() @@ -1074,13 +1116,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()); @@ -1102,21 +1144,16 @@ 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": - case "STRING": - case "PUMPKIN_SEEDS": - case "MELON_SEEDS": - case "COCOA_BEANS": - case "WHEAT_SEEDS": - case "BEETROOT_SEEDS": - case "SWEET_BERRIES": - case "GLOW_BERRIES": + case "REDSTONE", "STRING", "PUMPKIN_SEEDS", "MELON_SEEDS", "COCOA_BEANS", "WHEAT_SEEDS", "BEETROOT_SEEDS", + "SWEET_BERRIES", "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)) { @@ -1137,7 +1174,7 @@ public class PlayerEventListener implements Listener { location = BukkitUtil.adapt(block.getRelative(event.getBlockFace()).getLocation()); eventType = PlayerBlockEventType.PLACE_MISC; } - if (Tag.ITEMS_BOATS.isTagged(type) || MINECARTS.contains(type)) { + if (org.bukkit.Tag.ITEMS_BOATS.isTagged(type) || MINECARTS.contains(type)) { eventType = PlayerBlockEventType.PLACE_VEHICLE; break; } @@ -1149,9 +1186,8 @@ 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. @@ -1162,10 +1198,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)) { @@ -1232,34 +1268,40 @@ public class PlayerEventListener implements Listener { BukkitPlayer pp = BukkitUtil.adapt(event.getPlayer()); Plot plot = area.getPlot(location); if (plot == null) { - if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) { + if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) { return; } pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD)) + TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD)) ); event.setCancelled(true); } else if (!plot.hasOwner()) { - if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) { + if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) { return; } pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_UNOWNED) + ) ); event.setCancelled(true); } else if (!plot.isAdded(pp.getUUID())) { - if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) { + if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) { return; } pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_OTHER) + ) ); event.setCancelled(true); } else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) { pp.sendMessage( TranslatableCaption.of("done.building_restricted") ); @@ -1297,34 +1339,40 @@ public class PlayerEventListener implements Listener { BukkitPlayer plotPlayer = BukkitUtil.adapt(player); Plot plot = area.getPlot(location); if (plot == null) { - if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_ROAD)) { + if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) { return; } plotPlayer.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD)) + TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD)) ); event.setCancelled(true); } else if (!plot.hasOwner()) { - if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) { + if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) { return; } plotPlayer.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_UNOWNED) + ) ); event.setCancelled(true); } else if (!plot.isAdded(plotPlayer.getUUID())) { - if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) { + if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) { return; } plotPlayer.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_OTHER) + ) ); event.setCancelled(true); } else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { - if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) { + if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) { plotPlayer.sendMessage( TranslatableCaption.of("done.building_restricted") ); @@ -1349,19 +1397,25 @@ public class PlayerEventListener implements Listener { BukkitPlayer pp = BukkitUtil.adapt(p); Plot plot = area.getPlot(location); if (plot == null) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_ROAD) + ) ); event.setCancelled(true); } } else { if (!plot.hasOwner()) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_UNOWNED) + ) ); event.setCancelled(true); } @@ -1369,10 +1423,13 @@ public class PlayerEventListener implements Listener { } if (!plot.isAdded(pp.getUUID())) { if (!plot.getFlag(HangingPlaceFlag.class)) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BUILD_OTHER) + ) ); event.setCancelled(true); } @@ -1398,18 +1455,24 @@ public class PlayerEventListener implements Listener { BukkitPlayer pp = BukkitUtil.adapt(p); Plot plot = area.getPlot(location); if (plot == null) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_ROAD)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_ROAD)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_ROAD)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_ROAD) + ) ); event.setCancelled(true); } } else if (!plot.hasOwner()) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED) + ) ); event.setCancelled(true); } @@ -1417,10 +1480,13 @@ public class PlayerEventListener implements Listener { if (plot.getFlag(HangingBreakFlag.class)) { return; } - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_OTHER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_OTHER)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_OTHER) + ) ); event.setCancelled(true); plot.debug(p.getName() @@ -1438,21 +1504,25 @@ public class PlayerEventListener implements Listener { Plot plot = area.getPlot(BukkitUtil.adapt(event.getEntity().getLocation())); if (plot != null) { if (!plot.hasOwner()) { - if (!Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) { + if (!player.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) { player.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_UNOWNED) + ) ); event.setCancelled(true); } } else if (!plot.isAdded(player.getUUID())) { if (!plot.getFlag(HangingBreakFlag.class)) { - if (!Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_DESTROY_OTHER)) { + if (!player.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_OTHER)) { player.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_OTHER) + ) ); event.setCancelled(true); plot.debug(player.getName() @@ -1481,18 +1551,24 @@ public class PlayerEventListener implements Listener { BukkitPlayer pp = BukkitUtil.adapt(p); Plot plot = area.getPlot(location); if (plot == null && !area.isRoadFlags()) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_ROAD)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_ROAD)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_ROAD)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_ROAD) + ) ); event.setCancelled(true); } } else if (plot != null && !plot.hasOwner()) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_UNOWNED) + ) ); event.setCancelled(true); } @@ -1547,10 +1623,13 @@ public class PlayerEventListener implements Listener { return; } - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_OTHER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_INTERACT_OTHER) + ) ); event.setCancelled(true); } @@ -1569,19 +1648,27 @@ public class PlayerEventListener implements Listener { BukkitPlayer pp = BukkitUtil.adapt(p); Plot plot = area.getPlot(location); if (plot == null) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD)) { + if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, VehicleBreakFlag.class, true) && !pp.hasPermission( + Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD + )) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD) + ) ); event.setCancelled(true); } } else { if (!plot.hasOwner()) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_UNOWNED)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_UNOWNED)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_UNOWNED)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_UNOWNED) + ) ); event.setCancelled(true); return; @@ -1592,10 +1679,13 @@ public class PlayerEventListener implements Listener { if (plot.getFlag(VehicleBreakFlag.class)) { return; } - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_OTHER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_OTHER)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_OTHER) + ) ); event.setCancelled(true); plot.debug(pp.getName() @@ -1617,7 +1707,7 @@ public class PlayerEventListener implements Listener { } Plot plot = location.getOwnedPlot(); if (plot == null) { - if (area.isRoadFlags() && !area.getRoadFlag(ItemDropFlag.class)) { + if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ItemDropFlag.class, false)) { event.setCancelled(true); } return; @@ -1643,7 +1733,7 @@ public class PlayerEventListener implements Listener { } Plot plot = location.getOwnedPlot(); if (plot == null) { - if (area.isRoadFlags() && area.getRoadFlag(DropProtectionFlag.class)) { + if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, DropProtectionFlag.class, true)) { event.setCancelled(true); } return; @@ -1665,17 +1755,15 @@ public class PlayerEventListener implements Listener { } Plot plot = location.getOwnedPlot(); if (plot == null) { - if (area.isRoadFlags() && area.getRoadFlag(KeepInventoryFlag.class)) { + if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, KeepInventoryFlag.class, true)) { event.setCancelled(true); } return; } if (plot.getFlag(KeepInventoryFlag.class)) { - if (plot.getFlag(KeepInventoryFlag.class)) { - plot.debug(event.getEntity().getName() + " kept their inventory because of keep-inventory = true"); - event.getDrops().clear(); - event.setKeepInventory(true); - } + plot.debug(event.getEntity().getName() + " kept their inventory because of keep-inventory = true"); + event.getDrops().clear(); + event.setKeepInventory(true); } } @@ -1700,16 +1788,14 @@ public class PlayerEventListener implements Listener { } Plot plot = location.getOwnedPlot(); if (plot == null) { - if (area.isRoadFlags() && area.getRoadFlag(DenyPortalTravelFlag.class)) { + if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, DenyPortalTravelFlag.class, true)) { event.setCancelled(true); } return; } if (plot.getFlag(DenyPortalTravelFlag.class)) { - 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); - } + plot.debug(event.getPlayer().getName() + " did not travel thru a portal because of deny-portal-travel = true"); + event.setCancelled(true); } } @@ -1731,11 +1817,11 @@ public class PlayerEventListener implements Listener { maxZ = Math.max(state.getZ(), maxZ); } int y = event.getBlocks().get(0).getY(); // Don't need to worry about this too much - for (Location location : Set.of( // Use Set to lazily avoid duplicate locations - Location.at(world, minX, y, maxX), - Location.at(world, minZ, y, maxZ), + for (Location location : List.of( // We don't care about duplicate locations + Location.at(world, minX, y, minZ), Location.at(world, minX, y, maxZ), - Location.at(world, minZ, y, maxX) + Location.at(world, maxX, y, minZ), + Location.at(world, maxX, y, maxZ) )) { PlotArea area = location.getPlotArea(); if (area == null) { @@ -1747,7 +1833,7 @@ public class PlayerEventListener implements Listener { } Plot plot = location.getOwnedPlot(); if (plot == null) { - if (area.isRoadFlags() && area.getRoadFlag(DenyPortalsFlag.class)) { + if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, DenyPortalsFlag.class, true)) { event.setCancelled(true); return; } @@ -1776,16 +1862,14 @@ public class PlayerEventListener implements Listener { } Plot plot = location.getOwnedPlot(); if (plot == null) { - if (area.isRoadFlags() && area.getRoadFlag(LecternReadBookFlag.class)) { + if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, LecternReadBookFlag.class, true)) { event.setCancelled(true); } return; } if (plot.getFlag(LecternReadBookFlag.class)) { - if (plot.getFlag(LecternReadBookFlag.class)) { - plot.debug(event.getPlayer().getName() + " could not take the book because of lectern-read-book = true"); - event.setCancelled(true); - } + plot.debug(event.getPlayer().getName() + " could not take the book because of lectern-read-book = true"); + event.setCancelled(true); } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ProjectileEventListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ProjectileEventListener.java index 743649a80..e84695445 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ProjectileEventListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/ProjectileEventListener.java @@ -30,8 +30,9 @@ 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.Permissions; -import net.kyori.adventure.text.minimessage.Template; +import com.plotsquared.core.util.PlotFlagUtil; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -97,36 +98,48 @@ public class ProjectileEventListener implements Listener { return; } Location location = BukkitUtil.adapt(entity.getLocation()); - if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) { + PlotArea area = location.getPlotArea(); + if (area == null) { return; } PlotPlayer pp = BukkitUtil.adapt((Player) shooter); Plot plot = location.getOwnedPlot(); if (plot == null) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_ROAD)) { + if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true) && !pp.hasPermission( + Permission.PERMISSION_ADMIN_PROJECTILE_ROAD + )) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD) + ) ); entity.remove(); event.setCancelled(true); } } else if (!plot.hasOwner()) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED) + ) ); entity.remove(); event.setCancelled(true); } } else if (!plot.isAdded(pp.getUUID())) { if (!plot.getFlag(ProjectilesFlag.class)) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) { + if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) + ) ); entity.remove(); event.setCancelled(true); @@ -154,6 +167,8 @@ 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(); @@ -163,14 +178,16 @@ public class ProjectileEventListener implements Listener { PlotPlayer pp = BukkitUtil.adapt((Player) shooter); if (plot == null) { - if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) { + if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true) && !pp.hasPermission( + Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED + )) { entity.remove(); event.setCancelled(true); } return; } - if (plot.isAdded(pp.getUUID()) || Permissions - .hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag(ProjectilesFlag.class)) { + if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag( + ProjectilesFlag.class)) { return; } entity.remove(); @@ -194,7 +211,6 @@ public class ProjectileEventListener implements Listener { if (sPlot == null || !PlotHandler.sameOwners(plot, sPlot)) { entity.remove(); event.setCancelled(true); - return; } } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/SpigotListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/SpigotListener.java new file mode 100644 index 000000000..5d91bc513 --- /dev/null +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/SpigotListener.java @@ -0,0 +1,57 @@ +/* + * PlotSquared, a land and world management plugin for Minecraft. + * Copyright (C) IntellectualSites + * 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 . + */ +package com.plotsquared.bukkit.listener; + +import com.plotsquared.bukkit.util.BukkitUtil; +import com.plotsquared.core.location.Location; +import com.plotsquared.core.plot.Plot; +import com.plotsquared.core.plot.flag.FlagContainer; +import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag; +import org.bukkit.entity.Entity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityPotionEffectEvent; +import org.checkerframework.checker.nullness.qual.NonNull; + +/** + * Fallback listener for paper events on spigot + */ +public class SpigotListener implements Listener { + + @EventHandler(ignoreCancelled = true) + public void onEffect(@NonNull EntityPotionEffectEvent event) { + if (event.getCause() != EntityPotionEffectEvent.Cause.BEACON) { + return; + } + + Entity entity = event.getEntity(); + Location location = BukkitUtil.adapt(entity.getLocation()); + Plot plot = location.getPlot(); + if (plot == null) { + return; + } + + FlagContainer container = plot.getFlagContainer(); + BeaconEffectsFlag effectsEnabled = container.getFlag(BeaconEffectsFlag.class); + if (effectsEnabled != null && !effectsEnabled.getValue()) { + event.setCancelled(true); + } + } + +} diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/managers/HyperverseWorldManager.java b/Bukkit/src/main/java/com/plotsquared/bukkit/managers/HyperverseWorldManager.java deleted file mode 100644 index 2abe7a426..000000000 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/managers/HyperverseWorldManager.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * PlotSquared, a land and world management plugin for Minecraft. - * Copyright (C) IntellectualSites - * 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 . - */ -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"; - } - -} - */ diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/managers/MultiverseWorldManager.java b/Bukkit/src/main/java/com/plotsquared/bukkit/managers/MultiverseWorldManager.java index 0a6ed594b..8f4439339 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/managers/MultiverseWorldManager.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/managers/MultiverseWorldManager.java @@ -30,8 +30,9 @@ 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(forRemoval = true, since = "6.0.0") +@Deprecated @Singleton public class MultiverseWorldManager extends BukkitWorldManager { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/placeholder/MVdWPlaceholders.java b/Bukkit/src/main/java/com/plotsquared/bukkit/placeholder/MVdWPlaceholders.java index 426a88ec6..b7a311345 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/placeholder/MVdWPlaceholders.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/placeholder/MVdWPlaceholders.java @@ -52,7 +52,7 @@ public class MVdWPlaceholders { @Subscribe public void onNewPlaceholder(final PlaceholderRegistry.@NonNull PlaceholderAddedEvent event) { - this.addPlaceholder(event.getPlaceholder()); + this.addPlaceholder(event.placeholder()); } private void addPlaceholder(final @NonNull Placeholder placeholder) { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java index 8d04b444e..2b98491fb 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java @@ -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,4 +87,9 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer { ); } + @Override + public boolean hasPermission(@NonNull final String permission, final boolean notify) { + return hasPermission(permission); + } + } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java index 6dcaa9dd7..d86d48c7d 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java @@ -47,13 +47,13 @@ import org.bukkit.event.EventException; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.plugin.RegisteredListener; +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; -import java.util.stream.Collectors; import static com.sk89q.worldedit.world.gamemode.GameModes.ADVENTURE; import static com.sk89q.worldedit.world.gamemode.GameModes.CREATIVE; @@ -67,24 +67,15 @@ public class BukkitPlayer extends PlotPlayer { private String name; /** - *

Please do not use this method. Instead use - * BukkitUtil.getPlayer(Player), as it caches player objects.

- * * @param plotAreaManager PlotAreaManager instance * @param eventDispatcher EventDispatcher instance * @param player Bukkit player instance * @param permissionHandler PermissionHandler instance */ - 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, + BukkitPlayer( + final @NonNull PlotAreaManager plotAreaManager, + final @NonNull EventDispatcher eventDispatcher, + final @NonNull Player player, final boolean realPlayer, final @NonNull PermissionHandler permissionHandler ) { @@ -185,6 +176,10 @@ public class BukkitPlayer extends PlotPlayer { final Set 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; @@ -348,6 +343,14 @@ public class BukkitPlayer extends PlotPlayer { return BukkitUtil.BUKKIT_AUDIENCES.player(this.player); } + @Override + public void removeEffect(@NonNull String name) { + PotionEffectType type = PotionEffectType.getByName(name); + if (type != null) { + player.removePotionEffect(type); + } + } + @Override public boolean canSee(final PlotPlayer other) { if (other instanceof ConsolePlayer) { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java index 35b550d2f..cb598983c 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java @@ -70,7 +70,7 @@ public class BukkitPlayerManager extends PlayerManager { if (player == null || !player.isOnline()) { throw new NoSuchPlayerException(uuid); } - return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, player, this.permissionHandler); + return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, player, false, this.permissionHandler); } @Nullable diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/queue/BukkitChunkCoordinator.java b/Bukkit/src/main/java/com/plotsquared/bukkit/queue/BukkitChunkCoordinator.java index 7e787843b..fc3ce7370 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/queue/BukkitChunkCoordinator.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/queue/BukkitChunkCoordinator.java @@ -239,9 +239,11 @@ 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; } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/queue/BukkitQueueCoordinator.java b/Bukkit/src/main/java/com/plotsquared/bukkit/queue/BukkitQueueCoordinator.java index 69cbca503..78749339c 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/queue/BukkitQueueCoordinator.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/queue/BukkitQueueCoordinator.java @@ -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)) { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/queue/GenChunk.java b/Bukkit/src/main/java/com/plotsquared/bukkit/queue/GenChunk.java index 44ec39545..b591b4d9e 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/queue/GenChunk.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/queue/GenChunk.java @@ -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.ScopedQueueCoordinator; +import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator; import com.plotsquared.core.util.ChunkUtil; import com.plotsquared.core.util.PatternUtil; import com.sk89q.worldedit.bukkit.BukkitAdapter; @@ -44,8 +44,11 @@ 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 ScopedQueueCoordinator { +public class GenChunk extends ZeroedDelegateScopedQueueCoordinator { public final Biome[] biomes; public BlockState[][] result; @@ -59,7 +62,6 @@ public class GenChunk extends ScopedQueueCoordinator { /** * @param minY minimum world Y, inclusive * @param maxY maximum world Y, inclusive - * * @since 6.6.0 */ public GenChunk(int minY, int maxY) { @@ -107,9 +109,9 @@ public class GenChunk extends ScopedQueueCoordinator { */ 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 @@ -183,7 +185,11 @@ public class GenChunk extends ScopedQueueCoordinator { @Override public boolean setBlock(int x, int y, int z, @NonNull Pattern pattern) { - return setBlock(x, y, z, PatternUtil.apply(Preconditions.checkNotNull(pattern, "Pattern may not be null"), x, y, z)); + final BaseBlock block = PatternUtil.apply(Preconditions.checkNotNull( + pattern, + "Pattern may not be null" + ), x + (chunkX << 4), y, z + (chunkZ << 4)); + return setBlock(x, y, z, block); } @Override diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/queue/LimitedRegionWrapperQueue.java b/Bukkit/src/main/java/com/plotsquared/bukkit/queue/LimitedRegionWrapperQueue.java index d61372536..46161d4c4 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/queue/LimitedRegionWrapperQueue.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/queue/LimitedRegionWrapperQueue.java @@ -44,6 +44,7 @@ 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 @@ -65,10 +66,18 @@ public class LimitedRegionWrapperQueue extends DelegateQueueCoordinator { CompoundTag tag = id.getNbtData(); StateWrapper sw = new StateWrapper(tag); try { - sw.restoreTag(limitedRegion.getBlockState(x, y, z).getBlock()); + if (useOtherRestoreTagMethod && getWorld() != null) { + sw.restoreTag(getWorld().getName(), x, y, z); + } else { + 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; diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/schematic/StateWrapper.java b/Bukkit/src/main/java/com/plotsquared/bukkit/schematic/StateWrapper.java index c37e8e92d..4ba2c1dbd 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/schematic/StateWrapper.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/schematic/StateWrapper.java @@ -18,6 +18,8 @@ */ 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; @@ -28,16 +30,22 @@ 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; @@ -46,20 +54,15 @@ 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 org.bukkit.block.BlockState state = null; - public CompoundTag tag = null; + public CompoundTag tag; - /** - * @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; - } + private boolean paperErrorTextureSent = false; + private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + StateWrapper.class.getSimpleName()); public StateWrapper(CompoundTag tag) { this.tag = tag; @@ -237,15 +240,64 @@ public class StateWrapper { return true; } String player = skullOwner.getString("Name"); - if (player == null || player.isEmpty()) { + + if (player != null && !player.isEmpty()) { + try { + skull.setOwningPlayer(Bukkit.getOfflinePlayer(player)); + skull.update(true); + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + final CompoundTag properties = (CompoundTag) skullOwner.getValue().get("Properties"); + if (properties == null) { return false; } - try { - skull.setOwningPlayer(Bukkit.getOfflinePlayer(player)); - skull.update(true); - } catch (Exception e) { - e.printStackTrace(); + final ListTag textures = properties.getListTag("textures"); + if (textures.getValue().isEmpty()) { + return false; } + 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 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; @@ -254,26 +306,6 @@ 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 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:")) { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitEntityUtil.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitEntityUtil.java index 2661186a4..becc3ddc1 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitEntityUtil.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitEntityUtil.java @@ -40,10 +40,11 @@ import com.plotsquared.core.plot.flag.implementations.PvpFlag; import com.plotsquared.core.plot.flag.implementations.TamedAttackFlag; import com.plotsquared.core.plot.flag.implementations.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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.entity.Arrow; import org.bukkit.entity.Creature; import org.bukkit.entity.Entity; @@ -168,8 +169,7 @@ public class BukkitEntityUtil { if (plot != null && (plot.getFlag(HangingBreakFlag.class) || plot .isAdded(plotPlayer.getUUID()))) { if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { - if (!Permissions - .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) { + if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_OTHER)) { plotPlayer.sendMessage( TranslatableCaption.of("done.building_restricted") ); @@ -178,10 +178,13 @@ public class BukkitEntityUtil { } return true; } - if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY + "." + stub)) { + if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY + "." + stub)) { plotPlayer.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", Permission.PERMISSION_ADMIN_DESTROY + "." + stub) + TagResolver.resolver( + "node", + Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_DESTROY + "." + stub)) + ) ); return false; } @@ -190,10 +193,13 @@ public class BukkitEntityUtil { .isAdded(plotPlayer.getUUID()))) { return true; } - if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY + "." + stub)) { + if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_DESTROY + "." + stub)) { plotPlayer.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", Permission.PERMISSION_ADMIN_DESTROY + "." + stub) + TagResolver.resolver( + "node", + Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_DESTROY + "." + stub)) + ) ); if (plot != null) { plot.debug(player.getName() @@ -211,10 +217,13 @@ public class BukkitEntityUtil { .getFlag(PveFlag.class))) { return true; } - if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVE + "." + stub)) { + if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVE + "." + stub)) { plotPlayer.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", Permission.PERMISSION_ADMIN_PVE + "." + stub) + TagResolver.resolver( + "node", + Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVE + "." + stub)) + ) ); if (plot != null) { plot.debug(player.getName() + " could not attack " + entityType @@ -232,10 +241,13 @@ public class BukkitEntityUtil { .getFlag(PveFlag.class))) { return true; } - if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVE + "." + stub)) { + if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVE + "." + stub)) { plotPlayer.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", Permission.PERMISSION_ADMIN_PVE + "." + stub) + TagResolver.resolver( + "node", + Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVE + "." + stub)) + ) ); if (plot != null) { plot.debug(player.getName() + " could not attack " + entityType @@ -245,11 +257,13 @@ public class BukkitEntityUtil { } } else if (EntityCategories.PLAYER.contains(entityType)) { if (isPlot) { - if (!plot.getFlag(PvpFlag.class) && !Permissions - .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVP + "." + stub)) { + if (!plot.getFlag(PvpFlag.class) && !plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVP + "." + stub)) { plotPlayer.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", Permission.PERMISSION_ADMIN_PVP + "." + stub) + TagResolver.resolver( + "node", + Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVP + "." + stub)) + ) ); plot.debug(player.getName() + " could not attack " + entityType + " because pve = false"); @@ -260,10 +274,13 @@ public class BukkitEntityUtil { } else if (roadFlags && area.getRoadFlag(PvpFlag.class)) { return true; } - if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVP + "." + stub)) { + if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVP + "." + stub)) { plotPlayer.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", Permission.PERMISSION_ADMIN_PVP + "." + stub) + TagResolver.resolver( + "node", + Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVP + "." + stub)) + ) ); return false; } @@ -277,10 +294,13 @@ public class BukkitEntityUtil { .getFlag(PveFlag.class))) { return true; } - if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVE + "." + stub)) { + if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVE + "." + stub)) { plotPlayer.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", Permission.PERMISSION_ADMIN_PVE + "." + stub) + TagResolver.resolver( + "node", + Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVE + "." + stub)) + ) ); if (plot != null) { plot.debug(player.getName() + " could not attack " + entityType @@ -299,10 +319,13 @@ public class BukkitEntityUtil { } else if (roadFlags && area.getRoadFlag(PveFlag.class)) { return true; } - if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_PVE + "." + stub)) { + if (!plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_PVE + "." + stub)) { plotPlayer.sendMessage( TranslatableCaption.of("permission.no_permission_event"), - Template.of("node", Permission.PERMISSION_ADMIN_PVE + "." + stub) + TagResolver.resolver( + "node", + Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_PVE + "." + stub)) + ) ); if (plot != null) { plot.debug(player.getName() + " could not attack " + entityType diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitInventoryUtil.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitInventoryUtil.java index f81a6e779..3d2565fc5 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitInventoryUtil.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitInventoryUtil.java @@ -56,7 +56,7 @@ public class BukkitInventoryUtil extends InventoryUtil { ItemMeta meta = null; if (item.getName() != null) { meta = stack.getItemMeta(); - Component nameComponent = BukkitUtil.MINI_MESSAGE.parse(item.getName()); + Component nameComponent = BukkitUtil.MINI_MESSAGE.deserialize(item.getName()); meta.setDisplayName(BukkitUtil.LEGACY_COMPONENT_SERIALIZER.serialize(nameComponent)); } if (item.getLore() != null) { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java index cfaee439d..d78991c89 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java @@ -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.ScopedQueueCoordinator; +import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator; 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() { + () -> ChunkManager.setChunkInPlotArea(null, new RunnableVal() { @Override - public void run(ScopedQueueCoordinator value) { + public void run(ZeroedDelegateScopedQueueCoordinator value) { Location min = value.getMin(); int bx = min.getX(); int bz = min.getZ(); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitSetupUtils.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitSetupUtils.java index 911b40c95..88ede2cc5 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitSetupUtils.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitSetupUtils.java @@ -124,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().getSettingsNodes(); + new ConfigurationNode[0] : builder.settingsNodesWrapper().settingsNodes(); String world = builder.worldName(); PlotAreaType type = builder.plotAreaType(); String worldPath = "worlds." + builder.worldName(); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java index 53123c895..124e766e9 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java @@ -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.Template; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -58,6 +58,7 @@ import org.bukkit.block.BlockFace; import org.bukkit.block.Sign; import org.bukkit.block.data.Directional; import org.bukkit.block.data.type.WallSign; +import org.bukkit.entity.Allay; import org.bukkit.entity.Ambient; import org.bukkit.entity.Animals; import org.bukkit.entity.AreaEffectCloud; @@ -332,7 +333,7 @@ public class BukkitUtil extends WorldUtil { @SuppressWarnings("deprecation") public void setSign( final @NonNull Location location, final @NonNull Caption[] lines, - final @NonNull Template... replacements + final @NonNull TagResolver... replacements ) { ensureLoaded(location.getWorldName(), location.getX(), location.getZ(), chunk -> { PlotArea area = location.getPlotArea(); @@ -365,8 +366,9 @@ 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.parse(lines[i].getComponent(LocaleHolder.console()), replacements))); + sign.setLine(i, LEGACY_COMPONENT_SERIALIZER.serialize( + MINI_MESSAGE.deserialize(lines[i].getComponent(LocaleHolder.console()), replacements) + )); } sign.update(true, false); } @@ -437,6 +439,9 @@ public class BukkitUtil extends WorldUtil { allowedInterfaces.add(Animals.class); allowedInterfaces.add(WaterMob.class); allowedInterfaces.add(Ambient.class); + if (PlotSquared.platform().serverVersion()[1] >= 19) { + allowedInterfaces.add(Allay.class); + } } case "tameable" -> allowedInterfaces.add(Tameable.class); case "vehicle" -> allowedInterfaces.add(Vehicle.class); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitWorld.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitWorld.java index 4f9e1db38..33c23891b 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitWorld.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitWorld.java @@ -24,7 +24,6 @@ import org.bukkit.Bukkit; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.Map; -import java.util.Objects; public class BukkitWorld implements World { @@ -133,14 +132,6 @@ public class BukkitWorld implements 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 + ")"; } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/TranslationUpdateManager.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/TranslationUpdateManager.java new file mode 100644 index 000000000..0c25f5bf7 --- /dev/null +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/TranslationUpdateManager.java @@ -0,0 +1,72 @@ +/* + * PlotSquared, a land and world management plugin for Minecraft. + * Copyright (C) IntellectualSites + * 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 . + */ +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"; + + try (Stream 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); + }); + } + } + + 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(); + } + } + +} diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/UpdateUtility.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/UpdateUtility.java index eeb3257e3..5e1e4c985 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/UpdateUtility.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/UpdateUtility.java @@ -54,7 +54,8 @@ 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 { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/fawe/FaweRegionManager.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/fawe/FaweRegionManager.java index 1751710bb..5fe07a80d 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/fawe/FaweRegionManager.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/fawe/FaweRegionManager.java @@ -36,8 +36,7 @@ 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.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.checkerframework.checker.nullness.qual.Nullable; import java.util.Set; @@ -46,10 +45,7 @@ public class FaweRegionManager extends BukkitRegionManager { private final FaweDelegateRegionManager delegate = new FaweDelegateRegionManager(); @Inject - public FaweRegionManager( - @NonNull WorldUtil worldUtil, @NonNull GlobalBlockQueue blockQueue, @NonNull - ProgressSubscriberFactory subscriberFactory - ) { + public FaweRegionManager(WorldUtil worldUtil, GlobalBlockQueue blockQueue, ProgressSubscriberFactory subscriberFactory) { super(worldUtil, blockQueue, subscriberFactory); } @@ -76,9 +72,9 @@ public class FaweRegionManager extends BukkitRegionManager { @Override public boolean handleClear( - @NotNull Plot plot, + @NonNull Plot plot, @Nullable Runnable whenDone, - @NotNull PlotManager manager, + @NonNull PlotManager manager, final @Nullable PlotPlayer player ) { if (!Settings.FAWE_Components.CLEAR || !(manager instanceof HybridPlotManager)) { @@ -98,11 +94,6 @@ 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); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/fawe/FaweSchematicHandler.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/fawe/FaweSchematicHandler.java index 9b909439a..be2b3a21a 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/fawe/FaweSchematicHandler.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/fawe/FaweSchematicHandler.java @@ -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.jetbrains.annotations.NotNull; +import org.checkerframework.checker.nullness.qual.NonNull; 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(@NotNull WorldUtil worldUtil, @NotNull ProgressSubscriberFactory subscriberFactory) { + public FaweSchematicHandler(WorldUtil worldUtil, ProgressSubscriberFactory subscriberFactory) { super(worldUtil, subscriberFactory); } @@ -75,9 +75,8 @@ public class FaweSchematicHandler extends SchematicHandler { } @Override - public Schematic getSchematic(@NotNull InputStream is) { + public Schematic getSchematic(@NonNull InputStream is) { return delegate.getSchematic(is); } } - diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/uuid/SQLiteUUIDService.java b/Bukkit/src/main/java/com/plotsquared/bukkit/uuid/SQLiteUUIDService.java index 3e816548a..9193b4f0a 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/uuid/SQLiteUUIDService.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/uuid/SQLiteUUIDService.java @@ -111,8 +111,8 @@ public class SQLiteUUIDService implements UUIDService, Consumerintellectualsites.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. diff --git a/Core/build.gradle.kts b/Core/build.gradle.kts index d5103d1a6..c7b2172ac 100644 --- a/Core/build.gradle.kts +++ b/Core/build.gradle.kts @@ -54,16 +54,30 @@ tasks.processResources { "date" to rootProject.grgit.head().dateTime.format(DateTimeFormatter.ofPattern("yy.MM.dd")) ) } + + doLast { + copy { + from(File("$rootDir/LICENSE")) + into("$buildDir/resources/main/") + } + } } tasks { withType { + 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.adventure.kyori.net/api/4.9.3/") + opt.links("https://jd.advntr.dev/api/4.14.0/") + opt.links("https://jd.advntr.dev/text-minimessage/4.14.0/") opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/") opt.links("https://checkerframework.org/api/") opt.links("https://javadoc.io/doc/com.intellectualsites.informative-annotations/informative-annotations/latest/") + opt.isLinkSource = true + opt.bottom(File("$rootDir/javadocfooter.html").readText()) + opt.isUse = true opt.encoding("UTF-8") + opt.keyWords() + opt.addStringOption("-since", isRelease) } } diff --git a/Core/src/main/java/com/plotsquared/core/PlotAPI.java b/Core/src/main/java/com/plotsquared/core/PlotAPI.java index 392759966..64f124e7f 100644 --- a/Core/src/main/java/com/plotsquared/core/PlotAPI.java +++ b/Core/src/main/java/com/plotsquared/core/PlotAPI.java @@ -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.Template; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; 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 Template @NonNull ... replacements + final @NonNull TagResolver @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 Template @NonNull ... replacements + final @NonNull TagResolver @NonNull ... replacements ) { ConsolePlayer.getConsole().sendMessage(caption, replacements); } diff --git a/Core/src/main/java/com/plotsquared/core/PlotPlatform.java b/Core/src/main/java/com/plotsquared/core/PlotPlatform.java index 75ceef94d..958468098 100644 --- a/Core/src/main/java/com/plotsquared/core/PlotPlatform.java +++ b/Core/src/main/java/com/plotsquared/core/PlotPlatform.java @@ -32,6 +32,7 @@ import com.plotsquared.core.inject.annotations.DefaultGenerator; import com.plotsquared.core.location.World; import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.player.PlotPlayer; +import com.plotsquared.core.plot.expiration.ExpireManager; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.util.ChunkManager; @@ -75,6 +76,11 @@ public interface PlotPlatform

extends LocaleHolder { */ void shutdown(); + /** + * Completely shuts down the server. + */ + void shutdownServer(); + /** * Get the name of the plugin * @@ -279,6 +285,16 @@ public interface PlotPlatform

extends LocaleHolder { return injector().getInstance(ChunkManager.class); } + /** + * Get the {@link ExpireManager} implementation for the platform + * + * @return Expire manager + * @since 6.10.2 + */ + default @NonNull ExpireManager expireManager() { + return injector().getInstance(ExpireManager.class); + } + /** * Get the {@link PlotAreaManager} implementation. * diff --git a/Core/src/main/java/com/plotsquared/core/PlotSquared.java b/Core/src/main/java/com/plotsquared/core/PlotSquared.java index 9b8d2fd02..579abe1e8 100644 --- a/Core/src/main/java/com/plotsquared/core/PlotSquared.java +++ b/Core/src/main/java/com/plotsquared/core/PlotSquared.java @@ -197,6 +197,9 @@ public class PlotSquared { this.loadCaptionMap(); } catch (final Exception e) { LOGGER.error("Failed to load caption map", e); + LOGGER.error("Shutting down server to prevent further issues"); + this.platform.shutdownServer(); + throw new RuntimeException("Abort loading PlotSquared"); } // Setup the global flag container @@ -267,7 +270,11 @@ 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.loadSingle(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( @@ -287,11 +294,11 @@ public class PlotSquared { public void startExpiryTasks() { if (Settings.Enabled_Components.PLOT_EXPIRY) { - ExpireManager.IMP = new ExpireManager(this.eventDispatcher); - ExpireManager.IMP.runAutomatedTask(); + ExpireManager expireManager = PlotSquared.platform().expireManager(); + expireManager.runAutomatedTask(); for (Settings.Auto_Clear settings : Settings.AUTO_CLEAR.getInstances()) { ExpiryTask task = new ExpiryTask(settings, this.getPlotAreaManager()); - ExpireManager.IMP.addTask(task); + expireManager.addTask(task); } } } @@ -642,7 +649,8 @@ public class PlotSquared { } else { list = new ArrayList<>(input); } - list.sort(Comparator.comparingLong(a -> ExpireManager.IMP.getTimestamp(a.getOwnerAbs()))); + ExpireManager expireManager = PlotSquared.platform().expireManager(); + list.sort(Comparator.comparingLong(a -> expireManager.getTimestamp(a.getOwnerAbs()))); return list; } @@ -786,7 +794,9 @@ public class PlotSquared { if (world.equals("CheckingPlotSquaredGenerator")) { return; } - this.getPlotAreaManager().addWorld(world); + if (!this.getPlotAreaManager().addWorld(world)) { + return; + } Set worlds; if (this.worldConfiguration.contains("worlds")) { worlds = this.worldConfiguration.getConfigurationSection("worlds").getKeys(false); @@ -1005,7 +1015,7 @@ public class PlotSquared { /** * Setup the configuration for a plot world based on world arguments. - * + *

* * e.g. /mv create <world> normal -g PlotSquared:<args> * diff --git a/Core/src/main/java/com/plotsquared/core/backup/PlayerBackupProfile.java b/Core/src/main/java/com/plotsquared/core/backup/PlayerBackupProfile.java index 69d9845f6..1725f5dc6 100644 --- a/Core/src/main/java/com/plotsquared/core/backup/PlayerBackupProfile.java +++ b/Core/src/main/java/com/plotsquared/core/backup/PlayerBackupProfile.java @@ -200,7 +200,7 @@ public class PlayerBackupProfile implements BackupProfile { if (value) { future.complete(null); } else { - future.completeExceptionally(new RuntimeException(MINI_MESSAGE.stripTokens( + future.completeExceptionally(new RuntimeException(MINI_MESSAGE.escapeTags( TranslatableCaption .of("schematics.schematic_paste_failed") .getComponent(ConsolePlayer.getConsole())))); diff --git a/Core/src/main/java/com/plotsquared/core/backup/SimpleBackupManager.java b/Core/src/main/java/com/plotsquared/core/backup/SimpleBackupManager.java index 13fc66e5e..f9f670532 100644 --- a/Core/src/main/java/com/plotsquared/core/backup/SimpleBackupManager.java +++ b/Core/src/main/java/com/plotsquared/core/backup/SimpleBackupManager.java @@ -24,13 +24,14 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -100,7 +101,7 @@ public class SimpleBackupManager implements BackupManager { if (player != null) { player.sendMessage( TranslatableCaption.of("backups.backup_automatic_started"), - Template.of("plot", plot.getId().toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) ); } profile.createBackup().whenComplete((backup, throwable) -> { @@ -108,7 +109,7 @@ public class SimpleBackupManager implements BackupManager { if (player != null) { player.sendMessage( TranslatableCaption.of("backups.backup_automatic_failure"), - Templates.of("reason", throwable.getMessage()) + TagResolver.resolver("reason", Tag.inserting(Component.text(throwable.getMessage()))) ); } throwable.printStackTrace(); @@ -135,13 +136,9 @@ public class SimpleBackupManager implements BackupManager { return this.backupLimit; } - private static final class PlotCacheKey { - - private final Plot plot; - - private PlotCacheKey(Plot plot) { - this.plot = plot; - } + private record PlotCacheKey( + Plot plot + ) { @Override public boolean equals(final Object o) { diff --git a/Core/src/main/java/com/plotsquared/core/command/Add.java b/Core/src/main/java/com/plotsquared/core/command/Add.java index a457b6c50..45db5366d 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Add.java +++ b/Core/src/main/java/com/plotsquared/core/command/Add.java @@ -26,12 +26,13 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.Collection; @@ -58,19 +59,21 @@ public class Add extends Command { @Override public CompletableFuture execute( - final PlotPlayer player, String[] args, + final PlotPlayer player, + String[] args, RunnableVal3 confirm, RunnableVal2 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()) || Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_TRUST), + plot.isOwner(player.getUUID()) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_TRUST), TranslatableCaption.of("permission.no_plot_perms") ); - checkTrue(args.length == 1, TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot add ") + checkTrue( + args.length == 1, + TranslatableCaption.of("commandconfig.command_syntax"), + TagResolver.resolver("value", Tag.inserting(Component.text("/plot add "))) ); final CompletableFuture future = new CompletableFuture<>(); PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> { @@ -80,7 +83,7 @@ public class Add extends Command { } else { player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Template.of("value", args[0]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[0]))) ); } future.completeExceptionally(throwable); @@ -88,18 +91,19 @@ public class Add extends Command { } else { try { checkTrue(!uuids.isEmpty(), TranslatableCaption.of("errors.invalid_player"), - Template.of("value", args[0]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[0]))) ); Iterator iterator = uuids.iterator(); int size = plot.getTrusted().size() + plot.getMembers().size(); while (iterator.hasNext()) { UUID uuid = iterator.next(); - if (uuid == DBFunc.EVERYONE && !( - Permissions.hasPermission(player, Permission.PERMISSION_TRUST_EVERYONE) || Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_TRUST))) { + if (uuid == DBFunc.EVERYONE && !(player.hasPermission(Permission.PERMISSION_TRUST_EVERYONE) || player.hasPermission( + Permission.PERMISSION_ADMIN_COMMAND_TRUST))) { player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Template.of("value", PlayerManager.resolveName(uuid).getComponent(player)) + TagResolver.resolver("value", Tag.inserting( + PlayerManager.resolveName(uuid).toComponent(player) + )) ); iterator.remove(); continue; @@ -107,7 +111,9 @@ public class Add extends Command { if (plot.isOwner(uuid)) { player.sendMessage( TranslatableCaption.of("member.already_added"), - Template.of("player", PlayerManager.resolveName(uuid).getComponent(player)) + TagResolver.resolver("player", Tag.inserting( + PlayerManager.resolveName(uuid).toComponent(player) + )) ); iterator.remove(); continue; @@ -115,7 +121,9 @@ public class Add extends Command { if (plot.getMembers().contains(uuid)) { player.sendMessage( TranslatableCaption.of("member.already_added"), - Template.of("player", PlayerManager.resolveName(uuid).getComponent(player)) + TagResolver.resolver("player", Tag.inserting( + PlayerManager.resolveName(uuid).toComponent(player) + )) ); iterator.remove(); continue; @@ -124,11 +132,11 @@ public class Add extends Command { } checkTrue(!uuids.isEmpty(), null); int localAddSize = plot.getMembers().size(); - int maxAddSize = Permissions.hasPermissionRange(player, Permission.PERMISSION_ADD, Settings.Limit.MAX_PLOTS); + int maxAddSize = player.hasPermissionRange(Permission.PERMISSION_ADD, Settings.Limit.MAX_PLOTS); if (localAddSize >= maxAddSize) { player.sendMessage( TranslatableCaption.of("members.plot_max_members_added"), - Template.of("amount", String.valueOf(localAddSize)) + TagResolver.resolver("amount", Tag.inserting(Component.text(localAddSize))) ); return; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Alias.java b/Core/src/main/java/com/plotsquared/core/command/Alias.java index 9063ede69..a52e47ef2 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Alias.java +++ b/Core/src/main/java/com/plotsquared/core/command/Alias.java @@ -26,9 +26,10 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import java.util.ArrayList; import java.util.Collection; @@ -92,7 +93,10 @@ public class Alias extends SubCommand { } else { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_ALIAS_SET)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ALIAS_SET) + ) ); } } @@ -108,7 +112,10 @@ public class Alias extends SubCommand { } else { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_ALIAS_REMOVE)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ALIAS_REMOVE) + ) ); } } @@ -149,13 +156,16 @@ public class Alias extends SubCommand { .anyMatch()) { player.sendMessage( TranslatableCaption.of("alias.alias_is_taken"), - Template.of("alias", alias) + TagResolver.resolver("alias", Tag.inserting(Component.text(alias))) ); return; } if (Settings.UUID.OFFLINE) { plot.setAlias(alias); - player.sendMessage(TranslatableCaption.of("alias.alias_set_to"), Template.of("alias", alias)); + player.sendMessage( + TranslatableCaption.of("alias.alias_set_to"), + TagResolver.resolver("alias", Tag.inserting(Component.text(alias))) + ); return; } PlotSquared.get().getImpromptuUUIDPipeline().getSingle(alias, ((uuid, throwable) -> { @@ -164,13 +174,13 @@ public class Alias extends SubCommand { } else if (uuid != null) { player.sendMessage( TranslatableCaption.of("alias.alias_is_taken"), - Template.of("alias", alias) + TagResolver.resolver("alias", Tag.inserting(Component.text(alias))) ); } else { plot.setAlias(alias); player.sendMessage( TranslatableCaption.of("alias.alias_set_to"), - Template.of("alias", alias) + TagResolver.resolver("alias", Tag.inserting(Component.text(alias))) ); } })); @@ -182,7 +192,7 @@ public class Alias extends SubCommand { if (!plot.getAlias().isEmpty()) { player.sendMessage( TranslatableCaption.of("alias.alias_removed"), - Template.of("alias", alias) + TagResolver.resolver("alias", Tag.inserting(Component.text(alias))) ); } else { player.sendMessage( @@ -194,7 +204,7 @@ public class Alias extends SubCommand { } private boolean isPermitted(PlotPlayer player, Permission permission) { - return Permissions.hasPermission(player, permission); + return player.hasPermission(permission); } } diff --git a/Core/src/main/java/com/plotsquared/core/command/Area.java b/Core/src/main/java/com/plotsquared/core/command/Area.java index 4931d2cac..5897322b2 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Area.java +++ b/Core/src/main/java/com/plotsquared/core/command/Area.java @@ -24,7 +24,6 @@ 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; @@ -48,7 +47,6 @@ 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; @@ -57,6 +55,7 @@ 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; @@ -69,7 +68,9 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.io.File; @@ -138,17 +139,20 @@ public class Area extends SubCommand { player.sendMessage(RequiredType.CONSOLE.getErrorMessage()); return false; } - if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_CREATE)) { + if (!player.hasPermission(Permission.PERMISSION_AREA_CREATE)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_AREA_CREATE)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_AREA_CREATE) + ) ); return false; } if (args.length < 2) { player.sendMessage( TranslatableCaption.of("single.single_area_needs_name"), - Template.of("command", "/plot area single ") + TagResolver.resolver("command", Tag.inserting(Component.text("/plot area single "))) ); return false; } @@ -229,10 +233,9 @@ public class Area extends SubCommand { try (final ClipboardWriter clipboardWriter = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(new FileOutputStream( file))) { final BlockArrayClipboard clipboard = new BlockArrayClipboard(selectedRegion); - final EditSession editSession = WorldEdit - .getInstance() - .getEditSessionFactory() - .getEditSession(selectedRegion.getWorld(), -1); + EditSessionBuilder editSessionBuilder = WorldEdit.getInstance().newEditSessionBuilder(); + editSessionBuilder.world(selectedRegion.getWorld()); + final EditSession editSession = editSessionBuilder.build(); final ForwardExtentCopy forwardExtentCopy = new ForwardExtentCopy(editSession, selectedRegion, clipboard, selectedRegion.getMinimumPoint()); forwardExtentCopy.setCopyingBiomes(true); @@ -280,7 +283,7 @@ public class Area extends SubCommand { } else { player.sendMessage( TranslatableCaption.of("errors.error_create"), - Template.of("world", hybridPlotWorld.getWorldName()) + TagResolver.resolver("world", Tag.inserting(Component.text(hybridPlotWorld.getWorldName()))) ); } }; @@ -288,10 +291,13 @@ public class Area extends SubCommand { return true; } case "c", "setup", "create" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_CREATE)) { + if (!player.hasPermission(Permission.PERMISSION_AREA_CREATE)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_AREA_CREATE)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_AREA_CREATE) + ) ); return false; } @@ -299,7 +305,10 @@ public class Area extends SubCommand { case 1: player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Templates.of("value", "/plot area create [world[:id]] [=]...") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("/plot area create [world[:id]] [=]...")) + ) ); return false; case 2: @@ -313,7 +322,11 @@ public class Area extends SubCommand { if (area == null) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Templates.of("value", "/plot area create [world[:id]] [=]...") + TagResolver.resolver( + "value", + Tag.inserting(Component.text( + "/plot area create [world[:id]] [=]...")) + ) ); return false; } @@ -324,12 +337,18 @@ public class Area extends SubCommand { ); player.sendMessage( TranslatableCaption.of("set.set_attribute"), - Template.of("attribute", "area_pos1"), - Template.of("value", location.getX() + "," + location.getZ()) + 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() ); player.sendMessage( TranslatableCaption.of("area.set_pos2"), - Template.of("command", "/plot area create pos2") + TagResolver.resolver("command", Tag.inserting(Component.text("/plot area create pos2"))) ); return true; } @@ -343,7 +362,11 @@ public class Area extends SubCommand { if (area == null) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Templates.of("value", "/plot area create [world[:id]] [=]...") + TagResolver.resolver( + "value", + Tag.inserting(Component.text( + "/plot area create [world[:id]] [=]...")) + ) ); return false; } @@ -370,7 +393,10 @@ public class Area extends SubCommand { if (!areas.isEmpty()) { player.sendMessage( TranslatableCaption.of("cluster.cluster_intersection"), - Template.of("cluster", areas.iterator().next().toString()) + TagResolver.resolver( + "cluster", + Tag.inserting(areas.iterator().next()) + ) ); return false; } @@ -396,8 +422,7 @@ 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.generate( - null, + queue.setChunkConsumer(chunk -> AugmentedUtils.generateChunk( world, chunk.getX(), chunk.getZ(), @@ -409,7 +434,7 @@ public class Area extends SubCommand { } else { player.sendMessage( TranslatableCaption.of("errors.error_create"), - Template.of("world", area.getWorldName()) + TagResolver.resolver("world", Tag.inserting(Component.text(area.getWorldName()))) ); } }; @@ -443,7 +468,7 @@ public class Area extends SubCommand { if (other != null && Objects.equals(pa.getId(), other.getId())) { player.sendMessage( TranslatableCaption.of("setup.setup_world_taken"), - Template.of("value", pa.toString()) + TagResolver.resolver("value", Tag.inserting(Component.text(pa.getId()))) ); return false; } @@ -458,8 +483,13 @@ public class Area extends SubCommand { if (pair.length != 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax_extended"), - Template.of("value1,", getCommandString()), - Template.of("value2", " create [world[:id]] [=]...") + TagResolver.builder() + .tag("value1", Tag.inserting(Component.text(getCommandString()))) + .tag( + "value2", + Tag.inserting(Component.text("create [world[:id]] [=]...")) + ) + .build() ); return false; } @@ -495,8 +525,14 @@ public class Area extends SubCommand { default -> { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax_extended"), - Template.of("value1", getCommandString()), - Template.of("value2", " create [world[:id]] [=]...") + TagResolver.builder() + .tag("value1", Tag.inserting(Component.text(getCommandString()))) + .tag( + "value2", + Tag.inserting(Component.text( + " create [world[:id]] [=]...")) + ) + .build() ); return false; } @@ -506,7 +542,7 @@ public class Area extends SubCommand { if (this.worldUtil.isWorld(pa.getWorldName())) { player.sendMessage( TranslatableCaption.of("setup.setup_world_taken"), - Template.of("value", pa.getWorldName()) + TagResolver.resolver("value", Tag.inserting(Component.text(pa.getWorldName()))) ); return false; } @@ -527,7 +563,7 @@ public class Area extends SubCommand { } else { player.sendMessage( TranslatableCaption.of("errors.error_create"), - Template.of("world", pa.getWorldName()) + TagResolver.resolver("world", Tag.inserting(Component.text(pa.getWorldName()))) ); } try { @@ -546,12 +582,18 @@ public class Area extends SubCommand { if (pa.getId() == null) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", getUsage()) + TagResolver.resolver("value", Tag.inserting(Component.text(getUsage()))) ); player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax_extended"), - Template.of("value1", getCommandString()), - Template.of("value2", " create [world[:id]] [=]...") + TagResolver.builder() + .tag("value1", Tag.inserting(Component.text(getCommandString()))) + .tag( + "value2", + Tag.inserting(Component.text( + " create [world[:id]] [=]...")) + ) + .build() ); return false; } @@ -568,17 +610,20 @@ public class Area extends SubCommand { metaData.computeIfAbsent(player.getUUID(), missingUUID -> new HashMap<>()).put("area_create_area", pa); player.sendMessage( TranslatableCaption.of("single.get_position"), - Template.of("command", getCommandString()) + TagResolver.resolver("command", Tag.inserting(Component.text(getCommandString()))) ); break; } return true; } case "i", "info" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_INFO)) { + if (!player.hasPermission(Permission.PERMISSION_AREA_INFO)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_AREA_INFO)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_AREA_INFO) + ) ); return false; } @@ -589,15 +634,20 @@ public class Area extends SubCommand { default -> { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax_extended"), - Template.of("value1", getCommandString()), - Template.of("value2", " info [area]") + TagResolver.builder() + .tag("value1", Tag.inserting(Component.text(getCommandString()))) + .tag("value2", Tag.inserting(Component.text(" info [area]"))) + .build() ); return false; } } if (area == null) { if (args.length == 2) { - player.sendMessage(TranslatableCaption.of("errors.not_valid_plot_world"), Template.of("value", args[1])); + player.sendMessage( + TranslatableCaption.of("errors.not_valid_plot_world"), + TagResolver.resolver("value", Tag.inserting(Component.text(args[1]))) + ); } else { player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world")); } @@ -621,42 +671,35 @@ public class Area extends SubCommand { percent = claimed == 0 ? 0 : 100d * claimed / Integer.MAX_VALUE; region = "N/A"; } - 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 - ); + 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); return true; } case "l", "list" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_LIST)) { + if (!player.hasPermission(Permission.PERMISSION_AREA_LIST)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_AREA_LIST)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_AREA_LIST) + ) ); return false; } @@ -673,8 +716,10 @@ public class Area extends SubCommand { default: player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax_extended"), - Template.of("value1", getCommandString()), - Template.of("value2", " list [#]") + TagResolver.builder() + .tag("value1", Tag.inserting(Component.text(getCommandString()))) + .tag("value2", Tag.inserting(Component.text(" list [#]"))) + .build() ); return false; } @@ -700,46 +745,39 @@ public class Area extends SubCommand { percent = claimed == 0 ? 0 : (double) claimed / Short.MAX_VALUE * Short.MAX_VALUE; region = "N/A"; } - 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.setTemplates( - tooltipTemplate, - visitcmdTemplate, - numberTemplate, - nameTemplate, - typeTemplate, - terrainTemplate, - infocmdTemplate + 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(); + caption.set(TranslatableCaption.of("info.area_list_item")); + caption.setTagResolvers(resolver); } }, "/plot area list", TranslatableCaption.of("list.area_list_header_paged")); return true; } case "regen", "clear", "reset", "regenerate" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_REGEN)) { + if (!player.hasPermission(Permission.PERMISSION_AREA_REGEN)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_AREA_REGEN)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_AREA_REGEN) + ) ); return false; } @@ -751,13 +789,12 @@ public class Area extends SubCommand { if (area.getType() != PlotAreaType.PARTIAL) { player.sendMessage( TranslatableCaption.of("single.delete_world_region"), - Template.of("world", area.getWorldName()) + TagResolver.resolver("world", Tag.inserting(Component.text(area.getWorldName()))) ); return false; } QueueCoordinator queue = blockQueue.getNewQueue(worldUtil.getWeWorld(area.getWorldName())); - queue.setChunkConsumer(chunk -> AugmentedUtils.generate( - null, + queue.setChunkConsumer(chunk -> AugmentedUtils.generateChunk( area.getWorldName(), chunk.getX(), chunk.getZ(), @@ -769,23 +806,26 @@ public class Area extends SubCommand { return true; } case "goto", "v", "teleport", "visit", "tp" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_AREA_TP)) { + if (!player.hasPermission(Permission.PERMISSION_AREA_TP)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_AREA_TP)) + TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_AREA_TP)) ); return false; } if (args.length != 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot area tp [area]") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot area tp [area]"))) ); return false; } PlotArea area = this.plotAreaManager.getPlotAreaByString(args[1]); if (area == null) { - player.sendMessage(TranslatableCaption.of("errors.not_valid_plot_world"), Template.of("value", args[1])); + player.sendMessage( + TranslatableCaption.of("errors.not_valid_plot_world"), + TagResolver.resolver("value", Tag.inserting(Component.text(args[1]))) + ); return false; } Location center; @@ -825,19 +865,19 @@ public class Area extends SubCommand { public Collection tab(final PlotPlayer player, final String[] args, final boolean space) { if (args.length == 1) { final List completions = new LinkedList<>(); - if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_CREATE)) { + if (player.hasPermission(Permission.PERMISSION_AREA_CREATE)) { completions.add("create"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_CREATE)) { + if (player.hasPermission(Permission.PERMISSION_AREA_CREATE)) { completions.add("single"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_LIST)) { + if (player.hasPermission(Permission.PERMISSION_AREA_LIST)) { completions.add("list"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_INFO)) { + if (player.hasPermission(Permission.PERMISSION_AREA_INFO)) { completions.add("info"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_TP)) { + if (player.hasPermission(Permission.PERMISSION_AREA_TP)) { completions.add("tp"); } final List commands = completions.stream().filter(completion -> completion @@ -852,7 +892,7 @@ public class Area extends SubCommand { CommandCategory.ADMINISTRATION ) { }).collect(Collectors.toCollection(LinkedList::new)); - if (Permissions.hasPermission(player, Permission.PERMISSION_AREA) && args[0].length() > 0) { + if (player.hasPermission(Permission.PERMISSION_AREA) && args[0].length() > 0) { commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList())); } return commands; diff --git a/Core/src/main/java/com/plotsquared/core/command/Auto.java b/Core/src/main/java/com/plotsquared/core/command/Auto.java index c59edbd64..a31d17c46 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Auto.java +++ b/Core/src/main/java/com/plotsquared/core/command/Auto.java @@ -35,16 +35,18 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -110,13 +112,13 @@ public class Auto extends SubCommand { if (diff < 0 && grantedPlots < sizeX * sizeZ) { player.sendMessage( TranslatableCaption.of("permission.cant_claim_more_plots"), - Template.of("amount", String.valueOf(diff + grantedPlots)) + TagResolver.resolver("amount", Tag.inserting(Component.text(diff + grantedPlots))) ); return false; } else if (diff >= 0 && grantedPlots + diff < sizeX * sizeZ) { player.sendMessage( TranslatableCaption.of("permission.cant_claim_more_plots"), - Template.of("amount", String.valueOf(diff + grantedPlots)) + TagResolver.resolver("amount", Tag.inserting(Component.text(diff + grantedPlots))) ); return false; } else { @@ -128,15 +130,16 @@ public class Auto extends SubCommand { } player.sendMessage( TranslatableCaption.of("economy.removed_granted_plot"), - Template.of("usedGrants", String.valueOf(grantedPlots - left)), - Template.of("remainingGrants", String.valueOf(left)) + TagResolver.builder() + .tag("usedGrants", Tag.inserting(Component.text(grantedPlots - left))) + .tag("remainingGrants", Tag.inserting(Component.text(left))) + .build() ); } } else { player.sendMessage( TranslatableCaption.of("permission.cant_claim_more_plots"), - Template.of("amount", String.valueOf(player.getAllowedPlots()) - ) + TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots()))) ); return false; } @@ -215,7 +218,7 @@ public class Auto extends SubCommand { } else { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", getUsage()) + TagResolver.resolver("value", Tag.inserting(Component.text(getUsage()))) ); return true; } @@ -238,7 +241,7 @@ public class Auto extends SubCommand { if (event.getEventResult() == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Auto claim") + TagResolver.resolver("value", Tag.inserting(Component.text("Auto claim"))) ); return true; } @@ -246,16 +249,17 @@ public class Auto extends SubCommand { sizeX = event.getSizeX(); sizeZ = event.getSizeZ(); schematic = event.getSchematic(); - if (!force && mega && !Permissions.hasPermission(player, Permission.PERMISSION_AUTO_MEGA)) { + if (!force && mega && !player.hasPermission(Permission.PERMISSION_AUTO_MEGA)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_AUTO_MEGA)) + TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_AUTO_MEGA)) ); + return false; } if (!force && sizeX * sizeZ > Settings.Claim.MAX_AUTO_AREA) { player.sendMessage( TranslatableCaption.of("permission.cant_claim_more_plots_num"), - Template.of("amount", String.valueOf(Settings.Claim.MAX_AUTO_AREA)) + TagResolver.resolver("amount", Tag.inserting(Component.text(Settings.Claim.MAX_AUTO_AREA))) ); return false; } @@ -273,29 +277,32 @@ public class Auto extends SubCommand { if (!plotarea.hasSchematic(schematic)) { player.sendMessage( TranslatableCaption.of("schematics.schematic_invalid_named"), - Template.of("schemname", schematic), - Template.of("reason", "non-existent") + TagResolver.builder() + .tag("schemname", Tag.inserting(Component.text(schematic))) + .tag("reason", Tag.inserting(Component.text("non-existent"))) + .build() ); return true; } - if (!force && !Permissions.hasPermission( - player, + if (!force && !player.hasPermission( Permission.PERMISSION_CLAIM_SCHEMATIC.format(schematic) - ) && !Permissions - .hasPermission(player, "plots.admin.command.schematic")) { + ) && !player.hasPermission("plots.admin.command.schematic")) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", "plots.claim.%s0") + TagResolver.resolver("node", Tag.inserting(Component.text("plots.claim.%s0"))) ); return true; } } 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 = (sizeX * sizeZ) * cost; + cost = size * cost + mergeCost; if (cost > 0d) { if (!this.econHandler.isSupported()) { player.sendMessage(TranslatableCaption.of("economy.vault_or_consumer_null")); @@ -304,21 +311,26 @@ public class Auto extends SubCommand { if (!force && this.econHandler.getMoney(player) < cost) { player.sendMessage( TranslatableCaption.of("economy.cannot_afford_plot"), - Template.of("money", this.econHandler.format(cost)), - Template.of("balance", this.econHandler.format(this.econHandler.getMoney(player))) + 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() ); return false; } this.econHandler.withdrawMoney(player, cost); player.sendMessage( TranslatableCaption.of("economy.removed_balance"), - Template.of("money", this.econHandler.format(cost)) + TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(cost)))) ); } } List plots = this.servicePipeline - .pump(new AutoService.AutoQuery(player, null, sizeX, sizeZ, plotarea)) + .pump(new AutoQuery(player, null, sizeX, sizeZ, plotarea)) .through(AutoService.class) .getResult(); @@ -346,7 +358,7 @@ public class Auto extends SubCommand { if (!force && mergeEvent.getEventResult() == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Auto merge") + TagResolver.resolver("value", Tag.inserting(Component.text("Auto merge"))) ); return false; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Backup.java b/Core/src/main/java/com/plotsquared/core/command/Backup.java index adb832c61..3ccbb3f98 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Backup.java +++ b/Core/src/main/java/com/plotsquared/core/command/Backup.java @@ -27,10 +27,11 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.nio.file.Files; @@ -67,7 +68,7 @@ public final class Backup extends Command { private static boolean sendMessage(PlotPlayer player) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot backup ") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot backup "))) ); return true; } @@ -135,34 +136,44 @@ public final class Backup extends Command { } else if (!plot.hasOwner()) { player.sendMessage( TranslatableCaption.of("backups.backup_impossible"), - Template.of("plot", TranslatableCaption.of("generic.generic_unowned").getComponent(player)) + TagResolver.resolver("plot", Tag.inserting( + TranslatableCaption.of("generic.generic_unowned").toComponent(player) + )) ); } else if (plot.getVolume() > Integer.MAX_VALUE) { player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large")); } else if (plot.isMerged()) { player.sendMessage( TranslatableCaption.of("backups.backup_impossible"), - Template.of("plot", TranslatableCaption.of("generic.generic_merged").getComponent(player)) + TagResolver.resolver("plot", Tag.inserting( + TranslatableCaption.of("generic.generic_merged").toComponent(player) + )) ); - } else if (!plot.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_BACKUP_OTHER)) { + } else if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_BACKUP_OTHER)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BACKUP_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BACKUP_OTHER) + ) ); } else { final BackupProfile backupProfile = Objects.requireNonNull(this.backupManager.getProfile(plot)); if (backupProfile instanceof NullBackupProfile) { player.sendMessage( TranslatableCaption.of("backups.backup_impossible"), - Template.of("plot", TranslatableCaption.of("generic.generic_other").getComponent(player)) + TagResolver.resolver( + "plot", Tag.inserting(TranslatableCaption + .of("generic.generic_other") + .toComponent(player)) + ) ); } else { backupProfile.createBackup().whenComplete((backup, throwable) -> { if (throwable != null) { player.sendMessage( TranslatableCaption.of("backups.backup_save_failed"), - Template.of("reason", throwable.getMessage()) + TagResolver.resolver("reason", Tag.inserting(Component.text(throwable.getMessage()))) ); throwable.printStackTrace(); } else { @@ -189,50 +200,64 @@ public final class Backup extends Command { } else if (!plot.hasOwner()) { player.sendMessage( TranslatableCaption.of("backups.backup_impossible"), - Template.of("plot", TranslatableCaption.of("generic.generic_unowned").getComponent(player)) + TagResolver.resolver("plot", Tag.inserting( + TranslatableCaption.of("generic.generic_unowned").toComponent(player) + )) ); } else if (plot.isMerged()) { player.sendMessage( TranslatableCaption.of("backups.backup_impossible"), - Template.of("plot", TranslatableCaption.of("generic.generic_merged").getComponent(player)) + TagResolver.resolver("plot", Tag.inserting( + TranslatableCaption.of("generic.generic_merged").toComponent(player) + )) ); } else if (plot.getVolume() > Integer.MAX_VALUE) { player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large")); - } else if (!plot.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_BACKUP_OTHER)) { + } else if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_BACKUP_OTHER)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BACKUP_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BACKUP_OTHER) + ) ); } else { final BackupProfile backupProfile = Objects.requireNonNull(this.backupManager.getProfile(plot)); if (backupProfile instanceof NullBackupProfile) { player.sendMessage( TranslatableCaption.of("backups.backup_impossible"), - Template.of("plot", TranslatableCaption.of("generic.generic_other").getComponent(player)) + TagResolver.resolver("plot", Tag.inserting( + TranslatableCaption.of("generic.generic_other").toComponent(player) + )) ); } else { backupProfile.listBackups().whenComplete((backups, throwable) -> { if (throwable != null) { player.sendMessage( TranslatableCaption.of("backups.backup_list_failed"), - Template.of("reason", throwable.getMessage()) + TagResolver.resolver("reason", Tag.inserting(Component.text(throwable.getMessage()))) ); throwable.printStackTrace(); } else { player.sendMessage( TranslatableCaption.of("backups.backup_list_header"), - Template.of("plot", plot.getId().toCommaSeparatedString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toCommaSeparatedString()))) ); try { for (int i = 0; i < backups.size(); i++) { player.sendMessage( TranslatableCaption.of("backups.backup_list_entry"), - 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() - ))) + 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() ); } } catch (final Exception e) { @@ -260,25 +285,31 @@ public final class Backup extends Command { } else if (!plot.hasOwner()) { player.sendMessage( TranslatableCaption.of("backups.backup_impossible"), - Template.of("plot", TranslatableCaption.of("generic.generic_unowned").getComponent(player)) + TagResolver.resolver("plot", Tag.inserting( + TranslatableCaption.of("generic.generic_unowned").toComponent(player) + )) ); } else if (plot.isMerged()) { player.sendMessage( TranslatableCaption.of("backups.backup_impossible"), - Template.of("plot", TranslatableCaption.of("generic.generic_merged").getComponent(player)) + TagResolver.resolver("plot", Tag.inserting( + TranslatableCaption.of("generic.generic_merged").toComponent(player) + )) ); } else if (plot.getVolume() > Integer.MAX_VALUE) { player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large")); - } else if (!plot.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_BACKUP_OTHER)) { + } else if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_BACKUP_OTHER)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BACKUP_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_BACKUP_OTHER) + ) ); } else if (args.length == 0) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "Usage: /plot backup save/list/load") + TagResolver.resolver("value", Tag.inserting(Component.text("Usage: /plot backup save/list/load"))) ); } else { final int number; @@ -287,7 +318,7 @@ public final class Backup extends Command { } catch (final Exception e) { player.sendMessage( TranslatableCaption.of("invalid.not_a_number"), - Template.of("value", args[0]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[0]))) ); return; } @@ -295,23 +326,27 @@ public final class Backup extends Command { if (backupProfile instanceof NullBackupProfile) { player.sendMessage( TranslatableCaption.of("backups.backup_impossible"), - Template.of("plot", TranslatableCaption.of("generic.generic_other").getComponent(player)) + TagResolver.resolver("plot", Tag.inserting( + TranslatableCaption.of("generic.generic_other").toComponent(player) + )) ); } else { backupProfile.listBackups().whenComplete((backups, throwable) -> { if (throwable != null) { player.sendMessage( TranslatableCaption.of("backups.backup_load_failure"), - Template.of("reason", throwable.getMessage()) + TagResolver.resolver("reason", Tag.inserting(Component.text(throwable.getMessage()))) ); throwable.printStackTrace(); } else { if (number < 1 || number > backups.size()) { player.sendMessage( TranslatableCaption.of("backups.backup_impossible"), - Template.of( + TagResolver.resolver( "plot", - TranslatableCaption.of("generic.generic_invalid_choice").getComponent(player) + Tag.inserting(TranslatableCaption + .of("generic.generic_invalid_choice") + .toComponent(player)) ) ); } else { @@ -321,9 +356,11 @@ public final class Backup extends Command { .exists(backup.getFile())) { player.sendMessage( TranslatableCaption.of("backups.backup_impossible"), - Template.of( + TagResolver.resolver( "plot", - TranslatableCaption.of("generic.generic_invalid_choice").getComponent(player) + Tag.inserting(TranslatableCaption + .of("generic.generic_invalid_choice") + .toComponent(player)) ) ); } else { @@ -333,7 +370,10 @@ public final class Backup extends Command { if (error != null) { player.sendMessage( TranslatableCaption.of("backups.backup_load_failure"), - Template.of("reason", error.getMessage()) + TagResolver.resolver( + "reason", + Tag.inserting(Component.text(error.getMessage())) + ) ); } else { player.sendMessage(TranslatableCaption.of("backups.backup_load_success")); diff --git a/Core/src/main/java/com/plotsquared/core/command/Biome.java b/Core/src/main/java/com/plotsquared/core/command/Biome.java index 2a909f49c..9e0aa1a77 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Biome.java +++ b/Core/src/main/java/com/plotsquared/core/command/Biome.java @@ -18,6 +18,7 @@ */ 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; @@ -25,7 +26,9 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import java.util.Collection; import java.util.Locale; @@ -47,16 +50,13 @@ public class Biome extends SetCommand { } catch (final Exception ignore) { } if (biome == null) { - String biomes = StringMan.join( - BiomeType.REGISTRY.values(), - MINI_MESSAGE.serialize(MINI_MESSAGE.parse(TranslatableCaption - .of("blocklist.block_list_separator") - .getComponent(player))) - ); + String separator = TranslatableCaption.of("blocklist.block_list_separator").getComponent(player); player.sendMessage(TranslatableCaption.of("biome.need_biome")); player.sendMessage( - TranslatableCaption.of("commandconfig.subcommand_set_options_header"), - Template.of("values", biomes) + StaticCaption.of( + TranslatableCaption.of("commandconfig.subcommand_set_options_header_only").getComponent(player) + + StringMan.join(BiomeType.REGISTRY.values(), separator) + ) ); return false; } @@ -73,7 +73,7 @@ public class Biome extends SetCommand { plot.removeRunning(); player.sendMessage( TranslatableCaption.of("biome.biome_set_to"), - Template.of("value", value.toLowerCase()) + TagResolver.resolver("value", Tag.inserting(Component.text(value.toLowerCase()))) ); }); return true; diff --git a/Core/src/main/java/com/plotsquared/core/command/Buy.java b/Core/src/main/java/com/plotsquared/core/command/Buy.java index 089bfb1bf..49222b66d 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Buy.java +++ b/Core/src/main/java/com/plotsquared/core/command/Buy.java @@ -32,7 +32,9 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.Set; @@ -84,7 +86,7 @@ public class Buy extends Command { checkTrue( player.getPlotCount() + plots.size() <= player.getAllowedPlots(), TranslatableCaption.of("permission.cant_claim_more_plots"), - Template.of("amount", String.valueOf(player.getAllowedPlots())) + TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots()))) ); double price = plot.getFlag(PriceFlag.class); if (price <= 0) { @@ -97,8 +99,10 @@ public class Buy extends Command { 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))) + 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() ); this.econHandler.withdrawMoney(player, price); // Failure @@ -106,7 +110,7 @@ public class Buy extends Command { confirm.run(this, () -> { player.sendMessage( TranslatableCaption.of("economy.removed_balance"), - Template.of("money", this.econHandler.format(price)) + TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price)))) ); this.econHandler.depositMoney(PlotSquared.platform().playerManager().getOfflinePlayer(plot.getOwnerAbs()), price); @@ -115,9 +119,11 @@ public class Buy extends Command { if (owner != null) { owner.sendMessage( TranslatableCaption.of("economy.plot_sold"), - Template.of("plot", plot.getId().toString()), - Template.of("player", player.getName()), - Template.of("price", this.econHandler.format(price)) + 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() ); } PlotFlag plotFlag = plot.getFlagContainer().getFlag(PriceFlag.class); @@ -126,9 +132,10 @@ public class Buy extends Command { plot.removeFlag(event.getFlag()); } plot.setOwner(player.getUUID()); + plot.getPlotModificationManager().setSign(player.getName()); player.sendMessage( TranslatableCaption.of("working.claimed"), - Template.of("plot", plot.getId().toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) ); whenDone.run(Buy.this, CommandResult.SUCCESS); }, () -> { diff --git a/Core/src/main/java/com/plotsquared/core/command/Caps.java b/Core/src/main/java/com/plotsquared/core/command/Caps.java index da99bcfb2..dd3cf7ec8 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Caps.java +++ b/Core/src/main/java/com/plotsquared/core/command/Caps.java @@ -29,8 +29,10 @@ import com.plotsquared.core.plot.flag.implementations.HostileCapFlag; import com.plotsquared.core.plot.flag.implementations.MiscCapFlag; import com.plotsquared.core.plot.flag.implementations.MobCapFlag; import com.plotsquared.core.plot.flag.implementations.VehicleCapFlag; -import com.plotsquared.core.util.Permissions; -import net.kyori.adventure.text.minimessage.Template; +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 static com.plotsquared.core.util.entity.EntityCategories.CAP_ANIMAL; import static com.plotsquared.core.util.entity.EntityCategories.CAP_ENTITY; @@ -51,11 +53,10 @@ public class Caps extends SubCommand { player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); return false; } - if (!plot.isAdded(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_CAPS_OTHER)) { + if (!plot.isAdded(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_CAPS_OTHER)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_CAPS_OTHER)) + TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_ADMIN_CAPS_OTHER)) ); return false; } @@ -82,15 +83,17 @@ 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)); - String maxBeautified = max >= Integer.MAX_VALUE - ? TranslatableCaption.of("info.infinite").getComponent(player) - : String.valueOf(max); + ComponentLike maxBeautified = max >= Integer.MAX_VALUE + ? TranslatableCaption.of("info.infinite").toComponent(player) + : Component.text(max); player.sendMessage( TranslatableCaption.of("info.plot_caps_format"), - Template.of("cap", name), - Template.of("current", String.valueOf(current)), - Template.of("limit", maxBeautified), - Template.of("percentage", percentage) + 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() ); } diff --git a/Core/src/main/java/com/plotsquared/core/command/Chat.java b/Core/src/main/java/com/plotsquared/core/command/Chat.java deleted file mode 100644 index 3a70c654c..000000000 --- a/Core/src/main/java/com/plotsquared/core/command/Chat.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * PlotSquared, a land and world management plugin for Minecraft. - * Copyright (C) IntellectualSites - * 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 . - */ -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; - } - -} diff --git a/Core/src/main/java/com/plotsquared/core/command/Claim.java b/Core/src/main/java/com/plotsquared/core/command/Claim.java index 821ade23d..e9848685c 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Claim.java +++ b/Core/src/main/java/com/plotsquared/core/command/Claim.java @@ -35,10 +35,11 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.checkerframework.checker.nullness.qual.NonNull; @@ -82,7 +83,7 @@ public class Claim extends SubCommand { if (event.getEventResult() == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Claim") + TagResolver.resolver("value", Tag.inserting(Component.text("Claim"))) ); return true; } @@ -101,14 +102,14 @@ public class Claim extends SubCommand { if (grants <= 0) { player.sendMessage( TranslatableCaption.of("permission.cant_claim_more_plots"), - Template.of("amount", String.valueOf(grants)) + TagResolver.resolver("amount", Tag.inserting(Component.text(grants))) ); metaDataAccess.remove(); } } else { player.sendMessage( TranslatableCaption.of("permission.cant_claim_more_plots"), - Template.of("amount", String.valueOf(player.getAllowedPlots())) + TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots()))) ); return false; } @@ -123,18 +124,19 @@ public class Claim extends SubCommand { if (!area.hasSchematic(schematic)) { player.sendMessage( TranslatableCaption.of("schematics.schematic_invalid_named"), - Template.of("schemname", schematic), - Template.of("reason", "non-existent") + TagResolver.builder() + .tag("schemname", Tag.inserting(Component.text(schematic))) + .tag("reason", Tag.inserting(Component.text("non-existent"))) + .build() ); } - if (!Permissions.hasPermission(player, Permission.PERMISSION_CLAIM_SCHEMATIC - .format(schematic)) && !Permissions.hasPermission( - player, + if (!player.hasPermission(Permission.PERMISSION_CLAIM_SCHEMATIC + .format(schematic)) && !player.hasPermission( "plots.admin.command.schematic" ) && !force) { player.sendMessage( TranslatableCaption.of("permission.no_schematic_permission"), - Template.of("value", schematic) + TagResolver.resolver("value", Tag.inserting(Component.text(schematic))) ); } } @@ -150,16 +152,28 @@ public class Claim extends SubCommand { if (this.econHandler.getMoney(player) < cost) { player.sendMessage( TranslatableCaption.of("economy.cannot_afford_plot"), - Template.of("money", this.econHandler.format(cost)), - Template.of("balance", this.econHandler.format(this.econHandler.getMoney(player))) + 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() ); return false; } this.econHandler.withdrawMoney(player, cost); player.sendMessage( TranslatableCaption.of("economy.removed_balance"), - Template.of("money", this.econHandler.format(cost)), - Template.of("balance", this.econHandler.format(this.econHandler.getMoney(player))) + 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() ); } } @@ -171,12 +185,14 @@ public class Claim extends SubCommand { } player.sendMessage( TranslatableCaption.of("economy.removed_granted_plot"), - Template.of("usedGrants", String.valueOf((grants - 1))), - Template.of("remainingGrants", String.valueOf(grants)) + TagResolver.builder() + .tag("usedGrants", Tag.inserting(Component.text(grants - 1))) + .tag("remainingGrants", Tag.inserting(Component.text(grants))) + .build() ); } } - if (!Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { + if (!player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { int border = area.getBorder(); if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border && !force) { player.sendMessage(TranslatableCaption.of("border.denied")); @@ -198,7 +214,7 @@ public class Claim extends SubCommand { if (mergeEvent.getEventResult() == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Auto merge on claim") + TagResolver.resolver("value", Tag.inserting(Component.text("Auto merge on claim"))) ); } else { if (plot.getPlotModificationManager().autoMerge( diff --git a/Core/src/main/java/com/plotsquared/core/command/Clear.java b/Core/src/main/java/com/plotsquared/core/command/Clear.java index a8d50e223..68d97e380 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Clear.java +++ b/Core/src/main/java/com/plotsquared/core/command/Clear.java @@ -32,11 +32,12 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.concurrent.CompletableFuture; @@ -79,7 +80,7 @@ public class Clear extends Command { if (eventResult == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Clear") + TagResolver.resolver("value", Tag.inserting(Component.text("Clear"))) ); return CompletableFuture.completedFuture(true); } @@ -89,13 +90,14 @@ public class Clear extends Command { } boolean force = eventResult == Result.FORCE; checkTrue( - force || plot.isOwner(player.getUUID()) || Permissions - .hasPermission(player, "plots.admin.command.clear"), + force || plot.isOwner(player.getUUID()) || player.hasPermission("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) || Permissions - .hasPermission(player, "plots.continue"), TranslatableCaption.of("done.done_already_done")); + checkTrue( + force || !Settings.Done.RESTRICT_BUILDING || !DoneFlag.isDone(plot) || player.hasPermission("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, @@ -105,36 +107,35 @@ public class Clear extends Command { } BackupManager.backup(player, plot, () -> { final long start = System.currentTimeMillis(); - 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()); - } + 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()); } - 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"), - Template.of("amount", String.valueOf(System.currentTimeMillis() - start)), - Template.of("plot", plot.getId().toString()) - ); - }); - }); + } + 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() + ); + })); if (!result) { player.sendMessage(TranslatableCaption.of("errors.wait_for_timer")); } else { diff --git a/Core/src/main/java/com/plotsquared/core/command/Cluster.java b/Core/src/main/java/com/plotsquared/core/command/Cluster.java index 74d38407d..f52a56616 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Cluster.java +++ b/Core/src/main/java/com/plotsquared/core/command/Cluster.java @@ -32,20 +32,26 @@ 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.Permissions; +import com.plotsquared.core.util.ComponentHelper; import com.plotsquared.core.util.TabCompletions; import com.plotsquared.core.util.query.PlotQuery; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import java.util.Collection; import java.util.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", @@ -54,36 +60,39 @@ import java.util.stream.Collectors; 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"), - Template.of( - "list", - "list, create, delete, resize, invite, kick, leave, members, info, tp, sethome" - ) + TagResolver.resolver("list", Tag.inserting(ComponentHelper.join(AVAILABLE_ARGS, SEPARATOR))) ); return false; } String sub = args[0].toLowerCase(); switch (sub) { - case "l": - case "list": { - if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_LIST)) { + case "l", "list" -> { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_LIST)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_LIST)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_LIST) + ) ); return false; } if (args.length != 1) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot cluster list") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster list"))) ); return false; } @@ -95,7 +104,7 @@ public class Cluster extends SubCommand { Set clusters = area.getClusters(); player.sendMessage( TranslatableCaption.of("cluster.cluster_list_heading"), - Template.of("amount", clusters.size() + "") + TagResolver.resolver("amount", Tag.inserting(Component.text(clusters.size()))) ); for (PlotCluster cluster : clusters) { // Ignore unmanaged clusters @@ -103,33 +112,35 @@ public class Cluster extends SubCommand { if (player.getUUID().equals(cluster.owner)) { player.sendMessage( TranslatableCaption.of("cluster.cluster_list_element_owner"), - Template.of("cluster", name) + TagResolver.resolver("cluster", Tag.inserting(Component.text(name))) ); } else if (cluster.helpers.contains(player.getUUID())) { player.sendMessage( TranslatableCaption.of("cluster.cluster_list_element_helpers"), - Template.of("cluster", name) + TagResolver.resolver("cluster", Tag.inserting(Component.text(name))) ); } else if (cluster.invited.contains(player.getUUID())) { player.sendMessage( TranslatableCaption.of("cluster.cluster_list_element_invited"), - Template.of("cluster", name) + TagResolver.resolver("cluster", Tag.inserting(Component.text(name))) ); } else { player.sendMessage( TranslatableCaption.of("cluster.cluster_list_element"), - Template.of("cluster", cluster.toString()) + TagResolver.resolver("cluster", Tag.inserting(Component.text(cluster.toString()))) ); } } return true; } - case "c": - case "create": { - if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_CREATE)) { + case "c", "create" -> { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_CREATE)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_CREATE)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_CREATE) + ) ); return false; } @@ -141,7 +152,10 @@ public class Cluster extends SubCommand { if (args.length != 4) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot cluster create ") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("/plot cluster create ")) + ) ); return false; } @@ -151,7 +165,7 @@ public class Cluster extends SubCommand { if (currentClusters >= player.getAllowedPlots()) { player.sendMessage( TranslatableCaption.of("permission.cant_claim_more_clusters"), - Template.of("amount", String.valueOf(player.getAllowedPlots())) + TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots()))) ); } PlotId pos1; @@ -169,7 +183,7 @@ public class Cluster extends SubCommand { if (area.getCluster(name) != null) { player.sendMessage( TranslatableCaption.of("alias.alias_is_taken"), - Template.of("alias", name) + TagResolver.resolver("alias", Tag.inserting(Component.text(name))) ); return false; } @@ -183,7 +197,7 @@ public class Cluster extends SubCommand { if (cluster != null) { player.sendMessage( TranslatableCaption.of("cluster.cluster_intersection"), - Template.of("cluster", cluster.getName()) + TagResolver.resolver("cluster", Tag.inserting(Component.text(cluster.getName()))) ); return false; } @@ -191,20 +205,22 @@ public class Cluster extends SubCommand { if (!area.contains(pos1) || !area.contains(pos2)) { player.sendMessage( TranslatableCaption.of("cluster.cluster_outside"), - Template.of("area", String.valueOf(area)) + TagResolver.resolver("area", Tag.inserting(Component.text(area.toString()))) ); return false; } Set plots = area.getPlotSelectionOwned(pos1, pos2); if (!plots.isEmpty()) { - if (!Permissions - .hasPermission(player, Permission.PERMISSION_CLUSTER_CREATE_OTHER)) { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_CREATE_OTHER)) { UUID uuid = player.getUUID(); for (Plot plot : plots) { if (!plot.isOwner(uuid)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_CREATE_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_CREATE_OTHER) + ) ); return false; } @@ -219,14 +235,17 @@ public class Cluster extends SubCommand { } else { current = player.getPlayerClusterCount(player.getLocation().getWorldName()); } - int allowed = Permissions - .hasPermissionRange(player, Permission.PERMISSION_CLUSTER_SIZE, - Settings.Limit.MAX_PLOTS - ); + int allowed = player.hasPermissionRange( + Permission.PERMISSION_CLUSTER_SIZE, + Settings.Limit.MAX_PLOTS + ); if (current + cluster.getArea() > allowed) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_CLUSTER_SIZE + "." + (current + cluster.getArea())) + TagResolver.resolver( + "node", + Tag.inserting(Component.text(Permission.PERMISSION_CLUSTER_SIZE + "." + (current + cluster.getArea()))) + ) ); return false; } @@ -245,24 +264,25 @@ public class Cluster extends SubCommand { } player.sendMessage( TranslatableCaption.of("cluster.cluster_created"), - Template.of("name", name) + TagResolver.resolver("name", Tag.inserting(Component.text(name))) ); return true; } - case "disband": - case "del": - case "delete": { - if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_DELETE)) { + case "disband", "del", "delete" -> { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_DELETE)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_DELETE)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_DELETE) + ) ); return false; } if (args.length != 1 && args.length != 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot cluster delete [name]") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster delete [name]"))) ); return false; } @@ -277,7 +297,7 @@ public class Cluster extends SubCommand { if (cluster == null) { player.sendMessage( TranslatableCaption.of("cluster.invalid_cluster_name"), - Template.of("cluster", args[1]) + TagResolver.resolver("cluster", Tag.inserting(Component.text(args[1]))) ); return false; } @@ -289,35 +309,39 @@ public class Cluster extends SubCommand { } } if (!cluster.owner.equals(player.getUUID())) { - if (!Permissions - .hasPermission(player, Permission.PERMISSION_CLUSTER_DELETE_OTHER)) { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_DELETE_OTHER)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_DELETE_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_DELETE_OTHER) + ) ); return false; } } DBFunc.delete(cluster); - player.sendMessage(TranslatableCaption.of("cluster.cluster_deleted"), Template.of( + player.sendMessage(TranslatableCaption.of("cluster.cluster_deleted"), TagResolver.resolver( "cluster", - String.valueOf(cluster) + Tag.inserting(Component.text(cluster.toString())) )); return true; } - case "res": - case "resize": { - if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_RESIZE)) { + case "res", "resize" -> { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_RESIZE)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_RESIZE) + ) ); return false; } if (args.length != 3) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot cluster resize [name]") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster resize [name]"))) ); return false; } @@ -347,11 +371,13 @@ public class Cluster extends SubCommand { return false; } if (!cluster.hasHelperRights(player.getUUID())) { - if (!Permissions - .hasPermission(player, Permission.PERMISSION_CLUSTER_RESIZE_OTHER)) { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE_OTHER)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_RESIZE_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_RESIZE_OTHER) + ) ); return false; } @@ -361,34 +387,37 @@ public class Cluster extends SubCommand { if (intersect != null) { player.sendMessage( TranslatableCaption.of("cluster.cluster_intersection"), - Template.of("cluster", intersect.getName()) + TagResolver.resolver("cluster", Tag.inserting(Component.text(intersect.getName()))) ); return false; } Set existing = area.getPlotSelectionOwned(cluster.getP1(), cluster.getP2()); Set newPlots = area.getPlotSelectionOwned(pos1, pos2); - // Set removed = (HashSet) existing.clone(); Set removed = new HashSet<>(existing); removed.removeAll(newPlots); // Check expand / shrink if (!removed.isEmpty()) { - if (!Permissions - .hasPermission(player, Permission.PERMISSION_CLUSTER_RESIZE_SHRINK)) { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE_SHRINK)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_RESIZE_SHRINK)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_RESIZE_SHRINK) + ) ); return false; } } newPlots.removeAll(existing); if (!newPlots.isEmpty()) { - if (!Permissions - .hasPermission(player, Permission.PERMISSION_CLUSTER_RESIZE_EXPAND)) { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE_EXPAND)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_RESIZE_EXPAND)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_RESIZE_EXPAND) + ) ); return false; } @@ -401,13 +430,16 @@ 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 = Permissions.hasPermissionRange(player, Permission.PERMISSION_CLUSTER, + int allowed = player.hasPermissionRange( + Permission.PERMISSION_CLUSTER, Settings.Limit.MAX_PLOTS ); if (current + cluster.getArea() > allowed) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_CLUSTER + "." + (current + cluster.getArea())) + TagResolver.resolver("node", Tag.inserting(Component.text( + Permission.PERMISSION_CLUSTER + "." + (current + cluster.getArea()) + ))) ); return false; } @@ -416,20 +448,21 @@ public class Cluster extends SubCommand { player.sendMessage(TranslatableCaption.of("cluster.cluster_resized")); return true; } - case "add": - case "inv": - case "invite": { - if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_INVITE)) { + case "add", "inv", "invite" -> { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_INVITE)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_CLUSTER_INVITE)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_INVITE) + ) ); return false; } if (args.length != 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot cluster invite ") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster invite "))) ); return false; } @@ -444,11 +477,13 @@ public class Cluster extends SubCommand { return false; } if (!cluster.hasHelperRights(player.getUUID())) { - if (!Permissions - .hasPermission(player, Permission.PERMISSION_CLUSTER_INVITE_OTHER)) { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_INVITE_OTHER)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_CLUSTER_INVITE_OTHER.toString()) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_INVITE_OTHER) + ) ); return false; } @@ -461,7 +496,7 @@ public class Cluster extends SubCommand { } else if (throwable != null) { player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Template.of("value", args[1]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[1]))) ); } else { if (!cluster.isAdded(uuid)) { @@ -473,7 +508,7 @@ public class Cluster extends SubCommand { if (otherPlayer != null) { player.sendMessage( TranslatableCaption.of("cluster.cluster_invited"), - Template.of("cluster", cluster.getName()) + TagResolver.resolver("cluster", Tag.inserting(Component.text(cluster.getName()))) ); } } @@ -482,20 +517,21 @@ public class Cluster extends SubCommand { }); return true; } - case "k": - case "remove": - case "kick": { - if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_KICK)) { + case "k", "remove", "kick" -> { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_KICK)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_CLUSTER_KICK.toString()) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_KICK) + ) ); return false; } if (args.length != 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot cluster kick ") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster kick "))) ); return false; } @@ -509,11 +545,13 @@ public class Cluster extends SubCommand { return false; } if (!cluster.hasHelperRights(player.getUUID())) { - if (!Permissions - .hasPermission(player, Permission.PERMISSION_CLUSTER_KICK_OTHER)) { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_KICK_OTHER)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_CLUSTER_KICK_OTHER.toString()) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_KICK_OTHER) + ) ); return false; } @@ -526,7 +564,7 @@ public class Cluster extends SubCommand { } else if (throwable != null) { player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Template.of("value", args[1]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[1]))) ); } else { // Can't kick if the player is yourself, the owner, or not added to the cluster @@ -534,7 +572,7 @@ public class Cluster extends SubCommand { || !cluster.isAdded(uuid)) { player.sendMessage( TranslatableCaption.of("cluster.cannot_kick_player"), - Template.of("value", cluster.getName()) + TagResolver.resolver("value", Tag.inserting(Component.text(cluster.getName()))) ); } else { if (cluster.helpers.contains(uuid)) { @@ -549,7 +587,7 @@ public class Cluster extends SubCommand { if (player2 != null) { player.sendMessage( TranslatableCaption.of("cluster.cluster_removed"), - Template.of("cluster", cluster.getName()) + TagResolver.resolver("cluster", Tag.inserting(Component.text(cluster.getName()))) ); } removePlayerPlots(cluster, uuid, player2.getLocation().getWorldName()); @@ -559,19 +597,21 @@ public class Cluster extends SubCommand { }); return true; } - case "quit": - case "leave": { - if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_LEAVE)) { + case "quit", "leave" -> { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_LEAVE)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_CLUSTER_LEAVE.toString()) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_LEAVE) + ) ); return false; } if (args.length != 1 && args.length != 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot cluster leave [name]") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster leave [name]"))) ); return false; } @@ -585,7 +625,7 @@ public class Cluster extends SubCommand { if (cluster == null) { player.sendMessage( TranslatableCaption.of("cluster.invalid_cluster_name"), - Template.of("cluster", args[1]) + TagResolver.resolver("cluster", Tag.inserting(Component.text(args[1]))) ); return false; } @@ -613,23 +653,29 @@ public class Cluster extends SubCommand { DBFunc.removeInvited(cluster, uuid); player.sendMessage( TranslatableCaption.of("cluster.cluster_removed"), - Template.of("cluster", cluster.getName()) + TagResolver.resolver("cluster", Tag.inserting(Component.text(cluster.getName()))) ); removePlayerPlots(cluster, uuid, player.getLocation().getWorldName()); return true; } - case "members": { - if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_HELPERS)) { + case "members" -> { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_HELPERS)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_CLUSTER_HELPERS.toString()) + TagResolver.resolver( + "node", + Tag.inserting(Component.text(Permission.PERMISSION_CLUSTER_HELPERS.toString())) + ) ); return false; } if (args.length != 3) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot cluster members ") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("/plot cluster members ")) + ) ); return false; } @@ -650,7 +696,7 @@ public class Cluster extends SubCommand { } else if (throwable != null) { player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Template.of("value", args[2]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[2]))) ); } else { if (args[1].equalsIgnoreCase("add")) { @@ -664,27 +710,30 @@ public class Cluster extends SubCommand { } else { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot cluster members ") + TagResolver.resolver("value", Tag.inserting(Component.text( + "/plot cluster members " + ))) ); } } }); return true; } - case "spawn": - case "home": - case "tp": { - if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_TP)) { + case "spawn", "home", "tp" -> { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_TP)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_CLUSTER_TP.toString()) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_TP) + ) ); return false; } if (args.length != 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot cluster tp ") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster tp "))) ); return false; } @@ -697,16 +746,19 @@ public class Cluster extends SubCommand { if (cluster == null) { player.sendMessage( TranslatableCaption.of("cluster.invalid_cluster_name"), - Template.of("cluster", args[1]) + TagResolver.resolver("cluster", Tag.inserting(Component.text(args[1]))) ); return false; } UUID uuid = player.getUUID(); if (!cluster.isAdded(uuid)) { - if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_TP_OTHER)) { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_TP_OTHER)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_CLUSTER_TP_OTHER.toString()) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_TP_OTHER) + ) ); return false; } @@ -715,21 +767,21 @@ public class Cluster extends SubCommand { player.sendMessage(TranslatableCaption.of("cluster.cluster_teleporting")); return true; } - case "i": - case "info": - case "show": - case "information": { - if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_INFO)) { + case "i", "info", "show", "information" -> { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_INFO)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_CLUSTER_TP.toString()) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_TP) + ) ); return false; } if (args.length != 1 && args.length != 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot cluster info [name]") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster info [name]"))) ); } PlotArea area = player.getApplicablePlotArea(); @@ -743,7 +795,7 @@ public class Cluster extends SubCommand { if (cluster == null) { player.sendMessage( TranslatableCaption.of("cluster.invalid_cluster_name"), - Template.of("cluster", args[1]) + TagResolver.resolver("cluster", Tag.inserting(Component.text(args[1]))) ); return false; } @@ -762,47 +814,36 @@ public class Cluster extends SubCommand { player.sendMessage(TranslatableCaption.of("players.fetching_players_timeout")); } else { final String owner; - if (username == null) { - owner = "unknown"; - } else { - owner = username; - } + owner = Objects.requireNonNullElse(username, "unknown"); 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"); - 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 - ); + 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); } }); return true; } - case "sh": - case "setspawn": - case "sethome": { - if (!Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_SETHOME)) { + case "sh", "setspawn", "sethome" -> { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_SETHOME)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_CLUSTER_SETHOME.toString()) + TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_CLUSTER_SETHOME)) ); return false; } if (args.length != 1 && args.length != 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot cluster sethome") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot cluster sethome"))) ); return false; } @@ -816,11 +857,13 @@ public class Cluster extends SubCommand { return false; } if (!cluster.hasHelperRights(player.getUUID())) { - if (!Permissions - .hasPermission(player, Permission.PERMISSION_CLUSTER_SETHOME_OTHER)) { + if (!player.hasPermission(Permission.PERMISSION_CLUSTER_SETHOME_OTHER)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_CLUSTER_SETHOME_OTHER.toString()) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_CLUSTER_SETHOME_OTHER) + ) ); return false; } @@ -839,10 +882,7 @@ public class Cluster extends SubCommand { } player.sendMessage( TranslatableCaption.of("cluster.cluster_available_args"), - Template.of( - "list", - "list, create, delete, resize, invite, kick, leave, members, info, tp, sethome" - ) + TagResolver.resolver("list", Tag.inserting(ComponentHelper.join(AVAILABLE_ARGS, SEPARATOR))) ); return false; } @@ -869,37 +909,37 @@ public class Cluster extends SubCommand { public Collection tab(final PlotPlayer player, final String[] args, final boolean space) { if (args.length == 1) { final List completions = new LinkedList<>(); - if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_LIST)) { + if (player.hasPermission(Permission.PERMISSION_CLUSTER_LIST)) { completions.add("list"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_CREATE)) { + if (player.hasPermission(Permission.PERMISSION_CLUSTER_CREATE)) { completions.add("create"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_DELETE)) { + if (player.hasPermission(Permission.PERMISSION_CLUSTER_DELETE)) { completions.add("delete"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_RESIZE)) { + if (player.hasPermission(Permission.PERMISSION_CLUSTER_RESIZE)) { completions.add("resize"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_INVITE)) { + if (player.hasPermission(Permission.PERMISSION_CLUSTER_INVITE)) { completions.add("invite"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_KICK)) { + if (player.hasPermission(Permission.PERMISSION_CLUSTER_KICK)) { completions.add("kick"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_KICK)) { + if (player.hasPermission(Permission.PERMISSION_CLUSTER_KICK)) { completions.add("leave"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_HELPERS)) { + if (player.hasPermission(Permission.PERMISSION_CLUSTER_HELPERS)) { completions.add("members"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_INFO)) { + if (player.hasPermission(Permission.PERMISSION_CLUSTER_INFO)) { completions.add("info"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_TP)) { + if (player.hasPermission(Permission.PERMISSION_CLUSTER_TP)) { completions.add("tp"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER_SETHOME)) { + if (player.hasPermission(Permission.PERMISSION_CLUSTER_SETHOME)) { completions.add("sethome"); } final List commands = completions.stream().filter(completion -> completion @@ -914,7 +954,7 @@ public class Cluster extends SubCommand { CommandCategory.ADMINISTRATION ) { }).collect(Collectors.toCollection(LinkedList::new)); - if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER) && args[0].length() > 0) { + if (player.hasPermission(Permission.PERMISSION_CLUSTER) && args[0].length() > 0) { commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList())); } return commands; diff --git a/Core/src/main/java/com/plotsquared/core/command/CmdConfirm.java b/Core/src/main/java/com/plotsquared/core/command/CmdConfirm.java index 374e9ec6e..0db2c3838 100644 --- a/Core/src/main/java/com/plotsquared/core/command/CmdConfirm.java +++ b/Core/src/main/java/com/plotsquared/core/command/CmdConfirm.java @@ -25,7 +25,9 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.Nullable; public class CmdConfirm { @@ -52,9 +54,11 @@ public class CmdConfirm { if (commandStr != null) { player.sendMessage( TranslatableCaption.of("confirm.requires_confirm"), - Template.of("command", commandStr), - Template.of("timeout", String.valueOf(Settings.Confirmation.CONFIRMATION_TIMEOUT_SECONDS)), - Template.of("value", "/plot 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() ); } TaskManager.runTaskLater(() -> { diff --git a/Core/src/main/java/com/plotsquared/core/command/Command.java b/Core/src/main/java/com/plotsquared/core/command/Command.java index c3cd5ce36..9205a4fd5 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Command.java +++ b/Core/src/main/java/com/plotsquared/core/command/Command.java @@ -25,13 +25,14 @@ 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.Template; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.Nullable; import java.lang.reflect.InvocationTargetException; @@ -256,10 +257,14 @@ public abstract class Command { max = c.size(); } // Send the header - 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); + 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() + ); // Send the page content List subList = c.subList(page * size, max); int i = page * size; @@ -267,13 +272,24 @@ public abstract class Command { i++; final CaptionHolder msg = new CaptionHolder(); add.run(i, obj, msg); - player.sendMessage(msg.get(), msg.getTemplates()); + player.sendMessage(msg.get(), msg.getTagResolvers()); } // Send the footer - 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); + 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() + ); } /** @@ -325,7 +341,7 @@ public abstract class Command { if (commands.isEmpty()) { player.sendMessage( TranslatableCaption.of("commandconfig.did_you_mean"), - Template.of("value", MainCommand.getInstance().help.getUsage()) + TagResolver.resolver("value", Tag.inserting(Component.text(MainCommand.getInstance().help.getUsage()))) ); return CompletableFuture.completedFuture(false); } @@ -346,7 +362,7 @@ public abstract class Command { } player.sendMessage( TranslatableCaption.of("commandconfig.did_you_mean"), - Template.of("value", cmd.getUsage()) + TagResolver.resolver("value", Tag.inserting(Component.text(cmd.getUsage()))) ); return CompletableFuture.completedFuture(false); } @@ -381,7 +397,7 @@ public abstract class Command { // TODO improve or remove the Argument system player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", StringMan.join(fullSplit, " ")) + TagResolver.resolver("value", Tag.inserting(Component.text(StringMan.join(fullSplit, " ")))) ); return false; } @@ -466,11 +482,11 @@ public abstract class Command { if (message) { player.sendMessage(this.required.getErrorMessage()); } - } else if (!Permissions.hasPermission(player, getPermission())) { + } else if (!player.hasPermission(getPermission())) { if (message) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", getPermission()) + TagResolver.resolver("node", Tag.inserting(Component.text(getPermission()))) ); } } else { @@ -495,7 +511,7 @@ public abstract class Command { public void sendUsage(PlotPlayer player) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", getUsage()) + TagResolver.resolver("value", Tag.inserting(Component.text(getUsage()))) ); } @@ -543,9 +559,10 @@ public abstract class Command { public Collection 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); @@ -564,13 +581,15 @@ 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; } + } } } @@ -599,13 +618,13 @@ public abstract class Command { return this.getFullId().hashCode(); } - public void checkTrue(boolean mustBeTrue, Caption message, Template... args) { + public void checkTrue(boolean mustBeTrue, Caption message, TagResolver... args) { if (!mustBeTrue) { throw new CommandException(message, args); } } - public T check(T object, Caption message, Template... args) { + public T check(T object, Caption message, TagResolver... args) { if (object == null) { throw new CommandException(message, args); } @@ -621,10 +640,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 Template... args) { + public CommandException(final @Nullable Caption message, final TagResolver... args) { this.message = message; this.args = args; } diff --git a/Core/src/main/java/com/plotsquared/core/command/CommandCaller.java b/Core/src/main/java/com/plotsquared/core/command/CommandCaller.java index 1e026ec8d..ff5066e84 100644 --- a/Core/src/main/java/com/plotsquared/core/command/CommandCaller.java +++ b/Core/src/main/java/com/plotsquared/core/command/CommandCaller.java @@ -19,7 +19,7 @@ package com.plotsquared.core.command; import com.plotsquared.core.configuration.caption.Caption; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -34,7 +34,7 @@ public interface CommandCaller { * @param caption Caption to send * @param replacements Variable replacements */ - void sendMessage(@NonNull Caption caption, @NonNull Template... replacements); + void sendMessage(@NonNull Caption caption, @NonNull TagResolver... replacements); /** * Check the player's permissions. Will be cached if permission caching is enabled. diff --git a/Core/src/main/java/com/plotsquared/core/command/CommandCategory.java b/Core/src/main/java/com/plotsquared/core/command/CommandCategory.java index 1613a443c..a76938577 100644 --- a/Core/src/main/java/com/plotsquared/core/command/CommandCategory.java +++ b/Core/src/main/java/com/plotsquared/core/command/CommandCategory.java @@ -22,6 +22,8 @@ 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; /** @@ -90,6 +92,11 @@ 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 * diff --git a/Core/src/main/java/com/plotsquared/core/command/Comment.java b/Core/src/main/java/com/plotsquared/core/command/Comment.java index fd617e842..6d83376cb 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Comment.java +++ b/Core/src/main/java/com/plotsquared/core/command/Comment.java @@ -27,7 +27,9 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import java.util.Arrays; import java.util.Locale; @@ -44,8 +46,10 @@ public class Comment extends SubCommand { if (args.length < 2) { player.sendMessage( TranslatableCaption.of("comment.comment_syntax"), - Template.of("command", "/plot comment [X;Z]"), - Template.of("list", StringMan.join(CommentManager.inboxes.keySet(), "|")) + TagResolver.builder() + .tag("command", Tag.inserting(Component.text("/plot comment [X;Z]"))) + .tag("list", Tag.inserting(Component.text(StringMan.join(CommentManager.inboxes.keySet(), "|")))) + .build() ); return false; } @@ -64,8 +68,10 @@ public class Comment extends SubCommand { if (args.length < 3) { player.sendMessage( TranslatableCaption.of("comment.comment_syntax"), - Template.of("command", "/plot comment [X;Z]"), - Template.of("list", StringMan.join(CommentManager.inboxes.keySet(), "|")) + TagResolver.builder() + .tag("command", Tag.inserting(Component.text("/plot comment [X;Z]"))) + .tag("list", Tag.inserting(Component.text(StringMan.join(CommentManager.inboxes.keySet(), "|")))) + .build() ); return false; } @@ -76,8 +82,10 @@ public class Comment extends SubCommand { if (inbox == null) { player.sendMessage( TranslatableCaption.of("comment.comment_syntax"), - Template.of("command", "/plot comment [X;Z]"), - Template.of("list", StringMan.join(CommentManager.inboxes.keySet(), "|")) + TagResolver.builder() + .tag("command", Tag.inserting(Component.text("/plot comment [X;Z]"))) + .tag("list", Tag.inserting(Component.text(StringMan.join(CommentManager.inboxes.keySet(), "|")))) + .build() ); return false; } @@ -97,8 +105,10 @@ public class Comment extends SubCommand { player.sendMessage(TranslatableCaption.of("comment.no_plot_inbox")); player.sendMessage( TranslatableCaption.of("comment.comment_syntax"), - Template.of("command", "/plot comment [X;Z]"), - Template.of("list", StringMan.join(CommentManager.inboxes.keySet(), "|")) + TagResolver.builder() + .tag("command", Tag.inserting(Component.text("/plot comment [X;Z]"))) + .tag("list", Tag.inserting(Component.text(StringMan.join(CommentManager.inboxes.keySet(), "|")))) + .build() ); return false; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Condense.java b/Core/src/main/java/com/plotsquared/core/command/Condense.java index e25bd0b78..65bdb40ef 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Condense.java +++ b/Core/src/main/java/com/plotsquared/core/command/Condense.java @@ -29,7 +29,9 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.ArrayList; @@ -68,7 +70,9 @@ public class Condense extends SubCommand { if (args.length != 2 && args.length != 3) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot condense [radius]") + TagResolver.resolver("value", Tag.inserting(Component.text( + "/plot condense [radius]" + ))) ); return false; } @@ -82,7 +86,10 @@ public class Condense extends SubCommand { if (args.length == 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot condense" + area + " start ") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("/plot condense" + area + " start " + "")) + ) ); return false; } @@ -181,8 +188,10 @@ public class Condense extends SubCommand { if (result.get()) { player.sendMessage( TranslatableCaption.of("condense.moving"), - Template.of("origin", String.valueOf(origin)), - Template.of("possible", String.valueOf(possible)) + TagResolver.builder() + .tag("origin", Tag.inserting(Component.text(origin.toString()))) + .tag("possible", Tag.inserting(Component.text(possible.toString()))) + .build() ); TaskManager.runTaskLater(task, TaskTime.ticks(1L)); } @@ -202,7 +211,7 @@ public class Condense extends SubCommand { if (i >= free.size()) { player.sendMessage( TranslatableCaption.of("condense.skipping"), - Template.of("plot", String.valueOf(origin)) + TagResolver.resolver("plot", Tag.inserting(Component.text(origin.toString()))) ); } } @@ -223,7 +232,10 @@ public class Condense extends SubCommand { if (args.length == 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot condense " + area + " info ") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("/plot condense " + area + " info ")) + ) ); return false; } @@ -244,20 +256,20 @@ public class Condense extends SubCommand { player.sendMessage(TranslatableCaption.of("condense.default_eval")); player.sendMessage( TranslatableCaption.of("condense.minimum_radius"), - Template.of("minimumRadius", String.valueOf(minimumRadius)) + TagResolver.resolver("minimumRadius", Tag.inserting(Component.text(minimumRadius))) ); player.sendMessage( - TranslatableCaption.of("condense.minimum_radius"), - Template.of("maxMove", String.valueOf(maxMove)) + TranslatableCaption.of("condense.maximum_moved"), + TagResolver.resolver("maxMove", Tag.inserting(Component.text(maxMove))) ); player.sendMessage(TranslatableCaption.of("condense.input_eval")); player.sendMessage( TranslatableCaption.of("condense.input_radius"), - Template.of("radius", String.valueOf(radius)) + TagResolver.resolver("radius", Tag.inserting(Component.text(radius))) ); player.sendMessage( TranslatableCaption.of("condense.estimated_moves"), - Template.of("userMove", String.valueOf(userMove)) + TagResolver.resolver("userMove", Tag.inserting(Component.text(userMove))) ); player.sendMessage(TranslatableCaption.of("condense.eta")); player.sendMessage(TranslatableCaption.of("condense.radius_measured")); @@ -266,7 +278,10 @@ public class Condense extends SubCommand { } player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot condense " + area.getWorldName() + " [radius]") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("/plot condense " + area.getWorldName() + " [radius]")) + ) ); return false; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Continue.java b/Core/src/main/java/com/plotsquared/core/command/Continue.java index 9db740575..1929b12c3 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Continue.java +++ b/Core/src/main/java/com/plotsquared/core/command/Continue.java @@ -29,8 +29,9 @@ 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 com.plotsquared.core.util.Permissions; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; @CommandDeclaration(command = "continue", @@ -53,11 +54,12 @@ public class Continue extends SubCommand { player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); return false; } - if (!plot.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_CONTINUE)) { + if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_CONTINUE)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", TranslatableCaption.of("permission.no_plot_perms").getComponent(player)) + TagResolver.resolver("node", Tag.inserting( + TranslatableCaption.of("permission.no_plot_perms").toComponent(player) + )) ); return false; } @@ -70,7 +72,7 @@ public class Continue extends SubCommand { < player.getPlotCount() + size)) { player.sendMessage( TranslatableCaption.of("permission.cant_claim_more_plots"), - Template.of("amount", String.valueOf(player.getAllowedPlots())) + TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots()))) ); return false; } @@ -84,7 +86,7 @@ public class Continue extends SubCommand { if (event.getEventResult() == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Done flag removal") + TagResolver.resolver("value", Tag.inserting(Component.text("Done flag removal"))) ); return true; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Copy.java b/Core/src/main/java/com/plotsquared/core/command/Copy.java index 82afe0457..f281a4c4b 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Copy.java +++ b/Core/src/main/java/com/plotsquared/core/command/Copy.java @@ -23,8 +23,9 @@ 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 com.plotsquared.core.util.Permissions; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; @CommandDeclaration(command = "copy", permission = "plots.copy", @@ -42,15 +43,14 @@ public class Copy extends SubCommand { player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); return false; } - if (!plot1.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN.toString())) { + if (!plot1.isOwner(player.getUUID()) && !player.hasPermission(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"), - Template.of("value", "/plot copy ") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot copy "))) ); return false; } @@ -69,8 +69,12 @@ public class Copy extends SubCommand { plot1.getPlotModificationManager().copy(plot2, player).thenAccept(result -> { if (result) { - player.sendMessage(TranslatableCaption.of("move.copy_success"), Template.of("origin", String.valueOf(plot1)), - Template.of("target", String.valueOf(plot2)) + 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() ); } else { player.sendMessage(TranslatableCaption.of("move.requires_unowned")); diff --git a/Core/src/main/java/com/plotsquared/core/command/CreateRoadSchematic.java b/Core/src/main/java/com/plotsquared/core/command/CreateRoadSchematic.java index 8d24e1cf2..e4b6d0d38 100644 --- a/Core/src/main/java/com/plotsquared/core/command/CreateRoadSchematic.java +++ b/Core/src/main/java/com/plotsquared/core/command/CreateRoadSchematic.java @@ -25,7 +25,9 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; @CommandDeclaration(command = "createroadschematic", @@ -61,7 +63,7 @@ public class CreateRoadSchematic extends SubCommand { this.hybridUtils.setupRoadSchematic(plot); player.sendMessage( TranslatableCaption.of("schematics.schematic_road_created"), - Template.of("command", "/plot debugroadregen") + TagResolver.resolver("command", Tag.inserting(Component.text("/plot debugroadregen"))) ); return true; } diff --git a/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java b/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java index 73b678e5b..5d24194c0 100644 --- a/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java +++ b/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java @@ -40,7 +40,9 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.io.File; @@ -101,7 +103,10 @@ public class DatabaseCommand extends SubCommand { if (args.length < 1) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot database [area] ") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("/plot database [area] ")) + ) ); return false; } @@ -116,7 +121,7 @@ public class DatabaseCommand extends SubCommand { if (args.length < 1) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot database [area] ") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot database [area] "))) ); player.sendMessage(TranslatableCaption.of("database.arg")); return false; @@ -129,7 +134,10 @@ public class DatabaseCommand extends SubCommand { if (args.length < 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot database import [prefix]") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("/plot database import [prefix]")) + ) ); return false; } @@ -140,7 +148,7 @@ public class DatabaseCommand extends SubCommand { if (!file.exists()) { player.sendMessage( TranslatableCaption.of("database.does_not_exist"), - Template.of("value", String.valueOf(file)) + TagResolver.resolver("value", Tag.inserting(Component.text(file.toString()))) ); return false; } @@ -176,7 +184,7 @@ public class DatabaseCommand extends SubCommand { ); worldFile.renameTo(newFile); } - plot.setId(newId.copy()); + plot.setId(newId); plot.setArea(pa); plots.add(plot); continue; @@ -184,8 +192,10 @@ public class DatabaseCommand extends SubCommand { } player.sendMessage( TranslatableCaption.of("database.skipping_duplicated_plot"), - Template.of("plot", String.valueOf(plot)), - Template.of("id", String.valueOf(plot.temp)) + TagResolver.builder() + .tag("plot", Tag.inserting(Component.text(plot.toString()))) + .tag("id", Tag.inserting(Component.text(plot.temp))) + .build() ); continue; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Debug.java b/Core/src/main/java/com/plotsquared/core/command/Debug.java index 754c76063..1e0090e44 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Debug.java +++ b/Core/src/main/java/com/plotsquared/core/command/Debug.java @@ -34,7 +34,8 @@ 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.Template; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.Collection; @@ -68,7 +69,10 @@ public class Debug extends SubCommand { if (args.length == 0) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot debug ") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("/plot debug ")) + ) ); } if (args.length > 0) { @@ -95,7 +99,7 @@ public class Debug extends SubCommand { final Collection mappings = PlotSquared.get().getImpromptuUUIDPipeline().getAllImmediately(); player.sendMessage( TranslatableCaption.of("debug.cached_uuids"), - Template.of("value", String.valueOf(mappings.size())) + TagResolver.resolver("value", Tag.inserting(Component.text(mappings.size()))) ); return true; } @@ -104,7 +108,7 @@ public class Debug extends SubCommand { for (final PlotPlayer pp : PlotPlayer.getDebugModePlayers()) { player.sendMessage( TranslatableCaption.of("debug.player_in_debugmode_list"), - Template.of("value", pp.getName()) + TagResolver.resolver("value", Tag.inserting(Component.text(pp.getName()))) ); } return true; @@ -114,10 +118,11 @@ public class Debug extends SubCommand { player.sendMessage(TranslatableCaption.of("debug.entity_categories")); EntityCategory.REGISTRY.forEach(category -> { final StringBuilder builder = - new StringBuilder("§7- §6").append(category.getId()).append("§7: §6"); + new StringBuilder("- ").append(category.getId()).append(": "); for (final EntityType entityType : category.getAll()) { builder.append(entityType.getId()).append(" "); } + builder.append(""); player.sendMessage(StaticCaption.of("" + builder)); }); EntityType.REGISTRY.values().stream().sorted(Comparator.comparing(EntityType::getId)) @@ -137,28 +142,53 @@ public class Debug extends SubCommand { .getCaptionMap(TranslatableCaption.DEFAULT_NAMESPACE) .getCaptions(); TextComponent.Builder information = Component.text(); - Component header = MINI_MESSAGE.parse(TranslatableCaption.of("debug.debug_header").getComponent(player) + "\n"); + Component header = TranslatableCaption.of("debug.debug_header").toComponent(player) + .append(Component.newline()); String line = TranslatableCaption.of("debug.debug_line").getComponent(player) + "\n"; String section = TranslatableCaption.of("debug.debug_section").getComponent(player) + "\n"; information.append(header); - information.append(MINI_MESSAGE.parse(section, Template.of("val", "PlotArea"))); + information.append(MINI_MESSAGE.deserialize( + section, + TagResolver.resolver("val", Tag.inserting(Component.text("PlotArea"))) + )); information.append(MINI_MESSAGE - .parse( + .deserialize( line, - Template.of("var", "Plot Worlds"), - Template.of("val", StringMan.join(this.plotAreaManager.getAllPlotAreas(), ", ")) + TagResolver.builder() + .tag("var", Tag.inserting(Component.text("Plot Worlds"))) + .tag( + "val", + Tag.inserting(Component.text(StringMan.join( + this.plotAreaManager.getAllPlotAreas(), + ", " + ))) + ) + .build() )); information.append( - MINI_MESSAGE.parse( + MINI_MESSAGE.deserialize( line, - Template.of("var", "Owned Plots"), - Template.of("val", String.valueOf(PlotQuery.newQuery().allPlots().count())) + TagResolver.builder() + .tag("var", Tag.inserting(Component.text("Owned Plots"))) + .tag( + "val", + Tag.inserting(Component.text(PlotQuery.newQuery().allPlots().count())) + ) + .build() )); - information.append(MINI_MESSAGE.parse(section, Template.of("val", "Messages"))); - information.append(MINI_MESSAGE.parse( + information.append(MINI_MESSAGE.deserialize( + section, + TagResolver.resolver("val", Tag.inserting(Component.text("Messages"))) + )); + information.append(MINI_MESSAGE.deserialize( line, - Template.of("var", "Total Messages"), - Template.of("val", String.valueOf(captions.size())) + TagResolver.builder() + .tag("var", Tag.inserting(Component.text("Total Messages"))) + .tag( + "val", + Tag.inserting(Component.text(captions.size())) + ) + .build() )); player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(information.build()))); return true; diff --git a/Core/src/main/java/com/plotsquared/core/command/DebugExec.java b/Core/src/main/java/com/plotsquared/core/command/DebugExec.java index 7290a544c..054cad0c2 100644 --- a/Core/src/main/java/com/plotsquared/core/command/DebugExec.java +++ b/Core/src/main/java/com/plotsquared/core/command/DebugExec.java @@ -19,6 +19,7 @@ package com.plotsquared.core.command; import com.google.inject.Inject; +import com.plotsquared.core.PlotSquared; import com.plotsquared.core.configuration.caption.StaticCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.events.PlotFlagRemoveEvent; @@ -27,7 +28,6 @@ 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,12 +36,13 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.Arrays; import java.util.Collection; -import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; @@ -96,7 +97,7 @@ public class DebugExec extends SubCommand { if (analysis != null) { player.sendMessage( TranslatableCaption.of("debugexec.changes_column"), - Template.of("value", String.valueOf(analysis.changes)) + TagResolver.resolver("value", Tag.inserting(Component.text(analysis.changes))) ); return true; } @@ -106,7 +107,7 @@ public class DebugExec extends SubCommand { public void run(PlotAnalysis value) { player.sendMessage( TranslatableCaption.of("debugexec.analyze_done"), - Template.of("command", "/plot debugexec analyze") + TagResolver.resolver("command", Tag.inserting(Component.text("/plot debugexec analyze"))) ); } }); @@ -116,7 +117,10 @@ public class DebugExec extends SubCommand { if (args.length != 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot debugexec analyze ") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("/plot debugexec analyze ")) + ) ); player.sendMessage(TranslatableCaption.of("debugexec.threshold_default")); return false; @@ -127,7 +131,7 @@ public class DebugExec extends SubCommand { } catch (NumberFormatException ignored) { player.sendMessage( TranslatableCaption.of("debugexec.invalid_threshold"), - Template.of("value", args[1]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[1]))) ); player.sendMessage(TranslatableCaption.of("debugexec.threshold_default_double")); return false; @@ -139,10 +143,7 @@ public class DebugExec extends SubCommand { return true; } case "start-expire" -> { - if (ExpireManager.IMP == null) { - ExpireManager.IMP = new ExpireManager(this.eventDispatcher); - } - if (ExpireManager.IMP.runAutomatedTask()) { + if (PlotSquared.platform().expireManager().runAutomatedTask()) { player.sendMessage(TranslatableCaption.of("debugexec.expiry_started")); } else { player.sendMessage(TranslatableCaption.of("debugexec.expiry_already_started")); @@ -150,7 +151,7 @@ public class DebugExec extends SubCommand { return true; } case "stop-expire" -> { - if (ExpireManager.IMP == null || !ExpireManager.IMP.cancelTask()) { + if (!PlotSquared.platform().expireManager().cancelTask()) { player.sendMessage(TranslatableCaption.of("debugexec.task_halted")); } else { player.sendMessage(TranslatableCaption.of("debugexec.task_cancelled")); @@ -161,7 +162,7 @@ public class DebugExec extends SubCommand { if (args.length != 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot debugexec remove-flag ") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot debugexec remove-flag "))) ); return false; } @@ -179,7 +180,7 @@ public class DebugExec extends SubCommand { } player.sendMessage( TranslatableCaption.of("debugexec.cleared_flag"), - Template.of("value", flag) + TagResolver.resolver("value", Tag.inserting(Component.text(flag))) ); return true; } @@ -187,7 +188,10 @@ public class DebugExec extends SubCommand { if (args.length != 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "Invalid syntax: /plot debugexec start-rgar ") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("Invalid syntax: /plot debugexec start-rgar ")) + ) ); return false; } @@ -195,7 +199,7 @@ public class DebugExec extends SubCommand { if (area == null) { player.sendMessage( TranslatableCaption.of("errors.not_valid_plot_world"), - Template.of("value", args[1]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[1]))) ); return false; } diff --git a/Core/src/main/java/com/plotsquared/core/command/DebugPaste.java b/Core/src/main/java/com/plotsquared/core/command/DebugPaste.java index b9b1b9711..ca9fe1482 100644 --- a/Core/src/main/java/com/plotsquared/core/command/DebugPaste.java +++ b/Core/src/main/java/com/plotsquared/core/command/DebugPaste.java @@ -31,7 +31,9 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.io.File; @@ -69,9 +71,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()) @@ -131,8 +133,10 @@ public class DebugPaste extends SubCommand { } catch (IOException ignored) { player.sendMessage( TranslatableCaption.of("debugpaste.latest_log"), - Template.of("file", "latest.log"), - Template.of("size", "14MB") + TagResolver.builder() + .tag("file", Tag.inserting(Component.text("latest.log"))) + .tag("size", Tag.inserting(Component.text("14MB"))) + .build() ); } @@ -141,7 +145,7 @@ public class DebugPaste extends SubCommand { } catch (final IllegalArgumentException ignored) { player.sendMessage( TranslatableCaption.of("debugpaste.empty_file"), - Template.of("file", "settings.yml") + TagResolver.resolver("file", Tag.inserting(Component.text("settings.yml"))) ); } try { @@ -149,7 +153,7 @@ public class DebugPaste extends SubCommand { } catch (final IllegalArgumentException ignored) { player.sendMessage( TranslatableCaption.of("debugpaste.empty_file"), - Template.of("file", "worlds.yml") + TagResolver.resolver("file", Tag.inserting(Component.text("worlds.yml"))) ); } @@ -162,7 +166,7 @@ public class DebugPaste extends SubCommand { } catch (final IOException ignored) { player.sendMessage( TranslatableCaption.of("debugpaste.skip_multiverse"), - Template.of("file", "worlds.yml") + TagResolver.resolver("file", Tag.inserting(Component.text("worlds.yml"))) ); } @@ -177,20 +181,20 @@ public class DebugPaste extends SubCommand { String.format("https://athion.net/ISPaster/paste/view/%s", pasteId); player.sendMessage( TranslatableCaption.of("debugpaste.debug_report_created"), - Template.of("url", link) + TagResolver.resolver("url", Tag.preProcessParsed(link)) ); } else { final String responseMessage = jsonObject.get("response").getAsString(); player.sendMessage( TranslatableCaption.of("debugpaste.creation_failed"), - Template.of("value", responseMessage) + TagResolver.resolver("value", Tag.inserting(Component.text(responseMessage))) ); } } catch (final Throwable throwable) { throwable.printStackTrace(); player.sendMessage( TranslatableCaption.of("debugpaste.creation_failed"), - Template.of("value", throwable.getMessage()) + TagResolver.resolver("value", Tag.inserting(Component.text(throwable.getMessage()))) ); } } catch (IOException e) { diff --git a/Core/src/main/java/com/plotsquared/core/command/DebugRoadRegen.java b/Core/src/main/java/com/plotsquared/core/command/DebugRoadRegen.java index 6f990cd9f..453494994 100644 --- a/Core/src/main/java/com/plotsquared/core/command/DebugRoadRegen.java +++ b/Core/src/main/java/com/plotsquared/core/command/DebugRoadRegen.java @@ -28,7 +28,9 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.Arrays; @@ -60,7 +62,7 @@ public class DebugRoadRegen extends SubCommand { if (args.length < 1) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", DebugRoadRegen.USAGE) + TagResolver.resolver("value", Tag.inserting(Component.text(DebugRoadRegen.USAGE))) ); return false; } @@ -73,16 +75,19 @@ 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"), - Template.of("value", DebugRoadRegen.USAGE) + TagResolver.resolver("value", Tag.inserting(Component.text(DebugRoadRegen.USAGE))) ); return false; + } } } @@ -103,11 +108,11 @@ public class DebugRoadRegen extends SubCommand { queue.setCompleteTask(() -> { player.sendMessage( TranslatableCaption.of("debugroadregen.regen_done"), - Template.of("value", plot.getId().toString()) + TagResolver.resolver("value", Tag.inserting(Component.text(plot.getId().toString()))) ); player.sendMessage( TranslatableCaption.of("debugroadregen.regen_all"), - Template.of("value", "/plot regenallroads") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot regenallroads"))) ); }); manager.createRoadEast(plot, queue); @@ -126,18 +131,18 @@ public class DebugRoadRegen extends SubCommand { } catch (NumberFormatException ignored) { player.sendMessage( TranslatableCaption.of("invalid.not_valid_number"), - Template.of("value", "0, 256") + TagResolver.resolver("value", Tag.inserting(Component.text("0, 256"))) ); player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", DebugRoadRegen.USAGE) + TagResolver.resolver("value", Tag.inserting(Component.text(DebugRoadRegen.USAGE))) ); return false; } } else if (args.length != 0) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", DebugRoadRegen.USAGE) + TagResolver.resolver("value", Tag.inserting(Component.text(DebugRoadRegen.USAGE))) ); return false; } @@ -155,11 +160,11 @@ public class DebugRoadRegen extends SubCommand { } player.sendMessage( TranslatableCaption.of("debugroadregen.schematic"), - Template.of("command", "/plot createroadschematic") + TagResolver.resolver("command", Tag.inserting(Component.text("/plot createroadschematic"))) ); player.sendMessage( TranslatableCaption.of("debugroadregen.regenallroads"), - Template.of("command", "/plot regenallroads") + TagResolver.resolver("command", Tag.inserting(Component.text("/plot regenallroads"))) ); boolean result = this.hybridUtils.scheduleSingleRegionRoadUpdate(plot, height); if (!result) { diff --git a/Core/src/main/java/com/plotsquared/core/command/Delete.java b/Core/src/main/java/com/plotsquared/core/command/Delete.java index ba323673f..7932cf86b 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Delete.java +++ b/Core/src/main/java/com/plotsquared/core/command/Delete.java @@ -30,10 +30,11 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; @@ -78,13 +79,12 @@ public class Delete extends SubCommand { if (eventResult == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Delete") + TagResolver.resolver("value", Tag.inserting(Component.text("Delete"))) ); return true; } boolean force = eventResult == Result.FORCE; - if (!force && !plot.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DELETE)) { + if (!force && !plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DELETE)) { player.sendMessage(TranslatableCaption.of("permission.no_plot_perms")); return false; } @@ -114,14 +114,17 @@ public class Delete extends SubCommand { this.econHandler.depositMoney(player, value); player.sendMessage( TranslatableCaption.of("economy.added_balance"), - Template.of("money", this.econHandler.format(value)) + TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(value)))) ); } } player.sendMessage( TranslatableCaption.of("working.deleting_done"), - Template.of("amount", String.valueOf(System.currentTimeMillis() - start)), - Template.of("plot", plot.getId().toString()) + TagResolver.resolver( + "amount", + Tag.inserting(Component.text(String.valueOf(System.currentTimeMillis() - start))) + ), + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) ); eventDispatcher.callPostDelete(plot); }); diff --git a/Core/src/main/java/com/plotsquared/core/command/Deny.java b/Core/src/main/java/com/plotsquared/core/command/Deny.java index 70cdb6e2d..ec3811a94 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Deny.java +++ b/Core/src/main/java/com/plotsquared/core/command/Deny.java @@ -30,12 +30,13 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.Collection; @@ -79,18 +80,17 @@ public class Deny extends SubCommand { player.sendMessage(TranslatableCaption.of("info.plot_unowned")); return false; } - if (!plot.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DENY)) { + if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DENY)) { player.sendMessage(TranslatableCaption.of("permission.no_plot_perms")); return true; } - int maxDenySize = Permissions.hasPermissionRange(player, Permission.PERMISSION_DENY, Settings.Limit.MAX_PLOTS); + int maxDenySize = player.hasPermissionRange(Permission.PERMISSION_DENY, Settings.Limit.MAX_PLOTS); int size = plot.getDenied().size(); if (size >= maxDenySize) { player.sendMessage( TranslatableCaption.of("members.plot_max_members_denied"), - Template.of("amount", String.valueOf(size)) + TagResolver.resolver("amount", Tag.inserting(Component.text(size))) ); return false; } @@ -101,16 +101,15 @@ public class Deny extends SubCommand { } else if (throwable != null || uuids.isEmpty()) { player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Template.of("value", args[0]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[0]))) ); } else { for (UUID uuid : uuids) { if (uuid == DBFunc.EVERYONE && !( - Permissions.hasPermission(player, Permission.PERMISSION_DENY_EVERYONE) || Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DENY))) { + player.hasPermission(Permission.PERMISSION_DENY_EVERYONE) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DENY))) { player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Template.of("value", args[0]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[0]))) ); } else if (plot.isOwner(uuid)) { player.sendMessage(TranslatableCaption.of("deny.cant_remove_owner")); @@ -118,7 +117,10 @@ public class Deny extends SubCommand { } else if (plot.getDenied().contains(uuid)) { player.sendMessage( TranslatableCaption.of("member.already_added"), - Template.of("player", PlayerManager.resolveName(uuid).getComponent(player)) + TagResolver.resolver( + "player", + Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player)) + ) ); return; } else { diff --git a/Core/src/main/java/com/plotsquared/core/command/Desc.java b/Core/src/main/java/com/plotsquared/core/command/Desc.java index 360561129..b1a95a1fb 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Desc.java +++ b/Core/src/main/java/com/plotsquared/core/command/Desc.java @@ -27,7 +27,9 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; @CommandDeclaration(command = "setdescription", @@ -54,7 +56,7 @@ public class Desc extends SetCommand { if (event.getEventResult() == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Description removal") + TagResolver.resolver("value", Tag.inserting(Component.text("Description removal"))) ); return false; } @@ -69,7 +71,7 @@ public class Desc extends SetCommand { if (event.getEventResult() == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Description set") + TagResolver.resolver("value", Tag.inserting(Component.text("Description set"))) ); return false; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Dislike.java b/Core/src/main/java/com/plotsquared/core/command/Dislike.java index d11afa828..e2cd89e8f 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Dislike.java +++ b/Core/src/main/java/com/plotsquared/core/command/Dislike.java @@ -21,7 +21,6 @@ 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; @@ -54,7 +53,7 @@ public class Dislike extends SubCommand { public Collection tab(final PlotPlayer player, final String[] args, final boolean space) { if (args.length == 1) { final List completions = new LinkedList<>(); - if (Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS)) { + if (player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS)) { completions.add("purge"); } final List commands = completions.stream().filter(completion -> completion @@ -62,7 +61,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 (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) { + if (player.hasPermission(Permission.PERMISSION_RATE) && args[0].length() > 0) { commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList())); } return commands; diff --git a/Core/src/main/java/com/plotsquared/core/command/Done.java b/Core/src/main/java/com/plotsquared/core/command/Done.java index 6537daeef..565890b62 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Done.java +++ b/Core/src/main/java/com/plotsquared/core/command/Done.java @@ -19,6 +19,7 @@ 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.events.PlotDoneEvent; @@ -29,14 +30,14 @@ 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 com.plotsquared.core.plot.expiration.ExpireManager; 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; @CommandDeclaration(command = "done", @@ -70,13 +71,12 @@ public class Done extends SubCommand { if (event.getEventResult() == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Done") + TagResolver.resolver("value", Tag.inserting(Component.text("Done"))) ); return true; } boolean force = event.getEventResult() == Result.FORCE; - if (!force && !plot.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DONE)) { + if (!force && !plot.isOwner(player.getUUID()) && !player.hasPermission(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"), - Template.of("plot", plot.getId().toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) ); final Settings.Auto_Clear doneRequirements = Settings.AUTO_CLEAR.get("done"); - if (ExpireManager.IMP == null || doneRequirements == null) { + 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); } }); diff --git a/Core/src/main/java/com/plotsquared/core/command/Download.java b/Core/src/main/java/com/plotsquared/core/command/Download.java index 5b23919ff..1de860586 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Download.java +++ b/Core/src/main/java/com/plotsquared/core/command/Download.java @@ -27,14 +27,15 @@ 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.net.URL; @@ -87,13 +88,11 @@ public class Download extends SubCommand { player.sendMessage(TranslatableCaption.of("info.plot_unowned")); return false; } - if ((Settings.Done.REQUIRED_FOR_DOWNLOAD && !DoneFlag.isDone(plot)) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DOWNLOAD)) { + if ((Settings.Done.REQUIRED_FOR_DOWNLOAD && !DoneFlag.isDone(plot)) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_DOWNLOAD)) { player.sendMessage(TranslatableCaption.of("done.done_not_done")); return false; } - if (!plot.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN.toString())) { + if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN.toString())) { player.sendMessage(TranslatableCaption.of("permission.no_plot_perms")); return false; } @@ -111,10 +110,13 @@ public class Download extends SubCommand { upload(player, plot); } else if (args.length == 1 && StringMan .isEqualIgnoreCaseToAny(args[0], "mcr", "world", "mca")) { - if (!Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD_WORLD)) { + if (!player.hasPermission(Permission.PERMISSION_DOWNLOAD_WORLD)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_DOWNLOAD_WORLD.toString()) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_DOWNLOAD_WORLD) + ) ); return false; } @@ -128,18 +130,24 @@ public class Download extends SubCommand { if (url == null) { player.sendMessage( TranslatableCaption.of("web.generating_link_failed"), - Template.of("plot", plot.getId().toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) ); return; } - player.sendMessage(TranslatableCaption.of("web.generation_link_success_legacy_world"), Template.of("url", url.toString())); + player.sendMessage( + TranslatableCaption.of("web.generation_link_success_legacy_world"), + TagResolver.resolver("url", Tag.inserting(Component.text(url.toString()))) + ); } }); } else { sendUsage(player); return false; } - player.sendMessage(TranslatableCaption.of("web.generating_link"), Template.of("plot", plot.getId().toString())); + player.sendMessage( + TranslatableCaption.of("web.generating_link"), + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) + ); return true; } @@ -147,10 +155,10 @@ public class Download extends SubCommand { public Collection tab(final PlotPlayer player, final String[] args, final boolean space) { if (args.length == 1) { final List completions = new LinkedList<>(); - if (Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD)) { + if (player.hasPermission(Permission.PERMISSION_DOWNLOAD)) { completions.add("schem"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD_WORLD)) { + if (player.hasPermission(Permission.PERMISSION_DOWNLOAD_WORLD)) { completions.add("world"); } final List commands = completions.stream().filter(completion -> completion @@ -165,7 +173,7 @@ public class Download extends SubCommand { CommandCategory.ADMINISTRATION ) { }).collect(Collectors.toCollection(LinkedList::new)); - if (Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD) && args[0].length() > 0) { + if (player.hasPermission(Permission.PERMISSION_DOWNLOAD) && args[0].length() > 0) { commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList())); } return commands; @@ -177,19 +185,25 @@ 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) { - player.sendMessage( - TranslatableCaption.of("web.generation_link_success"), - Template.of("download", value.toString()), - Template.of("delete", "Not available") - ); - player.sendMessage(StaticCaption.of(value.toString())); + .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() + ); + player.sendMessage(StaticCaption.of(value.toString())); + } } - }); - }); + )); return; } // TODO legacy support @@ -198,13 +212,15 @@ public class Download extends SubCommand { if (throwable != null || !result.isSuccess()) { player.sendMessage( TranslatableCaption.of("web.generating_link_failed"), - Template.of("plot", plot.getId().toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) ); } else { player.sendMessage( TranslatableCaption.of("web.generation_link_success"), - Template.of("download", result.getDownloadUrl()), - Template.of("delete", result.getDeletionUrl()) + TagResolver.builder() + .tag("download", Tag.preProcessParsed(result.getDownloadUrl())) + .tag("delete", Tag.preProcessParsed(result.getDeletionUrl())) + .build() ); } }); diff --git a/Core/src/main/java/com/plotsquared/core/command/FlagCommand.java b/Core/src/main/java/com/plotsquared/core/command/FlagCommand.java index 16d28c38a..9ab6ad340 100644 --- a/Core/src/main/java/com/plotsquared/core/command/FlagCommand.java +++ b/Core/src/main/java/com/plotsquared/core/command/FlagCommand.java @@ -23,7 +23,6 @@ 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; @@ -40,7 +39,6 @@ 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; @@ -48,7 +46,9 @@ 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.minimessage.Template; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -85,7 +85,10 @@ public final class FlagCommand extends Command { private static boolean sendMessage(PlotPlayer player) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot flag ") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("/plot flag ")) + ) ); return true; } @@ -111,9 +114,9 @@ public final class FlagCommand extends Command { if (!result) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of( + TagResolver.resolver( "node", - perm + "." + numeric + Tag.inserting(Component.text(perm + "." + numeric)) ) ); } @@ -128,18 +131,23 @@ public final class FlagCommand extends Command { key.toLowerCase(), entry.toString().toLowerCase() ); - final boolean result = Permissions.hasPermission(player, permission); + final boolean result = player.hasPermission(permission); if (!result) { - player.sendMessage(TranslatableCaption.of("permission.no_permission"), Template.of("node", permission)); + player.sendMessage( + TranslatableCaption.of("permission.no_permission"), + TagResolver.resolver("node", Tag.inserting(Component.text(permission))) + ); return false; } } } catch (final FlagParseException e) { player.sendMessage( TranslatableCaption.of("flag.flag_parse_error"), - Template.of("flag_name", flag.getName()), - Template.of("flag_value", e.getValue()), - Template.of("error", e.getErrorMessage().getComponent(player)) + 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() ); return false; } catch (final Exception e) { @@ -150,13 +158,16 @@ public final class FlagCommand extends Command { boolean result; String basePerm = Permission.PERMISSION_SET_FLAG_KEY.format(key.toLowerCase()); if (flag.isValuedPermission()) { - result = Permissions.hasKeyedPermission(player, basePerm, value); + result = player.hasKeyedPermission(basePerm, value); } else { - result = Permissions.hasPermission(player, basePerm); + result = player.hasPermission(basePerm); perm = basePerm; } if (!result) { - player.sendMessage(TranslatableCaption.of("permission.no_permission"), Template.of("node", perm)); + player.sendMessage( + TranslatableCaption.of("permission.no_permission"), + TagResolver.resolver("node", Tag.inserting(Component.text(perm))) + ); } return result; } @@ -177,11 +188,10 @@ public final class FlagCommand extends Command { player.sendMessage(TranslatableCaption.of("working.plot_not_claimed")); return false; } - if (!plot.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_SET_FLAG_OTHER)) { + if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_SET_FLAG_OTHER)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_SET_FLAG_OTHER)) + TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_SET_FLAG_OTHER)) ); return false; } @@ -216,7 +226,7 @@ public final class FlagCommand extends Command { if (best != null) { player.sendMessage( TranslatableCaption.of("flag.not_valid_flag_suggested"), - Template.of("value", best) + TagResolver.resolver("value", Tag.inserting(Component.text(best))) ); suggested = true; } @@ -325,7 +335,7 @@ public final class FlagCommand extends Command { if (args.length < 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot flag set ") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot flag set "))) ); return; } @@ -338,7 +348,7 @@ public final class FlagCommand extends Command { if (event.getEventResult() == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Flag set") + TagResolver.resolver("value", Tag.inserting(Component.text("Flag set"))) ); return; } @@ -354,15 +364,21 @@ public final class FlagCommand extends Command { } catch (final FlagParseException e) { player.sendMessage( TranslatableCaption.of("flag.flag_parse_error"), - Template.of("flag_name", plotFlag.getName()), - Template.of("flag_value", e.getValue()), - Template.of("error", e.getErrorMessage().getComponent(player)) + 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() ); return; } plot.setFlag(parsed); - player.sendMessage(TranslatableCaption.of("flag.flag_added"), Template.of("flag", String.valueOf(args[0])), - Template.of("value", String.valueOf(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() ); } @@ -384,7 +400,7 @@ public final class FlagCommand extends Command { if (args.length < 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot flag add ") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot flag add "))) ); return; } @@ -397,7 +413,7 @@ public final class FlagCommand extends Command { if (event.getEventResult() == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Flag add") + TagResolver.resolver("value", Tag.inserting(Component.text("Flag add"))) ); return; } @@ -418,9 +434,11 @@ public final class FlagCommand extends Command { } catch (FlagParseException e) { player.sendMessage( TranslatableCaption.of("flag.flag_parse_error"), - Template.of("flag_name", plotFlag.getName()), - Template.of("flag_value", e.getValue()), - Template.of("error", e.getErrorMessage().getComponent(player)) + 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() ); return; } @@ -430,8 +448,12 @@ public final class FlagCommand extends Command { player.sendMessage(TranslatableCaption.of("flag.flag_not_added")); return; } - player.sendMessage(TranslatableCaption.of("flag.flag_added"), Template.of("flag", String.valueOf(args[0])), - Template.of("value", String.valueOf(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() ); } @@ -453,7 +475,7 @@ public final class FlagCommand extends Command { if (args.length != 1 && args.length != 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot flag remove [values]") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot flag remove [values]"))) ); return; } @@ -467,17 +489,20 @@ public final class FlagCommand extends Command { if (event.getEventResult() == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Flag remove") + TagResolver.resolver("value", Tag.inserting(Component.text("Flag remove"))) ); return; } boolean force = event.getEventResult() == Result.FORCE; flag = event.getFlag(); - if (!force && !Permissions.hasPermission(player, Permission.PERMISSION_SET_FLAG_KEY.format(args[0].toLowerCase()))) { + if (!force && !player.hasPermission(Permission.PERMISSION_SET_FLAG_KEY.format(args[0].toLowerCase()))) { if (args.length != 2) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_SET_FLAG_KEY.format(args[0].toLowerCase())) + TagResolver.resolver( + "node", + Tag.inserting(Component.text(Permission.PERMISSION_SET_FLAG_KEY.format(args[0].toLowerCase()))) + ) ); return; } @@ -492,9 +517,11 @@ public final class FlagCommand extends Command { } catch (final FlagParseException e) { player.sendMessage( TranslatableCaption.of("flag.flag_parse_error"), - Template.of("flag_name", flag.getName()), - Template.of("flag_value", e.getValue()), - Template.of("error", String.valueOf(e.getErrorMessage())) + 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() ); return; } @@ -505,10 +532,13 @@ 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"), Template.of("flag", args[0]), Template.of( - "value", - String.valueOf(flagWithOldValue) - )); + 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() + ); return; } else { player.sendMessage(TranslatableCaption.of("flag.flag_not_removed")); @@ -520,7 +550,10 @@ public final class FlagCommand extends Command { if (addEvent.getEventResult() == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Re-addition of " + plotFlag.getName()) + TagResolver.resolver( + "value", + Tag.inserting(Component.text("Re-addition of " + plotFlag.getName())) + ) ); return; } @@ -543,10 +576,13 @@ public final class FlagCommand extends Command { return; } } - player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of( - "value", - String.valueOf(flagWithOldValue) - )); + 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() + ); } @CommandDeclaration(command = "list", @@ -564,34 +600,35 @@ public final class FlagCommand extends Command { return; } - final Map> flags = new HashMap<>(); + final Map> flags = new HashMap<>(); for (PlotFlag plotFlag : GlobalFlagContainer.getInstance().getRecognizedPlotFlags()) { if (plotFlag instanceof InternalFlag) { continue; } - final String category = MINI_MESSAGE.stripTokens(plotFlag.getFlagCategory().getComponent(player)); - final Collection flagList = - flags.computeIfAbsent(category, k -> new ArrayList<>()); + final Component category = plotFlag.getFlagCategory().toComponent(player); + final Collection flagList = flags.computeIfAbsent(category, k -> new ArrayList<>()); flagList.add(plotFlag.getName()); } - for (final Map.Entry> entry : flags.entrySet()) { + for (final Map.Entry> entry : flags.entrySet()) { Collections.sort(entry.getValue()); Component category = - MINI_MESSAGE.parse( + MINI_MESSAGE.deserialize( TranslatableCaption.of("flag.flag_list_categories").getComponent(player), - Template.of("category", entry.getKey()) + TagResolver.resolver("category", Tag.inserting(entry.getKey().style(Style.empty()))) ); TextComponent.Builder builder = Component.text().append(category); final Iterator flagIterator = entry.getValue().iterator(); while (flagIterator.hasNext()) { final String flag = flagIterator.next(); builder.append(MINI_MESSAGE - .parse( + .deserialize( TranslatableCaption.of("flag.flag_list_flag").getComponent(player), - Template.of("command", "/plot flag info " + flag), - Template.of("flag", flag), - Template.of("suffix", flagIterator.hasNext() ? ", " : "") + 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() )); } player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.build()))); @@ -615,7 +652,7 @@ public final class FlagCommand extends Command { if (args.length < 1) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot flag info ") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot flag info "))) ); return; } @@ -623,11 +660,17 @@ 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"), Template.of("flag", plotFlag.getName())); + player.sendMessage( + TranslatableCaption.of("flag.flag_info_name"), + TagResolver.resolver("flag", Tag.inserting(Component.text(plotFlag.getName()))) + ); // Flag category player.sendMessage( TranslatableCaption.of("flag.flag_info_category"), - Templates.of(player, "value", plotFlag.getFlagCategory()) + TagResolver.resolver( + "value", + Tag.inserting(plotFlag.getFlagCategory().toComponent(player)) + ) ); // Flag description // TODO maybe merge and \n instead? @@ -636,16 +679,18 @@ public final class FlagCommand extends Command { // Flag example player.sendMessage( TranslatableCaption.of("flag.flag_info_example"), - Template.of("command", "/plot flag set"), - Template.of("flag", plotFlag.getName()), - Template.of("value", plotFlag.getExample()) + TagResolver.builder() + .tag("command", Tag.preProcessParsed("/plot flag set")) + .tag("flag", Tag.preProcessParsed(plotFlag.getName())) + .tag("value", Tag.preProcessParsed(plotFlag.getExample())) + .build() ); // Default value final String defaultValue = player.getLocation().getPlotArea().getFlagContainer() .getFlagErased(plotFlag.getClass()).toString(); player.sendMessage( TranslatableCaption.of("flag.flag_info_default_value"), - Template.of("value", defaultValue) + TagResolver.resolver("value", Tag.inserting(Component.text(defaultValue))) ); // Footer. Done this way to prevent the duplicate-message-thingy from catching it player.sendMessage(TranslatableCaption.of("flag.flag_info_footer")); diff --git a/Core/src/main/java/com/plotsquared/core/command/Grant.java b/Core/src/main/java/com/plotsquared/core/command/Grant.java index 4a96878b8..70c1a6614 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Grant.java +++ b/Core/src/main/java/com/plotsquared/core/command/Grant.java @@ -26,20 +26,21 @@ 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 com.plotsquared.core.uuid.UUIDMapping; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; @@ -64,15 +65,15 @@ public class Grant extends Command { checkTrue( args.length >= 1 && args.length <= 2, TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot grant [player]") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot grant [player]"))) ); final String arg0 = args[0].toLowerCase(); switch (arg0) { case "add", "check" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_GRANT.format(arg0))) { + if (!player.hasPermission(Permission.PERMISSION_GRANT.format(arg0))) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_GRANT.format(arg0)) + TagResolver.resolver("node", Tag.inserting(Component.text(Permission.PERMISSION_GRANT.format(arg0)))) ); return CompletableFuture.completedFuture(false); } @@ -85,25 +86,25 @@ public class Grant extends Command { } else if (throwable != null || uuids.size() != 1) { player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Template.of("value", String.valueOf(uuids)) + TagResolver.resolver("value", Tag.inserting(Component.text(String.valueOf(uuids)))) ); } else { - final UUIDMapping uuid = uuids.toArray(new UUIDMapping[0])[0]; - PlotPlayer pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuid.getUuid()); + final UUID uuid = uuids.iterator().next(); + PlotPlayer pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuid); if (pp != null) { try (final MetaDataAccess access = pp.accessPersistentMetaData( PlayerMetaDataKeys.PERSISTENT_GRANTED_PLOTS)) { if (args[0].equalsIgnoreCase("check")) { player.sendMessage( TranslatableCaption.of("grants.granted_plots"), - Template.of("amount", String.valueOf(access.get().orElse(0))) + TagResolver.resolver("amount", Tag.inserting(Component.text(access.get().orElse(0)))) ); } else { access.set(access.get().orElse(0) + 1); } } } else { - DBFunc.getPersistentMeta(uuid.getUuid(), new RunnableVal<>() { + DBFunc.getPersistentMeta(uuid, new RunnableVal<>() { @Override public void run(Map value) { final byte[] array = value.get("grantedPlots"); @@ -116,7 +117,7 @@ public class Grant extends Command { } player.sendMessage( TranslatableCaption.of("grants.granted_plots"), - Template.of("amount", String.valueOf(granted)) + TagResolver.resolver("amount", Tag.inserting(Component.text(granted))) ); } else { // add int amount; @@ -128,10 +129,10 @@ public class Grant extends Command { boolean replace = array != null; String key = "grantedPlots"; byte[] rawData = Ints.toByteArray(amount); - DBFunc.addPersistentMeta(uuid.getUuid(), key, rawData, replace); + DBFunc.addPersistentMeta(uuid, key, rawData, replace); player.sendMessage( TranslatableCaption.of("grants.added"), - Template.of("grants", String.valueOf(amount)) + TagResolver.resolver("grants", Tag.inserting(Component.text(amount))) ); } } @@ -150,10 +151,10 @@ public class Grant extends Command { public Collection tab(final PlotPlayer player, final String[] args, final boolean space) { if (args.length == 1) { final List completions = new LinkedList<>(); - if (Permissions.hasPermission(player, Permission.PERMISSION_GRANT_ADD)) { + if (player.hasPermission(Permission.PERMISSION_GRANT_ADD)) { completions.add("add"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_GRANT_CHECK)) { + if (player.hasPermission(Permission.PERMISSION_GRANT_CHECK)) { completions.add("check"); } final List commands = completions.stream().filter(completion -> completion @@ -168,7 +169,7 @@ public class Grant extends Command { CommandCategory.ADMINISTRATION ) { }).collect(Collectors.toCollection(LinkedList::new)); - if (Permissions.hasPermission(player, Permission.PERMISSION_GRANT_SINGLE) && args[0].length() > 0) { + if (player.hasPermission(Permission.PERMISSION_GRANT_SINGLE) && args[0].length() > 0) { commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList())); } return commands; diff --git a/Core/src/main/java/com/plotsquared/core/command/Help.java b/Core/src/main/java/com/plotsquared/core/command/Help.java index 3b8b176a5..1b738e025 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Help.java +++ b/Core/src/main/java/com/plotsquared/core/command/Help.java @@ -28,7 +28,8 @@ 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.minimessage.Template; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import java.util.ArrayList; import java.util.Collection; @@ -59,9 +60,10 @@ public class Help extends Command { RunnableVal2 whenDone ) { switch (args.length) { - case 0: + case 0 -> { return displayHelp(player, null, 0); - case 1: + } + case 1 -> { if (MathMan.isInteger(args[0])) { try { return displayHelp(player, null, Integer.parseInt(args[0])); @@ -71,7 +73,8 @@ public class Help extends Command { } else { return displayHelp(player, args[0], 1); } - case 2: + } + case 2 -> { if (MathMan.isInteger(args[1])) { try { return displayHelp(player, args[0], Integer.parseInt(args[1])); @@ -80,8 +83,8 @@ public class Help extends Command { } } return CompletableFuture.completedFuture(false); - default: - sendUsage(player); + } + default -> sendUsage(player); } return CompletableFuture.completedFuture(true); } @@ -110,27 +113,36 @@ public class Help extends Command { } if (cat == null && page == 0) { TextComponent.Builder builder = Component.text(); - builder.append(MINI_MESSAGE.parse(TranslatableCaption.of("help.help_header").getComponent(player))); + builder.append(MINI_MESSAGE.deserialize(TranslatableCaption.of("help.help_header").getComponent(player))); for (CommandCategory c : CommandCategory.values()) { if (!c.canAccess(player)) { continue; } builder.append(Component.newline()).append(MINI_MESSAGE - .parse( + .deserialize( TranslatableCaption.of("help.help_info_item").getComponent(player), - Template.of("command", "/plot help"), - Template.of("category", c.name().toLowerCase()), - Template.of("category_desc", c.getComponent(player)) + TagResolver.builder() + .tag("command", Tag.inserting(Component.text("/plot help"))) + .tag("category", Tag.inserting(Component.text(c.name().toLowerCase()))) + .tag("category_desc", Tag.inserting(c.toComponent(player))) + .build() )); } builder.append(Component.newline()).append(MINI_MESSAGE - .parse( + .deserialize( TranslatableCaption.of("help.help_info_item").getComponent(player), - Template.of("command", "/plot help"), - Template.of("category", "all"), - Template.of("category_desc", "Display all commands") + TagResolver.builder() + .tag("command", Tag.inserting(Component.text("/plot help"))) + .tag("category", Tag.inserting(Component.text("all"))) + .tag( + "category_desc", + Tag.inserting(TranslatableCaption + .of("help.help_display_all_commands") + .toComponent(player)) + ) + .build() )); - builder.append(Component.newline()).append(MINI_MESSAGE.parse(TranslatableCaption + builder.append(Component.newline()).append(MINI_MESSAGE.deserialize(TranslatableCaption .of("help.help_footer") .getComponent(player))); player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.asComponent()))); diff --git a/Core/src/main/java/com/plotsquared/core/command/HomeCommand.java b/Core/src/main/java/com/plotsquared/core/command/HomeCommand.java index 2218ba44e..26c1e5bc5 100644 --- a/Core/src/main/java/com/plotsquared/core/command/HomeCommand.java +++ b/Core/src/main/java/com/plotsquared/core/command/HomeCommand.java @@ -29,13 +29,14 @@ import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.util.MathMan; -import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.TabCompletions; import com.plotsquared.core.util.query.PlotQuery; import com.plotsquared.core.util.query.SortingStrategy; import com.plotsquared.core.util.task.RunnableVal2; import com.plotsquared.core.util.task.RunnableVal3; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.ArrayList; @@ -72,8 +73,10 @@ public class HomeCommand extends Command { } else if (plots.size() < page || page < 1) { player.sendMessage( TranslatableCaption.of("invalid.number_not_in_range"), - Template.of("min", "1"), - Template.of("max", String.valueOf(plots.size())) + TagResolver.builder() + .tag("min", Tag.inserting(Component.text(1))) + .tag("max", Tag.inserting(Component.text(plots.size()))) + .build() ); return; } @@ -104,11 +107,10 @@ public class HomeCommand extends Command { // /plot home <[area;]x;y> // /plot home // /plot home - if (!Permissions.hasPermission(player, Permission.PERMISSION_VISIT_OWNED) && !Permissions - .hasPermission(player, Permission.PERMISSION_HOME)) { + if (!player.hasPermission(Permission.PERMISSION_VISIT_OWNED) && !player.hasPermission(Permission.PERMISSION_HOME)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_VISIT_OWNED.toString()) + TagResolver.resolver("node", Tag.inserting(Component.text(Permission.PERMISSION_VISIT_OWNED.toString()))) ); return CompletableFuture.completedFuture(false); } @@ -130,7 +132,7 @@ public class HomeCommand extends Command { } catch (NumberFormatException ignored) { player.sendMessage( TranslatableCaption.of("invalid.not_a_number"), - Template.of("value", identifier) + TagResolver.resolver("value", Tag.inserting(Component.text(identifier))) ); return CompletableFuture.completedFuture(false); } @@ -171,7 +173,7 @@ public class HomeCommand extends Command { } catch (NumberFormatException ignored) { player.sendMessage( TranslatableCaption.of("invalid.not_a_number"), - Template.of("value", identifier) + TagResolver.resolver("value", Tag.inserting(Component.text(identifier))) ); return CompletableFuture.completedFuture(false); } diff --git a/Core/src/main/java/com/plotsquared/core/command/Inbox.java b/Core/src/main/java/com/plotsquared/core/command/Inbox.java index 8bdc4df41..efc75318b 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Inbox.java +++ b/Core/src/main/java/com/plotsquared/core/command/Inbox.java @@ -20,7 +20,6 @@ package com.plotsquared.core.command; import com.google.inject.TypeLiteral; 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.permissions.Permission; import com.plotsquared.core.player.MetaDataAccess; @@ -30,13 +29,13 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.comment.CommentInbox; import com.plotsquared.core.plot.comment.CommentManager; import com.plotsquared.core.plot.comment.PlotComment; -import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.TabCompletions; import com.plotsquared.core.util.task.RunnableVal; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import java.util.Collection; import java.util.Collections; @@ -72,41 +71,44 @@ public class Inbox extends SubCommand { max = comments.length; } TextComponent.Builder builder = Component.text(); - builder.append(MINI_MESSAGE.parse(TranslatableCaption.of("list.comment_list_header_paged").getComponent(player) + '\n', - Template.of("amount", String.valueOf(comments.length)), Template.of("cur", String.valueOf(page + 1)), - Template.of("max", String.valueOf(totalPages + 1)), Template.of("word", "all") + builder.append(MINI_MESSAGE.deserialize( + TranslatableCaption.of("list.comment_list_header_paged").getComponent(player) + '\n', + TagResolver.builder() + .tag("amount", Tag.inserting(Component.text(comments.length))) + .tag("cur", Tag.inserting(Component.text(page + 1))) + .tag("max", Tag.inserting(Component.text(totalPages + 1))) + .tag("word", Tag.inserting(Component.text("all"))) + .build() )); // This might work xD for (int x = page * 12; x < max; x++) { PlotComment comment = comments[x]; Component commentColored; - if (player.getName().equals(comment.senderName)) { + if (player.getName().equals(comment.senderName())) { commentColored = MINI_MESSAGE - .parse( + .deserialize( TranslatableCaption.of("list.comment_list_by_lister").getComponent(player), - Template.of("comment", comment.comment) + TagResolver.resolver("comment", Tag.inserting(Component.text(comment.comment()))) ); } else { commentColored = MINI_MESSAGE - .parse( + .deserialize( TranslatableCaption.of("list.comment_list_by_other").getComponent(player), - Template.of("comment", comment.comment) + TagResolver.resolver("comment", Tag.inserting(Component.text(comment.comment()))) ); } - Template number = Template.of("number", String.valueOf(x)); - Template world = Template.of("world", comment.world); - Template plot_id = Template.of("plot_id", comment.id.getX() + ";" + comment.id.getY()); - Template commenter = Template.of("commenter", comment.senderName); - Template commentTemplate = Template.of("comment", commentColored); + TagResolver resolver = TagResolver.builder() + .tag("number", Tag.inserting(Component.text(x))) + .tag("world", Tag.inserting(Component.text(comment.world()))) + .tag("plot_id", Tag.inserting(Component.text(comment.id().getX() + ";" + comment.id().getY()))) + .tag("commenter", Tag.inserting(Component.text(comment.senderName()))) + .tag("comment", Tag.inserting(commentColored)) + .build(); builder.append(MINI_MESSAGE - .parse( + .deserialize( TranslatableCaption.of("list.comment_list_comment").getComponent(player), - number, - world, - plot_id, - commenter, - commentTemplate + resolver )); } player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.build()))); @@ -135,7 +137,7 @@ public class Inbox extends SubCommand { int unread = 0; for (PlotComment comment : value) { total++; - if (comment.timestamp > CommentManager + if (comment.timestamp() > CommentManager .getTimestamp(player, inbox.toString())) { unread++; } @@ -143,20 +145,23 @@ public class Inbox extends SubCommand { if (total != 0) { player.sendMessage( TranslatableCaption.of("comment.inbox_item"), - Template.of("value", inbox + " (" + total + '/' + unread + ')') + TagResolver.resolver( + "value", + Tag.inserting(Component.text(inbox + " (" + total + '/' + unread + ')')) + ) ); return; } } player.sendMessage( TranslatableCaption.of("comment.inbox_item"), - Template.of("value", inbox.toString()) + TagResolver.resolver("value", Tag.inserting(Component.text(inbox.toString()))) ); } })) { player.sendMessage( TranslatableCaption.of("comment.inbox_item"), - Template.of("value", inbox.toString()) + TagResolver.resolver("value", Tag.inserting(Component.text(inbox.toString()))) ); } } @@ -167,7 +172,10 @@ public class Inbox extends SubCommand { if (inbox == null) { player.sendMessage( TranslatableCaption.of("comment.invalid_inbox"), - Template.of("list", StringMan.join(CommentManager.inboxes.keySet(), ", ")) + TagResolver.resolver( + "list", + Tag.inserting(Component.text(StringMan.join(CommentManager.inboxes.keySet(), ", "))) + ) ); return false; } @@ -182,7 +190,7 @@ public class Inbox extends SubCommand { final int page; if (args.length > 1) { switch (args[1].toLowerCase()) { - case "delete": + case "delete" -> { if (!inbox.canModify(plot, player)) { player.sendMessage(TranslatableCaption.of("comment.no_perm_inbox_modify")); return false; @@ -190,7 +198,10 @@ public class Inbox extends SubCommand { if (args.length != 3) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot inbox " + inbox + " delete ") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("/plot inbox " + inbox + " delete ")) + ) ); return true; } @@ -200,25 +211,27 @@ public class Inbox extends SubCommand { if (index < 1) { player.sendMessage( TranslatableCaption.of("comment.not_valid_inbox_index"), - Templates.of("number", index) + TagResolver.resolver("number", Tag.inserting(Component.text(index))) ); return false; } } catch (NumberFormatException ignored) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot inbox " + inbox + " delete ") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("/plot inbox " + inbox + " delete ")) + ) ); return false; } - if (!inbox.getComments(plot, new RunnableVal<>() { @Override public void run(List value) { if (index > value.size()) { player.sendMessage( TranslatableCaption.of("comment.not_valid_inbox_index"), - Templates.of("number", index) + TagResolver.resolver("number", Tag.inserting(Component.text(index))) ); return; } @@ -228,7 +241,7 @@ public class Inbox extends SubCommand { if (success) { player.sendMessage( TranslatableCaption.of("comment.comment_removed_success"), - Template.of("value", comment.comment) + TagResolver.resolver("value", Tag.inserting(Component.text(comment.comment()))) ); } else { player.sendMessage( @@ -240,7 +253,8 @@ public class Inbox extends SubCommand { return false; } return true; - case "clear": + } + case "clear" -> { if (!inbox.canModify(plot, player)) { player.sendMessage(TranslatableCaption.of("comment.no_perm_inbox_modify")); } @@ -249,18 +263,20 @@ public class Inbox extends SubCommand { if (!comments.isEmpty()) { player.sendMessage( TranslatableCaption.of("comment.comment_removed_success"), - Template.of("value", String.valueOf(comments)) + TagResolver.resolver("value", Tag.inserting(Component.text("*"))) ); plot.getPlotCommentContainer().removeComments(comments); } return true; - default: + } + default -> { try { page = Integer.parseInt(args[1]); } catch (NumberFormatException ignored) { sendUsage(player); return false; } + } } } else { page = 1; @@ -285,13 +301,13 @@ public class Inbox extends SubCommand { public Collection tab(final PlotPlayer player, final String[] args, final boolean space) { if (args.length == 1) { final List completions = new LinkedList<>(); - if (Permissions.hasPermission(player, Permission.PERMISSION_INBOX_READ_OWNER)) { + if (player.hasPermission(Permission.PERMISSION_INBOX_READ_OWNER)) { completions.add("owner"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_INBOX_READ_PUBLIC)) { + if (player.hasPermission(Permission.PERMISSION_INBOX_READ_PUBLIC)) { completions.add("public"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_INBOX_READ_REPORT)) { + if (player.hasPermission(Permission.PERMISSION_INBOX_READ_REPORT)) { completions.add("report"); } final List commands = completions.stream().filter(completion -> completion @@ -299,7 +315,7 @@ public class Inbox extends SubCommand { .startsWith(args[0].toLowerCase())) .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.CHAT) { }).collect(Collectors.toCollection(LinkedList::new)); - if (Permissions.hasPermission(player, Permission.PERMISSION_INBOX) && args[0].length() > 0) { + if (player.hasPermission(Permission.PERMISSION_INBOX) && args[0].length() > 0) { commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList())); } return commands; diff --git a/Core/src/main/java/com/plotsquared/core/command/Info.java b/Core/src/main/java/com/plotsquared/core/command/Info.java index 6f4c085ad..b7845ede8 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Info.java +++ b/Core/src/main/java/com/plotsquared/core/command/Info.java @@ -27,9 +27,10 @@ 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.HideInfoFlag; -import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.TabCompletions; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import java.util.Collection; import java.util.Collections; @@ -51,8 +52,9 @@ public class Info extends SubCommand { arg = args[0]; switch (arg) { // TODO: (re?)implement /plot info inv. (it was never properly implemented) - case "trusted", "alias", "biome", "denied", "flags", "id", "size", "members", "creationdate", "seen", "owner", "rating", "likes" -> plot = Plot - .getPlotFromString(player, null, false); + case "trusted", "alias", "biome", "denied", "flags", "id", "size", "members", "creationdate", "seen", "owner", "rating", "likes" -> + plot = Plot + .getPlotFromString(player, null, false); default -> { plot = Plot.getPlotFromString(player, arg, false); if (args.length == 2) { @@ -91,7 +93,10 @@ public class Info extends SubCommand { .hasPermission(Permission.PERMISSION_AREA_INFO_FORCE.toString())) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_AREA_INFO_FORCE.toString()) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_AREA_INFO_FORCE) + ) ); return true; } @@ -113,7 +118,10 @@ public class Info extends SubCommand { if (!hasOwner && !containsEveryone && !trustedEveryone) { player.sendMessage( TranslatableCaption.of("info.plot_info_unclaimed"), - Template.of("plot", plot.getId().getX() + ";" + plot.getId().getY()) + TagResolver.resolver( + "plot", + Tag.inserting(Component.text(plot.getId().getX() + ";" + plot.getId().getY())) + ) ); return true; } @@ -144,7 +152,7 @@ public class Info extends SubCommand { @Override public Collection tab(PlotPlayer player, String[] args, boolean space) { final List completions = new LinkedList<>(); - if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_INFO_FORCE)) { + if (player.hasPermission(Permission.PERMISSION_AREA_INFO_FORCE)) { completions.add("-f"); } @@ -154,7 +162,7 @@ public class Info extends SubCommand { .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) { }).collect(Collectors.toCollection(LinkedList::new)); - if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_INFO_FORCE) && args[0].length() > 0) { + if (player.hasPermission(Permission.PERMISSION_AREA_INFO_FORCE) && args[0].length() > 0) { commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList())); } diff --git a/Core/src/main/java/com/plotsquared/core/command/Kick.java b/Core/src/main/java/com/plotsquared/core/command/Kick.java index 111a29026..cf91f9ad2 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Kick.java +++ b/Core/src/main/java/com/plotsquared/core/command/Kick.java @@ -27,11 +27,12 @@ import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.world.PlotAreaManager; -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 net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.Collection; @@ -70,8 +71,7 @@ public class Kick extends SubCommand { player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); return false; } - if ((!plot.hasOwner() || !plot.isOwner(player.getUUID())) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_KICK)) { + if ((!plot.hasOwner() || !plot.isOwner(player.getUUID())) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_KICK)) { player.sendMessage(TranslatableCaption.of("permission.no_plot_perms")); return false; } @@ -82,15 +82,14 @@ public class Kick extends SubCommand { } else if (throwable != null || uuids.isEmpty()) { player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Template.of("value", args[0]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[0]))) ); } else { Set> players = new HashSet<>(); for (UUID uuid : uuids) { if (uuid == DBFunc.EVERYONE) { for (PlotPlayer pp : plot.getPlayersInPlot()) { - if (pp == player || Permissions - .hasPermission(pp, Permission.PERMISSION_ADMIN_ENTRY_DENIED)) { + if (pp == player || pp.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_DENIED)) { continue; } players.add(pp); @@ -106,22 +105,22 @@ public class Kick extends SubCommand { if (players.isEmpty()) { player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Template.of("value", args[0]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[0]))) ); return; } for (PlotPlayer player2 : players) { if (!plot.equals(player2.getCurrentPlot())) { player.sendMessage( - TranslatableCaption.of("errors.invalid_player"), - Template.of("value", args[0]) + TranslatableCaption.of("kick.player_not_in_plot"), + TagResolver.resolver("player", Tag.inserting(Component.text(player2.getName()))) ); return; } - if (Permissions.hasPermission(player2, Permission.PERMISSION_ADMIN_ENTRY_DENIED)) { + if (player2.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_DENIED)) { player.sendMessage( - TranslatableCaption.of("cluster.cannot_kick_player"), - Template.of("name", player2.getName()) + TranslatableCaption.of("kick.cannot_kick_player"), + TagResolver.resolver("player", Tag.inserting(Component.text(player2.getName()))) ); return; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Leave.java b/Core/src/main/java/com/plotsquared/core/command/Leave.java index 9fc956f43..bb81c3342 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Leave.java +++ b/Core/src/main/java/com/plotsquared/core/command/Leave.java @@ -25,7 +25,9 @@ import com.plotsquared.core.plot.Plot; 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.UUID; @@ -67,7 +69,7 @@ public class Leave extends Command { } player.sendMessage( TranslatableCaption.of("member.plot_left"), - Template.of("player", player.getName()) + TagResolver.resolver("player", Tag.inserting(Component.text(player.getName()))) ); } else { player.sendMessage( diff --git a/Core/src/main/java/com/plotsquared/core/command/Like.java b/Core/src/main/java/com/plotsquared/core/command/Like.java index 9f93efe57..78a60327d 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Like.java +++ b/Core/src/main/java/com/plotsquared/core/command/Like.java @@ -30,11 +30,12 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Rating; 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.TabCompletions; import com.plotsquared.core.util.query.PlotQuery; import com.plotsquared.core.util.task.TaskManager; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.Collection; @@ -121,8 +122,7 @@ public class Like extends SubCommand { player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); return false; } - if (!Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS, true)) { + if (!player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS, true)) { return false; } plot.clearRatings(); @@ -153,7 +153,7 @@ public class Like extends SubCommand { if (oldRating != null) { player.sendMessage( TranslatableCaption.of("ratings.rating_already_exists"), - Template.of("plot", plot.getId().toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) ); return; } @@ -171,12 +171,12 @@ public class Like extends SubCommand { if (like) { player.sendMessage( TranslatableCaption.of("ratings.rating_liked"), - Template.of("plot", plot.getId().toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) ); } else { player.sendMessage( TranslatableCaption.of("ratings.rating_disliked"), - Template.of("plot", plot.getId().toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) ); } } @@ -204,7 +204,7 @@ public class Like extends SubCommand { public Collection tab(final PlotPlayer player, final String[] args, final boolean space) { if (args.length == 1) { final List completions = new LinkedList<>(); - if (Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS)) { + if (player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS)) { completions.add("purge"); } final List commands = completions.stream().filter(completion -> completion @@ -212,7 +212,7 @@ public class Like extends SubCommand { .startsWith(args[0].toLowerCase())) .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) { }).collect(Collectors.toCollection(LinkedList::new)); - if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) { + if (player.hasPermission(Permission.PERMISSION_RATE) && args[0].length() > 0) { commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList())); } return commands; diff --git a/Core/src/main/java/com/plotsquared/core/command/ListCmd.java b/Core/src/main/java/com/plotsquared/core/command/ListCmd.java index b47a99e25..5ba5d1a00 100644 --- a/Core/src/main/java/com/plotsquared/core/command/ListCmd.java +++ b/Core/src/main/java/com/plotsquared/core/command/ListCmd.java @@ -23,21 +23,18 @@ import com.plotsquared.core.PlotSquared; import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.caption.Caption; 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.database.DBFunc; import com.plotsquared.core.permissions.Permission; 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.flag.implementations.DoneFlag; import com.plotsquared.core.plot.flag.implementations.PriceFlag; import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.MathMan; -import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.StringComparison; import com.plotsquared.core.util.StringMan; @@ -48,7 +45,8 @@ import com.plotsquared.core.util.task.RunnableVal3; import com.plotsquared.core.uuid.UUIDMapping; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.ArrayList; @@ -83,40 +81,40 @@ public class ListCmd extends SubCommand { private String[] getArgumentList(PlotPlayer player) { List args = new ArrayList<>(); - if (this.econHandler != null && Permissions.hasPermission(player, Permission.PERMISSION_LIST_FOR_SALE)) { + if (this.econHandler != null && player.hasPermission(Permission.PERMISSION_LIST_FOR_SALE)) { args.add("forsale"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_MINE)) { + if (player.hasPermission(Permission.PERMISSION_LIST_MINE)) { args.add("mine"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_SHARED)) { + if (player.hasPermission(Permission.PERMISSION_LIST_SHARED)) { args.add("shared"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_WORLD)) { + if (player.hasPermission(Permission.PERMISSION_LIST_WORLD)) { args.add("world"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_TOP)) { + if (player.hasPermission(Permission.PERMISSION_LIST_TOP)) { args.add("top"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_ALL)) { + if (player.hasPermission(Permission.PERMISSION_LIST_ALL)) { args.add("all"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_UNOWNED)) { + if (player.hasPermission(Permission.PERMISSION_LIST_UNOWNED)) { args.add("unowned"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_PLAYER)) { + if (player.hasPermission(Permission.PERMISSION_LIST_PLAYER)) { args.add(""); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_WORLD)) { + if (player.hasPermission(Permission.PERMISSION_LIST_WORLD)) { args.add(""); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_DONE)) { + if (player.hasPermission(Permission.PERMISSION_LIST_DONE)) { args.add("done"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_EXPIRED)) { + if (player.hasPermission(Permission.PERMISSION_LIST_EXPIRED)) { args.add("expired"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_FUZZY)) { + if (player.hasPermission(Permission.PERMISSION_LIST_FUZZY)) { args.add("fuzzy "); } return args.toArray(new String[args.size()]); @@ -125,7 +123,7 @@ public class ListCmd extends SubCommand { public void noArgs(PlotPlayer player) { player.sendMessage( TranslatableCaption.of("commandconfig.subcommand_set_options_header"), - Templates.of("values", Arrays.toString(getArgumentList(player))) + TagResolver.resolver("values", Tag.inserting(Component.text(Arrays.toString(getArgumentList(player))))) ); } @@ -161,9 +159,14 @@ public class ListCmd extends SubCommand { if (query == null) { player.sendMessage( TranslatableCaption.of("commandconfig.did_you_mean"), - Template.of( + TagResolver.resolver( "value", - new StringComparison<>(args[0], new String[]{"mine", "shared", "world", "all"}).getBestMatch() + Tag.inserting(Component.text( + new StringComparison<>( + args[0], + new String[]{"mine", "shared", "world", "all"} + ).getBestMatch() + )) ) ); return; @@ -188,10 +191,10 @@ public class ListCmd extends SubCommand { switch (arg) { case "mine" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_MINE)) { + if (!player.hasPermission(Permission.PERMISSION_LIST_MINE)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.mine") + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.mine"))) ); return false; } @@ -203,10 +206,10 @@ public class ListCmd extends SubCommand { .withSortingStrategy(SortingStrategy.SORT_BY_TEMP)); } case "shared" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_SHARED)) { + if (!player.hasPermission(Permission.PERMISSION_LIST_SHARED)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.shared") + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.shared"))) ); return false; } @@ -216,48 +219,48 @@ public class ListCmd extends SubCommand { .thatPasses(plot -> !plot.isOwnerAbs(player.getUUID()))); } case "world" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_WORLD)) { + if (!player.hasPermission(Permission.PERMISSION_LIST_WORLD)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.world") + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.world"))) ); return false; } - if (!Permissions.hasPermission(player, "plots.list.world." + world)) { + if (!player.hasPermission("plots.list.world." + world)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.world." + world) + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.world." + world))) ); return false; } plotConsumer.accept(PlotQuery.newQuery().inWorld(world)); } case "expired" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_EXPIRED)) { + if (!player.hasPermission(Permission.PERMISSION_LIST_EXPIRED)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.expired") + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.expired"))) ); return false; } - if (ExpireManager.IMP == null) { + if (PlotSquared.platform().expireManager() == null) { plotConsumer.accept(PlotQuery.newQuery().noPlots()); } else { plotConsumer.accept(PlotQuery.newQuery().expiredPlots()); } } case "area" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_AREA)) { + if (!player.hasPermission(Permission.PERMISSION_LIST_AREA)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.area") + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.area"))) ); return false; } - if (!Permissions.hasPermission(player, "plots.list.world." + world)) { + if (!player.hasPermission("plots.list.world." + world)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.world." + world) + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.world." + world))) ); return false; } @@ -268,20 +271,20 @@ public class ListCmd extends SubCommand { } } case "all" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_ALL)) { + if (!player.hasPermission(Permission.PERMISSION_LIST_ALL)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.all") + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.all"))) ); return false; } plotConsumer.accept(PlotQuery.newQuery().allPlots()); } case "done" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_DONE)) { + if (!player.hasPermission(Permission.PERMISSION_LIST_DONE)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.done") + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.done"))) ); return false; } @@ -293,10 +296,10 @@ public class ListCmd extends SubCommand { .withSortingStrategy(SortingStrategy.SORT_BY_DONE)); } case "top" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_TOP)) { + if (!player.hasPermission(Permission.PERMISSION_LIST_TOP)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.top") + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.top"))) ); return false; } @@ -304,10 +307,10 @@ public class ListCmd extends SubCommand { plotConsumer.accept(PlotQuery.newQuery().allPlots().withSortingStrategy(SortingStrategy.SORT_BY_RATING)); } case "forsale" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_FOR_SALE)) { + if (!player.hasPermission(Permission.PERMISSION_LIST_FOR_SALE)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.forsale") + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.forsale"))) ); return false; } @@ -317,27 +320,27 @@ public class ListCmd extends SubCommand { plotConsumer.accept(PlotQuery.newQuery().allPlots().thatPasses(plot -> plot.getFlag(PriceFlag.class) > 0)); } case "unowned" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_UNOWNED)) { + if (!player.hasPermission(Permission.PERMISSION_LIST_UNOWNED)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.unowned") + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.unowned"))) ); return false; } plotConsumer.accept(PlotQuery.newQuery().allPlots().thatPasses(plot -> plot.getOwner() == null)); } case "fuzzy" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_FUZZY)) { + if (!player.hasPermission(Permission.PERMISSION_LIST_FUZZY)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.fuzzy") + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.fuzzy"))) ); return false; } if (args.length < (page == -1 ? 2 : 3)) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Templates.of("value", "/plot list fuzzy [#]") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot list fuzzy [#]"))) ); return false; } @@ -352,17 +355,17 @@ public class ListCmd extends SubCommand { } default -> { if (this.plotAreaManager.hasPlotArea(args[0])) { - if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_WORLD)) { + if (!player.hasPermission(Permission.PERMISSION_LIST_WORLD)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.world") + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.world"))) ); return false; } - if (!Permissions.hasPermission(player, "plots.list.world." + args[0])) { + if (!player.hasPermission("plots.list.world." + args[0])) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.world." + args[0]) + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.world." + args[0]))) ); return false; } @@ -381,12 +384,15 @@ public class ListCmd extends SubCommand { } } if (uuid == null) { - player.sendMessage(TranslatableCaption.of("errors.invalid_player"), Templates.of("value", args[0])); + player.sendMessage( + TranslatableCaption.of("errors.invalid_player"), + TagResolver.resolver("value", Tag.inserting(Component.text(args[0]))) + ); } else { - if (!Permissions.hasPermission(player, Permission.PERMISSION_LIST_PLAYER)) { + if (!player.hasPermission(Permission.PERMISSION_LIST_PLAYER)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Templates.of("node", "plots.list.player") + TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.player"))) ); } else { sort[0] = false; @@ -422,32 +428,34 @@ public class ListCmd extends SubCommand { } else { color = TranslatableCaption.of("info.plot_list_default"); } - Component trusted = MINI_MESSAGE.parse( + Component trusted = MINI_MESSAGE.deserialize( TranslatableCaption.of("info.plot_info_trusted").getComponent(player), - Template.of("trusted", PlayerManager.getPlayerList(plot.getTrusted(), player)) + TagResolver.resolver("trusted", Tag.inserting(PlayerManager.getPlayerList(plot.getTrusted(), player))) ); - Component members = MINI_MESSAGE.parse( + Component members = MINI_MESSAGE.deserialize( TranslatableCaption.of("info.plot_info_members").getComponent(player), - Template.of("members", PlayerManager.getPlayerList(plot.getMembers(), player)) + TagResolver.resolver("members", Tag.inserting(PlayerManager.getPlayerList(plot.getMembers(), player))) ); - Template command_tp = Template.of("command_tp", "/plot visit " + plot.getArea() + ";" + plot.getId()); - Template command_info = Template.of("command_info", "/plot info " + plot.getArea() + ";" + plot.getId()); - Template hover_info = - Template.of( - "hover_info", - MINI_MESSAGE.serialize(Component - .text() - .append(trusted) - .append(Component.newline()) - .append(members) - .asComponent()) - ); - Template numberTemplate = Template.of("number", String.valueOf(i)); - Template plotTemplate = Template.of( - "plot", - MINI_MESSAGE.parse(color.getComponent(player), Template.of("plot", plot.toString())) + TagResolver.Builder finalResolver = TagResolver.builder(); + finalResolver.tag( + "command_tp", + Tag.preProcessParsed("/plot visit " + plot.getArea() + ";" + plot.getId()) ); - + finalResolver.tag( + "command_info", + Tag.preProcessParsed("/plot info " + plot.getArea() + ";" + plot.getId()) + ); + finalResolver.tag("hover_info", Tag.inserting( + Component.text() + .append(trusted) + .append(Component.newline()) + .append(members) + .asComponent() + )); + finalResolver.tag("number", Tag.inserting(Component.text(i))); + finalResolver.tag("plot", Tag.inserting(MINI_MESSAGE.deserialize( + color.getComponent(player), TagResolver.resolver("plot", Tag.inserting(Component.text(plot.toString()))) + ))); String prefix = ""; String online = TranslatableCaption.of("info.plot_list_player_online").getComponent(player); String offline = TranslatableCaption.of("info.plot_list_player_offline").getComponent(player); @@ -456,35 +464,37 @@ public class ListCmd extends SubCommand { String everyone = TranslatableCaption.of("info.plot_list_player_everyone").getComponent(player); TextComponent.Builder builder = Component.text(); if (plot.getFlag(ServerPlotFlag.class)) { - Template serverTemplate = Template.of( + TagResolver serverResolver = TagResolver.resolver( "info.server", - TranslatableCaption.of("info.server").getComponent(player) + Tag.inserting(TranslatableCaption.of("info.server").toComponent(player)) ); - builder.append(MINI_MESSAGE.parse(server, serverTemplate)); + builder.append(MINI_MESSAGE.deserialize(server, serverResolver)); } else { try { final List names = PlotSquared.get().getImpromptuUUIDPipeline().getNames(plot.getOwners()) .get(Settings.UUID.BLOCKING_TIMEOUT, TimeUnit.MILLISECONDS); for (final UUIDMapping uuidMapping : names) { - PlotPlayer pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuidMapping.getUuid()); - Template prefixTemplate = Template.of("prefix", prefix); - Template playerTemplate = Template.of("player", uuidMapping.getUsername()); + PlotPlayer pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuidMapping.uuid()); + TagResolver resolver = TagResolver.builder() + .tag("prefix", Tag.inserting(Component.text(prefix))) + .tag("player", Tag.inserting(Component.text(uuidMapping.username()))) + .build(); if (pp != null) { - builder.append(MINI_MESSAGE.parse(online, prefixTemplate, playerTemplate)); - } else if (uuidMapping.getUsername().equalsIgnoreCase("unknown")) { - Template unknownTemplate = Template.of( + builder.append(MINI_MESSAGE.deserialize(online, resolver)); + } else if (uuidMapping.username().equalsIgnoreCase("unknown")) { + TagResolver unknownResolver = TagResolver.resolver( "info.unknown", - TranslatableCaption.of("info.unknown").getComponent(player) + Tag.inserting(TranslatableCaption.of("info.unknown").toComponent(player)) ); - builder.append(MINI_MESSAGE.parse(unknown, unknownTemplate)); - } else if (uuidMapping.getUuid().equals(DBFunc.EVERYONE)) { - Template everyoneTemplate = Template.of( + builder.append(MINI_MESSAGE.deserialize(unknown, unknownResolver)); + } else if (uuidMapping.uuid().equals(DBFunc.EVERYONE)) { + TagResolver everyoneResolver = TagResolver.resolver( "info.everyone", - TranslatableCaption.of("info.everyone").getComponent(player) + Tag.inserting(TranslatableCaption.of("info.everyone").toComponent(player)) ); - builder.append(MINI_MESSAGE.parse(everyone, everyoneTemplate)); + builder.append(MINI_MESSAGE.deserialize(everyone, everyoneResolver)); } else { - builder.append(MINI_MESSAGE.parse(offline, prefixTemplate, playerTemplate)); + builder.append(MINI_MESSAGE.deserialize(offline, resolver)); } prefix = ", "; } @@ -500,15 +510,15 @@ public class ListCmd extends SubCommand { } player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Templates.of("value", playerBuilder.toString()) + TagResolver.resolver("value", Tag.inserting(Component.text(playerBuilder.toString()))) ); } catch (TimeoutException e) { player.sendMessage(TranslatableCaption.of("players.fetching_players_timeout")); } } - Template players = Template.of("players", builder.asComponent()); + finalResolver.tag("players", Tag.inserting(builder.asComponent())); caption.set(TranslatableCaption.of("info.plot_list_item")); - caption.setTemplates(command_tp, command_info, hover_info, numberTemplate, plotTemplate, players); + caption.setTagResolvers(finalResolver.build()); } }, "/plot list " + args[0], TranslatableCaption.of("list.plot_list_header_paged")); } @@ -516,31 +526,31 @@ public class ListCmd extends SubCommand { @Override public Collection tab(PlotPlayer player, String[] args, boolean space) { final List completions = new LinkedList<>(); - if (this.econHandler.isSupported() && Permissions.hasPermission(player, Permission.PERMISSION_LIST_FOR_SALE)) { + if (this.econHandler.isSupported() && player.hasPermission(Permission.PERMISSION_LIST_FOR_SALE)) { completions.add("forsale"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_MINE)) { + if (player.hasPermission(Permission.PERMISSION_LIST_MINE)) { completions.add("mine"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_SHARED)) { + if (player.hasPermission(Permission.PERMISSION_LIST_SHARED)) { completions.add("shared"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_WORLD)) { + if (player.hasPermission(Permission.PERMISSION_LIST_WORLD)) { completions.addAll(PlotSquared.platform().worldManager().getWorlds()); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_TOP)) { + if (player.hasPermission(Permission.PERMISSION_LIST_TOP)) { completions.add("top"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_ALL)) { + if (player.hasPermission(Permission.PERMISSION_LIST_ALL)) { completions.add("all"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_UNOWNED)) { + if (player.hasPermission(Permission.PERMISSION_LIST_UNOWNED)) { completions.add("unowned"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_DONE)) { + if (player.hasPermission(Permission.PERMISSION_LIST_DONE)) { completions.add("done"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_EXPIRED)) { + if (player.hasPermission(Permission.PERMISSION_LIST_EXPIRED)) { completions.add("expired"); } @@ -550,7 +560,7 @@ public class ListCmd extends SubCommand { .map(completion -> new Command(null, true, completion, "", RequiredType.NONE, CommandCategory.TELEPORT) { }).collect(Collectors.toCollection(LinkedList::new)); - if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_PLAYER) && args[0].length() > 0) { + if (player.hasPermission(Permission.PERMISSION_LIST_PLAYER) && args[0].length() > 0) { commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList())); } diff --git a/Core/src/main/java/com/plotsquared/core/command/Load.java b/Core/src/main/java/com/plotsquared/core/command/Load.java index f1b10ca73..4ead54146 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Load.java +++ b/Core/src/main/java/com/plotsquared/core/command/Load.java @@ -31,12 +31,13 @@ import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.plot.schematic.Schematic; import com.plotsquared.core.plot.world.PlotAreaManager; -import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.SchematicHandler; import com.plotsquared.core.util.TimeUtil; import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.TaskManager; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.net.MalformedURLException; @@ -80,8 +81,7 @@ public class Load extends SubCommand { player.sendMessage(TranslatableCaption.of("info.plot_unowned")); return false; } - if (!plot.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_LOAD)) { + if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_LOAD)) { player.sendMessage(TranslatableCaption.of("permission.no_plot_perms")); return false; } @@ -99,7 +99,7 @@ public class Load extends SubCommand { // No schematics found: player.sendMessage( TranslatableCaption.of("web.load_null"), - Template.of("command", "/plot load") + TagResolver.resolver("command", Tag.inserting(Component.text("/plot load"))) ); return false; } @@ -110,7 +110,7 @@ public class Load extends SubCommand { // use /plot load player.sendMessage( TranslatableCaption.of("invalid.not_valid_number"), - Template.of("value", "(1, " + schematics.size() + ')') + TagResolver.resolver("value", Tag.inserting(Component.text("(1, " + schematics.size() + ')'))) ); return false; } @@ -130,7 +130,10 @@ public class Load extends SubCommand { plot.removeRunning(); player.sendMessage( TranslatableCaption.of("schematics.schematic_invalid"), - Template.of("reason", "non-existent or not in gzip format") + TagResolver.resolver( + "reason", + Tag.inserting(Component.text("non-existent or not in gzip format")) + ) ); return; } @@ -161,7 +164,7 @@ public class Load extends SubCommand { plot.removeRunning(); player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot load ") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot load "))) ); return false; } @@ -212,46 +215,9 @@ public class Load extends SubCommand { } player.sendMessage( TranslatableCaption.of("web.load_list"), - Template.of("command", "/plot load #") + TagResolver.resolver("command", Tag.inserting(Component.text("/plot load #"))) ); } } - /** - * @deprecated Use {@link TimeUtil#secToTime(long)} - */ - @Deprecated(forRemoval = true, since = "6.6.2") - public String secToTime(long time) { - StringBuilder toreturn = new StringBuilder(); - if (time >= 33868800) { - int years = (int) (time / 33868800); - time -= years * 33868800; - toreturn.append(years).append("y "); - } - if (time >= 604800) { - int weeks = (int) (time / 604800); - time -= weeks * 604800; - toreturn.append(weeks).append("w "); - } - if (time >= 86400) { - int days = (int) (time / 86400); - time -= days * 86400; - toreturn.append(days).append("d "); - } - if (time >= 3600) { - int hours = (int) (time / 3600); - time -= hours * 3600; - toreturn.append(hours).append("h "); - } - if (time >= 60) { - int minutes = (int) (time / 60); - time -= minutes * 60; - toreturn.append(minutes).append("m "); - } - if (toreturn.length() == 0 || (time > 0)) { - toreturn.append(time).append("s "); - } - return toreturn.toString().trim(); - } - } diff --git a/Core/src/main/java/com/plotsquared/core/command/MainCommand.java b/Core/src/main/java/com/plotsquared/core/command/MainCommand.java index 77ebe94c3..1911f24e9 100644 --- a/Core/src/main/java/com/plotsquared/core/command/MainCommand.java +++ b/Core/src/main/java/com/plotsquared/core/command/MainCommand.java @@ -32,10 +32,12 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.world.SinglePlotArea; import com.plotsquared.core.util.EconHandler; -import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.PlotExpression; 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 org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -72,7 +74,6 @@ public class MainCommand extends Command { commands.add(Buy.class); if (Settings.Web.LEGACY_WEBINTERFACE) { LOGGER.warn("Legacy webinterface is used. Please note that it will be removed in future."); - commands.add(Save.class); } commands.add(Load.class); commands.add(Confirm.class); @@ -121,7 +122,6 @@ public class MainCommand extends Command { commands.add(Move.class); commands.add(Condense.class); commands.add(Copy.class); - commands.add(Chat.class); commands.add(Trim.class); commands.add(Done.class); commands.add(Continue.class); @@ -244,8 +244,8 @@ public class MainCommand extends Command { PlotArea area = player.getApplicablePlotArea(); Plot newPlot = Plot.fromString(area, args[0]); if (newPlot != null && (player instanceof ConsolePlayer || newPlot.getArea() - .equals(area) || Permissions.hasPermission(player, Permission.PERMISSION_ADMIN) - || Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_AREA_SUDO)) + .equals(area) || player.hasPermission(Permission.PERMISSION_ADMIN) + || player.hasPermission(Permission.PERMISSION_ADMIN_AREA_SUDO)) && !newPlot.isDenied(player.getUUID())) { final Location newLoc; if (newPlot.getArea() instanceof SinglePlotArea) { @@ -311,7 +311,7 @@ public class MainCommand extends Command { if (message != null) { player.sendMessage( TranslatableCaption.of("errors.error"), - net.kyori.adventure.text.minimessage.Template.of("value", message) + TagResolver.resolver("value", Tag.inserting(Component.text(message))) ); } else { player.sendMessage( diff --git a/Core/src/main/java/com/plotsquared/core/command/Merge.java b/Core/src/main/java/com/plotsquared/core/command/Merge.java index 8c9976197..24e842645 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Merge.java +++ b/Core/src/main/java/com/plotsquared/core/command/Merge.java @@ -32,10 +32,11 @@ 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.StringMan; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.UUID; @@ -115,22 +116,24 @@ public class Merge extends SubCommand { if (direction == null) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot merge <" + StringMan.join(values, " | ") + "> [removeroads]") + TagResolver.resolver("value", Tag.inserting(Component.text( + "/plot merge <" + StringMan.join(values, " | ") + "> [removeroads]" + ))) ); player.sendMessage( TranslatableCaption.of("help.direction"), - Template.of("dir", direction(location.getYaw())) + TagResolver.resolver("dir", Tag.inserting(Component.text(direction(location.getYaw())))) ); return false; } final int size = plot.getConnectedPlots().size(); - int max = Permissions.hasPermissionRange(player, "plots.merge", Settings.Limit.MAX_PLOTS); + int max = player.hasPermissionRange("plots.merge", Settings.Limit.MAX_PLOTS); PlotMergeEvent event = this.eventDispatcher.callMerge(plot, direction, max, player); if (event.getEventResult() == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Merge") + TagResolver.resolver("value", Tag.inserting(Component.text("Merge"))) ); return false; } @@ -141,7 +144,7 @@ public class Merge extends SubCommand { if (!force && size - 1 > maxSize) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_MERGE + "." + (size + 1)) + TagResolver.resolver("node", Tag.inserting(Component.text(Permission.PERMISSION_MERGE + "." + (size + 1)))) ); return false; } @@ -152,7 +155,7 @@ public class Merge extends SubCommand { UUID uuid = player.getUUID(); if (!force && !plot.isOwner(uuid)) { - if (!Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_MERGE)) { + if (!player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_MERGE)) { player.sendMessage(TranslatableCaption.of("permission.no_plot_perms")); return false; } else { @@ -164,11 +167,13 @@ public class Merge extends SubCommand { if (args.length == 2) { terrain = "true".equalsIgnoreCase(args[1]); } - if (!force && !terrain && !Permissions - .hasPermission(player, Permission.PERMISSION_MERGE_KEEP_ROAD)) { + if (!force && !terrain && !player.hasPermission(Permission.PERMISSION_MERGE_KEEP_ROAD)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_MERGE_KEEP_ROAD)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_MERGE_KEEP_ROAD) + ) ); return true; } @@ -177,8 +182,11 @@ public class Merge extends SubCommand { this.econHandler.withdrawMoney(player, price); player.sendMessage( TranslatableCaption.of("economy.removed_balance"), - Template.of("money", this.econHandler.format(price)), - Template.of("balance", this.econHandler.format(this.econHandler.getMoney(player))) + TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price)))), + TagResolver.resolver( + "balance", + Tag.inserting(Component.text(this.econHandler.format(this.econHandler.getMoney(player)))) + ) ); } player.sendMessage(TranslatableCaption.of("merge.success_merge")); @@ -192,7 +200,7 @@ public class Merge extends SubCommand { && this.econHandler.getMoney(player) < price) { player.sendMessage( TranslatableCaption.of("economy.cannot_afford_merge"), - Template.of("money", this.econHandler.format(price)) + TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price)))) ); return false; } @@ -202,11 +210,10 @@ public class Merge extends SubCommand { } else { terrain = true; } - if (!force && !terrain && !Permissions - .hasPermission(player, Permission.PERMISSION_MERGE_KEEP_ROAD)) { + if (!force && !terrain && !player.hasPermission(Permission.PERMISSION_MERGE_KEEP_ROAD)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_MERGE_KEEP_ROAD)) + TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_MERGE_KEEP_ROAD)) ); return true; } @@ -215,7 +222,7 @@ public class Merge extends SubCommand { this.econHandler.withdrawMoney(player, price); player.sendMessage( TranslatableCaption.of("economy.removed_balance"), - Template.of("money", this.econHandler.format(price)) + TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price)))) ); } player.sendMessage(TranslatableCaption.of("merge.success_merge")); @@ -228,10 +235,10 @@ public class Merge extends SubCommand { player.sendMessage(TranslatableCaption.of("merge.no_available_automerge")); return false; } - if (!force && !Permissions.hasPermission(player, Permission.PERMISSION_MERGE_OTHER)) { + if (!force && !player.hasPermission(Permission.PERMISSION_MERGE_OTHER)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_MERGE_OTHER)) + TagResolver.resolver("node", Tag.inserting(Permission.PERMISSION_MERGE_OTHER)) ); return false; } @@ -256,14 +263,14 @@ public class Merge extends SubCommand { if (!force && this.econHandler.getMoney(player) < price) { player.sendMessage( TranslatableCaption.of("economy.cannot_afford_merge"), - Template.of("money", this.econHandler.format(price)) + TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price)))) ); return; } this.econHandler.withdrawMoney(player, price); player.sendMessage( TranslatableCaption.of("economy.removed_balance"), - Template.of("money", this.econHandler.format(price)) + TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price)))) ); } player.sendMessage(TranslatableCaption.of("merge.success_merge")); @@ -271,10 +278,15 @@ public class Merge extends SubCommand { }; if (!force && hasConfirmation(player)) { CmdConfirm.addPending(accepter, MINI_MESSAGE.serialize(MINI_MESSAGE - .parse( + .deserialize( TranslatableCaption.of("merge.merge_request_confirm").getComponent(player), - Template.of("player", player.getName()), - Template.of("location", plot.getWorldName() + ";" + plot.getId()) + TagResolver.builder() + .tag("player", Tag.inserting(Component.text(player.getName()))) + .tag( + "location", + Tag.inserting(Component.text(plot.getWorldName() + " " + plot.getId())) + ) + .build() )), run ); @@ -282,7 +294,34 @@ public class Merge extends SubCommand { run.run(); } } - if (!force && !isOnline) { + if (force || !isOnline) { + if (force || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_MERGE_OTHER_OFFLINE)) { + if (plot.getPlotModificationManager().autoMerge( + direction, + maxSize - size, + uuids.iterator().next(), + player, + terrain + )) { + if (this.econHandler.isEnabled(plotArea) && price > 0d) { + if (!force && this.econHandler.getMoney(player) < price) { + player.sendMessage( + TranslatableCaption.of("economy.cannot_afford_merge"), + TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price)))) + ); + return false; + } + this.econHandler.withdrawMoney(player, price); + player.sendMessage( + TranslatableCaption.of("economy.removed_balance"), + TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price)))) + ); + } + player.sendMessage(TranslatableCaption.of("merge.success_merge")); + eventDispatcher.callPostMerge(player, plot); + return true; + } + } player.sendMessage(TranslatableCaption.of("merge.no_available_automerge")); return false; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Move.java b/Core/src/main/java/com/plotsquared/core/command/Move.java index 602e29c19..161d12991 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Move.java +++ b/Core/src/main/java/com/plotsquared/core/command/Move.java @@ -26,10 +26,11 @@ 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.util.Permissions; import com.plotsquared.core.util.task.RunnableVal2; import com.plotsquared.core.util.task.RunnableVal3; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.concurrent.CompletableFuture; @@ -60,8 +61,7 @@ public class Move extends SubCommand { player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); return CompletableFuture.completedFuture(false); } - if (!plot1.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN)) { + if (!plot1.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN)) { player.sendMessage(TranslatableCaption.of("permission.no_plot_perms")); return CompletableFuture.completedFuture(false); } @@ -88,8 +88,7 @@ public class Move extends SubCommand { player.sendMessage(TranslatableCaption.of("invalid.origin_cant_be_target")); return CompletableFuture.completedFuture(false); } - if (!plot1.getArea().isCompatible(plot2.getArea()) && (!override || !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN))) { + if (!plot1.getArea().isCompatible(plot2.getArea()) && (!override || !player.hasPermission(Permission.PERMISSION_ADMIN))) { player.sendMessage(TranslatableCaption.of("errors.plotworld_incompatible")); return CompletableFuture.completedFuture(false); } @@ -107,8 +106,10 @@ public class Move extends SubCommand { if (result) { player.sendMessage( TranslatableCaption.of("move.move_success"), - Template.of("origin", p1), - Template.of("target", p2) + TagResolver.builder() + .tag("origin", Tag.inserting(Component.text(p1))) + .tag("target", Tag.inserting(Component.text(p2))) + .build() ); return true; } else { diff --git a/Core/src/main/java/com/plotsquared/core/command/Music.java b/Core/src/main/java/com/plotsquared/core/command/Music.java index f8a3af88d..d54d089d8 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Music.java +++ b/Core/src/main/java/com/plotsquared/core/command/Music.java @@ -33,10 +33,11 @@ import com.plotsquared.core.plot.flag.PlotFlag; import com.plotsquared.core.plot.flag.implementations.MusicFlag; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.InventoryUtil; -import com.plotsquared.core.util.Permissions; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.item.ItemTypes; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import javax.annotation.Nullable; @@ -55,7 +56,7 @@ public class Music extends SubCommand { .asList("music_disc_13", "music_disc_cat", "music_disc_blocks", "music_disc_chirp", "music_disc_far", "music_disc_mall", "music_disc_mellohi", "music_disc_stal", "music_disc_strad", "music_disc_ward", "music_disc_11", "music_disc_wait", "music_disc_otherside", - "music_disc_pigstep", "music_disc_5" + "music_disc_pigstep", "music_disc_5", "music_disc_relic" ); private final InventoryUtil inventoryUtil; @@ -79,11 +80,13 @@ public class Music extends SubCommand { player.sendMessage(TranslatableCaption.of("info.plot_unowned")); return false; } - if (!plot.isAdded(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_MUSIC_OTHER)) { + if (!plot.isAdded(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_MUSIC_OTHER)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_MUSIC_OTHER)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_ADMIN_MUSIC_OTHER) + ) ); return true; } @@ -106,15 +109,17 @@ public class Music extends SubCommand { if (event.getEventResult() == Result.DENY) { getPlayer().sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Music removal") + TagResolver.resolver("value", Tag.inserting(Component.text("Music removal"))) ); return true; } plot.removeFlag(event.getFlag()); getPlayer().sendMessage( TranslatableCaption.of("flag.flag_removed"), - Template.of("flag", "music"), - Template.of("value", "music_disc") + TagResolver.builder() + .tag("flag", Tag.inserting(Component.text("music"))) + .tag("value", Tag.inserting(Component.text("music_disc"))) + .build() ); } else if (item.getName().toLowerCase(Locale.ENGLISH).contains("disc")) { PlotFlag plotFlag = plot.getFlagContainer().getFlag(MusicFlag.class) @@ -123,13 +128,17 @@ public class Music extends SubCommand { if (event.getEventResult() == Result.DENY) { getPlayer().sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Music addition") + TagResolver.resolver("value", Tag.inserting(Component.text("Music addition"))) ); return true; } plot.setFlag(event.getFlag()); - getPlayer().sendMessage(TranslatableCaption.of("flag.flag_added"), Template.of("flag", "music"), - Template.of("value", String.valueOf(event.getFlag().getValue())) + getPlayer().sendMessage( + TranslatableCaption.of("flag.flag_added"), + TagResolver.builder() + .tag("flag", Tag.inserting(Component.text("music"))) + .tag("value", Tag.inserting(Component.text(event.getFlag().getValue().toString()))) + .build() ); } else { getPlayer().sendMessage(TranslatableCaption.of("flag.flag_not_added")); diff --git a/Core/src/main/java/com/plotsquared/core/command/Near.java b/Core/src/main/java/com/plotsquared/core/command/Near.java index 449be991b..c415a5492 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Near.java +++ b/Core/src/main/java/com/plotsquared/core/command/Near.java @@ -24,8 +24,11 @@ import com.plotsquared.core.plot.Plot; 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.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import java.util.List; import java.util.concurrent.CompletableFuture; @CommandDeclaration(command = "near", @@ -48,9 +51,13 @@ public class Near extends Command { final Plot plot = check(player.getCurrentPlot(), TranslatableCaption.of("errors.not_in_plot")); player.sendMessage( TranslatableCaption.of("near.plot_near"), - Template.of("list", StringMan.join(plot.getPlayersInPlot(), ", ")) + TagResolver.resolver("list", Tag.inserting(Component.text(StringMan.join(plot.getPlayersInPlot(), ", ")))) ); return CompletableFuture.completedFuture(true); } + private List> getPlayersInPlotVisible(Plot plot, PlotPlayer executor) { + return plot.getPlayersInPlot().stream().filter(executor::canSee).toList(); + } + } diff --git a/Core/src/main/java/com/plotsquared/core/command/Owner.java b/Core/src/main/java/com/plotsquared/core/command/Owner.java index bb44a4686..ee3c32eec 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Owner.java +++ b/Core/src/main/java/com/plotsquared/core/command/Owner.java @@ -31,11 +31,12 @@ import com.plotsquared.core.player.PlayerMetaDataKeys; 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.TaskManager; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -66,7 +67,7 @@ public class Owner extends SetCommand { if (value == null || value.isEmpty()) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot setowner ") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot setowner "))) ); return false; } @@ -78,7 +79,7 @@ public class Owner extends SetCommand { && !value.equalsIgnoreCase("-")) { player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Template.of("value", value) + TagResolver.resolver("value", Tag.inserting(Component.text(value))) ); return; } @@ -92,17 +93,17 @@ public class Owner extends SetCommand { if (event.getEventResult() == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Owner change") + TagResolver.resolver("value", Tag.inserting(Component.text("Owner change"))) ); return; } uuid = event.getNewOwner(); boolean force = event.getEventResult() == Result.FORCE; if (uuid == null) { - if (!force && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_SET_OWNER, - true - )) { + if (!force && !player.hasPermission( + Permission.PERMISSION_ADMIN_COMMAND_SET_OWNER, + true + )) { return; } PlotUnlinkEvent unlinkEvent = this.eventDispatcher.callUnlink( @@ -115,7 +116,7 @@ public class Owner extends SetCommand { if (unlinkEvent.getEventResult() == Result.DENY) { player.sendMessage( TranslatableCaption.of("events.event_denied"), - Template.of("value", "Unlink on owner change") + TagResolver.resolver("value", Tag.inserting(Component.text("Unlink on owner change"))) ); return; } @@ -135,16 +136,21 @@ public class Owner extends SetCommand { if (plot.isOwner(uuid)) { player.sendMessage( TranslatableCaption.of("member.already_owner"), - Template.of("player", PlayerManager.resolveName(uuid, false).getComponent(player)) + TagResolver.resolver( + "player", + Tag.inserting(PlayerManager.resolveName(uuid, false).toComponent(player)) + ) ); return; } - if (!force && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_SET_OWNER)) { + if (!force && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_SET_OWNER)) { if (other == null) { player.sendMessage( TranslatableCaption.of("errors.invalid_player_offline"), - Template.of("player", PlayerManager.resolveName(uuid).getComponent(player)) + TagResolver.resolver( + "player", + Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player)) + ) ); return; } @@ -180,7 +186,10 @@ public class Owner extends SetCommand { if (other != null) { other.sendMessage( TranslatableCaption.of("owner.now_owner"), - Template.of("plot", plot.getArea() + ";" + plot.getId()) + TagResolver.resolver( + "plot", + Tag.inserting(Component.text(plot.getArea() + ";" + plot.getId())) + ) ); } } else { diff --git a/Core/src/main/java/com/plotsquared/core/command/PluginCmd.java b/Core/src/main/java/com/plotsquared/core/command/PluginCmd.java index 0e5f4b582..be78475b5 100644 --- a/Core/src/main/java/com/plotsquared/core/command/PluginCmd.java +++ b/Core/src/main/java/com/plotsquared/core/command/PluginCmd.java @@ -23,7 +23,9 @@ import com.plotsquared.core.configuration.caption.StaticCaption; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.util.PremiumVerification; import com.plotsquared.core.util.task.TaskManager; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; @CommandDeclaration(command = "plugin", permission = "plots.use", @@ -39,7 +41,7 @@ public class PluginCmd extends SubCommand { StaticCaption.of(">> " + PlotSquared .platform() .pluginName() + " (Version: )"), - Template.of("version", String.valueOf(PlotSquared.get().getVersion())) + TagResolver.resolver("version", Tag.inserting(Component.text(String.valueOf(PlotSquared.get().getVersion())))) ); player.sendMessage(StaticCaption.of( ">> Authors: Citymonstret & Empire92 & MattBDev & dordsor21 & NotMyFault & SirYwell")); @@ -49,7 +51,7 @@ public class PluginCmd extends SubCommand { ">> Discord: https://discord.gg/intellectualsites")); player.sendMessage( StaticCaption.of(">> Premium: "), - Template.of("value", String.valueOf(PremiumVerification.isPremium())) + TagResolver.resolver("value", Tag.inserting(Component.text(PremiumVerification.isPremium()))) ); }); return true; diff --git a/Core/src/main/java/com/plotsquared/core/command/Purge.java b/Core/src/main/java/com/plotsquared/core/command/Purge.java index 49f48ea03..873c732b9 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Purge.java +++ b/Core/src/main/java/com/plotsquared/core/command/Purge.java @@ -33,7 +33,9 @@ import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.query.PlotQuery; import com.plotsquared.core.util.task.TaskManager; import com.plotsquared.core.uuid.UUIDMapping; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.checkerframework.checker.nullness.qual.NonNull; @@ -88,72 +90,56 @@ public class Purge extends SubCommand { return false; } switch (split[0].toLowerCase()) { - case "world": - case "w": - world = split[1]; - break; - case "area": - case "a": + case "world", "w" -> world = split[1]; + case "area", "a" -> { area = this.plotAreaManager.getPlotAreaByString(split[1]); if (area == null) { player.sendMessage( TranslatableCaption.of("errors.not_valid_plot_world"), - Template.of("value", split[1]) + TagResolver.resolver("value", Tag.inserting(Component.text(split[1]))) ); return false; } - break; - case "plotid": - case "id": + } + case "plotid", "id" -> { try { id = PlotId.fromString(split[1]); } catch (IllegalArgumentException ignored) { player.sendMessage( TranslatableCaption.of("invalid.not_valid_plot_id"), - Template.of("value", split[1]) + TagResolver.resolver("value", Tag.inserting(Component.text(split[1]))) ); return false; } - break; - case "owner": - case "o": + } + case "owner", "o" -> { UUIDMapping ownerMapping = PlotSquared.get().getImpromptuUUIDPipeline().getImmediately(split[1]); if (ownerMapping == null) { player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Template.of("value", split[1]) + TagResolver.resolver("value", Tag.inserting(Component.text(split[1]))) ); return false; } - owner = ownerMapping.getUuid(); - break; - case "shared": - case "s": + owner = ownerMapping.uuid(); + } + case "shared", "s" -> { UUIDMapping addedMapping = PlotSquared.get().getImpromptuUUIDPipeline().getImmediately(split[1]); if (addedMapping == null) { player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Template.of("value", split[1]) + TagResolver.resolver("value", Tag.inserting(Component.text(split[1]))) ); return false; } - added = addedMapping.getUuid(); - break; - case "clear": - case "c": - case "delete": - case "d": - case "del": - clear = Boolean.parseBoolean(split[1]); - break; - case "unknown": - case "?": - case "u": - unknown = Boolean.parseBoolean(split[1]); - break; - default: + added = addedMapping.uuid(); + } + case "clear", "c", "delete", "d", "del" -> clear = Boolean.parseBoolean(split[1]); + case "unknown", "?", "u" -> unknown = Boolean.parseBoolean(split[1]); + default -> { sendUsage(player); return false; + } } } final HashSet toDelete = new HashSet<>(); @@ -234,9 +220,9 @@ public class Purge extends SubCommand { try { ids.add(plot.temp); if (finalClear) { - plot.getPlotModificationManager().clear(false, true, player, () -> { - LOGGER.info("Plot {} cleared by purge", plot.getId()); - }); + plot.getPlotModificationManager().clear(false, true, player, + () -> LOGGER.info("Plot {} cleared by purge", plot.getId()) + ); } else { plot.getPlotModificationManager().removeSign(); } @@ -258,7 +244,10 @@ public class Purge extends SubCommand { DBFunc.purgeIds(ids); player.sendMessage( TranslatableCaption.of("purge.purge_success"), - Template.of("amount", ids.size() + "/" + toDelete.size()) + TagResolver.resolver( + "amount", + Tag.inserting(Component.text(ids.size() + "/" + toDelete.size())) + ) ); }); } diff --git a/Core/src/main/java/com/plotsquared/core/command/Rate.java b/Core/src/main/java/com/plotsquared/core/command/Rate.java index 0c7a446d5..6e1319cc8 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Rate.java +++ b/Core/src/main/java/com/plotsquared/core/command/Rate.java @@ -34,11 +34,12 @@ import com.plotsquared.core.plot.flag.implementations.DoneFlag; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.InventoryUtil; import com.plotsquared.core.util.MathMan; -import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.TabCompletions; import com.plotsquared.core.util.query.PlotQuery; import com.plotsquared.core.util.task.TaskManager; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.Collection; @@ -114,8 +115,7 @@ public class Rate extends SubCommand { player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); return false; } - if (!Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS, true)) { + if (!player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS, true)) { return false; } plot.clearRatings(); @@ -148,7 +148,7 @@ public class Rate extends SubCommand { if (plot.getRatings().containsKey(player.getUUID())) { player.sendMessage( TranslatableCaption.of("ratings.rating_already_exists"), - Template.of("plot", plot.getId().toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) ); return; } @@ -168,7 +168,7 @@ public class Rate extends SubCommand { plot.addRating(this.getPlayer().getUUID(), event.getRating()); getPlayer().sendMessage( TranslatableCaption.of("ratings.rating_applied"), - Template.of("plot", plot.getId().toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) ); } return false; @@ -241,7 +241,7 @@ public class Rate extends SubCommand { if (plot.getRatings().containsKey(uuid)) { player.sendMessage( TranslatableCaption.of("ratings.rating_already_exists"), - Template.of("plot", plot.getId().toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) ); return; } @@ -251,7 +251,7 @@ public class Rate extends SubCommand { plot.addRating(uuid, event.getRating()); player.sendMessage( TranslatableCaption.of("ratings.rating_applied"), - Template.of("plot", plot.getId().toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) ); } }; @@ -273,10 +273,10 @@ public class Rate extends SubCommand { public Collection tab(final PlotPlayer player, final String[] args, final boolean space) { if (args.length == 1) { final List completions = new LinkedList<>(); - if (Permissions.hasPermission(player, Permission.PERMISSION_RATE)) { + if (player.hasPermission(Permission.PERMISSION_RATE)) { completions.add("1 - 10"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS)) { + if (player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_PURGE_RATINGS)) { completions.add("purge"); } final List commands = completions.stream().filter(completion -> completion @@ -284,7 +284,7 @@ public class Rate extends SubCommand { .startsWith(args[0].toLowerCase())) .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) { }).collect(Collectors.toCollection(LinkedList::new)); - if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) { + if (player.hasPermission(Permission.PERMISSION_RATE) && args[0].length() > 0) { commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList())); } return commands; diff --git a/Core/src/main/java/com/plotsquared/core/command/RegenAllRoads.java b/Core/src/main/java/com/plotsquared/core/command/RegenAllRoads.java index 7d9131514..81375d295 100644 --- a/Core/src/main/java/com/plotsquared/core/command/RegenAllRoads.java +++ b/Core/src/main/java/com/plotsquared/core/command/RegenAllRoads.java @@ -26,7 +26,9 @@ import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotManager; import com.plotsquared.core.plot.world.PlotAreaManager; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; @CommandDeclaration(command = "regenallroads", @@ -58,18 +60,18 @@ public class RegenAllRoads extends SubCommand { } catch (NumberFormatException ignored) { player.sendMessage( TranslatableCaption.of("invalid.not_valid_number"), - Template.of("value", "(0, 256)") + TagResolver.resolver("value", Tag.inserting(Component.text("(0, 256)"))) ); player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot regenallroads [height]") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot regenallroads [height]"))) ); return false; } } else if (args.length != 1) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot regenallroads [height]") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot regenallroads [height]"))) ); return false; } @@ -77,7 +79,7 @@ public class RegenAllRoads extends SubCommand { if (area == null) { player.sendMessage( TranslatableCaption.of("errors.not_valid_plot_world"), - Template.of("value", args[0]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[0]))) ); return false; } @@ -88,7 +90,7 @@ public class RegenAllRoads extends SubCommand { } player.sendMessage( TranslatableCaption.of("debugroadregen.schematic"), - Template.of("command", "/plot createroadschematic") + TagResolver.resolver("command", Tag.inserting(Component.text("/plot createroadschematic"))) ); player.sendMessage(TranslatableCaption.of("debugroadregen.regenallroads_started")); boolean result = this.hybridUtils.scheduleRoadUpdate(area, height); diff --git a/Core/src/main/java/com/plotsquared/core/command/Remove.java b/Core/src/main/java/com/plotsquared/core/command/Remove.java index 492a01085..ec936f9c7 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Remove.java +++ b/Core/src/main/java/com/plotsquared/core/command/Remove.java @@ -26,10 +26,11 @@ 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 net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.Collection; @@ -65,8 +66,7 @@ public class Remove extends SubCommand { player.sendMessage(TranslatableCaption.of("info.plot_unowned")); return false; } - if (!plot.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_REMOVE)) { + if (!plot.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_REMOVE)) { player.sendMessage(TranslatableCaption.of("permission.no_plot_perms")); return true; } @@ -79,7 +79,7 @@ public class Remove extends SubCommand { } else if (throwable != null) { player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Template.of("value", args[0]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[0]))) ); return; } else if (!uuids.isEmpty()) { @@ -116,12 +116,12 @@ public class Remove extends SubCommand { if (count == 0) { player.sendMessage( TranslatableCaption.of("errors.invalid_player"), - Template.of("value", args[0]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[0]))) ); } else { player.sendMessage( TranslatableCaption.of("member.removed_players"), - Template.of("amount", count + "") + TagResolver.resolver("amount", Tag.inserting(Component.text(count))) ); } }); diff --git a/Core/src/main/java/com/plotsquared/core/command/Save.java b/Core/src/main/java/com/plotsquared/core/command/Save.java deleted file mode 100644 index 1cfa55d1b..000000000 --- a/Core/src/main/java/com/plotsquared/core/command/Save.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * PlotSquared, a land and world management plugin for Minecraft. - * Copyright (C) IntellectualSites - * 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 . - */ -package com.plotsquared.core.command; - -import com.google.inject.Inject; -import com.plotsquared.core.configuration.caption.TranslatableCaption; -import com.plotsquared.core.location.Location; -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.plot.Plot; -import com.plotsquared.core.plot.PlotId; -import com.plotsquared.core.plot.world.PlotAreaManager; -import com.plotsquared.core.util.Permissions; -import com.plotsquared.core.util.SchematicHandler; -import com.plotsquared.core.util.task.RunnableVal; -import com.plotsquared.core.util.task.TaskManager; -import net.kyori.adventure.text.minimessage.Template; -import org.checkerframework.checker.nullness.qual.NonNull; - -import java.net.URL; -import java.util.List; -import java.util.UUID; - -/** - * @deprecated In favor of "/plot download" (Arkitektonika) and scheduled - * for removal within the next major release. - */ -@Deprecated(forRemoval = true, since = "6.0.9") -@CommandDeclaration(command = "save", - category = CommandCategory.SCHEMATIC, - requiredType = RequiredType.NONE, - permission = "plots.save") -public class Save extends SubCommand { - - private final PlotAreaManager plotAreaManager; - private final SchematicHandler schematicHandler; - - @Inject - public Save( - final @NonNull PlotAreaManager plotAreaManager, - final @NonNull SchematicHandler schematicHandler - ) { - this.plotAreaManager = plotAreaManager; - this.schematicHandler = schematicHandler; - } - - @Override - public boolean onCommand(final PlotPlayer player, final String[] args) { - final String world = player.getLocation().getWorldName(); - if (!this.plotAreaManager.hasPlotArea(world)) { - player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world")); - return false; - } - final Plot plot = player.getCurrentPlot(); - if (plot == null) { - player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); - return false; - } - if (!plot.hasOwner()) { - player.sendMessage(TranslatableCaption.of("info.plot_unowned")); - return false; - } - if (plot.getVolume() > Integer.MAX_VALUE) { - player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large")); - return false; - } - if (!plot.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_SAVE)) { - player.sendMessage(TranslatableCaption.of("permission.no_plot_perms")); - return false; - } - if (plot.getRunning() > 0) { - player.sendMessage(TranslatableCaption.of("errors.wait_for_timer")); - return false; - } - plot.addRunning(); - this.schematicHandler.getCompoundTag(plot) - .whenComplete((compoundTag, throwable) -> { - TaskManager.runTaskAsync(() -> { - String time = (System.currentTimeMillis() / 1000) + ""; - Location[] corners = plot.getCorners(); - corners[0] = corners[0].withY(plot.getArea().getMinBuildHeight()); - corners[1] = corners[1].withY(plot.getArea().getMaxBuildHeight()); - int size = (corners[1].getX() - corners[0].getX()) + 1; - PlotId id = plot.getId(); - String world1 = plot.getArea().toString().replaceAll(";", "-") - .replaceAll("[^A-Za-z0-9]", ""); - final String file = time + '_' + world1 + '_' + id.getX() + '_' + id.getY() + '_' + size; - UUID uuid = player.getUUID(); - schematicHandler.upload(compoundTag, uuid, file, new RunnableVal<>() { - @Override - public void run(URL url) { - plot.removeRunning(); - if (url == null) { - player.sendMessage(TranslatableCaption.of("backups.backup_save_failed")); - return; - } - player.sendMessage(TranslatableCaption.of("web.save_success")); - player.sendMessage( - TranslatableCaption.of("errors.deprecated_commands"), - Template.of("replacement", "/plot download") - ); - try (final MetaDataAccess> schematicAccess = - player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_SCHEMATICS)) { - schematicAccess.get().ifPresent(schematics -> schematics.add(file + ".schem")); - } - } - }); - }); - }); - return true; - } - -} diff --git a/Core/src/main/java/com/plotsquared/core/command/SchematicCmd.java b/Core/src/main/java/com/plotsquared/core/command/SchematicCmd.java index 0a495e987..613f2eec7 100644 --- a/Core/src/main/java/com/plotsquared/core/command/SchematicCmd.java +++ b/Core/src/main/java/com/plotsquared/core/command/SchematicCmd.java @@ -30,13 +30,14 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.schematic.Schematic; import com.plotsquared.core.plot.world.PlotAreaManager; -import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.SchematicHandler; import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.TabCompletions; import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.TaskManager; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.net.URL; @@ -73,24 +74,30 @@ public class SchematicCmd extends SubCommand { if (args.length < 1) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "Possible values: save, paste, exportall, list") + TagResolver.resolver("value", Tag.inserting(Component.text("Possible values: save, paste, exportall, list"))) ); return true; } String arg = args[0].toLowerCase(); switch (arg) { case "paste" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_SCHEMATIC_PASTE)) { + if (!player.hasPermission(Permission.PERMISSION_SCHEMATIC_PASTE)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_SCHEMATIC_PASTE)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_SCHEMATIC_PASTE) + ) ); return false; } if (args.length < 2) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "Possible values: save, paste, exportall, list") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("Possible values: save, paste, exportall, list")) + ) ); break; } @@ -104,8 +111,7 @@ public class SchematicCmd extends SubCommand { player.sendMessage(TranslatableCaption.of("info.plot_unowned")); return false; } - if (!plot.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, "plots.admin.command.schematic.paste")) { + if (!plot.isOwner(player.getUUID()) && !player.hasPermission("plots.admin.command.schematic.paste")) { player.sendMessage(TranslatableCaption.of("permission.no_plot_perms")); return false; } @@ -131,7 +137,10 @@ public class SchematicCmd extends SubCommand { e.printStackTrace(); player.sendMessage( TranslatableCaption.of("schematics.schematic_invalid"), - Template.of("reason", "non-existent url: " + location) + TagResolver.resolver( + "reason", + Tag.inserting(Component.text("non-existent url: " + location)) + ) ); SchematicCmd.this.running = false; return; @@ -147,7 +156,10 @@ public class SchematicCmd extends SubCommand { SchematicCmd.this.running = false; player.sendMessage( TranslatableCaption.of("schematics.schematic_invalid"), - Template.of("reason", "non-existent or not in gzip format") + TagResolver.resolver( + "reason", + Tag.inserting(Component.text("non-existent or not in gzip format")) + ) ); return; } @@ -182,7 +194,10 @@ public class SchematicCmd extends SubCommand { player.sendMessage(TranslatableCaption.of("schematics.schematic_exportall_world_args")); player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "Use /plot schematic exportall ") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("Use /plot schematic exportall ")) + ) ); return false; } @@ -190,7 +205,7 @@ public class SchematicCmd extends SubCommand { if (area == null) { player.sendMessage( TranslatableCaption.of("errors.not_valid_plot_world"), - Template.of("value", args[1]) + TagResolver.resolver("value", Tag.inserting(Component.text(args[1]))) ); return false; } @@ -199,7 +214,7 @@ public class SchematicCmd extends SubCommand { player.sendMessage(TranslatableCaption.of("schematic.schematic_exportall_world")); player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "Use /plot sch exportall ") + TagResolver.resolver("value", Tag.inserting(Component.text("Use /plot sch exportall "))) ); return false; } @@ -213,15 +228,18 @@ public class SchematicCmd extends SubCommand { player.sendMessage(TranslatableCaption.of("schematics.schematic_exportall_started")); player.sendMessage( TranslatableCaption.of("schematics.plot_to_schem"), - Template.of("amount", String.valueOf(plots.size())) + TagResolver.resolver("amount", Tag.inserting(Component.text(plots.size()))) ); } } case "export", "save" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_SCHEMATIC_SAVE)) { + if (!player.hasPermission(Permission.PERMISSION_SCHEMATIC_SAVE)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_SCHEMATIC_SAVE)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_SCHEMATIC_SAVE) + ) ); return false; } @@ -243,8 +261,7 @@ public class SchematicCmd extends SubCommand { player.sendMessage(TranslatableCaption.of("schematics.schematic_too_large")); return false; } - if (!plot.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, "plots.admin.command.schematic.save")) { + if (!plot.isOwner(player.getUUID()) && !player.hasPermission("plots.admin.command.schematic.save")) { player.sendMessage(TranslatableCaption.of("permission.no_plot_perms")); return false; } @@ -261,22 +278,25 @@ public class SchematicCmd extends SubCommand { } } case "list" -> { - if (!Permissions.hasPermission(player, Permission.PERMISSION_SCHEMATIC_LIST)) { + if (!player.hasPermission(Permission.PERMISSION_SCHEMATIC_LIST)) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", String.valueOf(Permission.PERMISSION_SCHEMATIC_LIST)) + TagResolver.resolver( + "node", + Tag.inserting(Permission.PERMISSION_SCHEMATIC_LIST) + ) ); return false; } final String string = StringMan.join(this.schematicHandler.getSchematicNames(), "$2, $1"); player.sendMessage( TranslatableCaption.of("schematics.schematic_list"), - Template.of("list", string) + TagResolver.resolver("list", Tag.inserting(Component.text(string))) ); } default -> player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "Possible values: save, paste, exportall, list") + TagResolver.resolver("value", Tag.inserting(Component.text("Possible values: save, paste, exportall, list"))) ); } return true; @@ -286,13 +306,13 @@ public class SchematicCmd extends SubCommand { public Collection tab(final PlotPlayer player, final String[] args, final boolean space) { if (args.length == 1) { final List completions = new LinkedList<>(); - if (Permissions.hasPermission(player, Permission.PERMISSION_SCHEMATIC_SAVE)) { + if (player.hasPermission(Permission.PERMISSION_SCHEMATIC_SAVE)) { completions.add("save"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_SCHEMATIC_LIST)) { + if (player.hasPermission(Permission.PERMISSION_SCHEMATIC_LIST)) { completions.add("list"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_SCHEMATIC_PASTE)) { + if (player.hasPermission(Permission.PERMISSION_SCHEMATIC_PASTE)) { completions.add("paste"); } final List commands = completions.stream().filter(completion -> completion @@ -307,7 +327,7 @@ public class SchematicCmd extends SubCommand { CommandCategory.ADMINISTRATION ) { }).collect(Collectors.toCollection(LinkedList::new)); - if (Permissions.hasPermission(player, Permission.PERMISSION_SCHEMATIC) && args[0].length() > 0) { + if (player.hasPermission(Permission.PERMISSION_SCHEMATIC) && args[0].length() > 0) { commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList())); } return commands; diff --git a/Core/src/main/java/com/plotsquared/core/command/Set.java b/Core/src/main/java/com/plotsquared/core/command/Set.java index e12ab3505..1b39a9dc5 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Set.java +++ b/Core/src/main/java/com/plotsquared/core/command/Set.java @@ -32,7 +32,6 @@ import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotManager; import com.plotsquared.core.queue.QueueCoordinator; import com.plotsquared.core.util.PatternUtil; -import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.TabCompletions; import com.plotsquared.core.util.WorldUtil; @@ -40,7 +39,9 @@ import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.world.block.BlockCategory; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.ArrayList; @@ -96,7 +97,7 @@ public class Set extends SubCommand { BlockType::getName).toList()); } - if (!Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_ALLOW_UNSAFE) && + if (!player.hasPermission(Permission.PERMISSION_ADMIN_ALLOW_UNSAFE) && !forbiddenTypes.isEmpty()) { for (String forbiddenType : forbiddenTypes) { forbiddenType = forbiddenType.toLowerCase(Locale.ENGLISH); @@ -123,7 +124,7 @@ public class Set extends SubCommand { } player.sendMessage( TranslatableCaption.of("invalid.component_illegal_block"), - Template.of("value", forbiddenType) + TagResolver.resolver("value", Tag.inserting(Component.text(forbiddenType))) ); return true; } @@ -132,10 +133,13 @@ public class Set extends SubCommand { for (String component : components) { if (component.equalsIgnoreCase(args[0])) { - if (!Permissions.hasPermission(player, Permission.PERMISSION_SET_COMPONENT.format(component))) { + if (!player.hasPermission(Permission.PERMISSION_SET_COMPONENT.format(component))) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_SET_COMPONENT.format(component)) + TagResolver.resolver( + "node", + Tag.inserting(Component.text(Permission.PERMISSION_SET_COMPONENT.format(component))) + ) ); return false; } @@ -158,7 +162,7 @@ public class Set extends SubCommand { plot.removeRunning(); player.sendMessage( TranslatableCaption.of("working.component_complete"), - Template.of("plot", plot.getId().toString()) + TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) ); }); if (Settings.QUEUE.NOTIFY_PROGRESS) { @@ -211,7 +215,7 @@ public class Set extends SubCommand { } Command cmd = MainCommand.getInstance().getCommand("set" + args[0]); if (cmd != null) { - if (!Permissions.hasPermission(player, cmd.getPermission(), true)) { + if (!player.hasPermission(cmd.getPermission(), true)) { return false; } cmd.execute(player, Arrays.copyOfRange(args, 1, args.length), null, null); @@ -241,37 +245,37 @@ public class Set extends SubCommand { if (args.length == 1) { final List completions = new LinkedList<>(); - if (Permissions.hasPermission(player, Permission.PERMISSION_SET_BIOME)) { + if (player.hasPermission(Permission.PERMISSION_SET_BIOME)) { completions.add("biome"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_SET_ALIAS)) { + if (player.hasPermission(Permission.PERMISSION_SET_ALIAS)) { completions.add("alias"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_SET_HOME)) { + if (player.hasPermission(Permission.PERMISSION_SET_HOME)) { completions.add("home"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_SET_MAIN)) { + if (player.hasPermission(Permission.PERMISSION_SET_MAIN)) { completions.add("main"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_SET_FLOOR)) { + if (player.hasPermission(Permission.PERMISSION_SET_FLOOR)) { completions.add("floor"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_SET_AIR)) { + if (player.hasPermission(Permission.PERMISSION_SET_AIR)) { completions.add("air"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_SET_ALL)) { + if (player.hasPermission(Permission.PERMISSION_SET_ALL)) { completions.add("all"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_SET_BORDER)) { + if (player.hasPermission(Permission.PERMISSION_SET_BORDER)) { completions.add("border"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_SET_WALL)) { + if (player.hasPermission(Permission.PERMISSION_SET_WALL)) { completions.add("wall"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_SET_OUTLINE)) { + if (player.hasPermission(Permission.PERMISSION_SET_OUTLINE)) { completions.add("outline"); } - if (Permissions.hasPermission(player, Permission.PERMISSION_SET_MIDDLE)) { + if (player.hasPermission(Permission.PERMISSION_SET_MIDDLE)) { completions.add("middle"); } final List commands = completions.stream().filter(completion -> completion @@ -280,7 +284,7 @@ public class Set extends SubCommand { .map(completion -> new Command(null, true, completion, "", RequiredType.NONE, CommandCategory.APPEARANCE) { }).collect(Collectors.toCollection(LinkedList::new)); - if (Permissions.hasPermission(player, Permission.PERMISSION_SET) && args[0].length() > 0) { + if (player.hasPermission(Permission.PERMISSION_SET) && args[0].length() > 0) { commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList())); } return commands; @@ -296,7 +300,7 @@ public class Set extends SubCommand { final Command cmd = MainCommand.getInstance().getCommand("set" + args[0]); if (cmd != null) { - if (!Permissions.hasPermission(player, cmd.getPermission(), true)) { + if (!player.hasPermission(cmd.getPermission(), true)) { return new ArrayList<>(); } return cmd.tab(player, newArgs, space); diff --git a/Core/src/main/java/com/plotsquared/core/command/SetCommand.java b/Core/src/main/java/com/plotsquared/core/command/SetCommand.java index 1ff54853c..49794ec4b 100644 --- a/Core/src/main/java/com/plotsquared/core/command/SetCommand.java +++ b/Core/src/main/java/com/plotsquared/core/command/SetCommand.java @@ -23,9 +23,10 @@ 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 com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.StringMan; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; public abstract class SetCommand extends SubCommand { @@ -38,20 +39,26 @@ public abstract class SetCommand extends SubCommand { return false; } if (!plot.hasOwner()) { - if (!Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND.format(getFullId()))) { + if (!player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND.format(getFullId()))) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_ADMIN_COMMAND.format(getFullId())) + TagResolver.resolver( + "node", + Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_COMMAND.format(getFullId()))) + ) ); player.sendMessage(TranslatableCaption.of("working.plot_not_claimed")); return false; } } if (!plot.isOwner(player.getUUID())) { - if (!Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND.format(getFullId()))) { + if (!player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND.format(getFullId()))) { player.sendMessage( TranslatableCaption.of("permission.no_permission"), - Template.of("node", Permission.PERMISSION_ADMIN_COMMAND.format(getFullId())) + TagResolver.resolver( + "node", + Tag.inserting(Component.text(Permission.PERMISSION_ADMIN_COMMAND.format(getFullId()))) + ) ); player.sendMessage(TranslatableCaption.of("permission.no_plot_perms")); return false; diff --git a/Core/src/main/java/com/plotsquared/core/command/SetHome.java b/Core/src/main/java/com/plotsquared/core/command/SetHome.java index 7d5d3d8c6..cd1551dae 100644 --- a/Core/src/main/java/com/plotsquared/core/command/SetHome.java +++ b/Core/src/main/java/com/plotsquared/core/command/SetHome.java @@ -23,7 +23,9 @@ import com.plotsquared.core.location.BlockLoc; import com.plotsquared.core.location.Location; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.Plot; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; @CommandDeclaration(command = "sethome", permission = "plots.set.home", @@ -64,7 +66,7 @@ public class SetHome extends SetCommand { default -> { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "Use /plot set home [none]") + TagResolver.resolver("value", Tag.inserting(Component.text("Use /plot set home [none]"))) ); return false; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Setup.java b/Core/src/main/java/com/plotsquared/core/command/Setup.java index 144e449ae..cac90959b 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Setup.java +++ b/Core/src/main/java/com/plotsquared/core/command/Setup.java @@ -29,7 +29,9 @@ import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.setup.SetupProcess; import com.plotsquared.core.setup.SetupStep; import com.plotsquared.core.util.SetupUtils; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.ArrayList; @@ -78,7 +80,10 @@ public class Setup extends SubCommand { player.sendMessage(TranslatableCaption.of("setup.setup_not_started")); player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "Use /plot setup to start a setup process.") + TagResolver.resolver( + "value", + Tag.inserting(Component.text("Use /plot setup to start a setup process.")) + ) ); return true; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Swap.java b/Core/src/main/java/com/plotsquared/core/command/Swap.java index 4c7864439..e56def26f 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Swap.java +++ b/Core/src/main/java/com/plotsquared/core/command/Swap.java @@ -23,10 +23,11 @@ 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 com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.task.RunnableVal2; import com.plotsquared.core.util.task.RunnableVal3; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import java.util.concurrent.CompletableFuture; @@ -49,8 +50,7 @@ public class Swap extends SubCommand { player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); return CompletableFuture.completedFuture(false); } - if (!plot1.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Permission.PERMISSION_ADMIN)) { + if (!plot1.isOwner(player.getUUID()) && !player.hasPermission(Permission.PERMISSION_ADMIN)) { player.sendMessage(TranslatableCaption.of("permission.no_plot_perms")); return CompletableFuture.completedFuture(false); } @@ -84,8 +84,10 @@ public class Swap extends SubCommand { if (result) { player.sendMessage( TranslatableCaption.of("swap.swap_success"), - Template.of("origin", p1), - Template.of("target", p2) + TagResolver.builder() + .tag("origin", Tag.inserting(Component.text(p1))) + .tag("target", Tag.inserting(Component.text(p2))) + .build() ); return true; } else { diff --git a/Core/src/main/java/com/plotsquared/core/command/Target.java b/Core/src/main/java/com/plotsquared/core/command/Target.java index e12cc9cf6..b2d645b30 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Target.java +++ b/Core/src/main/java/com/plotsquared/core/command/Target.java @@ -24,7 +24,9 @@ import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.query.PlotQuery; -import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import java.util.Collection; import java.util.Locale; @@ -52,7 +54,7 @@ public class Target extends SubCommand { if (args.length == 0) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - Template.of("value", "/plot target < | nearest>") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot target < | nearest>"))) ); return false; } @@ -76,7 +78,7 @@ public class Target extends SubCommand { target.getCenter(player::setCompassTarget); player.sendMessage( TranslatableCaption.of("compass.compass_target"), - Template.of("target", target.toString()) + TagResolver.resolver("target", Tag.inserting(Component.text(target.toString()))) ); return true; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Template.java b/Core/src/main/java/com/plotsquared/core/command/Template.java index 02b95e71f..b96f1a58d 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Template.java +++ b/Core/src/main/java/com/plotsquared/core/command/Template.java @@ -39,11 +39,13 @@ import com.plotsquared.core.setup.PlotAreaBuilder; import com.plotsquared.core.setup.SettingsNodesWrapper; import com.plotsquared.core.util.FileBytes; import com.plotsquared.core.util.FileUtils; -import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.SetupUtils; import com.plotsquared.core.util.TabCompletions; import com.plotsquared.core.util.WorldUtil; 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 org.checkerframework.checker.nullness.qual.NonNull; import java.io.File; @@ -154,9 +156,9 @@ public class Template extends SubCommand { ZipOutputStream zos = new ZipOutputStream(fos)) { for (FileBytes file : files) { - ZipEntry ze = new ZipEntry(file.path); + ZipEntry ze = new ZipEntry(file.path()); zos.putNextEntry(ze); - zos.write(file.data); + zos.write(file.data()); } zos.closeEntry(); } @@ -169,13 +171,16 @@ public class Template extends SubCommand { if (args[0].equalsIgnoreCase("export")) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - net.kyori.adventure.text.minimessage.Template.of("value", "/plot template export ") + TagResolver.resolver("value", Tag.inserting(Component.text("/plot template export "))) ); return true; } else if (args[0].equalsIgnoreCase("import")) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - net.kyori.adventure.text.minimessage.Template.of("value", "/plot template import