mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2025-07-03 00:15:35 +00:00
Merge pull request #227 from PolyhedralDev/ver/6.0.0
Major Version 6.0 Tracking PR
This commit is contained in:
commit
a9248435a2
453
.editorconfig
453
.editorconfig
@ -13,137 +13,151 @@ ij_formatter_off_tag = @formatter:off
|
|||||||
ij_formatter_on_tag = @formatter:on
|
ij_formatter_on_tag = @formatter:on
|
||||||
ij_formatter_tags_enabled = false
|
ij_formatter_tags_enabled = false
|
||||||
ij_smart_tabs = false
|
ij_smart_tabs = false
|
||||||
|
ij_visual_guides = 140
|
||||||
ij_wrap_on_typing = false
|
ij_wrap_on_typing = false
|
||||||
|
|
||||||
[*.java]
|
[*.java]
|
||||||
|
ij_visual_guides = none
|
||||||
ij_java_align_consecutive_assignments = false
|
ij_java_align_consecutive_assignments = false
|
||||||
ij_java_align_consecutive_variable_declarations = false
|
ij_java_align_consecutive_variable_declarations = false
|
||||||
ij_java_align_group_field_declarations = false
|
ij_java_align_group_field_declarations = false
|
||||||
ij_java_align_multiline_annotation_parameters = false
|
ij_java_align_multiline_annotation_parameters = true
|
||||||
ij_java_align_multiline_array_initializer_expression = false
|
ij_java_align_multiline_array_initializer_expression = true
|
||||||
ij_java_align_multiline_assignment = false
|
ij_java_align_multiline_assignment = true
|
||||||
ij_java_align_multiline_binary_operation = false
|
ij_java_align_multiline_binary_operation = true
|
||||||
ij_java_align_multiline_chained_methods = false
|
ij_java_align_multiline_chained_methods = true
|
||||||
ij_java_align_multiline_extends_list = false
|
ij_java_align_multiline_extends_list = true
|
||||||
ij_java_align_multiline_for = true
|
ij_java_align_multiline_for = true
|
||||||
ij_java_align_multiline_method_parentheses = false
|
ij_java_align_multiline_method_parentheses = true
|
||||||
ij_java_align_multiline_parameters = true
|
ij_java_align_multiline_parameters = true
|
||||||
ij_java_align_multiline_parameters_in_calls = false
|
ij_java_align_multiline_parameters_in_calls = true
|
||||||
ij_java_align_multiline_parenthesized_expression = false
|
ij_java_align_multiline_parenthesized_expression = true
|
||||||
ij_java_align_multiline_records = true
|
ij_java_align_multiline_records = true
|
||||||
ij_java_align_multiline_resources = true
|
ij_java_align_multiline_resources = true
|
||||||
ij_java_align_multiline_ternary_operation = false
|
ij_java_align_multiline_ternary_operation = true
|
||||||
ij_java_align_multiline_text_blocks = false
|
ij_java_align_multiline_text_blocks = true
|
||||||
ij_java_align_multiline_throws_list = false
|
ij_java_align_multiline_throws_list = true
|
||||||
ij_java_align_subsequent_simple_methods = false
|
ij_java_align_subsequent_simple_methods = true
|
||||||
ij_java_align_throws_keyword = false
|
ij_java_align_throws_keyword = true
|
||||||
ij_java_annotation_parameter_wrap = off
|
ij_java_annotation_parameter_wrap = on_every_item
|
||||||
ij_java_array_initializer_new_line_after_left_brace = false
|
ij_java_array_initializer_new_line_after_left_brace = true
|
||||||
ij_java_array_initializer_right_brace_on_new_line = false
|
ij_java_array_initializer_right_brace_on_new_line = true
|
||||||
ij_java_array_initializer_wrap = off
|
ij_java_array_initializer_wrap = normal
|
||||||
ij_java_assert_statement_colon_on_next_line = false
|
ij_java_assert_statement_colon_on_next_line = true
|
||||||
ij_java_assert_statement_wrap = off
|
ij_java_assert_statement_wrap = on_every_item
|
||||||
ij_java_assignment_wrap = off
|
ij_java_assignment_wrap = normal
|
||||||
ij_java_binary_operation_sign_on_next_line = false
|
ij_java_binary_operation_sign_on_next_line = false
|
||||||
ij_java_binary_operation_wrap = off
|
ij_java_binary_operation_wrap = normal
|
||||||
ij_java_blank_lines_after_anonymous_class_header = 0
|
ij_java_blank_lines_after_anonymous_class_header = 0
|
||||||
ij_java_blank_lines_after_class_header = 0
|
ij_java_blank_lines_after_class_header = 0
|
||||||
ij_java_blank_lines_after_imports = 1
|
ij_java_blank_lines_after_imports = 2
|
||||||
ij_java_blank_lines_after_package = 1
|
ij_java_blank_lines_after_package = 1
|
||||||
ij_java_blank_lines_around_class = 1
|
ij_java_blank_lines_around_class = 2
|
||||||
ij_java_blank_lines_around_field = 0
|
ij_java_blank_lines_around_field = 0
|
||||||
ij_java_blank_lines_around_field_in_interface = 0
|
ij_java_blank_lines_around_field_in_interface = 0
|
||||||
ij_java_blank_lines_around_initializer = 1
|
ij_java_blank_lines_around_initializer = 0
|
||||||
ij_java_blank_lines_around_method = 1
|
ij_java_blank_lines_around_method = 1
|
||||||
ij_java_blank_lines_around_method_in_interface = 1
|
ij_java_blank_lines_around_method_in_interface = 1
|
||||||
ij_java_blank_lines_before_class_end = 0
|
ij_java_blank_lines_before_class_end = 0
|
||||||
ij_java_blank_lines_before_imports = 1
|
ij_java_blank_lines_before_imports = 1
|
||||||
ij_java_blank_lines_before_method_body = 0
|
ij_java_blank_lines_before_method_body = 0
|
||||||
ij_java_blank_lines_before_package = 0
|
ij_java_blank_lines_before_package = 1
|
||||||
ij_java_block_brace_style = end_of_line
|
ij_java_block_brace_style = end_of_line
|
||||||
ij_java_block_comment_at_first_column = true
|
ij_java_block_comment_at_first_column = true
|
||||||
|
ij_java_builder_methods = none
|
||||||
ij_java_call_parameters_new_line_after_left_paren = false
|
ij_java_call_parameters_new_line_after_left_paren = false
|
||||||
ij_java_call_parameters_right_paren_on_new_line = false
|
ij_java_call_parameters_right_paren_on_new_line = false
|
||||||
ij_java_call_parameters_wrap = off
|
ij_java_call_parameters_wrap = normal
|
||||||
ij_java_case_statement_on_separate_line = true
|
ij_java_case_statement_on_separate_line = true
|
||||||
ij_java_catch_on_new_line = false
|
ij_java_catch_on_new_line = false
|
||||||
ij_java_class_annotation_wrap = split_into_lines
|
ij_java_class_annotation_wrap = split_into_lines
|
||||||
ij_java_class_brace_style = end_of_line
|
ij_java_class_brace_style = end_of_line
|
||||||
ij_java_class_count_to_use_import_on_demand = 30
|
ij_java_class_count_to_use_import_on_demand = 200
|
||||||
ij_java_class_names_in_javadoc = 1
|
ij_java_class_names_in_javadoc = 3
|
||||||
ij_java_do_not_indent_top_level_class_members = false
|
ij_java_do_not_indent_top_level_class_members = false
|
||||||
ij_java_do_not_wrap_after_single_annotation = false
|
ij_java_do_not_wrap_after_single_annotation = false
|
||||||
ij_java_do_while_brace_force = never
|
ij_java_do_while_brace_force = never
|
||||||
ij_java_doc_add_blank_line_after_description = true
|
ij_java_doc_add_blank_line_after_description = true
|
||||||
ij_java_doc_add_blank_line_after_param_comments = false
|
ij_java_doc_add_blank_line_after_param_comments = true
|
||||||
ij_java_doc_add_blank_line_after_return = false
|
ij_java_doc_add_blank_line_after_return = true
|
||||||
ij_java_doc_add_p_tag_on_empty_lines = true
|
ij_java_doc_add_p_tag_on_empty_lines = true
|
||||||
ij_java_doc_align_exception_comments = true
|
ij_java_doc_align_exception_comments = true
|
||||||
ij_java_doc_align_param_comments = true
|
ij_java_doc_align_param_comments = true
|
||||||
ij_java_doc_do_not_wrap_if_one_line = false
|
ij_java_doc_do_not_wrap_if_one_line = false
|
||||||
ij_java_doc_enable_formatting = true
|
ij_java_doc_enable_formatting = true
|
||||||
ij_java_doc_enable_leading_asterisks = true
|
ij_java_doc_enable_leading_asterisks = true
|
||||||
ij_java_doc_indent_on_continuation = false
|
ij_java_doc_indent_on_continuation = true
|
||||||
ij_java_doc_keep_empty_lines = true
|
ij_java_doc_keep_empty_lines = true
|
||||||
ij_java_doc_keep_empty_parameter_tag = true
|
ij_java_doc_keep_empty_parameter_tag = true
|
||||||
ij_java_doc_keep_empty_return_tag = true
|
ij_java_doc_keep_empty_return_tag = true
|
||||||
ij_java_doc_keep_empty_throws_tag = true
|
ij_java_doc_keep_empty_throws_tag = true
|
||||||
ij_java_doc_keep_invalid_tags = true
|
ij_java_doc_keep_invalid_tags = true
|
||||||
ij_java_doc_param_description_on_new_line = false
|
ij_java_doc_param_description_on_new_line = false
|
||||||
ij_java_doc_preserve_line_breaks = false
|
ij_java_doc_preserve_line_breaks = true
|
||||||
ij_java_doc_use_throws_not_exception_tag = true
|
ij_java_doc_use_throws_not_exception_tag = true
|
||||||
ij_java_else_on_new_line = false
|
ij_java_else_on_new_line = false
|
||||||
ij_java_enum_constants_wrap = off
|
ij_java_entity_dd_suffix = EJB
|
||||||
ij_java_extends_keyword_wrap = off
|
ij_java_entity_eb_suffix = Bean
|
||||||
ij_java_extends_list_wrap = off
|
ij_java_entity_hi_suffix = Home
|
||||||
|
ij_java_entity_lhi_prefix = Local
|
||||||
|
ij_java_entity_lhi_suffix = Home
|
||||||
|
ij_java_entity_li_prefix = Local
|
||||||
|
ij_java_entity_pk_class = java.lang.String
|
||||||
|
ij_java_entity_vo_suffix = VO
|
||||||
|
ij_java_enum_constants_wrap = split_into_lines
|
||||||
|
ij_java_extends_keyword_wrap = normal
|
||||||
|
ij_java_extends_list_wrap = on_every_item
|
||||||
ij_java_field_annotation_wrap = split_into_lines
|
ij_java_field_annotation_wrap = split_into_lines
|
||||||
ij_java_finally_on_new_line = false
|
ij_java_finally_on_new_line = false
|
||||||
ij_java_for_brace_force = never
|
ij_java_for_brace_force = never
|
||||||
ij_java_for_statement_new_line_after_left_paren = false
|
ij_java_for_statement_new_line_after_left_paren = false
|
||||||
ij_java_for_statement_right_paren_on_new_line = false
|
ij_java_for_statement_right_paren_on_new_line = false
|
||||||
ij_java_for_statement_wrap = off
|
ij_java_for_statement_wrap = on_every_item
|
||||||
ij_java_generate_final_locals = false
|
ij_java_generate_final_locals = false
|
||||||
ij_java_generate_final_parameters = false
|
ij_java_generate_final_parameters = false
|
||||||
ij_java_if_brace_force = never
|
ij_java_if_brace_force = never
|
||||||
ij_java_imports_layout = *,|,javax.**,java.**,|,$*
|
ij_java_imports_layout = *, |, javax.**, java.**, |, com.dfsek.terra.**, |, $org.junit.jupiter.api.Assertions.**, |, $*
|
||||||
ij_java_indent_case_from_switch = true
|
ij_java_indent_case_from_switch = true
|
||||||
ij_java_insert_inner_class_imports = false
|
ij_java_insert_inner_class_imports = true
|
||||||
ij_java_insert_override_annotation = true
|
ij_java_insert_override_annotation = true
|
||||||
ij_java_keep_blank_lines_before_right_brace = 2
|
ij_java_keep_blank_lines_before_right_brace = 2
|
||||||
ij_java_keep_blank_lines_between_package_declaration_and_header = 2
|
ij_java_keep_blank_lines_between_package_declaration_and_header = 1
|
||||||
ij_java_keep_blank_lines_in_code = 2
|
ij_java_keep_blank_lines_in_code = 2
|
||||||
ij_java_keep_blank_lines_in_declarations = 2
|
ij_java_keep_blank_lines_in_declarations = 2
|
||||||
|
ij_java_keep_builder_methods_indents = true
|
||||||
ij_java_keep_control_statement_in_one_line = true
|
ij_java_keep_control_statement_in_one_line = true
|
||||||
ij_java_keep_first_column_comment = true
|
ij_java_keep_first_column_comment = false
|
||||||
ij_java_keep_indents_on_empty_lines = false
|
ij_java_keep_indents_on_empty_lines = true
|
||||||
ij_java_keep_line_breaks = true
|
ij_java_keep_line_breaks = true
|
||||||
ij_java_keep_multiple_expressions_in_one_line = false
|
ij_java_keep_multiple_expressions_in_one_line = false
|
||||||
ij_java_keep_simple_blocks_in_one_line = false
|
ij_java_keep_simple_blocks_in_one_line = true
|
||||||
ij_java_keep_simple_classes_in_one_line = false
|
ij_java_keep_simple_classes_in_one_line = false
|
||||||
ij_java_keep_simple_lambdas_in_one_line = false
|
ij_java_keep_simple_lambdas_in_one_line = true
|
||||||
ij_java_keep_simple_methods_in_one_line = false
|
ij_java_keep_simple_methods_in_one_line = true
|
||||||
ij_java_label_indent_absolute = false
|
ij_java_label_indent_absolute = false
|
||||||
ij_java_label_indent_size = 0
|
ij_java_label_indent_size = 0
|
||||||
ij_java_lambda_brace_style = end_of_line
|
ij_java_lambda_brace_style = end_of_line
|
||||||
ij_java_layout_static_imports_separately = true
|
ij_java_layout_static_imports_separately = true
|
||||||
ij_java_line_comment_add_space = false
|
ij_java_line_comment_add_space = false
|
||||||
ij_java_line_comment_at_first_column = true
|
ij_java_line_comment_at_first_column = true
|
||||||
|
ij_java_message_dd_suffix = EJB
|
||||||
|
ij_java_message_eb_suffix = Bean
|
||||||
ij_java_method_annotation_wrap = split_into_lines
|
ij_java_method_annotation_wrap = split_into_lines
|
||||||
ij_java_method_brace_style = end_of_line
|
ij_java_method_brace_style = end_of_line
|
||||||
ij_java_method_call_chain_wrap = off
|
ij_java_method_call_chain_wrap = on_every_item
|
||||||
ij_java_method_parameters_new_line_after_left_paren = false
|
ij_java_method_parameters_new_line_after_left_paren = false
|
||||||
ij_java_method_parameters_right_paren_on_new_line = false
|
ij_java_method_parameters_right_paren_on_new_line = false
|
||||||
ij_java_method_parameters_wrap = off
|
ij_java_method_parameters_wrap = normal
|
||||||
ij_java_modifier_list_wrap = false
|
ij_java_modifier_list_wrap = false
|
||||||
ij_java_names_count_to_use_import_on_demand = 3
|
ij_java_names_count_to_use_import_on_demand = 50
|
||||||
ij_java_new_line_after_lparen_in_record_header = false
|
ij_java_new_line_after_lparen_in_record_header = false
|
||||||
ij_java_packages_to_use_import_on_demand = java.awt.*,javax.swing.*
|
ij_java_packages_to_use_import_on_demand = $org.junit.jupiter.api.Assertions.*
|
||||||
ij_java_parameter_annotation_wrap = off
|
ij_java_parameter_annotation_wrap = on_every_item
|
||||||
ij_java_parentheses_expression_new_line_after_left_paren = false
|
ij_java_parentheses_expression_new_line_after_left_paren = false
|
||||||
ij_java_parentheses_expression_right_paren_on_new_line = false
|
ij_java_parentheses_expression_right_paren_on_new_line = false
|
||||||
ij_java_place_assignment_sign_on_next_line = false
|
ij_java_place_assignment_sign_on_next_line = false
|
||||||
ij_java_prefer_longer_names = true
|
ij_java_prefer_longer_names = true
|
||||||
ij_java_prefer_parameters_wrap = false
|
ij_java_prefer_parameters_wrap = true
|
||||||
ij_java_record_components_wrap = normal
|
ij_java_record_components_wrap = normal
|
||||||
ij_java_repeat_synchronized = true
|
ij_java_repeat_synchronized = true
|
||||||
ij_java_replace_instanceof_and_cast = false
|
ij_java_replace_instanceof_and_cast = false
|
||||||
@ -151,8 +165,15 @@ ij_java_replace_null_check = true
|
|||||||
ij_java_replace_sum_lambda_with_method_ref = true
|
ij_java_replace_sum_lambda_with_method_ref = true
|
||||||
ij_java_resource_list_new_line_after_left_paren = false
|
ij_java_resource_list_new_line_after_left_paren = false
|
||||||
ij_java_resource_list_right_paren_on_new_line = false
|
ij_java_resource_list_right_paren_on_new_line = false
|
||||||
ij_java_resource_list_wrap = off
|
ij_java_resource_list_wrap = on_every_item
|
||||||
ij_java_rparen_on_new_line_in_record_header = false
|
ij_java_rparen_on_new_line_in_record_header = false
|
||||||
|
ij_java_session_dd_suffix = EJB
|
||||||
|
ij_java_session_eb_suffix = Bean
|
||||||
|
ij_java_session_hi_suffix = Home
|
||||||
|
ij_java_session_lhi_prefix = Local
|
||||||
|
ij_java_session_lhi_suffix = Home
|
||||||
|
ij_java_session_li_prefix = Local
|
||||||
|
ij_java_session_si_suffix = Service
|
||||||
ij_java_space_after_closing_angle_bracket_in_type_argument = false
|
ij_java_space_after_closing_angle_bracket_in_type_argument = false
|
||||||
ij_java_space_after_colon = true
|
ij_java_space_after_colon = true
|
||||||
ij_java_space_after_comma = true
|
ij_java_space_after_comma = true
|
||||||
@ -162,7 +183,7 @@ ij_java_space_after_quest = true
|
|||||||
ij_java_space_after_type_cast = true
|
ij_java_space_after_type_cast = true
|
||||||
ij_java_space_before_annotation_array_initializer_left_brace = false
|
ij_java_space_before_annotation_array_initializer_left_brace = false
|
||||||
ij_java_space_before_annotation_parameter_list = false
|
ij_java_space_before_annotation_parameter_list = false
|
||||||
ij_java_space_before_array_initializer_left_brace = true
|
ij_java_space_before_array_initializer_left_brace = false
|
||||||
ij_java_space_before_catch_keyword = true
|
ij_java_space_before_catch_keyword = true
|
||||||
ij_java_space_before_catch_left_brace = true
|
ij_java_space_before_catch_left_brace = true
|
||||||
ij_java_space_before_catch_parentheses = false
|
ij_java_space_before_catch_parentheses = false
|
||||||
@ -196,7 +217,7 @@ ij_java_space_before_while_keyword = true
|
|||||||
ij_java_space_before_while_left_brace = true
|
ij_java_space_before_while_left_brace = true
|
||||||
ij_java_space_before_while_parentheses = false
|
ij_java_space_before_while_parentheses = false
|
||||||
ij_java_space_inside_one_line_enum_braces = false
|
ij_java_space_inside_one_line_enum_braces = false
|
||||||
ij_java_space_within_empty_array_initializer_braces = false
|
ij_java_space_within_empty_array_initializer_braces = true
|
||||||
ij_java_space_within_empty_method_call_parentheses = false
|
ij_java_space_within_empty_method_call_parentheses = false
|
||||||
ij_java_space_within_empty_method_parentheses = false
|
ij_java_space_within_empty_method_parentheses = false
|
||||||
ij_java_spaces_around_additive_operators = true
|
ij_java_spaces_around_additive_operators = true
|
||||||
@ -213,8 +234,8 @@ ij_java_spaces_around_type_bounds_in_type_parameters = true
|
|||||||
ij_java_spaces_around_unary_operator = false
|
ij_java_spaces_around_unary_operator = false
|
||||||
ij_java_spaces_within_angle_brackets = false
|
ij_java_spaces_within_angle_brackets = false
|
||||||
ij_java_spaces_within_annotation_parentheses = false
|
ij_java_spaces_within_annotation_parentheses = false
|
||||||
ij_java_spaces_within_array_initializer_braces = false
|
ij_java_spaces_within_array_initializer_braces = true
|
||||||
ij_java_spaces_within_braces = false
|
ij_java_spaces_within_braces = true
|
||||||
ij_java_spaces_within_brackets = false
|
ij_java_spaces_within_brackets = false
|
||||||
ij_java_spaces_within_cast_parentheses = false
|
ij_java_spaces_within_cast_parentheses = false
|
||||||
ij_java_spaces_within_catch_parentheses = false
|
ij_java_spaces_within_catch_parentheses = false
|
||||||
@ -223,80 +244,276 @@ ij_java_spaces_within_if_parentheses = false
|
|||||||
ij_java_spaces_within_method_call_parentheses = false
|
ij_java_spaces_within_method_call_parentheses = false
|
||||||
ij_java_spaces_within_method_parentheses = false
|
ij_java_spaces_within_method_parentheses = false
|
||||||
ij_java_spaces_within_parentheses = false
|
ij_java_spaces_within_parentheses = false
|
||||||
|
ij_java_spaces_within_record_header = false
|
||||||
ij_java_spaces_within_switch_parentheses = false
|
ij_java_spaces_within_switch_parentheses = false
|
||||||
ij_java_spaces_within_synchronized_parentheses = false
|
ij_java_spaces_within_synchronized_parentheses = false
|
||||||
ij_java_spaces_within_try_parentheses = false
|
ij_java_spaces_within_try_parentheses = false
|
||||||
ij_java_spaces_within_while_parentheses = false
|
ij_java_spaces_within_while_parentheses = false
|
||||||
ij_java_special_else_if_treatment = true
|
ij_java_special_else_if_treatment = true
|
||||||
ij_java_subclass_name_suffix = Impl
|
ij_java_subclass_name_suffix = Impl
|
||||||
ij_java_ternary_operation_signs_on_next_line = false
|
ij_java_ternary_operation_signs_on_next_line = true
|
||||||
ij_java_ternary_operation_wrap = off
|
ij_java_ternary_operation_wrap = on_every_item
|
||||||
ij_java_test_name_suffix = Test
|
ij_java_test_name_suffix = Test
|
||||||
ij_java_throws_keyword_wrap = off
|
ij_java_throws_keyword_wrap = normal
|
||||||
ij_java_throws_list_wrap = off
|
ij_java_throws_list_wrap = normal
|
||||||
ij_java_use_external_annotations = false
|
ij_java_use_external_annotations = false
|
||||||
ij_java_use_fq_class_names = false
|
ij_java_use_fq_class_names = false
|
||||||
ij_java_use_relative_indents = false
|
ij_java_use_relative_indents = false
|
||||||
ij_java_use_single_class_imports = true
|
ij_java_use_single_class_imports = true
|
||||||
ij_java_variable_annotation_wrap = off
|
ij_java_variable_annotation_wrap = on_every_item
|
||||||
ij_java_visibility = public
|
ij_java_visibility = public
|
||||||
ij_java_while_brace_force = never
|
ij_java_while_brace_force = never
|
||||||
ij_java_while_on_new_line = false
|
ij_java_while_on_new_line = false
|
||||||
ij_java_wrap_comments = false
|
ij_java_wrap_comments = true
|
||||||
ij_java_wrap_first_method_in_call_chain = false
|
ij_java_wrap_first_method_in_call_chain = false
|
||||||
ij_java_wrap_long_lines = false
|
ij_java_wrap_long_lines = true
|
||||||
|
|
||||||
[{*.gradle.kts,*.kt,*.kts,*.main.kts}]
|
[.editorconfig]
|
||||||
ij_kotlin_align_in_columns_case_branch = false
|
ij_visual_guides = none
|
||||||
|
ij_editorconfig_align_group_field_declarations = false
|
||||||
|
ij_editorconfig_space_after_colon = false
|
||||||
|
ij_editorconfig_space_after_comma = true
|
||||||
|
ij_editorconfig_space_before_colon = false
|
||||||
|
ij_editorconfig_space_before_comma = false
|
||||||
|
ij_editorconfig_spaces_around_assignment_operators = true
|
||||||
|
|
||||||
|
[{*.gant, *.gradle, *.groovy, *.gson, *.gy}]
|
||||||
|
ij_visual_guides = none
|
||||||
|
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
|
||||||
|
|
||||||
|
[{*.gql, *.graphql, *.graphqls}]
|
||||||
|
ij_visual_guides = none
|
||||||
|
|
||||||
|
[{*.kt, *.kts}]
|
||||||
|
ij_visual_guides = none
|
||||||
|
ij_kotlin_align_in_columns_case_branch = true
|
||||||
ij_kotlin_align_multiline_binary_operation = false
|
ij_kotlin_align_multiline_binary_operation = false
|
||||||
ij_kotlin_align_multiline_extends_list = false
|
ij_kotlin_align_multiline_extends_list = true
|
||||||
ij_kotlin_align_multiline_method_parentheses = false
|
ij_kotlin_align_multiline_method_parentheses = true
|
||||||
ij_kotlin_align_multiline_parameters = true
|
ij_kotlin_align_multiline_parameters = true
|
||||||
ij_kotlin_align_multiline_parameters_in_calls = false
|
ij_kotlin_align_multiline_parameters_in_calls = true
|
||||||
ij_kotlin_allow_trailing_comma = false
|
ij_kotlin_allow_trailing_comma = false
|
||||||
ij_kotlin_allow_trailing_comma_on_call_site = false
|
ij_kotlin_allow_trailing_comma_on_call_site = false
|
||||||
ij_kotlin_assignment_wrap = off
|
ij_kotlin_assignment_wrap = normal
|
||||||
ij_kotlin_blank_lines_after_class_header = 0
|
ij_kotlin_blank_lines_after_class_header = 0
|
||||||
ij_kotlin_blank_lines_around_block_when_branches = 0
|
ij_kotlin_blank_lines_around_block_when_branches = 1
|
||||||
ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1
|
ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1
|
||||||
ij_kotlin_block_comment_at_first_column = true
|
ij_kotlin_block_comment_at_first_column = true
|
||||||
ij_kotlin_call_parameters_new_line_after_left_paren = false
|
ij_kotlin_call_parameters_new_line_after_left_paren = true
|
||||||
ij_kotlin_call_parameters_right_paren_on_new_line = false
|
ij_kotlin_call_parameters_right_paren_on_new_line = true
|
||||||
ij_kotlin_call_parameters_wrap = off
|
ij_kotlin_call_parameters_wrap = on_every_item
|
||||||
ij_kotlin_catch_on_new_line = false
|
ij_kotlin_catch_on_new_line = false
|
||||||
ij_kotlin_class_annotation_wrap = split_into_lines
|
ij_kotlin_class_annotation_wrap = split_into_lines
|
||||||
ij_kotlin_continuation_indent_for_chained_calls = true
|
ij_kotlin_continuation_indent_for_chained_calls = false
|
||||||
ij_kotlin_continuation_indent_for_expression_bodies = true
|
ij_kotlin_continuation_indent_for_expression_bodies = false
|
||||||
ij_kotlin_continuation_indent_in_argument_lists = true
|
ij_kotlin_continuation_indent_in_argument_lists = false
|
||||||
ij_kotlin_continuation_indent_in_elvis = true
|
ij_kotlin_continuation_indent_in_elvis = false
|
||||||
ij_kotlin_continuation_indent_in_if_conditions = true
|
ij_kotlin_continuation_indent_in_if_conditions = false
|
||||||
ij_kotlin_continuation_indent_in_parameter_lists = true
|
ij_kotlin_continuation_indent_in_parameter_lists = false
|
||||||
ij_kotlin_continuation_indent_in_supertype_lists = true
|
ij_kotlin_continuation_indent_in_supertype_lists = false
|
||||||
ij_kotlin_else_on_new_line = false
|
ij_kotlin_else_on_new_line = false
|
||||||
ij_kotlin_enum_constants_wrap = off
|
ij_kotlin_enum_constants_wrap = on_every_item
|
||||||
ij_kotlin_extends_list_wrap = off
|
ij_kotlin_extends_list_wrap = normal
|
||||||
ij_kotlin_field_annotation_wrap = split_into_lines
|
ij_kotlin_field_annotation_wrap = on_every_item
|
||||||
ij_kotlin_finally_on_new_line = false
|
ij_kotlin_finally_on_new_line = false
|
||||||
ij_kotlin_if_rparen_on_new_line = false
|
ij_kotlin_if_rparen_on_new_line = true
|
||||||
ij_kotlin_import_nested_classes = false
|
ij_kotlin_import_nested_classes = false
|
||||||
|
ij_kotlin_imports_layout = *, java.*, javax.*, kotlin.**
|
||||||
ij_kotlin_insert_whitespaces_in_simple_one_line_method = true
|
ij_kotlin_insert_whitespaces_in_simple_one_line_method = true
|
||||||
ij_kotlin_keep_blank_lines_before_right_brace = 2
|
ij_kotlin_keep_blank_lines_before_right_brace = 1
|
||||||
ij_kotlin_keep_blank_lines_in_code = 2
|
ij_kotlin_keep_blank_lines_in_code = 2
|
||||||
ij_kotlin_keep_blank_lines_in_declarations = 2
|
ij_kotlin_keep_blank_lines_in_declarations = 2
|
||||||
ij_kotlin_keep_first_column_comment = true
|
ij_kotlin_keep_first_column_comment = true
|
||||||
ij_kotlin_keep_indents_on_empty_lines = false
|
ij_kotlin_keep_indents_on_empty_lines = true
|
||||||
ij_kotlin_keep_line_breaks = true
|
ij_kotlin_keep_line_breaks = true
|
||||||
ij_kotlin_lbrace_on_next_line = false
|
ij_kotlin_lbrace_on_next_line = false
|
||||||
ij_kotlin_line_comment_add_space = false
|
ij_kotlin_line_comment_add_space = false
|
||||||
ij_kotlin_line_comment_at_first_column = true
|
ij_kotlin_line_comment_at_first_column = true
|
||||||
ij_kotlin_method_annotation_wrap = split_into_lines
|
ij_kotlin_method_annotation_wrap = on_every_item
|
||||||
ij_kotlin_method_call_chain_wrap = off
|
ij_kotlin_method_call_chain_wrap = normal
|
||||||
ij_kotlin_method_parameters_new_line_after_left_paren = false
|
ij_kotlin_method_parameters_new_line_after_left_paren = true
|
||||||
ij_kotlin_method_parameters_right_paren_on_new_line = false
|
ij_kotlin_method_parameters_right_paren_on_new_line = true
|
||||||
ij_kotlin_method_parameters_wrap = off
|
ij_kotlin_method_parameters_wrap = on_every_item
|
||||||
ij_kotlin_name_count_to_use_star_import = 5
|
ij_kotlin_name_count_to_use_star_import = 2147483647
|
||||||
ij_kotlin_name_count_to_use_star_import_for_members = 3
|
ij_kotlin_name_count_to_use_star_import_for_members = 2147483647
|
||||||
ij_kotlin_parameter_annotation_wrap = off
|
ij_kotlin_packages_to_use_import_on_demand = java.util.*, kotlinx.android.synthetic.*, io.ktor.*
|
||||||
|
ij_kotlin_parameter_annotation_wrap = on_every_item
|
||||||
ij_kotlin_space_after_comma = true
|
ij_kotlin_space_after_comma = true
|
||||||
ij_kotlin_space_after_extend_colon = true
|
ij_kotlin_space_after_extend_colon = true
|
||||||
ij_kotlin_space_after_type_colon = true
|
ij_kotlin_space_after_type_colon = true
|
||||||
@ -315,33 +532,63 @@ ij_kotlin_spaces_around_equality_operators = true
|
|||||||
ij_kotlin_spaces_around_function_type_arrow = true
|
ij_kotlin_spaces_around_function_type_arrow = true
|
||||||
ij_kotlin_spaces_around_logical_operators = true
|
ij_kotlin_spaces_around_logical_operators = true
|
||||||
ij_kotlin_spaces_around_multiplicative_operators = true
|
ij_kotlin_spaces_around_multiplicative_operators = true
|
||||||
ij_kotlin_spaces_around_range = false
|
ij_kotlin_spaces_around_range = true
|
||||||
ij_kotlin_spaces_around_relational_operators = true
|
ij_kotlin_spaces_around_relational_operators = true
|
||||||
ij_kotlin_spaces_around_unary_operator = false
|
ij_kotlin_spaces_around_unary_operator = false
|
||||||
ij_kotlin_spaces_around_when_arrow = true
|
ij_kotlin_spaces_around_when_arrow = true
|
||||||
ij_kotlin_variable_annotation_wrap = off
|
ij_kotlin_variable_annotation_wrap = on_every_item
|
||||||
ij_kotlin_while_on_new_line = false
|
ij_kotlin_while_on_new_line = false
|
||||||
ij_kotlin_wrap_elvis_expressions = 1
|
ij_kotlin_wrap_elvis_expressions = 1
|
||||||
ij_kotlin_wrap_expression_body_functions = 0
|
ij_kotlin_wrap_expression_body_functions = 1
|
||||||
ij_kotlin_wrap_first_method_in_call_chain = false
|
ij_kotlin_wrap_first_method_in_call_chain = false
|
||||||
|
|
||||||
[{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.stylelintrc,bowerrc,jest.config}]
|
[{*.graphqlconfig, *.har, *.jsb2, *.jsb3, *.json, .babelrc, .eslintrc, .stylelintrc, bowerrc, jest.config, mcmod.info, pack.mcmeta}]
|
||||||
indent_size = 2
|
ij_visual_guides = none
|
||||||
ij_json_keep_blank_lines_in_code = 0
|
ij_json_keep_blank_lines_in_code = 1
|
||||||
ij_json_keep_indents_on_empty_lines = false
|
ij_json_keep_indents_on_empty_lines = false
|
||||||
ij_json_keep_line_breaks = true
|
ij_json_keep_line_breaks = true
|
||||||
ij_json_space_after_colon = true
|
ij_json_space_after_colon = true
|
||||||
ij_json_space_after_comma = true
|
ij_json_space_after_comma = true
|
||||||
ij_json_space_before_colon = true
|
ij_json_space_before_colon = true
|
||||||
ij_json_space_before_comma = false
|
ij_json_space_before_comma = false
|
||||||
ij_json_spaces_within_braces = false
|
ij_json_spaces_within_braces = true
|
||||||
ij_json_spaces_within_brackets = false
|
ij_json_spaces_within_brackets = true
|
||||||
ij_json_wrap_long_lines = false
|
ij_json_wrap_long_lines = false
|
||||||
|
|
||||||
[{*.yaml,*.yml}]
|
[{*.markdown, *.md}]
|
||||||
|
max_line_length = 80
|
||||||
|
ij_visual_guides = 80
|
||||||
|
ij_markdown_force_one_space_after_blockquote_symbol = true
|
||||||
|
ij_markdown_force_one_space_after_header_symbol = true
|
||||||
|
ij_markdown_force_one_space_after_list_bullet = true
|
||||||
|
ij_markdown_force_one_space_between_words = true
|
||||||
|
ij_markdown_keep_indents_on_empty_lines = false
|
||||||
|
ij_markdown_max_lines_around_block_elements = 1
|
||||||
|
ij_markdown_max_lines_around_header = 1
|
||||||
|
ij_markdown_max_lines_between_paragraphs = 1
|
||||||
|
ij_markdown_min_lines_around_block_elements = 1
|
||||||
|
ij_markdown_min_lines_around_header = 1
|
||||||
|
ij_markdown_min_lines_between_paragraphs = 1
|
||||||
|
|
||||||
|
[{*.properties, spring.handlers, spring.schemas}]
|
||||||
|
ij_visual_guides = none
|
||||||
|
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
|
||||||
|
|
||||||
|
[{*.yaml, *.yml}]
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
ij_visual_guides = none
|
||||||
|
ij_yaml_align_values_properties = do_not_align
|
||||||
|
ij_yaml_autoinsert_sequence_marker = true
|
||||||
|
ij_yaml_block_mapping_on_new_line = false
|
||||||
|
ij_yaml_indent_sequence_value = true
|
||||||
ij_yaml_keep_indents_on_empty_lines = true
|
ij_yaml_keep_indents_on_empty_lines = true
|
||||||
ij_yaml_keep_line_breaks = true
|
ij_yaml_keep_line_breaks = true
|
||||||
|
ij_yaml_sequence_on_new_line = false
|
||||||
ij_yaml_space_before_colon = false
|
ij_yaml_space_before_colon = false
|
||||||
ij_yaml_spaces_within_braces = true
|
ij_yaml_spaces_within_braces = true
|
||||||
ij_yaml_spaces_within_brackets = true
|
ij_yaml_spaces_within_brackets = true
|
||||||
|
|
||||||
|
|
||||||
|
9
.github/ISSUE_TEMPLATE/BUG_REPORT.md
vendored
9
.github/ISSUE_TEMPLATE/BUG_REPORT.md
vendored
@ -37,9 +37,12 @@ assignees: ""
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
- [ ] I have checked that I am on the latest version of Terra.
|
- [ ] I have checked that I am on the latest version of Terra.
|
||||||
- [ ] I have searched the github issue tracker for similar issues, including closed ones.
|
- [ ] I have searched the github issue tracker for similar issues, including
|
||||||
- [ ] I have made sure that this is not a bug with another mod or plugin, and it is Terra that is causing the issue.
|
closed ones.
|
||||||
- [ ] I have checked that this is an issue with Terra and not an issue with the pack I am using.
|
- [ ] I have made sure that this is not a bug with another mod or plugin, and it
|
||||||
|
is Terra that is causing the issue.
|
||||||
|
- [ ] I have checked that this is an issue with Terra and not an issue with the
|
||||||
|
pack I am using.
|
||||||
<!-- If this is an issue with the default Terra pack, please open an issue on the pack repo: https://github.com/PolyhedralDev/TerraDefaultConfig/issues/new -->
|
<!-- If this is an issue with the default Terra pack, please open an issue on the pack repo: https://github.com/PolyhedralDev/TerraDefaultConfig/issues/new -->
|
||||||
- [ ] I have attached a copy of the `latest.log` file
|
- [ ] I have attached a copy of the `latest.log` file
|
||||||
- [ ] I have filled out and provided all the appropriate information.
|
- [ ] I have filled out and provided all the appropriate information.
|
||||||
|
6
.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md
vendored
6
.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md
vendored
@ -31,9 +31,11 @@ assignees: ""
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
- [ ] I have checked that I am on the latest version of Terra.
|
- [ ] I have checked that I am on the latest version of Terra.
|
||||||
- [ ] I have searched github for similar features requests, including closed ones, and found none.
|
- [ ] I have searched github for similar features requests, including closed
|
||||||
|
ones, and found none.
|
||||||
- [ ] I believe this is within the scope of Terra.
|
- [ ] I believe this is within the scope of Terra.
|
||||||
- [ ] This feature request is for *all* of Terra, and isn't something that should be implemented by a pack or addon.
|
- [ ] This feature request is for *all* of Terra, and isn't something that
|
||||||
|
should be implemented by a pack or addon.
|
||||||
|
|
||||||
## Feature Description
|
## Feature Description
|
||||||
|
|
||||||
|
4
.github/ISSUE_TEMPLATE/OTHER_ISSUES.md
vendored
4
.github/ISSUE_TEMPLATE/OTHER_ISSUES.md
vendored
@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: "Other Issue"
|
name: "Other Issue"
|
||||||
about: "Use this template if your issue doesn't accurately fit into any of the other categories."
|
about: "Use this template if your issue doesn't accurately fit into any of the
|
||||||
|
other categories."
|
||||||
title: ""
|
title: ""
|
||||||
labels: "Type: Question, Status: Pending"
|
labels: "Type: Question, Status: Pending"
|
||||||
assignees: ""
|
assignees: ""
|
||||||
@ -8,4 +9,5 @@ assignees: ""
|
|||||||
---
|
---
|
||||||
|
|
||||||
## Describe the issue
|
## Describe the issue
|
||||||
|
|
||||||
<!-- Please describe the issue as clearly and as concisely as possible, without missing any details. -->
|
<!-- Please describe the issue as clearly and as concisely as possible, without missing any details. -->
|
28
.github/PULL_REQUEST_TEMPLATE.md
vendored
28
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -33,9 +33,11 @@
|
|||||||
|
|
||||||
<!-- In order to be accepted, your changes must be under the GPLv3 license. Please check one of the following: -->
|
<!-- In order to be accepted, your changes must be under the GPLv3 license. Please check one of the following: -->
|
||||||
|
|
||||||
- [ ] I am the original author of this code, and I am willing to release it under [GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html).
|
- [ ] I am the original author of this code, and I am willing to release it
|
||||||
- [ ] I am not the original author of this code, but it is in public domain or released
|
under [GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html).
|
||||||
under [GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html) or a compatible license.
|
- [ ] I am not the original author of this code, but it is in public domain or
|
||||||
|
released under [GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html) or a
|
||||||
|
compatible license.
|
||||||
<!--
|
<!--
|
||||||
Please provide reliable evidence of this.
|
Please provide reliable evidence of this.
|
||||||
NOTE: for compatible licenses, you must make sure to add the included license somewhere in the program, if so required.
|
NOTE: for compatible licenses, you must make sure to add the included license somewhere in the program, if so required.
|
||||||
@ -70,19 +72,24 @@
|
|||||||
|
|
||||||
- [ ] Bug Fix <!-- Anything which fixes an issue in Terra. -->
|
- [ ] Bug Fix <!-- Anything which fixes an issue in Terra. -->
|
||||||
- [ ] Build system <!-- Anything which pretain to the build system. -->
|
- [ ] Build system <!-- Anything which pretain to the build system. -->
|
||||||
- [ ] Documentation <!-- Anything which adds or improves documentation for existing features. -->
|
- [ ]
|
||||||
|
Documentation <!-- Anything which adds or improves documentation for existing features. -->
|
||||||
- [ ] New Feature <!-- Anything which adds new functionality to Terra. -->
|
- [ ] New Feature <!-- Anything which adds new functionality to Terra. -->
|
||||||
- [ ] Performance <!-- Anything which is imrpoves the performance of Terra. -->
|
- [ ] Performance <!-- Anything which is imrpoves the performance of Terra. -->
|
||||||
- [ ] Refactoring <!-- Anything which does not add any new code, only moves code around. -->
|
- [ ]
|
||||||
- [ ] Repository <!-- Anything which affects the repository. Eg. changes to the `README.md` file. -->
|
Refactoring <!-- Anything which does not add any new code, only moves code around. -->
|
||||||
|
- [ ]
|
||||||
|
Repository <!-- Anything which affects the repository. Eg. changes to the `README.md` file. -->
|
||||||
- [ ] Revert <!-- Anything which reverts previous commits. -->
|
- [ ] Revert <!-- Anything which reverts previous commits. -->
|
||||||
- [ ] Style <!-- Anything which updates style. -->
|
- [ ] Style <!-- Anything which updates style. -->
|
||||||
- [ ] Tests <!-- Anything which adds or updates tests. -->
|
- [ ] Tests <!-- Anything which adds or updates tests. -->
|
||||||
- [ ] Translation <!-- Anything which is internationalizing the Terra program to other languages. -->
|
- [ ]
|
||||||
|
Translation <!-- Anything which is internationalizing the Terra program to other languages. -->
|
||||||
|
|
||||||
#### Compatiblity
|
#### Compatiblity
|
||||||
|
|
||||||
- [ ] Breaking change <!-- A fix, or a feature, that breaks some previous functionality to Terra. -->
|
- [ ] Breaking
|
||||||
|
change <!-- A fix, or a feature, that breaks some previous functionality to Terra. -->
|
||||||
- [ ] Non-Breaking change.
|
- [ ] Non-Breaking change.
|
||||||
<!--
|
<!--
|
||||||
A change which does not break *any* previous functionality of Terra.
|
A change which does not break *any* previous functionality of Terra.
|
||||||
@ -94,8 +101,9 @@
|
|||||||
|
|
||||||
#### Contribution Guidelines.
|
#### Contribution Guidelines.
|
||||||
|
|
||||||
- [ ] I have read the [`CONTRIBUTING.md`](https://github.com/PolyhedralDev/Terra/blob/master/CONTRIBUTING.md) document in the root of the
|
- [ ] I have read
|
||||||
git repository.
|
the [`CONTRIBUTING.md`](https://github.com/PolyhedralDev/Terra/blob/master/CONTRIBUTING.md)
|
||||||
|
document in the root of the git repository.
|
||||||
- [ ] My code follows the code style for this
|
- [ ] My code follows the code style for this
|
||||||
project. <!-- There is an included `.editorconfig` file in the base of the repo. Please use a plugin for your IDE of choice that follows those settings. -->
|
project. <!-- There is an included `.editorconfig` file in the base of the repo. Please use a plugin for your IDE of choice that follows those settings. -->
|
||||||
|
|
||||||
|
40
.github/workflows/build.yml
vendored
40
.github/workflows/build.yml
vendored
@ -1,40 +0,0 @@
|
|||||||
# This workflow will build a Java project with Gradle
|
|
||||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
|
|
||||||
|
|
||||||
name: Java CI with Gradle
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "v*" # Push events to matching v*, i.e. v1.0, v20.15.10
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Set up JDK 1.8
|
|
||||||
uses: actions/setup-java@v1
|
|
||||||
with:
|
|
||||||
java-version: 1.8
|
|
||||||
|
|
||||||
- name: Build Terra
|
|
||||||
run: gradle shadowJar
|
|
||||||
|
|
||||||
- name: Upload artifacts
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: Package
|
|
||||||
path: build/libs
|
|
||||||
|
|
||||||
- name: Publish release
|
|
||||||
uses: marvinpinto/action-automatic-releases@latest
|
|
||||||
with:
|
|
||||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
prerelease: false
|
|
||||||
files: |
|
|
||||||
build/libs/Terra-*.jar
|
|
||||||
LICENSE
|
|
||||||
|
|
125
.gitignore
vendored
125
.gitignore
vendored
@ -65,6 +65,8 @@ hs_err_pid*
|
|||||||
.idea/**/dictionaries
|
.idea/**/dictionaries
|
||||||
.idea/**/shelf
|
.idea/**/shelf
|
||||||
|
|
||||||
|
.idea/
|
||||||
|
|
||||||
# Generated files
|
# Generated files
|
||||||
.idea/**/contentModel.xml
|
.idea/**/contentModel.xml
|
||||||
|
|
||||||
@ -127,17 +129,120 @@ fabric.properties
|
|||||||
# Android studio 3.1+ serialized cache file
|
# Android studio 3.1+ serialized cache file
|
||||||
.idea/caches/build_file_checksums.ser
|
.idea/caches/build_file_checksums.ser
|
||||||
|
|
||||||
# Ignore Gradle build output directory
|
### Windows template
|
||||||
build
|
# Windows thumbnail cache files
|
||||||
/target/
|
Thumbs.db
|
||||||
|
Thumbs.db:encryptable
|
||||||
|
ehthumbs.db
|
||||||
|
ehthumbs_vista.db
|
||||||
|
|
||||||
.idea/sonarlint/**
|
# Dump file
|
||||||
.idea/codeStyles/**
|
*.stackdump
|
||||||
.idea/**.xml
|
|
||||||
.idea/modules/**.iml
|
# Folder config file
|
||||||
|
[Dd]esktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Windows Installer files
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msix
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# Windows shortcuts
|
||||||
|
*.lnk
|
||||||
|
|
||||||
|
### macOS template
|
||||||
|
# General
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
.com.apple.timemachine.donotpresent
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
|
||||||
|
### Linux template
|
||||||
|
*~
|
||||||
|
|
||||||
|
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||||
|
.fuse_hidden*
|
||||||
|
|
||||||
|
# KDE directory preferences
|
||||||
|
.directory
|
||||||
|
|
||||||
|
# Linux trash folder which might appear on any partition or disk
|
||||||
|
.Trash-*
|
||||||
|
|
||||||
|
# .nfs files are created when an open file is removed but is still being accessed
|
||||||
|
.nfs*
|
||||||
|
|
||||||
|
### Application
|
||||||
|
# Archive love files
|
||||||
|
*.log.gz
|
||||||
|
|
||||||
|
# binary files
|
||||||
|
*.bin
|
||||||
|
|
||||||
|
# Database files
|
||||||
|
*.db
|
||||||
|
|
||||||
|
# Cache files
|
||||||
|
*.meta
|
||||||
|
*.data
|
||||||
|
|
||||||
|
### JEnv template
|
||||||
|
# JEnv local Java version configuration file
|
||||||
|
.java-version
|
||||||
|
|
||||||
|
# Used by previous versions of JEnv
|
||||||
|
.jenv-version
|
||||||
|
|
||||||
|
### VisualStudioCode template
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
*.code-workspace
|
||||||
|
|
||||||
|
# Local History for Visual Studio Code
|
||||||
|
.history/
|
||||||
|
|
||||||
|
### NetBeans template
|
||||||
|
**/nbproject/private/
|
||||||
|
**/nbproject/Makefile-*.mk
|
||||||
|
**/nbproject/Package-*.bash
|
||||||
|
build/
|
||||||
|
nbbuild/
|
||||||
|
dist/
|
||||||
|
nbdist/
|
||||||
|
.nb-gradle/
|
||||||
|
|
||||||
|
###
|
||||||
|
**/target/
|
||||||
|
|
||||||
!lib/*.jar
|
|
||||||
/run/
|
/run/
|
||||||
idea/**
|
|
||||||
|
|
||||||
testDir/
|
**/testDir/
|
@ -2,32 +2,41 @@
|
|||||||
|
|
||||||
# TL;DR
|
# TL;DR
|
||||||
|
|
||||||
Polyhedral Development is dedicated to providing a harassment-free experience for everyone, regardless of gender, gender identity and
|
Polyhedral Development is dedicated to providing a harassment-free experience
|
||||||
expression, preferred pronouns, sexual orientation, disability, physical appearance, age, race, religion, etc. We do not tolerate harassment
|
for everyone, regardless of gender, gender identity and expression, preferred
|
||||||
of participants in any form.
|
pronouns, sexual orientation, disability, physical appearance, age, race,
|
||||||
|
religion, etc. We do not tolerate harassment of participants in any form.
|
||||||
|
|
||||||
This code of conduct applies to all Terra community spaces, including the github discussions tab, our
|
This code of conduct applies to all Terra community spaces, including the github
|
||||||
[community discord server](https://discord.gg/PXUEbbF), the [community subreddit](https://reddit.com/r/TerraGenerator), or any other Terra
|
discussions tab, our [community discord server](https://discord.gg/PXUEbbF),
|
||||||
space, both online and off. Anyone in violation of this code, as determined by the applicable moderators, may be subject to verbal warning,
|
the [community subreddit](https://reddit.com/r/TerraGenerator), or any other
|
||||||
expulsion from these spaces, or future events and activities for an undetermined amount of time.
|
Terra space, both online and off. Anyone in violation of this code, as
|
||||||
|
determined by the applicable moderators, may be subject to verbal warning,
|
||||||
|
expulsion from these spaces, or future events and activities for an undetermined
|
||||||
|
amount of time.
|
||||||
|
|
||||||
Some Terra community spaces may have additional rules in place, which will be made clearly available to all participants. Participants are
|
Some Terra community spaces may have additional rules in place, which will be
|
||||||
responsible for knowing and abiding by these rules.
|
made clearly available to all participants. Participants are responsible for
|
||||||
|
knowing and abiding by these rules.
|
||||||
|
|
||||||
# Longer version
|
# Longer version
|
||||||
|
|
||||||
Polyhedral Development is dedicated to providing a harassment-free experience for everyone. We do not tolerate harassment of participants in
|
Polyhedral Development is dedicated to providing a harassment-free experience
|
||||||
any form.
|
for everyone. We do not tolerate harassment of participants in any form.
|
||||||
|
|
||||||
## When and How to Use These Guidelines
|
## When and How to Use These Guidelines
|
||||||
|
|
||||||
This code of conduct applies to all Terra community spaces, both online and off. This applies to the github discussion tab,
|
This code of conduct applies to all Terra community spaces, both online and off.
|
||||||
the [Polyhedral Development community discord server](https://discord.gg/PXUEbbF), and any other Terra community. In addition, we may choose
|
This applies to the github discussion tab, the
|
||||||
to invoke them in instances of harassment outside the Terra communities, and we will punish the responsible individuals appropriately. We
|
[Polyhedral Development community discord server](https://discord.gg/PXUEbbF),
|
||||||
will not tolerate harassment in any form, even outside of Terra.
|
and any other Terra community. In addition, we may choose to invoke them in
|
||||||
|
instances of harassment outside the Terra communities, and we will punish the
|
||||||
|
responsible individuals appropriately. We will not tolerate harassment in any
|
||||||
|
form, even outside of Terra.
|
||||||
|
|
||||||
Some Terra spaces may have additional rules in place, which will be made clearly available to participants. Participants are responsible for
|
Some Terra spaces may have additional rules in place, which will be made clearly
|
||||||
knowing and abiding by these rules, in addition to this code of conduct.
|
available to participants. Participants are responsible for knowing and abiding
|
||||||
|
by these rules, in addition to this code of conduct.
|
||||||
|
|
||||||
## Expected Behavior
|
## Expected Behavior
|
||||||
|
|
||||||
@ -35,33 +44,43 @@ The following behaviors are expected of all members of the Terra community:
|
|||||||
|
|
||||||
### Be Respectful
|
### Be Respectful
|
||||||
|
|
||||||
Value each other's ideas, styles and viewpoints. We may not always agree, but disagreement is no excuse for poor manners. Be open to
|
Value each other's ideas, styles and viewpoints. We may not always agree, but
|
||||||
different possibilities and to being wrong. Be respectful in all interactions and communications, especially when debating the merits of
|
disagreement is no excuse for poor manners. Be open to different possibilities
|
||||||
different options. Be aware of your impact and how intense interactions may be affecting people. Be direct, constructive and positive. Take
|
and to being wrong. Be respectful in all interactions and communications,
|
||||||
responsibility for your impact, and your mistakes – if someone says they have been harmed through your words or actions, listen carefully,
|
especially when debating the merits of different options. Be aware of your
|
||||||
apologize sincerely, and correct the behavior going forward.
|
impact and how intense interactions may be affecting people. Be direct,
|
||||||
|
constructive and positive. Take responsibility for your impact, and your
|
||||||
|
mistakes – if someone says they have been harmed through your words or actions,
|
||||||
|
listen carefully, apologize sincerely, and correct the behavior going forward.
|
||||||
|
|
||||||
#### Be Prepared to Admit When You are Wrong
|
#### Be Prepared to Admit When You are Wrong
|
||||||
|
|
||||||
Any member of the Terra community should always be open to new ideas and must always be open to the possibility of being wrong. Nobody can
|
Any member of the Terra community should always be open to new ideas and must
|
||||||
always be right, and we are only human; we are [fallible](https://www.merriam-webster.com/dictionary/fallible) by nature. It is okay to make
|
always be open to the possibility of being wrong. Nobody can always be right,
|
||||||
mistakes, but we must be willing to admit when we make one.
|
and we are only human; we are
|
||||||
|
[fallible](https://www.merriam-webster.com/dictionary/fallible) by nature. It is
|
||||||
|
okay to make mistakes, but we must be willing to admit when we make one.
|
||||||
|
|
||||||
### Be Direct but Professional
|
### Be Direct but Professional
|
||||||
|
|
||||||
We are likely to have some discussions about if and when criticism is respectful and when it's not. We must be able to speak directly when
|
We are likely to have some discussions about if and when criticism is respectful
|
||||||
we disagree and when we think we need to improve. We cannot withhold hard truths. Doing so respectfully is hard, doing so when others don't
|
and when it's not. We must be able to speak directly when we disagree and when
|
||||||
seem to be listening is harder, and hearing such comments when one is the recipient can be even harder still. We need to be honest and
|
we think we need to improve. We cannot withhold hard truths. Doing so
|
||||||
direct, as well as respectful.
|
respectfully is hard, doing so when others don't seem to be listening is harder,
|
||||||
|
and hearing such comments when one is the recipient can be even harder still. We
|
||||||
|
need to be honest and direct, as well as respectful.
|
||||||
|
|
||||||
### Be Inclusive
|
### Be Inclusive
|
||||||
|
|
||||||
Seek diverse perspectives. Diversity of views and of people on teams powers innovation, even if it is not always comfortable. Encourage all
|
Seek diverse perspectives. Diversity of views and of people on teams powers
|
||||||
voices. Help new perspectives be heard and listen actively. If you find yourself dominating a discussion, it is especially important to step
|
innovation, even if it is not always comfortable. Encourage all voices. Help new
|
||||||
back and encourage other voices to join in. Be aware of how much time is taken up by dominant members of the group. Provide alternative ways
|
perspectives be heard and listen actively. If you find yourself dominating a
|
||||||
to contribute or participate when possible.
|
discussion, it is especially important to step back and encourage other voices
|
||||||
|
to join in. Be aware of how much time is taken up by dominant members of the
|
||||||
|
group. Provide alternative ways to contribute or participate when possible.
|
||||||
|
|
||||||
Be inclusive of everyone in an interaction, respecting and facilitating people's participation whether they are:
|
Be inclusive of everyone in an interaction, respecting and facilitating people's
|
||||||
|
participation whether they are:
|
||||||
|
|
||||||
- Not native language speakers
|
- Not native language speakers
|
||||||
- Coming from a different culture
|
- Coming from a different culture
|
||||||
@ -70,47 +89,60 @@ Be inclusive of everyone in an interaction, respecting and facilitating people's
|
|||||||
- Facing other challenges to participate
|
- Facing other challenges to participate
|
||||||
- Or anything else. Be respectful of *everyone* at *all times*.
|
- Or anything else. Be respectful of *everyone* at *all times*.
|
||||||
|
|
||||||
Think about how you might facilitate alternative ways to contribute or participate. If you find yourself dominating a discussion, step back.
|
Think about how you might facilitate alternative ways to contribute or
|
||||||
Make way for other voices and listen actively to them.
|
participate. If you find yourself dominating a discussion, step back. Make way
|
||||||
|
for other voices and listen actively to them.
|
||||||
|
|
||||||
### Understand Different Perspectives
|
### Understand Different Perspectives
|
||||||
|
|
||||||
Our goal should not be to "win" every disagreement or argument. A more productive goal is to be open to ideas that make our own ideas
|
Our goal should not be to "win" every disagreement or argument. A more
|
||||||
better. Strive to be an example for inclusive thinking. "Winning" is when different perspectives make our work richer and stronger. That
|
productive goal is to be open to ideas that make our own ideas better. Strive to
|
||||||
means, you must pay attention to all ideas proposed. Don't disregard one without giving it the attention it deserves.
|
be an example for inclusive thinking. "Winning" is when different perspectives
|
||||||
|
make our work richer and stronger. That means, you must pay attention to all
|
||||||
|
ideas proposed. Don't disregard one without giving it the attention it deserves.
|
||||||
|
|
||||||
### Appreciate and Accommodate Our Similarities and Differences
|
### Appreciate and Accommodate Our Similarities and Differences
|
||||||
|
|
||||||
People come from many cultures and backgrounds. Cultural differences can encompass everything from official religious observances to
|
People come from many cultures and backgrounds. Cultural differences can
|
||||||
personal habits to clothing. Be respectful of anyone with different cultural practices, attitudes and beliefs. Work to eliminate your own
|
encompass everything from official religious observances to personal habits to
|
||||||
biases, prejudices and discriminatory practices. Think of others' needs from their point of view. Use preferred titles (including
|
clothing. Be respectful of anyone with different cultural practices, attitudes
|
||||||
pronouns<sup>[\[1\]](#1)</sup>) and the appropriate tone of voice. Respect people's right to privacy and confidentiality. Be open to
|
and beliefs. Work to eliminate your own biases, prejudices and discriminatory
|
||||||
learning from and educating others as well as educating yourself; it is unrealistic to expect someone to know the cultural practices of
|
practices. Think of others' needs from their point of view. Use preferred
|
||||||
every ethnic and cultural group. Therefore we must be ready to correct someone if they make a mistake, and must be ready ourselves to change
|
titles (including pronouns<sup>[\[1\]](#1)</sup>) and the appropriate tone of
|
||||||
and learn if we make a mistake.
|
voice. Respect people's right to privacy and confidentiality. Be open to
|
||||||
|
learning from and educating others as well as educating yourself; it is
|
||||||
|
unrealistic to expect someone to know the cultural practices of every ethnic and
|
||||||
|
cultural group. Therefore we must be ready to correct someone if they make a
|
||||||
|
mistake, and must be ready ourselves to change and learn if we make a mistake.
|
||||||
|
|
||||||
### Lead by Example
|
### Lead by Example
|
||||||
|
|
||||||
By matching your actions with your words, you become a person others want to follow. Your actions influence others to behave and respond in
|
By matching your actions with your words, you become a person others want to
|
||||||
ways that are valuable and appropriate for our organizational outcomes. Design your community and your work for inclusion. Hold yourself and
|
follow. Your actions influence others to behave and respond in ways that are
|
||||||
others accountable for inclusive behaviors.
|
valuable and appropriate for our organizational outcomes. Design your community
|
||||||
|
and your work for inclusion. Hold yourself and others accountable for inclusive
|
||||||
|
behaviors.
|
||||||
|
|
||||||
## Behavior That Will Not Be Tolerated
|
## Behavior That Will Not Be Tolerated
|
||||||
|
|
||||||
The following behaviors are considered to be unacceptable and will not be tolerated:
|
The following behaviors are considered to be unacceptable and will not be
|
||||||
|
tolerated:
|
||||||
|
|
||||||
### Violence and Threats of Violence
|
### Violence and Threats of Violence
|
||||||
|
|
||||||
Violence and threats of violence are not acceptable - online or offline. This includes incitement of violence toward any individual,
|
Violence and threats of violence are not acceptable - online or offline. This
|
||||||
including encouraging a person to commit self-harm, engage in self-harm, or put themselves in a negative position (e.g. one which can lead
|
includes incitement of violence toward any individual, including encouraging a
|
||||||
to an increase of depression, etc.).
|
person to commit self-harm, engage in self-harm, or put themselves in a negative
|
||||||
|
position (e.g. one which can lead to an increase of depression, etc.).
|
||||||
|
|
||||||
### Personal Attacks
|
### Personal Attacks
|
||||||
|
|
||||||
Conflicts will inevitably arise, but frustration should never turn into a personal attack. It is not okay to insult, demean or belittle
|
Conflicts will inevitably arise, but frustration should never turn into a
|
||||||
others. Attacking someone for their opinions, beliefs and ideas is not acceptable. It is important to speak directly when we disagree and
|
personal attack. It is not okay to insult, demean or belittle others. Attacking
|
||||||
when we think we need to improve, but such discussions must be conducted respectfully and professionally, remaining focused on the issue at
|
someone for their opinions, beliefs and ideas is not acceptable. It is important
|
||||||
hand.
|
to speak directly when we disagree and when we think we need to improve, but
|
||||||
|
such discussions must be conducted respectfully and professionally, remaining
|
||||||
|
focused on the issue at hand.
|
||||||
|
|
||||||
### Derogatory Language
|
### Derogatory Language
|
||||||
|
|
||||||
@ -135,30 +167,40 @@ Offensive, unwelcome, or hurtful comments related to:
|
|||||||
- Socioeconomic status
|
- Socioeconomic status
|
||||||
- Religion
|
- Religion
|
||||||
- Employment
|
- Employment
|
||||||
- Or anything really. Just don't be offensive towards people, insult them, or make unwanted comments.
|
- Or anything really. Just don't be offensive towards people, insult them, or
|
||||||
|
make unwanted comments.
|
||||||
|
|
||||||
is not acceptable. This includes deliberately referring to someone by a gender that they do not identify with, and/or questioning the
|
is not acceptable. This includes deliberately referring to someone by a gender
|
||||||
legitimacy of an individual's gender identity. If you're unsure if a word is derogatory, don't use it. This also includes repeated subtle
|
that they do not identify with, and/or questioning the legitimacy of an
|
||||||
and/or indirect discrimination; when asked to stop, stop the behavior in question.
|
individual's gender identity. If you're unsure if a word is derogatory, don't
|
||||||
|
use it. This also includes repeated subtle and/or indirect discrimination; when
|
||||||
|
asked to stop, stop the behavior in question.
|
||||||
|
|
||||||
### Unwelcome Sexual Attention or Physical Contact
|
### Unwelcome Sexual Attention or Physical Contact
|
||||||
|
|
||||||
Unwelcome sexual attention or unwelcome physical contact is not acceptable. This includes sexualized comments, jokes or imagery in
|
Unwelcome sexual attention or unwelcome physical contact is not acceptable. This
|
||||||
interactions, communications or presentation materials, as well as inappropriate touching, groping, or sexual advances. Additionally,
|
includes sexualized comments, jokes or imagery in interactions, communications
|
||||||
touching a person without permission, including sensitive areas such as their hair, pregnant stomach, mobility device (wheelchair, scooter,
|
or presentation materials, as well as inappropriate touching, groping, or sexual
|
||||||
etc) or tattoos is unacceptable. This includes physically blocking or intimidating another person. Physical contact or simulated physical
|
advances. Additionally, touching a person without permission, including
|
||||||
contact (e.g. emojis like ":​kiss:", ":hug:", or ":kiss_mark:", textual descriptions like "\*hug\*", "\*backrub\*", or "\*kisses
|
sensitive areas such as their hair, pregnant stomach, mobility device (
|
||||||
you\*", etc.) without affirmative consent or after a request to stop will not be accepted.
|
wheelchair, scooter, etc) or tattoos is unacceptable. This includes physically
|
||||||
|
blocking or intimidating another person. Physical contact or simulated physical
|
||||||
|
contact (e.g. emojis like ":​kiss:", ":hug:", or ":kiss_mark:", textual
|
||||||
|
descriptions like "\*hug\*", "\*backrub\*", or "\*kisses you\*", etc.) without
|
||||||
|
affirmative consent or after a request to stop will not be accepted.
|
||||||
|
|
||||||
### Sexual Behaviour Where it is Not Appropriate
|
### Sexual Behaviour Where it is Not Appropriate
|
||||||
|
|
||||||
Uninvited or off-topic sexual images, text, or behaviour in spaces where they're not appropriate will not be accepted whatsoever. We are an
|
Uninvited or off-topic sexual images, text, or behaviour in spaces where they're
|
||||||
open community, which means spaces must be appropriate for all ages, and everybody must feel comfortable. Discussion of sexual things, will
|
not appropriate will not be accepted whatsoever. We are an open community, which
|
||||||
be prohibited unless otherwise noted.
|
means spaces must be appropriate for all ages, and everybody must feel
|
||||||
|
comfortable. Discussion of sexual things, will be prohibited unless otherwise
|
||||||
|
noted.
|
||||||
|
|
||||||
### Discussion of Sensitive Topics
|
### Discussion of Sensitive Topics
|
||||||
|
|
||||||
Discussion of sensitive topics when asked to stop, or when not appropriate. Including, but not limited to:
|
Discussion of sensitive topics when asked to stop, or when not appropriate.
|
||||||
|
Including, but not limited to:
|
||||||
|
|
||||||
- Anything sexual
|
- Anything sexual
|
||||||
- Gore
|
- Gore
|
||||||
@ -167,171 +209,241 @@ Discussion of sensitive topics when asked to stop, or when not appropriate. Incl
|
|||||||
- Anything related to death
|
- Anything related to death
|
||||||
- Or really anything that someone may be sensitive about.
|
- Or really anything that someone may be sensitive about.
|
||||||
|
|
||||||
shall not be tolerated. As a community for all ages and all kinds of people, we must cater to everyone, and must make sure everyone feels
|
shall not be tolerated. As a community for all ages and all kinds of people, we
|
||||||
comfortable here. Repeatedly breaking someone else's boundaries will not be tolerated.
|
must cater to everyone, and must make sure everyone feels comfortable here.
|
||||||
|
Repeatedly breaking someone else's boundaries will not be tolerated.
|
||||||
|
|
||||||
### Disruptive Behavior
|
### Disruptive Behavior
|
||||||
|
|
||||||
Sustained disruption of events, forums, or meetings, online or otherwise, including talks and presentations, will not be tolerated. This
|
Sustained disruption of events, forums, or meetings, online or otherwise,
|
||||||
includes:
|
including talks and presentations, will not be tolerated. This includes:
|
||||||
|
|
||||||
- 'Talking over', 'heckling', or otherwise disrupting speakers.
|
- 'Talking over', 'heckling', or otherwise disrupting speakers.
|
||||||
- Making derogatory comments about someone else's choices, pushing people to do something they do not wish to do, talking about their
|
- Making derogatory comments about someone else's choices, pushing people to do
|
||||||
choices or personal preferences to others, or pressuring them to do something they don't wish to - physically or through jeering.
|
something they do not wish to do, talking about their choices or personal
|
||||||
|
preferences to others, or pressuring them to do something they don't wish to -
|
||||||
|
physically or through jeering.
|
||||||
- Behaviour that intentionally disrupts an event.
|
- Behaviour that intentionally disrupts an event.
|
||||||
- Otherwise influencing actions that may cause hostility in the session.
|
- Otherwise influencing actions that may cause hostility in the session.
|
||||||
|
|
||||||
### Influencing Unacceptable Behavior
|
### Influencing Unacceptable Behavior
|
||||||
|
|
||||||
We will treat influencing or leading such activities the same way we treat the activities themselves, and thus the same consequences apply.
|
We will treat influencing or leading such activities the same way we treat the
|
||||||
To make someone do something bad is the same thing as if you were to do it yourself, and we will not tolerate it.
|
activities themselves, and thus the same consequences apply. To make someone do
|
||||||
|
something bad is the same thing as if you were to do it yourself, and we will
|
||||||
|
not tolerate it.
|
||||||
|
|
||||||
### Stalking or Following
|
### Stalking or Following
|
||||||
|
|
||||||
Stalking or following in any form (offline or online) is unnacceptable. In addition, you may not take pictures or record video of others
|
Stalking or following in any form (offline or online) is unnacceptable. In
|
||||||
without their express permission or when asked to stop. Any individual may also request for you to delete all footage you have of them, even
|
addition, you may not take pictures or record video of others without their
|
||||||
if you took it with their prior consent.
|
express permission or when asked to stop. Any individual may also request for
|
||||||
|
you to delete all footage you have of them, even if you took it with their prior
|
||||||
|
consent.
|
||||||
|
|
||||||
### Publication of Personal Information
|
### Publication of Personal Information
|
||||||
|
|
||||||
The publication of personally identifying information (commonly known as "[doxxing](https://en.wikipedia.org/wiki/Doxing)") is directly
|
The publication of personally identifying information (commonly known
|
||||||
prohibited. You may not publish information that someone wants to keep private, unless it is necessary to protect vulnerable people from
|
as "[doxxing](https://en.wikipedia.org/wiki/Doxing)") is directly prohibited.
|
||||||
intentional abuse. Addditionally, you may not deliberately "out" any aspect of a person's identity without their consent, this includes
|
You may not publish information that someone wants to keep private, unless it is
|
||||||
gender, pronouns, sexual identity, etc.
|
necessary to protect vulnerable people from intentional abuse. Addditionally,
|
||||||
|
you may not deliberately "out" any aspect of a person's identity without their
|
||||||
|
consent, this includes gender, pronouns, sexual identity, etc.
|
||||||
|
|
||||||
Unless it pretains to a case of harassment, as outlined here, in which case some personally identifying information may need to be brought
|
Unless it pretains to a case of harassment, as outlined here, in which case some
|
||||||
up in private with the appropriate moderation team to help aid our efforts in keeping the community safe.
|
personally identifying information may need to be brought up in private with the
|
||||||
|
appropriate moderation team to help aid our efforts in keeping the community
|
||||||
|
safe.
|
||||||
|
|
||||||
### Deliberate Misuse of Pronouns<sup>[\[1\]](#1)</sup> or Names
|
### Deliberate Misuse of Pronouns<sup>[\[1\]](#1)</sup> or Names
|
||||||
|
|
||||||
As an inclusive community, we must respect everyone. That means respecting the pronouns or names they wish for us to use. Deliberate
|
As an inclusive community, we must respect everyone. That means respecting the
|
||||||
misgendering, misuse of preferred pronouns<sup>[\[1\]](#1)</sup>, or use of 'dead' or rejected names is not to be tolerated. (If someone
|
pronouns or names they wish for us to use. Deliberate misgendering, misuse of
|
||||||
*accidentally* uses the incorrect pronouns, gender, or name, politely ask them to use the correct pronouns/gender/name. But if they are to
|
preferred pronouns<sup>[\[1\]](#1)</sup>, or use of 'dead' or rejected names is
|
||||||
continue using the incorrect pronouns, gender, or name, then you should escalate and report them to us.)
|
not to be tolerated. (If someone
|
||||||
|
*accidentally* uses the incorrect pronouns, gender, or name, politely ask them
|
||||||
|
to use the correct pronouns/gender/name. But if they are to continue using the
|
||||||
|
incorrect pronouns, gender, or name, then you should escalate and report them to
|
||||||
|
us.)
|
||||||
|
|
||||||
### Not Stopping After Multiple Requests
|
### Not Stopping After Multiple Requests
|
||||||
|
|
||||||
If someone asks you to stop doing something, then you should stop. Continuing to do it may be considered harassment, and can lead you to be
|
If someone asks you to stop doing something, then you should stop. Continuing to
|
||||||
removed from our community.
|
do it may be considered harassment, and can lead you to be removed from our
|
||||||
|
community.
|
||||||
|
|
||||||
## Complains We May Ignore
|
## Complains We May Ignore
|
||||||
|
|
||||||
Additionally, Terra prioritizes marginalized people's safety over privileged people's comfort. We reserve the right to ignore complaints
|
Additionally, Terra prioritizes marginalized people's safety over privileged
|
||||||
regarding:
|
people's comfort. We reserve the right to ignore complaints regarding:
|
||||||
|
|
||||||
- Claims of discrimination against non-marginalized or oppressed groups (eg. being 'superphobic', meaning to not support people who are
|
- Claims of discrimination against non-marginalized or oppressed groups (eg.
|
||||||
'superstraight', which is a dog whistle for transphobic groups, or being 'cisphobic' without large amounts of evidence, etc.), or claims
|
being 'superphobic', meaning to not support people who are
|
||||||
of discrimination with no evidence. (Basically, don't report 'cisphobia' to us, because it doesn't exist. But if someone is mocking you or
|
'superstraight', which is a dog whistle for transphobic groups, or being '
|
||||||
making fun of you for being cis, and it is *really* getting out of hand, then do tell us.)
|
cisphobic' without large amounts of evidence, etc.), or claims of
|
||||||
- Reasonable communication of boundaries, such as "leave me alone," "go away," or "I'm not discussing this with you." (If someone is asking
|
discrimination with no evidence. (Basically, don't report 'cisphobia' to us,
|
||||||
you to stop, that is not reason for you to report them as harassing you.)
|
because it doesn't exist. But if someone is mocking you or making fun of you
|
||||||
- Communicating in a 'tone' you don't find [congenial](https://www.thefreedictionary.com/congenial). (You may not report someone for
|
for being cis, and it is *really* getting out of hand, then do tell us.)
|
||||||
harassment for being 'annoyed with you' or 'talking sternly to you')
|
- Reasonable communication of boundaries, such as "leave me alone," "go away,"
|
||||||
- Criticizing or calling out racist, sexist, discriminatory, or otherwise oppressive behavior or assumptions. (You may not say that someone
|
or "I'm not discussing this with you." (If someone is asking you to stop, that
|
||||||
is harassing you if they are telling you to stop discriminating against someone.)
|
is not reason for you to report them as harassing you.)
|
||||||
- Disagreements that do not qualify as harassment. If you have a simple disagreement with someone, and they have not been discriminating to
|
- Communicating in a 'tone' you don't
|
||||||
anyone, in any form, then we will not take action against them. Two people are allowed to disagree on things without it getting toxic.
|
find [congenial](https://www.thefreedictionary.com/congenial). (You may not
|
||||||
|
report someone for harassment for being 'annoyed with you' or 'talking sternly
|
||||||
|
to you')
|
||||||
|
- Criticizing or calling out racist, sexist, discriminatory, or otherwise
|
||||||
|
oppressive behavior or assumptions. (You may not say that someone is harassing
|
||||||
|
you if they are telling you to stop discriminating against someone.)
|
||||||
|
- Disagreements that do not qualify as harassment. If you have a simple
|
||||||
|
disagreement with someone, and they have not been discriminating to anyone, in
|
||||||
|
any form, then we will not take action against them. Two people are allowed to
|
||||||
|
disagree on things without it getting toxic.
|
||||||
|
|
||||||
We may also additionally choose to enact punishment for submitting a complaint in bad-faith or without adequate justification, if we deem
|
We may also additionally choose to enact punishment for submitting a complaint
|
||||||
necessary; if you're submitting a complaint just to troll or to annoy people, we may choose to have you banned or removed from the community
|
in bad-faith or without adequate justification, if we deem necessary; if you're
|
||||||
spaces. Don't waste our time.
|
submitting a complaint just to troll or to annoy people, we may choose to have
|
||||||
|
you banned or removed from the community spaces. Don't waste our time.
|
||||||
|
|
||||||
In order to protect volunteers from abuse and burnout, we reserve the right to reject any report we believe to have been made in bad faith
|
In order to protect volunteers from abuse and burnout, we reserve the right to
|
||||||
or with misintent. Reports intended to silence legitimate criticism may be deleted without response.
|
reject any report we believe to have been made in bad faith or with misintent.
|
||||||
|
Reports intended to silence legitimate criticism may be deleted without
|
||||||
|
response.
|
||||||
|
|
||||||
## Reporting
|
## Reporting
|
||||||
|
|
||||||
Terra has a global moderation team which is currently comprised of the following members:
|
Terra has a global moderation team which is currently comprised of the following
|
||||||
|
members:
|
||||||
|
|
||||||
- solonovamax
|
- solonovamax
|
||||||
- discord: [@solonovamax#6983](https://discord.com/channels/@me/566146322273402881)*
|
-
|
||||||
|
discord: [@solonovamax#6983](https://discord.com/channels/@me/566146322273402881)*
|
||||||
- github: [@solonovamax](https://github.com/solonovamax)
|
- github: [@solonovamax](https://github.com/solonovamax)
|
||||||
- email: [solonovamax@12oclockpoint.com](mailto:solonovamax@12oclockpoint.com)
|
-
|
||||||
|
email: [solonovamax@12oclockpoint.com](mailto:solonovamax@12oclockpoint.com)
|
||||||
- dfsek
|
- dfsek
|
||||||
- discord: [@dfsek#4208](https://discord.com/channels/@me/378350362236682240)*
|
-
|
||||||
|
discord: [@dfsek#4208](https://discord.com/channels/@me/378350362236682240)*
|
||||||
- github: [@dfsek](https://github.com/dfsek)
|
- github: [@dfsek](https://github.com/dfsek)
|
||||||
- email: [dfsek@protonmail.com](mailto:dfsek@protonmail.com)
|
- email: [dfsek@protonmail.com](mailto:dfsek@protonmail.com)
|
||||||
- duplex (duplexsystem)
|
- duplex (duplexsystem)
|
||||||
- discord: [@Duplex#0797](https://discord.com/channels/@me/356822848641171456)*
|
-
|
||||||
|
discord: [@Duplex#0797](https://discord.com/channels/@me/356822848641171456)*
|
||||||
- github: [@duplexsystem](https://github.com/duplexsystem)
|
- github: [@duplexsystem](https://github.com/duplexsystem)
|
||||||
- email: [duplexsys@protonmail.com](mailto:duplexsys@protonmail.com)
|
- email: [duplexsys@protonmail.com](mailto:duplexsys@protonmail.com)
|
||||||
|
|
||||||
\* The preferred method of communication is through discord. Although we will still be responsive on the other platforms, we will be more
|
\* The preferred method of communication is through discord. Although we will
|
||||||
responsive on discord.
|
still be responsive on the other platforms, we will be more responsive on
|
||||||
|
discord.
|
||||||
|
|
||||||
These are people you can contact for anything regarding this code of conduct.
|
These are people you can contact for anything regarding this code of conduct.
|
||||||
|
|
||||||
If you are being harassed by a member of the Terra community, or by someone in a Terra community space, notice that someone else is being
|
If you are being harassed by a member of the Terra community, or by someone in a
|
||||||
harassed, or have any other concerns, please contact a moderator of the platform it occurred on, or someone on the global moderation team.
|
Terra community space, notice that someone else is being harassed, or have any
|
||||||
If the person who is harassing you is on the global moderation team, they will [recuse](https://www.thefreedictionary.com/recuse) themselves
|
other concerns, please contact a moderator of the platform it occurred on, or
|
||||||
from handling your incident. (Meaning: if you are reporting someone on the team, they will not be involved in the discussion.) We will
|
someone on the global moderation team. If the person who is harassing you is on
|
||||||
respond within a reasonable time frame, but generally within about 1 day.
|
the global moderation team, they
|
||||||
|
will [recuse](https://www.thefreedictionary.com/recuse) themselves from handling
|
||||||
|
your incident. (Meaning: if you are reporting someone on the team, they will not
|
||||||
|
be involved in the discussion.) We will respond within a reasonable time frame,
|
||||||
|
but generally within about 1 day.
|
||||||
|
|
||||||
This code of conduct applies to Terra community spaces, but if you are being harassed by a member of Terra *outside* our spaces, we still
|
This code of conduct applies to Terra community spaces, but if you are being
|
||||||
want to know about it as we may choose to take action within our community. We will take all good-faith reports seriously and will always
|
harassed by a member of Terra *outside* our spaces, we still want to know about
|
||||||
attempt to handle them appropriately. This includes harassment outside our spaces and harassment that took place at any point in time. The
|
it as we may choose to take action within our community. We will take all
|
||||||
moderation team reserves the right to exclude people from Terra communities based on their past behavior, including behavior outside Terra
|
good-faith reports seriously and will always attempt to handle them
|
||||||
spaces and behavior towards people who are not in Terra.
|
appropriately. This includes harassment outside our spaces and harassment that
|
||||||
|
took place at any point in time. The moderation team reserves the right to
|
||||||
|
exclude people from Terra communities based on their past behavior, including
|
||||||
|
behavior outside Terra spaces and behavior towards people who are not in Terra.
|
||||||
|
|
||||||
Note: although we only have the ability to moderate official community spaces, if you are being harassed by someone in a non-official
|
Note: although we only have the ability to moderate official community spaces,
|
||||||
community space, and the moderation team of that platform refuses to do anything to help you (or even if they *do* help you), then you
|
if you are being harassed by someone in a non-official community space, and the
|
||||||
should notify us so that we may take appropriate action.
|
moderation team of that platform refuses to do anything to help you (or even if
|
||||||
|
they *do* help you), then you should notify us so that we may take appropriate
|
||||||
|
action.
|
||||||
|
|
||||||
We will respect confidentiality requests for the purpose of protecting victims of abuse. At our discretion, we may publicly name a person
|
We will respect confidentiality requests for the purpose of protecting victims
|
||||||
which we have received harassment complaints about, or privately warn third parties about them, but only if we believe that doing so will
|
of abuse. At our discretion, we may publicly name a person which we have
|
||||||
increase the safety of Terra community members or the general public. We will not name harassment victims or reporters of harassment
|
received harassment complaints about, or privately warn third parties about
|
||||||
(assuming the report was made in good-faith) without their explicit consent; all reports will remain anonymous by default.
|
them, but only if we believe that doing so will increase the safety of Terra
|
||||||
|
community members or the general public. We will not name harassment victims or
|
||||||
|
reporters of harassment
|
||||||
|
(assuming the report was made in good-faith) without their explicit consent; all
|
||||||
|
reports will remain anonymous by default.
|
||||||
|
|
||||||
## Consequences of Unacceptable Behavior
|
## Consequences of Unacceptable Behavior
|
||||||
|
|
||||||
Participants asked to stop any harassing behavior are expected to comply immediately. Whether or not you comply immediately, you may still
|
Participants asked to stop any harassing behavior are expected to comply
|
||||||
face consequences for you actions, but if the harasser doesn't comply immediately then we may choose to take additional actions to protect
|
immediately. Whether or not you comply immediately, you may still face
|
||||||
the Terra community members or the individual being harassed.
|
consequences for you actions, but if the harasser doesn't comply immediately
|
||||||
|
then we may choose to take additional actions to protect the Terra community
|
||||||
|
members or the individual being harassed.
|
||||||
|
|
||||||
Violation of this code can result in being asked to leave an event or online space, either temporarily or for the duration of the event, or
|
Violation of this code can result in being asked to leave an event or online
|
||||||
being banned from participation in spaces, or future events and activities in perpetuity. If a participant engages in harassing behavior,
|
space, either temporarily or for the duration of the event, or being banned from
|
||||||
the global moderation team may take any action they deem appropriate, up to and including expulsion from all Terra community spaces and
|
participation in spaces, or future events and activities in perpetuity. If a
|
||||||
identification of the participant as a harasser to other Terra community members or the general public. Bad behavior from any community
|
participant engages in harassing behavior, the global moderation team may take
|
||||||
|
any action they deem appropriate, up to and including expulsion from all Terra
|
||||||
|
community spaces and identification of the participant as a harasser to other
|
||||||
|
Terra community members or the general public. Bad behavior from any community
|
||||||
member, including those with decision-making authority, will not be tolerated.
|
member, including those with decision-making authority, will not be tolerated.
|
||||||
|
|
||||||
In addition, any participants who abuse the reporting process will be considered to be in violation of these guidelines and subject to
|
In addition, any participants who abuse the reporting process will be considered
|
||||||
consequences. False reporting, especially to retaliate or exclude, will not be accepted or tolerated.
|
to be in violation of these guidelines and subject to consequences. False
|
||||||
|
reporting, especially to retaliate or exclude, will not be accepted or
|
||||||
|
tolerated.
|
||||||
|
|
||||||
## Questions
|
## Questions
|
||||||
|
|
||||||
if you have further questions for anything not addressed here, you may open an issue on this github repo, or contact a member of the global
|
if you have further questions for anything not addressed here, you may open an
|
||||||
moderation team.
|
issue on this github repo, or contact a member of the global moderation team.
|
||||||
|
|
||||||
## License and Attribution
|
## License and Attribution
|
||||||
|
|
||||||
This set of guidelines is distributed under a
|
This set of guidelines is distributed under a
|
||||||
[Creative Commons Attribution-ShareAlike license](https://creativecommons.org/licenses/by-sa/3.0/).
|
[Creative Commons Attribution-ShareAlike license](https://creativecommons.org/licenses/by-sa/3.0/)
|
||||||
|
.
|
||||||
|
|
||||||
These guidelines have been adapted from
|
These guidelines have been adapted from
|
||||||
[Mozilla's Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/), which were adapted
|
[Mozilla's Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/)
|
||||||
from:
|
, which were adapted from:
|
||||||
|
|
||||||
- Mozilla's original Community Participation Guidelines
|
- Mozilla's original Community Participation Guidelines
|
||||||
- The [Ubuntu Code of Conduct](https://ubuntu.com/community/code-of-conduct)
|
- The [Ubuntu Code of Conduct](https://ubuntu.com/community/code-of-conduct)
|
||||||
- Mozilla's [View Source Conference Code of Conduct](https://viewsourceconf.org/berlin-2016/code-of-conduct/)
|
-
|
||||||
- And the [Rust Language Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct)
|
|
||||||
|
|
||||||
which in turn were based on [Stumptown Syndicate's Citizen Code of Conduct](http://citizencodeofconduct.org/), along with some adapted text
|
Mozilla's [View Source Conference Code of Conduct](https://viewsourceconf.org/berlin-2016/code-of-conduct/)
|
||||||
from the [LGBTQ in Technology Code of Conduct](https://lgbtq.technology/coc.html) and
|
|
||||||
the [WisCon code of conduct](http://wiscon.net/policies/anti-harassment/code-of-conduct/).
|
- And
|
||||||
|
the [Rust Language Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct)
|
||||||
|
|
||||||
|
which in turn were based
|
||||||
|
on [Stumptown Syndicate's Citizen Code of Conduct](http://citizencodeofconduct.org/)
|
||||||
|
, along with some adapted text from
|
||||||
|
the [LGBTQ in Technology Code of Conduct](https://lgbtq.technology/coc.html) and
|
||||||
|
the [WisCon code of conduct](http://wiscon.net/policies/anti-harassment/code-of-conduct/)
|
||||||
|
.
|
||||||
|
|
||||||
It was then modified by solonovamax with various inclusions from
|
It was then modified by solonovamax with various inclusions from
|
||||||
the [LGBTQ in Technology Code of Conduct](https://lgbtq.technology/coc.html) and a few other sources.
|
the [LGBTQ in Technology Code of Conduct](https://lgbtq.technology/coc.html) and
|
||||||
|
a few other sources.
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
#### \[1\]
|
#### \[1\]
|
||||||
|
|
||||||
You provide a set of pronouns that everyone is comfortable addressing you with. Although some people are comfortable
|
You provide a set of pronouns that everyone is comfortable addressing you with.
|
||||||
using [neopronouns](https://www.mypronouns.org/neopronouns), not everyone is. Therefore, if you use neopronouns, you should have at *least*
|
Although some people are comfortable
|
||||||
one set of more common pronouns (One of he/him, she/her, or they/them; it doesn't matter which one. Anyone who doesn't respect your basic
|
using [neopronouns](https://www.mypronouns.org/neopronouns), not everyone is.
|
||||||
pronouns will be removed from the community.) that people may use, should they so choose, as some people are not comfortable
|
Therefore, if you use neopronouns, you should have at *least*
|
||||||
using [neopronouns](https://www.mypronouns.org/neopronouns). But if someone refuses to use your more common pronouns, you should report them
|
one set of more common pronouns (One of he/him, she/her, or they/them; it
|
||||||
to us. Additionally, you may not ask people to use unreasonable pronouns, such as 'acab/acabself', 'that/bitch', 'ur/mom', or
|
doesn't matter which one. Anyone who doesn't respect your basic pronouns will be
|
||||||
'dream/dreamself' (pronouns related to real people, eg. the minecraft youtuber 'dreamwastaken'). Doing so will be considered mockery of
|
removed from the community.) that people may use, should they so choose, as some
|
||||||
individuals who use non-standard pronouns and is very disrespectful.
|
people are not comfortable
|
||||||
|
using [neopronouns](https://www.mypronouns.org/neopronouns). But if someone
|
||||||
|
refuses to use your more common pronouns, you should report them to us.
|
||||||
|
Additionally, you may not ask people to use unreasonable pronouns, such as '
|
||||||
|
acab/acabself', 'that/bitch', 'ur/mom', or
|
||||||
|
'dream/dreamself' (pronouns related to real people, eg. the minecraft youtuber '
|
||||||
|
dreamwastaken'). Doing so will be considered mockery of individuals who use
|
||||||
|
non-standard pronouns and is very disrespectful.
|
304
CONTRIBUTING.md
304
CONTRIBUTING.md
@ -1,17 +1,22 @@
|
|||||||
# Contributing to Terra
|
# Contributing to Terra
|
||||||
|
|
||||||
First off, thank you for considering contributing to Terra. It's people like you that make Terra such a great tool.
|
First off, thank you for considering contributing to Terra. It's people like you
|
||||||
|
that make Terra such a great tool.
|
||||||
|
|
||||||
Following these guidelines helps to effectively use the time of the developers managing and developing this open source project, making it
|
Following these guidelines helps to effectively use the time of the developers
|
||||||
more enjoyable for all of us.
|
managing and developing this open source project, making it more enjoyable for
|
||||||
|
all of us.
|
||||||
|
|
||||||
Terra is an open source project and we love to receive contributions from our community, you! There are many ways to contribute, from
|
Terra is an open source project and we love to receive contributions from our
|
||||||
writing tutorials or blog posts, improving the documentation, submitting bug reports and feature requests or writing code which can be
|
community, you! There are many ways to contribute, from writing tutorials or
|
||||||
incorporated into Terra.
|
blog posts, improving the documentation, submitting bug reports and feature
|
||||||
|
requests or writing code which can be incorporated into Terra.
|
||||||
|
|
||||||
The following is a set of guidelines for contributing to Terra and its packages, which are hosted in
|
The following is a set of guidelines for contributing to Terra and its packages,
|
||||||
the [PolyhedralDev Organization](https://github.com/PolyhedralDev) on GitHub. These are mostly guidelines, not rules. Use your best
|
which are hosted in
|
||||||
judgment, and feel free to propose changes to this document in a pull request.
|
the [PolyhedralDev Organization](https://github.com/PolyhedralDev) on GitHub.
|
||||||
|
These are mostly guidelines, not rules. Use your best judgment, and feel free to
|
||||||
|
propose changes to this document in a pull request.
|
||||||
|
|
||||||
#### Table Of Contents
|
#### Table Of Contents
|
||||||
|
|
||||||
@ -51,8 +56,10 @@ judgment, and feel free to propose changes to this document in a pull request.
|
|||||||
|
|
||||||
## Code of Conduct
|
## Code of Conduct
|
||||||
|
|
||||||
This project and everyone participating in it is governed by the [Terra of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected
|
This project and everyone participating in it is governed by
|
||||||
to uphold this code. Please report unacceptable behavior to [Terra global moderation team](CODE_OF_CONDUCT.md#Reporting).
|
the [Terra of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected
|
||||||
|
to uphold this code. Please report unacceptable behavior
|
||||||
|
to [Terra global moderation team](CODE_OF_CONDUCT.md#Reporting).
|
||||||
|
|
||||||
## I don't want to read this whole thing I just have a question!!!
|
## I don't want to read this whole thing I just have a question!!!
|
||||||
|
|
||||||
@ -66,160 +73,219 @@ We have an official discord server where you can request help from various users
|
|||||||
|
|
||||||
### Your First Contribution
|
### Your First Contribution
|
||||||
|
|
||||||
Unsure where to begin contributing to Terra? You can start by looking through "beginner" and "help wanted" issues:
|
Unsure where to begin contributing to Terra? You can start by looking through "
|
||||||
|
beginner" and "help wanted" issues:
|
||||||
|
|
||||||
- [Beginner issues](https://github.com/PolyhedralDev/Terra/labels/Note%3A%20Good%20First%20Issue) - issues which should be friendly to
|
- [Beginner issues](https://github.com/PolyhedralDev/Terra/labels/Note%3A%20Good%20First%20Issue)
|
||||||
anyone new to terra.
|
- issues which should be friendly to anyone new to terra.
|
||||||
- [Help wanted issues](https://github.com/PolyhedralDev/Terra/labels/Note%3A%20Help%20Wanted) - issues which should be a bit more involved
|
- [Help wanted issues](https://github.com/PolyhedralDev/Terra/labels/Note%3A%20Help%20Wanted)
|
||||||
than "beginner" issues.
|
- issues which should be a bit more involved than "beginner" issues.
|
||||||
|
|
||||||
New to github? Working on your first Pull Request? Check
|
New to github? Working on your first Pull Request? Check
|
||||||
out [How to Contribute to an Open Source Project on GitHub](https://app.egghead.io/playlists/how-to-contribute-to-an-open-source-project-on-github)
|
out [How to Contribute to an Open Source Project on GitHub](https://app.egghead.io/playlists/how-to-contribute-to-an-open-source-project-on-github)
|
||||||
to get you up on your feet.
|
to get you up on your feet.
|
||||||
|
|
||||||
At this point, you're ready to make your changes! Feel free to ask for help; everyone is a beginner at first!
|
At this point, you're ready to make your changes! Feel free to ask for help;
|
||||||
|
everyone is a beginner at first!
|
||||||
|
|
||||||
If a maintainer asks you to "rebase" your PR, they're saying that a lot of code has changed, and that you need to update your branch so it's
|
If a maintainer asks you to "rebase" your PR, they're saying that a lot of code
|
||||||
easier to merge.
|
has changed, and that you need to update your branch so it's easier to merge.
|
||||||
|
|
||||||
### Reporting Bugs
|
### Reporting Bugs
|
||||||
|
|
||||||
This section guides you through submitting a bug report for Terra. Following these guidelines helps maintainers and the community understand
|
This section guides you through submitting a bug report for Terra. Following
|
||||||
your report, and spend their time fixing the issue instead of understanding what you mean.
|
these guidelines helps maintainers and the community understand your report, and
|
||||||
|
spend their time fixing the issue instead of understanding what you mean.
|
||||||
|
|
||||||
Before creating bug reports, please check [this list](#before-submitting-a-bug-report) as you might find out that you don't need to create
|
Before creating bug reports, please
|
||||||
one. When you are creating a bug report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report).
|
check [this list](#before-submitting-a-bug-report) as you might find out that
|
||||||
|
you don't need to create one. When you are creating a bug report,
|
||||||
|
please [include as many details as possible](#how-do-i-submit-a-good-bug-report)
|
||||||
|
.
|
||||||
|
|
||||||
> **Note:** If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one.
|
> **Note:** If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one.
|
||||||
|
|
||||||
#### Before Submitting A Bug Report
|
#### Before Submitting A Bug Report
|
||||||
|
|
||||||
- Join the [discord server](https://discord.dfsek.com) to help resolve simple issues.
|
- Join the [discord server](https://discord.dfsek.com) to help resolve simple
|
||||||
- You must be on the LATEST version of Terra to receive any support. There is no support for older versions of Terra.
|
issues.
|
||||||
- Make sure that this is not a *specific* compatibility issue with another terrain generation mod. Do not request *specific* compatibility
|
- You must be on the LATEST version of Terra to receive any support. There is no
|
||||||
with mods or plugins (e.g. "Compatibility with TechCraft v7"). That should be implemented in an addon, **not** in the main project.
|
support for older versions of Terra.
|
||||||
*General* compatibility (e.g. "Ability to pull Vanilla/Modded features from parent biomes") will be considered in the main project.
|
- Make sure that this is not a *specific* compatibility issue with another
|
||||||
- Search for any [already existing issues](https://github.com/PolyhedralDev/Terra/issues?q=is%3Aissue+) open with your problem. If you open
|
terrain generation mod. Do not request *specific* compatibility with mods or
|
||||||
a duplicate, it will be closed as such.
|
plugins (e.g. "Compatibility with TechCraft v7"). That should be implemented
|
||||||
- Make sure that it is actually Terra causing the issue, and not another mod/plugin. You can do this by testing to see if you can recreate
|
in an addon, **not** in the platform project.
|
||||||
the issue without Terra installed.
|
*General* compatibility (e.g. "Ability to pull Vanilla/Modded features from
|
||||||
- Double check that this is not an issue with a specific Terra *pack* or Terra *addon*, and instead applies to all of Terra.
|
parent biomes") will be considered in the platform project.
|
||||||
- Include a copy of the latest.log file. Putting *just* the exception is not enough. We need to be able to check that there wasn't anything
|
- Search for
|
||||||
else before that caused it.
|
any [already existing issues](https://github.com/PolyhedralDev/Terra/issues?q=is%3Aissue+)
|
||||||
- Be sure to fill out all the required information and give descriptions of everything.
|
open with your problem. If you open a duplicate, it will be closed as such.
|
||||||
|
- Make sure that it is actually Terra causing the issue, and not another
|
||||||
|
mod/plugin. You can do this by testing to see if you can recreate the issue
|
||||||
|
without Terra installed.
|
||||||
|
- Double check that this is not an issue with a specific Terra *pack* or Terra *
|
||||||
|
addon*, and instead applies to all of Terra.
|
||||||
|
- Include a copy of the latest.log file. Putting *just* the exception is not
|
||||||
|
enough. We need to be able to check that there wasn't anything else before
|
||||||
|
that caused it.
|
||||||
|
- Be sure to fill out all the required information and give descriptions of
|
||||||
|
everything.
|
||||||
|
|
||||||
#### How Do I Submit A (Good) Bug Report?
|
#### How Do I Submit A (Good) Bug Report?
|
||||||
|
|
||||||
Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/)
|
Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/)
|
||||||
. [Create an issue](https://github.com/PolyhedralDev/Terra/issues/new) and provide the prerequisite information by filling in the Bug Report
|
. [Create an issue](https://github.com/PolyhedralDev/Terra/issues/new) and
|
||||||
template.
|
provide the prerequisite information by filling in the Bug Report template.
|
||||||
|
|
||||||
Explain the problem and include additional details to help maintainers reproduce the problem:
|
Explain the problem and include additional details to help maintainers reproduce
|
||||||
|
the problem:
|
||||||
|
|
||||||
- **Use a clear and descriptive title** for the issue to identify the problem.
|
- **Use a clear and descriptive title** for the issue to identify the problem.
|
||||||
- **Describe the exact steps which reproduce the problem** in as many details as possible. When listing steps, **don't just say what you
|
- **Describe the exact steps which reproduce the problem** in as many details as
|
||||||
did, but explain how you did it**.
|
possible. When listing steps, **don't just say what you did, but explain how
|
||||||
|
you did it**.
|
||||||
- **Provide specific examples to demonstrate the steps**.
|
- **Provide specific examples to demonstrate the steps**.
|
||||||
- **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior.
|
- **Describe the behavior you observed after following the steps** and point out
|
||||||
|
what exactly is the problem with that behavior.
|
||||||
- **Explain which behavior you expected to see instead and why.**
|
- **Explain which behavior you expected to see instead and why.**
|
||||||
- **If the problem wasn't triggered by a specific action**, describe what you were doing before the problem happened and share more
|
- **If the problem wasn't triggered by a specific action**, describe what you
|
||||||
information using the guidelines below.
|
were doing before the problem happened and share more information using the
|
||||||
|
guidelines below.
|
||||||
|
|
||||||
Include details about your configuration and environment:
|
Include details about your configuration and environment:
|
||||||
|
|
||||||
- **Which version of Terra are you using?** You can get the exact version by running `/te version`.
|
- **Which version of Terra are you using?** You can get the exact version by
|
||||||
- **What's the name and version of the platform you're using**? (eg. Spigot, Fabric, Paper, etc.)
|
running `/te version`.
|
||||||
|
- **What's the name and version of the platform you're using**? (eg. Spigot,
|
||||||
|
Fabric, Paper, etc.)
|
||||||
- **Which external plugins or mods do you have installed?**
|
- **Which external plugins or mods do you have installed?**
|
||||||
- **Which Terra packs do you have installed?** You can get that list by running `/te packs`.
|
- **Which Terra packs do you have installed?** You can get that list by
|
||||||
- **Which Terra addons do you have installed?** You can get that list by running `/te addons`.
|
running `/te packs`.
|
||||||
|
- **Which Terra addons do you have installed?** You can get that list by
|
||||||
|
running `/te addons`.
|
||||||
|
|
||||||
### Suggesting Enhancements
|
### Suggesting Enhancements
|
||||||
|
|
||||||
This section guides you through submitting an enhancement suggestion for Terra, including completely new features and minor improvements to
|
This section guides you through submitting an enhancement suggestion for Terra,
|
||||||
existing functionality. Following these guidelines helps maintainers and the community understand your suggestion and find related
|
including completely new features and minor improvements to existing
|
||||||
suggestions.
|
functionality. Following these guidelines helps maintainers and the community
|
||||||
|
understand your suggestion and find related suggestions.
|
||||||
|
|
||||||
Before creating enhancement suggestions, please check [this list](#before-submitting-an-enhancement-suggestion) as you might find out that
|
Before creating enhancement suggestions, please
|
||||||
you don't need to create one. When you are creating an enhancement suggestion,
|
check [this list](#before-submitting-an-enhancement-suggestion) as you might
|
||||||
please [include as many details as possible](#how-do-i-submit-a-good-enhancement-suggestion).
|
find out that you don't need to create one. When you are creating an enhancement
|
||||||
|
suggestion,
|
||||||
|
please [include as many details as possible](#how-do-i-submit-a-good-enhancement-suggestion)
|
||||||
|
.
|
||||||
|
|
||||||
#### Before Submitting An Enhancement Suggestion
|
#### Before Submitting An Enhancement Suggestion
|
||||||
|
|
||||||
- You must be on the **LATEST** version of Terra to make sure your feature hasn't been added yet.
|
- You must be on the **LATEST** version of Terra to make sure your feature
|
||||||
- Search for any [already existing issues](https://github.com/PolyhedralDev/Terra/issues?q=is%3Aissue+) (Including closed!) with your
|
hasn't been added yet.
|
||||||
problem. If you open a duplicate, it will be closed as such.
|
- Search for
|
||||||
|
any [already existing issues](https://github.com/PolyhedralDev/Terra/issues?q=is%3Aissue+) (
|
||||||
|
Including closed!) with your problem. If you open a duplicate, it will be
|
||||||
|
closed as such.
|
||||||
- Verify that this is actually within the scope of Terra.
|
- Verify that this is actually within the scope of Terra.
|
||||||
- Be sure that this is not a feature request that should be made for a specific Terra *pack*, and instead applies to all of Terra.
|
- Be sure that this is not a feature request that should be made for a specific
|
||||||
- Be sure that this is not something that should be implemented as a Terra addon, and instead applies to all of Terra.
|
Terra *pack*, and instead applies to all of Terra.
|
||||||
- Make sure that you attach a copy of the latest.log file, if there are any exceptions thrown in the console. Putting *just* the exception
|
- Be sure that this is not something that should be implemented as a Terra
|
||||||
**is not enough**. We need to be able to check that there wasn't anything else before that caused it.
|
addon, and instead applies to all of Terra.
|
||||||
|
- Make sure that you attach a copy of the latest.log file, if there are any
|
||||||
|
exceptions thrown in the console. Putting *just* the exception
|
||||||
|
**is not enough**. We need to be able to check that there wasn't anything else
|
||||||
|
before that caused it.
|
||||||
|
|
||||||
#### How Do I Submit A (Good) Enhancement Suggestion?
|
#### How Do I Submit A (Good) Enhancement Suggestion?
|
||||||
|
|
||||||
Enhancement suggestions are tracked as [GitHub issues](https://guides.github.com/features/issues/). Create an issue on our main repository
|
Enhancement suggestions are tracked
|
||||||
and provide the following information:
|
as [GitHub issues](https://guides.github.com/features/issues/). Create an issue
|
||||||
|
on our platform repository and provide the following information:
|
||||||
|
|
||||||
- **Use a clear and descriptive title** for the issue to identify the suggestion.
|
- **Use a clear and descriptive title** for the issue to identify the
|
||||||
- **Provide a step-by-step description of the suggested enhancement** in as many details as possible.
|
suggestion.
|
||||||
|
- **Provide a step-by-step description of the suggested enhancement** in as many
|
||||||
|
details as possible.
|
||||||
- **Provide specific examples to demonstrate the steps**.
|
- **Provide specific examples to demonstrate the steps**.
|
||||||
- **Describe the current behavior** and **explain which behavior you expected to see instead** and why.
|
- **Describe the current behavior** and **explain which behavior you expected to
|
||||||
- **Explain why this enhancement would be useful** to most Terra users and isn't something that can or should be implemented as an addon.
|
see instead** and why.
|
||||||
|
- **Explain why this enhancement would be useful** to most Terra users and isn't
|
||||||
|
something that can or should be implemented as an addon.
|
||||||
|
|
||||||
### Pull Requests
|
### Pull Requests
|
||||||
|
|
||||||
This section guides you through submitting a pull request for Terra.
|
This section guides you through submitting a pull request for Terra.
|
||||||
|
|
||||||
While the prerequisites above must be satisfied prior to having your pull request reviewed, the reviewer(s) may ask you to complete
|
While the prerequisites above must be satisfied prior to having your pull
|
||||||
additional design work, tests, or other changes before your pull request can be ultimately accepted.
|
request reviewed, the reviewer(s) may ask you to complete additional design
|
||||||
|
work, tests, or other changes before your pull request can be ultimately
|
||||||
|
accepted.
|
||||||
|
|
||||||
#### Before Submitting A Pull Request
|
#### Before Submitting A Pull Request
|
||||||
|
|
||||||
- You must be on the **LATEST** version of Terra to make sure your feature hasn't been added yet.
|
- You must be on the **LATEST** version of Terra to make sure your feature
|
||||||
- Search for any [already existing issues](https://github.com/PolyhedralDev/Terra/issues?q=is%3Aissue+) (Including closed!) with your
|
hasn't been added yet.
|
||||||
problem. If you open a duplicate, it will be closed as such.
|
- Search for
|
||||||
|
any [already existing issues](https://github.com/PolyhedralDev/Terra/issues?q=is%3Aissue+) (
|
||||||
|
Including closed!) with your problem. If you open a duplicate, it will be
|
||||||
|
closed as such.
|
||||||
- Verify that this is actually within the scope of Terra.
|
- Verify that this is actually within the scope of Terra.
|
||||||
- Be sure that this is not a feature request that should be made for a specific Terra *pack*, and instead applies to all of Terra.
|
- Be sure that this is not a feature request that should be made for a specific
|
||||||
- Be sure that this is not something that should be implemented as a Terra addon, and instead applies to all of Terra.
|
Terra *pack*, and instead applies to all of Terra.
|
||||||
- Make sure that you attach a copy of the latest.log file, if there are any exceptions thrown in the console. Putting *just* the
|
- Be sure that this is not something that should be implemented as a Terra
|
||||||
exception **is not enough**. We need to be able to check that there wasn't anything else before that caused it.
|
addon, and instead applies to all of Terra.
|
||||||
|
- Make sure that you attach a copy of the latest.log file, if there are any
|
||||||
|
exceptions thrown in the console. Putting *just* the exception **is not
|
||||||
|
enough**. We need to be able to check that there wasn't anything else before
|
||||||
|
that caused it.
|
||||||
|
|
||||||
#### How Do I Submit A (Good) Pull Request?
|
#### How Do I Submit A (Good) Pull Request?
|
||||||
|
|
||||||
Pull Requests are tracked as [GitHub Pull Requests](https://guides.github.com/activities/forking/#making-a-pull-request). Create a pr on our
|
Pull Requests are tracked
|
||||||
main repository and provide the following information:
|
as [GitHub Pull Requests](https://guides.github.com/activities/forking/#making-a-pull-request)
|
||||||
|
. Create a pr on our platform repository and provide the following information:
|
||||||
|
|
||||||
- **Use a clear and descriptive title** to identify the pull request.
|
- **Use a clear and descriptive title** to identify the pull request.
|
||||||
- **State what this pull request adds/fixes**.
|
- **State what this pull request adds/fixes**.
|
||||||
- **Be sure that you are the owner of the code you contributed** or that it can be licensed under the GPLv3.
|
- **Be sure that you are the owner of the code you contributed** or that it can
|
||||||
- **Provide a description goals and non-goals of the pull request** in as many details as possible.
|
be licensed under the GPLv3.
|
||||||
- **Describe the current behavior** and **explain which behavior you expected to see instead** and why.
|
- **Provide a description goals and non-goals of the pull request** in as many
|
||||||
- **Explain why this enhancement would be useful** to most Terra users and isn't something that can or should be implemented as an addon.
|
details as possible.
|
||||||
|
- **Describe the current behavior** and **explain which behavior you expected to
|
||||||
|
see instead** and why.
|
||||||
|
- **Explain why this enhancement would be useful** to most Terra users and isn't
|
||||||
|
something that can or should be implemented as an addon.
|
||||||
|
|
||||||
## Styleguides
|
## Styleguides
|
||||||
|
|
||||||
### Git Commits
|
### Git Commits
|
||||||
|
|
||||||
Following this is not mandatory, but rather a set of guidelines. As long as your commit messages aren't absolutely awful, it's probably
|
Following this is not mandatory, but rather a set of guidelines. As long as your
|
||||||
fine. But it would be nice if you followed them.
|
commit messages aren't absolutely awful, it's probably fine. But it would be
|
||||||
|
nice if you followed them.
|
||||||
|
|
||||||
#### Committing
|
#### Committing
|
||||||
|
|
||||||
When you commit code, try to avoid committing large amounts of code in a single go. Splitting up code into smaller commits is much nicer and
|
When you commit code, try to avoid committing large amounts of code in a single
|
||||||
makes it easier to trace a feature to a single commit.
|
go. Splitting up code into smaller commits is much nicer and makes it easier to
|
||||||
|
trace a feature to a single commit.
|
||||||
|
|
||||||
Try to stick to one feature/fix/etc. per commit. A good rule of thumb is if you need to use the word "and" in the subject line, then it
|
Try to stick to one feature/fix/etc. per commit. A good rule of thumb is if you
|
||||||
should probably™ be two commits.
|
need to use the word "and" in the subject line, then it should probably™ be two
|
||||||
|
commits.
|
||||||
|
|
||||||
#### Git Commit Messages
|
#### Git Commit Messages
|
||||||
|
|
||||||
- Subject line must fit the following format: `<type>: <short summary>`. Type must be one of the following:
|
- Subject line must fit the following format: `<type>: <short summary>`. Type
|
||||||
|
must be one of the following:
|
||||||
- Build: Changes that affect the build system or external dependencies.
|
- Build: Changes that affect the build system or external dependencies.
|
||||||
- Docs: Documentation only changes.
|
- Docs: Documentation only changes.
|
||||||
- Feat: A new feature.
|
- Feat: A new feature.
|
||||||
- Fix: A bug fix.
|
- Fix: A bug fix.
|
||||||
- Perf: Performance improvements.
|
- Perf: Performance improvements.
|
||||||
- Refactor: Refactoring sections of the codebase.
|
- Refactor: Refactoring sections of the codebase.
|
||||||
- Repo: Changes to the repository structure that do not affect code. (Eg. modification of the `README.md` file, etc.)
|
- Repo: Changes to the repository structure that do not affect code. (Eg.
|
||||||
|
modification of the `README.md` file, etc.)
|
||||||
- Revert: Revert a previous commit.
|
- Revert: Revert a previous commit.
|
||||||
- Style: Code style updates.
|
- Style: Code style updates.
|
||||||
- Test: Anything related to testing.
|
- Test: Anything related to testing.
|
||||||
@ -266,7 +332,8 @@ should probably™ be two commits.
|
|||||||
|
|
||||||
### Code Styleguide
|
### Code Styleguide
|
||||||
|
|
||||||
Use an IDE with support for `.editorconfig` files. There is an included editorconfig file in the base of the project so that your IDE should
|
Use an IDE with support for `.editorconfig` files. There is an included
|
||||||
|
editorconfig file in the base of the project so that your IDE should
|
||||||
automatically use the correct code style settings.
|
automatically use the correct code style settings.
|
||||||
|
|
||||||
### Documentation Styleguide
|
### Documentation Styleguide
|
||||||
@ -279,41 +346,56 @@ TODO
|
|||||||
|
|
||||||
#### General Compatibility
|
#### General Compatibility
|
||||||
|
|
||||||
General compatibility (example: injection of Vanilla structures/features/carvers into packs) is acceptable in the main project.
|
General compatibility (example: injection of Vanilla structures/features/carvers
|
||||||
|
into packs) is acceptable in the platform project.
|
||||||
|
|
||||||
- General compatibility features should be *disabled by default*. Having things auto-injected causes unpredictable behaviour that is
|
- General compatibility features should be *disabled by default*. Having things
|
||||||
annoying to diagnose. General-compatibility options should have config values attached which are disabled by default.
|
auto-injected causes unpredictable behaviour that is annoying to diagnose.
|
||||||
- These config options should also be *simple to use*. Think of the people who will be using these compatibility options. They want to flick
|
General-compatibility options should have config values attached which are
|
||||||
a switch and have things be compatible. That means that a majority of compatibility options should stay in `pack.yml`, to make it simple
|
disabled by default.
|
||||||
to go into a pack and turn on specific compatibilities. This does *not* mean that more advanced compatibility options are off the table,
|
- These config options should also be *simple to use*. Think of the people who
|
||||||
for example, look at Feature compatibility, where features can either be automatically injected, *or* configured individually per Terra
|
will be using these compatibility options. They want to flick a switch and
|
||||||
biome, depending on how much control the user wants.
|
have things be compatible. That means that a majority of compatibility options
|
||||||
|
should stay in `pack.yml`, to make it simple to go into a pack and turn on
|
||||||
|
specific compatibilities. This does *not* mean that more advanced
|
||||||
|
compatibility options are off the table, for example, look at Feature
|
||||||
|
compatibility, where features can either be automatically injected, *or*
|
||||||
|
configured individually per Terra biome, depending on how much control the
|
||||||
|
user wants.
|
||||||
|
|
||||||
#### Specific Compatibility
|
#### Specific Compatibility
|
||||||
|
|
||||||
Specific compatibility should *not* be put in the main project. (Example: Adding the ability to generate TechCraft v7's doo-dads with a
|
Specific compatibility should *not* be put in the platform project. (Example:
|
||||||
TerraScript function)
|
Adding the ability to generate TechCraft v7's doo-dads with a TerraScript
|
||||||
|
function)
|
||||||
|
|
||||||
Having specific compatibilities leads to tons of extra dependencies to keep track of, as well as adding lots of additional stuff to
|
Having specific compatibilities leads to tons of extra dependencies to keep
|
||||||
maintain. It quickly becomes a mess. Especially when most users will never need to use this feature.
|
track of, as well as adding lots of additional stuff to maintain. It quickly
|
||||||
|
becomes a mess. Especially when most users will never need to use this feature.
|
||||||
|
|
||||||
We have designed an addon API for exactly this purpose. **Specific compatibilities are welcome and encouraged, in the form of addons.**
|
We have designed an addon API for exactly this purpose. **Specific
|
||||||
|
compatibilities are welcome and encouraged, in the form of addons.**
|
||||||
|
|
||||||
### Platform-Agnostic Design
|
### Platform-Agnostic Design
|
||||||
|
|
||||||
Terra must, at all times, remain platform agnostic. This means it must be able to run on theoretically any voxel based platform. Including
|
Terra must, at all times, remain platform agnostic. This means it must be able
|
||||||
non-minecraft games like Terasology.
|
to run on theoretically any voxel based platform. Including non-minecraft games
|
||||||
|
like Terasology.
|
||||||
|
|
||||||
When adding a new feature to `common`, make no assumptions about what platform it'll be running on.
|
When adding a new feature to `common`, make no assumptions about what platform
|
||||||
|
it'll be running on.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
- Don't assume the world height is 256.
|
- Don't assume the world height is 256.
|
||||||
- Don't assume that a specific block, item, or entity exists. (Eg. don't assume there exists a block called `minecraft:grass_block`)
|
- Don't assume that a specific block, item, or entity exists. (Eg. don't assume
|
||||||
|
there exists a block called `minecraft:grass_block`)
|
||||||
|
|
||||||
### Data-Driven
|
### Data-Driven
|
||||||
|
|
||||||
When adding a new feature, make it abstract. Don't make assumptions about "specific use cases." If you can only think of a few use cases,
|
When adding a new feature, make it abstract. Don't make assumptions about "
|
||||||
your idea should probably be generalized.
|
specific use cases." If you can only think of a few use cases, your idea should
|
||||||
|
probably be generalized.
|
||||||
|
|
||||||
You must use configs effectively. Make configs that are *powerful* but also *make sense* and are \[easy\] to use.
|
You must use configs effectively. Make configs that are *powerful* but also *
|
||||||
|
make sense* and are \[easy\] to use.
|
695
LICENSE
695
LICENSE
@ -1,674 +1,21 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
MIT License
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
Copyright (c) 2020-2021 Polyhedral Development
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this license document, but changing it is not allowed.
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
Preamble
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
The GNU General Public License is a free, copyleft license for
|
furnished to do so, subject to the following conditions:
|
||||||
software and other kinds of works.
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
The licenses for most software and other practical works are designed
|
copies or substantial portions of the Software.
|
||||||
to take away your freedom to share and change the works. By contrast,
|
|
||||||
the GNU General Public License is intended to guarantee your freedom to
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
share and change all versions of a program--to make sure it remains free
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
software for all its users. We, the Free Software Foundation, use the
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
GNU General Public License for most of our software; it applies also to
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
any other work released this way by its authors. You can apply it to
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
your programs, too.
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
them if you wish), that you receive source code or can get it if you
|
|
||||||
want it, that you can change the software or use pieces of it in new
|
|
||||||
free programs, and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to prevent others from denying you
|
|
||||||
these rights or asking you to surrender the rights. Therefore, you have
|
|
||||||
certain responsibilities if you distribute copies of the software, or if
|
|
||||||
you modify it: responsibilities to respect the freedom of others.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must pass on to the recipients the same
|
|
||||||
freedoms that you received. You must make sure that they, too, receive
|
|
||||||
or can get the source code. And you must show them these terms so they
|
|
||||||
know their rights.
|
|
||||||
|
|
||||||
Developers that use the GNU GPL protect your rights with two steps:
|
|
||||||
(1) assert copyright on the software, and (2) offer you this License
|
|
||||||
giving you legal permission to copy, distribute and/or modify it.
|
|
||||||
|
|
||||||
For the developers' and authors' protection, the GPL clearly explains
|
|
||||||
that there is no warranty for this free software. For both users' and
|
|
||||||
authors' sake, the GPL requires that modified versions be marked as
|
|
||||||
changed, so that their problems will not be attributed erroneously to
|
|
||||||
authors of previous versions.
|
|
||||||
|
|
||||||
Some devices are designed to deny users access to install or run
|
|
||||||
modified versions of the software inside them, although the manufacturer
|
|
||||||
can do so. This is fundamentally incompatible with the aim of
|
|
||||||
protecting users' freedom to change the software. The systematic
|
|
||||||
pattern of such abuse occurs in the area of products for individuals to
|
|
||||||
use, which is precisely where it is most unacceptable. Therefore, we
|
|
||||||
have designed this version of the GPL to prohibit the practice for those
|
|
||||||
products. If such problems arise substantially in other domains, we
|
|
||||||
stand ready to extend this provision to those domains in future versions
|
|
||||||
of the GPL, as needed to protect the freedom of users.
|
|
||||||
|
|
||||||
Finally, every program is threatened constantly by software patents.
|
|
||||||
States should not allow patents to restrict development and use of
|
|
||||||
software on general-purpose computers, but in those that do, we wish to
|
|
||||||
avoid the special danger that patents applied to a free program could
|
|
||||||
make it effectively proprietary. To prevent this, the GPL assures that
|
|
||||||
patents cannot be used to render the program non-free.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
0. Definitions.
|
|
||||||
|
|
||||||
"This License" refers to version 3 of the GNU General Public License.
|
|
||||||
|
|
||||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
|
||||||
works, such as semiconductor masks.
|
|
||||||
|
|
||||||
"The Program" refers to any copyrightable work licensed under this
|
|
||||||
License. Each licensee is addressed as "you". "Licensees" and
|
|
||||||
"recipients" may be individuals or organizations.
|
|
||||||
|
|
||||||
To "modify" a work means to copy from or adapt all or part of the work
|
|
||||||
in a fashion requiring copyright permission, other than the making of an
|
|
||||||
exact copy. The resulting work is called a "modified version" of the
|
|
||||||
earlier work or a work "based on" the earlier work.
|
|
||||||
|
|
||||||
A "covered work" means either the unmodified Program or a work based
|
|
||||||
on the Program.
|
|
||||||
|
|
||||||
To "propagate" a work means to do anything with it that, without
|
|
||||||
permission, would make you directly or secondarily liable for
|
|
||||||
infringement under applicable copyright law, except executing it on a
|
|
||||||
computer or modifying a private copy. Propagation includes copying,
|
|
||||||
distribution (with or without modification), making available to the
|
|
||||||
public, and in some countries other activities as well.
|
|
||||||
|
|
||||||
To "convey" a work means any kind of propagation that enables other
|
|
||||||
parties to make or receive copies. Mere interaction with a user through
|
|
||||||
a computer network, with no transfer of a copy, is not conveying.
|
|
||||||
|
|
||||||
An interactive user interface displays "Appropriate Legal Notices"
|
|
||||||
to the extent that it includes a convenient and prominently visible
|
|
||||||
feature that (1) displays an appropriate copyright notice, and (2)
|
|
||||||
tells the user that there is no warranty for the work (except to the
|
|
||||||
extent that warranties are provided), that licensees may convey the
|
|
||||||
work under this License, and how to view a copy of this License. If
|
|
||||||
the interface presents a list of user commands or options, such as a
|
|
||||||
menu, a prominent item in the list meets this criterion.
|
|
||||||
|
|
||||||
1. Source Code.
|
|
||||||
|
|
||||||
The "source code" for a work means the preferred form of the work
|
|
||||||
for making modifications to it. "Object code" means any non-source
|
|
||||||
form of a work.
|
|
||||||
|
|
||||||
A "Standard Interface" means an interface that either is an official
|
|
||||||
standard defined by a recognized standards body, or, in the case of
|
|
||||||
interfaces specified for a particular programming language, one that
|
|
||||||
is widely used among developers working in that language.
|
|
||||||
|
|
||||||
The "System Libraries" of an executable work include anything, other
|
|
||||||
than the work as a whole, that (a) is included in the normal form of
|
|
||||||
packaging a Major Component, but which is not part of that Major
|
|
||||||
Component, and (b) serves only to enable use of the work with that
|
|
||||||
Major Component, or to implement a Standard Interface for which an
|
|
||||||
implementation is available to the public in source code form. A
|
|
||||||
"Major Component", in this context, means a major essential component
|
|
||||||
(kernel, window system, and so on) of the specific operating system
|
|
||||||
(if any) on which the executable work runs, or a compiler used to
|
|
||||||
produce the work, or an object code interpreter used to run it.
|
|
||||||
|
|
||||||
The "Corresponding Source" for a work in object code form means all
|
|
||||||
the source code needed to generate, install, and (for an executable
|
|
||||||
work) run the object code and to modify the work, including scripts to
|
|
||||||
control those activities. However, it does not include the work's
|
|
||||||
System Libraries, or general-purpose tools or generally available free
|
|
||||||
programs which are used unmodified in performing those activities but
|
|
||||||
which are not part of the work. For example, Corresponding Source
|
|
||||||
includes interface definition files associated with source files for
|
|
||||||
the work, and the source code for shared libraries and dynamically
|
|
||||||
linked subprograms that the work is specifically designed to require,
|
|
||||||
such as by intimate data communication or control flow between those
|
|
||||||
subprograms and other parts of the work.
|
|
||||||
|
|
||||||
The Corresponding Source need not include anything that users
|
|
||||||
can regenerate automatically from other parts of the Corresponding
|
|
||||||
Source.
|
|
||||||
|
|
||||||
The Corresponding Source for a work in source code form is that
|
|
||||||
same work.
|
|
||||||
|
|
||||||
2. Basic Permissions.
|
|
||||||
|
|
||||||
All rights granted under this License are granted for the term of
|
|
||||||
copyright on the Program, and are irrevocable provided the stated
|
|
||||||
conditions are met. This License explicitly affirms your unlimited
|
|
||||||
permission to run the unmodified Program. The output from running a
|
|
||||||
covered work is covered by this License only if the output, given its
|
|
||||||
content, constitutes a covered work. This License acknowledges your
|
|
||||||
rights of fair use or other equivalent, as provided by copyright law.
|
|
||||||
|
|
||||||
You may make, run and propagate covered works that you do not
|
|
||||||
convey, without conditions so long as your license otherwise remains
|
|
||||||
in force. You may convey covered works to others for the sole purpose
|
|
||||||
of having them make modifications exclusively for you, or provide you
|
|
||||||
with facilities for running those works, provided that you comply with
|
|
||||||
the terms of this License in conveying all material for which you do
|
|
||||||
not control copyright. Those thus making or running the covered works
|
|
||||||
for you must do so exclusively on your behalf, under your direction
|
|
||||||
and control, on terms that prohibit them from making any copies of
|
|
||||||
your copyrighted material outside their relationship with you.
|
|
||||||
|
|
||||||
Conveying under any other circumstances is permitted solely under
|
|
||||||
the conditions stated below. Sublicensing is not allowed; section 10
|
|
||||||
makes it unnecessary.
|
|
||||||
|
|
||||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
|
||||||
|
|
||||||
No covered work shall be deemed part of an effective technological
|
|
||||||
measure under any applicable law fulfilling obligations under article
|
|
||||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
|
||||||
similar laws prohibiting or restricting circumvention of such
|
|
||||||
measures.
|
|
||||||
|
|
||||||
When you convey a covered work, you waive any legal power to forbid
|
|
||||||
circumvention of technological measures to the extent such circumvention
|
|
||||||
is effected by exercising rights under this License with respect to
|
|
||||||
the covered work, and you disclaim any intention to limit operation or
|
|
||||||
modification of the work as a means of enforcing, against the work's
|
|
||||||
users, your or third parties' legal rights to forbid circumvention of
|
|
||||||
technological measures.
|
|
||||||
|
|
||||||
4. Conveying Verbatim Copies.
|
|
||||||
|
|
||||||
You may convey verbatim copies of the Program's source code as you
|
|
||||||
receive it, in any medium, provided that you conspicuously and
|
|
||||||
appropriately publish on each copy an appropriate copyright notice;
|
|
||||||
keep intact all notices stating that this License and any
|
|
||||||
non-permissive terms added in accord with section 7 apply to the code;
|
|
||||||
keep intact all notices of the absence of any warranty; and give all
|
|
||||||
recipients a copy of this License along with the Program.
|
|
||||||
|
|
||||||
You may charge any price or no price for each copy that you convey,
|
|
||||||
and you may offer support or warranty protection for a fee.
|
|
||||||
|
|
||||||
5. Conveying Modified Source Versions.
|
|
||||||
|
|
||||||
You may convey a work based on the Program, or the modifications to
|
|
||||||
produce it from the Program, in the form of source code under the
|
|
||||||
terms of section 4, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The work must carry prominent notices stating that you modified
|
|
||||||
it, and giving a relevant date.
|
|
||||||
|
|
||||||
b) The work must carry prominent notices stating that it is
|
|
||||||
released under this License and any conditions added under section
|
|
||||||
7. This requirement modifies the requirement in section 4 to
|
|
||||||
"keep intact all notices".
|
|
||||||
|
|
||||||
c) You must license the entire work, as a whole, under this
|
|
||||||
License to anyone who comes into possession of a copy. This
|
|
||||||
License will therefore apply, along with any applicable section 7
|
|
||||||
additional terms, to the whole of the work, and all its parts,
|
|
||||||
regardless of how they are packaged. This License gives no
|
|
||||||
permission to license the work in any other way, but it does not
|
|
||||||
invalidate such permission if you have separately received it.
|
|
||||||
|
|
||||||
d) If the work has interactive user interfaces, each must display
|
|
||||||
Appropriate Legal Notices; however, if the Program has interactive
|
|
||||||
interfaces that do not display Appropriate Legal Notices, your
|
|
||||||
work need not make them do so.
|
|
||||||
|
|
||||||
A compilation of a covered work with other separate and independent
|
|
||||||
works, which are not by their nature extensions of the covered work,
|
|
||||||
and which are not combined with it such as to form a larger program,
|
|
||||||
in or on a volume of a storage or distribution medium, is called an
|
|
||||||
"aggregate" if the compilation and its resulting copyright are not
|
|
||||||
used to limit the access or legal rights of the compilation's users
|
|
||||||
beyond what the individual works permit. Inclusion of a covered work
|
|
||||||
in an aggregate does not cause this License to apply to the other
|
|
||||||
parts of the aggregate.
|
|
||||||
|
|
||||||
6. Conveying Non-Source Forms.
|
|
||||||
|
|
||||||
You may convey a covered work in object code form under the terms
|
|
||||||
of sections 4 and 5, provided that you also convey the
|
|
||||||
machine-readable Corresponding Source under the terms of this License,
|
|
||||||
in one of these ways:
|
|
||||||
|
|
||||||
a) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by the
|
|
||||||
Corresponding Source fixed on a durable physical medium
|
|
||||||
customarily used for software interchange.
|
|
||||||
|
|
||||||
b) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by a
|
|
||||||
written offer, valid for at least three years and valid for as
|
|
||||||
long as you offer spare parts or customer support for that product
|
|
||||||
model, to give anyone who possesses the object code either (1) a
|
|
||||||
copy of the Corresponding Source for all the software in the
|
|
||||||
product that is covered by this License, on a durable physical
|
|
||||||
medium customarily used for software interchange, for a price no
|
|
||||||
more than your reasonable cost of physically performing this
|
|
||||||
conveying of source, or (2) access to copy the
|
|
||||||
Corresponding Source from a network server at no charge.
|
|
||||||
|
|
||||||
c) Convey individual copies of the object code with a copy of the
|
|
||||||
written offer to provide the Corresponding Source. This
|
|
||||||
alternative is allowed only occasionally and noncommercially, and
|
|
||||||
only if you received the object code with such an offer, in accord
|
|
||||||
with subsection 6b.
|
|
||||||
|
|
||||||
d) Convey the object code by offering access from a designated
|
|
||||||
place (gratis or for a charge), and offer equivalent access to the
|
|
||||||
Corresponding Source in the same way through the same place at no
|
|
||||||
further charge. You need not require recipients to copy the
|
|
||||||
Corresponding Source along with the object code. If the place to
|
|
||||||
copy the object code is a network server, the Corresponding Source
|
|
||||||
may be on a different server (operated by you or a third party)
|
|
||||||
that supports equivalent copying facilities, provided you maintain
|
|
||||||
clear directions next to the object code saying where to find the
|
|
||||||
Corresponding Source. Regardless of what server hosts the
|
|
||||||
Corresponding Source, you remain obligated to ensure that it is
|
|
||||||
available for as long as needed to satisfy these requirements.
|
|
||||||
|
|
||||||
e) Convey the object code using peer-to-peer transmission, provided
|
|
||||||
you inform other peers where the object code and Corresponding
|
|
||||||
Source of the work are being offered to the general public at no
|
|
||||||
charge under subsection 6d.
|
|
||||||
|
|
||||||
A separable portion of the object code, whose source code is excluded
|
|
||||||
from the Corresponding Source as a System Library, need not be
|
|
||||||
included in conveying the object code work.
|
|
||||||
|
|
||||||
A "User Product" is either (1) a "consumer product", which means any
|
|
||||||
tangible personal property which is normally used for personal, family,
|
|
||||||
or household purposes, or (2) anything designed or sold for incorporation
|
|
||||||
into a dwelling. In determining whether a product is a consumer product,
|
|
||||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
|
||||||
product received by a particular user, "normally used" refers to a
|
|
||||||
typical or common use of that class of product, regardless of the status
|
|
||||||
of the particular user or of the way in which the particular user
|
|
||||||
actually uses, or expects or is expected to use, the product. A product
|
|
||||||
is a consumer product regardless of whether the product has substantial
|
|
||||||
commercial, industrial or non-consumer uses, unless such uses represent
|
|
||||||
the only significant mode of use of the product.
|
|
||||||
|
|
||||||
"Installation Information" for a User Product means any methods,
|
|
||||||
procedures, authorization keys, or other information required to install
|
|
||||||
and execute modified versions of a covered work in that User Product from
|
|
||||||
a modified version of its Corresponding Source. The information must
|
|
||||||
suffice to ensure that the continued functioning of the modified object
|
|
||||||
code is in no case prevented or interfered with solely because
|
|
||||||
modification has been made.
|
|
||||||
|
|
||||||
If you convey an object code work under this section in, or with, or
|
|
||||||
specifically for use in, a User Product, and the conveying occurs as
|
|
||||||
part of a transaction in which the right of possession and use of the
|
|
||||||
User Product is transferred to the recipient in perpetuity or for a
|
|
||||||
fixed term (regardless of how the transaction is characterized), the
|
|
||||||
Corresponding Source conveyed under this section must be accompanied
|
|
||||||
by the Installation Information. But this requirement does not apply
|
|
||||||
if neither you nor any third party retains the ability to install
|
|
||||||
modified object code on the User Product (for example, the work has
|
|
||||||
been installed in ROM).
|
|
||||||
|
|
||||||
The requirement to provide Installation Information does not include a
|
|
||||||
requirement to continue to provide support service, warranty, or updates
|
|
||||||
for a work that has been modified or installed by the recipient, or for
|
|
||||||
the User Product in which it has been modified or installed. Access to a
|
|
||||||
network may be denied when the modification itself materially and
|
|
||||||
adversely affects the operation of the network or violates the rules and
|
|
||||||
protocols for communication across the network.
|
|
||||||
|
|
||||||
Corresponding Source conveyed, and Installation Information provided,
|
|
||||||
in accord with this section must be in a format that is publicly
|
|
||||||
documented (and with an implementation available to the public in
|
|
||||||
source code form), and must require no special password or key for
|
|
||||||
unpacking, reading or copying.
|
|
||||||
|
|
||||||
7. Additional Terms.
|
|
||||||
|
|
||||||
"Additional permissions" are terms that supplement the terms of this
|
|
||||||
License by making exceptions from one or more of its conditions.
|
|
||||||
Additional permissions that are applicable to the entire Program shall
|
|
||||||
be treated as though they were included in this License, to the extent
|
|
||||||
that they are valid under applicable law. If additional permissions
|
|
||||||
apply only to part of the Program, that part may be used separately
|
|
||||||
under those permissions, but the entire Program remains governed by
|
|
||||||
this License without regard to the additional permissions.
|
|
||||||
|
|
||||||
When you convey a copy of a covered work, you may at your option
|
|
||||||
remove any additional permissions from that copy, or from any part of
|
|
||||||
it. (Additional permissions may be written to require their own
|
|
||||||
removal in certain cases when you modify the work.) You may place
|
|
||||||
additional permissions on material, added by you to a covered work,
|
|
||||||
for which you have or can give appropriate copyright permission.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, for material you
|
|
||||||
add to a covered work, you may (if authorized by the copyright holders of
|
|
||||||
that material) supplement the terms of this License with terms:
|
|
||||||
|
|
||||||
a) Disclaiming warranty or limiting liability differently from the
|
|
||||||
terms of sections 15 and 16 of this License; or
|
|
||||||
|
|
||||||
b) Requiring preservation of specified reasonable legal notices or
|
|
||||||
author attributions in that material or in the Appropriate Legal
|
|
||||||
Notices displayed by works containing it; or
|
|
||||||
|
|
||||||
c) Prohibiting misrepresentation of the origin of that material, or
|
|
||||||
requiring that modified versions of such material be marked in
|
|
||||||
reasonable ways as different from the original version; or
|
|
||||||
|
|
||||||
d) Limiting the use for publicity purposes of names of licensors or
|
|
||||||
authors of the material; or
|
|
||||||
|
|
||||||
e) Declining to grant rights under trademark law for use of some
|
|
||||||
trade names, trademarks, or service marks; or
|
|
||||||
|
|
||||||
f) Requiring indemnification of licensors and authors of that
|
|
||||||
material by anyone who conveys the material (or modified versions of
|
|
||||||
it) with contractual assumptions of liability to the recipient, for
|
|
||||||
any liability that these contractual assumptions directly impose on
|
|
||||||
those licensors and authors.
|
|
||||||
|
|
||||||
All other non-permissive additional terms are considered "further
|
|
||||||
restrictions" within the meaning of section 10. If the Program as you
|
|
||||||
received it, or any part of it, contains a notice stating that it is
|
|
||||||
governed by this License along with a term that is a further
|
|
||||||
restriction, you may remove that term. If a license document contains
|
|
||||||
a further restriction but permits relicensing or conveying under this
|
|
||||||
License, you may add to a covered work material governed by the terms
|
|
||||||
of that license document, provided that the further restriction does
|
|
||||||
not survive such relicensing or conveying.
|
|
||||||
|
|
||||||
If you add terms to a covered work in accord with this section, you
|
|
||||||
must place, in the relevant source files, a statement of the
|
|
||||||
additional terms that apply to those files, or a notice indicating
|
|
||||||
where to find the applicable terms.
|
|
||||||
|
|
||||||
Additional terms, permissive or non-permissive, may be stated in the
|
|
||||||
form of a separately written license, or stated as exceptions;
|
|
||||||
the above requirements apply either way.
|
|
||||||
|
|
||||||
8. Termination.
|
|
||||||
|
|
||||||
You may not propagate or modify a covered work except as expressly
|
|
||||||
provided under this License. Any attempt otherwise to propagate or
|
|
||||||
modify it is void, and will automatically terminate your rights under
|
|
||||||
this License (including any patent licenses granted under the third
|
|
||||||
paragraph of section 11).
|
|
||||||
|
|
||||||
However, if you cease all violation of this License, then your
|
|
||||||
license from a particular copyright holder is reinstated (a)
|
|
||||||
provisionally, unless and until the copyright holder explicitly and
|
|
||||||
finally terminates your license, and (b) permanently, if the copyright
|
|
||||||
holder fails to notify you of the violation by some reasonable means
|
|
||||||
prior to 60 days after the cessation.
|
|
||||||
|
|
||||||
Moreover, your license from a particular copyright holder is
|
|
||||||
reinstated permanently if the copyright holder notifies you of the
|
|
||||||
violation by some reasonable means, this is the first time you have
|
|
||||||
received notice of violation of this License (for any work) from that
|
|
||||||
copyright holder, and you cure the violation prior to 30 days after
|
|
||||||
your receipt of the notice.
|
|
||||||
|
|
||||||
Termination of your rights under this section does not terminate the
|
|
||||||
licenses of parties who have received copies or rights from you under
|
|
||||||
this License. If your rights have been terminated and not permanently
|
|
||||||
reinstated, you do not qualify to receive new licenses for the same
|
|
||||||
material under section 10.
|
|
||||||
|
|
||||||
9. Acceptance Not Required for Having Copies.
|
|
||||||
|
|
||||||
You are not required to accept this License in order to receive or
|
|
||||||
run a copy of the Program. Ancillary propagation of a covered work
|
|
||||||
occurring solely as a consequence of using peer-to-peer transmission
|
|
||||||
to receive a copy likewise does not require acceptance. However,
|
|
||||||
nothing other than this License grants you permission to propagate or
|
|
||||||
modify any covered work. These actions infringe copyright if you do
|
|
||||||
not accept this License. Therefore, by modifying or propagating a
|
|
||||||
covered work, you indicate your acceptance of this License to do so.
|
|
||||||
|
|
||||||
10. Automatic Licensing of Downstream Recipients.
|
|
||||||
|
|
||||||
Each time you convey a covered work, the recipient automatically
|
|
||||||
receives a license from the original licensors, to run, modify and
|
|
||||||
propagate that work, subject to this License. You are not responsible
|
|
||||||
for enforcing compliance by third parties with this License.
|
|
||||||
|
|
||||||
An "entity transaction" is a transaction transferring control of an
|
|
||||||
organization, or substantially all assets of one, or subdividing an
|
|
||||||
organization, or merging organizations. If propagation of a covered
|
|
||||||
work results from an entity transaction, each party to that
|
|
||||||
transaction who receives a copy of the work also receives whatever
|
|
||||||
licenses to the work the party's predecessor in interest had or could
|
|
||||||
give under the previous paragraph, plus a right to possession of the
|
|
||||||
Corresponding Source of the work from the predecessor in interest, if
|
|
||||||
the predecessor has it or can get it with reasonable efforts.
|
|
||||||
|
|
||||||
You may not impose any further restrictions on the exercise of the
|
|
||||||
rights granted or affirmed under this License. For example, you may
|
|
||||||
not impose a license fee, royalty, or other charge for exercise of
|
|
||||||
rights granted under this License, and you may not initiate litigation
|
|
||||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
|
||||||
any patent claim is infringed by making, using, selling, offering for
|
|
||||||
sale, or importing the Program or any portion of it.
|
|
||||||
|
|
||||||
11. Patents.
|
|
||||||
|
|
||||||
A "contributor" is a copyright holder who authorizes use under this
|
|
||||||
License of the Program or a work on which the Program is based. The
|
|
||||||
work thus licensed is called the contributor's "contributor version".
|
|
||||||
|
|
||||||
A contributor's "essential patent claims" are all patent claims
|
|
||||||
owned or controlled by the contributor, whether already acquired or
|
|
||||||
hereafter acquired, that would be infringed by some manner, permitted
|
|
||||||
by this License, of making, using, or selling its contributor version,
|
|
||||||
but do not include claims that would be infringed only as a
|
|
||||||
consequence of further modification of the contributor version. For
|
|
||||||
purposes of this definition, "control" includes the right to grant
|
|
||||||
patent sublicenses in a manner consistent with the requirements of
|
|
||||||
this License.
|
|
||||||
|
|
||||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
|
||||||
patent license under the contributor's essential patent claims, to
|
|
||||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
|
||||||
propagate the contents of its contributor version.
|
|
||||||
|
|
||||||
In the following three paragraphs, a "patent license" is any express
|
|
||||||
agreement or commitment, however denominated, not to enforce a patent
|
|
||||||
(such as an express permission to practice a patent or covenant not to
|
|
||||||
sue for patent infringement). To "grant" such a patent license to a
|
|
||||||
party means to make such an agreement or commitment not to enforce a
|
|
||||||
patent against the party.
|
|
||||||
|
|
||||||
If you convey a covered work, knowingly relying on a patent license,
|
|
||||||
and the Corresponding Source of the work is not available for anyone
|
|
||||||
to copy, free of charge and under the terms of this License, through a
|
|
||||||
publicly available network server or other readily accessible means,
|
|
||||||
then you must either (1) cause the Corresponding Source to be so
|
|
||||||
available, or (2) arrange to deprive yourself of the benefit of the
|
|
||||||
patent license for this particular work, or (3) arrange, in a manner
|
|
||||||
consistent with the requirements of this License, to extend the patent
|
|
||||||
license to downstream recipients. "Knowingly relying" means you have
|
|
||||||
actual knowledge that, but for the patent license, your conveying the
|
|
||||||
covered work in a country, or your recipient's use of the covered work
|
|
||||||
in a country, would infringe one or more identifiable patents in that
|
|
||||||
country that you have reason to believe are valid.
|
|
||||||
|
|
||||||
If, pursuant to or in connection with a single transaction or
|
|
||||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
|
||||||
covered work, and grant a patent license to some of the parties
|
|
||||||
receiving the covered work authorizing them to use, propagate, modify
|
|
||||||
or convey a specific copy of the covered work, then the patent license
|
|
||||||
you grant is automatically extended to all recipients of the covered
|
|
||||||
work and works based on it.
|
|
||||||
|
|
||||||
A patent license is "discriminatory" if it does not include within
|
|
||||||
the scope of its coverage, prohibits the exercise of, or is
|
|
||||||
conditioned on the non-exercise of one or more of the rights that are
|
|
||||||
specifically granted under this License. You may not convey a covered
|
|
||||||
work if you are a party to an arrangement with a third party that is
|
|
||||||
in the business of distributing software, under which you make payment
|
|
||||||
to the third party based on the extent of your activity of conveying
|
|
||||||
the work, and under which the third party grants, to any of the
|
|
||||||
parties who would receive the covered work from you, a discriminatory
|
|
||||||
patent license (a) in connection with copies of the covered work
|
|
||||||
conveyed by you (or copies made from those copies), or (b) primarily
|
|
||||||
for and in connection with specific products or compilations that
|
|
||||||
contain the covered work, unless you entered into that arrangement,
|
|
||||||
or that patent license was granted, prior to 28 March 2007.
|
|
||||||
|
|
||||||
Nothing in this License shall be construed as excluding or limiting
|
|
||||||
any implied license or other defenses to infringement that may
|
|
||||||
otherwise be available to you under applicable patent law.
|
|
||||||
|
|
||||||
12. No Surrender of Others' Freedom.
|
|
||||||
|
|
||||||
If conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot convey a
|
|
||||||
covered work so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you may
|
|
||||||
not convey it at all. For example, if you agree to terms that obligate you
|
|
||||||
to collect a royalty for further conveying from those to whom you convey
|
|
||||||
the Program, the only way you could satisfy both those terms and this
|
|
||||||
License would be to refrain entirely from conveying the Program.
|
|
||||||
|
|
||||||
13. Use with the GNU Affero General Public License.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, you have
|
|
||||||
permission to link or combine any covered work with a work licensed
|
|
||||||
under version 3 of the GNU Affero General Public License into a single
|
|
||||||
combined work, and to convey the resulting work. The terms of this
|
|
||||||
License will continue to apply to the part which is the covered work,
|
|
||||||
but the special requirements of the GNU Affero General Public License,
|
|
||||||
section 13, concerning interaction through a network will apply to the
|
|
||||||
combination as such.
|
|
||||||
|
|
||||||
14. Revised Versions of this License.
|
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions of
|
|
||||||
the GNU General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
|
||||||
Program specifies that a certain numbered version of the GNU General
|
|
||||||
Public License "or any later version" applies to it, you have the
|
|
||||||
option of following the terms and conditions either of that numbered
|
|
||||||
version or of any later version published by the Free Software
|
|
||||||
Foundation. If the Program does not specify a version number of the
|
|
||||||
GNU General Public License, you may choose any version ever published
|
|
||||||
by the Free Software Foundation.
|
|
||||||
|
|
||||||
If the Program specifies that a proxy can decide which future
|
|
||||||
versions of the GNU General Public License can be used, that proxy's
|
|
||||||
public statement of acceptance of a version permanently authorizes you
|
|
||||||
to choose that version for the Program.
|
|
||||||
|
|
||||||
Later license versions may give you additional or different
|
|
||||||
permissions. However, no additional obligations are imposed on any
|
|
||||||
author or copyright holder as a result of your choosing to follow a
|
|
||||||
later version.
|
|
||||||
|
|
||||||
15. Disclaimer of Warranty.
|
|
||||||
|
|
||||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
|
||||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
|
||||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
|
||||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
|
||||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
|
||||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
16. Limitation of Liability.
|
|
||||||
|
|
||||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
|
||||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
|
||||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
|
||||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
|
||||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
|
||||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
|
||||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGES.
|
|
||||||
|
|
||||||
17. Interpretation of Sections 15 and 16.
|
|
||||||
|
|
||||||
If the disclaimer of warranty and limitation of liability provided
|
|
||||||
above cannot be given local legal effect according to their terms,
|
|
||||||
reviewing courts shall apply local law that most closely approximates
|
|
||||||
an absolute waiver of all civil liability in connection with the
|
|
||||||
Program, unless a warranty or assumption of liability accompanies a
|
|
||||||
copy of the Program in return for a fee.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
state the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program does terminal interaction, make it output a short
|
|
||||||
notice like this when it starts in an interactive mode:
|
|
||||||
|
|
||||||
<program> Copyright (C) <year> <name of author>
|
|
||||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, your program's commands
|
|
||||||
might be different; for a GUI interface, you would use an "about box".
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or school,
|
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
|
||||||
For more information on this, and how to apply and follow the GNU GPL, see
|
|
||||||
<https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
The GNU General Public License does not permit incorporating your program
|
|
||||||
into proprietary programs. If your program is a subroutine library, you
|
|
||||||
may consider it more useful to permit linking proprietary applications with
|
|
||||||
the library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License. But first, please read
|
|
||||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
|
100
README.md
100
README.md
@ -1,46 +1,108 @@
|
|||||||
|
<img align="left" width="64" height="64" src="https://raw.githubusercontent.com/wiki/PolyhedralDev/Terra/images/terra_logo.png" alt="Terra Logo">
|
||||||
|
|
||||||
# Terra
|
# Terra
|
||||||
|
|
||||||
Terra is an incredibly powerful free & open-source data-driven, platform-agnostic world generator. It allows you to create a world exactly
|
Terra is a modern world generation modding platform, primarily for Minecraft.
|
||||||
to your specifications, with no knowledge of Java required.
|
Terra allows complete customization of world generation with an advanced API,
|
||||||
|
tightly integrated with a powerful configuration system.
|
||||||
|
|
||||||
|
Terra consists of several parts:
|
||||||
|
|
||||||
|
* A voxel world generation API with emphasis on configuration and extensibility
|
||||||
|
* Several platform implementations, the layer between the API and the platform
|
||||||
|
it's running on.
|
||||||
|
* An addon loader, which allows addons to interface with the Terra API in a
|
||||||
|
platform-agnostic setting
|
||||||
|
* Several "core addons," which implement the "default" configurations of Terra.
|
||||||
|
These addons can be thought of as the config "standard library"
|
||||||
|
|
||||||
|
Terra currently officially supports the Fabric mod loader and the Bukkit API
|
||||||
|
(Paper and friends). We welcome Pull Requests implementing additional platforms!
|
||||||
|
|
||||||
## Downloads:
|
## Downloads:
|
||||||
|
|
||||||
* Paper+ servers (Paper, Tuinity, Purpur, etc): [SpigotMC](https://www.spigotmc.org/resources/85151/)
|
* Fabric: [Modrinth](https://modrinth.com/mod/terra)
|
||||||
* Fabric: [Modrinth](https://modrinth.com/mod/terra) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator)
|
/ [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator)
|
||||||
* Forge **(ALPHA - NOT PRODUCTION-READY)**: [Modrinth](https://modrinth.com/mod/terra) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator)
|
* Paper+ servers (Paper, Tuinity, Purpur,
|
||||||
|
etc): [SpigotMC](https://www.spigotmc.org/resources/85151/)
|
||||||
|
|
||||||
## Building and Running Terra
|
## Building and Running Terra
|
||||||
|
|
||||||
To build, simply run `./gradlew build` (`gradlew.bat build` on Windows). This will build all platforms, and
|
To build, simply run `./gradlew build` (`gradlew.bat build` on Windows). This
|
||||||
produce JARs in `platforms/<platform>/build/libs`
|
will build all platforms, and produce JARs in `platforms/<platform>/build/libs`
|
||||||
|
|
||||||
### Production JARs:
|
### Production JARs:
|
||||||
|
|
||||||
* Bukkit: `Terra-<version>-shaded.jar`
|
* Bukkit: `Terra-<version>-shaded.jar`
|
||||||
* Fabric: `Terra-<version>-shaded-mapped.jar`
|
* Fabric: `Terra-<version>-shaded-mapped.jar`
|
||||||
* Forge: `Terra-<version>-shaded.jar`
|
|
||||||
|
|
||||||
### Building a Specific Platform
|
### Building a Specific Platform
|
||||||
|
|
||||||
To build a specific platform, run `gradlew :platforms:<platform>:build`.
|
To build a specific platform, run `gradlew :platforms:<platform>:build`.
|
||||||
|
|
||||||
JARs are produced in `platforms/<platform>/build/libs`.
|
JARs are produced in `platforms/<platform>/build/libs`.
|
||||||
|
|
||||||
### Running Minecraft in the IDE
|
### Running Minecraft in the IDE
|
||||||
|
|
||||||
To run Minecraft with Terra in the IDE (for testing) use the following tasks:
|
To run Minecraft with Terra in the IDE (for testing) use the following tasks:
|
||||||
|
|
||||||
* Bukkit
|
* Bukkit
|
||||||
* `installPaper` - Install a [Paper](https://github.com/PaperMC/Paper) test server. (Only needs to be run once).
|
* `installPaper` - Install a [Paper](https://github.com/PaperMC/Paper) test
|
||||||
* `installPurpur` - Install a [Purpur](https://github.com/pl3xgaming/Purpur) test server. (Only needs to be run once).
|
server. (Only needs to be run once).
|
||||||
* `runPaper` - Run the Paper test server with Terra (`installPaper` must have been run previously).
|
* `installPurpur` - Install a [Purpur](https://github.com/pl3xgaming/Purpur)
|
||||||
* `runPurpur` - Run the Purpur test server with Terra (`installPurpur` must have been run previously).
|
test server. (Only needs to be run once).
|
||||||
|
* `runPaper` - Run the Paper test server with Terra (`installPaper` must
|
||||||
|
have been run previously).
|
||||||
|
* `runPurpur` - Run the Purpur test server with Terra (`installPurpur` must
|
||||||
|
have been run previously).
|
||||||
* Fabric
|
* Fabric
|
||||||
* `runClient` - Run a Minecraft Fabric client with Terra installed.
|
* `runClient` - Run a Minecraft Fabric client with Terra installed.
|
||||||
* `runServer` - Run a Minecraft Fabric server with Terra installed.
|
* `runServer` - Run a Minecraft Fabric server with Terra installed.
|
||||||
* Forge
|
|
||||||
* `runClient` - Run a Minecraft Forge client with Terra installed.
|
|
||||||
* `runServer` - Run a Minecraft Forge server with Terra installed.
|
|
||||||
## Contributing
|
## Contributing
|
||||||
Contributions are welcome! If you want to see a feature in Terra, please, open an issue, or implement it yourself and
|
|
||||||
submit a PR!
|
Contributions are welcome! If you want to see a feature in Terra, please, open
|
||||||
Join the discord [here](https://discord.gg/PXUEbbF) if you would like to talk more about the project!
|
an issue, or implement it yourself and submit a PR!
|
||||||
|
Join the discord [here](https://discord.gg/PXUEbbF) if you would like to talk
|
||||||
|
more about the project!
|
||||||
|
|
||||||
|
## Licensing
|
||||||
|
|
||||||
|
Parts of Terra are licensed under either the MIT License or the GNU General
|
||||||
|
Public License, version 3.0.
|
||||||
|
|
||||||
|
* Our API is licensed under the [MIT License](LICENSE), to ensure that everyone
|
||||||
|
is able to freely use it however they want.
|
||||||
|
* Our core addons are also licensed under the [MIT License](LICENSE), to ensure
|
||||||
|
that people can freely use code from them to learn and make their own addons,
|
||||||
|
without worrying about GPL infection.
|
||||||
|
* Our platform-agnostic implementations and platform implementations are
|
||||||
|
licensed under
|
||||||
|
the [GNU General Public License, version 3.0](common/implementation/LICENSE),
|
||||||
|
to ensure that they remain free software wherever they are used.
|
||||||
|
|
||||||
|
If you're not sure which license a particular file is under, check:
|
||||||
|
|
||||||
|
* The file's header
|
||||||
|
* The LICENSE file in the closest parent folder of the file in question
|
||||||
|
|
||||||
## Beta
|
## Beta
|
||||||
Terra is still in beta! While it is stable, it is not feature-complete. There is a lot to be added!
|
|
||||||
|
Terra is still in beta! While it is stable, it is not feature-complete. There is
|
||||||
|
a lot to be added!
|
||||||
|
|
||||||
|
## Special Thanks
|
||||||
|
|
||||||
|
[](https://www.yourkit.com/)
|
||||||
|
|
||||||
|
YourKit has granted Polyhedral Development an open-source license to their
|
||||||
|
outstanding Java profiler, allowing us to make our software as performant as it
|
||||||
|
can be!
|
||||||
|
|
||||||
|
YourKit supports open source projects with innovative and intelligent tools for
|
||||||
|
monitoring and profiling Java and .NET applications. YourKit is the creator of
|
||||||
|
the
|
||||||
|
[YourKit Java Profiler](https://www.yourkit.com/java/profiler/),
|
||||||
|
[YourKit .NET Profiler](https://www.yourkit.com/.net/profiler/),
|
||||||
|
and [YourKit YouMonitor](https://www.yourkit.com/youmonitor/).
|
||||||
|
|
||||||
|
@ -1,15 +1,22 @@
|
|||||||
import com.dfsek.terra.getGitHash
|
preRelease(true)
|
||||||
|
|
||||||
|
versionProjects(":common:api", version("6.0.0"))
|
||||||
|
versionProjects(":common:implementation", version("6.0.0"))
|
||||||
|
versionProjects(":platforms", version("6.0.0"))
|
||||||
|
|
||||||
val versionObj = Version("5", "4", "2", true)
|
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
version = versionObj
|
|
||||||
group = "com.dfsek.terra"
|
group = "com.dfsek.terra"
|
||||||
|
|
||||||
|
configureCompilation()
|
||||||
|
configureDependencies()
|
||||||
|
configurePublishing()
|
||||||
|
|
||||||
tasks.withType<JavaCompile>().configureEach {
|
tasks.withType<JavaCompile>().configureEach {
|
||||||
options.isFork = true
|
options.isFork = true
|
||||||
options.isIncremental = true
|
options.isIncremental = true
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType<Test>().configureEach {
|
tasks.withType<Test>().configureEach {
|
||||||
useJUnitPlatform()
|
useJUnitPlatform()
|
||||||
|
|
||||||
@ -18,21 +25,33 @@ allprojects {
|
|||||||
failFast = true
|
failFast = true
|
||||||
maxParallelForks = (Runtime.getRuntime().availableProcessors() - 1).takeIf { it > 0 } ?: 1
|
maxParallelForks = (Runtime.getRuntime().availableProcessors() - 1).takeIf { it > 0 } ?: 1
|
||||||
|
|
||||||
reports.html.isEnabled = false
|
reports.html.required.set(false)
|
||||||
reports.junitXml.isEnabled = false
|
reports.junitXml.required.set(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
tasks.withType<Copy>().configureEach {
|
||||||
/**
|
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
|
||||||
* Version class that does version stuff.
|
}
|
||||||
*/
|
|
||||||
@Suppress("MemberVisibilityCanBePrivate")
|
|
||||||
class Version(val major: String, val minor: String, val revision: String, val preRelease: Boolean = false) {
|
|
||||||
|
|
||||||
override fun toString(): String {
|
tasks.withType<Jar>().configureEach {
|
||||||
return if (!preRelease)
|
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
|
||||||
"$major.$minor.$revision"
|
}
|
||||||
else //Only use git hash if it's a prerelease.
|
}
|
||||||
"$major.$minor.$revision-BETA+${getGitHash()}"
|
|
||||||
|
afterEvaluate {
|
||||||
|
forImmediateSubProjects(":platforms") {
|
||||||
|
configureDistribution()
|
||||||
|
}
|
||||||
|
forSubProjects(":common:addons") {
|
||||||
|
apply(plugin = "com.github.johnrengelman.shadow")
|
||||||
|
|
||||||
|
tasks.named("build") {
|
||||||
|
finalizedBy(tasks.named("shadowJar"))
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
"compileOnly"(project(":common:api"))
|
||||||
|
"testImplementation"(project(":common:api"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,8 +6,13 @@ plugins {
|
|||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
|
maven { url = uri("https://repo.codemc.org/repository/maven-public") }
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
"implementation"("com.github.jengelman.gradle.plugins:shadow:+")
|
implementation("gradle.plugin.com.github.jengelman.gradle.plugins:shadow:+")
|
||||||
|
implementation("org.ow2.asm:asm:9.2")
|
||||||
|
implementation("org.ow2.asm:asm-tree:9.2")
|
||||||
|
implementation("com.dfsek.tectonic:common:4.2.0")
|
||||||
|
implementation("org.yaml:snakeyaml:1.27")
|
||||||
}
|
}
|
42
buildSrc/src/main/kotlin/AddonConfig.kt
Normal file
42
buildSrc/src/main/kotlin/AddonConfig.kt
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
||||||
|
import java.io.File
|
||||||
|
import java.util.function.Predicate
|
||||||
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.api.Task
|
||||||
|
import org.gradle.jvm.tasks.Jar
|
||||||
|
import org.gradle.kotlin.dsl.extra
|
||||||
|
import kotlin.streams.asStream
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures a directory where addons will be put.
|
||||||
|
*/
|
||||||
|
fun Project.addonDir(dir: File, task: Task) {
|
||||||
|
task.doFirst {
|
||||||
|
dir.parentFile.mkdirs()
|
||||||
|
matchingAddons(dir) {
|
||||||
|
it.name.startsWith("Terra-") // Assume everything that starts with Terra- is a core addon.
|
||||||
|
}.forEach {
|
||||||
|
println("Deleting old addon: " + it.absolutePath)
|
||||||
|
it.delete()
|
||||||
|
}
|
||||||
|
forSubProjects(":common:addons") {
|
||||||
|
val jar = tasks.named("shadowJar").get() as ShadowJar
|
||||||
|
|
||||||
|
val boot = if (extra.has("bootstrap") && extra.get("bootstrap") as Boolean) "bootstrap/" else ""
|
||||||
|
val target = File(dir, boot + jar.archiveFileName.get())
|
||||||
|
|
||||||
|
val base = "${jar.archiveBaseName.get()}-${version}"
|
||||||
|
|
||||||
|
println("Copying addon ${jar.archiveFileName.get()} to ${target.absolutePath}. Base name: $base")
|
||||||
|
|
||||||
|
jar.archiveFile.orNull?.asFile?.copyTo(target)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun matchingAddons(dir: File, matcher: Predicate<File>): Set<File> {
|
||||||
|
val matching = HashSet<File>()
|
||||||
|
dir.walk().asStream().filter(matcher).forEach(matching::add)
|
||||||
|
return matching
|
||||||
|
}
|
78
buildSrc/src/main/kotlin/CompilationConfig.kt
Normal file
78
buildSrc/src/main/kotlin/CompilationConfig.kt
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
import com.dfsek.terra.tectonicdoc.TectonicDocPlugin
|
||||||
|
import org.apache.tools.ant.filters.ReplaceTokens
|
||||||
|
import org.gradle.api.JavaVersion
|
||||||
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.api.plugins.JavaPluginExtension
|
||||||
|
import org.gradle.api.tasks.bundling.Jar
|
||||||
|
import org.gradle.api.tasks.compile.JavaCompile
|
||||||
|
import org.gradle.api.tasks.javadoc.Javadoc
|
||||||
|
import org.gradle.kotlin.dsl.apply
|
||||||
|
import org.gradle.kotlin.dsl.configure
|
||||||
|
import org.gradle.kotlin.dsl.filter
|
||||||
|
import org.gradle.kotlin.dsl.getByName
|
||||||
|
import org.gradle.kotlin.dsl.register
|
||||||
|
import org.gradle.kotlin.dsl.withType
|
||||||
|
import org.gradle.language.jvm.tasks.ProcessResources
|
||||||
|
|
||||||
|
fun Project.configureCompilation() {
|
||||||
|
apply(plugin = "maven-publish")
|
||||||
|
apply(plugin = "java")
|
||||||
|
apply(plugin = "java-library")
|
||||||
|
apply(plugin = "idea")
|
||||||
|
apply<TectonicDocPlugin>()
|
||||||
|
|
||||||
|
configure<JavaPluginExtension> {
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.withType<JavaCompile> {
|
||||||
|
options.encoding = "UTF-8"
|
||||||
|
doFirst {
|
||||||
|
options.compilerArgs.add("-Xlint:all")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.withType<ProcessResources> {
|
||||||
|
include("**/*.*")
|
||||||
|
filter<ReplaceTokens>(
|
||||||
|
"tokens" to mapOf(
|
||||||
|
"DESCRIPTION" to properties["terra.description"],
|
||||||
|
"WIKI" to properties["terra.wiki"],
|
||||||
|
"SOURCE" to properties["terra.source"],
|
||||||
|
"ISSUES" to properties["terra.issues"],
|
||||||
|
"LICENSE" to properties["terra.license"]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
afterEvaluate {
|
||||||
|
tasks.withType<ProcessResources> {
|
||||||
|
include("**/*.*")
|
||||||
|
filter<ReplaceTokens>(
|
||||||
|
"tokens" to mapOf(
|
||||||
|
"VERSION" to version.toString()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.withType<Javadoc> {
|
||||||
|
options.encoding = "UTF-8"
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.withType<Jar> {
|
||||||
|
archiveBaseName.set("Terra-${archiveBaseName.get()}")
|
||||||
|
from("../LICENSE", "../../LICENSE")
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.register<Jar>("sourcesJar") {
|
||||||
|
archiveClassifier.set("sources")
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.register<Jar>("javadocJar") {
|
||||||
|
dependsOn("javadoc")
|
||||||
|
archiveClassifier.set("javadoc")
|
||||||
|
from(tasks.getByName<Javadoc>("javadoc").destinationDir)
|
||||||
|
}
|
||||||
|
}
|
47
buildSrc/src/main/kotlin/DependencyConfig.kt
Normal file
47
buildSrc/src/main/kotlin/DependencyConfig.kt
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.kotlin.dsl.creating
|
||||||
|
import org.gradle.kotlin.dsl.dependencies
|
||||||
|
import org.gradle.kotlin.dsl.getValue
|
||||||
|
import org.gradle.kotlin.dsl.getting
|
||||||
|
import org.gradle.kotlin.dsl.maven
|
||||||
|
import org.gradle.kotlin.dsl.repositories
|
||||||
|
|
||||||
|
fun Project.configureDependencies() {
|
||||||
|
val testImplementation by configurations.getting
|
||||||
|
val compileOnly by configurations.getting
|
||||||
|
|
||||||
|
val api by configurations.getting
|
||||||
|
val implementation by configurations.getting
|
||||||
|
|
||||||
|
val shaded by configurations.creating
|
||||||
|
|
||||||
|
@Suppress("UNUSED_VARIABLE")
|
||||||
|
val shadedApi by configurations.creating {
|
||||||
|
shaded.extendsFrom(this)
|
||||||
|
api.extendsFrom(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("UNUSED_VARIABLE")
|
||||||
|
val shadedImplementation by configurations.creating {
|
||||||
|
shaded.extendsFrom(this)
|
||||||
|
implementation.extendsFrom(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
gradlePluginPortal()
|
||||||
|
maven("https://maven.fabricmc.net/")
|
||||||
|
maven("https://repo.codemc.org/repository/maven-public")
|
||||||
|
maven("https://repo.codemc.io/repository/nms/")
|
||||||
|
maven("https://papermc.io/repo/repository/maven-public/")
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0")
|
||||||
|
testImplementation("org.junit.jupiter:junit-jupiter-engine:5.7.0")
|
||||||
|
compileOnly("org.jetbrains:annotations:23.0.0")
|
||||||
|
|
||||||
|
compileOnly("com.google.guava:guava:30.0-jre")
|
||||||
|
testImplementation("com.google.guava:guava:30.0-jre")
|
||||||
|
}
|
||||||
|
}
|
143
buildSrc/src/main/kotlin/DistributionConfig.kt
Normal file
143
buildSrc/src/main/kotlin/DistributionConfig.kt
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
||||||
|
import java.io.File
|
||||||
|
import java.io.FileWriter
|
||||||
|
import java.net.URL
|
||||||
|
import java.nio.file.FileSystems
|
||||||
|
import java.nio.file.Files
|
||||||
|
import java.nio.file.StandardCopyOption
|
||||||
|
import org.gradle.api.DefaultTask
|
||||||
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.api.plugins.BasePluginExtension
|
||||||
|
import org.gradle.jvm.tasks.Jar
|
||||||
|
import org.gradle.kotlin.dsl.apply
|
||||||
|
import org.gradle.kotlin.dsl.configure
|
||||||
|
import org.gradle.kotlin.dsl.extra
|
||||||
|
import org.gradle.kotlin.dsl.get
|
||||||
|
import org.gradle.kotlin.dsl.named
|
||||||
|
import org.yaml.snakeyaml.DumperOptions
|
||||||
|
import org.yaml.snakeyaml.Yaml
|
||||||
|
|
||||||
|
fun Project.configureDistribution() {
|
||||||
|
apply(plugin = "com.github.johnrengelman.shadow")
|
||||||
|
|
||||||
|
val downloadDefaultPacks = tasks.create("downloadDefaultPacks") {
|
||||||
|
group = "terra"
|
||||||
|
doFirst {
|
||||||
|
file("${buildDir}/resources/main/packs/").deleteRecursively()
|
||||||
|
val defaultPackUrl = URL("https://github.com/PolyhedralDev/TerraOverworldConfig/releases/download/latest/default.zip")
|
||||||
|
downloadPack(defaultPackUrl, project)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val installAddons = tasks.create("installAddons") {
|
||||||
|
group = "terra"
|
||||||
|
forSubProjects(":common:addons") {
|
||||||
|
afterEvaluate {
|
||||||
|
dependsOn(getJarTask())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
doLast {
|
||||||
|
// https://github.com/johnrengelman/shadow/issues/111
|
||||||
|
val dest = tasks.named<ShadowJar>("shadowJar").get().archiveFile.get().asFile.toPath()
|
||||||
|
|
||||||
|
FileSystems.newFileSystem(dest, mapOf("create" to "false"), null).use { fs ->
|
||||||
|
forSubProjects(":common:addons") {
|
||||||
|
val jar = getJarTask()
|
||||||
|
|
||||||
|
println("Packaging addon ${jar.archiveFileName.get()} to $dest. size: ${jar.archiveFile.get().asFile.length() / 1024}KB")
|
||||||
|
|
||||||
|
val boot = if (extra.has("bootstrap") && extra.get("bootstrap") as Boolean) "bootstrap/" else ""
|
||||||
|
val addonPath = fs.getPath("/addons/$boot${jar.archiveFileName.get()}");
|
||||||
|
|
||||||
|
if(!Files.exists(addonPath)) {
|
||||||
|
Files.createDirectories(addonPath.parent)
|
||||||
|
Files.createFile(addonPath)
|
||||||
|
Files.copy(jar.archiveFile.get().asFile.toPath(), addonPath, StandardCopyOption.REPLACE_EXISTING)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val generateResourceManifest = tasks.create("generateResourceManifest") {
|
||||||
|
group = "terra"
|
||||||
|
dependsOn(downloadDefaultPacks)
|
||||||
|
doLast {
|
||||||
|
val resources = HashMap<String, MutableList<String>>()
|
||||||
|
val packsDir = File("${project.buildDir}/resources/main/packs/")
|
||||||
|
|
||||||
|
packsDir.walkTopDown().forEach {
|
||||||
|
if (it.isDirectory || !it.name.endsWith(".zip")) return@forEach
|
||||||
|
resources.computeIfAbsent("packs") { ArrayList() }.add(it.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
val langDir = File("${project(":common:implementation").buildDir}/resources/main/lang/")
|
||||||
|
|
||||||
|
langDir.walkTopDown().forEach {
|
||||||
|
if (it.isDirectory || !it.name.endsWith(".yml")) return@forEach
|
||||||
|
resources.computeIfAbsent("lang") { ArrayList() }.add(it.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
forSubProjects(":common:addons") {
|
||||||
|
val jar = getJarTask().archiveFileName.get()
|
||||||
|
resources.computeIfAbsent(
|
||||||
|
if (extra.has("bootstrap") && extra.get("bootstrap") as Boolean) "addons/bootstrap"
|
||||||
|
else "addons"
|
||||||
|
) { ArrayList() }.add(jar)
|
||||||
|
}
|
||||||
|
|
||||||
|
val options = DumperOptions()
|
||||||
|
options.indent = 2
|
||||||
|
options.indentWithIndicator = true
|
||||||
|
options.indicatorIndent = 2
|
||||||
|
options.isPrettyFlow = true
|
||||||
|
options.defaultFlowStyle = DumperOptions.FlowStyle.BLOCK
|
||||||
|
options.defaultScalarStyle = DumperOptions.ScalarStyle.DOUBLE_QUOTED
|
||||||
|
|
||||||
|
val yaml = Yaml(options)
|
||||||
|
|
||||||
|
val manifest = File("${project.buildDir}/resources/main/resources.yml")
|
||||||
|
|
||||||
|
if (manifest.exists()) manifest.delete()
|
||||||
|
manifest.createNewFile()
|
||||||
|
yaml.dump(resources, FileWriter(manifest))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks["processResources"].dependsOn(generateResourceManifest)
|
||||||
|
|
||||||
|
|
||||||
|
tasks.named<ShadowJar>("shadowJar") {
|
||||||
|
// Tell shadow to download the packs
|
||||||
|
dependsOn(downloadDefaultPacks)
|
||||||
|
configurations = listOf(project.configurations["shaded"])
|
||||||
|
archiveClassifier.set("shaded")
|
||||||
|
setVersion(project.version)
|
||||||
|
relocate("org.apache.commons", "com.dfsek.terra.lib.commons")
|
||||||
|
relocate("org.objectweb.asm", "com.dfsek.terra.lib.asm")
|
||||||
|
relocate("com.dfsek.paralithic", "com.dfsek.terra.lib.paralithic")
|
||||||
|
relocate("org.json", "com.dfsek.terra.lib.json")
|
||||||
|
relocate("org.yaml", "com.dfsek.terra.lib.yaml")
|
||||||
|
|
||||||
|
finalizedBy(installAddons)
|
||||||
|
}
|
||||||
|
|
||||||
|
configure<BasePluginExtension> {
|
||||||
|
archivesName.set(project.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.named<DefaultTask>("build") {
|
||||||
|
dependsOn(tasks["shadowJar"])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun downloadPack(packUrl: URL, project: Project) {
|
||||||
|
val fileName = packUrl.file.substring(packUrl.file.lastIndexOf("/"))
|
||||||
|
val file = File("${project.buildDir}/resources/main/packs/${fileName}")
|
||||||
|
file.parentFile.mkdirs()
|
||||||
|
file.outputStream().write(packUrl.readBytes())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Project.getJarTask() = tasks.named("shadowJar").get() as ShadowJar
|
34
buildSrc/src/main/kotlin/PublishingConfig.kt
Normal file
34
buildSrc/src/main/kotlin/PublishingConfig.kt
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.api.publish.PublishingExtension
|
||||||
|
import org.gradle.api.publish.maven.MavenPublication
|
||||||
|
import org.gradle.kotlin.dsl.configure
|
||||||
|
import org.gradle.kotlin.dsl.create
|
||||||
|
import org.gradle.kotlin.dsl.get
|
||||||
|
import org.gradle.kotlin.dsl.maven
|
||||||
|
import org.gradle.kotlin.dsl.provideDelegate
|
||||||
|
|
||||||
|
fun Project.configurePublishing() {
|
||||||
|
configure<PublishingExtension> {
|
||||||
|
publications {
|
||||||
|
create<MavenPublication>("mavenJava") {
|
||||||
|
from(components["java"])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
val mavenUrl = "https://repo.codemc.io/repository/maven-releases/"
|
||||||
|
//val mavenSnapshotUrl = "https://repo.codemc.io/repository/maven-snapshots/"
|
||||||
|
|
||||||
|
maven(mavenUrl) {
|
||||||
|
val mavenUsername: String? by project
|
||||||
|
val mavenPassword: String? by project
|
||||||
|
if (mavenUsername != null && mavenPassword != null) {
|
||||||
|
credentials {
|
||||||
|
username = mavenUsername
|
||||||
|
password = mavenPassword
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
56
buildSrc/src/main/kotlin/Utils.kt
Normal file
56
buildSrc/src/main/kotlin/Utils.kt
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
import java.io.ByteArrayOutputStream
|
||||||
|
import org.gradle.api.Action
|
||||||
|
import org.gradle.api.Project
|
||||||
|
|
||||||
|
|
||||||
|
var isPrerelease = false
|
||||||
|
|
||||||
|
|
||||||
|
fun Project.getGitHash(): String {
|
||||||
|
val stdout = ByteArrayOutputStream()
|
||||||
|
exec {
|
||||||
|
commandLine = mutableListOf("git", "rev-parse", "--short", "HEAD")
|
||||||
|
standardOutput = stdout
|
||||||
|
}
|
||||||
|
return stdout.toString().trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Project.gitClone(name: String) {
|
||||||
|
val stdout = ByteArrayOutputStream()
|
||||||
|
exec {
|
||||||
|
commandLine = mutableListOf("git", "clone", name)
|
||||||
|
standardOutput = stdout
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Project.forSubProjects(project: String, action: Action<Project>) {
|
||||||
|
project(project).subprojects.forEach {
|
||||||
|
action.execute(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Project.forImmediateSubProjects(project: String, action: Action<Project>) {
|
||||||
|
project(project).childProjects.forEach {
|
||||||
|
action.execute(it.value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun preRelease(preRelease: Boolean) {
|
||||||
|
isPrerelease = preRelease
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Project.versionProjects(project: String, version: String) {
|
||||||
|
forSubProjects(project) {
|
||||||
|
this.version = version
|
||||||
|
println("Setting version of $path to $version")
|
||||||
|
}
|
||||||
|
project(project).version = version
|
||||||
|
println("Setting version of $project to $version")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Project.version(version: String): String {
|
||||||
|
return if (!isPrerelease)
|
||||||
|
version
|
||||||
|
else //Only use git hash if it's a prerelease.
|
||||||
|
"$version-BETA+${getGitHash()}"
|
||||||
|
}
|
38
buildSrc/src/main/kotlin/Versions.kt
Normal file
38
buildSrc/src/main/kotlin/Versions.kt
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
object Versions {
|
||||||
|
object Libraries {
|
||||||
|
const val tectonic = "4.2.0"
|
||||||
|
const val paralithic = "0.7.0"
|
||||||
|
const val strata = "1.1.1"
|
||||||
|
|
||||||
|
const val cloud = "1.6.2"
|
||||||
|
|
||||||
|
const val slf4j = "1.7.36"
|
||||||
|
const val log4j_slf4j_impl = "2.14.1"
|
||||||
|
|
||||||
|
object Internal {
|
||||||
|
const val apacheText = "1.9"
|
||||||
|
const val jafama = "2.3.2"
|
||||||
|
const val apacheIO = "2.6"
|
||||||
|
const val fastutil = "8.5.6"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object Fabric {
|
||||||
|
const val fabricLoader = "0.14.2"
|
||||||
|
const val fabricAPI = "0.53.4+1.18.2"
|
||||||
|
const val minecraft = "1.18.2"
|
||||||
|
const val yarn = "$minecraft+build.3"
|
||||||
|
const val permissionsAPI = "0.1-SNAPSHOT"
|
||||||
|
}
|
||||||
|
|
||||||
|
object Bukkit {
|
||||||
|
const val paper = "1.18-R0.1-SNAPSHOT"
|
||||||
|
const val paperLib = "1.0.5"
|
||||||
|
}
|
||||||
|
|
||||||
|
object Sponge {
|
||||||
|
const val sponge = "9.0.0-SNAPSHOT"
|
||||||
|
const val mixin = "0.8.2"
|
||||||
|
const val minecraft = "1.17.1"
|
||||||
|
}
|
||||||
|
}
|
@ -1,32 +0,0 @@
|
|||||||
package com.dfsek.terra
|
|
||||||
|
|
||||||
import org.gradle.api.Project
|
|
||||||
import org.gradle.api.tasks.testing.Test
|
|
||||||
import org.gradle.kotlin.dsl.apply
|
|
||||||
import org.gradle.kotlin.dsl.withType
|
|
||||||
import java.io.ByteArrayOutputStream
|
|
||||||
|
|
||||||
fun Project.configureCommon() {
|
|
||||||
configureDependencies()
|
|
||||||
configureCompilation()
|
|
||||||
configureDistribution()
|
|
||||||
|
|
||||||
version = rootProject.version
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Project.getGitHash(): String {
|
|
||||||
val stdout = ByteArrayOutputStream()
|
|
||||||
exec {
|
|
||||||
commandLine = mutableListOf("git", "rev-parse", "--short", "HEAD")
|
|
||||||
standardOutput = stdout
|
|
||||||
}
|
|
||||||
return stdout.toString().trim()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Project.gitClone(name: String) {
|
|
||||||
val stdout = ByteArrayOutputStream()
|
|
||||||
exec {
|
|
||||||
commandLine = mutableListOf("git", "clone", name)
|
|
||||||
standardOutput = stdout
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,60 +0,0 @@
|
|||||||
package com.dfsek.terra
|
|
||||||
|
|
||||||
import org.gradle.api.JavaVersion
|
|
||||||
import org.gradle.api.Project
|
|
||||||
import org.gradle.api.plugins.JavaPluginConvention
|
|
||||||
import org.gradle.api.tasks.bundling.Jar
|
|
||||||
import org.gradle.api.tasks.compile.JavaCompile
|
|
||||||
import org.gradle.api.tasks.javadoc.Javadoc
|
|
||||||
import org.gradle.kotlin.dsl.*
|
|
||||||
import org.gradle.language.jvm.tasks.ProcessResources
|
|
||||||
|
|
||||||
fun Project.configureCompilation() {
|
|
||||||
apply(plugin = "maven-publish")
|
|
||||||
apply(plugin = "idea")
|
|
||||||
|
|
||||||
configure<JavaPluginConvention> {
|
|
||||||
sourceCompatibility = JavaVersion.VERSION_16
|
|
||||||
targetCompatibility = JavaVersion.VERSION_16
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.withType<JavaCompile> {
|
|
||||||
options.encoding = "UTF-8"
|
|
||||||
doFirst {
|
|
||||||
options.compilerArgs.add("-Xlint:all")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.withType<ProcessResources> {
|
|
||||||
include("**/*.*")
|
|
||||||
filter<org.apache.tools.ant.filters.ReplaceTokens>(
|
|
||||||
"tokens" to mapOf(
|
|
||||||
"VERSION" to project.version.toString(),
|
|
||||||
"DESCRIPTION" to project.properties["terra.description"],
|
|
||||||
"WIKI" to project.properties["terra.wiki"],
|
|
||||||
"SOURCE" to project.properties["terra.source"],
|
|
||||||
"ISSUES" to project.properties["terra.issues"],
|
|
||||||
"LICENSE" to project.properties["terra.license"]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.withType<Javadoc> {
|
|
||||||
options.encoding = "UTF-8"
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.withType<Jar> {
|
|
||||||
archiveBaseName.set("Terra-${archiveBaseName.get()}")
|
|
||||||
from("../LICENSE", "../../LICENSE")
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.register<Jar>("sourcesJar") {
|
|
||||||
archiveClassifier.set("sources")
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.register<Jar>("javadocJar") {
|
|
||||||
dependsOn("javadoc")
|
|
||||||
archiveClassifier.set("javadoc")
|
|
||||||
from(tasks.getByName<Javadoc>("javadoc").destinationDir)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
package com.dfsek.terra
|
|
||||||
|
|
||||||
import org.gradle.api.Project
|
|
||||||
import org.gradle.kotlin.dsl.apply
|
|
||||||
import org.gradle.kotlin.dsl.dependencies
|
|
||||||
import org.gradle.kotlin.dsl.invoke
|
|
||||||
import org.gradle.kotlin.dsl.repositories
|
|
||||||
|
|
||||||
fun Project.configureDependencies() {
|
|
||||||
apply(plugin = "java")
|
|
||||||
apply(plugin = "java-library")
|
|
||||||
|
|
||||||
configurations {
|
|
||||||
val shaded = create("shaded")
|
|
||||||
val shadedApi = create("shadedApi")
|
|
||||||
shaded.extendsFrom(shadedApi)
|
|
||||||
getByName("api").extendsFrom(shadedApi)
|
|
||||||
val shadedImplementation = create("shadedImplementation")
|
|
||||||
shaded.extendsFrom(shadedImplementation)
|
|
||||||
getByName("implementation").extendsFrom(shadedImplementation)
|
|
||||||
}
|
|
||||||
|
|
||||||
repositories {
|
|
||||||
maven { url = uri("https://maven.enginehub.org/repo/") }
|
|
||||||
maven { url = uri("https://repo.codemc.org/repository/maven-public") }
|
|
||||||
maven { url = uri("https://papermc.io/repo/repository/maven-public/") }
|
|
||||||
maven { url = uri("https://maven.fabricmc.net/") }
|
|
||||||
gradlePluginPortal()
|
|
||||||
jcenter()
|
|
||||||
mavenCentral()
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
"testImplementation"("org.junit.jupiter:junit-jupiter-api:5.7.0")
|
|
||||||
"testImplementation"("org.junit.jupiter:junit-jupiter-engine:5.7.0")
|
|
||||||
"api"("org.jetbrains:annotations:20.1.0")
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
package com.dfsek.terra
|
|
||||||
|
|
||||||
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
|
||||||
import org.gradle.api.DefaultTask
|
|
||||||
import org.gradle.api.Project
|
|
||||||
import org.gradle.api.plugins.BasePluginConvention
|
|
||||||
import org.gradle.api.tasks.bundling.Jar
|
|
||||||
import org.gradle.api.tasks.javadoc.Javadoc
|
|
||||||
import org.gradle.kotlin.dsl.*
|
|
||||||
import java.io.File
|
|
||||||
import java.net.URL
|
|
||||||
|
|
||||||
fun Project.configureDistribution() {
|
|
||||||
apply(plugin = "java-library")
|
|
||||||
apply(plugin = "com.github.johnrengelman.shadow")
|
|
||||||
|
|
||||||
val downloadDefaultPacks = tasks.create("downloadDefaultPacks") {
|
|
||||||
group = "terra"
|
|
||||||
doFirst {
|
|
||||||
file("${buildDir}/resources/main/packs/").deleteRecursively()
|
|
||||||
|
|
||||||
val defaultPackUrl = URL("https://github.com/PolyhedralDev/TerraDefaultConfig/releases/download/latest/default.zip")
|
|
||||||
downloadPack(defaultPackUrl, project)
|
|
||||||
val netherPackUrl = URL("https://github.com/PolyhedralDev/TerraDefaultConfig/releases/download/latest/nether.zip")
|
|
||||||
downloadPack(netherPackUrl, project)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tasks["processResources"].dependsOn(downloadDefaultPacks)
|
|
||||||
|
|
||||||
tasks.named<ShadowJar>("shadowJar") {
|
|
||||||
// Tell shadow to download the packs
|
|
||||||
dependsOn(downloadDefaultPacks)
|
|
||||||
|
|
||||||
configurations = listOf(project.configurations["shaded"])
|
|
||||||
|
|
||||||
archiveClassifier.set("shaded")
|
|
||||||
setVersion(project.version)
|
|
||||||
relocate("org.apache.commons", "com.dfsek.terra.lib.commons")
|
|
||||||
relocate("net.jafama", "com.dfsek.terra.lib.jafama")
|
|
||||||
relocate("org.objectweb.asm", "com.dfsek.terra.lib.asm")
|
|
||||||
relocate("com.google.errorprone", "com.dfsek.terra.lib.google.errorprone")
|
|
||||||
relocate("com.google.j2objc", "com.dfsek.terra.lib.google.j2objc")
|
|
||||||
relocate("org.checkerframework", "com.dfsek.terra.lib.checkerframework")
|
|
||||||
relocate("org.javax.annotation", "com.dfsek.terra.lib.javax.annotation")
|
|
||||||
relocate("org.json", "com.dfsek.terra.lib.json")
|
|
||||||
relocate("org.yaml", "com.dfsek.terra.lib.yaml")
|
|
||||||
minimize()
|
|
||||||
}
|
|
||||||
convention.getPlugin<BasePluginConvention>().archivesBaseName = project.name
|
|
||||||
|
|
||||||
tasks.named<DefaultTask>("build") {
|
|
||||||
dependsOn(tasks["shadowJar"])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun downloadPack(packUrl: URL, project: Project) {
|
|
||||||
val fileName = packUrl.file.substring(packUrl.file.lastIndexOf("/"))
|
|
||||||
val file = File("${project.buildDir}/resources/main/packs/${fileName}")
|
|
||||||
file.parentFile.mkdirs()
|
|
||||||
file.outputStream().write(packUrl.readBytes())
|
|
||||||
}
|
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.dfsek.terra.tectonicdoc
|
||||||
|
|
||||||
|
class DocumentedTemplate(private val name: String) {
|
||||||
|
private val template = HashMap<String, String>()
|
||||||
|
|
||||||
|
fun add(name: String, content: String) {
|
||||||
|
template[name] = content
|
||||||
|
}
|
||||||
|
|
||||||
|
fun format(): String {
|
||||||
|
val builder = StringBuilder("# ").append(name).append("\n\n")
|
||||||
|
template.forEach { name, content ->
|
||||||
|
builder
|
||||||
|
.append("### $name\n\n")
|
||||||
|
.append(content)
|
||||||
|
.append("\n\n")
|
||||||
|
}
|
||||||
|
return builder.toString()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,150 @@
|
|||||||
|
package com.dfsek.terra.tectonicdoc
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Description
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Final
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value
|
||||||
|
import java.io.File
|
||||||
|
import java.io.FileInputStream
|
||||||
|
import java.io.InputStream
|
||||||
|
import org.gradle.api.DefaultTask
|
||||||
|
import org.gradle.api.plugins.JavaPluginExtension
|
||||||
|
import org.gradle.api.tasks.TaskAction
|
||||||
|
import org.objectweb.asm.ClassReader
|
||||||
|
import org.objectweb.asm.tree.ClassNode
|
||||||
|
import org.objectweb.asm.tree.FieldNode
|
||||||
|
|
||||||
|
|
||||||
|
abstract class GenerateDocsTask : DefaultTask() {
|
||||||
|
@TaskAction
|
||||||
|
fun generateDocs() {
|
||||||
|
project.extensions.getByType(JavaPluginExtension::class.java).sourceSets.forEach { sources ->
|
||||||
|
val classes = HashMap<String, ClassNode>()
|
||||||
|
sources.java.classesDirectory.get().asFileTree.forEach { file ->
|
||||||
|
if (file.name.endsWith(".class")) {
|
||||||
|
val node = createClassNode(FileInputStream(file))
|
||||||
|
if (node.fields.stream().anyMatch { field ->
|
||||||
|
field.visibleAnnotations?.stream()?.anyMatch {
|
||||||
|
it.desc.equals(descriptor(Value::class.java.canonicalName))
|
||||||
|
} == true
|
||||||
|
}) {
|
||||||
|
var name = sources
|
||||||
|
.java
|
||||||
|
.classesDirectory
|
||||||
|
.get()
|
||||||
|
.asFile
|
||||||
|
.toPath()
|
||||||
|
.relativize(file.toPath())
|
||||||
|
.toString()
|
||||||
|
.substringBeforeLast('.')
|
||||||
|
if (name.endsWith("Template")) {
|
||||||
|
name = name.substringBeforeLast("Template")
|
||||||
|
}
|
||||||
|
classes[name] = node
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val docsDir = File(project.buildDir, "tectonic")
|
||||||
|
docsDir.mkdirs()
|
||||||
|
|
||||||
|
classes.forEach { (name, clazz) ->
|
||||||
|
val template = DocumentedTemplate(name.substringAfterLast('/'))
|
||||||
|
clazz.fields
|
||||||
|
.stream()
|
||||||
|
.filter { field ->
|
||||||
|
field.visibleAnnotations?.stream()?.anyMatch {
|
||||||
|
it.desc.equals(descriptor(Value::class.java.canonicalName))
|
||||||
|
} == true
|
||||||
|
}.forEach { field ->
|
||||||
|
val annotations = field.visibleAnnotations
|
||||||
|
|
||||||
|
val description = StringBuilder()
|
||||||
|
|
||||||
|
annotations.stream().filter {
|
||||||
|
it.desc.equals(descriptor(Description::class.java.canonicalName))
|
||||||
|
}.forEach {
|
||||||
|
description.append(it.values[1])
|
||||||
|
}
|
||||||
|
|
||||||
|
val keyName = StringBuilder()
|
||||||
|
|
||||||
|
if (annotations.stream().anyMatch { it.desc.equals(descriptor(Final::class.java.canonicalName)) }) {
|
||||||
|
keyName.append("final ")
|
||||||
|
}
|
||||||
|
|
||||||
|
keyName.append(getType(field))
|
||||||
|
.append(" ")
|
||||||
|
|
||||||
|
annotations.stream().filter {
|
||||||
|
it.desc.equals(descriptor(Value::class.java.canonicalName))
|
||||||
|
}.forEach {
|
||||||
|
keyName.append(it.values[1])
|
||||||
|
}
|
||||||
|
|
||||||
|
template.add(keyName.toString(), description.toString().ifBlank {
|
||||||
|
println("No description provided for field " + field.name + " in class " + name)
|
||||||
|
"*No description provided.*"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val save = File(docsDir, "$name.md")
|
||||||
|
if (save.exists()) save.delete()
|
||||||
|
save.parentFile.mkdirs()
|
||||||
|
save.createNewFile()
|
||||||
|
save.writeText(template.format())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getType(node: FieldNode): String {
|
||||||
|
if (node.signature != null) {
|
||||||
|
return generic(node.signature)
|
||||||
|
}
|
||||||
|
return descriptorToHumanReadable(node.desc).substringAfterLast('.')
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generic(type: String): String {
|
||||||
|
val clean = descriptorToHumanReadable(type)
|
||||||
|
|
||||||
|
if (clean.contains('<')) {
|
||||||
|
val typeIndex = clean.indexOf('<')
|
||||||
|
return clean.substring(0, typeIndex + 1).substringAfterLast('.') + generic(clean.substring(typeIndex + 1)) + "\\>"
|
||||||
|
}
|
||||||
|
|
||||||
|
return clean.substringAfterLast('.')
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createClassNode(input: InputStream): ClassNode {
|
||||||
|
val reader = ClassReader(input)
|
||||||
|
val node = ClassNode()
|
||||||
|
try {
|
||||||
|
reader.accept(node, ClassReader.EXPAND_FRAMES)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
reader.accept(node, ClassReader.SKIP_FRAMES or ClassReader.SKIP_DEBUG)
|
||||||
|
}
|
||||||
|
return node
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun descriptorToHumanReadable(descriptor: String): String {
|
||||||
|
if (descriptor.startsWith('L')) {
|
||||||
|
return descriptor.substring(1).substringBeforeLast(';').replace('/', '.')
|
||||||
|
}
|
||||||
|
if (descriptor.startsWith("[")) {
|
||||||
|
return "${descriptorToHumanReadable(descriptor.substring(1))}[]"
|
||||||
|
}
|
||||||
|
return when (descriptor) {
|
||||||
|
"B" -> "byte"
|
||||||
|
"C" -> "char"
|
||||||
|
"I" -> "int"
|
||||||
|
"D" -> "double"
|
||||||
|
"F" -> "float"
|
||||||
|
"J" -> "long"
|
||||||
|
"S" -> "short"
|
||||||
|
"Z" -> "boolean"
|
||||||
|
else -> descriptor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun descriptor(name: String): String = "L${name.replace('.', '/')};"
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.dfsek.terra.tectonicdoc
|
||||||
|
|
||||||
|
import org.gradle.api.Plugin
|
||||||
|
import org.gradle.api.Project
|
||||||
|
|
||||||
|
class TectonicDocPlugin : Plugin<Project> {
|
||||||
|
override fun apply(project: Project) {
|
||||||
|
project.tasks.create("generateDocs", GenerateDocsTask::class.java)
|
||||||
|
}
|
||||||
|
}
|
4
common/addons/README.md
Normal file
4
common/addons/README.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# Core Addons
|
||||||
|
|
||||||
|
This directory contains the modularized "core addons" that implement Terra's
|
||||||
|
default behavior.
|
21
common/addons/api-addon-loader/LICENSE
Normal file
21
common/addons/api-addon-loader/LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
3
common/addons/api-addon-loader/README.md
Normal file
3
common/addons/api-addon-loader/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# api addon loader
|
||||||
|
|
||||||
|
Loads dependencies as addons
|
12
common/addons/api-addon-loader/build.gradle.kts
Normal file
12
common/addons/api-addon-loader/build.gradle.kts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
version = version("0.1.0")
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.withType<Jar> {
|
||||||
|
manifest {
|
||||||
|
attributes("Terra-Bootstrap-Addon-Entry-Point" to "com.dfsek.terra.addon.loader.ApiAddonLoader")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
project.extra.set("bootstrap", true)
|
@ -0,0 +1,26 @@
|
|||||||
|
package com.dfsek.terra.addon.loader;
|
||||||
|
|
||||||
|
import ca.solostudios.strata.version.Version;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.addon.BaseAddon;
|
||||||
|
|
||||||
|
|
||||||
|
public class ApiAddon implements BaseAddon {
|
||||||
|
private final Version version;
|
||||||
|
private final String id;
|
||||||
|
|
||||||
|
public ApiAddon(Version version, String id) {
|
||||||
|
this.version = version;
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Version getVersion() {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getID() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addon.loader;
|
||||||
|
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
|
||||||
|
public class ApiAddonClassLoader extends URLClassLoader {
|
||||||
|
static {
|
||||||
|
ClassLoader.registerAsParallelCapable();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApiAddonClassLoader(URL[] urls, ClassLoader parent) {
|
||||||
|
super(urls, parent);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addon.loader;
|
||||||
|
|
||||||
|
import ca.solostudios.strata.Versions;
|
||||||
|
import ca.solostudios.strata.version.Version;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.addon.BaseAddon;
|
||||||
|
import com.dfsek.terra.api.addon.bootstrap.BootstrapAddonClassLoader;
|
||||||
|
import com.dfsek.terra.api.addon.bootstrap.BootstrapBaseAddon;
|
||||||
|
|
||||||
|
|
||||||
|
public class ApiAddonLoader implements BootstrapBaseAddon<BaseAddon> {
|
||||||
|
private static final Version VERSION = Versions.getVersion(1, 0, 0);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<BaseAddon> loadAddons(Path addonsFolder, BootstrapAddonClassLoader parent) {
|
||||||
|
|
||||||
|
return Collections.emptySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getID() {
|
||||||
|
return "API";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Version getVersion() {
|
||||||
|
return VERSION;
|
||||||
|
}
|
||||||
|
}
|
21
common/addons/biome-provider-image/LICENSE
Normal file
21
common/addons/biome-provider-image/LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
6
common/addons/biome-provider-image/README.md
Normal file
6
common/addons/biome-provider-image/README.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# biome-provider-image
|
||||||
|
|
||||||
|
Implements and registers the `IMAGE` biome provider, a biome provider which
|
||||||
|
generates biomes from an image, using the `color` attribute of biomes.
|
||||||
|
|
||||||
|
This addon registers the provider type, and all associated config options.
|
11
common/addons/biome-provider-image/build.gradle.kts
Normal file
11
common/addons/biome-provider-image/build.gradle.kts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
version = version("1.0.0")
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
|
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
||||||
|
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
||||||
|
relocate("net.jafama", "com.dfsek.terra.addons.biome.image.lib.jafama")
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.image;
|
||||||
|
|
||||||
|
import net.jafama.FastMath;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|
||||||
|
public class ImageBiomeProvider implements BiomeProvider {
|
||||||
|
private final Map<Color, Biome> colorBiomeMap = new HashMap<>();
|
||||||
|
private final BufferedImage image;
|
||||||
|
private final int resolution;
|
||||||
|
private final Align align;
|
||||||
|
|
||||||
|
public ImageBiomeProvider(Set<Biome> registry, BufferedImage image, int resolution, Align align) {
|
||||||
|
this.image = image;
|
||||||
|
this.resolution = resolution;
|
||||||
|
this.align = align;
|
||||||
|
registry.forEach(biome -> colorBiomeMap.put(new Color(biome.getColor()), biome));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int distance(Color a, Color b) {
|
||||||
|
return FastMath.abs(a.getRed() - b.getRed()) + FastMath.abs(a.getGreen() - b.getGreen()) + FastMath.abs(a.getBlue() - b.getBlue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Biome getBiome(int x, int y, int z, long seed) {
|
||||||
|
x /= resolution;
|
||||||
|
z /= resolution;
|
||||||
|
Color color = align.getColor(image, x, z);
|
||||||
|
return colorBiomeMap.get(colorBiomeMap.keySet()
|
||||||
|
.stream()
|
||||||
|
.reduce(colorBiomeMap.keySet().stream().findAny().orElseThrow(IllegalStateException::new),
|
||||||
|
(running, element) -> {
|
||||||
|
int d1 = distance(color, running);
|
||||||
|
int d2 = distance(color, element);
|
||||||
|
return d1 < d2 ? running : element;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<Biome> getBiomes() {
|
||||||
|
return colorBiomeMap.values();
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Align {
|
||||||
|
CENTER {
|
||||||
|
@Override
|
||||||
|
public Color getColor(BufferedImage image, int x, int z) {
|
||||||
|
return new Color(image.getRGB(FastMath.floorMod(x - image.getWidth() / 2, image.getWidth()),
|
||||||
|
FastMath.floorMod(z - image.getHeight() / 2, image.getHeight())));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
NONE {
|
||||||
|
@Override
|
||||||
|
public Color getColor(BufferedImage image, int x, int z) {
|
||||||
|
return new Color(image.getRGB(FastMath.floorMod(x, image.getWidth()), FastMath.floorMod(z, image.getHeight())));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public abstract Color getColor(BufferedImage image, int x, int z);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.image;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
||||||
|
import com.dfsek.terra.api.Platform;
|
||||||
|
import com.dfsek.terra.api.addon.BaseAddon;
|
||||||
|
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
|
||||||
|
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
|
||||||
|
import com.dfsek.terra.api.inject.annotations.Inject;
|
||||||
|
import com.dfsek.terra.api.registry.CheckedRegistry;
|
||||||
|
import com.dfsek.terra.api.util.reflection.TypeKey;
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|
||||||
|
public class ImageBiomeProviderAddon implements AddonInitializer {
|
||||||
|
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
|
||||||
|
};
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private Platform platform;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private BaseAddon addon;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize() {
|
||||||
|
platform.getEventManager()
|
||||||
|
.getHandler(FunctionalEventHandler.class)
|
||||||
|
.register(addon, ConfigPackPreLoadEvent.class)
|
||||||
|
.then(event -> {
|
||||||
|
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry(
|
||||||
|
PROVIDER_REGISTRY_KEY);
|
||||||
|
providerRegistry.register(addon.key("IMAGE"),
|
||||||
|
() -> new ImageProviderTemplate(event.getPack().getRegistry(Biome.class)));
|
||||||
|
})
|
||||||
|
.failThrough();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.image;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.registry.Registry;
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings("FieldMayBeFinal")
|
||||||
|
public class ImageProviderTemplate implements ObjectTemplate<BiomeProvider> {
|
||||||
|
private final Registry<Biome> biomes;
|
||||||
|
@Value("resolution")
|
||||||
|
@Default
|
||||||
|
@Description("Sets the resolution at which to sample the image.")
|
||||||
|
private int resolution = 1;
|
||||||
|
@Value("image.name")
|
||||||
|
@Description("Sets the location of the image on the filesystem, relative to the pack root.")
|
||||||
|
private BufferedImage image;
|
||||||
|
@Value("image.align")
|
||||||
|
@Description("Sets the alignment style to use for the image.")
|
||||||
|
private ImageBiomeProvider.Align align;
|
||||||
|
|
||||||
|
public ImageProviderTemplate(Registry<Biome> set) {
|
||||||
|
this.biomes = set;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeProvider get() {
|
||||||
|
return new ImageBiomeProvider(new HashSet<>(biomes.entries()), image, resolution, align);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
schema-version: 1
|
||||||
|
contributors:
|
||||||
|
- Terra contributors
|
||||||
|
id: biome-provider-image
|
||||||
|
version: @VERSION@
|
||||||
|
entrypoints:
|
||||||
|
- "com.dfsek.terra.addons.biome.image.ImageBiomeProviderAddon"
|
||||||
|
website:
|
||||||
|
issues: https://github.com/PolyhedralDev/Terra/issues
|
||||||
|
source: https://github.com/PolyhedralDev/Terra
|
||||||
|
docs: https://terra.polydev.org
|
||||||
|
license: MIT License
|
21
common/addons/biome-provider-pipeline/LICENSE
Normal file
21
common/addons/biome-provider-pipeline/LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
7
common/addons/biome-provider-pipeline/README.md
Normal file
7
common/addons/biome-provider-pipeline/README.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# biome-provider-pipeline
|
||||||
|
|
||||||
|
Implements the Biome Pipeline, a procedural biome provider that uses a series
|
||||||
|
of "stages" to apply "mutations" to a 2D grid of biomes.
|
||||||
|
|
||||||
|
This addon registers the `PIPELINE` biome provider type, and all associated
|
||||||
|
configurations.
|
14
common/addons/biome-provider-pipeline/build.gradle.kts
Normal file
14
common/addons/biome-provider-pipeline/build.gradle.kts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
version = version("1.0.0")
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
|
implementation("com.github.ben-manes.caffeine:caffeine:3.1.0")
|
||||||
|
|
||||||
|
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
||||||
|
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
||||||
|
relocate("com.github.benmanes.caffeine", "com.dfsek.terra.addons.biome.pipeline.lib.caffeine")
|
||||||
|
relocate("net.jafama", "com.dfsek.terra.addons.biome.pipeline.lib.jafama")
|
||||||
|
}
|
@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeExpander;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
|
||||||
|
import com.dfsek.terra.api.util.vector.Vector2;
|
||||||
|
|
||||||
|
|
||||||
|
public class BiomeHolderImpl implements BiomeHolder {
|
||||||
|
private final Vector2.Mutable origin;
|
||||||
|
private final int width;
|
||||||
|
private final int offset;
|
||||||
|
private BiomeDelegate[][] biomes;
|
||||||
|
|
||||||
|
public BiomeHolderImpl(int width, Vector2.Mutable origin) {
|
||||||
|
width += 4;
|
||||||
|
this.width = width;
|
||||||
|
biomes = new BiomeDelegate[width][width];
|
||||||
|
this.origin = origin;
|
||||||
|
this.offset = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BiomeHolderImpl(BiomeDelegate[][] biomes, Vector2.Mutable origin, int width, int offset) {
|
||||||
|
this.biomes = biomes;
|
||||||
|
this.origin = origin;
|
||||||
|
this.width = width;
|
||||||
|
this.offset = 2 * offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeHolder expand(BiomeExpander expander, long seed) {
|
||||||
|
BiomeDelegate[][] old = biomes;
|
||||||
|
int newWidth = width * 2 - 1;
|
||||||
|
|
||||||
|
biomes = new BiomeDelegate[newWidth][newWidth];
|
||||||
|
|
||||||
|
for(int x = 0; x < width; x++) {
|
||||||
|
for(int z = 0; z < width; z++) {
|
||||||
|
biomes[x * 2][z * 2] = old[x][z];
|
||||||
|
if(z != width - 1)
|
||||||
|
biomes[x * 2][z * 2 + 1] = expander.getBetween(x + origin.getX(), z + 1 + origin.getZ(), seed, old[x][z],
|
||||||
|
old[x][z + 1]);
|
||||||
|
if(x != width - 1)
|
||||||
|
biomes[x * 2 + 1][z * 2] = expander.getBetween(x + 1 + origin.getX(), z + origin.getZ(), seed, old[x][z],
|
||||||
|
old[x + 1][z]);
|
||||||
|
if(x != width - 1 && z != width - 1)
|
||||||
|
biomes[x * 2 + 1][z * 2 + 1] = expander.getBetween(x + 1 + origin.getX(), z + 1 + origin.getZ(), seed, old[x][z],
|
||||||
|
old[x + 1][z + 1], old[x][z + 1], old[x + 1][z]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new BiomeHolderImpl(biomes, origin.setX(origin.getX() * 2 - 1).setZ(origin.getZ() * 2 - 1), newWidth, offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mutate(BiomeMutator mutator, long seed) {
|
||||||
|
for(int x = 0; x < width; x++) {
|
||||||
|
for(int z = 0; z < width; z++) {
|
||||||
|
BiomeMutator.ViewPoint viewPoint = new BiomeMutator.ViewPoint(this, x, z);
|
||||||
|
biomes[x][z] = mutator.mutate(viewPoint, x + origin.getX(), z + origin.getZ(), seed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fill(BiomeSource source, long seed) {
|
||||||
|
for(int x = 0; x < width; x++) {
|
||||||
|
for(int z = 0; z < width; z++) {
|
||||||
|
biomes[x][z] = source.getBiome(origin.getX() + x, origin.getZ() + z, seed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeDelegate getBiome(int x, int z) {
|
||||||
|
x += offset;
|
||||||
|
z += offset;
|
||||||
|
return getBiomeRaw(x, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeDelegate getBiomeRaw(int x, int z) {
|
||||||
|
if(x >= width || z >= width || x < 0 || z < 0) return null;
|
||||||
|
return biomes[x][z];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
|
||||||
|
import com.dfsek.terra.api.util.vector.Vector2;
|
||||||
|
|
||||||
|
|
||||||
|
public class BiomePipeline {
|
||||||
|
private final BiomeSource source;
|
||||||
|
private final List<Stage> stages;
|
||||||
|
private final int size;
|
||||||
|
private final int init;
|
||||||
|
|
||||||
|
private BiomePipeline(BiomeSource source, List<Stage> stages, int size, int init) {
|
||||||
|
this.source = source;
|
||||||
|
this.stages = stages;
|
||||||
|
this.size = size;
|
||||||
|
this.init = init;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get biomes in a chunk
|
||||||
|
*
|
||||||
|
* @param x Chunk X coord
|
||||||
|
* @param z Chunk Z coord
|
||||||
|
*
|
||||||
|
* @return BiomeHolder containing biomes.
|
||||||
|
*/
|
||||||
|
public BiomeHolder getBiomes(int x, int z, long seed) {
|
||||||
|
BiomeHolder holder = new BiomeHolderImpl(init, Vector2.of(x * (init - 1), z * (init - 1)).mutable());
|
||||||
|
holder.fill(source, seed);
|
||||||
|
for(Stage stage : stages) holder = stage.apply(holder, seed);
|
||||||
|
return holder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BiomeSource getSource() {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Stage> getStages() {
|
||||||
|
return Collections.unmodifiableList(stages);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSize() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class BiomePipelineBuilder {
|
||||||
|
private final int init;
|
||||||
|
private final List<Stage> stages = new ArrayList<>();
|
||||||
|
private int expand;
|
||||||
|
|
||||||
|
public BiomePipelineBuilder(int init) {
|
||||||
|
this.init = init;
|
||||||
|
expand = init;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BiomePipeline build(BiomeSource source) {
|
||||||
|
for(Stage stage : stages) {
|
||||||
|
if(stage.isExpansion()) expand = expand * 2 - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new BiomePipeline(source, stages, expand, init);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BiomePipelineBuilder addStage(Stage stage) {
|
||||||
|
stages.add(stage);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.BiomeDelegateLoader;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.BiomePipelineTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.SamplerSourceTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.expander.ExpanderStageTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderListMutatorTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderMutatorTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceListMutatorTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceMutatorTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.SmoothMutatorTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
|
||||||
|
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
||||||
|
import com.dfsek.terra.api.Platform;
|
||||||
|
import com.dfsek.terra.api.addon.BaseAddon;
|
||||||
|
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent;
|
||||||
|
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
|
||||||
|
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
|
||||||
|
import com.dfsek.terra.api.inject.annotations.Inject;
|
||||||
|
import com.dfsek.terra.api.registry.CheckedRegistry;
|
||||||
|
import com.dfsek.terra.api.registry.Registry;
|
||||||
|
import com.dfsek.terra.api.util.reflection.TypeKey;
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|
||||||
|
public class BiomePipelineAddon implements AddonInitializer {
|
||||||
|
|
||||||
|
public static final TypeKey<Supplier<ObjectTemplate<BiomeSource>>> SOURCE_REGISTRY_KEY = new TypeKey<>() {
|
||||||
|
};
|
||||||
|
|
||||||
|
public static final TypeKey<Supplier<ObjectTemplate<Stage>>> STAGE_REGISTRY_KEY = new TypeKey<>() {
|
||||||
|
};
|
||||||
|
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
|
||||||
|
};
|
||||||
|
@Inject
|
||||||
|
private Platform platform;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private BaseAddon addon;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize() {
|
||||||
|
platform.getEventManager()
|
||||||
|
.getHandler(FunctionalEventHandler.class)
|
||||||
|
.register(addon, ConfigPackPreLoadEvent.class)
|
||||||
|
.then(event -> {
|
||||||
|
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry(
|
||||||
|
PROVIDER_REGISTRY_KEY);
|
||||||
|
providerRegistry.register(addon.key("PIPELINE"), BiomePipelineTemplate::new);
|
||||||
|
})
|
||||||
|
.then(event -> {
|
||||||
|
CheckedRegistry<Supplier<ObjectTemplate<BiomeSource>>> sourceRegistry = event.getPack().getOrCreateRegistry(
|
||||||
|
SOURCE_REGISTRY_KEY);
|
||||||
|
sourceRegistry.register(addon.key("SAMPLER"), SamplerSourceTemplate::new);
|
||||||
|
})
|
||||||
|
.then(event -> {
|
||||||
|
CheckedRegistry<Supplier<ObjectTemplate<Stage>>> stageRegistry = event.getPack().getOrCreateRegistry(
|
||||||
|
STAGE_REGISTRY_KEY);
|
||||||
|
stageRegistry.register(addon.key("FRACTAL_EXPAND"), ExpanderStageTemplate::new);
|
||||||
|
stageRegistry.register(addon.key("SMOOTH"), SmoothMutatorTemplate::new);
|
||||||
|
stageRegistry.register(addon.key("REPLACE"), ReplaceMutatorTemplate::new);
|
||||||
|
stageRegistry.register(addon.key("REPLACE_LIST"), ReplaceListMutatorTemplate::new);
|
||||||
|
stageRegistry.register(addon.key("BORDER"), BorderMutatorTemplate::new);
|
||||||
|
stageRegistry.register(addon.key("BORDER_LIST"), BorderListMutatorTemplate::new);
|
||||||
|
})
|
||||||
|
.failThrough();
|
||||||
|
platform.getEventManager()
|
||||||
|
.getHandler(FunctionalEventHandler.class)
|
||||||
|
.register(addon, ConfigPackPostLoadEvent.class)
|
||||||
|
.then(event -> {
|
||||||
|
Registry<Biome> biomeRegistry = event.getPack().getRegistry(Biome.class);
|
||||||
|
event.getPack().applyLoader(BiomeDelegate.class, new BiomeDelegateLoader(biomeRegistry));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline;
|
||||||
|
|
||||||
|
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||||
|
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||||
|
import net.jafama.FastMath;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.StreamSupport;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.registry.key.StringIdentifiable;
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|
||||||
|
public class BiomePipelineProvider implements BiomeProvider {
|
||||||
|
private final LoadingCache<SeededVector, BiomeHolder> holderCache;
|
||||||
|
private final BiomePipeline pipeline;
|
||||||
|
private final int resolution;
|
||||||
|
private final NoiseSampler mutator;
|
||||||
|
private final double noiseAmp;
|
||||||
|
|
||||||
|
private final Set<Biome> biomes;
|
||||||
|
|
||||||
|
public BiomePipelineProvider(BiomePipeline pipeline, int resolution, NoiseSampler mutator, double noiseAmp) {
|
||||||
|
this.resolution = resolution;
|
||||||
|
this.mutator = mutator;
|
||||||
|
this.noiseAmp = noiseAmp;
|
||||||
|
holderCache = Caffeine.newBuilder()
|
||||||
|
.maximumSize(1024)
|
||||||
|
.build(key -> pipeline.getBiomes(key.x, key.z, key.seed));
|
||||||
|
this.pipeline = pipeline;
|
||||||
|
|
||||||
|
Set<BiomeDelegate> biomeSet = new HashSet<>();
|
||||||
|
pipeline.getSource().getBiomes().forEach(biomeSet::add);
|
||||||
|
Iterable<BiomeDelegate> result = biomeSet;
|
||||||
|
for(Stage stage : pipeline.getStages()) {
|
||||||
|
result = stage.getBiomes(result); // pass through all stages
|
||||||
|
}
|
||||||
|
this.biomes = new HashSet<>();
|
||||||
|
Iterable<BiomeDelegate> finalResult = result;
|
||||||
|
result.forEach(biomeDelegate -> {
|
||||||
|
if(biomeDelegate.isEphemeral()) {
|
||||||
|
|
||||||
|
StringBuilder biomeList = new StringBuilder("\n");
|
||||||
|
StreamSupport.stream(finalResult.spliterator(), false)
|
||||||
|
.sorted(Comparator.comparing(StringIdentifiable::getID))
|
||||||
|
.forEach(delegate -> biomeList
|
||||||
|
.append(" - ")
|
||||||
|
.append(delegate.getID())
|
||||||
|
.append(':')
|
||||||
|
.append(delegate.getClass().getCanonicalName())
|
||||||
|
.append('\n'));
|
||||||
|
throw new IllegalArgumentException("Biome Pipeline leaks ephemeral biome \"" + biomeDelegate.getID() +
|
||||||
|
"\". Ensure there is a stage to guarantee replacement of the ephemeral biome. Biomes: " +
|
||||||
|
biomeList);
|
||||||
|
}
|
||||||
|
this.biomes.add(biomeDelegate.getBiome());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Biome getBiome(int x, int y, int z, long seed) {
|
||||||
|
x += mutator.noise(seed + 1, x, z) * noiseAmp;
|
||||||
|
z += mutator.noise(seed + 2, x, z) * noiseAmp;
|
||||||
|
|
||||||
|
|
||||||
|
x = FastMath.floorToInt(FastMath.floorDiv(x, resolution));
|
||||||
|
|
||||||
|
z = FastMath.floorToInt(FastMath.floorDiv(z, resolution));
|
||||||
|
|
||||||
|
int fdX = FastMath.floorDiv(x, pipeline.getSize());
|
||||||
|
int fdZ = FastMath.floorDiv(z, pipeline.getSize());
|
||||||
|
return holderCache.get(new SeededVector(fdX, fdZ, seed)).getBiome(x - fdX * pipeline.getSize(),
|
||||||
|
z - fdZ * pipeline.getSize()).getBiome();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<Biome> getBiomes() {
|
||||||
|
return biomes;
|
||||||
|
}
|
||||||
|
|
||||||
|
private record SeededVector(int x, int z, long seed) {
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.api;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeExpander;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
|
||||||
|
|
||||||
|
|
||||||
|
public interface BiomeHolder {
|
||||||
|
BiomeHolder expand(BiomeExpander expander, long seed);
|
||||||
|
|
||||||
|
void mutate(BiomeMutator mutator, long seed);
|
||||||
|
|
||||||
|
void fill(BiomeSource source, long seed);
|
||||||
|
|
||||||
|
BiomeDelegate getBiome(int x, int z);
|
||||||
|
|
||||||
|
BiomeDelegate getBiomeRaw(int x, int z);
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package com.dfsek.terra.addons.biome.pipeline.api.delegate;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.registry.key.StringIdentifiable;
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
|
||||||
|
|
||||||
|
public interface BiomeDelegate extends StringIdentifiable {
|
||||||
|
static BiomeDelegate ephemeral(String id) {
|
||||||
|
return new EphemeralBiomeDelegate(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static BiomeDelegate from(Biome biome) {
|
||||||
|
return new DelegatedBiome(biome);
|
||||||
|
}
|
||||||
|
|
||||||
|
static BiomeDelegate self() {
|
||||||
|
return SelfDelegate.INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Biome getBiome();
|
||||||
|
|
||||||
|
Set<String> getTags();
|
||||||
|
|
||||||
|
default boolean isEphemeral() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
default boolean isSelf() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package com.dfsek.terra.addons.biome.pipeline.api.delegate;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
|
||||||
|
|
||||||
|
final class DelegatedBiome implements BiomeDelegate {
|
||||||
|
private final Biome biome;
|
||||||
|
|
||||||
|
public DelegatedBiome(Biome biome) {
|
||||||
|
this.biome = biome;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Biome getBiome() {
|
||||||
|
return biome;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return biome.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if(!(obj instanceof DelegatedBiome that)) return false;
|
||||||
|
return that.biome.equals(this.biome);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> getTags() {
|
||||||
|
return biome.getTags();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getID() {
|
||||||
|
return biome.getID();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
package com.dfsek.terra.addons.biome.pipeline.api.delegate;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
|
||||||
|
|
||||||
|
final class EphemeralBiomeDelegate implements BiomeDelegate {
|
||||||
|
private final Set<String> tags;
|
||||||
|
private final String id;
|
||||||
|
|
||||||
|
public EphemeralBiomeDelegate(String id) {
|
||||||
|
this.id = id;
|
||||||
|
tags = new HashSet<>();
|
||||||
|
tags.add(id);
|
||||||
|
tags.add("ALL");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Biome getBiome() {
|
||||||
|
throw new UnsupportedOperationException("Cannot get biome from ephemeral delegate");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> getTags() {
|
||||||
|
return tags;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getID() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEphemeral() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return id.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if(!(obj instanceof EphemeralBiomeDelegate that)) return false;
|
||||||
|
|
||||||
|
return this.id.equals(that.id);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package com.dfsek.terra.addons.biome.pipeline.api.delegate;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
|
||||||
|
|
||||||
|
final class SelfDelegate implements BiomeDelegate {
|
||||||
|
public static final SelfDelegate INSTANCE = new SelfDelegate();
|
||||||
|
|
||||||
|
private SelfDelegate() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Biome getBiome() {
|
||||||
|
throw new UnsupportedOperationException("Cannot get biome from self delegate");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSelf() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEphemeral() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> getTags() {
|
||||||
|
return Collections.emptySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getID() {
|
||||||
|
return "SELF";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.api.stage;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
|
||||||
|
|
||||||
|
public interface Stage {
|
||||||
|
BiomeHolder apply(BiomeHolder in, long seed);
|
||||||
|
|
||||||
|
boolean isExpansion();
|
||||||
|
|
||||||
|
Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes);
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.api.stage.type;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
|
||||||
|
|
||||||
|
public interface BiomeExpander {
|
||||||
|
BiomeDelegate getBetween(double x, double z, long seed, BiomeDelegate... others);
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.api.stage.type;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
|
||||||
|
|
||||||
|
public interface BiomeMutator {
|
||||||
|
BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed);
|
||||||
|
|
||||||
|
default Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
|
||||||
|
return biomes;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ViewPoint {
|
||||||
|
private final BiomeHolder biomes;
|
||||||
|
private final int offX;
|
||||||
|
private final int offZ;
|
||||||
|
|
||||||
|
public ViewPoint(BiomeHolder biomes, int offX, int offZ) {
|
||||||
|
this.biomes = biomes;
|
||||||
|
this.offX = offX;
|
||||||
|
this.offZ = offZ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public BiomeDelegate getBiome(int x, int z) {
|
||||||
|
return biomes.getBiomeRaw(x + offX, z + offZ);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.dfsek.terra.addons.biome.pipeline.config;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.depth.DepthTracker;
|
||||||
|
import com.dfsek.tectonic.api.exception.LoadException;
|
||||||
|
import com.dfsek.tectonic.api.loader.ConfigLoader;
|
||||||
|
import com.dfsek.tectonic.api.loader.type.TypeLoader;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.lang.reflect.AnnotatedType;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.api.registry.Registry;
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
|
||||||
|
|
||||||
|
public class BiomeDelegateLoader implements TypeLoader<BiomeDelegate> {
|
||||||
|
private final Registry<Biome> biomeRegistry;
|
||||||
|
|
||||||
|
public BiomeDelegateLoader(Registry<Biome> biomeRegistry) {
|
||||||
|
this.biomeRegistry = biomeRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeDelegate load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker)
|
||||||
|
throws LoadException {
|
||||||
|
if(c.equals("SELF")) return BiomeDelegate.self();
|
||||||
|
return biomeRegistry
|
||||||
|
.getByID((String) c)
|
||||||
|
.map(BiomeDelegate::from)
|
||||||
|
.orElseGet(() -> BiomeDelegate.ephemeral((String) c));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.config;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.BiomePipeline;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.BiomePipelineProvider;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings({ "FieldMayBeFinal", "unused" })
|
||||||
|
public class BiomePipelineTemplate extends BiomeProviderTemplate {
|
||||||
|
@Value("pipeline.initial-size")
|
||||||
|
@Default
|
||||||
|
@Description("""
|
||||||
|
The initial size of biome chunks. This value must be at least 2.
|
||||||
|
<b>This is not the final size of biome chunks. Final chunks will be much larger</b>.
|
||||||
|
|
||||||
|
It is recommended to keep biome chunks' final size in the range of [50, 300]
|
||||||
|
to prevent performance issues. To calculate the size of biome chunks, simply
|
||||||
|
take initial-size and for each expand stage, multiply the running value by 2
|
||||||
|
and subtract 1. (The size is also printed to the server console if you
|
||||||
|
have debug mode enabled)""")
|
||||||
|
private @Meta int initialSize = 2;
|
||||||
|
|
||||||
|
@Value("pipeline.source")
|
||||||
|
@Description("The Biome Source to use for initial population of biomes.")
|
||||||
|
private @Meta BiomeSource source;
|
||||||
|
|
||||||
|
@Value("pipeline.stages")
|
||||||
|
@Description("A list of pipeline stages to apply to the result of #source")
|
||||||
|
private @Meta List<@Meta Stage> stages;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeProvider get() {
|
||||||
|
BiomePipeline.BiomePipelineBuilder biomePipelineBuilder = new BiomePipeline.BiomePipelineBuilder(initialSize);
|
||||||
|
stages.forEach(biomePipelineBuilder::addStage);
|
||||||
|
BiomePipeline pipeline = biomePipelineBuilder.build(source);
|
||||||
|
return new BiomePipelineProvider(pipeline, resolution, blend, blendAmp);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.config;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|
||||||
|
public abstract class BiomeProviderTemplate implements ObjectTemplate<BiomeProvider> {
|
||||||
|
@Value("resolution")
|
||||||
|
@Default
|
||||||
|
@Description("""
|
||||||
|
The resolution at which to sample biomes.
|
||||||
|
|
||||||
|
Larger values are quadratically faster, but produce lower quality results.
|
||||||
|
For example, a value of 3 would sample every 3 blocks.""")
|
||||||
|
protected @Meta int resolution = 1;
|
||||||
|
@Value("blend.sampler")
|
||||||
|
@Default
|
||||||
|
@Description("A sampler to use for blending the edges of biomes via domain warping.")
|
||||||
|
protected @Meta NoiseSampler blend = NoiseSampler.zero();
|
||||||
|
@Value("blend.amplitude")
|
||||||
|
@Default
|
||||||
|
@Description("The amplitude at which to perform blending.")
|
||||||
|
protected @Meta double blendAmp = 0d;
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.config;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.source.SamplerSource;
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
|
||||||
|
public class SamplerSourceTemplate extends SourceTemplate {
|
||||||
|
@Value("sampler")
|
||||||
|
@Description("The sampler used to distribute biomes.")
|
||||||
|
private @Meta NoiseSampler noise;
|
||||||
|
|
||||||
|
@Value("biomes")
|
||||||
|
@Description("The biomes to be distributed.")
|
||||||
|
private @Meta ProbabilityCollection<@Meta BiomeDelegate> biomes;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeSource get() {
|
||||||
|
return new SamplerSource(biomes, noise);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.config;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
|
||||||
|
|
||||||
|
|
||||||
|
public abstract class SourceTemplate implements ObjectTemplate<BiomeSource> {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.config.stage;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
|
||||||
|
public abstract class StageTemplate implements ObjectTemplate<Stage> {
|
||||||
|
@Value("sampler")
|
||||||
|
@Description("Sampler to use for stage distribution.")
|
||||||
|
protected @Meta NoiseSampler noise;
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.config.stage.expander;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.expand.FractalExpander;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.stages.ExpanderStage;
|
||||||
|
|
||||||
|
|
||||||
|
public class ExpanderStageTemplate extends StageTemplate {
|
||||||
|
@Override
|
||||||
|
public Stage get() {
|
||||||
|
return new ExpanderStage(new FractalExpander(noise));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.mutator.BorderListMutator;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage;
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public class BorderListMutatorTemplate extends StageTemplate {
|
||||||
|
@Value("from")
|
||||||
|
private @Meta String from;
|
||||||
|
|
||||||
|
@Value("default-replace")
|
||||||
|
private @Meta String defaultReplace;
|
||||||
|
|
||||||
|
@Value("default-to")
|
||||||
|
private @Meta ProbabilityCollection<@Meta BiomeDelegate> defaultTo;
|
||||||
|
|
||||||
|
@Value("replace")
|
||||||
|
private @Meta Map<@Meta BiomeDelegate, @Meta ProbabilityCollection<@Meta BiomeDelegate>> replace;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Stage get() {
|
||||||
|
return new MutatorStage(new BorderListMutator(replace, from, defaultReplace, noise, defaultTo));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.mutator.BorderMutator;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage;
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public class BorderMutatorTemplate extends StageTemplate {
|
||||||
|
@Value("from")
|
||||||
|
private @Meta String from;
|
||||||
|
|
||||||
|
@Value("replace")
|
||||||
|
private @Meta String replace;
|
||||||
|
|
||||||
|
@Value("to")
|
||||||
|
private @Meta ProbabilityCollection<@Meta BiomeDelegate> to;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Stage get() {
|
||||||
|
return new MutatorStage(new BorderMutator(from, replace, noise, to));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceListMutator;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage;
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public class ReplaceListMutatorTemplate extends StageTemplate {
|
||||||
|
@Value("default-from")
|
||||||
|
private @Meta String defaultFrom;
|
||||||
|
|
||||||
|
@Value("default-to")
|
||||||
|
private @Meta ProbabilityCollection<@Meta BiomeDelegate> defaultTo;
|
||||||
|
|
||||||
|
@Value("to")
|
||||||
|
private @Meta Map<@Meta BiomeDelegate, @Meta ProbabilityCollection<@Meta BiomeDelegate>> replace;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Stage get() {
|
||||||
|
return new MutatorStage(new ReplaceListMutator(replace, defaultFrom, defaultTo, noise));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceMutator;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage;
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public class ReplaceMutatorTemplate extends StageTemplate {
|
||||||
|
@Value("from")
|
||||||
|
private @Meta String from;
|
||||||
|
|
||||||
|
@Value("to")
|
||||||
|
private @Meta ProbabilityCollection<@Meta BiomeDelegate> to;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Stage get() {
|
||||||
|
return new MutatorStage(new ReplaceMutator(from, to, noise));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.mutator.SmoothMutator;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage;
|
||||||
|
|
||||||
|
|
||||||
|
public class SmoothMutatorTemplate extends StageTemplate {
|
||||||
|
@Override
|
||||||
|
public Stage get() {
|
||||||
|
return new MutatorStage(new SmoothMutator(noise));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.expand;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeExpander;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
|
||||||
|
public class FractalExpander implements BiomeExpander {
|
||||||
|
private final NoiseSampler sampler;
|
||||||
|
|
||||||
|
public FractalExpander(NoiseSampler sampler) {
|
||||||
|
this.sampler = sampler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeDelegate getBetween(double x, double z, long seed, BiomeDelegate... others) {
|
||||||
|
return others[MathUtil.normalizeIndex(sampler.noise(seed, x, z), others.length)];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.mutator;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
|
||||||
|
public class BorderListMutator implements BiomeMutator {
|
||||||
|
private final String border;
|
||||||
|
private final NoiseSampler noiseSampler;
|
||||||
|
private final ProbabilityCollection<BiomeDelegate> replaceDefault;
|
||||||
|
private final String defaultReplace;
|
||||||
|
private final Map<BiomeDelegate, ProbabilityCollection<BiomeDelegate>> replace;
|
||||||
|
|
||||||
|
public BorderListMutator(Map<BiomeDelegate, ProbabilityCollection<BiomeDelegate>> replace, String border, String defaultReplace,
|
||||||
|
NoiseSampler noiseSampler, ProbabilityCollection<BiomeDelegate> replaceDefault) {
|
||||||
|
this.border = border;
|
||||||
|
this.noiseSampler = noiseSampler;
|
||||||
|
this.replaceDefault = replaceDefault;
|
||||||
|
this.defaultReplace = defaultReplace;
|
||||||
|
this.replace = replace;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
|
||||||
|
BiomeDelegate origin = viewPoint.getBiome(0, 0);
|
||||||
|
if(origin.getTags().contains(defaultReplace)) {
|
||||||
|
for(int xi = -1; xi <= 1; xi++) {
|
||||||
|
for(int zi = -1; zi <= 1; zi++) {
|
||||||
|
if(xi == 0 && zi == 0) continue;
|
||||||
|
BiomeDelegate current = viewPoint.getBiome(xi, zi);
|
||||||
|
if(current != null && current.getTags().contains(border)) {
|
||||||
|
if(replace.containsKey(origin)) {
|
||||||
|
BiomeDelegate biome = replace.get(origin).get(noiseSampler, x, z, seed);
|
||||||
|
return biome.isSelf() ? origin : biome;
|
||||||
|
}
|
||||||
|
BiomeDelegate biome = replaceDefault.get(noiseSampler, x, z, seed);
|
||||||
|
return biome.isSelf() ? origin : biome;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return origin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
|
||||||
|
Set<BiomeDelegate> biomeSet = new HashSet<>();
|
||||||
|
biomes.forEach(biomeSet::add);
|
||||||
|
biomeSet.addAll(replaceDefault.getContents().stream().filter(Predicate.not(BiomeDelegate::isSelf)).toList());
|
||||||
|
replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents()));
|
||||||
|
return biomeSet;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.mutator;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
|
||||||
|
public class BorderMutator implements BiomeMutator {
|
||||||
|
private final String border;
|
||||||
|
private final NoiseSampler noiseSampler;
|
||||||
|
private final ProbabilityCollection<BiomeDelegate> replace;
|
||||||
|
private final String replaceTag;
|
||||||
|
|
||||||
|
public BorderMutator(String border, String replaceTag, NoiseSampler noiseSampler, ProbabilityCollection<BiomeDelegate> replace) {
|
||||||
|
this.border = border;
|
||||||
|
this.noiseSampler = noiseSampler;
|
||||||
|
this.replace = replace;
|
||||||
|
this.replaceTag = replaceTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
|
||||||
|
BiomeDelegate origin = viewPoint.getBiome(0, 0);
|
||||||
|
if(origin.getTags().contains(replaceTag)) {
|
||||||
|
for(int xi = -1; xi <= 1; xi++) {
|
||||||
|
for(int zi = -1; zi <= 1; zi++) {
|
||||||
|
if(xi == 0 && zi == 0) continue;
|
||||||
|
BiomeDelegate current = viewPoint.getBiome(xi, zi);
|
||||||
|
if(current != null && current.getTags().contains(border)) {
|
||||||
|
BiomeDelegate biome = replace.get(noiseSampler, x, z, seed);
|
||||||
|
return biome.isSelf() ? origin : biome;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return origin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
|
||||||
|
Set<BiomeDelegate> biomeSet = new HashSet<>();
|
||||||
|
biomes.forEach(biomeSet::add);
|
||||||
|
biomeSet.addAll(
|
||||||
|
replace
|
||||||
|
.getContents()
|
||||||
|
.stream()
|
||||||
|
.filter(
|
||||||
|
Predicate.not(BiomeDelegate::isSelf)
|
||||||
|
)
|
||||||
|
.toList()
|
||||||
|
);
|
||||||
|
return biomeSet;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.mutator;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
|
||||||
|
public class ReplaceListMutator implements BiomeMutator {
|
||||||
|
private final Map<BiomeDelegate, ProbabilityCollection<BiomeDelegate>> replace;
|
||||||
|
private final NoiseSampler sampler;
|
||||||
|
private final ProbabilityCollection<BiomeDelegate> replaceDefault;
|
||||||
|
private final String defaultTag;
|
||||||
|
|
||||||
|
public ReplaceListMutator(Map<BiomeDelegate, ProbabilityCollection<BiomeDelegate>> replace, String defaultTag,
|
||||||
|
ProbabilityCollection<BiomeDelegate> replaceDefault, NoiseSampler sampler) {
|
||||||
|
this.replace = replace;
|
||||||
|
this.sampler = sampler;
|
||||||
|
this.defaultTag = defaultTag;
|
||||||
|
this.replaceDefault = replaceDefault;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
|
||||||
|
BiomeDelegate center = viewPoint.getBiome(0, 0);
|
||||||
|
if(replace.containsKey(center)) {
|
||||||
|
BiomeDelegate biome = replace.get(center).get(sampler, x, z, seed);
|
||||||
|
return biome.isSelf() ? viewPoint.getBiome(0, 0) : biome;
|
||||||
|
}
|
||||||
|
if(viewPoint.getBiome(0, 0).getTags().contains(defaultTag)) {
|
||||||
|
BiomeDelegate biome = replaceDefault.get(sampler, x, z, seed);
|
||||||
|
return biome.isSelf() ? viewPoint.getBiome(0, 0) : biome;
|
||||||
|
}
|
||||||
|
return center;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
|
||||||
|
Set<BiomeDelegate> biomeSet = new HashSet<>();
|
||||||
|
|
||||||
|
Set<BiomeDelegate> reject = new HashSet<>();
|
||||||
|
|
||||||
|
biomes.forEach(biome -> {
|
||||||
|
if(!biome.getTags().contains(defaultTag) && !replace.containsKey(biome)) {
|
||||||
|
biomeSet.add(biome);
|
||||||
|
} else {
|
||||||
|
reject.add(biome);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
biomeSet.addAll(replaceDefault.getContents().stream().flatMap(terraBiome -> {
|
||||||
|
if(terraBiome.isSelf()) return reject.stream();
|
||||||
|
return Stream.of(terraBiome);
|
||||||
|
}).toList());
|
||||||
|
replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents().stream().map(terraBiome -> {
|
||||||
|
if(terraBiome.isSelf()) return biome;
|
||||||
|
return terraBiome;
|
||||||
|
}).toList()));
|
||||||
|
return biomeSet;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.mutator;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
|
||||||
|
public class ReplaceMutator implements BiomeMutator {
|
||||||
|
private final String replaceableTag;
|
||||||
|
private final ProbabilityCollection<BiomeDelegate> replace;
|
||||||
|
private final NoiseSampler sampler;
|
||||||
|
|
||||||
|
public ReplaceMutator(String replaceable, ProbabilityCollection<BiomeDelegate> replace, NoiseSampler sampler) {
|
||||||
|
this.replaceableTag = replaceable;
|
||||||
|
this.replace = replace;
|
||||||
|
this.sampler = sampler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
|
||||||
|
if(viewPoint.getBiome(0, 0).getTags().contains(replaceableTag)) {
|
||||||
|
BiomeDelegate biome = replace.get(sampler, x, z, seed);
|
||||||
|
return biome.isSelf() ? viewPoint.getBiome(0, 0) : biome;
|
||||||
|
}
|
||||||
|
return viewPoint.getBiome(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
|
||||||
|
Set<BiomeDelegate> biomeSet = new HashSet<>();
|
||||||
|
Set<BiomeDelegate> reject = new HashSet<>();
|
||||||
|
biomes.forEach(biome -> {
|
||||||
|
if(!biome.getTags().contains(replaceableTag)) {
|
||||||
|
biomeSet.add(biome);
|
||||||
|
} else {
|
||||||
|
reject.add(biome);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
biomeSet.addAll(replace.getContents().stream().flatMap(terraBiome -> {
|
||||||
|
if(terraBiome.isSelf()) return reject.stream();
|
||||||
|
return Stream.of(terraBiome);
|
||||||
|
}).toList());
|
||||||
|
return biomeSet;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.mutator;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
|
||||||
|
public class SmoothMutator implements BiomeMutator {
|
||||||
|
|
||||||
|
private final NoiseSampler sampler;
|
||||||
|
|
||||||
|
public SmoothMutator(NoiseSampler sampler) {
|
||||||
|
this.sampler = sampler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
|
||||||
|
BiomeDelegate top = viewPoint.getBiome(1, 0);
|
||||||
|
BiomeDelegate bottom = viewPoint.getBiome(-1, 0);
|
||||||
|
BiomeDelegate left = viewPoint.getBiome(0, 1);
|
||||||
|
BiomeDelegate right = viewPoint.getBiome(0, -1);
|
||||||
|
|
||||||
|
|
||||||
|
boolean vert = Objects.equals(top, bottom) && top != null;
|
||||||
|
boolean horiz = Objects.equals(left, right) && left != null;
|
||||||
|
|
||||||
|
if(vert && horiz) {
|
||||||
|
return MathUtil.normalizeIndex(sampler.noise(seed, x, z), 2) == 0 ? left : top;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(vert) return top;
|
||||||
|
if(horiz) return left;
|
||||||
|
|
||||||
|
return viewPoint.getBiome(0, 0);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.source;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
|
||||||
|
|
||||||
|
public interface BiomeSource {
|
||||||
|
BiomeDelegate getBiome(double x, double z, long seed);
|
||||||
|
|
||||||
|
Iterable<BiomeDelegate> getBiomes();
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.source;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
|
||||||
|
public class SamplerSource implements BiomeSource {
|
||||||
|
private final ProbabilityCollection<BiomeDelegate> biomes;
|
||||||
|
private final NoiseSampler sampler;
|
||||||
|
|
||||||
|
public SamplerSource(ProbabilityCollection<BiomeDelegate> biomes, NoiseSampler sampler) {
|
||||||
|
this.biomes = biomes;
|
||||||
|
this.sampler = sampler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeDelegate getBiome(double x, double z, long seed) {
|
||||||
|
return biomes.get(sampler, x, z, seed);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<BiomeDelegate> getBiomes() {
|
||||||
|
return biomes.getContents();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.stages;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeExpander;
|
||||||
|
|
||||||
|
|
||||||
|
public class ExpanderStage implements Stage {
|
||||||
|
private final BiomeExpander expander;
|
||||||
|
|
||||||
|
public ExpanderStage(BiomeExpander expander) {
|
||||||
|
this.expander = expander;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeHolder apply(BiomeHolder in, long seed) {
|
||||||
|
return in.expand(expander, seed);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isExpansion() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
|
||||||
|
return biomes;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.pipeline.stages;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
|
||||||
|
|
||||||
|
|
||||||
|
public class MutatorStage implements Stage {
|
||||||
|
private final BiomeMutator mutator;
|
||||||
|
|
||||||
|
public MutatorStage(BiomeMutator mutator) {
|
||||||
|
this.mutator = mutator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeHolder apply(BiomeHolder in, long seed) {
|
||||||
|
in.mutate(mutator, seed);
|
||||||
|
return in;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isExpansion() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
|
||||||
|
return mutator.getBiomes(biomes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Type {
|
||||||
|
REPLACE,
|
||||||
|
REPLACE_LIST,
|
||||||
|
BORDER,
|
||||||
|
BORDER_LIST,
|
||||||
|
SMOOTH
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
schema-version: 1
|
||||||
|
contributors:
|
||||||
|
- Terra contributors
|
||||||
|
id: biome-provider-pipeline
|
||||||
|
version: @VERSION@
|
||||||
|
entrypoints:
|
||||||
|
- "com.dfsek.terra.addons.biome.pipeline.BiomePipelineAddon"
|
||||||
|
website:
|
||||||
|
issues: https://github.com/PolyhedralDev/Terra/issues
|
||||||
|
source: https://github.com/PolyhedralDev/Terra
|
||||||
|
docs: https://terra.polydev.org
|
||||||
|
license: MIT License
|
21
common/addons/biome-provider-single/LICENSE
Normal file
21
common/addons/biome-provider-single/LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
4
common/addons/biome-provider-single/README.md
Normal file
4
common/addons/biome-provider-single/README.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# biome-provider-single
|
||||||
|
|
||||||
|
Registers and configures the `SINGLE` biome provider, a biome provider which
|
||||||
|
accepts a single biome to generate continuously.
|
5
common/addons/biome-provider-single/build.gradle.kts
Normal file
5
common/addons/biome-provider-single/build.gradle.kts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
version = version("1.0.0")
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.single;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|
||||||
|
public class SingleBiomeProvider implements BiomeProvider {
|
||||||
|
private final Biome biome;
|
||||||
|
|
||||||
|
public SingleBiomeProvider(Biome biome) {
|
||||||
|
this.biome = biome;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Biome getBiome(int x, int y, int z, long seed) {
|
||||||
|
return biome;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<Biome> getBiomes() {
|
||||||
|
return Collections.singleton(biome);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.single;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
||||||
|
import com.dfsek.terra.api.Platform;
|
||||||
|
import com.dfsek.terra.api.addon.BaseAddon;
|
||||||
|
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
|
||||||
|
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
|
||||||
|
import com.dfsek.terra.api.inject.annotations.Inject;
|
||||||
|
import com.dfsek.terra.api.registry.CheckedRegistry;
|
||||||
|
import com.dfsek.terra.api.util.reflection.TypeKey;
|
||||||
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|
||||||
|
public class SingleBiomeProviderAddon implements AddonInitializer {
|
||||||
|
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
|
||||||
|
};
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private Platform platform;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private BaseAddon addon;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize() {
|
||||||
|
platform.getEventManager()
|
||||||
|
.getHandler(FunctionalEventHandler.class)
|
||||||
|
.register(addon, ConfigPackPreLoadEvent.class)
|
||||||
|
.then(event -> {
|
||||||
|
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry(
|
||||||
|
PROVIDER_REGISTRY_KEY);
|
||||||
|
providerRegistry.register(addon.key("SINGLE"), SingleBiomeProviderTemplate::new);
|
||||||
|
})
|
||||||
|
.failThrough();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.biome.single;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|
||||||
|
public class SingleBiomeProviderTemplate implements ObjectTemplate<BiomeProvider> {
|
||||||
|
@Value("biome")
|
||||||
|
private @Meta Biome biome;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeProvider get() {
|
||||||
|
return new SingleBiomeProvider(biome);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
schema-version: 1
|
||||||
|
contributors:
|
||||||
|
- Terra contributors
|
||||||
|
id: biome-provider-single
|
||||||
|
version: @VERSION@
|
||||||
|
entrypoints:
|
||||||
|
- "com.dfsek.terra.addons.biome.single.SingleBiomeProviderAddon"
|
||||||
|
website:
|
||||||
|
issues: https://github.com/PolyhedralDev/Terra/issues
|
||||||
|
source: https://github.com/PolyhedralDev/Terra
|
||||||
|
docs: https://terra.polydev.org
|
||||||
|
license: MIT License
|
21
common/addons/chunk-generator-noise-3d/LICENSE
Normal file
21
common/addons/chunk-generator-noise-3d/LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
4
common/addons/chunk-generator-noise-3d/README.md
Normal file
4
common/addons/chunk-generator-noise-3d/README.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# chunk-generator-noise-3d
|
||||||
|
|
||||||
|
Registers the `NOISE_3D` chunk generator, a chunk generator which uses biomes'
|
||||||
|
samplers in 3D to generate chunk data.
|
12
common/addons/chunk-generator-noise-3d/build.gradle.kts
Normal file
12
common/addons/chunk-generator-noise-3d/build.gradle.kts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
version = version("1.0.0")
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
|
|
||||||
|
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
||||||
|
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
||||||
|
relocate("net.jafama", "com.dfsek.terra.addons.chunkgenerator.lib.jafama")
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.chunkgenerator;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.config.NoiseChunkGeneratorPackConfigTemplate;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseConfigTemplate;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.config.palette.BiomePaletteTemplate;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.config.palette.SlantLayer;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.generation.NoiseChunkGenerator3D;
|
||||||
|
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
||||||
|
import com.dfsek.terra.api.Platform;
|
||||||
|
import com.dfsek.terra.api.addon.BaseAddon;
|
||||||
|
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
|
||||||
|
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
|
||||||
|
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
|
||||||
|
import com.dfsek.terra.api.inject.annotations.Inject;
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorProvider;
|
||||||
|
|
||||||
|
|
||||||
|
public class NoiseChunkGenerator3DAddon implements AddonInitializer {
|
||||||
|
@Inject
|
||||||
|
private Platform platform;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private BaseAddon addon;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize() {
|
||||||
|
platform.getEventManager()
|
||||||
|
.getHandler(FunctionalEventHandler.class)
|
||||||
|
.register(addon, ConfigPackPreLoadEvent.class)
|
||||||
|
.then(event -> {
|
||||||
|
NoiseChunkGeneratorPackConfigTemplate config = event.loadTemplate(new NoiseChunkGeneratorPackConfigTemplate());
|
||||||
|
|
||||||
|
event.getPack()
|
||||||
|
.getOrCreateRegistry(ChunkGeneratorProvider.class)
|
||||||
|
.register(addon.key("NOISE_3D"),
|
||||||
|
pack -> new NoiseChunkGenerator3D(platform, config.getElevationBlend(), config.getHorizontalRes(),
|
||||||
|
config.getVerticalRes()));
|
||||||
|
event.getPack()
|
||||||
|
.applyLoader(SlantLayer.class, SlantLayer::new);
|
||||||
|
})
|
||||||
|
.failThrough();
|
||||||
|
|
||||||
|
platform.getEventManager()
|
||||||
|
.getHandler(FunctionalEventHandler.class)
|
||||||
|
.register(addon, ConfigurationLoadEvent.class)
|
||||||
|
.then(event -> {
|
||||||
|
if(event.is(Biome.class)) {
|
||||||
|
event.getLoadedObject(Biome.class).getContext().put(event.load(new BiomePaletteTemplate(platform)).get());
|
||||||
|
event.getLoadedObject(Biome.class).getContext().put(event.load(new BiomeNoiseConfigTemplate()).get());
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.failThrough();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package com.dfsek.terra.addons.chunkgenerator.config;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
|
|
||||||
|
|
||||||
|
public class NoiseChunkGeneratorPackConfigTemplate implements ConfigTemplate {
|
||||||
|
@Value("blend.terrain.elevation")
|
||||||
|
@Default
|
||||||
|
private @Meta int elevationBlend = 4;
|
||||||
|
|
||||||
|
@Value("carving.resolution.horizontal")
|
||||||
|
@Default
|
||||||
|
private @Meta int horizontalRes = 4;
|
||||||
|
|
||||||
|
@Value("carving.resolution.vertical")
|
||||||
|
@Default
|
||||||
|
private @Meta int verticalRes = 2;
|
||||||
|
|
||||||
|
public int getElevationBlend() {
|
||||||
|
return elevationBlend;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getHorizontalRes() {
|
||||||
|
return horizontalRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getVerticalRes() {
|
||||||
|
return verticalRes;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
package com.dfsek.terra.addons.chunkgenerator.config.noise;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
|
||||||
|
public class BiomeNoiseConfigTemplate implements ObjectTemplate<BiomeNoiseProperties> {
|
||||||
|
@Value("terrain.sampler")
|
||||||
|
private @Meta NoiseSampler baseSampler;
|
||||||
|
|
||||||
|
@Value("terrain.sampler-2d")
|
||||||
|
@Default
|
||||||
|
private @Meta NoiseSampler elevationSampler = NoiseSampler.zero();
|
||||||
|
|
||||||
|
@Value("carving.sampler")
|
||||||
|
@Default
|
||||||
|
private @Meta NoiseSampler carvingSampler = NoiseSampler.zero();
|
||||||
|
|
||||||
|
@Value("terrain.blend.distance")
|
||||||
|
@Default
|
||||||
|
private @Meta int blendDistance = 3;
|
||||||
|
|
||||||
|
@Value("terrain.blend.weight")
|
||||||
|
@Default
|
||||||
|
private @Meta double blendWeight = 1;
|
||||||
|
|
||||||
|
@Value("terrain.blend.step")
|
||||||
|
@Default
|
||||||
|
private @Meta int blendStep = 4;
|
||||||
|
|
||||||
|
@Value("terrain.blend.weight-2d")
|
||||||
|
@Default
|
||||||
|
private @Meta double elevationWeight = 1;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeNoiseProperties get() {
|
||||||
|
return new BiomeNoiseProperties(baseSampler, elevationSampler, carvingSampler, blendDistance, blendStep, blendWeight,
|
||||||
|
elevationWeight);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package com.dfsek.terra.addons.chunkgenerator.config.noise;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.properties.Properties;
|
||||||
|
|
||||||
|
|
||||||
|
public record BiomeNoiseProperties(NoiseSampler base,
|
||||||
|
NoiseSampler elevation,
|
||||||
|
NoiseSampler carving,
|
||||||
|
int blendDistance,
|
||||||
|
int blendStep,
|
||||||
|
double blendWeight,
|
||||||
|
double elevationWeight) implements Properties {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.chunkgenerator.config.palette;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolderBuilder;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder;
|
||||||
|
import com.dfsek.terra.api.Platform;
|
||||||
|
import com.dfsek.terra.api.block.state.BlockState;
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
|
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||||
|
|
||||||
|
|
||||||
|
public class BiomePaletteTemplate implements ObjectTemplate<PaletteInfo> {
|
||||||
|
private final Platform platform;
|
||||||
|
|
||||||
|
@Value("slant")
|
||||||
|
@Default
|
||||||
|
@Description("The slant palettes to use in this biome.")
|
||||||
|
private @Meta List<@Meta SlantLayer> slant = Collections.emptyList();
|
||||||
|
|
||||||
|
@Value("slant-depth")
|
||||||
|
@Default
|
||||||
|
@Description("The maximum depth at which to apply a slant palette.")
|
||||||
|
private @Meta int slantDepth = Integer.MAX_VALUE;
|
||||||
|
|
||||||
|
@Value("palette")
|
||||||
|
@Description("The palettes to use in this biome.")
|
||||||
|
private @Meta List<@Meta Map<@Meta Palette, @Meta Integer>> palettes;
|
||||||
|
|
||||||
|
@Value("ocean.level")
|
||||||
|
@Description("Sea level in this biome. Defaults to zero")
|
||||||
|
@Default
|
||||||
|
private @Meta int seaLevel = 0;
|
||||||
|
|
||||||
|
@Value("ocean.palette")
|
||||||
|
@Description("The palette to use for the ocean in this biome. Defaults to a blank palette.")
|
||||||
|
@Default
|
||||||
|
private @Meta Palette oceanPalette = new Palette() {
|
||||||
|
@Override
|
||||||
|
public BlockState get(int layer, double x, double y, double z, long seed) {
|
||||||
|
return platform.getWorldHandle().air();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public BiomePaletteTemplate(Platform platform) { this.platform = platform; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PaletteInfo get() {
|
||||||
|
PaletteHolderBuilder builder = new PaletteHolderBuilder();
|
||||||
|
for(Map<Palette, Integer> layer : palettes) {
|
||||||
|
for(Entry<Palette, Integer> entry : layer.entrySet()) {
|
||||||
|
builder.add(entry.getValue(), entry.getKey());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TreeMap<Double, PaletteHolder> slantLayers = new TreeMap<>();
|
||||||
|
double minThreshold = Double.MAX_VALUE;
|
||||||
|
|
||||||
|
for(SlantLayer layer : slant) {
|
||||||
|
double threshold = layer.getThreshold();
|
||||||
|
if(threshold < minThreshold) minThreshold = threshold;
|
||||||
|
slantLayers.put(threshold, layer.getPalette());
|
||||||
|
}
|
||||||
|
|
||||||
|
return new PaletteInfo(builder.build(), SlantHolder.of(slantLayers, minThreshold), oceanPalette, seaLevel, slantDepth);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.chunkgenerator.config.palette;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder;
|
||||||
|
import com.dfsek.terra.api.properties.Properties;
|
||||||
|
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||||
|
|
||||||
|
|
||||||
|
public record PaletteInfo(PaletteHolder paletteHolder,
|
||||||
|
SlantHolder slantHolder,
|
||||||
|
Palette ocean,
|
||||||
|
int seaLevel,
|
||||||
|
int maxSlantDepth) implements Properties {
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package com.dfsek.terra.addons.chunkgenerator.config.palette;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolderBuilder;
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
|
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||||
|
|
||||||
|
|
||||||
|
public class SlantLayer implements ObjectTemplate<SlantLayer> {
|
||||||
|
@Value("threshold")
|
||||||
|
private @Meta double threshold;
|
||||||
|
|
||||||
|
@Value("palette")
|
||||||
|
private @Meta List<@Meta Map<@Meta Palette, @Meta Integer>> palettes;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SlantLayer get() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getThreshold() {
|
||||||
|
return threshold;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PaletteHolder getPalette() {
|
||||||
|
PaletteHolderBuilder builder = new PaletteHolderBuilder();
|
||||||
|
for(Map<Palette, Integer> layer : palettes) {
|
||||||
|
for(Entry<Palette, Integer> entry : layer.entrySet()) {
|
||||||
|
builder.add(entry.getValue(), entry.getKey());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.build();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,137 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.chunkgenerator.generation;
|
||||||
|
|
||||||
|
|
||||||
|
import net.jafama.FastMath;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.config.palette.PaletteInfo;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.generation.math.PaletteUtil;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.LazilyEvaluatedInterpolator;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.SamplerProvider;
|
||||||
|
import com.dfsek.terra.api.Platform;
|
||||||
|
import com.dfsek.terra.api.block.state.BlockState;
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator;
|
||||||
|
import com.dfsek.terra.api.world.chunk.generation.ProtoChunk;
|
||||||
|
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||||
|
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||||
|
|
||||||
|
|
||||||
|
public class NoiseChunkGenerator3D implements ChunkGenerator {
|
||||||
|
private final Platform platform;
|
||||||
|
|
||||||
|
private final SamplerProvider samplerCache;
|
||||||
|
|
||||||
|
private final BlockState air;
|
||||||
|
|
||||||
|
private final int carverHorizontalResolution;
|
||||||
|
private final int carverVerticalResolution;
|
||||||
|
|
||||||
|
public NoiseChunkGenerator3D(Platform platform, int elevationBlend, int carverHorizontalResolution,
|
||||||
|
int carverVerticalResolution) {
|
||||||
|
this.platform = platform;
|
||||||
|
this.air = platform.getWorldHandle().air();
|
||||||
|
this.carverHorizontalResolution = carverHorizontalResolution;
|
||||||
|
this.carverVerticalResolution = carverVerticalResolution;
|
||||||
|
this.samplerCache = new SamplerProvider(platform, elevationBlend);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("try")
|
||||||
|
public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldProperties world,
|
||||||
|
@NotNull BiomeProvider biomeProvider,
|
||||||
|
int chunkX, int chunkZ) {
|
||||||
|
platform.getProfiler().push("chunk_base_3d");
|
||||||
|
int xOrig = (chunkX << 4);
|
||||||
|
int zOrig = (chunkZ << 4);
|
||||||
|
|
||||||
|
Sampler3D sampler = samplerCache.getChunk(chunkX, chunkZ, world, biomeProvider);
|
||||||
|
|
||||||
|
long seed = world.getSeed();
|
||||||
|
|
||||||
|
LazilyEvaluatedInterpolator carver = new LazilyEvaluatedInterpolator(biomeProvider,
|
||||||
|
chunkX,
|
||||||
|
chunkZ,
|
||||||
|
world.getMaxHeight(),
|
||||||
|
world.getMinHeight(),
|
||||||
|
carverHorizontalResolution,
|
||||||
|
carverVerticalResolution,
|
||||||
|
seed);
|
||||||
|
for(int x = 0; x < 16; x++) {
|
||||||
|
for(int z = 0; z < 16; z++) {
|
||||||
|
int paletteLevel = 0;
|
||||||
|
|
||||||
|
int cx = xOrig + x;
|
||||||
|
int cz = zOrig + z;
|
||||||
|
|
||||||
|
Biome biome = biomeProvider.getBiome(cx, 0, cz, seed);
|
||||||
|
|
||||||
|
PaletteInfo paletteInfo = biome.getContext().get(PaletteInfo.class);
|
||||||
|
|
||||||
|
int sea = paletteInfo.seaLevel();
|
||||||
|
Palette seaPalette = paletteInfo.ocean();
|
||||||
|
|
||||||
|
BlockState data;
|
||||||
|
for(int y = world.getMaxHeight() - 1; y >= world.getMinHeight(); y--) {
|
||||||
|
if(sampler.sample(x, y, z) > 0) {
|
||||||
|
if(carver.sample(x, y, z) <= 0) {
|
||||||
|
data = PaletteUtil.getPalette(x, y, z, sampler, paletteInfo, paletteLevel).get(paletteLevel, cx, y, cz,
|
||||||
|
seed);
|
||||||
|
chunk.setBlock(x, y, z, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
paletteLevel++;
|
||||||
|
} else if(y <= sea) {
|
||||||
|
chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, y, z + zOrig, seed));
|
||||||
|
paletteLevel = 0;
|
||||||
|
} else {
|
||||||
|
paletteLevel = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
platform.getProfiler().pop("chunk_base_3d");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProvider biomeProvider) {
|
||||||
|
Biome biome = biomeProvider.getBiome(x, y, z, world.getSeed());
|
||||||
|
Sampler3D sampler = samplerCache.get(x, z, world, biomeProvider);
|
||||||
|
|
||||||
|
PaletteInfo paletteInfo = biome.getContext().get(PaletteInfo.class);
|
||||||
|
|
||||||
|
int fdX = FastMath.floorMod(x, 16);
|
||||||
|
int fdZ = FastMath.floorMod(z, 16);
|
||||||
|
|
||||||
|
Palette palette = PaletteUtil.getPalette(fdX, y, fdZ, sampler, paletteInfo, 0);
|
||||||
|
double noise = sampler.sample(fdX, y, fdZ);
|
||||||
|
if(noise > 0) {
|
||||||
|
int level = 0;
|
||||||
|
for(int yi = world.getMaxHeight() - 1; yi > y; yi--) {
|
||||||
|
if(sampler.sample(fdX, yi, fdZ) > 0) level++;
|
||||||
|
else level = 0;
|
||||||
|
}
|
||||||
|
return palette.get(level, x, y, z, world.getSeed());
|
||||||
|
} else if(y <= paletteInfo.seaLevel()) {
|
||||||
|
return paletteInfo.ocean().get(paletteInfo.seaLevel() - y, x, y, z, world.getSeed());
|
||||||
|
} else return air;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Palette getPalette(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
||||||
|
return biomeProvider.getBiome(x, y, z, world.getSeed()).getContext().get(PaletteInfo.class).paletteHolder().getPalette(y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SamplerProvider samplerProvider() {
|
||||||
|
return samplerCache;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.chunkgenerator.generation.math;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.config.palette.PaletteInfo;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder;
|
||||||
|
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||||
|
|
||||||
|
|
||||||
|
public final class PaletteUtil {
|
||||||
|
/**
|
||||||
|
* Derivative constant.
|
||||||
|
*/
|
||||||
|
private static final double DERIVATIVE_DIST = 0.55;
|
||||||
|
|
||||||
|
public static Palette getPalette(int x, int y, int z, Sampler3D sampler, PaletteInfo paletteInfo, int depth) {
|
||||||
|
SlantHolder slant = paletteInfo.slantHolder();
|
||||||
|
if(!slant.isEmpty() && depth <= paletteInfo.maxSlantDepth()) {
|
||||||
|
double slope = derivative(sampler, x, y, z);
|
||||||
|
if(slope > slant.getMinSlope()) {
|
||||||
|
return slant.getPalette(slope).getPalette(y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return paletteInfo.paletteHolder().getPalette(y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double derivative(Sampler3D sampler, double x, double y, double z) {
|
||||||
|
double baseSample = sampler.sample(x, y, z);
|
||||||
|
|
||||||
|
double xVal1 = (sampler.sample(x + DERIVATIVE_DIST, y, z) - baseSample) / DERIVATIVE_DIST;
|
||||||
|
double xVal2 = (sampler.sample(x - DERIVATIVE_DIST, y, z) - baseSample) / DERIVATIVE_DIST;
|
||||||
|
double zVal1 = (sampler.sample(x, y, z + DERIVATIVE_DIST) - baseSample) / DERIVATIVE_DIST;
|
||||||
|
double zVal2 = (sampler.sample(x, y, z - DERIVATIVE_DIST) - baseSample) / DERIVATIVE_DIST;
|
||||||
|
double yVal1 = (sampler.sample(x, y + DERIVATIVE_DIST, z) - baseSample) / DERIVATIVE_DIST;
|
||||||
|
double yVal2 = (sampler.sample(x, y - DERIVATIVE_DIST, z) - baseSample) / DERIVATIVE_DIST;
|
||||||
|
|
||||||
|
return Math.sqrt(((xVal2 - xVal1) * (xVal2 - xVal1)) + ((zVal2 - zVal1) * (zVal2 - zVal1)) + ((yVal2 - yVal1) * (yVal2 - yVal1)));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,142 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
|
||||||
|
|
||||||
|
import net.jafama.FastMath;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties;
|
||||||
|
import com.dfsek.terra.api.util.mutable.MutableInteger;
|
||||||
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to abstract away the Interpolators needed to generate a chunk.<br>
|
||||||
|
* Contains method to get interpolated noise at a coordinate within the chunk.
|
||||||
|
*/
|
||||||
|
public class ChunkInterpolator {
|
||||||
|
private final Interpolator3[][][] interpGrid;
|
||||||
|
private final long seed;
|
||||||
|
|
||||||
|
private final int min;
|
||||||
|
private final int max;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiates a 3D ChunkInterpolator3D at a pair of chunk coordinates.
|
||||||
|
*
|
||||||
|
* @param chunkX X coordinate of the chunk.
|
||||||
|
* @param chunkZ Z coordinate of the chunk.
|
||||||
|
* @param provider Biome Provider to use for biome fetching.
|
||||||
|
* @param min
|
||||||
|
* @param max
|
||||||
|
*/
|
||||||
|
public ChunkInterpolator(long seed, int chunkX, int chunkZ, BiomeProvider provider, int min, int max) {
|
||||||
|
this.min = min;
|
||||||
|
this.max = max;
|
||||||
|
this.seed = seed;
|
||||||
|
|
||||||
|
int xOrigin = chunkX << 4;
|
||||||
|
int zOrigin = chunkZ << 4;
|
||||||
|
|
||||||
|
int range = this.max - this.min + 1;
|
||||||
|
|
||||||
|
int size = range >> 2;
|
||||||
|
|
||||||
|
interpGrid = new Interpolator3[4][size][4];
|
||||||
|
|
||||||
|
double[][][] noiseStorage = new double[5][5][size + 1];
|
||||||
|
|
||||||
|
for(int x = 0; x < 5; x++) {
|
||||||
|
for(int z = 0; z < 5; z++) {
|
||||||
|
BiomeNoiseProperties generationSettings = provider.getBiome(xOrigin + (x << 2), 0, zOrigin + (z << 2), seed)
|
||||||
|
.getContext()
|
||||||
|
.get(BiomeNoiseProperties.class);
|
||||||
|
Map<BiomeNoiseProperties, MutableInteger> genMap = new HashMap<>();
|
||||||
|
|
||||||
|
int step = generationSettings.blendStep();
|
||||||
|
int blend = generationSettings.blendDistance();
|
||||||
|
|
||||||
|
for(int xi = -blend; xi <= blend; xi++) {
|
||||||
|
for(int zi = -blend; zi <= blend; zi++) {
|
||||||
|
genMap.computeIfAbsent(
|
||||||
|
provider.getBiome(xOrigin + (x << 2) + (xi * step), 0, zOrigin + (z << 2) + (zi * step), seed)
|
||||||
|
.getContext()
|
||||||
|
.get(BiomeNoiseProperties.class),
|
||||||
|
g -> new MutableInteger(0)).increment(); // Increment by 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int y = 0; y < size + 1; y++) {
|
||||||
|
noiseStorage[x][z][y] = computeNoise(genMap, (x << 2) + xOrigin, (y << 2) + this.min, (z << 2) + zOrigin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int x = 0; x < 4; x++) {
|
||||||
|
for(int z = 0; z < 4; z++) {
|
||||||
|
for(int y = 0; y < size; y++) {
|
||||||
|
interpGrid[x][y][z] = new Interpolator3(
|
||||||
|
noiseStorage[x][z][y],
|
||||||
|
noiseStorage[x + 1][z][y],
|
||||||
|
noiseStorage[x][z][y + 1],
|
||||||
|
noiseStorage[x + 1][z][y + 1],
|
||||||
|
noiseStorage[x][z + 1][y],
|
||||||
|
noiseStorage[x + 1][z + 1][y],
|
||||||
|
noiseStorage[x][z + 1][y + 1],
|
||||||
|
noiseStorage[x + 1][z + 1][y + 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int reRange(int value, int high) {
|
||||||
|
return FastMath.max(FastMath.min(value, high), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double computeNoise(BiomeNoiseProperties generationSettings, double x, double y, double z) {
|
||||||
|
return generationSettings.base().noise(seed, x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double computeNoise(Map<BiomeNoiseProperties, MutableInteger> gens, double x, double y, double z) {
|
||||||
|
double n = 0;
|
||||||
|
double div = 0;
|
||||||
|
for(Map.Entry<BiomeNoiseProperties, MutableInteger> entry : gens.entrySet()) {
|
||||||
|
BiomeNoiseProperties gen = entry.getKey();
|
||||||
|
int weight = entry.getValue().get();
|
||||||
|
double noise = computeNoise(gen, x, y, z);
|
||||||
|
|
||||||
|
n += noise * weight;
|
||||||
|
div += gen.blendWeight() * weight;
|
||||||
|
}
|
||||||
|
return n / div;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the noise at a pair of internal chunk coordinates.
|
||||||
|
*
|
||||||
|
* @param x The internal X coordinate (0-15).
|
||||||
|
* @param z The internal Z coordinate (0-15).
|
||||||
|
*
|
||||||
|
* @return double - The interpolated noise at the coordinates.
|
||||||
|
*/
|
||||||
|
public double getNoise(double x, double y, double z) {
|
||||||
|
return interpGrid[reRange(((int) x) / 4, 3)][(FastMath.max(FastMath.min(((int) y), max), min) - min) / 4][reRange(((int) z) / 4,
|
||||||
|
3)].trilerp(
|
||||||
|
(x % 4) / 4, (y % 4) / 4, (z % 4) / 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getNoise(int x, int y, int z) {
|
||||||
|
return interpGrid[x / 4][(y - min) / 4][z / 4].trilerp(
|
||||||
|
(double) (x & 3) / 4, // x & 3 == x % 4
|
||||||
|
(double) (y & 3) / 4, // x & 3 == x % 4
|
||||||
|
(double) (z & 3) / 4 // x & 3 == x % 4
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties;
|
||||||
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|
||||||
|
public class ElevationInterpolator {
|
||||||
|
private final double[][] values = new double[18][18];
|
||||||
|
|
||||||
|
public ElevationInterpolator(long seed, int chunkX, int chunkZ, BiomeProvider provider, int smooth) {
|
||||||
|
int xOrigin = chunkX << 4;
|
||||||
|
int zOrigin = chunkZ << 4;
|
||||||
|
|
||||||
|
BiomeNoiseProperties[][] gens = new BiomeNoiseProperties[18 + 2 * smooth][18 + 2 * smooth];
|
||||||
|
|
||||||
|
// Precompute generators.
|
||||||
|
for(int x = -1 - smooth; x <= 16 + smooth; x++) {
|
||||||
|
for(int z = -1 - smooth; z <= 16 + smooth; z++) {
|
||||||
|
gens[x + 1 + smooth][z + 1 + smooth] = provider.getBiome(xOrigin + x, 0, zOrigin + z, seed).getContext().get(
|
||||||
|
BiomeNoiseProperties.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int x = -1; x <= 16; x++) {
|
||||||
|
for(int z = -1; z <= 16; z++) {
|
||||||
|
double noise = 0;
|
||||||
|
double div = 0;
|
||||||
|
|
||||||
|
BiomeNoiseProperties center = gens[x + 1 + smooth][z + 1 + smooth];
|
||||||
|
boolean same = true;
|
||||||
|
|
||||||
|
for(int xi = -smooth; xi <= smooth; xi++) {
|
||||||
|
for(int zi = -smooth; zi <= smooth; zi++) {
|
||||||
|
if(gens[x + 1 + smooth + xi][z + 1 + smooth + zi] !=
|
||||||
|
center) { // test referential equality because thats all we need to know
|
||||||
|
same = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(same) {
|
||||||
|
values[x + 1][z + 1] = center.elevation().noise(seed, xOrigin + x, zOrigin + z); // no weighting needed!
|
||||||
|
} else {
|
||||||
|
for(int xi = -smooth; xi <= smooth; xi++) {
|
||||||
|
for(int zi = -smooth; zi <= smooth; zi++) {
|
||||||
|
BiomeNoiseProperties gen = gens[x + 1 + smooth + xi][z + 1 + smooth + zi];
|
||||||
|
noise += gen.elevation().noise(seed, xOrigin + x, zOrigin + z) * gen.elevationWeight();
|
||||||
|
div += gen.elevationWeight();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values[x + 1][z + 1] = noise / div;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getElevation(int x, int z) {
|
||||||
|
return values[x + 1][z + 1];
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user