diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 70f8c88..0000000 --- a/.editorconfig +++ /dev/null @@ -1,321 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -indent_size = 4 -indent_style = space -insert_final_newline = true -max_line_length = 120 -tab_width = 4 -trim_trailing_whitespace = true -ij_continuation_indent_size = 4 -ij_formatter_off_tag = @formatter:off -ij_formatter_on_tag = @formatter:on -ij_formatter_tags_enabled = false -ij_smart_tabs = false -ij_visual_guides = 120 -ij_wrap_on_typing = false - -[{*.json,.eslintrc,.prettierrc,mcmod.info,pack.mcmeta}] -indent_size = 2 -tab_width = 2 -ij_continuation_indent_size = 2 -ij_visual_guides = none -ij_json_array_wrapping = split_into_lines -ij_json_keep_blank_lines_in_code = 1 -ij_json_keep_indents_on_empty_lines = false -ij_json_keep_line_breaks = true -ij_json_keep_trailing_comma = false -ij_json_object_wrapping = split_into_lines -ij_json_property_alignment = do_not_align -ij_json_space_after_colon = true -ij_json_space_after_comma = true -ij_json_space_before_colon = false -ij_json_space_before_comma = false -ij_json_spaces_within_braces = false -ij_json_spaces_within_brackets = false -ij_json_wrap_long_lines = false - -[*.java] -ij_visual_guides = none -ij_java_align_consecutive_assignments = false -ij_java_align_consecutive_variable_declarations = false -ij_java_align_group_field_declarations = false -ij_java_align_multiline_annotation_parameters = false -ij_java_align_multiline_array_initializer_expression = false -ij_java_align_multiline_assignment = false -ij_java_align_multiline_binary_operation = false -ij_java_align_multiline_chained_methods = false -ij_java_align_multiline_extends_list = false -ij_java_align_multiline_for = false -ij_java_align_multiline_method_parentheses = false -ij_java_align_multiline_parameters = false -ij_java_align_multiline_parameters_in_calls = false -ij_java_align_multiline_parenthesized_expression = false -ij_java_align_multiline_records = true -ij_java_align_multiline_resources = false -ij_java_align_multiline_ternary_operation = false -ij_java_align_multiline_text_blocks = true -ij_java_align_multiline_throws_list = false -ij_java_align_subsequent_simple_methods = false -ij_java_align_throws_keyword = false -ij_java_align_types_in_multi_catch = true -ij_java_annotation_parameter_wrap = off -ij_java_array_initializer_new_line_after_left_brace = false -ij_java_array_initializer_right_brace_on_new_line = false -ij_java_array_initializer_wrap = off -ij_java_assert_statement_colon_on_next_line = false -ij_java_assert_statement_wrap = off -ij_java_assignment_wrap = off -ij_java_binary_operation_sign_on_next_line = false -ij_java_binary_operation_wrap = off -ij_java_blank_lines_after_anonymous_class_header = 0 -ij_java_blank_lines_after_class_header = 0 -ij_java_blank_lines_after_imports = 1 -ij_java_blank_lines_after_package = 1 -ij_java_blank_lines_around_class = 1 -ij_java_blank_lines_around_field = 0 -ij_java_blank_lines_around_field_in_interface = 0 -ij_java_blank_lines_around_initializer = 1 -ij_java_blank_lines_around_method = 1 -ij_java_blank_lines_around_method_in_interface = 1 -ij_java_blank_lines_before_class_end = 0 -ij_java_blank_lines_before_imports = 1 -ij_java_blank_lines_before_method_body = 0 -ij_java_blank_lines_before_package = 0 -ij_java_block_brace_style = end_of_line -ij_java_block_comment_add_space = true -ij_java_block_comment_at_first_column = false -ij_java_builder_methods = none -ij_java_call_parameters_new_line_after_left_paren = true -ij_java_call_parameters_right_paren_on_new_line = true -ij_java_call_parameters_wrap = on_every_item -ij_java_case_statement_on_separate_line = true -ij_java_catch_on_new_line = false -ij_java_class_annotation_wrap = split_into_lines -ij_java_class_brace_style = end_of_line -ij_java_class_count_to_use_import_on_demand = 5 -ij_java_class_names_in_javadoc = 3 -ij_java_do_not_indent_top_level_class_members = false -ij_java_do_not_wrap_after_single_annotation = true -ij_java_do_not_wrap_after_single_annotation_in_parameter = true -ij_java_do_while_brace_force = always -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_return = false -ij_java_doc_add_p_tag_on_empty_lines = true -ij_java_doc_align_exception_comments = true -ij_java_doc_align_param_comments = true -ij_java_doc_do_not_wrap_if_one_line = true -ij_java_doc_enable_formatting = true -ij_java_doc_enable_leading_asterisks = true -ij_java_doc_indent_on_continuation = false -ij_java_doc_keep_empty_lines = true -ij_java_doc_keep_empty_parameter_tag = true -ij_java_doc_keep_empty_return_tag = true -ij_java_doc_keep_empty_throws_tag = true -ij_java_doc_keep_invalid_tags = false -ij_java_doc_param_description_on_new_line = false -ij_java_doc_preserve_line_breaks = false -ij_java_doc_use_throws_not_exception_tag = true -ij_java_else_on_new_line = false -ij_java_enum_constants_wrap = on_every_item -ij_java_extends_keyword_wrap = off -ij_java_extends_list_wrap = off -ij_java_field_annotation_wrap = split_into_lines -ij_java_finally_on_new_line = false -ij_java_for_brace_force = always -ij_java_for_statement_new_line_after_left_paren = false -ij_java_for_statement_right_paren_on_new_line = false -ij_java_for_statement_wrap = off -ij_java_generate_final_locals = false -ij_java_generate_final_parameters = false -ij_java_if_brace_force = if_multiline -ij_java_imports_layout = *, |, javax.**, java.**, |, $* -ij_java_indent_case_from_switch = true -ij_java_insert_inner_class_imports = false -ij_java_insert_override_annotation = true -ij_java_keep_blank_lines_before_right_brace = 0 -ij_java_keep_blank_lines_between_package_declaration_and_header = 1 -ij_java_keep_blank_lines_in_code = 1 -ij_java_keep_blank_lines_in_declarations = 1 -ij_java_keep_builder_methods_indents = false -ij_java_keep_control_statement_in_one_line = true -ij_java_keep_first_column_comment = false -ij_java_keep_indents_on_empty_lines = false -ij_java_keep_line_breaks = true -ij_java_keep_multiple_expressions_in_one_line = false -ij_java_keep_simple_blocks_in_one_line = false -ij_java_keep_simple_classes_in_one_line = true -ij_java_keep_simple_lambdas_in_one_line = true -ij_java_keep_simple_methods_in_one_line = true -ij_java_label_indent_absolute = false -ij_java_label_indent_size = 0 -ij_java_lambda_brace_style = end_of_line -ij_java_layout_static_imports_separately = true -ij_java_line_comment_add_space = true -ij_java_line_comment_add_space_on_reformat = true -ij_java_line_comment_at_first_column = false -ij_java_method_annotation_wrap = split_into_lines -ij_java_method_brace_style = end_of_line -ij_java_method_call_chain_wrap = on_every_item -ij_java_method_parameters_new_line_after_left_paren = true -ij_java_method_parameters_right_paren_on_new_line = true -ij_java_method_parameters_wrap = normal -ij_java_modifier_list_wrap = false -ij_java_multi_catch_types_wrap = on_every_item -ij_java_names_count_to_use_import_on_demand = 3 -ij_java_new_line_after_lparen_in_annotation = 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_parameter_annotation_wrap = off -ij_java_parentheses_expression_new_line_after_left_paren = false -ij_java_parentheses_expression_right_paren_on_new_line = false -ij_java_place_assignment_sign_on_next_line = false -ij_java_prefer_longer_names = true -ij_java_prefer_parameters_wrap = false -ij_java_record_components_wrap = off -ij_java_repeat_synchronized = true -ij_java_replace_instanceof_and_cast = true -ij_java_replace_null_check = true -ij_java_replace_sum_lambda_with_method_ref = true -ij_java_resource_list_new_line_after_left_paren = false -ij_java_resource_list_right_paren_on_new_line = false -ij_java_resource_list_wrap = off -ij_java_rparen_on_new_line_in_annotation = false -ij_java_rparen_on_new_line_in_record_header = false -ij_java_space_after_closing_angle_bracket_in_type_argument = true -ij_java_space_after_colon = true -ij_java_space_after_comma = true -ij_java_space_after_comma_in_type_arguments = true -ij_java_space_after_for_semicolon = true -ij_java_space_after_quest = true -ij_java_space_after_type_cast = true -ij_java_space_before_annotation_array_initializer_left_brace = false -ij_java_space_before_annotation_parameter_list = false -ij_java_space_before_array_initializer_left_brace = false -ij_java_space_before_catch_keyword = true -ij_java_space_before_catch_left_brace = true -ij_java_space_before_catch_parentheses = true -ij_java_space_before_class_left_brace = true -ij_java_space_before_colon = true -ij_java_space_before_colon_in_foreach = true -ij_java_space_before_comma = false -ij_java_space_before_do_left_brace = true -ij_java_space_before_else_keyword = true -ij_java_space_before_else_left_brace = true -ij_java_space_before_finally_keyword = true -ij_java_space_before_finally_left_brace = true -ij_java_space_before_for_left_brace = true -ij_java_space_before_for_parentheses = true -ij_java_space_before_for_semicolon = false -ij_java_space_before_if_left_brace = true -ij_java_space_before_if_parentheses = true -ij_java_space_before_method_call_parentheses = false -ij_java_space_before_method_left_brace = true -ij_java_space_before_method_parentheses = false -ij_java_space_before_opening_angle_bracket_in_type_parameter = false -ij_java_space_before_quest = true -ij_java_space_before_switch_left_brace = true -ij_java_space_before_switch_parentheses = true -ij_java_space_before_synchronized_left_brace = true -ij_java_space_before_synchronized_parentheses = true -ij_java_space_before_try_left_brace = true -ij_java_space_before_try_parentheses = true -ij_java_space_before_type_parameter_list = false -ij_java_space_before_while_keyword = true -ij_java_space_before_while_left_brace = true -ij_java_space_before_while_parentheses = true -ij_java_space_inside_one_line_enum_braces = false -ij_java_space_within_empty_array_initializer_braces = false -ij_java_space_within_empty_method_call_parentheses = false -ij_java_space_within_empty_method_parentheses = false -ij_java_spaces_around_additive_operators = true -ij_java_spaces_around_annotation_eq = true -ij_java_spaces_around_assignment_operators = true -ij_java_spaces_around_bitwise_operators = true -ij_java_spaces_around_equality_operators = true -ij_java_spaces_around_lambda_arrow = true -ij_java_spaces_around_logical_operators = true -ij_java_spaces_around_method_ref_dbl_colon = false -ij_java_spaces_around_multiplicative_operators = true -ij_java_spaces_around_relational_operators = true -ij_java_spaces_around_shift_operators = true -ij_java_spaces_around_type_bounds_in_type_parameters = true -ij_java_spaces_around_unary_operator = false -ij_java_spaces_within_angle_brackets = false -ij_java_spaces_within_annotation_parentheses = false -ij_java_spaces_within_array_initializer_braces = false -ij_java_spaces_within_braces = false -ij_java_spaces_within_brackets = false -ij_java_spaces_within_cast_parentheses = false -ij_java_spaces_within_catch_parentheses = false -ij_java_spaces_within_for_parentheses = false -ij_java_spaces_within_if_parentheses = false -ij_java_spaces_within_method_call_parentheses = false -ij_java_spaces_within_method_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_synchronized_parentheses = false -ij_java_spaces_within_try_parentheses = false -ij_java_spaces_within_while_parentheses = false -ij_java_special_else_if_treatment = true -ij_java_subclass_name_suffix = Impl -ij_java_ternary_operation_signs_on_next_line = false -ij_java_ternary_operation_wrap = normal -ij_java_test_name_suffix = Test -ij_java_throws_keyword_wrap = off -ij_java_throws_list_wrap = off -ij_java_use_external_annotations = false -ij_java_use_fq_class_names = false -ij_java_use_relative_indents = false -ij_java_use_single_class_imports = true -ij_java_variable_annotation_wrap = split_into_lines -ij_java_visibility = public -ij_java_while_brace_force = always -ij_java_while_on_new_line = false -ij_java_wrap_comments = false -ij_java_wrap_first_method_in_call_chain = false -ij_java_wrap_long_lines = false - -[*.properties] -ij_visual_guides = none -ij_properties_align_group_field_declarations = false -ij_properties_keep_blank_lines = true -ij_properties_key_value_delimiter = equals -ij_properties_spaces_around_key_value_delimiter = true - -[.editorconfig] -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 - -[{*.toml,Cargo.lock,Cargo.toml.orig,Gopkg.lock,Pipfile,poetry.lock}] -indent_size = 2 -tab_width = 2 -ij_continuation_indent_size = 2 -ij_visual_guides = none -ij_toml_keep_indents_on_empty_lines = false - -[{*.yaml,*.yml}] -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 = false -ij_yaml_keep_line_breaks = false -ij_yaml_sequence_on_new_line = true -ij_yaml_space_before_colon = false -ij_yaml_spaces_within_braces = false -ij_yaml_spaces_within_brackets = false - -[{*.markdown,*.md}] -ij_formatter_enabled = false diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 74b1255..18c2036 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,56 +4,29 @@ on: workflow_dispatch: push: branches: - - '1.20.1-forge' + - "1.20.4" tags-ignore: - - '**' + - "**" paths: - - 'gradle/**' - - '**.java' - - '**.kts' - - '**.properties' - - '**/build.yml' + - "gradle/**" + - "**.java" + - "**.kts" + - "**.properties" + - "**/build.yml" pull_request: branches: - - '1.20.1-forge' + - "1.20.4" paths: - - 'gradle/**' - - '**.java' - - '**.kts' - - '**.properties' - - '**/build.yml' + - "gradle/**" + - "**.java" + - "**.kts" + - "**.properties" + - "**/build.yml" -env: - JAVA_DIST: 'zulu' - JAVA_VERSION: 17 +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: - build: - name: Build - runs-on: ubuntu-latest - if: | - !contains(github.event.head_commit.message, '[skip build]') - steps: - - name: Clone Repository - uses: actions/checkout@v3 - - - name: Set up JDK ${{ env.JAVA_VERSION }} - uses: actions/setup-java@v3 - with: - java-version: ${{ env.JAVA_VERSION }} - distribution: ${{ env.JAVA_DIST }} - cache: gradle - - - name: Cleanup Gradle Cache - run: | - rm -f ~/.gradle/caches/modules-2/modules-2.lock - rm -f ~/.gradle/caches/modules-2/gc.properties - - - name: Make Gradle executable - run: chmod +x ./gradlew - - - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v1 - - - name: Build - run: ./gradlew build --stacktrace + redirect: + uses: AlmostReliable/.github/.github/workflows/build-java17.yml@main diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 584bea5..d7f755b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,222 +2,48 @@ name: Release on: workflow_dispatch: - push: - tags: - - 'v1.20.1-forge-*.*.*' - -env: - JAVA_DIST: 'zulu' - JAVA_VERSION: 17 - MOD_ID: 'merequester' - MOD_NAME: 'MERequester' - CURSEFORGE_ID: '688367' - MODRINTH_ID: 'E6BFl96N' + inputs: + target_version: + type: string + required: false + description: "mod version | empty = next option" + update_type: + type: choice + required: false + description: "update type" + default: "minor" + options: + - "major" + - "minor" + - "patch" + - "none" + release_type: + type: choice + required: true + description: "type of release" + default: "release" + options: + - "alpha" + - "beta" + - "release" + debug: + type: boolean + required: false + default: false + description: "enable debug mode (GitHub only)" jobs: - - checking: - name: Checking prerequisites - runs-on: ubuntu-latest - steps: - - name: Check Secrets - run: | - if [ -z "${{ secrets.MODRINTH_TOKEN }}" ]; then - echo "MODRINTH_TOKEN is not set" - exit 1 - fi - if [ -z "${{ secrets.CURSEFORGE_TOKEN }}" ]; then - echo "CURSEFORGE_TOKEN is not set" - exit 1 - fi - - - name: Validate Modrinth Token - run: | - if [ -n "$(curl -s -H "Authorization: ${{ secrets.MODRINTH_TOKEN }}" https://api.modrinth.com/v2/user | grep "unauthorized")" ]; then - echo "Modrinth Token is invalid!" - exit 1 - fi - - build: - name: Build, collect info, parse changelog - needs: checking - runs-on: ubuntu-latest - outputs: - JAR_FILE: ${{ steps.collect_info.outputs.JAR_FILE }} - MINECRAFT_VERSION: ${{ steps.collect_info.outputs.MINECRAFT_VERSION }} - MOD_VERSION: ${{ steps.collect_info.outputs.MOD_VERSION }} - RELEASE_TYPE: ${{ steps.collect_info.outputs.RELEASE_TYPE }} - steps: - - name: Clone Repository - uses: actions/checkout@v3 - - - name: Set up JDK ${{ env.JAVA_VERSION }} - uses: actions/setup-java@v3 - with: - java-version: ${{ env.JAVA_VERSION }} - distribution: ${{ env.JAVA_DIST }} - cache: gradle - - - name: Cleanup Gradle Cache - run: | - rm -f ~/.gradle/caches/modules-2/modules-2.lock - rm -f ~/.gradle/caches/modules-2/gc.properties - - - name: Make Gradle executable - run: chmod +x ./gradlew - - - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v1 - - - name: Assemble the JARs - run: ./gradlew assemble - - - name: Move JARs to central directory - run: | - mkdir output - mv -f build/libs/*.jar output/ - - - name: Collect version information - id: collect_info - run: | - shopt -s failglob # print a warning if a glob does not match anything - set_var() { - echo $1="$2" - echo $1="$2" >> $GITHUB_OUTPUT - declare -g $1="$2" - } - set_var JAR_FILE $(eval echo output/${{ env.MOD_ID }}-forge-*-*.jar) - set_var MINECRAFT_VERSION $(echo ${JAR_FILE%.*} | cut -d- -f3) - set_var MOD_VERSION $(echo ${JAR_FILE%.*} | cut -d- -f4) - set_var RELEASE_TYPE "$(echo ${GITHUB_REF##*/} | cut -d- -f5)" - set_var RELEASE_TYPE "$([[ -z $RELEASE_TYPE ]] && echo release || echo $RELEASE_TYPE)" - - - name: Install changelog parser - uses: taiki-e/install-action@parse-changelog - - - name: Parse changelog - run: parse-changelog CHANGELOG.md ${{ steps.collect_info.outputs.MOD_VERSION }} > output/changelog.md - - - name: Archive results - run: tar -zcvf build.tar.gz output - - - name: Upload results - uses: actions/upload-artifact@v3 - with: - name: build-artifacts - path: build.tar.gz - if-no-files-found: error - retention-days: 3 - - - name: Job Summary - run: | - echo "# Version Information" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "- Minecraft Version: ${{ steps.collect_info.outputs.MINECRAFT_VERSION }}" >> $GITHUB_STEP_SUMMARY - echo "- Mod Version: ${{ steps.collect_info.outputs.MOD_VERSION }}" >> $GITHUB_STEP_SUMMARY - echo "- Release Type: ${{ steps.collect_info.outputs.RELEASE_TYPE }}" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "# Build Information" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "- JAR files: $(find output -maxdepth 1 -type f -name '*.jar' | wc -l)" >> $GITHUB_STEP_SUMMARY - echo "- Folder size: $(du -sh output | cut -f1)" >> $GITHUB_STEP_SUMMARY - echo "- Archive size: $(du -sh build.tar.gz | cut -f1)" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "# Changelog" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - cat output/changelog.md >> $GITHUB_STEP_SUMMARY - - mr-forge-release: - name: Modrinth Forge Release - needs: build - runs-on: ubuntu-latest - steps: - - name: Download build artifacts - uses: actions/download-artifact@v3 - with: - name: build-artifacts - - - name: Extract build artifacts - run: tar -zxvf build.tar.gz - - - name: Release Forge on Modrinth - uses: Kir-Antipov/mc-publish@v3.3 - with: - modrinth-id: ${{ env.MODRINTH_ID }} - modrinth-token: ${{ secrets.MODRINTH_TOKEN }} - - files: output/*forge*.jar - name: ${{ env.MOD_NAME }}-Forge-${{ needs.build.outputs.MINECRAFT_VERSION }}-${{ needs.build.outputs.MOD_VERSION }} - version: ${{ needs.build.outputs.MINECRAFT_VERSION }}-${{ needs.build.outputs.MOD_VERSION }}+forge - version-type: ${{ needs.build.outputs.RELEASE_TYPE }} - changelog-file: output/changelog.md - - loaders: | - forge - neoforge - game-versions: ${{ needs.build.outputs.MINECRAFT_VERSION }} - java: ${{ env.JAVA_VERSION }} - - dependencies: | - ae2(required){curseforge:223794}{modrinth:XxWD5pD3} - jei(optional){curseforge:238222}{modrinth:u6dRKJwZ} - rei(optional){curseforge:310111}{modrinth:nfn13YXA} - - cf-forge-release: - name: CurseForge Forge Release - needs: build - runs-on: ubuntu-latest - steps: - - name: Download build artifacts - uses: actions/download-artifact@v3 - with: - name: build-artifacts - - - name: Extract build artifacts - run: tar -zxvf build.tar.gz - - - name: Release Forge on CurseForge - uses: Kir-Antipov/mc-publish@v3.3 - with: - curseforge-id: ${{ env.CURSEFORGE_ID }} - curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} - - files: output/*forge*.jar - name: ${{ env.MOD_NAME }}-Forge-${{ needs.build.outputs.MINECRAFT_VERSION }}-${{ needs.build.outputs.MOD_VERSION }} - version: ${{ needs.build.outputs.MINECRAFT_VERSION }}-${{ needs.build.outputs.MOD_VERSION }}+forge - version-type: ${{ needs.build.outputs.RELEASE_TYPE }} - changelog-file: output/changelog.md - - loaders: | - forge - neoforge - game-versions: ${{ needs.build.outputs.MINECRAFT_VERSION }} - java: ${{ env.JAVA_VERSION }} - - dependencies: | - ae2(required){curseforge:223794}{modrinth:XxWD5pD3} - jei(optional){curseforge:238222}{modrinth:u6dRKJwZ} - rei(optional){curseforge:310111}{modrinth:nfn13YXA} - - github-release: - name: GitHub Release - needs: build - runs-on: ubuntu-latest - steps: - - name: Download build artifacts - uses: actions/download-artifact@v3 - with: - name: build-artifacts - - - name: Extract build artifacts - run: tar -zxvf build.tar.gz - - - name: Release on GitHub - uses: Kir-Antipov/mc-publish@v3.3 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - files: output/*.jar - name: v${{ needs.build.outputs.MINECRAFT_VERSION }}-${{ needs.build.outputs.MOD_VERSION }}-Forge - version: ${{ needs.build.outputs.MINECRAFT_VERSION }}-${{ needs.build.outputs.MOD_VERSION }} - version-type: ${{ needs.build.outputs.RELEASE_TYPE }} - changelog-file: output/changelog.md + redirect: + uses: AlmostReliable/.github/.github/workflows/release-java17-nf.yml@main + secrets: inherit + with: + mod_name: "MERequester" + curseforge_id: "688367" + modrinth_id: "E6BFl96N" + dependencies: | + ae2(required){curseforge:223794}{modrinth:XxWD5pD3} + target_version: ${{ github.event.inputs.target_version }} + update_type: ${{ github.event.inputs.update_type }} + release_type: ${{ github.event.inputs.release_type }} + loaders: neoforge + debug: ${{ github.event.inputs.debug }} diff --git a/.gitignore b/.gitignore index 86f8102..9435b3a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,59 +1,17 @@ -### ForgeGradle ### -run/ - ### Intellij ### -.idea/ -*.iml -*.ipr - -# File-based project format -*.iws - -# IntelliJ -out/ +.idea/* +!.idea/codeStyles/ +!.idea/inspectionProfiles/ ### Java ### -# Compiled class file *.class - -# Log file -*.log - -# Package Files # *.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar - -### VisualStudioCode ### -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# Local History for Visual Studio Code -.history/ ### Gradle ### -.gradle +.gradle/ build/ - -# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) -!gradle-wrapper.jar - -### Gradle Patch ### -**/build/ - -# Eclipse Gradle plugin generated files -# Eclipse Core -.project -# JDT-specific (Eclipse Java Development Tools) -.classpath +!gradle/wrapper/gradle-wrapper.jar ### Project ### -extra-mods-*/ +run/ +**/generated/.cache/ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..d256475 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,375 @@ + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..eb67594 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,764 @@ + + + + \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index c5619e4..afdceaf 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,84 +1,91 @@ @file:Suppress("UnstableApiUsage") -import net.fabricmc.loom.api.LoomGradleExtensionAPI - val license: String by project -val enableAccessWidener: String by project -val minecraftVersion: String by project +val logLevel: String by project +val mixinDebugExport: String by project +val recipeViewer: String by project +val mcVersion: String by project val modVersion: String by project val modPackage: String by project val modId: String by project val modName: String by project val modAuthor: String by project val modDescription: String by project +val neoVersion: String by project val parchmentVersion: String by project -val forgeVersion: String by project -val forgeRecipeViewer: String by project val aeVersion: String by project val jeiVersion: String by project val reiVersion: String by project +val emiVersion: String by project val githubUser: String by project val githubRepo: String by project plugins { - id("dev.architectury.loom") version "1.3.+" - id("io.github.juuxel.loom-vineflower") version "1.11.0" + id("net.neoforged.gradle.userdev") version "7.0.97" id("com.github.gmazzo.buildconfig") version "4.0.4" java } base { - version = "$minecraftVersion-$modVersion" + version = "$mcVersion-$modVersion" group = modPackage - archivesName.set("$modId-forge") + archivesName.set("$modId-neoforge") } -loom { - silentMojangMappingsLicense() - - forge { - mixinConfig("$modId.mixins.json") +java.toolchain.languageVersion = JavaLanguageVersion.of(17) + +val commonSystemProperties = mapOf( + "forge.logging.console.level" to logLevel, + "mixin.debug.export" to mixinDebugExport, + "guideDev.ae2guide.sources" to file("guidebook").absolutePath, + "guideDev.ae2guide.sourcesNamespace" to modId +) + +runs { + configureEach { + workingDirectory = project.file("run") + systemProperties = commonSystemProperties + modSource(sourceSets.main.get()) + jvmArguments("-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AllowEnhancedClassRedefinition") } - if (project.findProperty("enableAccessWidener") == "true") { - accessWidenerPath.set(file("src/main/resources/$modId.accesswidener")) - forge { - convertAccessWideners.set(true) - extraAccessWideners.add(loom.accessWidenerPath.get().asFile.name) - } - println("Access widener enabled for project. Access widener path: ${loom.accessWidenerPath.get()}") + create("client") { + programArguments("--quickPlaySingleplayer", "New World") + } + create("guide") { + configure("client") + systemProperty("guideDev.ae2guide.startupPage", "$modId:getting-started.md") } + create("server") } repositories { - maven("https://maven.parchmentmc.org/") // Parchment - maven("https://modmaven.dev/") // Applied Energistics 2 + maven("https://maven.neoforged.net/releases") // NeoForge + maven("https://modmaven.dev") // Applied Energistics 2 maven("https://maven.blamejared.com") // JEI maven("https://maven.shedaniel.me") // REI + maven("https://maven.terraformersmc.com") // EMI mavenLocal() } dependencies { - // Minecraft - minecraft("com.mojang:minecraft:$minecraftVersion") - mappings(loom.layered { - officialMojangMappings() - parchment("org.parchmentmc.data:parchment-$minecraftVersion:$parchmentVersion@zip") - }) - - // Forge - forge("net.minecraftforge:forge:$minecraftVersion-$forgeVersion") + // NeoForge + implementation("net.neoforged:neoforge:$neoVersion") // Compile - modCompileOnly("appeng:appliedenergistics2-forge:$aeVersion") - modCompileOnly("me.shedaniel:RoughlyEnoughItems-api-forge:$reiVersion") + compileOnly("appeng:appliedenergistics2-neoforge:$aeVersion") // Runtime - modLocalRuntime("appeng:appliedenergistics2-forge:$aeVersion") - when (forgeRecipeViewer) { - "rei" -> modLocalRuntime("me.shedaniel:RoughlyEnoughItems-forge:$reiVersion") - "jei" -> modLocalRuntime("mezz.jei:jei-$minecraftVersion-forge:$jeiVersion") { isTransitive = false } - else -> throw GradleException("Invalid recipeViewer value: $forgeRecipeViewer") + runtimeOnly("appeng:appliedenergistics2-neoforge:$aeVersion") + when (recipeViewer) { + "jei" -> runtimeOnly("mezz.jei:jei-$mcVersion-neoforge:$jeiVersion") { isTransitive = false } + "rei" -> { + runtimeOnly("me.shedaniel:RoughlyEnoughItems-neoforge:$reiVersion") + runtimeOnly("dev.architectury:architectury-neoforge:11.1.17") // TODO: Remove on new REI version + } + + "emi" -> runtimeOnly("dev.emi:emi-neoforge:$emiVersion+$mcVersion") + else -> throw GradleException("Invalid recipeViewer value: $recipeViewer") } } @@ -87,18 +94,17 @@ tasks { val resourceTargets = listOf("META-INF/mods.toml", "pack.mcmeta") val replaceProperties = mapOf( - "license" to license, - "minecraftVersion" to minecraftVersion, - "version" to project.version as String, - "modId" to modId, - "modName" to modName, - "modAuthor" to modAuthor, - "modDescription" to modDescription, - "forgeVersion" to forgeVersion, - "forgeLoaderVersion" to forgeVersion.substringBefore("."), - "aeVersion" to aeVersion, - "githubUser" to githubUser, - "githubRepo" to githubRepo + "license" to license, + "mcVersion" to mcVersion, + "version" to project.version as String, + "modId" to modId, + "modName" to modName, + "modAuthor" to modAuthor, + "modDescription" to modDescription, + "neoVersion" to neoVersion, + "aeVersion" to aeVersion, + "githubUser" to githubUser, + "githubRepo" to githubRepo ) println("[Process Resources] Replacing properties in resources: ") @@ -115,21 +121,20 @@ tasks { options.release.set(17) } + withType { + from("guidebook") { + into("assets/$modId/ae2guide") + } + } + withType { enabled = false } } -extensions.configure { - toolchain.languageVersion.set(JavaLanguageVersion.of(17)) -} - -extensions.configure { - runs { - forEach { - it.vmArgs("-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AllowEnhancedClassRedefinition") - } - } +subsystems.parchment { + minecraftVersion(mcVersion) + mappingsVersion(parchmentVersion) } buildConfig { diff --git a/gradle.properties b/gradle.properties index 4573a7c..3685892 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,14 @@ # Project license = GNU Lesser General Public License v3.0 -enableAccessWidener = false -loom.platform = forge +loom.platform = neoforge + +# Settings +logLevel = debug +mixinDebugExport = false +recipeViewer = jei # Minecraft -minecraftVersion = 1.20.1 +mcVersion = 1.20.4 # Mod modVersion = 1.1.4 @@ -15,16 +19,14 @@ modAuthor = Almost Reliable modDescription = Keep items and fluids in your ME-System in stock. # Project Dependencies -parchmentVersion = 2023.07.09 - -# Forge Dependencies -forgeVersion = 47.1.3 -forgeRecipeViewer = jei +neoVersion = 20.4.196 +parchmentVersion = 2024.02.25 # Mod Dependencies -aeVersion = 15.0.6-beta -reiVersion = 12.0.625 -jeiVersion = 15.2.0.22 +aeVersion = 17.10.4-beta +jeiVersion = 17.3.0.49 +reiVersion = 14.0.688 +emiVersion = 1.1.2 # Github githubUser = AlmostReliable diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3762f15..3c60348 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase = GRADLE_USER_HOME distributionPath = wrapper/dists -distributionUrl = https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl = https\://services.gradle.org/distributions/gradle-8.5-bin.zip zipStoreBase = GRADLE_USER_HOME zipStorePath = wrapper/dists diff --git a/guidebook/getting-started.md b/guidebook/getting-started.md new file mode 100644 index 0000000..bad5562 --- /dev/null +++ b/guidebook/getting-started.md @@ -0,0 +1 @@ +# Getting Started diff --git a/settings.gradle.kts b/settings.gradle.kts index 5f8203b..bf693be 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,12 +1,10 @@ pluginManagement { repositories { - maven("https://maven.architectury.dev/") - maven("https://maven.fabricmc.net/") - maven("https://maven.minecraftforge.net/") + maven("https://maven.neoforged.net/releases") gradlePluginPortal() } } val modName = extra.get("modName").toString().replace(" ", "-") -val minecraftVersion: String by extra -rootProject.name = "$modName-$minecraftVersion-Forge" +val mcVersion: String by extra +rootProject.name = "$modName-$mcVersion-NeoForge" diff --git a/src/main/java/com/almostreliable/merequester/Config.java b/src/main/java/com/almostreliable/merequester/Config.java new file mode 100644 index 0000000..8d5a36d --- /dev/null +++ b/src/main/java/com/almostreliable/merequester/Config.java @@ -0,0 +1,36 @@ +package com.almostreliable.merequester; + +import net.neoforged.neoforge.common.ModConfigSpec; + +public final class Config { + + static final ModConfigSpec COMMON_SPEC; + public static final CommonConfig COMMON; + + static { + var commonPair = new ModConfigSpec.Builder().configure(CommonConfig::new); + COMMON_SPEC = commonPair.getRight(); + COMMON = commonPair.getLeft(); + } + + private Config() {} + + public static final class CommonConfig { + + public final ModConfigSpec.IntValue requests; + public final ModConfigSpec.DoubleValue idleEnergy; + public final ModConfigSpec.BooleanValue requireChannel; + + private CommonConfig(ModConfigSpec.Builder builder) { + builder.push(MERequester.REQUESTER_ID); + requests = builder.comment("The amount of requests a single ME Requester can hold.").defineInRange("requests", 5, 1, 64); + idleEnergy = builder + .comment("The amount of energy (in AE) the ME Requester drains from the ME network when idle.") + .defineInRange("idle_energy", 5.0, 0.0, Double.MAX_VALUE); + requireChannel = builder + .comment("Whether the ME Requester requires an ME network channel to function.") + .define("require_channel", true); + builder.pop(); + } + } +} diff --git a/src/main/java/com/almostreliable/merequester/MERequester.java b/src/main/java/com/almostreliable/merequester/MERequester.java index b819bb4..4339ffa 100644 --- a/src/main/java/com/almostreliable/merequester/MERequester.java +++ b/src/main/java/com/almostreliable/merequester/MERequester.java @@ -1,44 +1,35 @@ package com.almostreliable.merequester; import com.almostreliable.merequester.network.PacketHandler; -import com.almostreliable.merequester.platform.Platform; import com.mojang.logging.LogUtils; -import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.registries.RegisterEvent; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModLoadingContext; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; +import net.neoforged.neoforge.registries.RegisterEvent; import org.slf4j.Logger; -@SuppressWarnings("WeakerAccess") @Mod(BuildConfig.MOD_ID) public final class MERequester { public static final Logger LOGGER = LogUtils.getLogger(); - public static final String TERMINAL_ID = "requester_terminal"; public static final String REQUESTER_ID = "requester"; + public static final String TERMINAL_ID = "requester_terminal"; - public MERequester() { - onInitialize(); - } - - public void onInitialize() { - Platform.initConfig(); - var modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); - modEventBus.addListener(MERequester::onCommonSetup); + public MERequester(IEventBus modEventBus) { modEventBus.addListener(MERequester::onRegistryEvent); modEventBus.addListener(MERequester::onCreativeTabContents); - } + modEventBus.addListener(PacketHandler::onPacketRegistration); - private static void onCommonSetup(FMLCommonSetupEvent event) { - PacketHandler.init(); + ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, Config.COMMON_SPEC); } private static void onRegistryEvent(RegisterEvent event) { - ModTab.registerTab(event); + Registration.registerContents(event); } private static void onCreativeTabContents(BuildCreativeModeTabContentsEvent event) { - ModTab.initContents(event); + Registration.Tab.initContents(event); } } diff --git a/src/main/java/com/almostreliable/merequester/ModTab.java b/src/main/java/com/almostreliable/merequester/ModTab.java deleted file mode 100644 index a76fb83..0000000 --- a/src/main/java/com/almostreliable/merequester/ModTab.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.almostreliable.merequester; - -import com.almostreliable.merequester.platform.Platform; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; -import net.minecraftforge.registries.RegisterEvent; - -public final class ModTab { - - public static final ResourceKey TAB_KEY = ResourceKey.create( - Registries.CREATIVE_MODE_TAB, - Utils.getRL("tab") - ); - private static final CreativeModeTab TAB = Platform.createTab(); - - private ModTab() {} - - static void initContents(BuildCreativeModeTabContentsEvent event) { - if (event.getTabKey() == TAB_KEY) { - event.accept(Registration.REQUESTER); - event.accept(Registration.TERMINAL); - } - } - - static void registerTab(RegisterEvent registerEvent) { - registerEvent.register(Registries.CREATIVE_MODE_TAB, TAB_KEY.location(), () -> TAB); - } -} diff --git a/src/main/java/com/almostreliable/merequester/Registration.java b/src/main/java/com/almostreliable/merequester/Registration.java index 837bf42..d909b24 100644 --- a/src/main/java/com/almostreliable/merequester/Registration.java +++ b/src/main/java/com/almostreliable/merequester/Registration.java @@ -7,63 +7,98 @@ import appeng.core.definitions.ItemDefinition; import appeng.items.parts.PartItem; import appeng.items.parts.PartModelsHelper; -import com.almostreliable.merequester.mixin.registration.AEBlockEntitiesMixin; -import com.almostreliable.merequester.mixin.registration.AEBlocksMixin; -import com.almostreliable.merequester.mixin.registration.AEItemsMixin; import com.almostreliable.merequester.requester.RequesterBlock; import com.almostreliable.merequester.requester.RequesterBlockEntity; import com.almostreliable.merequester.terminal.RequesterTerminalPart; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; import net.minecraft.world.level.block.entity.BlockEntityType; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; +import net.neoforged.neoforge.registries.RegisterEvent; import java.util.concurrent.atomic.AtomicReference; +import static com.almostreliable.merequester.MERequester.REQUESTER_ID; +import static com.almostreliable.merequester.MERequester.TERMINAL_ID; + public final class Registration { - public static final ItemDefinition> TERMINAL = setupTerminal(); - public static final BlockDefinition REQUESTER = setupRequester(); + public static final BlockDefinition REQUESTER_BLOCK = registerRequester(); + public static final ItemDefinition> REQUESTER_TERMINAL = registerRequesterTerminal(); + private static final BlockEntityType REQUESTER_ENTITY = registerRequesterEntity(); private Registration() {} - public static void init() { - MERequester.LOGGER.info("Registering content"); + private static BlockDefinition registerRequester() { + RequesterBlock block = new RequesterBlock(); + AEBaseBlockItem item = new AEBaseBlockItem(block, new Item.Properties()); + return new BlockDefinition<>("", Utils.getRL(REQUESTER_ID), block, item); } - private static ItemDefinition> setupTerminal() { + private static ItemDefinition> registerRequesterTerminal() { PartModels.registerModels(PartModelsHelper.createModels(RequesterTerminalPart.class)); - return AEItemsMixin.merequester$aeItem( - "", - Utils.getRL(MERequester.TERMINAL_ID), - props -> new PartItem<>(props, RequesterTerminalPart.class, RequesterTerminalPart::new), - ModTab.TAB_KEY - ); - } - private static BlockDefinition setupRequester() { - var blockDef = AEBlocksMixin.merequester$aeBlock( - "", - Utils.getRL(MERequester.REQUESTER_ID), - RequesterBlock::new, - AEBaseBlockItem::new + PartItem item = new PartItem<>( + new Item.Properties(), + RequesterTerminalPart.class, + RequesterTerminalPart::new ); - registerRequesterEntity(blockDef); - return blockDef; + return new ItemDefinition<>("", Utils.getRL(TERMINAL_ID), item); } - private static void registerRequesterEntity(BlockDefinition block) { + private static BlockEntityType registerRequesterEntity() { AtomicReference> typeHolder = new AtomicReference<>(); - BlockEntityType.BlockEntitySupplier supplier = (blockPos, blockState) -> - new RequesterBlockEntity( - typeHolder.get(), - blockPos, - blockState - ); + BlockEntityType.BlockEntitySupplier supplier = (blockPos, blockState) + -> new RequesterBlockEntity(typeHolder.get(), blockPos, blockState); @SuppressWarnings("ConstantConditions") - var type = BlockEntityType.Builder.of(supplier, block.block()).build(null); + BlockEntityType type = BlockEntityType.Builder.of(supplier, REQUESTER_BLOCK.block()).build(null); typeHolder.set(type); - AEBlockEntitiesMixin.merequester$blockEntityTypes().put(Utils.getRL(MERequester.REQUESTER_ID), type); - AEBaseBlockEntity.registerBlockEntityItem(type, block.asItem()); - block.block().setBlockEntity(RequesterBlockEntity.class, type, null, null); + AEBaseBlockEntity.registerBlockEntityItem(type, REQUESTER_BLOCK.asItem()); + REQUESTER_BLOCK.block().setBlockEntity(RequesterBlockEntity.class, type, null, null); + + return type; + } + + static void registerContents(RegisterEvent event) { + if (event.getRegistryKey() == Registries.CREATIVE_MODE_TAB) { + Tab.registerTab(event); + return; + } + + if (event.getRegistryKey() == Registries.BLOCK) { + Registry.register(BuiltInRegistries.BLOCK, REQUESTER_BLOCK.id(), REQUESTER_BLOCK.block()); + Registry.register(BuiltInRegistries.ITEM, REQUESTER_BLOCK.id(), REQUESTER_BLOCK.asItem()); + Registry.register(BuiltInRegistries.BLOCK_ENTITY_TYPE, REQUESTER_BLOCK.id(), REQUESTER_ENTITY); + Registry.register(BuiltInRegistries.ITEM, REQUESTER_TERMINAL.id(), REQUESTER_TERMINAL.asItem()); + } + } + + public static final class Tab { + + public static final ResourceKey TAB_KEY = ResourceKey.create(Registries.CREATIVE_MODE_TAB, Utils.getRL("tab")); + private static final CreativeModeTab TAB = CreativeModeTab.builder() + .title(Utils.translate("itemGroup", "tab")) + .icon(REQUESTER_BLOCK::stack) + .noScrollBar() + .build(); + + private Tab() {} + + static void initContents(BuildCreativeModeTabContentsEvent event) { + if (event.getTabKey() == TAB_KEY) { + event.accept(REQUESTER_BLOCK); + event.accept(REQUESTER_TERMINAL); + } + } + + private static void registerTab(RegisterEvent registerEvent) { + registerEvent.register(Registries.CREATIVE_MODE_TAB, TAB_KEY.location(), () -> TAB); + } } } diff --git a/src/main/java/com/almostreliable/merequester/Utils.java b/src/main/java/com/almostreliable/merequester/Utils.java index 3923c77..a1b010d 100644 --- a/src/main/java/com/almostreliable/merequester/Utils.java +++ b/src/main/java/com/almostreliable/merequester/Utils.java @@ -7,35 +7,22 @@ import net.minecraft.resources.ResourceLocation; import java.util.List; -import java.util.regex.Pattern; public final class Utils { - private static final Pattern PLACEHOLDER = Pattern.compile("\\{}"); - private Utils() {} public static ResourceLocation getRL(String path) { return new ResourceLocation(BuildConfig.MOD_ID, path); } - public static String f(String input, Object... args) { - for (var arg : args) { - input = PLACEHOLDER.matcher(input).replaceFirst(arg.toString()); - } - for (var i = 0; i < args.length; i++) { - input = input.replace("{" + i + "}", args[i].toString()); - } - return input; - } - public static int fillColorAlpha(ChatFormatting color) { // noinspection ConstantConditions return 0xFF << 3 * 8 | color.getColor(); } public static MutableComponent translate(String type, String key, Object... args) { - return Component.translatable(getTranslationKey(type, key), args); + return Component.translatable(String.format("%s.%s.%s", type, BuildConfig.MOD_ID, key), args); } public static String translateAsString(String type, String key) { @@ -43,19 +30,14 @@ public static String translateAsString(String type, String key) { } public static void addShiftInfoTooltip(List tooltip) { - tooltip.add(Component.literal("» ").withStyle(ChatFormatting.AQUA) - .append(translate( - "tooltip", - "shift_for_more", - InputConstants.getKey("key.keyboard.left.shift").getDisplayName() - ).withStyle(ChatFormatting.GRAY))); + tooltip.add(Component.literal("» ").withStyle(ChatFormatting.AQUA).append(translate( + "tooltip", + "shift_for_more", + InputConstants.getKey("key.keyboard.left.shift").getDisplayName() + ).withStyle(ChatFormatting.GRAY))); } public static T cast(Object o, Class clazz) { return clazz.cast(o); } - - private static String getTranslationKey(String type, String key) { - return f("{}.{}.{}", type, BuildConfig.MOD_ID, key); - } } diff --git a/src/main/java/com/almostreliable/merequester/client/RequestSlot.java b/src/main/java/com/almostreliable/merequester/client/RequestSlot.java index bb8239d..815da8a 100644 --- a/src/main/java/com/almostreliable/merequester/client/RequestSlot.java +++ b/src/main/java/com/almostreliable/merequester/client/RequestSlot.java @@ -5,9 +5,11 @@ import com.almostreliable.merequester.client.abstraction.RequestDisplay; import com.almostreliable.merequester.client.abstraction.RequesterReference; import com.almostreliable.merequester.mixin.accessors.SlotMixin; +import com.almostreliable.merequester.network.DragAndDropPacket; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.network.PacketDistributor; import javax.annotation.Nullable; import java.util.Collections; @@ -74,4 +76,9 @@ public boolean isLocked() { public void setLocked(boolean locked) { isLocked = locked; } + + @Override + public void setFilterTo(ItemStack itemStack) { + PacketDistributor.SERVER.noArg().send(new DragAndDropPacket(getRequesterReference().getRequesterId(), getSlot(), itemStack)); + } } diff --git a/src/main/java/com/almostreliable/merequester/client/RequesterScreen.java b/src/main/java/com/almostreliable/merequester/client/RequesterScreen.java index be7b83d..d0289a1 100644 --- a/src/main/java/com/almostreliable/merequester/client/RequesterScreen.java +++ b/src/main/java/com/almostreliable/merequester/client/RequesterScreen.java @@ -1,11 +1,11 @@ package com.almostreliable.merequester.client; import appeng.client.gui.style.ScreenStyle; +import com.almostreliable.merequester.Config; import com.almostreliable.merequester.MERequester; import com.almostreliable.merequester.Utils; import com.almostreliable.merequester.client.abstraction.AbstractRequesterScreen; import com.almostreliable.merequester.client.abstraction.RequesterReference; -import com.almostreliable.merequester.platform.Platform; import com.almostreliable.merequester.requester.RequesterMenu; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; @@ -17,15 +17,14 @@ import java.util.Collections; import java.util.Set; -import static com.almostreliable.merequester.Utils.f; - public class RequesterScreen extends AbstractRequesterScreen { - private static final ResourceLocation TEXTURE = Utils.getRL(f("textures/gui/{}.png", MERequester.REQUESTER_ID)); + private static final ResourceLocation TEXTURE = Utils.getRL(String.format("textures/gui/%s.png", MERequester.REQUESTER_ID)); private static final Rect2i FOOTER_BBOX = new Rect2i(0, 114, GUI_WIDTH, GUI_FOOTER_HEIGHT); private static final int MAX_ROW_COUNT = 10; - @Nullable private RequesterReference requesterReference; + @Nullable + private RequesterReference requesterReference; public RequesterScreen( RequesterMenu menu, Inventory playerInventory, Component name, ScreenStyle style @@ -36,7 +35,7 @@ public RequesterScreen( @Override protected void init() { var possibleRows = (height - GUI_HEADER_HEIGHT - GUI_FOOTER_HEIGHT) / ROW_HEIGHT; - rowAmount = Mth.clamp(possibleRows, MIN_ROW_COUNT, Math.min(Platform.getRequestLimit(), MAX_ROW_COUNT)); + rowAmount = Mth.clamp(possibleRows, MIN_ROW_COUNT, Math.min(Config.COMMON.requests.get(), MAX_ROW_COUNT)); super.init(); } @@ -47,7 +46,7 @@ protected void clear() {} protected void refreshList() { if (requesterReference != null) { lines.clear(); - lines.ensureCapacity(Platform.getRequestLimit()); + lines.ensureCapacity(Config.COMMON.requests.get()); for (var i = 0; i < requesterReference.getRequests().size(); i++) { lines.add(requesterReference.getRequests().get(i)); } diff --git a/src/main/java/com/almostreliable/merequester/client/RequesterTerminalScreen.java b/src/main/java/com/almostreliable/merequester/client/RequesterTerminalScreen.java index e05f84b..8c8fc3c 100644 --- a/src/main/java/com/almostreliable/merequester/client/RequesterTerminalScreen.java +++ b/src/main/java/com/almostreliable/merequester/client/RequesterTerminalScreen.java @@ -8,11 +8,11 @@ import appeng.client.gui.widgets.SettingToggleButton; import appeng.core.AEConfig; import appeng.core.localization.GuiText; +import com.almostreliable.merequester.Config; import com.almostreliable.merequester.MERequester; import com.almostreliable.merequester.Utils; import com.almostreliable.merequester.client.abstraction.AbstractRequesterScreen; import com.almostreliable.merequester.client.abstraction.RequesterReference; -import com.almostreliable.merequester.platform.Platform; import com.almostreliable.merequester.requester.Requests.Request; import com.almostreliable.merequester.terminal.RequesterTerminalMenu; import com.google.common.collect.HashMultimap; @@ -24,11 +24,9 @@ import javax.annotation.Nullable; import java.util.*; -import static com.almostreliable.merequester.Utils.f; - public class RequesterTerminalScreen extends AbstractRequesterScreen { - private static final ResourceLocation TEXTURE = Utils.getRL(f("textures/gui/{}.png", MERequester.TERMINAL_ID)); + private static final ResourceLocation TEXTURE = Utils.getRL(String.format("textures/gui/%s.png", MERequester.TERMINAL_ID)); private static final Rect2i FOOTER_BBOX = new Rect2i(0, 133, GUI_WIDTH, GUI_FOOTER_HEIGHT); private final HashMap byId = new HashMap<>(); @@ -118,7 +116,7 @@ protected void refreshList() { Collections.sort(requesterNames); lines.clear(); - lines.ensureCapacity(requesterNames.size() + byId.size() * Platform.getRequestLimit()); + lines.ensureCapacity(requesterNames.size() + byId.size() * Config.COMMON.requests.get()); for (var name : requesterNames) { lines.add(name); @@ -166,9 +164,8 @@ private void toggleTerminalStyle(SettingToggleButton button, bool @SuppressWarnings("SuspiciousMethodCalls") private void reinitialize() { - var renderableWidgets = Platform.getRenderables(this); - children().removeAll(renderableWidgets); - renderableWidgets.clear(); + children().removeAll(renderables); + renderables.clear(); init(); } diff --git a/src/main/java/com/almostreliable/merequester/client/abstraction/AbstractRequesterScreen.java b/src/main/java/com/almostreliable/merequester/client/abstraction/AbstractRequesterScreen.java index 24d5d04..e738fde 100644 --- a/src/main/java/com/almostreliable/merequester/client/abstraction/AbstractRequesterScreen.java +++ b/src/main/java/com/almostreliable/merequester/client/abstraction/AbstractRequesterScreen.java @@ -10,8 +10,8 @@ import appeng.client.gui.widgets.Scrollbar; import appeng.core.localization.ButtonToolTips; import appeng.core.localization.Tooltips; -import appeng.core.sync.network.NetworkHandler; -import appeng.core.sync.packets.InventoryActionPacket; +import appeng.core.network.NetworkHandler; +import appeng.core.network.serverbound.InventoryActionPacket; import appeng.helpers.InventoryAction; import com.almostreliable.merequester.MERequester; import com.almostreliable.merequester.Utils; @@ -39,8 +39,6 @@ import java.util.Map; import java.util.Set; -import static com.almostreliable.merequester.Utils.f; - /** * yoinked from {@link PatternAccessTermScreen} */ @@ -123,7 +121,7 @@ public void updateFromMenu(boolean clearData, long requesterId, CompoundTag data for (var i = 0; i < requests.size(); i++) { var requestIndex = String.valueOf(i); if (data.contains(requestIndex)) { - requests.get(i).deserialize(data.getCompound(requestIndex)); + requests.get(i).deserializeNBT(data.getCompound(requestIndex)); } } @@ -135,9 +133,7 @@ public void updateFromMenu(boolean clearData, long requesterId, CompoundTag data protected void init() { imageHeight = GUI_HEADER_HEIGHT + GUI_FOOTER_HEIGHT + rowAmount * ROW_HEIGHT; - requestWidgets.forEach( - w -> w.preInit(Utils.cast(widgets, WidgetContainerMixin.class).merequester$getWidgets()) - ); + requestWidgets.forEach(w -> w.preInit(Utils.cast(widgets, WidgetContainerMixin.class).merequester$getWidgets())); super.init(); // clear old widgets because init() is recalled when the terminal resizes requestWidgets.clear(); @@ -201,7 +197,7 @@ public void drawFG(GuiGraphics guiGraphics, int pX, int pY, int mX, int mY) { } else if (lineElement instanceof String name) { var text = name; int rows = getByName(name).size(); - if (rows > 1) text = f("{} ({})", text, rows); + if (rows > 1) text = String.format("%s (%s)", text, rows); text = font.plainSubstrByWidth(text, TEXT_MAX_WIDTH, true); guiGraphics.drawString( @@ -241,12 +237,8 @@ protected void slotClicked(@Nullable Slot slot, int slotIndex, int mouseButton, InventoryAction action = null; switch (clickType) { - case PICKUP -> action = mouseButton == 1 ? - InventoryAction.SPLIT_OR_PLACE_SINGLE : - InventoryAction.PICKUP_OR_SET_DOWN; - case QUICK_MOVE -> action = mouseButton == 1 ? - InventoryAction.PICKUP_SINGLE : - InventoryAction.SHIFT_CLICK; + case PICKUP -> action = mouseButton == 1 ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN; + case QUICK_MOVE -> action = mouseButton == 1 ? InventoryAction.PICKUP_SINGLE : InventoryAction.SHIFT_CLICK; case CLONE -> { if (getPlayer().getAbilities().instabuild) { action = InventoryAction.CREATIVE_DUPLICATE; diff --git a/src/main/java/com/almostreliable/merequester/client/abstraction/RequestDisplay.java b/src/main/java/com/almostreliable/merequester/client/abstraction/RequestDisplay.java index 228ec53..74f730c 100644 --- a/src/main/java/com/almostreliable/merequester/client/abstraction/RequestDisplay.java +++ b/src/main/java/com/almostreliable/merequester/client/abstraction/RequestDisplay.java @@ -11,6 +11,7 @@ import java.util.Map; public interface RequestDisplay { + void addSubWidget(String id, AbstractWidget widget, Map subWidgets); @Nullable diff --git a/src/main/java/com/almostreliable/merequester/client/abstraction/RequesterReference.java b/src/main/java/com/almostreliable/merequester/client/abstraction/RequesterReference.java index e6490dd..5b16fd2 100644 --- a/src/main/java/com/almostreliable/merequester/client/abstraction/RequesterReference.java +++ b/src/main/java/com/almostreliable/merequester/client/abstraction/RequesterReference.java @@ -3,8 +3,8 @@ import com.almostreliable.merequester.requester.Requests; import com.almostreliable.merequester.requester.abstraction.RequestHost; import net.minecraft.network.chat.Component; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; /** * yoinked from AE2's legacy {@code PatternProviderRecord} diff --git a/src/main/java/com/almostreliable/merequester/client/widgets/NumberField.java b/src/main/java/com/almostreliable/merequester/client/widgets/NumberField.java index 41596d1..a39d651 100644 --- a/src/main/java/com/almostreliable/merequester/client/widgets/NumberField.java +++ b/src/main/java/com/almostreliable/merequester/client/widgets/NumberField.java @@ -75,14 +75,7 @@ public class NumberField extends ConfirmableTextField { public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partial) { super.renderWidget(guiGraphics, mouseX, mouseY, partial); if (!isFluid) return; - guiGraphics.drawString( - Minecraft.getInstance().font, - "B", - getX() + WIDTH - PADDING, - getY(), - 0x54_5454, - false - ); + guiGraphics.drawString(Minecraft.getInstance().font, "B", getX() + WIDTH - PADDING, getY(), 0x54_5454, false); } private void validate() { @@ -140,7 +133,7 @@ OptionalLong getLongValue() { void setLongValue(long value) { var internalValue = convertToInternalValue(Math.max(value, MIN_VALUE)); setValue(decimalFormat.format(internalValue)); - moveCursorToEnd(); + moveCursorToEnd(true); validate(); } @@ -160,12 +153,13 @@ public void setTooltipMessage(List tooltipMessage) { tooltipMessage.add(0, Utils.translate("tooltip", name)); super.setTooltipMessage(tooltipMessage); if (!isFocused() || (tooltipMessage.size() > 1 && !tooltipMessage.get(1).getString().startsWith("="))) return; - tooltipMessage.add(Component.literal("» ").withStyle(ChatFormatting.AQUA) - .append(Utils.translate( - "tooltip", - "enter_to_submit", - InputConstants.getKey("key.keyboard.enter").getDisplayName() - ).withStyle(ChatFormatting.GRAY))); + tooltipMessage.add( + Component.literal("» ") + .withStyle(ChatFormatting.AQUA) + .append(Utils + .translate("tooltip", "enter_to_submit", InputConstants.getKey("key.keyboard.enter").getDisplayName()) + .withStyle(ChatFormatting.GRAY)) + ); } @Override diff --git a/src/main/java/com/almostreliable/merequester/client/widgets/RequestWidget.java b/src/main/java/com/almostreliable/merequester/client/widgets/RequestWidget.java index 9207a14..cbc432c 100644 --- a/src/main/java/com/almostreliable/merequester/client/widgets/RequestWidget.java +++ b/src/main/java/com/almostreliable/merequester/client/widgets/RequestWidget.java @@ -3,18 +3,17 @@ import appeng.client.gui.style.ScreenStyle; import com.almostreliable.merequester.client.abstraction.RequestDisplay; import com.almostreliable.merequester.client.abstraction.RequesterReference; -import com.almostreliable.merequester.platform.Platform; +import com.almostreliable.merequester.network.RequestUpdatePacket; import com.almostreliable.merequester.requester.Requests.Request; import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.network.PacketDistributor; import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; -import static com.almostreliable.merequester.Utils.f; - @OnlyIn(Dist.CLIENT) public class RequestWidget { @@ -62,23 +61,19 @@ public void preInit(Map widgetContainer) { */ public void postInit() { stateBox = new StateBox(x, y, style, () -> stateBoxChanged(host.getTargetRequest(index))); - host.addSubWidget(f("request_state_{}", index), stateBox, subWidgets); + host.addSubWidget(String.format("request_state_%s", index), stateBox, subWidgets); - amountField = new NumberField(x + 38, y, "amount", style, - amount -> amountFieldSubmitted(host.getTargetRequest(index), amount) - ); - host.addSubWidget(f("request_amount_{}", index), amountField, subWidgets); + amountField = new NumberField(x + 38, y, "amount", style, amount -> amountFieldSubmitted(host.getTargetRequest(index), amount)); + host.addSubWidget(String.format("request_amount_%s", index), amountField, subWidgets); - batchField = new NumberField(x + 92, y, "batch", style, - amount -> batchFieldSubmitted(host.getTargetRequest(index), amount) - ); - host.addSubWidget(f("request_batch_{}", index), batchField, subWidgets); + batchField = new NumberField(x + 92, y, "batch", style, amount -> batchFieldSubmitted(host.getTargetRequest(index), amount)); + host.addSubWidget(String.format("request_batch_%s", index), batchField, subWidgets); submitButton = new SubmitButton(x + 146, y, style, () -> submitButtonClicked(host.getTargetRequest(index))); - host.addSubWidget(f("request_submit_{}", index), submitButton, subWidgets); + host.addSubWidget(String.format("request_submit_%s", index), submitButton, subWidgets); statusDisplay = new StatusDisplay(x + 39, y + 15, () -> isInactive(host.getTargetRequest(index))); - host.addSubWidget(f("request_status_{}", index), statusDisplay, subWidgets); + host.addSubWidget(String.format("request_status_%s", index), statusDisplay, subWidgets); } public void hide() { @@ -109,7 +104,7 @@ private void stateBoxChanged(@Nullable Request request) { var newState = stateBox.isSelected(); request.updateState(newState); // prevent jittery animation before server information is received var requesterId = ((RequesterReference) request.getRequesterReference()).getRequesterId(); - Platform.sendRequestUpdate(requesterId, request.getIndex(), newState); + PacketDistributor.SERVER.noArg().send(new RequestUpdatePacket(requesterId, request.getIndex(), newState)); } private void amountFieldSubmitted(@Nullable Request request, long amount) { @@ -139,7 +134,7 @@ private void submitButtonClicked(@Nullable Request request) { long amount = amountField.getLongValue().orElse(0); long batch = batchField.getLongValue().orElse(1); var requesterId = ((RequesterReference) request.getRequesterReference()).getRequesterId(); - Platform.sendRequestUpdate(requesterId, request.getIndex(), amount, batch); + PacketDistributor.SERVER.noArg().send(new RequestUpdatePacket(requesterId, request.getIndex(), amount, batch)); } private boolean isInactive(@Nullable Request request) { diff --git a/src/main/java/com/almostreliable/merequester/client/widgets/StateBox.java b/src/main/java/com/almostreliable/merequester/client/widgets/StateBox.java index 95d7e96..2d42a20 100644 --- a/src/main/java/com/almostreliable/merequester/client/widgets/StateBox.java +++ b/src/main/java/com/almostreliable/merequester/client/widgets/StateBox.java @@ -15,9 +15,7 @@ public class StateBox extends AECheckbox implements ITooltip { private static final int SIZE = 14; - private static final Blitter BLITTER = Blitter.texture( - Utils.getRL("textures/gui/state_box.png"), SIZE * 2, SIZE * 2 - ); + private static final Blitter BLITTER = Blitter.texture(Utils.getRL("textures/gui/state_box.png"), SIZE * 2, SIZE * 2); private static final Blitter UNCHECKED = BLITTER.copy().src(0, 0, SIZE, SIZE); private static final Blitter UNCHECKED_FOCUS = BLITTER.copy().src(SIZE, 0, SIZE, SIZE); private static final Blitter CHECKED = BLITTER.copy().src(0, SIZE, SIZE, SIZE); diff --git a/src/main/java/com/almostreliable/merequester/client/widgets/StatusDisplay.java b/src/main/java/com/almostreliable/merequester/client/widgets/StatusDisplay.java index 805bc19..7898f23 100644 --- a/src/main/java/com/almostreliable/merequester/client/widgets/StatusDisplay.java +++ b/src/main/java/com/almostreliable/merequester/client/widgets/StatusDisplay.java @@ -15,8 +15,6 @@ import java.util.List; import java.util.function.BooleanSupplier; -import static com.almostreliable.merequester.Utils.f; - public class StatusDisplay extends AbstractWidget implements ITooltip { private static final int WIDTH = 118; @@ -63,21 +61,17 @@ public List getTooltipMessage() { if (Screen.hasShiftDown()) { tooltip.addAll(List.of( Component.literal(" "), - Utils.translate("tooltip", RequestStatus.IDLE.toString().toLowerCase()) - .withStyle(getStatusColor(RequestStatus.IDLE)), - Utils.translate("tooltip", f("{}_desc", RequestStatus.IDLE.toString().toLowerCase())), + Utils.translate("tooltip", RequestStatus.IDLE.toString().toLowerCase()).withStyle(getStatusColor(RequestStatus.IDLE)), + Utils.translate("tooltip", String.format("%s_desc", RequestStatus.IDLE.toString().toLowerCase())), Component.literal(" "), - Utils.translate("tooltip", RequestStatus.MISSING.toString().toLowerCase()) - .withStyle(getStatusColor(RequestStatus.MISSING)), - Utils.translate("tooltip", f("{}_desc", RequestStatus.MISSING.toString().toLowerCase())), + Utils.translate("tooltip", RequestStatus.MISSING.toString().toLowerCase()).withStyle(getStatusColor(RequestStatus.MISSING)), + Utils.translate("tooltip", String.format("%s_desc", RequestStatus.MISSING.toString().toLowerCase())), Component.literal(" "), - Utils.translate("tooltip", RequestStatus.LINK.toString().toLowerCase()) - .withStyle(getStatusColor(RequestStatus.LINK)), - Utils.translate("tooltip", f("{}_desc", RequestStatus.LINK.toString().toLowerCase())), + Utils.translate("tooltip", RequestStatus.LINK.toString().toLowerCase()).withStyle(getStatusColor(RequestStatus.LINK)), + Utils.translate("tooltip", String.format("%s_desc", RequestStatus.LINK.toString().toLowerCase())), Component.literal(" "), - Utils.translate("tooltip", RequestStatus.EXPORT.toString().toLowerCase()) - .withStyle(getStatusColor(RequestStatus.EXPORT)), - Utils.translate("tooltip", f("{}_desc", RequestStatus.EXPORT.toString().toLowerCase())) + Utils.translate("tooltip", RequestStatus.EXPORT.toString().toLowerCase()).withStyle(getStatusColor(RequestStatus.EXPORT)), + Utils.translate("tooltip", String.format("%s_desc", RequestStatus.EXPORT.toString().toLowerCase())) )); } else { Utils.addShiftInfoTooltip(tooltip); diff --git a/src/main/java/com/almostreliable/merequester/client/widgets/SubmitButton.java b/src/main/java/com/almostreliable/merequester/client/widgets/SubmitButton.java index bd05888..cedf561 100644 --- a/src/main/java/com/almostreliable/merequester/client/widgets/SubmitButton.java +++ b/src/main/java/com/almostreliable/merequester/client/widgets/SubmitButton.java @@ -15,9 +15,7 @@ public class SubmitButton extends AECheckbox implements ITooltip { private static final int SIZE = 12; - private static final Blitter BLITTER = Blitter.texture( - Utils.getRL("textures/gui/submit_button.png"), SIZE * 2, SIZE - ); + private static final Blitter BLITTER = Blitter.texture(Utils.getRL("textures/gui/submit_button.png"), SIZE * 2, SIZE); private static final Blitter UNFOCUSED = BLITTER.copy().src(0, 0, SIZE, SIZE); private static final Blitter FOCUSED = BLITTER.copy().src(SIZE, SIZE, SIZE, SIZE); diff --git a/src/main/java/com/almostreliable/merequester/mixin/AlmostMixinPlugin.java b/src/main/java/com/almostreliable/merequester/mixin/AlmostMixinPlugin.java deleted file mode 100644 index 8f51c32..0000000 --- a/src/main/java/com/almostreliable/merequester/mixin/AlmostMixinPlugin.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.almostreliable.merequester.mixin; - -import com.google.common.collect.ImmutableMap; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.loading.LoadingModList; -import net.minecraftforge.fml.loading.moddiscovery.ModInfo; -import org.objectweb.asm.tree.ClassNode; -import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; -import org.spongepowered.asm.mixin.extensibility.IMixinInfo; - -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.BooleanSupplier; - -@SuppressWarnings("ALL") -public class AlmostMixinPlugin implements IMixinConfigPlugin { - - private static final BooleanSupplier TRUE = () -> true; - private static final Map CONDITIONS = ImmutableMap.of( - "com.almostreliable.merequester.mixin.compat.JEIItemSlotTargetMixin", modLoaded("jei"), - "com.almostreliable.merequester.mixin.compat.REIItemSlotTargetMixin", modLoaded("roughlyenoughitems") - ); - - @Override - public void onLoad(String mixinPackage) {} - - @Override - public String getRefMapperConfig() { - return null; - } - - @Override - public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - return CONDITIONS.getOrDefault(mixinClassName, TRUE).getAsBoolean(); - } - - @Override - public void acceptTargets(Set myTargets, Set otherTargets) {} - - @Override - public List getMixins() { - return null; - } - - @Override - public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {} - - @Override - public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {} - - private static BooleanSupplier modLoaded(String id) { - return () -> { - if (ModList.get() == null) { - return LoadingModList.get().getMods().stream().map(ModInfo::getModId).anyMatch(id::equals); - } - return ModList.get().isLoaded(id); - }; - } -} diff --git a/src/main/java/com/almostreliable/merequester/mixin/accessors/EditBoxMixin.java b/src/main/java/com/almostreliable/merequester/mixin/accessors/EditBoxMixin.java index c4be2e0..ddd6781 100644 --- a/src/main/java/com/almostreliable/merequester/mixin/accessors/EditBoxMixin.java +++ b/src/main/java/com/almostreliable/merequester/mixin/accessors/EditBoxMixin.java @@ -7,6 +7,7 @@ @SuppressWarnings("ALL") @Mixin(EditBox.class) public interface EditBoxMixin { + @Accessor("isEditable") boolean merequester$isEditable(); } diff --git a/src/main/java/com/almostreliable/merequester/mixin/accessors/SlotMixin.java b/src/main/java/com/almostreliable/merequester/mixin/accessors/SlotMixin.java index 7fef65d..c9af6cc 100644 --- a/src/main/java/com/almostreliable/merequester/mixin/accessors/SlotMixin.java +++ b/src/main/java/com/almostreliable/merequester/mixin/accessors/SlotMixin.java @@ -7,6 +7,7 @@ @SuppressWarnings("ALL") @Mixin(Slot.class) public interface SlotMixin { + @Accessor("x") void merequester$setX(int x); diff --git a/src/main/java/com/almostreliable/merequester/mixin/accessors/WidgetContainerMixin.java b/src/main/java/com/almostreliable/merequester/mixin/accessors/WidgetContainerMixin.java index 8fa49c1..c591f6d 100644 --- a/src/main/java/com/almostreliable/merequester/mixin/accessors/WidgetContainerMixin.java +++ b/src/main/java/com/almostreliable/merequester/mixin/accessors/WidgetContainerMixin.java @@ -10,6 +10,7 @@ @SuppressWarnings("ALL") @Mixin(WidgetContainer.class) public interface WidgetContainerMixin { + @Accessor(value = "widgets", remap = false) Map merequester$getWidgets(); } diff --git a/src/main/java/com/almostreliable/merequester/mixin/compat/JEIItemSlotTargetMixin.java b/src/main/java/com/almostreliable/merequester/mixin/compat/JEIItemSlotTargetMixin.java deleted file mode 100644 index 408521f..0000000 --- a/src/main/java/com/almostreliable/merequester/mixin/compat/JEIItemSlotTargetMixin.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.almostreliable.merequester.mixin.compat; - -import appeng.menu.slot.AppEngSlot; -import com.almostreliable.merequester.client.RequestSlot; -import com.almostreliable.merequester.platform.Platform; -import net.minecraft.world.item.ItemStack; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -@SuppressWarnings("ALL") -@Mixin(targets = "appeng.integration.modules.jei.GhostIngredientHandler$ItemSlotTarget") -public abstract class JEIItemSlotTargetMixin { - - @Shadow(remap = false) - @Final - private AppEngSlot slot; - - @Inject( - method = "accept", - at = @At(value = "INVOKE", target = "Lappeng/core/sync/network/NetworkHandler;instance()Lappeng/core/sync/network/NetworkHandler;"), - locals = LocalCapture.CAPTURE_FAILHARD, - cancellable = true, - remap = false - ) - private void merequester$accept(Object ingredient, CallbackInfo ci, ItemStack wrapped) { - if (slot instanceof RequestSlot requestSlot) { - Platform.sendDragAndDrop( - requestSlot.getRequesterReference().getRequesterId(), - requestSlot.getSlot(), - wrapped - ); - ci.cancel(); - } - } -} diff --git a/src/main/java/com/almostreliable/merequester/mixin/compat/REIItemSlotTargetMixin.java b/src/main/java/com/almostreliable/merequester/mixin/compat/REIItemSlotTargetMixin.java deleted file mode 100644 index 2095bb6..0000000 --- a/src/main/java/com/almostreliable/merequester/mixin/compat/REIItemSlotTargetMixin.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.almostreliable.merequester.mixin.compat; - -import appeng.menu.slot.AppEngSlot; -import com.almostreliable.merequester.client.RequestSlot; -import com.almostreliable.merequester.platform.Platform; -import dev.architectury.fluid.FluidStack; -import me.shedaniel.rei.api.client.gui.drag.DraggableStack; -import me.shedaniel.rei.api.common.entry.EntryStack; -import net.minecraft.world.item.ItemStack; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -@SuppressWarnings("ALL") -@Mixin(targets = "appeng.integration.modules.rei.GhostIngredientHandler$ItemSlotTarget") -public abstract class REIItemSlotTargetMixin { - - @Shadow(remap = false) - @Final - private AppEngSlot slot; - - @Inject( - method = "accept", - at = @At(value = "INVOKE", target = "Lappeng/core/sync/network/NetworkHandler;instance()Lappeng/core/sync/network/NetworkHandler;", ordinal = 0), - locals = LocalCapture.CAPTURE_FAILHARD, - cancellable = true, - remap = false - ) - private void merequester$acceptItem( - DraggableStack ingredient, CallbackInfoReturnable ci, EntryStack entryStack, ItemStack itemStack - ) { - if (slot instanceof RequestSlot requestSlot) { - Platform.sendDragAndDrop( - requestSlot.getRequesterReference().getRequesterId(), - requestSlot.getSlot(), - itemStack - ); - ci.setReturnValue(true); - } - } - - @Inject( - method = "accept", - at = @At(value = "INVOKE", target = "Lappeng/core/sync/network/NetworkHandler;instance()Lappeng/core/sync/network/NetworkHandler;", ordinal = 1), - locals = LocalCapture.CAPTURE_FAILHARD, - cancellable = true, - remap = false - ) - private void merequester$acceptFluid( - DraggableStack ingredient, CallbackInfoReturnable ci, EntryStack entryStack, FluidStack fluidStack, - ItemStack wrappedFluid - ) { - if (slot instanceof RequestSlot requestSlot) { - Platform.sendDragAndDrop( - requestSlot.getRequesterReference().getRequesterId(), - requestSlot.getSlot(), - wrappedFluid - ); - ci.setReturnValue(true); - } - } -} diff --git a/src/main/java/com/almostreliable/merequester/mixin/compat/package-info.java b/src/main/java/com/almostreliable/merequester/mixin/compat/package-info.java deleted file mode 100644 index 15b5be9..0000000 --- a/src/main/java/com/almostreliable/merequester/mixin/compat/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package com.almostreliable.merequester.mixin.compat; - -import net.minecraft.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/com/almostreliable/merequester/mixin/registration/AEBlockEntitiesMixin.java b/src/main/java/com/almostreliable/merequester/mixin/registration/AEBlockEntitiesMixin.java deleted file mode 100644 index 65dfb5c..0000000 --- a/src/main/java/com/almostreliable/merequester/mixin/registration/AEBlockEntitiesMixin.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.almostreliable.merequester.mixin.registration; - -import appeng.core.definitions.AEBlockEntities; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.entity.BlockEntityType; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.Map; - -@SuppressWarnings("ALL") -@Mixin(AEBlockEntities.class) -public interface AEBlockEntitiesMixin { - @Accessor(value = "BLOCK_ENTITY_TYPES", remap = false) - public static Map> merequester$blockEntityTypes() { - throw new AssertionError(); - } -} diff --git a/src/main/java/com/almostreliable/merequester/mixin/registration/AEBlocksMixin.java b/src/main/java/com/almostreliable/merequester/mixin/registration/AEBlocksMixin.java deleted file mode 100644 index 8eae336..0000000 --- a/src/main/java/com/almostreliable/merequester/mixin/registration/AEBlocksMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.almostreliable.merequester.mixin.registration; - -import appeng.core.definitions.AEBlocks; -import appeng.core.definitions.BlockDefinition; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import javax.annotation.Nullable; -import java.util.function.BiFunction; -import java.util.function.Supplier; - -@SuppressWarnings("ALL") -@Mixin(AEBlocks.class) -public interface AEBlocksMixin { - @Invoker(value = "block", remap = false) - public static BlockDefinition merequester$aeBlock( - String name, ResourceLocation id, Supplier blockSupplier, - @Nullable BiFunction itemFactory - ) { - throw new AssertionError(); - } -} diff --git a/src/main/java/com/almostreliable/merequester/mixin/registration/AEItemsMixin.java b/src/main/java/com/almostreliable/merequester/mixin/registration/AEItemsMixin.java deleted file mode 100644 index 97c2de1..0000000 --- a/src/main/java/com/almostreliable/merequester/mixin/registration/AEItemsMixin.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.almostreliable.merequester.mixin.registration; - -import appeng.core.definitions.AEItems; -import appeng.core.definitions.ItemDefinition; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import java.util.function.Function; - -@SuppressWarnings("ALL") -@Mixin(AEItems.class) -public interface AEItemsMixin { - @Invoker(value = "item", remap = false) - public static ItemDefinition merequester$aeItem( - String name, ResourceLocation id, Function partFactory, - ResourceKey creativeTab - ) { - throw new AssertionError(); - } -} diff --git a/src/main/java/com/almostreliable/merequester/mixin/registration/AEPartsMixin.java b/src/main/java/com/almostreliable/merequester/mixin/registration/AEPartsMixin.java deleted file mode 100644 index 29ef3f1..0000000 --- a/src/main/java/com/almostreliable/merequester/mixin/registration/AEPartsMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.almostreliable.merequester.mixin.registration; - -import appeng.core.definitions.AEParts; -import com.almostreliable.merequester.Registration; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@SuppressWarnings("ALL") -@Mixin(AEParts.class) -public abstract class AEPartsMixin { - /** - * AEParts are always initialized last on Forge and Fabric, - * so we can safely init our registry here. - */ - @Inject(method = "init", at = @At("TAIL"), remap = false) - private static void merequester$initRegistration(CallbackInfo ci) { - Registration.init(); - } -} diff --git a/src/main/java/com/almostreliable/merequester/mixin/registration/InitMenuTypesMixin.java b/src/main/java/com/almostreliable/merequester/mixin/registration/InitMenuTypesMixin.java index 8503d88..2e87a6a 100644 --- a/src/main/java/com/almostreliable/merequester/mixin/registration/InitMenuTypesMixin.java +++ b/src/main/java/com/almostreliable/merequester/mixin/registration/InitMenuTypesMixin.java @@ -3,8 +3,8 @@ import appeng.init.InitMenuTypes; import com.almostreliable.merequester.requester.RequesterMenu; import com.almostreliable.merequester.terminal.RequesterTerminalMenu; +import net.minecraft.core.Registry; import net.minecraft.world.inventory.MenuType; -import net.minecraftforge.registries.IForgeRegistry; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.injection.At; @@ -14,17 +14,14 @@ @SuppressWarnings("ALL") @Mixin(InitMenuTypes.class) public abstract class InitMenuTypesMixin { + @Inject(method = "init", at = @At("TAIL"), remap = false) - private static void merequester$initMenuTypes(IForgeRegistry> registry, CallbackInfo ci) { - merequester$registerAll( - registry, - RequesterMenu.TYPE, - RequesterTerminalMenu.TYPE - ); + private static void merequester$initMenuTypes(Registry> registry, CallbackInfo ci) { + merequester$registerAll(registry, RequesterMenu.TYPE, RequesterTerminalMenu.TYPE); } @Invoker(value = "registerAll", remap = false) - private static void merequester$registerAll(IForgeRegistry> registry, MenuType... types) { + private static void merequester$registerAll(Registry> registry, MenuType... types) { throw new AssertionError(); } } diff --git a/src/main/java/com/almostreliable/merequester/mixin/registration/InitScreensMixin.java b/src/main/java/com/almostreliable/merequester/mixin/registration/InitScreensMixin.java index ad58b19..bf24cfb 100644 --- a/src/main/java/com/almostreliable/merequester/mixin/registration/InitScreensMixin.java +++ b/src/main/java/com/almostreliable/merequester/mixin/registration/InitScreensMixin.java @@ -11,22 +11,17 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import static com.almostreliable.merequester.Utils.f; - @SuppressWarnings("ALL") @Mixin(InitScreens.class) public abstract class InitScreensMixin { + @Inject(method = "init", at = @At("TAIL"), remap = false) private static void merequester$initScreens(CallbackInfo ci) { - InitScreens.register( - RequesterMenu.TYPE, - RequesterScreen::new, - f("/screens/{}.json", MERequester.REQUESTER_ID) - ); - InitScreens.>register( + InitScreens.register(RequesterMenu.TYPE, RequesterScreen::new, String.format("/screens/%s.json", MERequester.REQUESTER_ID)); + InitScreens.> register( RequesterTerminalMenu.TYPE, RequesterTerminalScreen::new, - f("/screens/{}.json", MERequester.TERMINAL_ID) + String.format("/screens/%s.json", MERequester.TERMINAL_ID) ); } } diff --git a/src/main/java/com/almostreliable/merequester/network/ClientToServerPacket.java b/src/main/java/com/almostreliable/merequester/network/ClientToServerPacket.java deleted file mode 100644 index 5cf983f..0000000 --- a/src/main/java/com/almostreliable/merequester/network/ClientToServerPacket.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.almostreliable.merequester.network; - -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.NetworkEvent; - -import javax.annotation.Nullable; -import java.util.function.Supplier; - -public abstract class ClientToServerPacket implements Packet { - - @Override - public void handle(T packet, Supplier context) { - var player = context.get().getSender(); - context.get().enqueueWork(() -> handlePacket(packet, player)); - context.get().setPacketHandled(true); - } - - protected abstract void handlePacket(T packet, @Nullable ServerPlayer player); -} diff --git a/src/main/java/com/almostreliable/merequester/network/DragAndDropPacket.java b/src/main/java/com/almostreliable/merequester/network/DragAndDropPacket.java index e8c2437..a9052c8 100644 --- a/src/main/java/com/almostreliable/merequester/network/DragAndDropPacket.java +++ b/src/main/java/com/almostreliable/merequester/network/DragAndDropPacket.java @@ -1,18 +1,20 @@ package com.almostreliable.merequester.network; +import com.almostreliable.merequester.Utils; import com.almostreliable.merequester.requester.abstraction.AbstractRequesterMenu; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import javax.annotation.Nullable; +public final class DragAndDropPacket implements Packet { -public class DragAndDropPacket extends ClientToServerPacket { + static final ResourceLocation ID = Utils.getRL("drag_and_drop"); - private long requesterId; - private int requestIndex; - - private ItemStack item; + private final long requesterId; + private final int requestIndex; + private final ItemStack item; public DragAndDropPacket(long requesterId, int requestIndex, ItemStack item) { this.requesterId = requesterId; @@ -20,27 +22,26 @@ public DragAndDropPacket(long requesterId, int requestIndex, ItemStack item) { this.item = item; } - DragAndDropPacket() {} - @Override - public void encode(DragAndDropPacket packet, FriendlyByteBuf buffer) { - buffer.writeLong(packet.requesterId); - buffer.writeVarInt(packet.requestIndex); - buffer.writeItem(packet.item); + public ResourceLocation id() { + return ID; } @Override - public DragAndDropPacket decode(FriendlyByteBuf buffer) { - return new DragAndDropPacket( - buffer.readLong(), - buffer.readVarInt(), - buffer.readItem() - ); + public void write(FriendlyByteBuf buffer) { + buffer.writeLong(requesterId); + buffer.writeVarInt(requestIndex); + buffer.writeItem(item); + } + + static DragAndDropPacket decode(FriendlyByteBuf buffer) { + return new DragAndDropPacket(buffer.readLong(), buffer.readVarInt(), buffer.readItem()); } @Override - protected void handlePacket(DragAndDropPacket packet, @Nullable ServerPlayer player) { - if (player == null || !(player.containerMenu instanceof AbstractRequesterMenu requester)) return; - requester.applyDragAndDrop(player, packet.requestIndex, packet.requesterId, packet.item); + public void handle(Player player) { + if (player instanceof ServerPlayer serverPlayer && player.containerMenu instanceof AbstractRequesterMenu requester) { + requester.applyDragAndDrop(serverPlayer, requestIndex, requesterId, item); + } } } diff --git a/src/main/java/com/almostreliable/merequester/network/Packet.java b/src/main/java/com/almostreliable/merequester/network/Packet.java index cd48103..389f07d 100644 --- a/src/main/java/com/almostreliable/merequester/network/Packet.java +++ b/src/main/java/com/almostreliable/merequester/network/Packet.java @@ -1,14 +1,9 @@ package com.almostreliable.merequester.network; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; -import java.util.function.Supplier; +public interface Packet extends CustomPacketPayload { -public interface Packet { - void encode(T packet, FriendlyByteBuf buffer); - - T decode(FriendlyByteBuf buffer); - - void handle(T packet, Supplier context); + void handle(Player player); } diff --git a/src/main/java/com/almostreliable/merequester/network/PacketHandler.java b/src/main/java/com/almostreliable/merequester/network/PacketHandler.java index 2715909..ee86a37 100644 --- a/src/main/java/com/almostreliable/merequester/network/PacketHandler.java +++ b/src/main/java/com/almostreliable/merequester/network/PacketHandler.java @@ -1,34 +1,53 @@ package com.almostreliable.merequester.network; -import com.almostreliable.merequester.Utils; +import com.almostreliable.merequester.BuildConfig; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.simple.SimpleChannel; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlerEvent; +import net.neoforged.neoforge.network.handling.IPlayPayloadHandler; +import net.neoforged.neoforge.network.handling.PlayPayloadContext; +import net.neoforged.neoforge.network.registration.IDirectionAwarePayloadHandlerBuilder; +import net.neoforged.neoforge.network.registration.IPayloadRegistrar; + +import java.util.function.Consumer; public final class PacketHandler { - private static final ResourceLocation ID = Utils.getRL("network"); private static final String PROTOCOL = "1"; - public static final SimpleChannel CHANNEL = NetworkRegistry.ChannelBuilder.named(ID) - .networkProtocolVersion(() -> PROTOCOL) - .clientAcceptedVersions(PROTOCOL::equals) - .serverAcceptedVersions(PROTOCOL::equals) - .simpleChannel(); private PacketHandler() {} - @SuppressWarnings("ValueOfIncrementOrDecrementUsed") - public static void init() { - var packetId = -1; + public static void onPacketRegistration(RegisterPayloadHandlerEvent event) { + IPayloadRegistrar registrar = event.registrar(BuildConfig.MOD_ID).versioned(PROTOCOL); + // server to client - register(++packetId, RequesterSyncPacket.class, new RequesterSyncPacket()); + registerPacket( + registrar, + RequesterSyncPacket.ID, + RequesterSyncPacket::decode, + builder -> builder.client(PacketHandler::handlePacket) + ); + // client to server - register(++packetId, RequestUpdatePacket.class, new RequestUpdatePacket()); - register(++packetId, DragAndDropPacket.class, new DragAndDropPacket()); + registerPacket( + registrar, + RequestUpdatePacket.ID, + RequestUpdatePacket::decode, + builder -> builder.server(PacketHandler::handlePacket) + ); + registerPacket(registrar, DragAndDropPacket.ID, DragAndDropPacket::decode, builder -> builder.server(PacketHandler::handlePacket)); + } + + private static

void registerPacket( + IPayloadRegistrar registrar, + ResourceLocation id, + FriendlyByteBuf.Reader

decoder, + Consumer>> factory + ) { + registrar.play(id, decoder, factory); } - @SuppressWarnings("SameParameterValue") - private static void register(int packetId, Class clazz, Packet packet) { - CHANNEL.registerMessage(packetId, clazz, packet::encode, packet::decode, packet::handle); + private static

void handlePacket(P packet, PlayPayloadContext context) { + context.player().ifPresent(player -> context.workHandler().execute(() -> packet.handle(player))); } } diff --git a/src/main/java/com/almostreliable/merequester/network/RequestUpdatePacket.java b/src/main/java/com/almostreliable/merequester/network/RequestUpdatePacket.java index 14756a1..6b94db6 100644 --- a/src/main/java/com/almostreliable/merequester/network/RequestUpdatePacket.java +++ b/src/main/java/com/almostreliable/merequester/network/RequestUpdatePacket.java @@ -1,57 +1,60 @@ package com.almostreliable.merequester.network; +import com.almostreliable.merequester.Utils; import com.almostreliable.merequester.requester.abstraction.AbstractRequesterMenu; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; -import javax.annotation.Nullable; +public final class RequestUpdatePacket implements Packet { -public class RequestUpdatePacket extends ClientToServerPacket { + static final ResourceLocation ID = Utils.getRL("request_update"); - private long requesterId; - private int requestIndex; + private final UpdateType updateType; + private final long requesterId; + private final int requestIndex; private boolean state; private long amount; private long batch; - private UpdateType updateType; - public RequestUpdatePacket(long requesterId, int requestIndex, boolean state) { + this.updateType = UpdateType.STATE; this.requesterId = requesterId; this.requestIndex = requestIndex; this.state = state; - this.updateType = UpdateType.STATE; } public RequestUpdatePacket(long requesterId, int requestIndex, long amount, long batch) { + this.updateType = UpdateType.NUMBERS; this.requesterId = requesterId; this.requestIndex = requestIndex; this.amount = amount; this.batch = batch; - this.updateType = UpdateType.NUMBERS; } - RequestUpdatePacket() {} + @Override + public ResourceLocation id() { + return ID; + } @Override - public void encode(RequestUpdatePacket packet, FriendlyByteBuf buffer) { - buffer.writeLong(packet.requesterId); - buffer.writeVarInt(packet.requestIndex); + public void write(FriendlyByteBuf buffer) { + buffer.writeLong(requesterId); + buffer.writeVarInt(requestIndex); - buffer.writeVarInt(packet.updateType.ordinal()); - if (packet.updateType == UpdateType.STATE) { - buffer.writeBoolean(packet.state); - } else if (packet.updateType == UpdateType.NUMBERS) { - buffer.writeLong(packet.amount); - buffer.writeLong(packet.batch); + buffer.writeVarInt(updateType.ordinal()); + if (updateType == UpdateType.STATE) { + buffer.writeBoolean(state); + } else if (updateType == UpdateType.NUMBERS) { + buffer.writeLong(amount); + buffer.writeLong(batch); } else { - throw new IllegalStateException("Unknown update type: " + packet.updateType); + throw new IllegalStateException("Unknown update type: " + updateType); } } - @Override - public RequestUpdatePacket decode(FriendlyByteBuf buffer) { + static RequestUpdatePacket decode(FriendlyByteBuf buffer) { var id = buffer.readLong(); var index = buffer.readVarInt(); @@ -66,18 +69,17 @@ public RequestUpdatePacket decode(FriendlyByteBuf buffer) { } @Override - protected void handlePacket(RequestUpdatePacket packet, @Nullable ServerPlayer player) { - if (player != null && player.containerMenu instanceof AbstractRequesterMenu requester) { - if (packet.updateType == UpdateType.STATE) { - requester.updateRequesterState(packet.requesterId, packet.requestIndex, packet.state); - } else if (packet.updateType == UpdateType.NUMBERS) { - requester.updateRequesterNumbers(packet.requesterId, packet.requestIndex, packet.amount, packet.batch); + public void handle(Player player) { + if (player.containerMenu instanceof AbstractRequesterMenu requester) { + if (updateType == UpdateType.STATE) { + requester.updateRequesterState(requesterId, requestIndex, state); + } else if (updateType == UpdateType.NUMBERS) { + requester.updateRequesterNumbers(requesterId, requestIndex, amount, batch); } } } private enum UpdateType { - STATE, - NUMBERS + STATE, NUMBERS } } diff --git a/src/main/java/com/almostreliable/merequester/network/RequesterSyncPacket.java b/src/main/java/com/almostreliable/merequester/network/RequesterSyncPacket.java index 8875046..5fc1346 100644 --- a/src/main/java/com/almostreliable/merequester/network/RequesterSyncPacket.java +++ b/src/main/java/com/almostreliable/merequester/network/RequesterSyncPacket.java @@ -1,18 +1,22 @@ package com.almostreliable.merequester.network; +import com.almostreliable.merequester.Utils; import com.almostreliable.merequester.client.abstraction.AbstractRequesterScreen; import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; import java.util.Objects; -public class RequesterSyncPacket extends ServerToClientPacket { +public final class RequesterSyncPacket implements Packet { - private boolean clearData; - private long requesterId; - private CompoundTag data; + static final ResourceLocation ID = Utils.getRL("requester_sync"); + + private final boolean clearData; + private final long requesterId; + private final CompoundTag data; private RequesterSyncPacket(boolean clearData, long requesterId, CompoundTag data) { this.clearData = clearData; @@ -20,7 +24,10 @@ private RequesterSyncPacket(boolean clearData, long requesterId, CompoundTag dat this.data = data; } - RequesterSyncPacket() {} + @Override + public ResourceLocation id() { + return ID; + } public static RequesterSyncPacket clearData() { return new RequesterSyncPacket(true, -1, new CompoundTag()); @@ -31,25 +38,20 @@ public static RequesterSyncPacket inventory(long requesterId, CompoundTag data) } @Override - public void encode(RequesterSyncPacket packet, FriendlyByteBuf buffer) { - buffer.writeBoolean(packet.clearData); - buffer.writeLong(packet.requesterId); - buffer.writeNbt(packet.data); + public void write(FriendlyByteBuf buffer) { + buffer.writeBoolean(clearData); + buffer.writeLong(requesterId); + buffer.writeNbt(data); } - @Override - public RequesterSyncPacket decode(FriendlyByteBuf buffer) { - return new RequesterSyncPacket( - buffer.readBoolean(), - buffer.readLong(), - Objects.requireNonNull(buffer.readNbt()) - ); + static RequesterSyncPacket decode(FriendlyByteBuf buffer) { + return new RequesterSyncPacket(buffer.readBoolean(), buffer.readLong(), Objects.requireNonNull(buffer.readNbt())); } @Override - protected void handlePacket(RequesterSyncPacket packet, ClientLevel level) { + public void handle(Player player) { if (Minecraft.getInstance().screen instanceof AbstractRequesterScreen screen) { - screen.updateFromMenu(packet.clearData, packet.requesterId, packet.data); + screen.updateFromMenu(clearData, requesterId, data); } } } diff --git a/src/main/java/com/almostreliable/merequester/network/ServerToClientPacket.java b/src/main/java/com/almostreliable/merequester/network/ServerToClientPacket.java deleted file mode 100644 index 341904d..0000000 --- a/src/main/java/com/almostreliable/merequester/network/ServerToClientPacket.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.almostreliable.merequester.network; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.network.NetworkEvent; - -import java.util.function.Supplier; - -public abstract class ServerToClientPacket implements Packet { - - @Override - public void handle(T packet, Supplier context) { - var level = Minecraft.getInstance().level; - if (level == null) return; - context.get().enqueueWork(() -> handlePacket(packet, level)); - context.get().setPacketHandled(true); - } - - @OnlyIn(Dist.CLIENT) - protected abstract void handlePacket(T packet, ClientLevel level); -} diff --git a/src/main/java/com/almostreliable/merequester/platform/Config.java b/src/main/java/com/almostreliable/merequester/platform/Config.java deleted file mode 100644 index 48c411c..0000000 --- a/src/main/java/com/almostreliable/merequester/platform/Config.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.almostreliable.merequester.platform; - -import com.almostreliable.merequester.MERequester; -import net.minecraftforge.common.ForgeConfigSpec; - -final class Config { - - static final ForgeConfigSpec COMMON_SPEC; - static final CommonConfig COMMON; - - static { - var commonPair = new ForgeConfigSpec.Builder().configure(CommonConfig::new); - COMMON_SPEC = commonPair.getRight(); - COMMON = commonPair.getLeft(); - } - - private Config() {} - - static final class CommonConfig { - - final ForgeConfigSpec.IntValue requests; - final ForgeConfigSpec.DoubleValue idleEnergy; - final ForgeConfigSpec.BooleanValue requireChannel; - - private CommonConfig(ForgeConfigSpec.Builder builder) { - builder.push(MERequester.REQUESTER_ID); - requests = builder.comment("The amount of requests a single ME Requester can hold.") - .defineInRange("requests", 5, 1, 64); - idleEnergy = builder.comment( - "The amount of energy (in AE) the ME Requester drains from the ME network when idle.") - .defineInRange("idle_energy", 5.0, 0.0, Double.MAX_VALUE); - requireChannel = builder.comment("Whether the ME Requester requires an ME network channel to function.") - .define("require_channel", true); - builder.pop(); - } - } -} diff --git a/src/main/java/com/almostreliable/merequester/platform/Platform.java b/src/main/java/com/almostreliable/merequester/platform/Platform.java deleted file mode 100644 index aa74961..0000000 --- a/src/main/java/com/almostreliable/merequester/platform/Platform.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.almostreliable.merequester.platform; - -import com.almostreliable.merequester.Registration; -import com.almostreliable.merequester.Utils; -import com.almostreliable.merequester.network.DragAndDropPacket; -import com.almostreliable.merequester.network.PacketHandler; -import com.almostreliable.merequester.network.RequestUpdatePacket; -import com.almostreliable.merequester.network.RequesterSyncPacket; -import net.minecraft.client.gui.components.Renderable; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.network.PacketDistributor; - -import java.util.List; - -public final class Platform { - - private Platform() {} - - public static void initConfig() { - var modLoadingContext = ModLoadingContext.get(); - modLoadingContext.registerConfig(ModConfig.Type.COMMON, Config.COMMON_SPEC); - } - - public static int getRequestLimit() { - return Config.COMMON.requests.get(); - } - - public static double getIdleEnergy() { - return Config.COMMON.idleEnergy.get(); - } - - public static boolean requireChannel() { - return Config.COMMON.requireChannel.get(); - } - - @SuppressWarnings("Convert2MethodRef") - public static CreativeModeTab createTab() { - return CreativeModeTab.builder() - .title(Utils.translate("itemGroup", "tab")) - .icon(() -> Registration.REQUESTER.stack()) - .noScrollBar() - .build(); - } - - public static void sendRequestUpdate(long requesterId, int requestIndex, boolean state) { - PacketHandler.CHANNEL.sendToServer(new RequestUpdatePacket(requesterId, requestIndex, state)); - } - - public static void sendRequestUpdate(long requesterId, int requestIndex, long amount, long batch) { - PacketHandler.CHANNEL.sendToServer(new RequestUpdatePacket(requesterId, requestIndex, amount, batch)); - } - - public static void sendDragAndDrop(long requesterId, int requestIndex, ItemStack item) { - PacketHandler.CHANNEL.sendToServer(new DragAndDropPacket(requesterId, requestIndex, item)); - } - - public static void sendClearData(Player player) { - if (player instanceof ServerPlayer serverPlayer) { - PacketHandler.CHANNEL.send( - PacketDistributor.PLAYER.with(() -> serverPlayer), - RequesterSyncPacket.clearData() - ); - } - } - - public static void sendInventoryData(Player player, long requesterId, CompoundTag data) { - if (player instanceof ServerPlayer serverPlayer) { - PacketHandler.CHANNEL.send( - PacketDistributor.PLAYER.with(() -> serverPlayer), - RequesterSyncPacket.inventory(requesterId, data) - ); - } - } - - public static List getRenderables(Screen screen) { - return screen.renderables; - } -} diff --git a/src/main/java/com/almostreliable/merequester/platform/TagSerializable.java b/src/main/java/com/almostreliable/merequester/platform/TagSerializable.java deleted file mode 100644 index 61df75b..0000000 --- a/src/main/java/com/almostreliable/merequester/platform/TagSerializable.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.almostreliable.merequester.platform; - -import net.minecraft.nbt.Tag; - -public interface TagSerializable { - T serialize(); - - void deserialize(T tag); -} diff --git a/src/main/java/com/almostreliable/merequester/platform/package-info.java b/src/main/java/com/almostreliable/merequester/platform/package-info.java deleted file mode 100644 index afdd8cc..0000000 --- a/src/main/java/com/almostreliable/merequester/platform/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package com.almostreliable.merequester.platform; - -import net.minecraft.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/com/almostreliable/merequester/requester/RequesterBlock.java b/src/main/java/com/almostreliable/merequester/requester/RequesterBlock.java index a4acbf1..75b08d9 100644 --- a/src/main/java/com/almostreliable/merequester/requester/RequesterBlock.java +++ b/src/main/java/com/almostreliable/merequester/requester/RequesterBlock.java @@ -27,8 +27,6 @@ import javax.annotation.Nullable; import java.util.List; -import static com.almostreliable.merequester.Utils.f; - public class RequesterBlock extends AEBaseEntityBlock { private static final IOrientationStrategy ORIENTATION_STRATEGY = new FacingWithVerticalSpin(); @@ -74,8 +72,7 @@ public void appendHoverText( ) { if (Screen.hasShiftDown()) { tooltip.add(Component.literal(" ")); - tooltip.add(Utils.translate("tooltip", f("{}_desc", MERequester.REQUESTER_ID)) - .withStyle(ChatFormatting.AQUA)); + tooltip.add(Utils.translate("tooltip", String.format("%s_desc", MERequester.REQUESTER_ID)).withStyle(ChatFormatting.AQUA)); } else { Utils.addShiftInfoTooltip(tooltip); } diff --git a/src/main/java/com/almostreliable/merequester/requester/RequesterBlockEntity.java b/src/main/java/com/almostreliable/merequester/requester/RequesterBlockEntity.java index 5dfdbc9..f756739 100644 --- a/src/main/java/com/almostreliable/merequester/requester/RequesterBlockEntity.java +++ b/src/main/java/com/almostreliable/merequester/requester/RequesterBlockEntity.java @@ -17,9 +17,9 @@ import appeng.blockentity.grid.AENetworkBlockEntity; import appeng.me.helpers.MachineSource; import appeng.util.SettingsFrom; +import com.almostreliable.merequester.Config; import com.almostreliable.merequester.MERequester; import com.almostreliable.merequester.Utils; -import com.almostreliable.merequester.platform.Platform; import com.almostreliable.merequester.requester.abstraction.RequestHost; import com.almostreliable.merequester.requester.status.LinkState; import com.almostreliable.merequester.requester.status.RequestStatus; @@ -58,16 +58,17 @@ public class RequesterBlockEntity extends AENetworkBlockEntity implements Reques public RequesterBlockEntity(BlockEntityType blockEntityType, BlockPos pos, BlockState blockState) { super(blockEntityType, pos, blockState); requests = new Requests(this); - requestStatus = new StatusState[Platform.getRequestLimit()]; + requestStatus = new StatusState[Config.COMMON.requests.get()]; Arrays.fill(requestStatus, StatusState.IDLE); storageManager = new StorageManager(this); actionSource = new MachineSource(this); - getMainNode().setExposedOnSides(getExposedSides()) + getMainNode() + .setExposedOnSides(getExposedSides()) .addService(IGridTickable.class, this) .addService(ICraftingRequester.class, this) .addService(IStorageWatcherNode.class, storageManager) - .setIdlePowerUsage(Platform.getIdleEnergy()); - if (Platform.requireChannel()) { + .setIdlePowerUsage(Config.COMMON.idleEnergy.get()); + if (Config.COMMON.requireChannel.get()) { getMainNode().setFlags(GridFlags.REQUIRE_CHANNEL); } } @@ -75,24 +76,24 @@ public RequesterBlockEntity(BlockEntityType blockEntityType, BlockPos pos, Bl @Override public void loadTag(CompoundTag tag) { super.loadTag(tag); - if (tag.contains(REQUESTS_ID)) requests.deserialize(tag.getCompound(REQUESTS_ID)); + if (tag.contains(REQUESTS_ID)) requests.deserializeNBT(tag.getCompound(REQUESTS_ID)); if (tag.contains(REQUEST_STATUS_ID)) deserializeStatus(tag.getCompound(REQUEST_STATUS_ID)); - if (tag.contains(STORAGE_MANAGER_ID)) storageManager.deserialize(tag.getCompound(STORAGE_MANAGER_ID)); + if (tag.contains(STORAGE_MANAGER_ID)) storageManager.deserializeNBT(tag.getCompound(STORAGE_MANAGER_ID)); } @Override public void saveAdditional(CompoundTag tag) { super.saveAdditional(tag); - tag.put(REQUESTS_ID, requests.serialize()); + tag.put(REQUESTS_ID, requests.serializeNBT()); tag.put(REQUEST_STATUS_ID, serializeStatus()); - tag.put(STORAGE_MANAGER_ID, storageManager.serialize()); + tag.put(STORAGE_MANAGER_ID, storageManager.serializeNBT()); } @Override public void importSettings(SettingsFrom mode, CompoundTag input, @Nullable Player player) { super.importSettings(mode, input, player); if (mode == SettingsFrom.MEMORY_CARD) { - if (input.contains(REQUESTS_ID)) requests.deserialize(input.getCompound(REQUESTS_ID)); + if (input.contains(REQUESTS_ID)) requests.deserializeNBT(input.getCompound(REQUESTS_ID)); } } @@ -100,7 +101,7 @@ public void importSettings(SettingsFrom mode, CompoundTag input, @Nullable Playe public void exportSettings(SettingsFrom mode, CompoundTag output, @Nullable Player player) { super.exportSettings(mode, output, player); if (mode == SettingsFrom.MEMORY_CARD) { - output.put(REQUESTS_ID, requests.serialize()); + output.put(REQUESTS_ID, requests.serializeNBT()); } } @@ -112,7 +113,7 @@ public void onReady() { @Override public TickingRequest getTickingRequest(IGridNode node) { - return new TickingRequest(1, 20, false, false); + return new TickingRequest(1, 20, false); } @Override @@ -135,9 +136,7 @@ public Requests getRequests() { @Override public Component getTerminalName() { - return hasCustomName() ? - Objects.requireNonNull(getCustomName()) : - Utils.translate("block", MERequester.REQUESTER_ID); + return hasCustomName() ? Objects.requireNonNull(getCustomName()) : Utils.translate("block", MERequester.REQUESTER_ID); } @Override @@ -240,7 +239,8 @@ public IActionSource getActionSource() { @Override public ImmutableSet getRequestedJobs() { - return Arrays.stream(requestStatus) + return Arrays + .stream(requestStatus) .filter(LinkState.class::isInstance) .map(state -> ((LinkState) state).link()) .collect(ImmutableSet.toImmutableSet()); diff --git a/src/main/java/com/almostreliable/merequester/requester/RequesterMenu.java b/src/main/java/com/almostreliable/merequester/requester/RequesterMenu.java index 5cb80b8..a21ddbd 100644 --- a/src/main/java/com/almostreliable/merequester/requester/RequesterMenu.java +++ b/src/main/java/com/almostreliable/merequester/requester/RequesterMenu.java @@ -3,12 +3,14 @@ import appeng.api.networking.IGrid; import appeng.menu.implementations.MenuTypeBuilder; import com.almostreliable.merequester.MERequester; -import com.almostreliable.merequester.platform.Platform; +import com.almostreliable.merequester.network.RequesterSyncPacket; import com.almostreliable.merequester.requester.abstraction.AbstractRequesterMenu; import com.almostreliable.merequester.requester.abstraction.RequestTracker; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.network.PacketDistributor; import javax.annotation.Nullable; @@ -18,7 +20,8 @@ public final class RequesterMenu extends AbstractRequesterMenu { .create(RequesterMenu::new, RequesterBlockEntity.class) .build(MERequester.REQUESTER_ID); - @Nullable private RequestTracker requestTracker; + @Nullable + private RequestTracker requestTracker; private RequesterMenu(int id, Inventory playerInventory, RequesterBlockEntity host) { super(TYPE, id, playerInventory, host); @@ -47,7 +50,9 @@ protected ItemStack transferStackToMenu(ItemStack stack) { @Override protected void sendFullUpdate(@Nullable IGrid grid) { - Platform.sendClearData(getPlayer()); + if (getPlayer() instanceof ServerPlayer serverPlayer) { + PacketDistributor.PLAYER.with(serverPlayer).send(RequesterSyncPacket.clearData()); + } requestTracker = createTracker((RequesterBlockEntity) getBlockEntity()); syncRequestTrackerFull(requestTracker); } diff --git a/src/main/java/com/almostreliable/merequester/requester/Requests.java b/src/main/java/com/almostreliable/merequester/requester/Requests.java index 33a053c..3d3f717 100644 --- a/src/main/java/com/almostreliable/merequester/requester/Requests.java +++ b/src/main/java/com/almostreliable/merequester/requester/Requests.java @@ -9,8 +9,7 @@ import appeng.api.stacks.GenericStack; import appeng.api.storage.MEStorage; import appeng.helpers.externalstorage.GenericStackInv; -import com.almostreliable.merequester.platform.Platform; -import com.almostreliable.merequester.platform.TagSerializable; +import com.almostreliable.merequester.Config; import com.almostreliable.merequester.requester.abstraction.RequestHost; import com.almostreliable.merequester.requester.status.RequestStatus; import com.google.common.primitives.Ints; @@ -18,31 +17,31 @@ import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.common.util.INBTSerializable; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Objects; -import static com.almostreliable.merequester.Utils.f; - /** * Uses the same approach as {@link GenericStackInv} to track items and fluids. *

* Automatically provides a menu wrapper by implementing {@link InternalInventory}. */ @SuppressWarnings("UnstableApiUsage") -public class Requests implements MEStorage, GenericInternalInventory, InternalInventory, TagSerializable { +public class Requests implements MEStorage, GenericInternalInventory, InternalInventory, INBTSerializable { // if null, the inventory is client-side and doesn't need saving - @Nullable private final RequestHost host; + @Nullable + private final RequestHost host; private final Request[] requests; private final int size; public Requests(@Nullable RequestHost host) { this.host = host; - this.size = Platform.getRequestLimit(); + this.size = Config.COMMON.requests.get(); requests = new Request[size]; for (var i = 0; i < requests.length; i++) { requests[i] = new Request(i); @@ -105,7 +104,12 @@ public void setStack(int index, @Nullable GenericStack stack) { } @Override - public boolean isAllowed(AEKey key) { + public boolean isSupportedType(AEKeyType type) { + return true; + } + + @Override + public boolean isAllowedIn(int slot, AEKey what) { return true; } @@ -131,18 +135,18 @@ public void onChange() { } @Override - public CompoundTag serialize() { + public CompoundTag serializeNBT() { var tag = new CompoundTag(); for (var i = 0; i < size(); i++) { - tag.put(String.valueOf(i), get(i).serialize()); + tag.put(String.valueOf(i), get(i).serializeNBT()); } return tag; } @Override - public void deserialize(CompoundTag tag) { + public void deserializeNBT(CompoundTag tag) { for (var i = 0; i < size(); i++) { - get(i).deserialize(tag.getCompound(String.valueOf(i))); + get(i).deserializeNBT(tag.getCompound(String.valueOf(i))); } } @@ -219,7 +223,7 @@ private GenericStack convertToSuitableStack(ItemStack stack) { } // - public final class Request implements TagSerializable { + public final class Request implements INBTSerializable { // serialization IDs private static final String STATE_ID = "state"; @@ -231,7 +235,8 @@ public final class Request implements TagSerializable { private final int index; private boolean state = true; - @Nullable private AEKey key; + @Nullable + private AEKey key; private long amount; private long batch = 1; @@ -244,7 +249,7 @@ private Request(int index) { } @Override - public CompoundTag serialize() { + public CompoundTag serializeNBT() { var tag = new CompoundTag(); tag.putBoolean(STATE_ID, state); if (key != null) tag.put(KEY_ID, key.toTagGeneric()); @@ -255,7 +260,7 @@ public CompoundTag serialize() { } @Override - public void deserialize(CompoundTag tag) { + public void deserializeNBT(CompoundTag tag) { state = tag.getBoolean(STATE_ID); key = tag.contains(KEY_ID) ? AEKey.fromTagGeneric(tag.getCompound(KEY_ID)) : null; amount = tag.getLong(AMOUNT_ID); @@ -289,18 +294,19 @@ public void updateBatch(long batch) { @Override public String toString() { - return f( - "Request[state={}, key={}, amount={}, batch={}, client_status={}]", - state, key == null ? "none" : key.getDisplayName(), amount, batch, clientStatus + return String.format( + "Request[state=%s, key=%s, amount=%s, batch=%s, client_status=%s]", + state, + key == null ? "none" : key.getDisplayName(), + amount, + batch, + clientStatus ); } public boolean isDifferent(Request clientRequest) { - return state != clientRequest.state || - !Objects.equals(key, clientRequest.key) || - amount != clientRequest.amount || - batch != clientRequest.batch || - clientStatus != clientRequest.clientStatus; + return state != clientRequest.state || !Objects.equals(key, clientRequest.key) || amount != clientRequest.amount || + batch != clientRequest.batch || clientStatus != clientRequest.clientStatus; } @Nullable diff --git a/src/main/java/com/almostreliable/merequester/requester/StorageManager.java b/src/main/java/com/almostreliable/merequester/requester/StorageManager.java index 78edc8f..4da7eb1 100644 --- a/src/main/java/com/almostreliable/merequester/requester/StorageManager.java +++ b/src/main/java/com/almostreliable/merequester/requester/StorageManager.java @@ -4,23 +4,24 @@ import appeng.api.networking.IStackWatcher; import appeng.api.networking.storage.IStorageWatcherNode; import appeng.api.stacks.AEKey; -import com.almostreliable.merequester.platform.Platform; -import com.almostreliable.merequester.platform.TagSerializable; +import com.almostreliable.merequester.Config; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.common.util.INBTSerializable; import javax.annotation.Nullable; import java.util.List; -public class StorageManager implements IStorageWatcherNode, TagSerializable { +public class StorageManager implements IStorageWatcherNode, INBTSerializable { private final RequesterBlockEntity host; private final Storage[] storages; - @Nullable private IStackWatcher stackWatcher; + @Nullable + private IStackWatcher stackWatcher; StorageManager(RequesterBlockEntity host) { this.host = host; - storages = new Storage[Platform.getRequestLimit()]; + storages = new Storage[Config.COMMON.requests.get()]; } public Storage get(int slot) { @@ -58,30 +59,25 @@ public long computeAmountToCraft(int slot) { } @Override - public CompoundTag serialize() { + public CompoundTag serializeNBT() { var tag = new CompoundTag(); for (var i = 0; i < storages.length; i++) { - tag.put(String.valueOf(i), get(i).serialize()); + tag.put(String.valueOf(i), get(i).serializeNBT()); } return tag; } @Override - public void deserialize(CompoundTag tag) { + public void deserializeNBT(CompoundTag tag) { for (var i = 0; i < storages.length; i++) { - get(i).deserialize(tag.getCompound(String.valueOf(i))); + get(i).deserializeNBT(tag.getCompound(String.valueOf(i))); } } void addDrops(List drops) { for (var storage : storages) { if (storage == null || storage.key == null) continue; - storage.key.addDrops( - storage.getBufferAmount() + storage.pendingAmount, - drops, - host.getLevel(), - host.getBlockPos() - ); + storage.key.addDrops(storage.getBufferAmount() + storage.pendingAmount, drops, host.getLevel(), host.getBlockPos()); } } @@ -109,14 +105,10 @@ private void resetWatcher() { private void computeKnownAmount(int slot) { var key = host.getRequests().getKey(slot); if (key == null) return; - get(slot).knownAmount = host.getMainNodeGrid() - .getStorageService() - .getInventory() - .getAvailableStacks() - .get(key); + get(slot).knownAmount = host.getMainNodeGrid().getStorageService().getInventory().getAvailableStacks().get(key); } - public static class Storage implements TagSerializable { + public static class Storage implements INBTSerializable { // serialization IDs private static final String KEY_ID = "key"; @@ -124,14 +116,15 @@ public static class Storage implements TagSerializable { private static final String PENDING_AMOUNT_ID = "pending_amount"; private static final String KNOWN_AMOUNT_ID = "known_amount"; - @Nullable private AEKey key; // the item or fluid type stored in this storage + @Nullable + private AEKey key; // the item or fluid type stored in this storage private long totalAmount; // total amount of the job that needs to be exported - private long bufferAmount; // amount of items or fluid in the buffer + private long bufferAmount; // number of items or fluid in the buffer private long pendingAmount; // amount currently being inserted into the system but did not arrive yet private long knownAmount = -1; // the known amount stored in the system @Override - public CompoundTag serialize() { + public CompoundTag serializeNBT() { var tag = new CompoundTag(); if (key != null) tag.put(KEY_ID, key.toTagGeneric()); tag.putLong(BUFFER_AMOUNT_ID, bufferAmount); @@ -141,7 +134,7 @@ public CompoundTag serialize() { } @Override - public void deserialize(CompoundTag tag) { + public void deserializeNBT(CompoundTag tag) { key = tag.contains(KEY_ID) ? AEKey.fromTagGeneric(tag.getCompound(KEY_ID)) : null; bufferAmount = tag.getLong(BUFFER_AMOUNT_ID); pendingAmount = tag.getLong(PENDING_AMOUNT_ID); diff --git a/src/main/java/com/almostreliable/merequester/requester/abstraction/AbstractRequesterMenu.java b/src/main/java/com/almostreliable/merequester/requester/abstraction/AbstractRequesterMenu.java index 781c9ee..56db969 100644 --- a/src/main/java/com/almostreliable/merequester/requester/abstraction/AbstractRequesterMenu.java +++ b/src/main/java/com/almostreliable/merequester/requester/abstraction/AbstractRequesterMenu.java @@ -6,13 +6,14 @@ import appeng.helpers.InventoryAction; import appeng.menu.AEBaseMenu; import com.almostreliable.merequester.MERequester; -import com.almostreliable.merequester.platform.Platform; +import com.almostreliable.merequester.network.RequesterSyncPacket; import com.almostreliable.merequester.requester.RequesterBlockEntity; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.network.PacketDistributor; import javax.annotation.Nullable; @@ -46,8 +47,7 @@ public void doAction(ServerPlayer player, InventoryAction action, int slot, long // the screen only has fake slots, so don't transfer anything to the player's inventory switch (action) { - case PICKUP_OR_SET_DOWN -> - requestSlot.setItemDirect(0, carriedStack.isEmpty() ? ItemStack.EMPTY : carriedStack.copy()); + case PICKUP_OR_SET_DOWN -> requestSlot.setItemDirect(0, carriedStack.isEmpty() ? ItemStack.EMPTY : carriedStack.copy()); case SPLIT_OR_PLACE_SINGLE -> { if (carriedStack.isEmpty()) { requestSlot.setItemDirect(0, ItemStack.EMPTY); @@ -61,11 +61,7 @@ public void doAction(ServerPlayer player, InventoryAction action, int slot, long case EMPTY_ITEM -> { var emptyingAction = ContainerItemStrategies.getEmptyingAction(carriedStack); if (emptyingAction != null) { - requestSlot.insertItem( - 0, - GenericStack.wrapInItemStack(emptyingAction.what(), emptyingAction.maxAmount()), - false - ); + requestSlot.insertItem(0, GenericStack.wrapInItemStack(emptyingAction.what(), emptyingAction.maxAmount()), false); } } case CREATIVE_DUPLICATE -> { @@ -114,16 +110,18 @@ protected void syncRequestTrackerFull(RequestTracker requestTracker) { var client = requestTracker.getClient(); // get the requests from the server - var tag = server.serialize(); + var tag = server.serializeNBT(); // store the information in the client tracker to // check for differences on partial updates later // tag serialization is used to avoid references to the original data - client.deserialize(tag); + client.deserializeNBT(tag); // send relevant data to the client tag.putString(UNIQUE_NAME_ID, requestTracker.getName()); tag.putLong(SORT_BY_ID, requestTracker.getSortBy()); - Platform.sendInventoryData(getPlayer(), requestTracker.getId(), tag); + if (getPlayer() instanceof ServerPlayer serverPlayer) { + PacketDistributor.PLAYER.with(serverPlayer).send(RequesterSyncPacket.inventory(requestTracker.getId(), tag)); + } } protected void syncRequestTrackerPartial(RequestTracker requestTracker) { @@ -144,16 +142,16 @@ protected void syncRequestTrackerPartial(RequestTracker requestTracker) { tag.putLong(SORT_BY_ID, requestTracker.getSortBy()); } - var serverData = serverRequest.serialize(); + var serverData = serverRequest.serializeNBT(); tag.put(String.valueOf(i), serverData); // update the client information for future difference checks - clientRequest.deserialize(serverData); + clientRequest.deserializeNBT(serverData); } } // only send an update if something changed - if (tag != null) { - Platform.sendInventoryData(getPlayer(), requestTracker.getId(), tag); + if (tag != null && getPlayer() instanceof ServerPlayer serverPlayer) { + PacketDistributor.PLAYER.with(serverPlayer).send(RequesterSyncPacket.inventory(requestTracker.getId(), tag)); } } diff --git a/src/main/java/com/almostreliable/merequester/requester/status/MissingState.java b/src/main/java/com/almostreliable/merequester/requester/status/MissingState.java index 8ecf13c..f8ec1ca 100644 --- a/src/main/java/com/almostreliable/merequester/requester/status/MissingState.java +++ b/src/main/java/com/almostreliable/merequester/requester/status/MissingState.java @@ -7,7 +7,8 @@ public class MissingState implements StatusState { - @Nullable private PlanState simulatedPlanState; + @Nullable + private PlanState simulatedPlanState; MissingState() {} diff --git a/src/main/java/com/almostreliable/merequester/requester/status/PlanState.java b/src/main/java/com/almostreliable/merequester/requester/status/PlanState.java index 313eb99..c24f219 100644 --- a/src/main/java/com/almostreliable/merequester/requester/status/PlanState.java +++ b/src/main/java/com/almostreliable/merequester/requester/status/PlanState.java @@ -1,6 +1,5 @@ package com.almostreliable.merequester.requester.status; -import appeng.api.networking.crafting.CraftingSubmitErrorCode; import appeng.api.networking.crafting.ICraftingPlan; import appeng.api.networking.ticking.TickRateModulation; import com.almostreliable.merequester.requester.RequesterBlockEntity; @@ -24,15 +23,12 @@ public StatusState handle(RequesterBlockEntity host, int index) { try { var plan = future.get(); - var submitResult = host.getMainNodeGrid() - .getCraftingService() - .submitJob(plan, host, null, false, host.getActionSource()); + if (!plan.missingItems().isEmpty()) { + return StatusState.MISSING; + } + var submitResult = host.getMainNodeGrid().getCraftingService().submitJob(plan, host, null, false, host.getActionSource()); if (!submitResult.successful() || submitResult.link() == null) { - if (submitResult.errorCode() == CraftingSubmitErrorCode.INCOMPLETE_PLAN && - !plan.missingItems().isEmpty()) { - return StatusState.MISSING; - } return StatusState.IDLE; } diff --git a/src/main/java/com/almostreliable/merequester/requester/status/RequestState.java b/src/main/java/com/almostreliable/merequester/requester/status/RequestState.java index 2aa1c4d..0416977 100644 --- a/src/main/java/com/almostreliable/merequester/requester/status/RequestState.java +++ b/src/main/java/com/almostreliable/merequester/requester/status/RequestState.java @@ -14,14 +14,15 @@ public StatusState handle(RequesterBlockEntity owner, int index) { if (amountToCraft <= 0) return StatusState.IDLE; var key = owner.getRequests().getKey(index); - var future = owner.getMainNodeGrid() + var future = owner + .getMainNodeGrid() .getCraftingService() .beginCraftingCalculation( owner.getLevel(), owner::getActionSource, key, amountToCraft, - CalculationStrategy.CRAFT_LESS + CalculationStrategy.REPORT_MISSING_ITEMS ); return new PlanState(future); diff --git a/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalMenu.java b/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalMenu.java index fffe283..36d5f00 100644 --- a/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalMenu.java +++ b/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalMenu.java @@ -6,14 +6,16 @@ import appeng.menu.implementations.MenuTypeBuilder; import appeng.menu.implementations.PatternAccessTermMenu; import com.almostreliable.merequester.MERequester; -import com.almostreliable.merequester.platform.Platform; +import com.almostreliable.merequester.network.RequesterSyncPacket; import com.almostreliable.merequester.requester.RequesterBlockEntity; import com.almostreliable.merequester.requester.abstraction.AbstractRequesterMenu; import com.almostreliable.merequester.requester.abstraction.RequestTracker; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.network.PacketDistributor; import javax.annotation.Nullable; import java.util.Comparator; @@ -55,8 +57,7 @@ public void broadcastChanges() { @Override protected ItemStack transferStackToMenu(ItemStack stack) { // sort the requesters like in the terminal to refer to the same slots - var requesters = byRequester.keySet() - .stream().sorted(Comparator.comparingLong(RequesterBlockEntity::getSortValue)).toList(); + var requesters = byRequester.keySet().stream().sorted(Comparator.comparingLong(RequesterBlockEntity::getSortValue)).toList(); // find the first available slot and put the stack there for (var requester : requesters) { @@ -75,7 +76,9 @@ protected void sendFullUpdate(@Nullable IGrid grid) { byRequester.clear(); // clear the current data on the client - Platform.sendClearData(getPlayer()); + if (getPlayer() instanceof ServerPlayer serverPlayer) { + PacketDistributor.PLAYER.with(serverPlayer).send(RequesterSyncPacket.clearData()); + } for (var requester : grid.getActiveMachines(RequesterBlockEntity.class)) { byRequester.put(requester, createTracker(requester)); @@ -126,6 +129,7 @@ private IGrid getGrid() { } private static class VisitorState { + private int total; private boolean forceFullUpdate; } diff --git a/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalPart.java b/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalPart.java index c94148a..736670b 100644 --- a/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalPart.java +++ b/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalPart.java @@ -15,19 +15,15 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import static com.almostreliable.merequester.Utils.f; - /** * yoinked from {@link PatternAccessTerminalPart} */ public class RequesterTerminalPart extends AbstractDisplayPart { - @PartModels private static final ResourceLocation MODEL_OFF = AppEng.makeId( - f("part/{}_off", MERequester.TERMINAL_ID) - ); - @PartModels private static final ResourceLocation MODEL_ON = AppEng.makeId( - f("part/{}_on", MERequester.TERMINAL_ID) - ); + @PartModels + private static final ResourceLocation MODEL_OFF = AppEng.makeId(String.format("part/%s_off", MERequester.TERMINAL_ID)); + @PartModels + private static final ResourceLocation MODEL_ON = AppEng.makeId(String.format("part/%s_on", MERequester.TERMINAL_ID)); private static final IPartModel MODELS_OFF = new PartModel(MODEL_BASE, MODEL_OFF, MODEL_STATUS_OFF); private static final IPartModel MODELS_ON = new PartModel(MODEL_BASE, MODEL_ON, MODEL_STATUS_ON); diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 8652792..39e36f0 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,9 +1,12 @@ modLoader = "javafml" -loaderVersion = "[${forgeLoaderVersion},)" +loaderVersion = "[2,)" issueTrackerURL = "https://github.com/${githubUser}/${githubRepo}/issues" license = "${license}" logoFile = "logo.png" +[[mixins]] +config = "${modId}.mixins.json" + [[mods]] modId = "${modId}" version = "${version}" @@ -11,23 +14,23 @@ displayName = "${modName}" authors = "${modAuthor}" description = '''${modDescription}''' -[[dependencies.${modId}]] -modId = "forge" -mandatory = true -versionRange = "[${forgeVersion},)" +[[dependencies."${modId}"]] +modId = "neoforge" +type = "REQUIRED" +versionRange = "[${neoVersion},)" ordering = "NONE" side = "BOTH" -[[dependencies.${modId}]] +[[dependencies."${modId}"]] modId = "minecraft" -mandatory = true -versionRange = "[${minecraftVersion},)" +type = "REQUIRED" +versionRange = "[${mcVersion},)" ordering = "NONE" side = "BOTH" -[[dependencies.${modId}]] +[[dependencies."${modId}"]] modId = "ae2" -mandatory = true +type = "REQUIRED" versionRange = "[${aeVersion},)" ordering = "AFTER" side = "BOTH" diff --git a/src/main/resources/assets/merequester/lang/de_de.json b/src/main/resources/assets/merequester/lang/de_de.json index 584fcb4..7bdb259 100644 --- a/src/main/resources/assets/merequester/lang/de_de.json +++ b/src/main/resources/assets/merequester/lang/de_de.json @@ -1,5 +1,5 @@ { - "itemGroup.merequester": "ME Anforderer", + "itemGroup.merequester.tab": "ME Anforderer", "item.merequester.requester_terminal": "ME Anforderungskonsole", "block.merequester.requester": "ME Anforderer", diff --git a/src/main/resources/assets/merequester/lang/pt_br.json b/src/main/resources/assets/merequester/lang/pt_br.json index c2bc50d..78c8fae 100644 --- a/src/main/resources/assets/merequester/lang/pt_br.json +++ b/src/main/resources/assets/merequester/lang/pt_br.json @@ -1,5 +1,5 @@ { - "itemGroup.merequester": "Requisitor ME", + "itemGroup.merequester.tab": "Requisitor ME", "item.merequester.requester_terminal": "Terminal requisitor ME", "block.merequester.requester": "Requisitor ME", @@ -27,4 +27,4 @@ "tooltip.merequester.link_desc": "O sistema atualmente está fabricando o item ou fluido requisitado.", "tooltip.merequester.export": "Exportando", "tooltip.merequester.export_desc": "O requisitor está tentando exportar os resultados da fabricação ao sistema. Se o requisitor estiver nesse estado por muito tempo, não há espaço disponível para a exportação." -} \ No newline at end of file +} diff --git a/src/main/resources/assets/merequester/lang/zh_cn.json b/src/main/resources/assets/merequester/lang/zh_cn.json index b0b6a3d..16ae1be 100644 --- a/src/main/resources/assets/merequester/lang/zh_cn.json +++ b/src/main/resources/assets/merequester/lang/zh_cn.json @@ -1,33 +1,32 @@ { - "itemGroup.merequester": "ME 请求器", - - "item.merequester.requester_terminal": "ME 请求终端", - "block.merequester.requester": "ME 请求器", - - "gui.merequester.requester_terminal": "ME 请求终端", - "gui.merequester.no_requesters": "没有找到 ME 请求器", - - "tooltip.merequester.requester_desc": "在需要时,通过请求合成,自动保持物品和液体的库存。必须连接到ME网络,并且可以从 ME 请求终端 进行访问。断开后将失去其配置。可以使用内存卡复制设置。", - - "tooltip.merequester.shift_for_more": "按下 %s 获取更多信息", - "tooltip.merequester.enter_to_submit": "按下 %s 来提交更改", - - "tooltip.merequester.whole_number": "必须是整数!", - "tooltip.merequester.locked": "已锁定!请求正在进行!", - - "tooltip.merequester.toggle": "请求开关", - "tooltip.merequester.amount": "库存容量", - "tooltip.merequester.batch": "并行大小", - "tooltip.merequester.submit": "提交更改", - "tooltip.merequester.status": "请求状态", - - "tooltip.merequester.idle": "空闲", - "tooltip.merequester.idle_desc": "当已经达到要求的数量或没有该物品或液体的合成样板时,请求器处于空闲状态。", - "tooltip.merequester.missing": "缺少材料", - "tooltip.merequester.missing_desc": "系统缺少制作所需物品或液体的原料。当原料可用时,该过程将继续。", - "tooltip.merequester.link": "合成中", - "tooltip.merequester.link_desc": "系统当前正在合成所请求的物品或液体。", - "tooltip.merequester.export": "导出中", - "tooltip.merequester.export_desc": "请求器正试图将合成结果导出到系统中。如果请求器长时间处于这种状态,则网络没有可用于导出的空间。" - } - \ No newline at end of file + "itemGroup.merequester.tab": "ME 请求器", + + "item.merequester.requester_terminal": "ME 请求终端", + "block.merequester.requester": "ME 请求器", + + "gui.merequester.requester_terminal": "ME 请求终端", + "gui.merequester.no_requesters": "没有找到 ME 请求器", + + "tooltip.merequester.requester_desc": "在需要时,通过请求合成,自动保持物品和液体的库存。必须连接到ME网络,并且可以从 ME 请求终端 进行访问。断开后将失去其配置。可以使用内存卡复制设置。", + + "tooltip.merequester.shift_for_more": "按下 %s 获取更多信息", + "tooltip.merequester.enter_to_submit": "按下 %s 来提交更改", + + "tooltip.merequester.whole_number": "必须是整数!", + "tooltip.merequester.locked": "已锁定!请求正在进行!", + + "tooltip.merequester.toggle": "请求开关", + "tooltip.merequester.amount": "库存容量", + "tooltip.merequester.batch": "并行大小", + "tooltip.merequester.submit": "提交更改", + "tooltip.merequester.status": "请求状态", + + "tooltip.merequester.idle": "空闲", + "tooltip.merequester.idle_desc": "当已经达到要求的数量或没有该物品或液体的合成样板时,请求器处于空闲状态。", + "tooltip.merequester.missing": "缺少材料", + "tooltip.merequester.missing_desc": "系统缺少制作所需物品或液体的原料。当原料可用时,该过程将继续。", + "tooltip.merequester.link": "合成中", + "tooltip.merequester.link_desc": "系统当前正在合成所请求的物品或液体。", + "tooltip.merequester.export": "导出中", + "tooltip.merequester.export_desc": "请求器正试图将合成结果导出到系统中。如果请求器长时间处于这种状态,则网络没有可用于导出的空间。" +} diff --git a/src/main/resources/assets/merequester/textures/block/requester_active.png.mcmeta b/src/main/resources/assets/merequester/textures/block/requester_active.png.mcmeta index 7f0a250..4b95437 100644 --- a/src/main/resources/assets/merequester/textures/block/requester_active.png.mcmeta +++ b/src/main/resources/assets/merequester/textures/block/requester_active.png.mcmeta @@ -1,6 +1,6 @@ { - "animation": { - "interpolate": true, - "frametime": 6 - } + "animation": { + "interpolate": true, + "frametime": 6 + } } diff --git a/src/main/resources/merequester.mixins.json b/src/main/resources/merequester.mixins.json index 976790c..650e438 100644 --- a/src/main/resources/merequester.mixins.json +++ b/src/main/resources/merequester.mixins.json @@ -3,20 +3,13 @@ "minVersion": "0.8.5", "package": "com.almostreliable.merequester.mixin", "compatibilityLevel": "JAVA_17", - "plugin": "com.almostreliable.merequester.mixin.AlmostMixinPlugin", "mixins": [ - "registration.AEBlockEntitiesMixin", - "registration.AEBlocksMixin", - "registration.AEItemsMixin", - "registration.AEPartsMixin", "registration.InitMenuTypesMixin" ], "client": [ "accessors.EditBoxMixin", "accessors.SlotMixin", "accessors.WidgetContainerMixin", - "compat.JEIItemSlotTargetMixin", - "compat.REIItemSlotTargetMixin", "registration.InitScreensMixin" ], "injectors": { diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index 3abff23..fb944f2 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { "description": "${modName} resources", - "pack_format": 9 + "pack_format": 22 } }