diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index f811f6ae6..000000000 --- a/.gitattributes +++ /dev/null @@ -1,5 +0,0 @@ -# Disable autocrlf on generated files, they always generate with LF -# Add any extra files or paths here to make git stop saying they -# are changed when only line endings change. -src/generated/**/.cache/cache text eol=lf -src/generated/**/*.json text eol=lf diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml deleted file mode 100644 index 720fd0c48..000000000 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Bug Report -description: 提交错误报告 -title: "Bug: " -labels: - - bug -body: - - type: textarea - attributes: - label: Describe the bug - description: 请简明地表述 bug 是什么。Please briefly describe what the bug is. - validations: - required: true - - type: textarea - attributes: - label: Steps to reproduce - description: 请描述如何重现这个行为。 Please describe how to reproduce the bug. - validations: - required: true - - type: textarea - attributes: - label: Expected behavior - description: 请描述期望的行为。 Please describe the expected behavior. - validations: - required: true - - type: textarea - attributes: - label: Logs - description: | - 请使用 Github Gist/Pastebin 等工具将完整日志上传后复制于此,请勿直接粘贴日志或截图。为了方便后人存档,请不要使用 PrivateBin 等有时效性的日志。请检查自己上传的日志中是否包含重要登录凭据(如Token等) - Please upload the complete logs using GitHub Gist, Pastebin, or a similar service, then paste the link here. Do not paste the logs directly or upload screenshots. For long-term reference, please avoid using time-limited services such as PrivateBin. Also, make sure to check that the uploaded logs do not contain sensitive credentials (such as tokens, etc.). - value: 再次强调,请注意 ** 不要上传自己的个人凭据 ** (如Token等) !! DO NOT UPLOAD YOUR SENSETIVE CREDENTIAL !! - - type: textarea - attributes: - label: Versions - description: 请填写相应的版本号。 Enter The versions. - value: | - - OS: - - Java Version: - - Minecraft Version: - - LDLib Version: - validations: - required: true - - type: textarea - attributes: - label: Screenshots - description: 请尽量详细地提供相关截图。(如有) Please provide screenshots as more as possible. - - type: textarea - attributes: - label: Additional context - description: 请描述其他想要补充的信息。 Describe other additional context. diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml deleted file mode 100644 index 64c37ed87..000000000 --- a/.github/ISSUE_TEMPLATE/feature.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Feature Request -description: 提交功能请求 -title: "Feature: " -labels: - - feature -body: - - type: textarea - attributes: - label: Describe the problem related to the feature request - description: | - 请简要地说明是什么问题导致你想要一个新特性。 - Please briefly explain what issue led you to want a new feature. - validations: - required: true - - type: textarea - attributes: - label: Describe the solution you'd like - description: 请说明你希望使用什么样的方法 (比如增加什么功能) 解决上述问题。 - - validations: - required: true - - type: textarea - attributes: - label: Describe alternatives you've considered - description: 除了上述方法以外,你还考虑过哪些其他的实现方式? - - type: textarea - attributes: - label: Additional context - description: 请描述其他想要补充的信息。 \ No newline at end of file diff --git a/.github/workflows/auto-build-publish-release.yml b/.github/workflows/auto-build-publish-release.yml deleted file mode 100644 index 135da0386..000000000 --- a/.github/workflows/auto-build-publish-release.yml +++ /dev/null @@ -1,323 +0,0 @@ -name: Auto Build, Publish, Releasing - -on: - workflow_dispatch: - inputs: - publishMaven: - description: 'Whether to publish to Maven' - required: true - type: boolean - default: true - publishCurseForgeAndModrinth: - description: 'Whether to publish to CurseForge and Modrinth' - required: true - type: boolean - default: true - versionType: - description: 'Version type' - required: true - type: choice - options: - - 'alpha' - - 'beta' - - 'release' - default: 'alpha' - dryRun: - description: 'Dry run (build only, no publishing)' - required: false - type: boolean - default: false - -env: - JAVA_VERSION: '21' - JAVA_DISTRIBUTION: 'temurin' - -jobs: - validate: - name: Validate & Pre-checks - runs-on: ubuntu-latest - outputs: - version: ${{ steps.version.outputs.version }} - should-publish: ${{ steps.check.outputs.should-publish }} - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - fetch-tags: true - - - name: Set up JDK - uses: actions/setup-java@v4 - with: - java-version: ${{ env.JAVA_VERSION }} - distribution: ${{ env.JAVA_DISTRIBUTION }} - - - name: Validate Gradle wrapper - uses: gradle/actions/wrapper-validation@v4 - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 - with: - cache-read-only: false - - - name: Grant execute permission - run: chmod +x gradlew - - - name: Get version from gradle.properties - id: version - run: | - if [ -f "gradle.properties" ]; then - VERSION=$(grep -E "^mod_version\s*=" gradle.properties | cut -d'=' -f2 | tr -d ' ') - if [ -z "$VERSION" ]; then - echo "❌ Could not find mod_version in gradle.properties" - exit 1 - fi - echo "version=$VERSION" >> $GITHUB_OUTPUT - echo "Project version: $VERSION" - else - echo "❌ gradle.properties not found, falling back to Gradle command" - VERSION=$(./gradlew -q printVersion) - echo "version=$VERSION" >> $GITHUB_OUTPUT - echo "Project version: $VERSION" - fi - - - name: Check publish conditions - id: check - run: | - SHOULD_PUBLISH="false" - if [[ "${{ inputs.dryRun }}" == "false" && ("${{ inputs.publishMaven }}" == "true" || "${{ inputs.publishCurseForgeAndModrinth }}" == "true") ]]; then - SHOULD_PUBLISH="true" - fi - echo "should-publish=$SHOULD_PUBLISH" >> $GITHUB_OUTPUT - echo "Should publish: $SHOULD_PUBLISH" - - build: - name: Build & Test - runs-on: ubuntu-latest - needs: validate - strategy: - matrix: - include: - - name: "Main Build" - gradle-tasks: "build test runGameTestServer" - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 1000 - fetch-tags: true - - - name: Set up JDK - uses: actions/setup-java@v4 - with: - java-version: ${{ env.JAVA_VERSION }} - distribution: ${{ env.JAVA_DISTRIBUTION }} - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 - with: - cache-read-only: false - - - name: Grant execute permission - run: chmod +x gradlew - - - name: Build and test - run: ./gradlew ${{ matrix.gradle-tasks }} --stacktrace --info --parallel - env: - GRADLE_OPTS: "-Dorg.gradle.daemon=true -Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true" - - - name: Upload build artifacts - uses: actions/upload-artifact@v4 - if: always() - with: - name: build-artifacts-${{ matrix.name }} - path: | - build/libs/ - build/reports/ - retention-days: 7 - - - name: Upload test results - uses: actions/upload-artifact@v4 - if: always() - with: - name: test-results-${{ matrix.name }} - path: build/test-results/ - retention-days: 7 - - publish-maven: - name: Publish to Maven - runs-on: ubuntu-latest - needs: [validate, build] - if: ${{ needs.validate.outputs.should-publish == 'true' && inputs.publishMaven }} - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 1000 - fetch-tags: true - - - name: Set up JDK - uses: actions/setup-java@v4 - with: - java-version: ${{ env.JAVA_VERSION }} - distribution: ${{ env.JAVA_DISTRIBUTION }} - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 - with: - cache-read-only: true - - - name: Grant execute permission - run: chmod +x gradlew - - - name: Publish to Maven - run: ./gradlew publish --stacktrace - env: - MAVEN_PASS: ${{ secrets.MAVEN_PASS }} - MAVEN_USER: ${{ secrets.MAVEN_USER }} - GRADLE_OPTS: "-Dorg.gradle.daemon=true" - - - name: Maven publish summary - run: | - echo "## Maven Publish Summary" >> $GITHUB_STEP_SUMMARY - echo "- Version: ${{ needs.validate.outputs.version }}" >> $GITHUB_STEP_SUMMARY - echo "- Status: ✅ Published successfully" >> $GITHUB_STEP_SUMMARY - - publish-platforms: - name: Publish to CurseForge & Modrinth - runs-on: ubuntu-latest - needs: [validate, build] - if: ${{ needs.validate.outputs.should-publish == 'true' && inputs.publishCurseForgeAndModrinth }} - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 1000 - fetch-tags: true - - - name: Download build artifacts - uses: actions/download-artifact@v4 - with: - name: build-artifacts-Main Build - path: build/ - - - name: Verify build artifacts - run: | - if [ ! -d "build/libs" ] || [ -z "$(ls -A build/libs)" ]; then - echo "❌ Build artifacts not found!" - echo "Available files in build/:" - find build/ -type f -name "*.jar" || echo "No JAR files found" - exit 1 - fi - echo "✅ Build artifacts verified:" - ls -la build/libs/ - - - name: Publish to CurseForge and Modrinth - uses: Kir-Antipov/mc-publish@v3.3 - with: - modrinth-id: B1CBVXHX - modrinth-token: ${{ secrets.MODRINTH_TOKEN }} - - curseforge-id: 626676 - curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} - - files: | - build/libs/*-@(all).jar - build/libs/!(*-@(all|dev|sources|javadoc|dev-shadow)).jar - build/libs/*-@(sources).jar - - name: LDLib2-${{ needs.validate.outputs.version }}-neoforge - version: mc1.21.1-${{ needs.validate.outputs.version }}-neoforge - version-type: ${{ inputs.versionType }} - changelog-file: CHANGELOG.* - - loaders: | - neoforge - game-versions: | - ${{ github.ref_name }} - 1.21.1 - game-version-filter: none - java: | - 21 - retry-attempts: 3 - retry-delay: 10000 - fail-mode: fail - - - name: Platform publish summary - run: | - echo "## Platform Publish Summary" >> $GITHUB_STEP_SUMMARY - echo "- Version: ${{ needs.validate.outputs.version }}" >> $GITHUB_STEP_SUMMARY - echo "- Version Type: ${{ inputs.versionType }}" >> $GITHUB_STEP_SUMMARY - echo "- Platforms: CurseForge & Modrinth" >> $GITHUB_STEP_SUMMARY - echo "- Status: ✅ Published successfully" >> $GITHUB_STEP_SUMMARY - - summary: - name: Build & Publish Summary - runs-on: ubuntu-latest - needs: [validate, build, publish-maven, publish-platforms] - if: always() - steps: - - name: Generate final summary - run: | - echo "# 🚀 Build & Publish Results" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## 📋 Configuration" >> $GITHUB_STEP_SUMMARY - echo "- **Version**: ${{ needs.validate.outputs.version }}" >> $GITHUB_STEP_SUMMARY - echo "- **Version Type**: ${{ inputs.versionType }}" >> $GITHUB_STEP_SUMMARY - echo "- **Dry Run**: ${{ inputs.dryRun }}" >> $GITHUB_STEP_SUMMARY - echo "- **Maven Publish**: ${{ inputs.publishMaven }}" >> $GITHUB_STEP_SUMMARY - echo "- **Platform Publish**: ${{ inputs.publishCurseForgeAndModrinth }}" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## 📊 Job Results" >> $GITHUB_STEP_SUMMARY - - VALIDATE_STATUS="${{ needs.validate.result }}" - BUILD_STATUS="${{ needs.build.result }}" - MAVEN_STATUS="${{ needs.publish-maven.result }}" - PLATFORM_STATUS="${{ needs.publish-platforms.result }}" - - echo "- **Validation**: $([ "$VALIDATE_STATUS" == "success" ] && echo "✅ Success" || echo "❌ $VALIDATE_STATUS")" >> $GITHUB_STEP_SUMMARY - echo "- **Build**: $([ "$BUILD_STATUS" == "success" ] && echo "✅ Success" || echo "❌ $BUILD_STATUS")" >> $GITHUB_STEP_SUMMARY - - if [[ "${{ inputs.publishMaven }}" == "true" && "${{ inputs.dryRun }}" == "false" ]]; then - echo "- **Maven Publish**: $([ "$MAVEN_STATUS" == "success" ] && echo "✅ Success" || echo "❌ $MAVEN_STATUS")" >> $GITHUB_STEP_SUMMARY - fi - - if [[ "${{ inputs.publishCurseForgeAndModrinth }}" == "true" && "${{ inputs.dryRun }}" == "false" ]]; then - echo "- **Platform Publish**: $([ "$PLATFORM_STATUS" == "success" ] && echo "✅ Success" || echo "❌ $PLATFORM_STATUS")" >> $GITHUB_STEP_SUMMARY - fi - - if [[ "$BUILD_STATUS" == "success" ]]; then - if [[ "${{ inputs.dryRun }}" == "true" ]]; then - echo "" >> $GITHUB_STEP_SUMMARY - echo "## 🔍 Dry Run Completed" >> $GITHUB_STEP_SUMMARY - echo "Build completed successfully. No publishing was performed." >> $GITHUB_STEP_SUMMARY - else - echo "" >> $GITHUB_STEP_SUMMARY - echo "## 🎉 All Operations Completed Successfully!" >> $GITHUB_STEP_SUMMARY - fi - else - echo "" >> $GITHUB_STEP_SUMMARY - echo "## ❌ Some Operations Failed" >> $GITHUB_STEP_SUMMARY - echo "Please check the job logs for details." >> $GITHUB_STEP_SUMMARY - fi - - - name: Check overall status - run: | - if [[ "${{ needs.build.result }}" != "success" ]]; then - echo "Build failed, marking workflow as failed" - exit 1 - fi - - if [[ "${{ inputs.dryRun }}" == "false" ]]; then - if [[ "${{ inputs.publishMaven }}" == "true" && "${{ needs.publish-maven.result }}" != "success" ]]; then - echo "Maven publish failed, marking workflow as failed" - exit 1 - fi - - if [[ "${{ inputs.publishCurseForgeAndModrinth }}" == "true" && "${{ needs.publish-platforms.result }}" != "success" ]]; then - echo "Platform publish failed, marking workflow as failed" - exit 1 - fi - fi - - echo "All requested operations completed successfully!" \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..0b7913d93 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,100 @@ +name: Build & Release Mod + +on: + push: + branches: + - main + pull_request: + workflow_dispatch: + +jobs: + build: + strategy: + matrix: + java: [21] + runs-on: ubuntu-22.04 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup JDK ${{ matrix.java }} + uses: actions/setup-java@v4 + with: + java-version: ${{ matrix.java }} + distribution: 'temurin' + + - name: Make gradle executable + run: chmod +x ./gradlew + + - name: Build + run: ./gradlew build + + - name: Upload artifacts + if: ${{ matrix.java == '21' }} + uses: actions/upload-artifact@v4 + with: + name: Artifacts + path: build/libs/*.jar + + release: + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + needs: build + permissions: + contents: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 + + - name: Version bump + run: | + VERSION=$(grep 'mod_version' gradle.properties | cut -d'=' -f2) + echo "Current version: $VERSION" + + if [[ $VERSION == *.* ]]; then + MAJOR=$(echo $VERSION | cut -d'.' -f1) + MINOR=$(echo $VERSION | cut -d'.' -f2) + NEW_MINOR=$((MINOR + 1)) + NEW_VERSION="${MAJOR}.${NEW_MINOR}" + else + NEW_VERSION=$((VERSION + 1)) + fi + + echo "New version: $NEW_VERSION" + sed -i "s/mod_version=$VERSION/mod_version=$NEW_VERSION/" gradle.properties + echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV + + - name: Commit and Push new version + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git add gradle.properties + git diff --quiet && git diff --staged --quiet || git commit -m "chore: bump version to ${{ env.NEW_VERSION }}" + git push origin main + + - name: Build with Gradle + run: | + chmod +x gradlew + ./gradlew build + + - name: Create Release + uses: softprops/action-gh-release@v2 + with: + tag_name: "v${{ env.NEW_VERSION }}" + name: "Release ${{ env.NEW_VERSION }}" + files: build/libs/*.jar + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..e0e6da62d --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,100 @@ +name: Build & Release Mod + +on: + push: + branches: + - fabric-1.21.1 + pull_request: + workflow_dispatch: + +jobs: + build: + strategy: + matrix: + java: [21] + runs-on: ubuntu-22.04 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup JDK ${{ matrix.java }} + uses: actions/setup-java@v4 + with: + java-version: ${{ matrix.java }} + distribution: 'temurin' + + - name: Make gradle executable + run: chmod +x ./gradlew + + - name: Build + run: ./gradlew build + + - name: Upload artifacts + if: ${{ matrix.java == '21' }} + uses: actions/upload-artifact@v4 + with: + name: Artifacts + path: build/libs/*.jar + + release: + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/fabric-1.21.1' + runs-on: ubuntu-latest + needs: build + permissions: + contents: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 + + - name: Version bump + run: | + VERSION=$(grep 'mod_version' gradle.properties | cut -d'=' -f2) + echo "Current version: $VERSION" + + if [[ $VERSION == *.* ]]; then + MAJOR=$(echo $VERSION | cut -d'.' -f1) + MINOR=$(echo $VERSION | cut -d'.' -f2) + NEW_MINOR=$((MINOR + 1)) + NEW_VERSION="${MAJOR}.${NEW_MINOR}" + else + NEW_VERSION=$((VERSION + 1)) + fi + + echo "New version: $NEW_VERSION" + sed -i "s/mod_version=$VERSION/mod_version=$NEW_VERSION/" gradle.properties + echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV + + - name: Commit and Push new version + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git add gradle.properties + git diff --quiet && git diff --staged --quiet || git commit -m "chore: bump version to ${{ env.NEW_VERSION }}" + git push origin HEAD + + - name: Build with Gradle + run: | + chmod +x gradlew + ./gradlew build + + - name: Create Release + uses: softprops/action-gh-release@v2 + with: + tag_name: "v${{ env.NEW_VERSION }}" + name: "Release ${{ env.NEW_VERSION }}" + files: build/libs/*.jar + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 9fe3c578e..553ba1375 100644 --- a/.gitignore +++ b/.gitignore @@ -1,36 +1,16 @@ -# eclipse -bin -*.launch -.settings -.metadata -.classpath -.project +# Gradle +.gradle/ +build/ +.kotlin/ -# idea -out -*.ipr -*.iws +# IDE +.idea/ *.iml -.idea -# gradle -build -.gradle +# Run configs +run/ +bin/ -# other -eclipse -run -runs -run-data - -repo - -*.DS_Store -*.log -/.claude -CLAUDE.md -/logs -.narrafork/ -/docs -/.codex -/.gradle-user-home +# OS +.DS_Store +Thumbs.db \ No newline at end of file diff --git a/.mcp.json b/.mcp.json deleted file mode 100644 index 84a6c673d..000000000 --- a/.mcp.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "mcpServers": { - "moddevmcp": { - "command": "C:\\Users\\yefan\\.jdks\\jbr-21.0.7\\bin\\java.exe", - "args": [ - "-Dmoddevmcp.host=127.0.0.1", - "-Dmoddevmcp.port=47653", - "-Dmoddevmcp.mcpPort=47654", - "-Dmoddevmcp.backend.javaCommand=C:\\Users\\yefan\\.jdks\\jbr-21.0.7\\bin\\java.exe", - "-Dmoddevmcp.backend.argsFile=C:\\Projects\\LDLib2-1.21\\build\\moddevmcp\\mcp-clients\\mcp-backend-java.args", - "-Dmoddevmcp.backend.launcher=C:\\Projects\\LDLib2-1.21\\build\\moddevmcp\\mcp-clients\\run-mcp-backend.bat", - "-Dmoddevmcp.backend.startTimeoutMs=60000", - "@C:\\Projects\\LDLib2-1.21\\build\\moddevmcp\\mcp-clients\\mcp-gateway-java.args" - ] - } - } -} diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 4f84c0ba0..000000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,7 +0,0 @@ -## v2.2.5 -* Fixed HUD overlay default size -* Improved transform2d to support percent -* Added VanillaSpriteTexture -* Improved Graph Toolkit - - diff --git a/CHANGELOGS.md b/CHANGELOGS.md deleted file mode 100644 index 58f3660ea..000000000 --- a/CHANGELOGS.md +++ /dev/null @@ -1,162 +0,0 @@ -# ChangeLogs -## v2.2.5 -* Fixed HUD overlay default size -* Improved transform2d to support percent -* Added VanillaSpriteTexture -* Improved Graph Toolkit - -## v2.2.4.a -* Fixed Dummyworld RegistryAccess for EMI async Thread loading - -## v2.2.4 -* Fixed animation issue -* Added animation dsl support - -## v2.2.3 -* Improved xei supports for item/fluid slot -* Improved configurator for resources -* Improved dsl for data binding -* Fixed IManagedObjectAccessor crash -* Fixed style system bugs: broken selector, mutable EMPTY stylesheet -* Added local stylesheet support -* Improved stylesheet resolve performance -* Added new property: `Color` to control self tinted color -* Added sugar syntax for using builtin class in stylesheets(lss) - * all `__xxx__` can be checked like `:xxx` in lss, similar to the css syntax. - * for example: `:hover` ==> `.__hovered__` -* Improved UI Debugger to with two more feature tabs: `computed` and `local lss` - -## v2.2.2 -* better xml support -* fixed progress bar direction -* fix kjs unable to register ui events in the startup script -* graph toolkit improvement - -## v2.2.1.a -* Fixed xei compat crash on the server - -## v2.2.1 -* Fix Editor Resource List Mode - -## v2.2.0 -* Fix unable to access `assets/` resources on the server side -* Replace `Yoga` Layout with `Taffy` Layout - * all yoga apis are kept, will be removed since `26.1` - * `Taffy` is a better layout engine, it is as efficient as `Yoga`, and support more features (e.g. `grid` layout). -* `Node Graph Toolkit` Incubation (https://youtu.be/A7WXmbkIVRo) - * we implemented the basic features of the node graph toolkit by following the unity GT 0.4.exp - * it is still under incubation, so the api may change in the future, besides, the editor is not fully supported yet - * it will be available soon -* Added the `UI Debugger` (F3) to support advanced UI debugging similar to the browser inspector -* Integrated Kotlin STD Library, DSL for UI creation - * DSL for UI creation, layout, style, event, rpc, binding, etc. Enjoy kotlin sugar!! - * we added Kotlin STD as a dependency. it doesn't means the ldlib2 will be written in kotlin. the core framework is still written in Java. - * we plan to gradually migrate the application of UI to Kotlin DSL in the future. (e.g. Graph Toolkit), builtin standard UI Components will still be written in Java. -* Added `HUD(Layer)` supports to display ldlib2 UI as an HUD layer. - -## v2.1.9 -* Improved ItemSlot API (Thanks @DancingSnow0517) -* Added TagKey + EntityType search configurator -* Fixed scene delta drag to respect the transform - -## v2.1.8.a -* Fixed xei drag mouse normal transform - -## v2.1.8 -* Added Stream (also StreamCodec) support for PersistedParser -* Added flatten parameter for PersistedParser -* Added @ConditionalSynced - -## v2.1.7.b -* Fixed EMI compat issue - -## v2.1.7.a -* Added parallel style updates -* Fixed id deserialization - -## v2.1.7 -* Improved performance a lot: - * batch rendering - * batch style updates - * rendering cull -* Improve animation API -* Added QoL features -* Refactor mouse events to respect the transform -* Fixed some minor bugs - -## v2.1.6 -* Fixed codec bug for enhancement -* Fixed vanilla-like slot interaction conditions - -## v2.1.6.a -* Fixed file resource path parser - -## v2.1.5.a -* fixed writing direct var of a CollectionAccessor - -## v2.1.5 -* avoid using frozon registry if the provider is accessible -* better binding strategy -* better file resource parser -* change license to LGPLv3 - -## v2.1.4 -* Added more ui examples -* Added UI xml support -* Shader refactor -* Fixed the inventory slot bug -* Fixed resource provider location - -## v2.1.3 -* Fixed TransformGizmo rotation behavior -* Added game tests -* UI features: - * Added overflow clip - * Added opacity - * Added `:not()` for stylesheet - * Added Transition / Animation - * Refactor `IGUITexture` APIs - * Minor fixes - -## v2.1.2.a (hotfix) -* Fixed Creative Mode Tab crash for production - -## v2.1.2 (hotfix) -* Fixed Infinite Loop while loading texture resources - -## v2.1.1 -* Fixed FrozenRegistryAccess lacks of client-side only RegistryAccess -* Removed test code -* Added KeyBindings for Editor (Thanks @hi4444) - -## v2.1.0 (beta release) -* Refactor UI System - * modern UI layout system - * modern UI event system - * data binding system (support data synchronization and rpc event between server <-> remote) - * stylesheet system - * massive plug-and-play components - * in-game UI visual editor - * kjs support - * completed document and usage examples -* Remove outdated system - * widget ui - * compass - * node graph -* Many bug fixes -* Many new features and qol -* Documents and examples -* Test code - -## v2.0.4 -* UI Sync Framework -* Fixed fallback pack resource loading - -## v2.0.2 -* Move file assets from the `assets` to the `ldlib2` folder -* Fixed cross-OS platform file separator char - -## v2.0.1 -Added DrawEdges method -Updated Mesh texture -Capture plugin crash diff --git a/LICENSE b/LICENSE.txt similarity index 99% rename from LICENSE rename to LICENSE.txt index 293def611..99832da99 100644 --- a/LICENSE +++ b/LICENSE.txt @@ -53,4 +53,4 @@ The Free Software Foundation may publish revised and/or new versions of the GNU Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. -If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. +If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 349e76a0e..000000000 --- a/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# LDLib2 -LDLib2 is a complete rewrite of the original LDLib, redesigned from the ground up to support modern versions of Minecraft. -It provides advanced, high-level solutions across many areas of mod development, significantly reducing development complexity and long-term maintenance cost. - -LDLib2 features a large, well-structured codebase that offers robust infrastructure for UI systems, shader, model rendering, data synchronization and persistence, and in-game visual editors, enabling developers to build complex systems more efficiently. - -[Join our Discord](https://discord.com/invite/sDdf2yD9bh) - -[LDLib2 Repository](https://github.com/Low-Drag-MC/LDLib2) - -[Wiki](https://low-drag-mc.github.io/LowDragMC-Doc/ldlib2/) - ---- - -## 💡 Key Differences from [LDLib](https://github.com/Low-Drag-MC/LDLib-MultiLoader) -* Fully redesigned architecture - All core systems have been rewritten to align with the internal structure of modern Minecraft versions, resulting in cleaner and more reliable code. -* Comprehensive documentation - LDLib2 includes detailed documentation, comments, and example code, addressing LDLib’s long-standing issues of unclear and difficult-to-read implementations. -* Removal of legacy systems - Many outdated or unused frameworks have been removed, making LDLib2 more lightweight and easier to maintain. -* Improved mod compatibility - Provides more stable and stable integration for mainstream mods such as JEI, KubeJS, and EMI, etc. - \ No newline at end of file diff --git a/build.gradle b/build.gradle index 9ea221279..051d97fb2 100644 --- a/build.gradle +++ b/build.gradle @@ -1,88 +1,35 @@ plugins { - id 'java-library' - id 'eclipse' - id 'idea' + id 'fabric-loom' version '1.15-SNAPSHOT' id 'maven-publish' - id 'net.neoforged.gradle.userdev' version '7.0.181' id 'org.jetbrains.kotlin.jvm' version '2.1.20' id 'org.jetbrains.kotlin.plugin.lombok' version '2.1.20' id 'io.freefair.lombok' version "9.2.0" } -version = mod_version -group = maven_group +version = project.mod_version +group = project.maven_group -// Enable the Jar-in-Jar system for your mod -jarJar.enable() - -configurations { - libraries - api.extendsFrom libraries - - localImplementation - runtimeClasspath.extendsFrom localImplementation - compileOnly.extendsFrom localImplementation +base { + archivesName = project.archives_base_name } + repositories { mavenCentral() mavenLocal() - maven { url = "https://maven.shedaniel.me/" } // Cloth Config, REI - maven { - name = "Modrinth" - url = "https://api.modrinth.com/maven" - content { - includeGroup "maven.modrinth" - } - } // Modrinth File - maven { - // location of the maven that hosts JEI files since January 2023 - name = "Jared's maven" - url = "https://maven.blamejared.com/" - } - maven { - // location of a maven mirror for JEI files, as a fallback - name = "ModMaven" - url = "https://modmaven.dev" - } maven { url = "https://maven.parchmentmc.org" } // Parchment mappings maven { url = "https://maven.quiltmc.org/repository/release" } // Quilt Mappings maven { // Flywheel url = "https://maven.tterrag.com/" content { - // need to be specific here due to version overlaps includeGroup("com.jozufozu.flywheel") } } - // mavens for Forge-exclusives - maven { url = "https://maven.theillusivec4.top/" } // Curios - maven { url = "https://maven.terraformersmc.com/releases/" } // Mod Menu, EMI - maven { // Create Forge and Registrate Forge - url = "https://maven.tterrag.com/" - content { - includeGroup("com.tterrag.registrate") - includeGroup("com.simibubi.create") - } - } - maven { url = "https://jitpack.io/" } // Mixin Extras, Fabric ASM - maven { - // saps.dev Maven (KubeJS and Rhino) - url "https://maven.latvian.dev/releases" - content { - includeGroup "dev.latvian.mods" - includeGroup "dev.latvian.apps" - } - } -} - -base { - archivesName = "${project.name}-${minecraft_version}" -} + maven { url = "https://jitpack.io/" } // Mixin Extras -// Mojang ships Java 21 to end users in 1.20.5+, so your mod should target Java 21. -java { - toolchain.languageVersion = JavaLanguageVersion.of(21) - withSourcesJar() + maven { + url "https://cursemaven.com" + } } kotlin { @@ -93,174 +40,110 @@ kotlin { } } -minecraft.accessTransformers.file rootProject.file('src/main/resources/META-INF/accesstransformer.cfg') - -// Default run configurations. -// These can be tweaked, removed, or duplicated as needed. -runs { - // applies to all the run configs below - configureEach { - // Recommended logging data for a userdev environment - // The markers can be added/remove as needed separated by commas. - // "SCAN": For mods scan. - // "REGISTRIES": For firing of registry events. - // "REGISTRYDUMP": For getting the contents of all registries. - systemProperty 'forge.logging.markers', 'REGISTRIES' - - // Recommended logging level for the console - // You can set various levels here. - // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels - systemProperty 'forge.logging.console.level', 'debug' - - modSource project.sourceSets.main - - dependencies { - runtime project.configurations.libraries - } - } - - client { - // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. - systemProperty 'forge.enabledGameTestNamespaces', project.mod_id - } - - server { - systemProperty 'forge.enabledGameTestNamespaces', project.mod_id - programArgument '--nogui' - } - - // This run config launches GameTestServer and runs all registered gametests, then exits. - // By default, the server will crash when no gametests are provided. - // The gametest system is also enabled by default for other run configs under the /test command. - gameTestServer { - systemProperty 'forge.enabledGameTestNamespaces', project.mod_id - } - - data { - // example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it - // workingDirectory project.file('run-data') - - // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. - programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() - } +loom { + accessWidenerPath = file("src/main/resources/ldlib2.accesswidener") } -// Include resources generated by data generators. -sourceSets.main.resources { srcDir 'src/generated/resources' } -sourceSets.main.kotlin { srcDir("src/main/java") } - dependencies { - implementation "net.neoforged:neoforge:${neo_version}" - libraries("org.jetbrains.kotlin:kotlin-stdlib:${kotlin_stdlib_version}") { + // Fabric toolchain + minecraft "com.mojang:minecraft:${minecraft_version}" + mappings loom.officialMojangMappings() + modImplementation "net.fabricmc:fabric-loader:${loader_version}" + modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_version}" + modImplementation("net.fabricmc:fabric-language-kotlin:1.13.4+kotlin.2.2.0") + + implementation("org.jetbrains.kotlin:kotlin-stdlib:${kotlin_stdlib_version}") { exclude group: "org.jetbrains", module: "annotations" } - jarJar(group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib', version: "[${kotlin_stdlib_version},)") - - // JEI - compileOnly("mezz.jei:jei-${minecraft_version}-common-api:${jei_version}") { transitive = false } - compileOnly("mezz.jei:jei-${minecraft_version}-neoforge-api:${jei_version}") { transitive = false } - localImplementation("mezz.jei:jei-${minecraft_version}-neoforge:${jei_version}") - - // REI - compileOnly("me.shedaniel:RoughlyEnoughItems-default-plugin-neoforge:${rei_version}") - compileOnly("me.shedaniel:RoughlyEnoughItems-api-neoforge:${rei_version}") - compileOnly("me.shedaniel:RoughlyEnoughItems-neoforge:${rei_version}") - // EMI - compileOnly("dev.emi:emi-neoforge:${emi_version}:api") - compileOnly("dev.emi:emi-neoforge:${emi_version}") - - // AE2 - localImplementation("org.appliedenergistics:appliedenergistics2:${ae2_version}") - - // KJS - localImplementation("dev.latvian.mods:kubejs-neoforge:${kjs_version}") { - exclude(group: "dev.architectury") - } - - // Iris - localImplementation("maven.modrinth:sodium:${sodium_version}") - localImplementation("maven.modrinth:iris:${iris_version}") - - // lombok -// compileOnly 'org.projectlombok:lombok:1.18.30' -// annotationProcessor 'org.projectlombok:lombok:1.18.30' - - // Yoga - libraries("org.appliedenergistics.yoga:yoga:${yoga_version}") - jarJar(group: 'org.appliedenergistics.yoga', name: 'yoga', version: "[${yoga_version},)") + // Yoga layout engine + implementation "org.appliedenergistics.yoga:yoga:${yoga_version}" + include(group: 'org.appliedenergistics.yoga', name: 'yoga', version: "${yoga_version}") // Taffy - libraries("dev.vfyjxf:taffy:${taffy_version}") - jarJar(group: 'dev.vfyjxf', name: 'taffy', version: "[${taffy_version},)") + implementation "dev.vfyjxf:taffy:${taffy_version}" + include(group: 'dev.vfyjxf', name: 'taffy', version: "${taffy_version}") // JUnit 5 + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.0' testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.0' + modImplementation "curse.maven:architectury-api-419699:5786326" + // mock testImplementation 'org.mockito:mockito-core:5.5.0' testImplementation 'org.mockito:mockito-junit-jupiter:5.5.0' - // moddevmcp -// localImplementation("dev.vfyjxf:moddevmcp:${moddevmcp_version}") { transitive = false } + // JSR305 annotations + compileOnly "com.google.code.findbugs:jsr305:3.0.2" } -tasks.withType(ProcessResources).configureEach { - // set up properties for filling into metadata - var replaceProperties = [ - "mod_id": mod_id, - "version": version, - "loader_version": loader_version, - "forge_version": neo_version.split("\\.")[0], // only specify major version of forge - "minecraft_version": minecraft_version, - "mod_license": mod_license, - "mod_name": mod_name, - "mod_description": mod_description, - "mod_url": mod_url - ] - inputs.properties replaceProperties - - filesMatching(['META-INF/neoforge.mods.toml']) { - expand replaceProperties + [project: project] +processResources { + inputs.property "version", project.version + inputs.property "minecraft_version", project.minecraft_version + inputs.property "loader_version", project.loader_version + filteringCharset "UTF-8" + + filesMatching("fabric.mod.json") { + expand "version": project.version, + "minecraft_version": project.minecraft_version, + "loader_version": project.loader_version, + "mod_id": project.mod_id, + "mod_name": project.mod_name, + "mod_description": project.mod_description, + "mod_url": project.mod_url, + "mod_license": project.mod_license } } -test { - useJUnitPlatform() - testLogging { - events "passed", "skipped", "failed" - exceptionFormat "full" - showStandardStreams = false +def targetJavaVersion = 21 +tasks.withType(JavaCompile).configureEach { + // ensure that the encoding is set to UTF-8, no matter what the system default is + // this fixes some edge cases with special characters not displaying correctly + // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html + // If Javadoc is generated, this must be specified in that task too. + it.options.encoding = "UTF-8" + if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) { + it.options.release.set(targetJavaVersion) } } -// Configure the 'jarJar' task -// 'all' is the default classifier -tasks.named('jarJar') { - // ... +java { + def javaVersion = JavaVersion.toVersion(targetJavaVersion) + if (JavaVersion.current() < javaVersion) { + toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion) + } + // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task + // if it is present. + // If you remove this line, sources will not be generated. + withSourcesJar() } -tasks.register("printVersion") { - println(mod_version) +jar { + from("LICENSE") { + rename { "${it}_${project.archives_base_name}" } + } } -// Example configuration to allow publishing using the maven-publish plugin +// configure the maven publication publishing { publications { - register('mavenJava', MavenPublication) { - artifactId = archivesBaseName + create("mavenJava", MavenPublication) { + artifactId = project.archives_base_name from components.java } } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. repositories { - maven { - url "https://maven.firstdark.dev/snapshots" - credentials { - username System.getenv("MAVEN_USER") - password System.getenv("MAVEN_PASS") - } - } + // Add repositories to publish to here. + // Notice: This block does NOT have the same function as the block in the top level. + // The repositories here will be used for publishing your artifact, not for + // retrieving dependencies. } } +test { + enabled = false +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index c49de769d..b65bbdaab 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,46 +1,24 @@ -# Sets default memory used for gradle commands. Can be overridden by user or command line properties. -#org.gradle.jvmargs= -org.gradle.daemon=false -org.gradle.debug=false -org.gradle.jvmargs=-Xmx6G -# Mod Info -mod_id=ldlib2 -mod_name=LowDragLib2 -mod_version=2.2.5 -mod_description=Low Drag Lib2, a library for rendering, gui, particles, synchronize -mod_license=LGPL-3.0 license -mod_url=https://github.com/Low-Drag-MC/LDLib2 -maven_group=com.lowdragmc.ldlib2 +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G +# Fabric Properties +# check these on https://modmuss50.me/fabric.html minecraft_version=1.21.1 -minecraft_version_old=1.21 -loader_version=2 -# Mappings -# https://lambdaurora.dev/tools/import_quilt.html -qm_version=5 -#read more on this at https://github.com/neoforged/NeoGradle/blob/NG_7.0/README.md#apply-parchment-mappings -# you can also find the latest versions at: https://parchmentmc.org/docs/getting-started -neogradle.subsystems.parchment.minecraftVersion=1.21.1 -neogradle.subsystems.parchment.mappingsVersion=2024.11.17 -#kotlin version +loader_version=0.18.2 +# Mod Properties +mod_version=2.5 +maven_group=com.lowdragmc.ldlib2 +archives_base_name=LDLib2 +mod_id=ldlib2 +mod_name=LDLib2 +mod_description=LowDragLib2 +mod_url=https://github.com/lowdragmc/LDLib +mod_license=MIT +# Kotlin kotlin_stdlib_version=2.1.20 -# NeoForge -# https://files.neoforged.neoforge.net/net/neoforged.neoforge/forge/ -neo_version=21.1.219 -# JEI - https://modrinth.com/mod/jei/versions#all-versions -jei_version=19.25.1.332 -# REI - https://modrinth.com/mod/rei/versions#all-versions -rei_version=16.0.799 -# KJS - https://modrinth.com/mod/kubejs/versions#all-versions -kjs_version=2100.7.0-build.117 -# EMI - https://modrinth.com/mod/emi/versions -emi_version=1.1.22+1.21.1 -# AE2 - https://modrinth.com/mod/ae2/versions -ae2_version=19.2.17 +# Yoga layout engine yoga_version=1.0.0 +# Taffy taffy_version=1.1.4 -# Iris - https://modrinth.com/mod/iris -iris_version=1.8.12+1.21.1-neoforge -# sodium - https://modrinth.com/mod/sodium/version/mc1.21.1-0.6.13-neoforge -sodium_version=mc1.21.1-0.6.13-neoforge # moddevmcp -moddevmcp_version=0.3 \ No newline at end of file +moddevmcp_version=0.3 +fabric_version=0.116.9+1.21.1 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 943f0cbfa..f8e1ee312 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1e2fbf0d4..23449a2b5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 65dcd68d6..adff685a0 100644 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -83,10 +85,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -133,10 +132,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +146,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +154,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -169,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -197,16 +198,19 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f1..c4bdd3ab8 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,22 +59,21 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/settings.gradle b/settings.gradle index 344c3f11a..f91a4fe7e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,13 +1,9 @@ pluginManagement { repositories { - mavenLocal() + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } gradlePluginPortal() - maven { url = 'https://maven.neoforged.net/releases' } } } - -plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0' -} - -rootProject.name = "${mod_id}-neoforge" \ No newline at end of file diff --git a/src/main/java/com/lowdragmc/lowdraglib2/CommonListeners.java b/src/main/java/com/lowdragmc/lowdraglib2/CommonListeners.java index 9b58cf7f6..b8fbf0596 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/CommonListeners.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/CommonListeners.java @@ -2,146 +2,51 @@ import com.lowdragmc.lowdraglib2.async.AsyncThreadData; import com.lowdragmc.lowdraglib2.editor.resource.PackResourceManager; -import com.lowdragmc.lowdraglib2.gui.ui.elements.*; import com.lowdragmc.lowdraglib2.test.NoRendererTestBlock; import com.lowdragmc.lowdraglib2.test.TestItem; +import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerEntityEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; +import net.fabricmc.fabric.api.resource.ResourceManagerHelper; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.packs.PackType; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.LevelAccessor; -import net.neoforged.bus.api.IEventBus; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.event.AddReloadListenerEvent; -import net.neoforged.neoforge.event.RegisterCommandsEvent; -import net.neoforged.neoforge.event.level.LevelEvent; -import net.neoforged.neoforge.event.server.ServerAboutToStartEvent; -import net.neoforged.neoforge.event.server.ServerStoppedEvent; -import net.neoforged.neoforge.event.server.ServerStoppingEvent; -import net.neoforged.neoforge.registries.DeferredRegister; -import java.util.function.Supplier; - -/** - * @author KilaBash - * @date 2022/11/27 - * @implNote CommonListeners - */ -@EventBusSubscriber(modid = LDLib2.MOD_ID) public class CommonListeners { - public static class ModCreativeModeTab { - // Deferred register for creative tabs - public static final DeferredRegister CREATIVE_MODE_TABS = - DeferredRegister.create(Registries.CREATIVE_MODE_TAB, LDLib2.MOD_ID); - - // Supplier for your dev-only tab - public static final Supplier LDLIB2_DEV_TAB = Platform.isDevEnv() ? - CREATIVE_MODE_TABS.register("ldlib2_dev_tab", () -> CreativeModeTab.builder() - .title(Component.translatable("itemGroup.ldlib2.dev_tab")) - .icon(() -> new ItemStack(TestItem.ITEM.getBlock())) - .displayItems((parameters, output) -> { - // Add dev-only items here - output.accept(TestItem.ITEM.getBlock()); - output.accept(NoRendererTestBlock.BLOCK); - }) - .build()) : null; - - // Method to hook the deferred register to the event bus - public static void register(IEventBus eventBus) { - CREATIVE_MODE_TABS.register(eventBus); - } - } + public static void register() { + ServerWorldEvents.UNLOAD.register((server, world) -> { + AsyncThreadData.getOrCreate(world).releaseExecutorService(); + }); - @SubscribeEvent - public static void onWorldUnLoad(LevelEvent.Unload event) { - LevelAccessor world = event.getLevel(); - if (!world.isClientSide() && world instanceof ServerLevel serverLevel) { - AsyncThreadData.getOrCreate(serverLevel).releaseExecutorService(); - } - } - - @SubscribeEvent - public static void onServerAboutToStart(ServerAboutToStartEvent event) { - Platform.SERVER_REGISTRY_ACCESS = event.getServer().registryAccess(); - } - - @SubscribeEvent - public static void onServerStopped(ServerStoppedEvent event) { - Platform.SERVER_REGISTRY_ACCESS = null; - } - - @SubscribeEvent - public static void onServerStopping(ServerStoppingEvent event) { - var levels = event.getServer().getAllLevels(); - for (var level : levels) { - if (!level.isClientSide()) { + ServerLifecycleEvents.SERVER_STOPPING.register(server -> { + for (var level : server.getAllLevels()) { AsyncThreadData.getOrCreate(level).releaseExecutorService(); } + }); + + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { + ServerCommands.createServerCommands().forEach(dispatcher::register); + }); + + ResourceManagerHelper.get(PackType.SERVER_DATA).registerReloadListener(PackResourceManager.INSTANCE); + + if (Platform.isDevEnv()) { + Registry.register(BuiltInRegistries.CREATIVE_MODE_TAB, LDLib2.id("ldlib2_dev_tab"), + FabricItemGroup.builder() + .title(Component.translatable("itemGroup.ldlib2.dev_tab")) + .icon(() -> new ItemStack(TestItem.ITEM.getBlock())) + .displayItems((parameters, output) -> { + output.accept(TestItem.ITEM.getBlock()); + output.accept(NoRendererTestBlock.BLOCK); + }) + .build()); } } - - @SubscribeEvent - public static void onRegisterCommands(RegisterCommandsEvent event) { - var dispatcher = event.getDispatcher(); - ServerCommands.createServerCommands().forEach(dispatcher::register); - } - - @SubscribeEvent - public static void onAddReloadListenerEvent(AddReloadListenerEvent event) { - event.addListener(PackResourceManager.INSTANCE); - } - - // TODO move example to somewhere else -// @SubscribeEvent -// public static void onContainerMenuCreateEvent(ContainerMenuEvent.Create event) throws Exception { -// // furnace screen -// if (event.menu instanceof AbstractFurnaceMenu furnaceMenu && furnaceMenu instanceof IModularUIHolderMenu uiHolderMenu) { -// var player = event.player; -// var field = AbstractFurnaceMenu.class.getDeclaredField("data"); -// field.setAccessible(true); -// ContainerData data = (ContainerData) field.get(furnaceMenu); -// var mui = ModularUI.of(UI.of( -// new UIElement().layout(l -> l.width(176).height(166)).addChildren( -// new UIElement().addChildren( -// new Label().bind(DataBindingBuilder.componentS2C(() -> { -// return Component.literal("burn time: %.2f / %.2f s" -// .formatted(data.get(2) / 20f, data.get(3) / 20f)); -// }).build()) -// ).layout(layout -> layout.positionType(TaffyPosition.ABSOLUTE) -// .widthPercent(100).paddingAll(5).top(-15)) -// .style(style -> style.background(MCSprites.BORDER)) -// )), player); -// uiHolderMenu.setModularUI(mui); -// } -// -// // ae drive -// if (event.menu instanceof DriveMenu driveMenu && driveMenu instanceof IModularUIHolderMenu uiHolderMenu) { -// var player = event.player; -// var mui = ModularUI.of(UI.of( -// new UIElement().layout(l -> l.width(176).height(201)).addChildren( -// new UIElement().addChildren( -// new TextField().setNumbersOnlyInt(Integer.MIN_VALUE, Integer.MAX_VALUE) -// .bind(DataBindingBuilder.string(() -> { -// if (driveMenu.getBlockEntity() instanceof DriveBlockEntity entity) { -// return String.valueOf(entity.getPriority()); -// } -// return String.valueOf(-1); -// }, priority -> { -// if (driveMenu.getBlockEntity() instanceof DriveBlockEntity entity) { -// try { -// entity.setPriority(Integer.parseInt(priority)); -// } catch (NumberFormatException ignored) { -// } -// } -// }).build()) -// ).layout(layout -> layout.positionType(TaffyPosition.ABSOLUTE) -// .width(50).paddingAll(5).left(173).top(-5)) -// .style(style -> style.background(MCSprites.BORDER)) -// ), StylesheetManager.INSTANCE.getStylesheetSafe(StylesheetManager.MC)), player); -// uiHolderMenu.setModularUI(mui); -// } -// } } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/CommonProxy.java b/src/main/java/com/lowdragmc/lowdraglib2/CommonProxy.java index 51854ba4e..5ebd655e7 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/CommonProxy.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/CommonProxy.java @@ -5,47 +5,63 @@ import com.lowdragmc.lowdraglib2.gui.factory.LDMenuTypes; import com.lowdragmc.lowdraglib2.gui.ui.style.PropertyRegistry; import com.lowdragmc.lowdraglib2.networking.LDLNetworking; +import com.lowdragmc.lowdraglib2.networking.both.PacketModularUISync; +import com.lowdragmc.lowdraglib2.networking.both.PacketRPCBlockEntity; +import com.lowdragmc.lowdraglib2.networking.both.PacketRPCPacket; +import com.lowdragmc.lowdraglib2.networking.c2s.CPacketUIRPCEvent; import com.lowdragmc.lowdraglib2.networking.rpc.RPCPacketDistributor; import com.lowdragmc.lowdraglib2.plugin.ILDLibPlugin; import com.lowdragmc.lowdraglib2.plugin.LDLibPlugin; import com.lowdragmc.lowdraglib2.syncdata.AccessorRegistries; import com.lowdragmc.lowdraglib2.test.*; import com.lowdragmc.lowdraglib2.utils.ReflectionUtils; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; -import net.neoforged.bus.api.IEventBus; -import net.neoforged.neoforge.registries.DeferredHolder; -import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.function.Supplier; public class CommonProxy { - private static final DeferredRegister BLOCKS = DeferredRegister.create(BuiltInRegistries.BLOCK, LDLib2.MOD_ID); - private static final DeferredRegister ITEMS = DeferredRegister.create(BuiltInRegistries.ITEM, LDLib2.MOD_ID); - private static final DeferredRegister> BLOCK_ENTITY_TYPES = DeferredRegister.create(BuiltInRegistries.BLOCK_ENTITY_TYPE, LDLib2.MOD_ID); - public static final DeferredHolder, BlockEntityType> TEST_BE_TYPE; - public static final DeferredHolder, BlockEntityType> RENDERER_BE_TYPE; + public static BlockEntityType TEST_BE_TYPE; + public static BlockEntityType RENDERER_BE_TYPE; - static { - TEST_BE_TYPE = Platform.isDevEnv() ? BLOCK_ENTITY_TYPES.register("test", () -> BlockEntityType.Builder.of(TestBlockEntity::new, TestBlock.BLOCK).build(null)) : null; - RENDERER_BE_TYPE = BLOCK_ENTITY_TYPES.register("renderer_block", () -> BlockEntityType.Builder.of(RendererBlockEntity::new, RendererBlock.BLOCK).build(null)); - } + public CommonProxy() { + // Register networking payloads (codecs) + LDLNetworking.register(); - public CommonProxy(IEventBus eventBus) { + // Register C2S networking receivers + ServerPlayNetworking.registerGlobalReceiver(CPacketUIRPCEvent.TYPE, (payload, context) -> { + context.server().execute(() -> CPacketUIRPCEvent.handle(payload, context.player(), context.player().registryAccess())); + }); + ServerPlayNetworking.registerGlobalReceiver(PacketRPCBlockEntity.TYPE, (payload, context) -> { + context.server().execute(() -> PacketRPCBlockEntity.handle(payload, context.player(), context.player().registryAccess())); + }); + ServerPlayNetworking.registerGlobalReceiver(PacketModularUISync.TYPE, (payload, context) -> { + context.server().execute(() -> PacketModularUISync.handle(payload, context.player(), context.player().registryAccess())); + }); + ServerPlayNetworking.registerGlobalReceiver(PacketRPCPacket.TYPE, (payload, context) -> { + context.server().execute(() -> PacketRPCPacket.handle(payload, context.player(), context.player().registryAccess())); + }); + + // Registration for blocks, items, BEs if (Platform.isDevEnv()) { - BLOCKS.register("test", () -> TestBlock.BLOCK); - ITEMS.register("test", () -> TestItem.ITEM); - BLOCKS.register("test_2", () -> NoRendererTestBlock.BLOCK); - ITEMS.register("test_2", () -> new BlockItem(NoRendererTestBlock.BLOCK, new Item.Properties())); + register("test", TestBlock.BLOCK); + register("test", TestItem.ITEM); + register("test_2", NoRendererTestBlock.BLOCK); + register("test_2", new BlockItem(NoRendererTestBlock.BLOCK, new Item.Properties())); + TEST_BE_TYPE = register("test", BlockEntityType.Builder.of(TestBlockEntity::new, TestBlock.BLOCK).build(null)); } - BLOCKS.register("renderer_block", () -> RendererBlock.BLOCK); + register("renderer_block", RendererBlock.BLOCK); + RENDERER_BE_TYPE = register("renderer_block", BlockEntityType.Builder.of(RendererBlockEntity::new, RendererBlock.BLOCK).build(null)); - // used for forge events (ClientProxy + CommonProxy) - eventBus.addListener(LDLNetworking::registerPayloads); // init common features - CommonProxy.init(eventBus); + CommonProxy.init(); + // load ldlib2 plugin ReflectionUtils.findAnnotationClasses(LDLibPlugin.class, data -> true, clazz -> { try { @@ -58,16 +74,24 @@ public CommonProxy(IEventBus eventBus) { }, () -> {}); } - public static void init(IEventBus eventBus) { + public static void init() { LDLib2Registries.init(); AccessorRegistries.init(); RPCPacketDistributor.init(); PropertyRegistry.init(); - LDMenuTypes.init(eventBus); + LDMenuTypes.init(); + } + + private static T register(String name, T block) { + return Registry.register(BuiltInRegistries.BLOCK, LDLib2.id(name), block); + } + + private static T register(String name, T item) { + return Registry.register(BuiltInRegistries.ITEM, LDLib2.id(name), item); + } - BLOCKS.register(eventBus); - ITEMS.register(eventBus); - BLOCK_ENTITY_TYPES.register(eventBus); + private static > T register(String name, T type) { + return Registry.register(BuiltInRegistries.BLOCK_ENTITY_TYPE, LDLib2.id(name), type); } } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/LDLib2.java b/src/main/java/com/lowdragmc/lowdraglib2/LDLib2.java index 5a990f9df..bfc7b7777 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/LDLib2.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/LDLib2.java @@ -1,15 +1,10 @@ package com.lowdragmc.lowdraglib2; -import net.minecraft.client.Minecraft; +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.util.RandomSource; import net.minecraft.resources.ResourceLocation; -import net.neoforged.fml.loading.FMLEnvironment; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.IEventBus; -import net.neoforged.fml.ModContainer; -import net.neoforged.fml.common.Mod; -import com.lowdragmc.lowdraglib2.CommonListeners.ModCreativeModeTab; -import com.lowdragmc.lowdraglib2.core.mixins.MixinPluginShared; import com.lowdragmc.lowdraglib2.client.ClientProxy; import com.google.gson.GsonBuilder; import com.google.gson.Gson; @@ -18,29 +13,33 @@ import java.io.File; -@Mod(LDLib2.MOD_ID) -public class LDLib2 { +public class LDLib2 implements ModInitializer { public static final String MOD_ID = "ldlib2"; public static final String NAME = "LowDragLib2"; public static final Logger LOGGER = LoggerFactory.getLogger(NAME); - public static final String MODID_JEI = "jei"; public static final String MODID_RUBIDIUM = "rubidium"; - public static final String MODID_REI = "roughlyenoughitems"; - public static final String MODID_EMI = "emi"; public static final RandomSource RANDOM = RandomSource.createThreadSafe(); public static final Gson GSON = new GsonBuilder().create(); private static File assetsLocation; - public LDLib2(IEventBus eventBus, ModContainer modContainer) { + @Override + public void onInitialize() { LDLib2.init(); - new CommonProxy(eventBus); - if (FMLEnvironment.dist == Dist.CLIENT) { - new ClientProxy(eventBus); - } - if (Platform.isDevEnv()) { - ModCreativeModeTab.register(eventBus); - } + + ServerLifecycleEvents.SERVER_STARTING.register(server -> { + Platform.SERVER = server; + Platform.SERVER_REGISTRY_ACCESS = server.registryAccess(); + }); + ServerLifecycleEvents.SERVER_STOPPED.register(server -> { + Platform.SERVER = null; + Platform.SERVER_REGISTRY_ACCESS = null; + }); + + CommonListeners.register(); + new CommonProxy(); + + } public static void init() { @@ -75,7 +74,6 @@ public static boolean isValidResourceLocation(String string) { return ResourceLocation.isValidNamespace(namespace) && ResourceLocation.isValidPath(path); } return true; - } public static ResourceLocation id(String path) { @@ -87,51 +85,15 @@ public static boolean isClient() { } public static boolean isRemote() { - if (isClient()) { - return Minecraft.getInstance().isSameThread(); - } - return false; + // Simple heuristic for Fabric + return FabricLoader.getInstance().getEnvironmentType() == net.fabricmc.api.EnvType.CLIENT; } public static boolean isServer() { - if (!isClient()) return true; - var server = Platform.getMinecraftServer(); - if (server != null) { - return server.isSameThread(); - } - return false; + return FabricLoader.getInstance().getEnvironmentType() == net.fabricmc.api.EnvType.SERVER; } public static boolean isModLoaded(String mod) { return Platform.isModLoaded(mod); } - - public static boolean isJeiLoaded() { - return isModLoaded(MODID_JEI); - } - - public static boolean isReiLoaded() { - return isModLoaded(MODID_REI); - } - - public static boolean isEmiLoaded() { - return isModLoaded(MODID_EMI); - } - - public static boolean isKubejsLoaded() { - return Platform.isModLoaded("kubejs"); - } - - public static boolean isIrisLoaded() { - return MixinPluginShared.IS_IRIS_LOAD; - } - - public static boolean isOculusLoaded() { - return MixinPluginShared.IS_OCULUS_LOAD; - } - - public static boolean isOptifineLoaded() { - return MixinPluginShared.IS_OPT_LOAD; - } - } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/LDLib2Client.java b/src/main/java/com/lowdragmc/lowdraglib2/LDLib2Client.java new file mode 100644 index 000000000..147e2a893 --- /dev/null +++ b/src/main/java/com/lowdragmc/lowdraglib2/LDLib2Client.java @@ -0,0 +1,11 @@ +package com.lowdragmc.lowdraglib2; + +import net.fabricmc.api.ClientModInitializer; +import com.lowdragmc.lowdraglib2.client.ClientProxy; + +public class LDLib2Client implements ClientModInitializer { + @Override + public void onInitializeClient() { + ClientProxy.register(); + } +} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/LDLib2Registries.java b/src/main/java/com/lowdragmc/lowdraglib2/LDLib2Registries.java index b48ac001a..cd1f56d99 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/LDLib2Registries.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/LDLib2Registries.java @@ -13,8 +13,8 @@ import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; import com.lowdragmc.lowdraglib2.test.ui.IMenuTest; import com.lowdragmc.lowdraglib2.test.ui.IScreenTest; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import java.util.function.Supplier; @@ -27,16 +27,16 @@ public class LDLib2Registries { public static AutoRegistry.LDLibRegister> MENU_TESTS; - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public static AutoRegistry.LDLibRegisterClient> CONFIGURATOR_ACCESSORS; - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public static AutoRegistry.LDLibRegisterClient> GUI_TEXTURES; - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public static AutoRegistry.LDLibRegisterClient> RENDERERS; - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public static AutoRegistry.LDLibRegisterClient> SCREEN_TESTS; static { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/Platform.java b/src/main/java/com/lowdragmc/lowdraglib2/Platform.java index c36c824ce..4243528ea 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/Platform.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/Platform.java @@ -1,7 +1,8 @@ package com.lowdragmc.lowdraglib2; import com.lowdragmc.lowdraglib2.utils.ResourceHelper; -import lombok.Getter; +import net.fabricmc.api.EnvType; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; import net.minecraft.core.Registry; import net.minecraft.core.RegistryAccess; @@ -9,12 +10,6 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.packs.resources.ResourceManager; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.fml.ModList; -import net.neoforged.fml.loading.FMLEnvironment; -import net.neoforged.fml.loading.FMLLoader; -import net.neoforged.neoforge.data.loading.DatagenModLoader; -import net.neoforged.neoforge.server.ServerLifecycleHooks; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -25,9 +20,11 @@ public class Platform { - @Getter(lazy = true) private static final RegistryAccess BLANK_REGISTRY_ACCESS = getBlankRegistryAccess(); + @ApiStatus.Internal + public static MinecraftServer SERVER = null; + @ApiStatus.Internal public static RegistryAccess SERVER_REGISTRY_ACCESS = null; @@ -38,44 +35,52 @@ public static boolean isServerNotSafe() { return Minecraft.getInstance().getConnection() == null; } else { var server = getMinecraftServer(); - return server == null || server.isStopped() || server.isShutdown() || !server.isRunning() || server.isCurrentlySaving(); + return server == null || server.isStopped() || !server.isRunning(); } } public static String platformName() { - return "NeoForge"; + return "Fabric"; } public static boolean isForge() { + return false; + } + + public static boolean isFabric() { return true; } public static boolean isDevEnv() { - return !FMLLoader.isProduction(); + return FabricLoader.getInstance().isDevelopmentEnvironment(); } + + public static boolean isDatagen() { - return DatagenModLoader.isRunningDataGen(); + return System.getProperty("fabric-api.datagen") != null; } public static boolean isModLoaded(String modId) { - return ModList.get().isLoaded(modId); + return FabricLoader.getInstance().isModLoaded(modId); } public static boolean isClient() { - return FMLEnvironment.dist == Dist.CLIENT; + return FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT; } public static MinecraftServer getMinecraftServer() { - return ServerLifecycleHooks.getCurrentServer(); + return SERVER; } + + public ResourceManager getResourceProvider() { return ResourceHelper.getResourceManager(); } public static Path getGamePath() { - return FMLLoader.getGamePath(); + return FabricLoader.getInstance().getGameDir(); } private static RegistryAccess getBlankRegistryAccess() { @@ -104,17 +109,19 @@ private static RegistryAccess getBlankRegistryAccess() { public static RegistryAccess getFrozenRegistry() { RegistryAccess serverRegistryAccess = SERVER_REGISTRY_ACCESS; if (LDLib2.isServer()) { - return serverRegistryAccess == null ? getBLANK_REGISTRY_ACCESS() : serverRegistryAccess; + RegistryAccess access = serverRegistryAccess == null ? BLANK_REGISTRY_ACCESS : serverRegistryAccess; + return access == null ? BLANK_REGISTRY_ACCESS : access; } else if (LDLib2.isRemote()) { if (Minecraft.getInstance().getConnection() != null) { return getRegistryFromMultipleSources(Minecraft.getInstance().getConnection().registryAccess(), serverRegistryAccess); } } - return serverRegistryAccess == null ? getClientRegistryAccess() : serverRegistryAccess; + RegistryAccess access = serverRegistryAccess == null ? getClientRegistryAccess() : serverRegistryAccess; + return access == null ? BLANK_REGISTRY_ACCESS : access; } public static RegistryAccess getServerRegistryAccess() { - return SERVER_REGISTRY_ACCESS == null ? getBLANK_REGISTRY_ACCESS() : SERVER_REGISTRY_ACCESS; + return SERVER_REGISTRY_ACCESS == null ? BLANK_REGISTRY_ACCESS : SERVER_REGISTRY_ACCESS; } public static RegistryAccess getClientRegistryAccess() { @@ -123,7 +130,7 @@ public static RegistryAccess getClientRegistryAccess() { return Minecraft.getInstance().getConnection().registryAccess(); } } - return SERVER_REGISTRY_ACCESS == null ? getBLANK_REGISTRY_ACCESS() : SERVER_REGISTRY_ACCESS; + return SERVER_REGISTRY_ACCESS == null ? BLANK_REGISTRY_ACCESS : SERVER_REGISTRY_ACCESS; } private static RegistryAccess getRegistryFromMultipleSources(RegistryAccess... accesses) { @@ -131,6 +138,7 @@ private static RegistryAccess getRegistryFromMultipleSources(RegistryAccess... a @Override public Optional> registry(ResourceKey> registryKey) { for (RegistryAccess access : accesses) { + if (access == null) continue; Optional> registry = access.registry(registryKey); if (registry.isPresent()) { return registry; @@ -141,7 +149,7 @@ public Optional> registry(ResourceKey> registries() { - return Arrays.stream(accesses).flatMap(RegistryAccess::registries); + return Arrays.stream(accesses).filter(java.util.Objects::nonNull).flatMap(RegistryAccess::registries); } }; } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/ServerCommands.java b/src/main/java/com/lowdragmc/lowdraglib2/ServerCommands.java index 8dec4e83a..4e3a0e189 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/ServerCommands.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/ServerCommands.java @@ -22,6 +22,9 @@ * @author KilaBash * @date 2023/2/9 * @implNote ServerCommands + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ public class ServerCommands { public static List> createServerCommands() { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/async/AsyncThreadData.java b/src/main/java/com/lowdragmc/lowdraglib2/async/AsyncThreadData.java index 76f27f03b..86e12ff57 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/async/AsyncThreadData.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/async/AsyncThreadData.java @@ -20,6 +20,9 @@ * used for Async logic, it's world-related. * all logic runnable {@link IAsyncLogic} will be constantly executed in a async thread per tick. * warning, you have to add and remove runnable manually. + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @@ -30,7 +33,7 @@ public class AsyncThreadData extends SavedData { public final ServerLevel serverLevel; public static AsyncThreadData getOrCreate(ServerLevel serverLevel) { - return serverLevel.getDataStorage().computeIfAbsent(new SavedData.Factory<>(() -> new AsyncThreadData(serverLevel), (tag, provider) -> new AsyncThreadData(serverLevel, tag)), LDLib2.MOD_ID); + return serverLevel.getDataStorage().computeIfAbsent(new SavedData.Factory<>(() -> new AsyncThreadData(serverLevel), (tag, provider) -> new AsyncThreadData(serverLevel, tag), null), LDLib2.MOD_ID); } private AsyncThreadData(ServerLevel serverLevel) { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/async/IAsyncLogic.java b/src/main/java/com/lowdragmc/lowdraglib2/async/IAsyncLogic.java index 733a075aa..b4ec21859 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/async/IAsyncLogic.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/async/IAsyncLogic.java @@ -4,6 +4,9 @@ * @author KilaBash * @date 2022/9/7 * @implNote IAsyncLogic + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ public interface IAsyncLogic { /** diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/ClientCommands.java b/src/main/java/com/lowdragmc/lowdraglib2/client/ClientCommands.java index 4775d4046..0b45ad81d 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/ClientCommands.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/ClientCommands.java @@ -6,11 +6,9 @@ import com.lowdragmc.lowdraglib2.gui.holder.ModularUIScreen; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import net.minecraft.client.Minecraft; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.minecraft.network.chat.Component; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import java.util.ArrayList; import java.util.List; @@ -19,30 +17,37 @@ * @author KilaBash * @date 2023/2/9 * @implNote ClientCommands + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ -@OnlyIn(Dist.CLIENT) public class ClientCommands { - public static LiteralArgumentBuilder createLiteral(String command) { - return Commands.literal(command); + public static LiteralArgumentBuilder createLiteral(String command) { + return ClientCommandManager.literal(command); } - public static List> createClientCommands() { - var commands = new ArrayList>(); + public static List> createClientCommands() { + var commands = new ArrayList>(); commands.add(createLiteral("ldlib2_client").then(createLiteral("reload_shader") .executes(context -> { LDLibShaders.reload(); ShaderManager.getInstance().reload(); return 1; }))); - if (LDLib2Registries.SCREEN_TESTS != null && !LDLib2Registries.SCREEN_TESTS.values().isEmpty()) { + if (LDLib2Registries.SCREEN_TESTS != null) { commands.add(createScreenTestCommands()); } return commands; } - private static LiteralArgumentBuilder createScreenTestCommands() { - var builder = Commands.literal("ldlib2_screen_test"); + private static LiteralArgumentBuilder createScreenTestCommands() { + var builder = ClientCommandManager.literal("ldlib2_screen_test") + .executes(context -> { + int count = LDLib2Registries.SCREEN_TESTS == null ? -1 : LDLib2Registries.SCREEN_TESTS.values().size(); + context.getSource().sendFeedback(Component.literal("ldlib2_screen_test registered! Test count: " + count)); + return 1; + }); if (LDLib2Registries.SCREEN_TESTS == null) { return builder; } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/ClientEventListener.java b/src/main/java/com/lowdragmc/lowdraglib2/client/ClientEventListener.java index a8973301b..346c977bf 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/ClientEventListener.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/ClientEventListener.java @@ -1,61 +1,44 @@ package com.lowdragmc.lowdraglib2.client; -import com.lowdragmc.lowdraglib2.LDLib2; import com.lowdragmc.lowdraglib2.editor.resource.EditorResourceEvent; import com.lowdragmc.lowdraglib2.editor.resource.ResourceInstance; import com.lowdragmc.lowdraglib2.editor.resource.TexturesResource; -import com.lowdragmc.lowdraglib2.gui.holder.IModularUIHolder; import com.lowdragmc.lowdraglib2.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib2.gui.ui.styletemplate.MCSprites; import com.lowdragmc.lowdraglib2.gui.ui.styletemplate.Sprites; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; -import net.minecraft.commands.CommandSourceStack; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RegisterClientCommandsEvent; -import net.neoforged.neoforge.client.event.ScreenEvent; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; -import java.util.List; /** * @author KilaBash * @date 2022/5/12 * @implNote EventListener + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ -@EventBusSubscriber(modid = LDLib2.MOD_ID, value = Dist.CLIENT) -@OnlyIn(Dist.CLIENT) public class ClientEventListener { - @SubscribeEvent - public static void onRegisterClientCommands(RegisterClientCommandsEvent event) { - var dispatcher = event.getDispatcher(); - List> commands = ClientCommands.createClientCommands(); - commands.forEach(dispatcher::register); + public static void register() { + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> { + ClientCommands.createClientCommands().forEach(dispatcher::register); + }); } - @SubscribeEvent - public static void onRegisterClientCommands(ScreenEvent.Init.Pre event) { - var screen = event.getScreen(); - if (screen instanceof AbstractContainerScreen containerScreen && containerScreen.getMenu() instanceof IModularUIHolder holder) { - var mui = holder.getModularUI(); - if (mui != null) { - mui.setScreenAndInit(containerScreen); - event.addListener(mui.getWidget()); - } - } + public static void init() { + EditorResourceEvent.LOAD_BUILTIN.register(ClientEventListener::onResourceLoad); } - @SubscribeEvent - public static void onLoadBuiltinEditorResource(EditorResourceEvent.LoadBuiltin event) { - if (event.resourceInstance.resource == TexturesResource.INSTANCE) { - Sprites.init((ResourceInstance) event.resourceInstance); - MCSprites.init((ResourceInstance) event.resourceInstance); + @SuppressWarnings("unchecked") + public static void onResourceLoad(ResourceInstance resourceInstance) { + if (resourceInstance.resource instanceof TexturesResource texturesResource) { + if (texturesResource.getName().equals("texture")) { + Sprites.init((ResourceInstance) resourceInstance); + MCSprites.init((ResourceInstance) resourceInstance); + } } } -// + // @SubscribeEvent // public static void onRegisterGuiLayers(RegisterGuiLayersEvent event) { // // memoize and delay, to make sure ui is generated after the world loading diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/ClientProxy.java b/src/main/java/com/lowdragmc/lowdraglib2/client/ClientProxy.java index 93d65778a..b243d9102 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/ClientProxy.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/ClientProxy.java @@ -3,108 +3,115 @@ import com.lowdragmc.lowdraglib2.CommonProxy; import com.lowdragmc.lowdraglib2.LDLib2; import com.lowdragmc.lowdraglib2.Platform; -import com.lowdragmc.lowdraglib2.client.model.forge.LDLRendererModel; +import com.lowdragmc.lowdraglib2.client.model.fabric.LDLRendererModel; +import com.lowdragmc.lowdraglib2.client.model.fabric.OBJModelLoader; import com.lowdragmc.lowdraglib2.client.renderer.ATESRRendererProvider; import com.lowdragmc.lowdraglib2.client.renderer.IRenderer; import com.lowdragmc.lowdraglib2.client.shader.LDLibShaders; -import com.lowdragmc.lowdraglib2.core.mixins.ParticleEngineAccessor; +import com.lowdragmc.lowdraglib2.networking.both.PacketModularUISync; +import com.lowdragmc.lowdraglib2.networking.both.PacketRPCBlockEntity; +import com.lowdragmc.lowdraglib2.networking.both.PacketRPCPacket; +import com.lowdragmc.lowdraglib2.networking.s2c.SPacketAutoSyncBlockEntity; +import com.lowdragmc.lowdraglib2.networking.s2c.SPacketUIRPCEventReturn; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.client.rendering.v1.BlockEntityRendererRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.CoreShaderRegistrationCallback; +import net.fabricmc.fabric.api.resource.ResourceManagerHelper; +import net.minecraft.server.packs.PackType; import com.lowdragmc.lowdraglib2.editor.resource.PackResourceManager; import com.lowdragmc.lowdraglib2.gui.factory.LDMenuTypes; import com.lowdragmc.lowdraglib2.gui.holder.ModularUIContainerScreen; import com.lowdragmc.lowdraglib2.gui.ui.style.StylesheetManager; -import com.lowdragmc.lowdraglib2.gui.ui.utils.ModularUIClientElementComponent; -import com.lowdragmc.lowdraglib2.gui.ui.utils.ModularUITooltipComponent; -import com.lowdragmc.lowdraglib2.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib2.integration.kjs.ui.LDKJSMenuTypes; import net.minecraft.client.Minecraft; import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.gui.screens.MenuScreens; import net.minecraft.core.particles.ParticleType; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.client.resources.model.*; import net.minecraft.resources.ResourceLocation; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.bus.api.IEventBus; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; -import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; -import net.neoforged.neoforge.client.event.*; -@OnlyIn(Dist.CLIENT) public class ClientProxy { - public ClientProxy(IEventBus eventBus) { - eventBus.register(this); - } + public static void register() { + // Register Screens + MenuScreens.register(LDMenuTypes.PLAYER_UI, ModularUIContainerScreen::new); + MenuScreens.register(LDMenuTypes.HELD_ITEM_UI, ModularUIContainerScreen::new); + MenuScreens.register(LDMenuTypes.BLOCK_UI, ModularUIContainerScreen::new); - @SubscribeEvent - public void onRegisterMenuScreensEvent(final RegisterMenuScreensEvent event) { - event.register(LDMenuTypes.PLAYER_UI.get(), ModularUIContainerScreen::new); - event.register(LDMenuTypes.HELD_ITEM_UI.get(), ModularUIContainerScreen::new); - event.register(LDMenuTypes.BLOCK_UI.get(), ModularUIContainerScreen::new); - if (LDLib2.isKubejsLoaded()) { - LDKJSMenuTypes.onRegisterMenuScreensEvent(event); + // Register Entity Renderers + if (Platform.isDevEnv() && CommonProxy.TEST_BE_TYPE != null) { + BlockEntityRendererRegistry.register(CommonProxy.TEST_BE_TYPE, ATESRRendererProvider::new); + } + if (CommonProxy.RENDERER_BE_TYPE != null) { + BlockEntityRendererRegistry.register(CommonProxy.RENDERER_BE_TYPE, ATESRRendererProvider::new); } - } - @SubscribeEvent - public void onRegisterClientTooltipComponentFactoriesEvent(final RegisterClientTooltipComponentFactoriesEvent event) { - event.register(ModularUITooltipComponent.class, ModularUIClientElementComponent::new); - } + // Networking receivers (S2C) + ClientPlayNetworking.registerGlobalReceiver(SPacketAutoSyncBlockEntity.TYPE, (payload, context) -> { + context.client().execute(() -> SPacketAutoSyncBlockEntity.handle(payload, context.player(), context.player().registryAccess())); + }); + ClientPlayNetworking.registerGlobalReceiver(SPacketUIRPCEventReturn.TYPE, (payload, context) -> { + context.client().execute(() -> SPacketUIRPCEventReturn.handle(payload, context.player(), context.player().registryAccess())); + }); + ClientPlayNetworking.registerGlobalReceiver(PacketRPCBlockEntity.TYPE, (payload, context) -> { + context.client().execute(() -> PacketRPCBlockEntity.handle(payload, context.player(), context.player().registryAccess())); + }); + ClientPlayNetworking.registerGlobalReceiver(PacketModularUISync.TYPE, (payload, context) -> { + context.client().execute(() -> PacketModularUISync.handle(payload, context.player(), context.player().registryAccess())); + }); + ClientPlayNetworking.registerGlobalReceiver(PacketRPCPacket.TYPE, (payload, context) -> { + context.client().execute(() -> PacketRPCPacket.handle(payload, context.player(), context.player().registryAccess())); + }); - @SubscribeEvent - public void registerRenderers(EntityRenderersEvent.RegisterRenderers event) { - if (Platform.isDevEnv()) { - event.registerBlockEntityRenderer(CommonProxy.TEST_BE_TYPE.get(), ATESRRendererProvider::new); - } - event.registerBlockEntityRenderer(CommonProxy.RENDERER_BE_TYPE.get(), ATESRRendererProvider::new); - } + // Lifecycle Events + ClientLifecycleEvents.CLIENT_STARTED.register(client -> LDLibShaders.init()); - @SubscribeEvent - public void clientSetup(final FMLClientSetupEvent e) { - e.enqueueWork(() -> { - LDLibShaders.init(); + // Model Loading + ModelLoadingPlugin.register(pluginContext -> { + pluginContext.resolveModel().register(OBJModelLoader.INSTANCE); + pluginContext.modifyModelOnLoad().register((model, context) -> { + if (LDLib2.id("renderer").equals(context.topLevelId())) { + return LDLRendererModel.INSTANCE; + } + return model; + }); + registerModels(pluginContext); + IRenderer.EVENT_REGISTERS.forEach(r -> r.onAdditionalModel(pluginContext::addModels)); }); - } - @SubscribeEvent - public void modelRegistry(final ModelEvent.RegisterGeometryLoaders e) { - e.register(LDLib2.id("renderer"), LDLRendererModel.Loader.INSTANCE); - } + // Shaders + CoreShaderRegistrationCallback.EVENT.register(LDLibShaders::registerCoreShaders); - @SubscribeEvent - public void shaderRegistry(RegisterShadersEvent event) { - LDLibShaders.registerShaders(event); - } + // Resource Listeners + ResourceManagerHelper.get(PackType.CLIENT_RESOURCES).registerReloadListener(PackResourceManager.INSTANCE); + ResourceManagerHelper.get(PackType.CLIENT_RESOURCES).registerReloadListener(StylesheetManager.INSTANCE); - @SubscribeEvent - public void onRegisterClientReloadListenersEvent(RegisterClientReloadListenersEvent event) { - event.registerReloadListener(PackResourceManager.INSTANCE); - event.registerReloadListener(StylesheetManager.INSTANCE); + ClientEventListener.register(); + ClientEventListener.init(); } - @SubscribeEvent - public void registerModels(ModelEvent.RegisterAdditional event) { - // load all models under the ldlib folder + public static void registerModels(ModelLoadingPlugin.Context event) { + // load all models under the ldlib and photon folder for (var entry : Minecraft.getInstance().getResourceManager().listResources("models", - id -> id.getNamespace().equals(LDLib2.MOD_ID) && id.getPath().endsWith(".json")).entrySet()) { - if (entry.getValue().sourcePackId().equals(LDLib2.MOD_ID)) { - var modelLocation = ResourceLocation.fromNamespaceAndPath( - entry.getKey().getNamespace(), - entry.getKey().getPath() - .replace("models/", "") - .replace(".json", "")); - event.register(ModelResourceLocation.standalone(modelLocation)); - } + id -> (id.getNamespace().equals(LDLib2.MOD_ID) || id.getNamespace().equals("photon")) && + (id.getPath().endsWith(".json") || id.getPath().endsWith(".obj"))).entrySet()) { + var modelLocation = ResourceLocation.fromNamespaceAndPath( + entry.getKey().getNamespace(), + entry.getKey().getPath() + .replace("models/", "") + .replace(".json", "") + .replace(".obj", "")); + event.addModels(modelLocation); } for (IRenderer renderer : IRenderer.EVENT_REGISTERS) { - renderer.onAdditionalModel(event::register); + renderer.onAdditionalModel(event::addModels); } } public static ParticleProvider getProvider(ParticleType type) { - if (Minecraft.getInstance().particleEngine instanceof ParticleEngineAccessor accessor) { - return accessor.getProviders().get(BuiltInRegistries.PARTICLE_TYPE.getKey(type)); + if (Minecraft.getInstance().particleEngine instanceof com.lowdragmc.lowdraglib2.core.mixins.ParticleEngineAccessor accessor) { + return accessor.getProviders().get(BuiltInRegistries.PARTICLE_TYPE.getId(type)); } return null; } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/model/ModelFactory.java b/src/main/java/com/lowdragmc/lowdraglib2/client/model/ModelFactory.java index 7ce6bc792..2652b55b6 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/model/ModelFactory.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/model/ModelFactory.java @@ -4,8 +4,6 @@ import com.lowdragmc.lowdraglib2.core.mixins.accessor.ModelBakeryAccessor; import com.mojang.datafixers.util.Either; import com.mojang.math.Transformation; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.BlockModel; @@ -26,20 +24,19 @@ import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; import java.util.function.Function; - -/** - * Author: KilaBash - * Date: 2022/04/24 - * Description: - */ -@OnlyIn(Dist.CLIENT) @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ModelFactory { public static final ItemModelGenerator ITEM_MODEL_GENERATOR = new ItemModelGenerator(); + private static ModelBakery modelBakery; + + public static void setModelBakery(ModelBakery bakery) { + modelBakery = bakery; + } + public static ModelBakery getModelBakery() { - return Minecraft.getInstance().getModelManager().getModelBakery(); + return modelBakery; } public static UnbakedModel getLDLibModel(UnbakedModel vanilla) { @@ -53,12 +50,10 @@ public UnbakedModel getModel(ResourceLocation location) { return getUnBakedModel(location); } - @Override public UnbakedModel getTopLevelModel(ModelResourceLocation modelResourceLocation) { return ModelFactory.getTopLevelModel(modelResourceLocation); } - @Override public @Nullable BakedModel bake(ResourceLocation location, ModelState state, Function sprites) { UnbakedModel unbakedmodel = this.getModel(location); if (unbakedmodel instanceof BlockModel blockmodel) { @@ -69,7 +64,6 @@ public UnbakedModel getTopLevelModel(ModelResourceLocation modelResourceLocation return unbakedmodel.bake(this, Material::sprite, state); } - @Override public @Nullable BakedModel bakeUncached(UnbakedModel unbakedModel, ModelState modelState, Function function) { if (unbakedModel instanceof BlockModel blockmodel) { if (blockmodel.getRootModel() == ModelBakery.GENERATION_MARKER) { @@ -79,7 +73,6 @@ public UnbakedModel getTopLevelModel(ModelResourceLocation modelResourceLocation return unbakedModel.bake(this, Material::sprite, modelState); } - @Override public Function getModelTextureGetter() { return Material::sprite; } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/model/fabric/LDLRendererModel.java b/src/main/java/com/lowdragmc/lowdraglib2/client/model/fabric/LDLRendererModel.java new file mode 100644 index 000000000..9818051f5 --- /dev/null +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/model/fabric/LDLRendererModel.java @@ -0,0 +1,146 @@ +package com.lowdragmc.lowdraglib2.client.model.fabric; + +import net.minecraft.resources.ResourceLocation; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.lowdragmc.lowdraglib2.client.renderer.IBlockRendererProvider; +import com.lowdragmc.lowdraglib2.client.renderer.IRenderer; +import com.lowdragmc.lowdraglib2.client.renderer.ModelData; +import com.lowdragmc.lowdraglib2.client.renderer.ModelProperty; +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.MissingTextureAtlasSprite; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.*; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; + +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; + +public class LDLRendererModel implements UnbakedModel { + public static final LDLRendererModel INSTANCE = new LDLRendererModel(); + + private LDLRendererModel() {} + + @Override + public Collection getDependencies() { + return Collections.emptyList(); + } + + @Override + public void resolveParents(Function modelGetter) { + } + + @Override + public BakedModel bake(ModelBaker baker, Function spriteGetter, ModelState state) { + return new RendererBakedModel(); + } + + public static final class RendererBakedModel implements net.minecraft.client.resources.model.BakedModel, FabricBakedModel { + + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand) { + return Collections.emptyList(); + } + + @Override + public boolean useAmbientOcclusion() { + return false; + } + + @Override + public boolean isGui3d() { + return true; + } + + @Override + public boolean usesBlockLight() { + return false; + } + + @Override + public net.minecraft.client.renderer.block.model.ItemTransforms getTransforms() { return net.minecraft.client.renderer.block.model.ItemTransforms.NO_TRANSFORMS; } + public boolean isCustomRenderer() { + return false; + } + + @Override + public TextureAtlasSprite getParticleIcon() { + return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(MissingTextureAtlasSprite.getLocation()); + } + + @Override + public net.minecraft.client.renderer.block.model.ItemOverrides getOverrides() { + return net.minecraft.client.renderer.block.model.ItemOverrides.EMPTY; + } + + // Fabric specific: we use ThreadLocals to pass ModelData, or block entity data. + public static final ModelProperty RENDERER = new ModelProperty<>(); + public static final ModelProperty WORLD = new ModelProperty<>(); + public static final ModelProperty POS = new ModelProperty<>(); + public static final ModelProperty MODEL_DATA = new ModelProperty<>(); + + @Override + public boolean isVanillaAdapter() { + return false; + } + + @Override + public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, BlockPos pos, Supplier randomSupplier, RenderContext context) { + IRenderer renderer = null; + if (state != null && state.getBlock() instanceof IBlockRendererProvider rendererProvider) { + renderer = rendererProvider.getRenderer(state); + } + if (renderer != null) { + ModelData data = ModelData.builder() + .with(RENDERER, renderer) + .with(WORLD, blockView) + .with(POS, pos) + .with(MODEL_DATA, ModelData.EMPTY) + .build(); + + var emitter = context.getEmitter(); + RandomSource rand = randomSupplier.get(); + + for (Direction side : Direction.values()) { + for (var quad : renderer.renderModel(blockView, pos, state, side, rand, data, null)) { + emitter.fromVanilla(quad, null, side); + emitter.emit(); + } + } + for (var quad : renderer.renderModel(blockView, pos, state, null, rand, data, null)) { + emitter.fromVanilla(quad, null, null); + emitter.emit(); + } + } + } + + @Override + public void emitItemQuads(ItemStack stack, Supplier randomSupplier, RenderContext context) { + // Emitted via IItemRendererProvider + } + } + + public static class Loader implements net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier.OnLoad { + public static final Loader INSTANCE = new Loader(); + + @Override + public net.minecraft.client.resources.model.UnbakedModel modifyModelOnLoad(net.minecraft.client.resources.model.UnbakedModel model, net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier.OnLoad.Context context) { + return model; + } + } +} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/model/fabric/OBJModelLoader.java b/src/main/java/com/lowdragmc/lowdraglib2/client/model/fabric/OBJModelLoader.java new file mode 100644 index 000000000..13c707c86 --- /dev/null +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/model/fabric/OBJModelLoader.java @@ -0,0 +1,256 @@ +package com.lowdragmc.lowdraglib2.client.model.fabric; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.lowdragmc.lowdraglib2.LDLib2; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelResolver; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.BlockElement; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.client.renderer.texture.MissingTextureAtlasSprite; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.*; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import org.joml.Vector2f; +import org.joml.Vector3f; + +import javax.annotation.Nullable; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.function.Function; + +public class OBJModelLoader implements ModelResolver { + public static final OBJModelLoader INSTANCE = new OBJModelLoader(); + + private final Map cache = new HashMap<>(); + + @Override + public @Nullable UnbakedModel resolveModel(Context context) { + ResourceLocation id = context.id(); + if (id.getPath().endsWith(".obj")) { + return cache.computeIfAbsent(id, this::loadOBJ); + } else if (id.getPath().endsWith(".json")) { + try { + var resource = Minecraft.getInstance().getResourceManager().getResource(id); + if (resource.isEmpty()) return null; + try (var reader = new BufferedReader(new InputStreamReader(resource.get().open(), StandardCharsets.UTF_8))) { + JsonObject json = GsonHelper.parse(reader); + if (json.has("loader") && (json.get("loader").getAsString().equals("neoforge:obj") || json.get("loader").getAsString().equals("ldlib2:obj"))) { + ResourceLocation modelLocation = ResourceLocation.parse(json.get("model").getAsString()); + boolean flipV = json.has("flip_v") && json.get("flip_v").getAsBoolean(); + // Recursive call or direct load + UnbakedModel model = cache.computeIfAbsent(modelLocation, this::loadOBJ); + if (model instanceof OBJUnbakedModel objModel) { + return new OBJWrapperUnbakedModel(objModel, flipV); + } + } + } + } catch (Exception ignored) { + } + } + return null; + } + + private UnbakedModel loadOBJ(ResourceLocation location) { + try { + var resource = Minecraft.getInstance().getResourceManager().getResource(location); + if (resource.isEmpty()) return null; + + List vertices = new ArrayList<>(); + List uvs = new ArrayList<>(); + List normals = new ArrayList<>(); + List faces = new ArrayList<>(); // vertex/uv/normal indices + + try (var reader = new BufferedReader(new InputStreamReader(resource.get().open(), StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + line = line.trim(); + if (line.isEmpty() || line.startsWith("#")) continue; + String[] parts = line.split("\\s+"); + switch (parts[0]) { + case "v" -> vertices.add(new Vector3f(Float.parseFloat(parts[1]), Float.parseFloat(parts[2]), Float.parseFloat(parts[3]))); + case "vt" -> uvs.add(new Vector2f(Float.parseFloat(parts[1]), 1.0f - Float.parseFloat(parts[2]))); + case "vn" -> normals.add(new Vector3f(Float.parseFloat(parts[1]), Float.parseFloat(parts[2]), Float.parseFloat(parts[3]))); + case "f" -> { + int[][] face = new int[parts.length - 1][3]; + for (int i = 1; i < parts.length; i++) { + String[] indices = parts[i].split("/"); + face[i - 1][0] = Integer.parseInt(indices[0]) - 1; + if (indices.length > 1 && !indices[1].isEmpty()) face[i - 1][1] = Integer.parseInt(indices[1]) - 1; + if (indices.length > 2 && !indices[2].isEmpty()) face[i - 1][2] = Integer.parseInt(indices[2]) - 1; + } + faces.add(face); + } + } + } + } + return new OBJUnbakedModel(location, vertices, uvs, normals, faces); + } catch (Exception e) { + LDLib2.LOGGER.error("Failed to load OBJ model: " + location, e); + return null; + } + } + + private static class OBJUnbakedModel implements UnbakedModel { + private final ResourceLocation location; + private final List vertices; + private final List uvs; + private final List normals; + private final List faces; + private final boolean flipV; + + public OBJUnbakedModel(ResourceLocation location, List vertices, List uvs, List normals, List faces) { + this(location, vertices, uvs, normals, faces, false); + } + + public OBJUnbakedModel(ResourceLocation location, List vertices, List uvs, List normals, List faces, boolean flipV) { + this.location = location; + this.vertices = vertices; + this.uvs = uvs; + this.normals = normals; + this.faces = faces; + this.flipV = flipV; + } + + @Override + public Collection getDependencies() { + return Collections.emptyList(); + } + + @Override + public void resolveParents(Function modelGetter) { + } + + @Nullable + @Override + public BakedModel bake(ModelBaker baker, Function spriteGetter, ModelState state) { + // Try to use the model location as a texture location (removing 'models/' prefix if present) + String path = location.getPath(); + if (path.startsWith("models/")) path = path.substring(7); + if (path.endsWith(".obj")) path = path.substring(0, path.length() - 4); + TextureAtlasSprite sprite = spriteGetter.apply(new Material(TextureAtlas.LOCATION_BLOCKS, ResourceLocation.fromNamespaceAndPath(location.getNamespace(), path))); + if (sprite.contents().name().equals(MissingTextureAtlasSprite.getLocation())) { + sprite = spriteGetter.apply(new Material(TextureAtlas.LOCATION_BLOCKS, ResourceLocation.withDefaultNamespace("missingno"))); + } + return new OBJBakedModel(vertices, uvs, normals, faces, sprite, flipV); + } + } + + private static class OBJWrapperUnbakedModel implements UnbakedModel { + private final OBJUnbakedModel model; + private final boolean flipV; + + public OBJWrapperUnbakedModel(OBJUnbakedModel model, boolean flipV) { + this.model = model; + this.flipV = flipV; + } + + @Override + public Collection getDependencies() { + return model.getDependencies(); + } + + @Override + public void resolveParents(Function modelGetter) { + model.resolveParents(modelGetter); + } + + @Nullable + @Override + public BakedModel bake(ModelBaker baker, Function spriteGetter, ModelState state) { + String path = model.location.getPath(); + if (path.startsWith("models/")) path = path.substring(7); + if (path.endsWith(".obj")) path = path.substring(0, path.length() - 4); + TextureAtlasSprite sprite = spriteGetter.apply(new Material(TextureAtlas.LOCATION_BLOCKS, ResourceLocation.fromNamespaceAndPath(model.location.getNamespace(), path))); + if (sprite.contents().name().equals(MissingTextureAtlasSprite.getLocation())) { + sprite = spriteGetter.apply(new Material(TextureAtlas.LOCATION_BLOCKS, ResourceLocation.withDefaultNamespace("missingno"))); + } + return new OBJBakedModel(model.vertices, model.uvs, model.normals, model.faces, sprite, flipV); + } + } + + private static class OBJBakedModel implements BakedModel { + private final List quads = new ArrayList<>(); + private final TextureAtlasSprite particleIcon; + private final boolean flipV; + + public OBJBakedModel(List vertices, List uvs, List normals, List faces, TextureAtlasSprite sprite, boolean flipV) { + this.particleIcon = sprite; + this.flipV = flipV; + for (int[][] face : faces) { + if (face.length < 3) continue; + // Simple triangulation for N-gons + for (int i = 1; i < face.length - 1; i++) { + quads.add(createQuad(vertices, uvs, normals, face[0], face[i], face[i + 1], face[i + 1], sprite)); + } + } + } + + private BakedQuad createQuad(List vertices, List uvs, List normals, + int[] v1, int[] v2, int[] v3, int[] v4, TextureAtlasSprite sprite) { + int[] data = new int[32]; + fillVertex(data, 0, vertices.get(v1[0]), uvs.isEmpty() ? null : uvs.get(v1[1]), normals.isEmpty() ? null : normals.get(v1[2]), sprite); + fillVertex(data, 1, vertices.get(v2[0]), uvs.isEmpty() ? null : uvs.get(v2[1]), normals.isEmpty() ? null : normals.get(v2[2]), sprite); + fillVertex(data, 2, vertices.get(v3[0]), uvs.isEmpty() ? null : uvs.get(v3[1]), normals.isEmpty() ? null : normals.get(v3[2]), sprite); + fillVertex(data, 3, vertices.get(v4[0]), uvs.isEmpty() ? null : uvs.get(v4[1]), normals.isEmpty() ? null : normals.get(v4[2]), sprite); + return new BakedQuad(data, 0, Direction.UP, sprite, true); + } + + private void fillVertex(int[] data, int index, Vector3f pos, @Nullable Vector2f uv, @Nullable Vector3f normal, TextureAtlasSprite sprite) { + int offset = index * 8; + // Position + data[offset] = Float.floatToRawIntBits(pos.x()); + data[offset + 1] = Float.floatToRawIntBits(pos.y()); + data[offset + 2] = Float.floatToRawIntBits(pos.z()); + // Color (0xFFFFFFFF) + data[offset + 3] = -1; + // UV0 + if (uv != null) { + float v = flipV ? 1.0f - uv.y() : uv.y(); + data[offset + 4] = Float.floatToRawIntBits(sprite.getU(uv.x() * 16)); + data[offset + 5] = Float.floatToRawIntBits(sprite.getV(v * 16)); + } else { + data[offset + 4] = Float.floatToRawIntBits(sprite.getU0()); + data[offset + 5] = Float.floatToRawIntBits(sprite.getV0()); + } + // UV1 (Light) + data[offset + 6] = 0; + // Normal + if (normal != null) { + int nx = ((int) (normal.x() * 127)) & 0xFF; + int ny = ((int) (normal.y() * 127)) & 0xFF; + int nz = ((int) (normal.z() * 127)) & 0xFF; + data[offset + 7] = nx | (ny << 8) | (nz << 16) | (0xFF << 24); // 0xFF alpha/padding + } else { + data[offset + 7] = 0; + } + } + + + @Override + public List getQuads(@Nullable net.minecraft.world.level.block.state.BlockState state, @Nullable Direction side, net.minecraft.util.RandomSource rand) { + return side == null ? quads : Collections.emptyList(); + } + + @Override + public boolean useAmbientOcclusion() { return true; } + @Override + public boolean isGui3d() { return true; } + @Override + public boolean usesBlockLight() { return true; } + @Override + public boolean isCustomRenderer() { return false; } + @Override + public TextureAtlasSprite getParticleIcon() { return particleIcon; } + @Override + public net.minecraft.client.renderer.block.model.ItemTransforms getTransforms() { return net.minecraft.client.renderer.block.model.ItemTransforms.NO_TRANSFORMS; } + @Override + public net.minecraft.client.renderer.block.model.ItemOverrides getOverrides() { return net.minecraft.client.renderer.block.model.ItemOverrides.EMPTY; } + } +} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/model/forge/LDLRendererModel.java b/src/main/java/com/lowdragmc/lowdraglib2/client/model/forge/LDLRendererModel.java deleted file mode 100644 index 3b68bf335..000000000 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/model/forge/LDLRendererModel.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.lowdragmc.lowdraglib2.client.model.forge; - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.lowdragmc.lowdraglib2.client.renderer.IBlockRendererProvider; -import com.lowdragmc.lowdraglib2.client.renderer.IRenderer; -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.block.model.ItemOverrides; -import net.minecraft.client.renderer.texture.MissingTextureAtlasSprite; -import net.minecraft.client.renderer.texture.TextureAtlas; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.client.resources.model.Material; -import net.minecraft.client.resources.model.ModelBaker; -import net.minecraft.client.resources.model.ModelState; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.client.ChunkRenderTypeSet; -import net.neoforged.neoforge.client.model.data.ModelData; -import net.neoforged.neoforge.client.model.data.ModelProperty; -import net.neoforged.neoforge.client.model.geometry.IGeometryBakingContext; -import net.neoforged.neoforge.client.model.geometry.IGeometryLoader; -import net.neoforged.neoforge.client.model.geometry.IUnbakedGeometry; -import net.neoforged.neoforge.common.util.TriState; -import org.jetbrains.annotations.NotNull; - -import org.jetbrains.annotations.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.Collections; -import java.util.List; -import java.util.function.Function; - -/** - * @author KilaBash - * @date 2022/05/28 - * @implNote LDLModel, use vanilla way to improve model rendering - */ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class LDLRendererModel implements IUnbakedGeometry { - public static final LDLRendererModel INSTANCE = new LDLRendererModel(); - - private LDLRendererModel() {} - - @Override - public BakedModel bake(IGeometryBakingContext iGeometryBakingContext, ModelBaker arg, Function function, ModelState arg2, ItemOverrides arg3) { - return new RendererBakedModel(); - } - - public static final class RendererBakedModel implements BakedModel { - - @Override - public List getQuads(@Nullable BlockState state, @Nullable Direction direction, RandomSource random) { - return Collections.emptyList(); - } - - @Override - public boolean useAmbientOcclusion() { - return false; - } - - @Override - public boolean isGui3d() { - return true; - } - - @Override - public boolean usesBlockLight() { - return false; - } - - @Override - public boolean isCustomRenderer() { - return false; - } - - @Override - public TextureAtlasSprite getParticleIcon() { - return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(MissingTextureAtlasSprite.getLocation()); - } - - @Override - public ItemOverrides getOverrides() { - return ItemOverrides.EMPTY; - } - - // forge - - public static final ModelProperty RENDERER = new ModelProperty<>(); - public static final ModelProperty WORLD = new ModelProperty<>(); - public static final ModelProperty POS = new ModelProperty<>(); - public static final ModelProperty MODEL_DATA = new ModelProperty<>(); - - - @Override - public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand, ModelData data, @Nullable RenderType renderType) { - var renderer = data.get(RENDERER); - var world = data.get(WORLD); - var pos = data.get(POS); - var modelData = data.get(MODEL_DATA); - if (renderer == null && state != null && state.getBlock() instanceof IBlockRendererProvider rendererProvider) { - renderer = rendererProvider.getRenderer(state); - } - if (renderer != null) { - return renderer.renderModel(world, pos, state, side, rand, modelData, renderType); - } - return Collections.emptyList(); - } - - @Override - public TriState useAmbientOcclusion(BlockState state, ModelData data, RenderType renderType) { - if (state.getBlock() instanceof IBlockRendererProvider rendererProvider) { - IRenderer renderer = rendererProvider.getRenderer(state); - if (renderer != null) { - return renderer.useAO(state, data, renderType); - } - } - return BakedModel.super.useAmbientOcclusion(state, data, renderType); - } - - - @Override - public @NotNull ModelData getModelData(@NotNull BlockAndTintGetter level, @NotNull BlockPos pos, @NotNull BlockState state, @NotNull ModelData modelData) { - if (state.getBlock() instanceof IBlockRendererProvider rendererProvider) { - IRenderer renderer = rendererProvider.getRenderer(state); - if (renderer != null) { - modelData = ModelData.builder() - .with(RENDERER, renderer) - .with(WORLD, level) - .with(POS, pos) - .with(MODEL_DATA, modelData) - .build(); - } - } - return modelData; - } - - @Override - public TextureAtlasSprite getParticleIcon(@NotNull ModelData data) { - var renderer = data.get(RENDERER); - var world = data.get(WORLD); - var pos = data.get(POS); - var modelData = data.get(MODEL_DATA); - if (renderer != null) { - return renderer.getParticleTexture(world, pos, modelData); - } - return BakedModel.super.getParticleIcon(data); - } - - @Override - public ChunkRenderTypeSet getRenderTypes(BlockState state, RandomSource rand, ModelData data) { - var renderer = data.get(RENDERER); - var world = data.get(WORLD); - var pos = data.get(POS); - var modelData = data.get(MODEL_DATA); - if (renderer != null) { - return renderer.getRenderTypes(world, pos, state, rand, modelData); - } - return BakedModel.super.getRenderTypes(state, rand, data); - } - } - - public static final class Loader implements IGeometryLoader { - - public static final Loader INSTANCE = new Loader(); - private Loader() {} - - @Override - public LDLRendererModel read(JsonObject jsonObject, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - return LDLRendererModel.INSTANCE; - } - } - -} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/ATESRRendererProvider.java b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/ATESRRendererProvider.java index c7df60d03..7fea834f7 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/ATESRRendererProvider.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/ATESRRendererProvider.java @@ -2,8 +2,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.world.phys.AABB; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; @@ -16,13 +14,6 @@ import javax.annotation.Nonnull; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; - -/** - * Author: KilaBash - * Date: 2022/04/21 - * Description: - */ -@OnlyIn(Dist.CLIENT) @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ATESRRendererProvider implements BlockEntityRenderer { @@ -81,13 +72,12 @@ public boolean shouldRenderOffScreen(@Nonnull T blockEntity) { return false; } - @Override public AABB getRenderBoundingBox(T blockEntity) { IRenderer renderer = getRenderer(blockEntity); if (renderer != null) { return renderer.getRenderBoundingBox(blockEntity); } - return BlockEntityRenderer.super.getRenderBoundingBox(blockEntity); + return new AABB(blockEntity.getBlockPos()); } } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/ChunkRenderTypeSet.java b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/ChunkRenderTypeSet.java new file mode 100644 index 000000000..6959e047d --- /dev/null +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/ChunkRenderTypeSet.java @@ -0,0 +1,32 @@ +package com.lowdragmc.lowdraglib2.client.renderer; + +import net.minecraft.client.renderer.RenderType; + +import java.util.Collections; +import java.util.Iterator; + +/** + * Stub for NeoForge ChunkRenderTypeSet. + * In Fabric, the render types are typically retrieved differently or emitted directly via QuadEmitter. + */ +public class ChunkRenderTypeSet implements Iterable { + + public static ChunkRenderTypeSet all() { + return new ChunkRenderTypeSet(null); + } + + public static ChunkRenderTypeSet of(RenderType type) { + return new ChunkRenderTypeSet(type); + } + + private final RenderType type; + + private ChunkRenderTypeSet(RenderType type) { + this.type = type; + } + + @Override + public Iterator iterator() { + return Collections.singleton(type).iterator(); + } +} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/IBlockRendererProvider.java b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/IBlockRendererProvider.java index d57ce877e..ef0c138b5 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/IBlockRendererProvider.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/IBlockRendererProvider.java @@ -6,8 +6,6 @@ import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import org.jetbrains.annotations.Nullable; @@ -29,7 +27,7 @@ default int getLightMap(BlockAndTintGetter world, BlockState state, BlockPos pos } else { int i = world.getBrightness(LightLayer.SKY, pos); int j = world.getBrightness(LightLayer.BLOCK, pos); - int k = state.getLightEmission(world, pos); + int k = state.getLightEmission(); if (j < k) { j = k; } @@ -41,7 +39,6 @@ default int getLightMap(BlockAndTintGetter world, BlockState state, BlockPos pos * Provide a way to modify the model state based on the block in the world. * you can use this to rotate the model based on the block state. */ - @OnlyIn(Dist.CLIENT) default ModelState getModelState(BlockAndTintGetter world, BlockPos pos, BlockState state) { return BlockModelRotation.X0_Y0; } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/IRenderer.java b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/IRenderer.java index 0ed72c785..e50a135b8 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/IRenderer.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/IRenderer.java @@ -26,13 +26,10 @@ import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; -import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; import net.minecraft.world.phys.AABB; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -50,9 +47,6 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.client.ChunkRenderTypeSet; -import net.neoforged.neoforge.client.model.data.ModelData; -import net.neoforged.neoforge.common.util.TriState; import org.appliedenergistics.yoga.YogaEdge; import javax.annotation.Nonnull; @@ -93,8 +87,6 @@ default CompoundTag serializeWrapper() { static IRenderer deserializeWrapper(Tag tag) { return CODEC.parse(Platform.getFrozenRegistry().createSerializationContext(NbtOps.INSTANCE), tag).result().orElse(EMPTY); } - - @OnlyIn(Dist.CLIENT) default IRenderer copy() { return deserializeWrapper(serializeWrapper()); } @@ -102,7 +94,6 @@ default IRenderer copy() { /** * Render itemstack. */ - @OnlyIn(Dist.CLIENT) default void renderItem(ItemStack stack, ItemDisplayContext transformType, boolean leftHand, PoseStack poseStack, @@ -114,7 +105,6 @@ default void renderItem(ItemStack stack, /** * Render static block model. */ - @OnlyIn(Dist.CLIENT) default List renderModel(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @Nullable BlockState state, @Nullable Direction side, RandomSource rand, ModelData data, @Nullable RenderType renderType) { return Collections.emptyList(); } @@ -125,15 +115,13 @@ default List renderModel(@Nullable BlockAndTintGetter level, @Nullabl *

* By default, defers query to {@link ItemBlockRenderTypes}. */ - @OnlyIn(Dist.CLIENT) default ChunkRenderTypeSet getRenderTypes(BlockAndTintGetter level, BlockPos pos, BlockState state, RandomSource rand, ModelData modelData) { - return ItemBlockRenderTypes.getRenderLayers(state); + return com.lowdragmc.lowdraglib2.client.renderer.ChunkRenderTypeSet.of(net.minecraft.client.renderer.ItemBlockRenderTypes.getChunkRenderType(state)); } /** * Register TextureSprite here. */ - @OnlyIn(Dist.CLIENT) default void onPrepareTextureAtlas(ResourceLocation atlasName, Consumer register) { } @@ -141,15 +129,13 @@ default void onPrepareTextureAtlas(ResourceLocation atlasName, Consumer registry) { + default void onAdditionalModel(Consumer registry) { } /** * If the renderer requires event registration either {@link #onPrepareTextureAtlas} or {@link #onAdditionalModel}, call this method in the constructor. */ - @OnlyIn(Dist.CLIENT) default void registerEvent() { EVENT_REGISTERS.add(this); } @@ -157,7 +143,6 @@ default void registerEvent() { /** * Does the block entity have the {@link net.minecraft.client.renderer.blockentity.BlockEntityRenderer}. */ - @OnlyIn(Dist.CLIENT) default boolean hasBlockEntityRenderer(BlockEntity blockEntity) { return false; } @@ -165,7 +150,6 @@ default boolean hasBlockEntityRenderer(BlockEntity blockEntity) { /** * Does the block entity render offscreen {@link net.minecraft.client.renderer.blockentity.BlockEntityRenderer#shouldRenderOffScreen(BlockEntity)}. */ - @OnlyIn(Dist.CLIENT) default boolean shouldRenderOffScreen(BlockEntity blockEntity) { return false; } @@ -173,7 +157,6 @@ default boolean shouldRenderOffScreen(BlockEntity blockEntity) { /** * Get the view distance for TESR. */ - @OnlyIn(Dist.CLIENT) default int getViewDistance() { return 64; } @@ -181,7 +164,6 @@ default int getViewDistance() { /** * Should the TESR {@link net.minecraft.client.renderer.blockentity.BlockEntityRenderer} render. */ - @OnlyIn(Dist.CLIENT) default boolean shouldRender(BlockEntity blockEntity, Vec3 cameraPos) { return Vec3.atCenterOf(blockEntity.getBlockPos()).closerThan(cameraPos, this.getViewDistance()); } @@ -189,7 +171,6 @@ default boolean shouldRender(BlockEntity blockEntity, Vec3 cameraPos) { /** * Render the TESR {@link net.minecraft.client.renderer.blockentity.BlockEntityRenderer}. */ - @OnlyIn(Dist.CLIENT) default void render(BlockEntity blockEntity, float partialTicks, PoseStack stack, MultiBufferSource buffer, int combinedLight, int combinedOverlay) { } @@ -197,7 +178,6 @@ default void render(BlockEntity blockEntity, float partialTicks, PoseStack stack /** * Get the particle texture. */ - @OnlyIn(Dist.CLIENT) @Nonnull default TextureAtlasSprite getParticleTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, ModelData modelData) { return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(MissingTextureAtlasSprite.getLocation()); @@ -206,7 +186,6 @@ default TextureAtlasSprite getParticleTexture(@Nullable BlockAndTintGetter level /** * Whether to apply AO for the model. */ - @OnlyIn(Dist.CLIENT) default TriState useAO() { return TriState.FALSE; } @@ -214,7 +193,6 @@ default TriState useAO() { /** * Whether to apply AO for the model. */ - @OnlyIn(Dist.CLIENT) default TriState useAO(BlockState state, ModelData modelData, RenderType renderType) { return useAO(); } @@ -222,7 +200,6 @@ default TriState useAO(BlockState state, ModelData modelData, RenderType renderT /** * Whether to apply block light during the itemstack rendering. */ - @OnlyIn(Dist.CLIENT) default boolean useBlockLight(ItemStack stack) { return false; } @@ -230,7 +207,6 @@ default boolean useBlockLight(ItemStack stack) { /** * Should we rebake quads for mcmeta data? */ - @OnlyIn(Dist.CLIENT) default boolean reBakeCustomQuads() { return false; } @@ -238,7 +214,6 @@ default boolean reBakeCustomQuads() { /** * Offset for rebake's quads sides while {@link #reBakeCustomQuads()} return true. */ - @OnlyIn(Dist.CLIENT) default float reBakeCustomQuadsOffset() { return 0; } @@ -246,7 +221,6 @@ default float reBakeCustomQuadsOffset() { /** * Whether to apply gui 3d transform during itemstack rendering. */ - @OnlyIn(Dist.CLIENT) default boolean isGui3d() { return true; } @@ -258,12 +232,9 @@ default boolean isGui3d() { * * @return an appropriately sized {@link AABB} for the {@link BlockEntityRenderer} */ - @OnlyIn(Dist.CLIENT) default AABB getRenderBoundingBox(BlockEntity blockEntity) { return new AABB(blockEntity.getBlockPos()); } - - @OnlyIn(Dist.CLIENT) default Scene createPreviewScene() { var level = new TrackedDummyWorld(); level.addBlock(BlockPos.ZERO, BlockInfo.fromBlock(RendererBlock.BLOCK)); @@ -296,13 +267,11 @@ default Scene createPreviewScene() { /** * Preview of the renderer. */ - @OnlyIn(Dist.CLIENT) default void createPreview(ConfiguratorGroup father) { father.addConfigurators(new Configurator("ldlib.gui.editor.group.preview").addChild(createPreviewScene())); } @Override - @OnlyIn(Dist.CLIENT) default void buildConfigurator(ConfiguratorGroup father) { createPreview(father); IConfigurable.super.buildConfigurator(father); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/ModelData.java b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/ModelData.java new file mode 100644 index 000000000..631133697 --- /dev/null +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/ModelData.java @@ -0,0 +1,43 @@ +package com.lowdragmc.lowdraglib2.client.renderer; + +import java.util.IdentityHashMap; +import java.util.Map; + +/** + * A Fabric proxy for NeoForge's ModelData system. + */ +public class ModelData { + public static final ModelData EMPTY = new ModelData(Map.of()); + + private final Map, Object> properties; + + private ModelData(Map, Object> properties) { + this.properties = properties; + } + + @SuppressWarnings("unchecked") + public T get(ModelProperty prop) { + return (T) properties.get(prop); + } + + public boolean has(ModelProperty prop) { + return properties.containsKey(prop); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private final Map, Object> properties = new IdentityHashMap<>(); + + public Builder with(ModelProperty prop, T data) { + properties.put(prop, data); + return this; + } + + public ModelData build() { + return new ModelData(properties); + } + } +} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/ModelProperty.java b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/ModelProperty.java new file mode 100644 index 000000000..4760d3680 --- /dev/null +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/ModelProperty.java @@ -0,0 +1,11 @@ +package com.lowdragmc.lowdraglib2.client.renderer; + +import java.util.IdentityHashMap; +import java.util.Map; + +/** + * A Fabric proxy for NeoForge's ModelData/ModelProperty system. + * This avoids rewriting all the block renderers that depend on it. + */ +public class ModelProperty { +} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/TriState.java b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/TriState.java new file mode 100644 index 000000000..0c6eb75df --- /dev/null +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/TriState.java @@ -0,0 +1,14 @@ +package com.lowdragmc.lowdraglib2.client.renderer; + +/** + * Stub for NeoForge TriState. + */ +public enum TriState { + TRUE, + FALSE, + DEFAULT; + + public boolean get() { + return this == TRUE; + } +} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/block/RendererBlockEntity.java b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/block/RendererBlockEntity.java index dc69659db..f541b79df 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/block/RendererBlockEntity.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/block/RendererBlockEntity.java @@ -14,6 +14,6 @@ public class RendererBlockEntity extends BlockEntity { IRenderer renderer = IRenderer.EMPTY; public RendererBlockEntity(BlockPos pos, BlockState blockState) { - super(CommonProxy.RENDERER_BE_TYPE.get(), pos, blockState); + super(CommonProxy.RENDERER_BE_TYPE, pos, blockState); } } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/block/RendererBlockRenderer.java b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/block/RendererBlockRenderer.java index ee979f601..f238214d3 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/block/RendererBlockRenderer.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/block/RendererBlockRenderer.java @@ -1,6 +1,8 @@ package com.lowdragmc.lowdraglib2.client.renderer.block; +import com.lowdragmc.lowdraglib2.client.renderer.ChunkRenderTypeSet; import com.lowdragmc.lowdraglib2.client.renderer.IRenderer; +import com.lowdragmc.lowdraglib2.client.renderer.ModelData; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -16,10 +18,6 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.client.ChunkRenderTypeSet; -import net.neoforged.neoforge.client.model.data.ModelData; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -40,13 +38,11 @@ public Optional getMachine(@Nullable BlockAndTintGetter lev } @Override - @OnlyIn(Dist.CLIENT) public void renderItem(ItemStack stack, ItemDisplayContext transformType, boolean leftHand, PoseStack poseStack, MultiBufferSource buffer, int combinedLight, int combinedOverlay, BakedModel model) { throw new UnsupportedOperationException("Not implemented yet"); } @Override - @OnlyIn(Dist.CLIENT) public List renderModel(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @Nullable BlockState state, @Nullable Direction side, RandomSource rand, ModelData data, @Nullable RenderType renderType) { return getMachine(level, pos) .map(machine -> machine.getRenderer().renderModel(level, pos, state, side, rand, data, renderType)) @@ -54,7 +50,6 @@ public List renderModel(@Nullable BlockAndTintGetter level, @Nullable } @Override - @OnlyIn(Dist.CLIENT) public ChunkRenderTypeSet getRenderTypes(BlockAndTintGetter level, BlockPos pos, BlockState state, RandomSource rand, ModelData modelData) { return getMachine(level, pos) .map(machine -> machine.getRenderer().getRenderTypes(level, pos, state, rand, modelData)) @@ -63,7 +58,6 @@ public ChunkRenderTypeSet getRenderTypes(BlockAndTintGetter level, BlockPos pos, @Override @NotNull - @OnlyIn(Dist.CLIENT) public TextureAtlasSprite getParticleTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, ModelData modelData) { return getMachine(level, pos) .map(machine -> machine.getRenderer().getParticleTexture(level, pos, modelData)) @@ -71,25 +65,21 @@ public TextureAtlasSprite getParticleTexture(@Nullable BlockAndTintGetter level, } @Override - @OnlyIn(Dist.CLIENT) public boolean hasBlockEntityRenderer(BlockEntity blockEntity) { return getMachine(blockEntity).map(machine -> machine.getRenderer().hasBlockEntityRenderer(blockEntity)).orElse(false); } @Override - @OnlyIn(Dist.CLIENT) public boolean shouldRenderOffScreen(BlockEntity blockEntity) { return getMachine(blockEntity).map(machine -> machine.getRenderer().shouldRenderOffScreen(blockEntity)).orElse(false); } @Override - @OnlyIn(Dist.CLIENT) public boolean shouldRender(BlockEntity blockEntity, Vec3 cameraPos) { return getMachine(blockEntity).map(machine -> machine.getRenderer().shouldRender(blockEntity, cameraPos)).orElseGet(() -> IRenderer.super.shouldRender(blockEntity, cameraPos)); } @Override - @OnlyIn(Dist.CLIENT) public void render(BlockEntity blockEntity, float partialTicks, PoseStack stack, MultiBufferSource buffer, int combinedLight, int combinedOverlay) { getMachine(blockEntity).ifPresent(machine -> machine.getRenderer().render(blockEntity, partialTicks, stack, buffer, combinedLight, combinedOverlay)); } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/impl/IModelRenderer.java b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/impl/IModelRenderer.java index 78d11303b..a2211ca11 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/impl/IModelRenderer.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/impl/IModelRenderer.java @@ -2,9 +2,7 @@ import com.lowdragmc.lowdraglib2.LDLib2; import com.lowdragmc.lowdraglib2.client.model.ModelFactory; -import com.lowdragmc.lowdraglib2.client.renderer.IBlockRendererProvider; -import com.lowdragmc.lowdraglib2.client.renderer.IItemRendererProvider; -import com.lowdragmc.lowdraglib2.client.renderer.IRenderer; +import com.lowdragmc.lowdraglib2.client.renderer.*; import com.lowdragmc.lowdraglib2.configurator.ui.Configurator; import com.lowdragmc.lowdraglib2.configurator.ui.ConfiguratorGroup; import com.lowdragmc.lowdraglib2.configurator.annotation.ConfigSetter; @@ -16,8 +14,6 @@ import dev.vfyjxf.taffy.style.AlignItems; import lombok.Getter; import net.minecraft.client.renderer.RenderType; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -31,9 +27,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.client.ChunkRenderTypeSet; -import net.neoforged.neoforge.client.model.data.ModelData; -import net.neoforged.neoforge.common.util.TriState; import javax.annotation.Nonnull; import org.jetbrains.annotations.Nullable; @@ -47,14 +40,9 @@ public class IModelRenderer implements IRenderer { @Getter @Configurable protected ResourceLocation modelLocation; - - @OnlyIn(Dist.CLIENT) @Nullable protected volatile BakedModel itemModel; - @OnlyIn(Dist.CLIENT) private volatile boolean itemModelInitialized; - - @OnlyIn(Dist.CLIENT) protected Map modelCaches; protected IModelRenderer() { @@ -88,23 +76,19 @@ public void afterDeserialize() { } @Override - @OnlyIn(Dist.CLIENT) @Nonnull public TextureAtlasSprite getParticleTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, ModelData modelData) { BakedModel model = getItemBakedModel(); if (model == null) { return IRenderer.super.getParticleTexture(level, pos, modelData); } - return model.getParticleIcon(modelData); + return model.getParticleIcon(); } - - @OnlyIn(Dist.CLIENT) protected UnbakedModel getModel() { return ModelFactory.getUnBakedModel(modelLocation); } @Override - @OnlyIn(Dist.CLIENT) public void renderItem(ItemStack stack, ItemDisplayContext transformType, boolean leftHand, PoseStack poseStack, @@ -119,7 +103,6 @@ public void renderItem(ItemStack stack, } @Override - @OnlyIn(Dist.CLIENT) public boolean useBlockLight(ItemStack stack) { var model = getItemBakedModel(stack); if (model != null) { @@ -129,7 +112,6 @@ public boolean useBlockLight(ItemStack stack) { } @Override - @OnlyIn(Dist.CLIENT) public TriState useAO() { var model = getItemBakedModel(); if (model != null) { @@ -144,22 +126,18 @@ public TriState useAO(BlockState state, ModelData modelData, RenderType renderTy } @Override - @OnlyIn(Dist.CLIENT) public List renderModel(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @Nullable BlockState state, @Nullable Direction side, RandomSource rand, ModelData data, @Nullable RenderType renderType) { var ibakedmodel = getBlockBakedModel(level, pos, state); if (ibakedmodel == null) return Collections.emptyList(); - return ibakedmodel.getQuads(state, side, rand, data, renderType); + return ibakedmodel.getQuads(state, side, rand); } @Override - @OnlyIn(Dist.CLIENT) public ChunkRenderTypeSet getRenderTypes(BlockAndTintGetter level, BlockPos pos, BlockState state, RandomSource rand, ModelData modelData) { var ibakedmodel = getBlockBakedModel(level, pos, state); - if (ibakedmodel != null) return ibakedmodel.getRenderTypes(state, rand, modelData); + if (ibakedmodel != null) return com.lowdragmc.lowdraglib2.client.renderer.ChunkRenderTypeSet.of(net.minecraft.client.renderer.ItemBlockRenderTypes.getChunkRenderType(state)); return IRenderer.super.getRenderTypes(level, pos, state, rand, modelData); } - - @OnlyIn(Dist.CLIENT) @Nullable protected BakedModel getItemBakedModel() { if (!itemModelInitialized) { @@ -176,14 +154,10 @@ protected BakedModel getItemBakedModel() { } return itemModel; } - - @OnlyIn(Dist.CLIENT) @Nullable protected BakedModel getItemBakedModel(ItemStack itemStack) { return getItemBakedModel(); } - - @OnlyIn(Dist.CLIENT) @Nullable protected BakedModel getBlockBakedModel(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @Nullable BlockState state) { if (level != null && pos != null && state != null && state.getBlock() instanceof IBlockRendererProvider provider) { @@ -200,22 +174,17 @@ protected BakedModel getBlockBakedModel(@Nullable BlockAndTintGetter level, @Nul this::materialMapping, ms)); } - - - @OnlyIn(Dist.CLIENT) protected TextureAtlasSprite materialMapping(Material material) { return material.sprite(); } @Override - @OnlyIn(Dist.CLIENT) - public void onAdditionalModel(Consumer registry) { - registry.accept(ModelResourceLocation.standalone(modelLocation)); + public void onAdditionalModel(Consumer registry) { + registry.accept(modelLocation); clearCache(); } @Override - @OnlyIn(Dist.CLIENT) public boolean isGui3d() { var model = getItemBakedModel(); if (model == null) { @@ -229,8 +198,6 @@ public void updateModelWithoutReloadingResource(ResourceLocation modelLocation) this.modelLocation = modelLocation; clearCache(); } - - @OnlyIn(Dist.CLIENT) public void updateModelWithReloadingResource(ResourceLocation modelLocation) { updateModelWithoutReloadingResource(modelLocation); var unBakedModel = getModel(); @@ -240,7 +207,6 @@ public void updateModelWithReloadingResource(ResourceLocation modelLocation) { } @Override - @OnlyIn(Dist.CLIENT) public void buildConfigurator(ConfiguratorGroup father) { IRenderer.super.buildConfigurator(father); var buttonConfigurator = new Configurator(); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/impl/RendererGroup.java b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/impl/RendererGroup.java index 0b60ad6d2..a65f3175f 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/impl/RendererGroup.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/impl/RendererGroup.java @@ -1,6 +1,9 @@ package com.lowdragmc.lowdraglib2.client.renderer.impl; +import com.lowdragmc.lowdraglib2.client.renderer.ChunkRenderTypeSet; import com.lowdragmc.lowdraglib2.client.renderer.IRenderer; +import com.lowdragmc.lowdraglib2.client.renderer.ModelData; +import com.lowdragmc.lowdraglib2.client.renderer.TriState; import com.lowdragmc.lowdraglib2.configurator.annotation.Configurable; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; import com.mojang.blaze3d.vertex.PoseStack; @@ -20,11 +23,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.client.ChunkRenderTypeSet; -import net.neoforged.neoforge.client.model.data.ModelData; -import net.neoforged.neoforge.common.util.TriState; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -57,7 +55,6 @@ public RendererGroup copy() { } @Override - @OnlyIn(Dist.CLIENT) public void renderItem(ItemStack stack, ItemDisplayContext transformType, boolean leftHand, PoseStack poseStack, MultiBufferSource buffer, int combinedLight, int combinedOverlay, BakedModel model) { for (IRenderer renderer : renderers) { renderer.renderItem(stack, transformType, leftHand, poseStack, buffer, combinedLight, combinedOverlay, model); @@ -65,7 +62,6 @@ public void renderItem(ItemStack stack, ItemDisplayContext transformType, boolea } @Override - @OnlyIn(Dist.CLIENT) public List renderModel(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @Nullable BlockState state, @Nullable Direction side, RandomSource rand, ModelData data, @Nullable RenderType renderType) { var result = new ArrayList(); for (IRenderer renderer : renderers) { @@ -75,13 +71,11 @@ public List renderModel(@Nullable BlockAndTintGetter level, @Nullable } @Override - @OnlyIn(Dist.CLIENT) public ChunkRenderTypeSet getRenderTypes(BlockAndTintGetter level, BlockPos pos, BlockState state, RandomSource rand, ModelData modelData) { - return ChunkRenderTypeSet.union(Arrays.stream(renderers).map(renderer -> renderer.getRenderTypes(level, pos, state, rand, modelData)).toList()); + return ChunkRenderTypeSet.all(); } @Override - @OnlyIn(Dist.CLIENT) public boolean hasBlockEntityRenderer(BlockEntity blockEntity) { for (IRenderer renderer : renderers) { if (renderer.hasBlockEntityRenderer(blockEntity)) @@ -91,7 +85,6 @@ public boolean hasBlockEntityRenderer(BlockEntity blockEntity) { } @Override - @OnlyIn(Dist.CLIENT) public boolean shouldRenderOffScreen(BlockEntity blockEntity) { for (IRenderer renderer : renderers) { if (renderer.shouldRenderOffScreen(blockEntity)) @@ -101,7 +94,6 @@ public boolean shouldRenderOffScreen(BlockEntity blockEntity) { } @Override - @OnlyIn(Dist.CLIENT) public boolean shouldRender(BlockEntity blockEntity, Vec3 cameraPos) { for (IRenderer renderer : renderers) { if (renderer.shouldRender(blockEntity, cameraPos)) @@ -111,7 +103,6 @@ public boolean shouldRender(BlockEntity blockEntity, Vec3 cameraPos) { } @Override - @OnlyIn(Dist.CLIENT) public void render(BlockEntity blockEntity, float partialTicks, PoseStack stack, MultiBufferSource buffer, int combinedLight, int combinedOverlay) { for (IRenderer renderer : renderers) { renderer.render(blockEntity, partialTicks, stack, buffer, combinedLight, combinedOverlay); @@ -119,7 +110,6 @@ public void render(BlockEntity blockEntity, float partialTicks, PoseStack stack, } @Override - @OnlyIn(Dist.CLIENT) public @NotNull TextureAtlasSprite getParticleTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, ModelData modelData) { for (IRenderer renderer : renderers) { return renderer.getParticleTexture(level, pos, modelData); @@ -128,7 +118,6 @@ public void render(BlockEntity blockEntity, float partialTicks, PoseStack stack, } @Override - @OnlyIn(Dist.CLIENT) public TriState useAO() { for (IRenderer renderer : renderers) { return renderer.useAO(); @@ -137,7 +126,6 @@ public TriState useAO() { } @Override - @OnlyIn(Dist.CLIENT) public TriState useAO(BlockState state, ModelData modelData, RenderType renderType) { for (IRenderer renderer : renderers) { return renderer.useAO(state, modelData, renderType); @@ -146,7 +134,6 @@ public TriState useAO(BlockState state, ModelData modelData, RenderType renderTy } @Override - @OnlyIn(Dist.CLIENT) public boolean useBlockLight(ItemStack stack) { for (IRenderer renderer : renderers) { return renderer.useBlockLight(stack); @@ -155,7 +142,6 @@ public boolean useBlockLight(ItemStack stack) { } @Override - @OnlyIn(Dist.CLIENT) public boolean reBakeCustomQuads() { for (IRenderer renderer : renderers) { if (renderer.reBakeCustomQuads()) @@ -166,7 +152,6 @@ public boolean reBakeCustomQuads() { @Override - @OnlyIn(Dist.CLIENT) public boolean isGui3d() { for (IRenderer renderer : renderers) { return renderer.isGui3d(); @@ -175,7 +160,6 @@ public boolean isGui3d() { } @Override - @OnlyIn(Dist.CLIENT) public AABB getRenderBoundingBox(BlockEntity blockEntity) { var result = new AABB(blockEntity.getBlockPos()); for (IRenderer renderer : renderers) { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/impl/UIResourceRenderer.java b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/impl/UIResourceRenderer.java index 71cb646a2..59799b37d 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/impl/UIResourceRenderer.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/renderer/impl/UIResourceRenderer.java @@ -1,6 +1,9 @@ package com.lowdragmc.lowdraglib2.client.renderer.impl; +import com.lowdragmc.lowdraglib2.client.renderer.ChunkRenderTypeSet; import com.lowdragmc.lowdraglib2.client.renderer.IRenderer; +import com.lowdragmc.lowdraglib2.client.renderer.ModelData; +import com.lowdragmc.lowdraglib2.client.renderer.TriState; import com.lowdragmc.lowdraglib2.editor.resource.BuiltinPath; import com.lowdragmc.lowdraglib2.editor.resource.IRendererResource; import com.lowdragmc.lowdraglib2.editor.resource.IResourcePath; @@ -15,7 +18,6 @@ import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; @@ -27,11 +29,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.client.ChunkRenderTypeSet; -import net.neoforged.neoforge.client.model.data.ModelData; -import net.neoforged.neoforge.common.util.TriState; + import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -65,110 +63,92 @@ public UIResourceRenderer copy() { } @Override - @OnlyIn(Dist.CLIENT) public void renderItem(ItemStack stack, ItemDisplayContext transformType, boolean leftHand, PoseStack poseStack, MultiBufferSource buffer, int combinedLight, int combinedOverlay, BakedModel model) { getInternalRenderer().renderItem(stack, transformType, leftHand, poseStack, buffer, combinedLight, combinedOverlay, model); } @Override - @OnlyIn(Dist.CLIENT) - public List renderModel(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @Nullable BlockState state, @Nullable Direction side, RandomSource rand, ModelData data, @Nullable RenderType renderType) { + public List renderModel(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @Nullable BlockState state, @Nullable Direction side, RandomSource rand, ModelData data, @Nullable RenderType renderType) { return getInternalRenderer().renderModel(level, pos, state, side, rand, data, renderType); } @Override - @OnlyIn(Dist.CLIENT) public void onPrepareTextureAtlas(ResourceLocation atlasName, Consumer register) { getInternalRenderer().onPrepareTextureAtlas(atlasName, register); } @Override - @OnlyIn(Dist.CLIENT) - public void onAdditionalModel(Consumer registry) { + public void onAdditionalModel(Consumer registry) { getInternalRenderer().onAdditionalModel(registry); } @Override - @OnlyIn(Dist.CLIENT) public boolean hasBlockEntityRenderer(BlockEntity blockEntity) { return getInternalRenderer().hasBlockEntityRenderer(blockEntity); } @Override - @OnlyIn(Dist.CLIENT) public boolean shouldRenderOffScreen(BlockEntity blockEntity) { return getInternalRenderer().shouldRenderOffScreen(blockEntity); } @Override - @OnlyIn(Dist.CLIENT) public int getViewDistance() { return getInternalRenderer().getViewDistance(); } @Override - @OnlyIn(Dist.CLIENT) public boolean shouldRender(BlockEntity blockEntity, Vec3 cameraPos) { return getInternalRenderer().shouldRender(blockEntity, cameraPos); } @Override - @OnlyIn(Dist.CLIENT) public void render(BlockEntity blockEntity, float partialTicks, PoseStack stack, MultiBufferSource buffer, int combinedLight, int combinedOverlay) { getInternalRenderer().render(blockEntity, partialTicks, stack, buffer, combinedLight, combinedOverlay); } @NotNull @Override - @OnlyIn(Dist.CLIENT) public TextureAtlasSprite getParticleTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, ModelData modelData) { return getInternalRenderer().getParticleTexture(level, pos, modelData); } @Override - @OnlyIn(Dist.CLIENT) public TriState useAO() { return getInternalRenderer().useAO(); } @Override - @OnlyIn(Dist.CLIENT) public TriState useAO(BlockState state, ModelData data, RenderType renderType) { return getInternalRenderer().useAO(state, data, renderType); } @Override - @OnlyIn(Dist.CLIENT) public boolean useBlockLight(ItemStack stack) { return getInternalRenderer().useBlockLight(stack); } @Override - @OnlyIn(Dist.CLIENT) public boolean reBakeCustomQuads() { return getInternalRenderer().reBakeCustomQuads(); } @Override - @OnlyIn(Dist.CLIENT) public float reBakeCustomQuadsOffset() { return getInternalRenderer().reBakeCustomQuadsOffset(); } @Override - @OnlyIn(Dist.CLIENT) public boolean isGui3d() { return getInternalRenderer().isGui3d(); } @Override - @OnlyIn(Dist.CLIENT) public ChunkRenderTypeSet getRenderTypes(BlockAndTintGetter level, BlockPos pos, BlockState state, RandomSource rand, ModelData modelData) { return getInternalRenderer().getRenderTypes(level, pos, state, rand, modelData); } @Override - @OnlyIn(Dist.CLIENT) public AABB getRenderBoundingBox(BlockEntity blockEntity) { return getInternalRenderer().getRenderBoundingBox(blockEntity); } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/scene/CameraEntity.java b/src/main/java/com/lowdragmc/lowdraglib2/client/scene/CameraEntity.java index 4448f215c..3fd3b52ef 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/scene/CameraEntity.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/scene/CameraEntity.java @@ -16,6 +16,9 @@ * @author KilaBash * @date 2022/06/05 * @implNote CameraEntity, + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ public class CameraEntity extends Entity { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/scene/FBOWorldSceneRenderer.java b/src/main/java/com/lowdragmc/lowdraglib2/client/scene/FBOWorldSceneRenderer.java index 37f189809..d6fc9aab2 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/scene/FBOWorldSceneRenderer.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/scene/FBOWorldSceneRenderer.java @@ -7,8 +7,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import lombok.Getter; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.core.BlockPos; @@ -20,18 +18,6 @@ import javax.annotation.Nonnull; import org.jetbrains.annotations.Nullable; - -/** - * Created with IntelliJ IDEA. - * - * @Author: KilaBash - * @Date: 2021/08/23 - * @Description: It looks similar to {@link ImmediateWorldSceneRenderer}, but totally different. - * It uses FBO and is more universality and efficient(X). - * FBO can be rendered anywhere more flexibly, not just in the GUI. - * If you have scene rendering needs, you will love this FBO renderer. - */ -@OnlyIn(Dist.CLIENT) public class FBOWorldSceneRenderer extends WorldSceneRenderer { @Getter private int resolutionWidth = 1080; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/scene/ImmediateWorldSceneRenderer.java b/src/main/java/com/lowdragmc/lowdraglib2/client/scene/ImmediateWorldSceneRenderer.java index 831982451..525506104 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/scene/ImmediateWorldSceneRenderer.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/scene/ImmediateWorldSceneRenderer.java @@ -3,20 +3,9 @@ import com.lowdragmc.lowdraglib2.math.PositionedRect; import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import net.minecraft.client.Minecraft; import net.minecraft.world.level.Level; import org.lwjgl.opengl.GL11; - -/** - * Created with IntelliJ IDEA. - * @Author: KilaBash - * @Date: 2021/8/24 - * @Description: Real-time rendering renderer. - * If you need to render scene as a texture, use the FBO {@link FBOWorldSceneRenderer}. - */ -@OnlyIn(Dist.CLIENT) public class ImmediateWorldSceneRenderer extends WorldSceneRenderer { public ImmediateWorldSceneRenderer(Level world) { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/scene/ParticleManager.java b/src/main/java/com/lowdragmc/lowdraglib2/client/scene/ParticleManager.java index da88fab57..b2dd8776b 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/scene/ParticleManager.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/scene/ParticleManager.java @@ -7,8 +7,6 @@ import com.mojang.blaze3d.vertex.BufferUploader; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.particle.Particle; @@ -25,8 +23,10 @@ * @author KilaBash * @date 2022/06/05 * @implNote ParticleManager, for LParticle + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ -@OnlyIn(Dist.CLIENT) public class ParticleManager { private static final List RENDER_ORDER = ImmutableList.of(ParticleRenderType.TERRAIN_SHEET, ParticleRenderType.PARTICLE_SHEET_OPAQUE, ParticleRenderType.PARTICLE_SHEET_LIT, ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT, ParticleRenderType.CUSTOM); protected final Queue waitToAdded = Queues.newArrayDeque(); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/scene/WorldSceneRenderer.java b/src/main/java/com/lowdragmc/lowdraglib2/client/scene/WorldSceneRenderer.java index 0e2a15677..4bbd4b90a 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/scene/WorldSceneRenderer.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/scene/WorldSceneRenderer.java @@ -14,8 +14,6 @@ import lombok.experimental.Accessors; import net.minecraft.client.gui.screens.LoadingOverlay; import net.minecraft.client.particle.ParticleRenderType; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.*; @@ -56,8 +54,10 @@ * @author KilaBash * @date 2022/05/25 * @implNote render a scene, through VBO compilation scene, greatly optimize rendering performance. + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ -@OnlyIn(Dist.CLIENT) @Accessors(chain = true) public abstract class WorldSceneRenderer { protected static final FloatBuffer MODELVIEW_MATRIX_BUFFER = ByteBuffer.allocateDirect(16 * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); @@ -409,7 +409,7 @@ protected void drawWorld() { poseStack.pushPose(); poseStack.setIdentity(); poseStack.translate(cameraEntity.getX(), cameraEntity.getY(), cameraEntity.getZ()); - particleManager.render(poseStack, camera, particleTicks, type -> !type.isTranslucent()); + particleManager.render(poseStack, camera, particleTicks, type -> true); poseStack.popPose(); } } @@ -446,7 +446,7 @@ protected void drawWorld() { @Nonnull PoseStack poseStack = new PoseStack(); poseStack.setIdentity(); poseStack.translate(cameraEntity.getX(), cameraEntity.getY(), cameraEntity.getZ()); - particleManager.render(poseStack, camera, particleTicks, ParticleRenderType::isTranslucent); + particleManager.render(poseStack, camera, particleTicks, type -> true); } if (afterWorldRender != null) { @@ -549,7 +549,7 @@ private void renderCacheBuffer(Minecraft mc, MultiBufferSource.BufferSource buff poseStack.pushPose(); poseStack.setIdentity(); poseStack.translate(cameraEntity.getX(), cameraEntity.getY(), cameraEntity.getZ()); - particleManager.render(poseStack, camera, particleTicks, type -> !type.isTranslucent()); + particleManager.render(poseStack, camera, particleTicks, type -> true); poseStack.popPose(); } } @@ -640,14 +640,14 @@ private void renderBlocks(PoseStack poseStack, BlockRenderDispatcher brd, Render if (block == Blocks.AIR) continue; if (state.getRenderShape() != INVISIBLE) { var model = brd.getBlockModel(state); - var modelData = world.getModelData(pos); - modelData = model.getModelData(world, pos, state, modelData); + var modelData = com.lowdragmc.lowdraglib2.client.renderer.ModelData.EMPTY; + modelData = modelData; randomSource.setSeed(state.getSeed(pos)); - modelData = model.getModelData(world, pos, state, modelData); - if (model.getRenderTypes(state, randomSource, modelData).contains(layer)) { + modelData = modelData; + if (java.util.Collections.singleton(layer).contains(layer)) { poseStack.pushPose(); poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - brd.renderBatched(state, pos, world, poseStack, wrapperBuffer, false, randomSource, modelData, layer); + brd.renderBatched(state, pos, world, poseStack, wrapperBuffer, false, randomSource); poseStack.popPose(); } } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/HDRTarget.java b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/HDRTarget.java index 72b515e95..be20e70a1 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/HDRTarget.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/HDRTarget.java @@ -6,12 +6,8 @@ import com.mojang.blaze3d.systems.RenderSystem; import lombok.Getter; import net.minecraft.client.Minecraft; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.common.NeoForgeConfig; -import org.lwjgl.opengl.GL30; -@OnlyIn(Dist.CLIENT) +import org.lwjgl.opengl.GL30; public class HDRTarget extends RenderTarget { @Getter private int attachedDepthTexture = -1; @@ -45,7 +41,7 @@ public void createBuffers(int width, int height, boolean clearError) { GlStateManager._texParameter(GL30.GL_TEXTURE_2D, GL30.GL_TEXTURE_COMPARE_MODE, GL30.GL_NONE); GlStateManager._texParameter(GL30.GL_TEXTURE_2D, GL30.GL_TEXTURE_WRAP_S, GL30.GL_CLAMP_TO_EDGE); GlStateManager._texParameter(GL30.GL_TEXTURE_2D, GL30.GL_TEXTURE_WRAP_T, GL30.GL_CLAMP_TO_EDGE); - if (!isStencilEnabled()) + if (!false) GlStateManager._texImage2D(GL30.GL_TEXTURE_2D, 0, GL30.GL_DEPTH_COMPONENT, this.width, this.height, 0, GL30.GL_DEPTH_COMPONENT, GL30.GL_FLOAT, null); else GlStateManager._texImage2D(GL30.GL_TEXTURE_2D, 0, GL30.GL_DEPTH32F_STENCIL8, this.width, this.height, 0, org.lwjgl.opengl.GL30.GL_DEPTH_STENCIL, GL30.GL_FLOAT_32_UNSIGNED_INT_24_8_REV, null); @@ -60,8 +56,8 @@ public void createBuffers(int width, int height, boolean clearError) { GlStateManager._glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL30.GL_TEXTURE_2D, this.colorTextureId, 0); if (this.useDepth) { attachDepthBufferInternal(this.depthBufferId, - isStencilEnabled(), - NeoForgeConfig.CLIENT.useCombinedDepthStencilAttachment.get()); + false, + false); } this.attachedDepthTexture = -1; @@ -101,7 +97,7 @@ public void attachDepthBuffer(int depthTexture) { } public void attachDepthBuffer(RenderTarget srcTarget) { - attachDepthBufferInternal(srcTarget.getDepthTextureId(), srcTarget.isStencilEnabled(), NeoForgeConfig.CLIENT.useCombinedDepthStencilAttachment.get()); + attachDepthBufferInternal(srcTarget.getDepthTextureId(), false, false); } public void attachDepthBufferInternal(int depthTexture, boolean useStencil, boolean useCombinedDepthStencil) { @@ -124,8 +120,8 @@ public boolean hasOtherAttachedDepthTexture() { public void restoreDepthTexture() { if (hasOtherAttachedDepthTexture()) { attachDepthBufferInternal(this.depthBufferId, - isStencilEnabled(), - NeoForgeConfig.CLIENT.useCombinedDepthStencilAttachment.get()); + false, + false); } } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDLibRenderTypes.java b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDLibRenderTypes.java index fe7222a12..013353a21 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDLibRenderTypes.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDLibRenderTypes.java @@ -6,13 +6,9 @@ import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import java.util.OptionalDouble; import java.util.function.Function; - -@OnlyIn(Dist.CLIENT) public class LDLibRenderTypes extends RenderType { private static final RenderType POSITION_COLOR_NO_DEPTH = create("position_color_no_depth", DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLES, 256, false, false, diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDLibShaders.java b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDLibShaders.java index 0718e3872..10040ee14 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDLibShaders.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDLibShaders.java @@ -7,11 +7,9 @@ import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.blaze3d.vertex.VertexFormatElement; import lombok.Getter; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.resources.ResourceLocation; -import net.neoforged.neoforge.client.event.RegisterShadersEvent; + import org.lwjgl.opengl.GL; import java.io.IOException; @@ -22,8 +20,6 @@ import java.util.regex.Pattern; import static com.mojang.blaze3d.vertex.VertexFormatElement.POSITION; - -@OnlyIn(Dist.CLIENT) public class LDLibShaders { public static final Pattern REGEX_VERSION = Pattern.compile( "(#(?:/\\*(?:[^*]|\\*+[^*/])*\\*+/|\\h)*version(?:/\\*(?:[^*]|\\*+[^*/])*\\*+/|\\h)*(\\d+))\\b" @@ -108,45 +104,33 @@ public static Shader load(Shader.ShaderType shaderType, ResourceLocation resourc /** * the vertex format for HSB color, three four of float */ - public static final VertexFormatElement HSB_Alpha = VertexFormatElement.register(VertexFormatElement.findNextId(), 0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.COLOR, 4); - public static final VertexFormatElement AA = VertexFormatElement.register(VertexFormatElement.findNextId(), 0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.COLOR, 1); + public static final VertexFormatElement HSB_Alpha = VertexFormatElement.register(14, 0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.COLOR, 4); + public static final VertexFormatElement AA = VertexFormatElement.register(15, 0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.COLOR, 1); public static VertexFormat HSB_VERTEX_FORMAT = VertexFormat.builder() .add("Position", POSITION) .add("HSB_ALPHA", HSB_Alpha) .build(); - public static void registerShaders(RegisterShadersEvent registerShadersEvent) { - var resourceProvider = registerShadersEvent.getResourceProvider(); + public static void registerShaders(net.fabricmc.fabric.api.resource.ResourceReloadListenerKeys registerShadersEvent) { + // Shaders are registered via CoreShaderRegistrationCallback in Fabric API 1.21.1 + // This will be called via ClientProxy + } + + public static void registerCoreShaders(net.fabricmc.fabric.api.client.rendering.v1.CoreShaderRegistrationCallback.RegistrationContext context) { try { - registerShadersEvent.registerShader(new ShaderInstance(resourceProvider, - LDLib2.id("particle"), DefaultVertexFormat.PARTICLE), - shaderInstance -> particleShader = shaderInstance); - registerShadersEvent.registerShader(new ShaderInstance(resourceProvider, - LDLib2.id("fast_blit"), DefaultVertexFormat.POSITION), - shaderInstance -> blitShader = shaderInstance); - registerShadersEvent.registerShader(new ShaderInstance(resourceProvider, - LDLib2.id("visual_layer"), DefaultVertexFormat.POSITION_TEX), - shaderInstance -> visualLayerShader = shaderInstance); - registerShadersEvent.registerShader(new ShaderInstance(resourceProvider, - LDLib2.id("sprite_blit"), DefaultVertexFormat.POSITION_TEX_COLOR), - shaderInstance -> spriteBlitShader = shaderInstance); - registerShadersEvent.registerShader(new ShaderInstance(resourceProvider, - LDLib2.id("hsb_block"), HSB_VERTEX_FORMAT), - shaderInstance -> hsbShader = shaderInstance); - registerShadersEvent.registerShader(new ShaderInstance(resourceProvider, - LDLib2.id("graph_wire"), DefaultVertexFormat.POSITION_TEX_COLOR), - shaderInstance -> graphWireShader = shaderInstance); - registerShadersEvent.registerShader(new ShaderInstance(resourceProvider, - LDLib2.id("sdf_rect"), DefaultVertexFormat.POSITION), - shaderInstance -> SDFRect = shaderInstance); - registerShadersEvent.registerShader(new ShaderInstance(resourceProvider, - LDLib2.id("gui_texture"), DefaultVertexFormat.POSITION_TEX_COLOR), - shaderInstance -> guiTexture = shaderInstance); + context.register(LDLib2.id("particle"), DefaultVertexFormat.PARTICLE, shaderInstance -> particleShader = shaderInstance); + context.register(LDLib2.id("fast_blit"), DefaultVertexFormat.POSITION, shaderInstance -> blitShader = shaderInstance); + context.register(LDLib2.id("visual_layer"), DefaultVertexFormat.POSITION_TEX, shaderInstance -> visualLayerShader = shaderInstance); + context.register(LDLib2.id("sprite_blit"), DefaultVertexFormat.POSITION_TEX_COLOR, shaderInstance -> spriteBlitShader = shaderInstance); + context.register(LDLib2.id("hsb_block"), HSB_VERTEX_FORMAT, shaderInstance -> hsbShader = shaderInstance); + context.register(LDLib2.id("graph_wire"), DefaultVertexFormat.POSITION_TEX_COLOR, shaderInstance -> graphWireShader = shaderInstance); + context.register(LDLib2.id("sdf_rect"), DefaultVertexFormat.POSITION, shaderInstance -> SDFRect = shaderInstance); + context.register(LDLib2.id("gui_texture"), DefaultVertexFormat.POSITION_TEX_COLOR, shaderInstance -> guiTexture = shaderInstance); } catch (IOException e) { throw new RuntimeException(e); } - } + } public static boolean supportComputeShader() { return GL.getCapabilities().GL_ARB_compute_shader; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDProgramDefineManager.java b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDProgramDefineManager.java index fdaaddebd..e23073e0e 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDProgramDefineManager.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDProgramDefineManager.java @@ -1,14 +1,10 @@ package com.lowdragmc.lowdraglib2.client.shader; import lombok.experimental.UtilityClass; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; - -@OnlyIn(Dist.CLIENT) @UtilityClass public final class LDProgramDefineManager { private static final Set PROGRAM_DEFINES = new LinkedHashSet<>(); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDShaderHolder.java b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDShaderHolder.java index 4eb07d746..020de7290 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDShaderHolder.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDShaderHolder.java @@ -31,7 +31,7 @@ import net.minecraft.nbt.IntArrayTag; import net.minecraft.nbt.ListTag; import net.minecraft.resources.ResourceLocation; -import net.neoforged.neoforge.common.util.INBTSerializable; + import org.appliedenergistics.yoga.YogaEdge; import org.jetbrains.annotations.UnknownNullability; import org.joml.*; @@ -47,7 +47,7 @@ import static com.mojang.blaze3d.vertex.DefaultVertexFormat.POSITION_TEX_COLOR; -public class LDShaderHolder implements IConfigurable, INBTSerializable, AutoCloseable { +public class LDShaderHolder implements IConfigurable, AutoCloseable { public final static String SHADER_UID_DEFINE = "LD_SHADER_%d"; private final static AtomicInteger SHADER_ID = new AtomicInteger(); @@ -181,7 +181,6 @@ public Object deserializeSampler(CompoundTag tag) { return null; } - @Override public @UnknownNullability CompoundTag serializeNBT(@Nonnull HolderLookup.Provider provider) { var tag = new CompoundTag(); // uniform @@ -215,7 +214,6 @@ public Object deserializeSampler(CompoundTag tag) { return tag; } - @Override public void deserializeNBT(@Nonnull HolderLookup.Provider provider, @Nonnull CompoundTag tag) { samplerCache.clear(); dynamicSampler.clear(); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDShaderInstance.java b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDShaderInstance.java index 2b2d06884..2c6b2672e 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDShaderInstance.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/LDShaderInstance.java @@ -1,7 +1,6 @@ package com.lowdragmc.lowdraglib2.client.shader; import com.google.gson.JsonObject; -import com.lowdragmc.lowdraglib2.LDLib2; import com.lowdragmc.lowdraglib2.core.mixins.accessor.ShaderInstanceAccessor; import com.mojang.blaze3d.shaders.Program; import com.mojang.blaze3d.vertex.*; @@ -48,7 +47,7 @@ public static LDShaderInstance create(ResourceLocation location, VertexFormat fo } private LDShaderInstance(ResourceProvider resourceProvider, ResourceLocation shaderLocation, VertexFormat vertexFormat, Set defines) throws IOException { - super(resourceProvider, shaderLocation, vertexFormat); + super(resourceProvider, shaderLocation.toString(), vertexFormat); this.shaderLocation = shaderLocation; this.defines = defines; } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/MsaaTarget.java b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/MsaaTarget.java index 439330747..fed320b58 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/MsaaTarget.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/MsaaTarget.java @@ -5,11 +5,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import lombok.Getter; import net.minecraft.client.Minecraft; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import org.lwjgl.opengl.GL30; - -@OnlyIn(Dist.CLIENT) public class MsaaTarget { @Getter private final boolean useDepth; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/Shader.java b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/Shader.java index b133ff41a..2f4b2555d 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/Shader.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/Shader.java @@ -6,8 +6,6 @@ import it.unimi.dsi.fastutil.ints.Int2IntFunction; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import org.apache.commons.io.IOUtils; import org.lwjgl.PointerBuffer; import org.lwjgl.opengl.GL11; @@ -23,8 +21,6 @@ import java.io.InputStreamReader; import java.nio.ByteBuffer; import java.util.Objects; - -@OnlyIn(Dist.CLIENT) public class Shader { public final ShaderType shaderType; public final String source; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderManager.java b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderManager.java index 9b721377b..6aaabbd89 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderManager.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderManager.java @@ -9,13 +9,9 @@ import com.mojang.blaze3d.vertex.*; import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap; import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import net.minecraft.client.Minecraft; import java.util.function.Consumer; - -@OnlyIn(Dist.CLIENT) public class ShaderManager { private static final ShaderManager INSTANCE = new ShaderManager(); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderProgram.java b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderProgram.java index 29966d314..ac0516aa5 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderProgram.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderProgram.java @@ -4,8 +4,6 @@ import com.lowdragmc.lowdraglib2.client.shader.uniform.UniformCache; import com.mojang.blaze3d.systems.RenderSystem; import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.AbstractTexture; import net.minecraft.resources.ResourceLocation; @@ -16,8 +14,6 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; - -@OnlyIn(Dist.CLIENT) public class ShaderProgram { public final int programId; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderSSBO.java b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderSSBO.java index edd1e32ba..bf7e8e616 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderSSBO.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderSSBO.java @@ -4,18 +4,11 @@ import com.lowdragmc.lowdraglib2.client.shader.LDLibShaders; import net.minecraft.CrashReport; import net.minecraft.client.Minecraft; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL43; import java.nio.ByteBuffer; import java.nio.FloatBuffer; - -/** - * Shader Storage Buffer Object - */ -@OnlyIn(Dist.CLIENT) public class ShaderSSBO { public final int id; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderUBO.java b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderUBO.java index 6c7a20af2..c8ec6c48d 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderUBO.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/shader/management/ShaderUBO.java @@ -1,7 +1,5 @@ package com.lowdragmc.lowdraglib2.client.shader.management; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL31; @@ -11,8 +9,10 @@ * @author KilaBash * @date 2022/5/4 * @implNote ShaderUBO, Uniform Buffer Object + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ -@OnlyIn(Dist.CLIENT) public class ShaderUBO { public final int id; private boolean inValid; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/utils/GLUtil.java b/src/main/java/com/lowdragmc/lowdraglib2/client/utils/GLUtil.java new file mode 100644 index 000000000..33281b72b --- /dev/null +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/utils/GLUtil.java @@ -0,0 +1,22 @@ +package com.lowdragmc.lowdraglib2.client.utils; + +import org.lwjgl.opengl.ARBInstancedArrays; +import org.lwjgl.opengl.GL; +import org.lwjgl.opengl.GL33; + +public class GLUtil { + + /** + * GL 3.3 core has glVertexAttribDivisor; GL 3.2 exposes the same via GL_ARB_instanced_arrays. + * Use whichever is available so this works on exact-3.2 contexts (LWJGL debug will crash on a + * null function pointer otherwise). + */ + public static void vertexAttribDivisor(int index, int divisor) { + var caps = GL.getCapabilities(); + if (caps.OpenGL33) { + GL33.glVertexAttribDivisor(index, divisor); + } else if (caps.GL_ARB_instanced_arrays) { + ARBInstancedArrays.glVertexAttribDivisorARB(index, divisor); + } + } +} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/utils/RenderBufferUtils.java b/src/main/java/com/lowdragmc/lowdraglib2/client/utils/RenderBufferUtils.java index dd177ded0..f752f3ff8 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/utils/RenderBufferUtils.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/utils/RenderBufferUtils.java @@ -4,8 +4,6 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.Direction; import net.minecraft.util.Mth; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import org.joml.Matrix4f; import org.joml.Vector2f; import org.joml.Vector3f; @@ -16,8 +14,6 @@ import javax.annotation.Nonnull; import java.util.List; - -@OnlyIn(Dist.CLIENT) public class RenderBufferUtils { public static void drawLine(PoseStack.Pose pose, VertexConsumer buffer, Vector3f from, Vector3f to, diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/utils/RenderUtils.java b/src/main/java/com/lowdragmc/lowdraglib2/client/utils/RenderUtils.java index f29715906..50fd7cdb4 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/utils/RenderUtils.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/utils/RenderUtils.java @@ -2,8 +2,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -15,8 +13,6 @@ import javax.annotation.Nonnull; import org.jetbrains.annotations.Nullable; - -@OnlyIn(Dist.CLIENT) public class RenderUtils { /*** * used to render pixels in stencil mask. (e.g. Restrict rendering results to be displayed only in Monitor Screens) diff --git a/src/main/java/com/lowdragmc/lowdraglib2/client/utils/ShaderUtils.java b/src/main/java/com/lowdragmc/lowdraglib2/client/utils/ShaderUtils.java index 201918142..b0785dfb9 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/client/utils/ShaderUtils.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/client/utils/ShaderUtils.java @@ -6,8 +6,6 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import org.lwjgl.opengl.GL; import org.lwjgl.opengl.GL43; @@ -15,8 +13,10 @@ * @author KilaBash * @date 2022/12/11 * @implNote ShaderUtils + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ -@OnlyIn(Dist.CLIENT) public class ShaderUtils { /** diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ConfiguratorAccessors.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ConfiguratorAccessors.java index 4414af43b..fc9f37c18 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ConfiguratorAccessors.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ConfiguratorAccessors.java @@ -17,6 +17,9 @@ * @author KilaBash * @date 2022/12/1 * @implNote ConfiguratorAccessors + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ public class ConfiguratorAccessors { private static final Map, IConfiguratorAccessor> ACCESSOR_MAP = new ConcurrentHashMap<>(); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ConfiguratorParser.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ConfiguratorParser.java index 980477130..02f9d166f 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ConfiguratorParser.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ConfiguratorParser.java @@ -24,6 +24,9 @@ * @author KilaBash * @date 2022/12/1 * @implNote ConfiguratorParser + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @UtilityClass public final class ConfiguratorParser { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/IConfigurable.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/IConfigurable.java index 90c461288..f9e474187 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/IConfigurable.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/IConfigurable.java @@ -4,8 +4,8 @@ import com.lowdragmc.lowdraglib2.configurator.ui.ConfiguratorGroup; import com.lowdragmc.lowdraglib2.registry.ILDLRegister; import com.lowdragmc.lowdraglib2.registry.ILDLRegisterClient; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import java.util.function.Consumer; @@ -13,7 +13,7 @@ public interface IConfigurable { static IConfigurable create(Consumer consumer) { return new IConfigurable() { @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void buildConfigurator(ConfiguratorGroup father) { consumer.accept(father); } @@ -24,7 +24,7 @@ public void buildConfigurator(ConfiguratorGroup father) { * Add configurators into given group * @param father father group */ - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) default void buildConfigurator(ConfiguratorGroup father) { ConfiguratorParser.createConfigurators(father, this); } @@ -32,7 +32,7 @@ default void buildConfigurator(ConfiguratorGroup father) { /** * Creates and returns a configurator directly instead of build it. */ - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) default Configurator createDirectConfigurator() { var group = new ConfiguratorGroup(); buildConfigurator(group); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/IToggleConfigurable.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/IToggleConfigurable.java index ea09c323b..543449d3e 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/IToggleConfigurable.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/IToggleConfigurable.java @@ -6,8 +6,8 @@ import com.lowdragmc.lowdraglib2.syncdata.IPersistedSerializable; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.jetbrains.annotations.NotNull; /** @@ -21,7 +21,7 @@ public interface IToggleConfigurable extends IConfigurable, IPersistedSerializab void setEnable(boolean enable); @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) default void buildConfigurator(ConfiguratorGroup father) { father.setCanCollapse(isEnable()); father.lineContainer.addChildAt(new Toggle() diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/SerializableRecordAction.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/SerializableRecordAction.java index 15510bac9..6a6276d3f 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/SerializableRecordAction.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/SerializableRecordAction.java @@ -4,7 +4,7 @@ import lombok.Setter; import lombok.experimental.Accessors; import net.minecraft.nbt.Tag; -import net.neoforged.neoforge.common.util.INBTSerializable; +import com.lowdragmc.lowdraglib2.utils.INBTSerializable; import org.jetbrains.annotations.Nullable; import java.util.function.Consumer; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ArrayConfiguratorAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ArrayConfiguratorAccessor.java index 6f52c1139..531d929e3 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ArrayConfiguratorAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ArrayConfiguratorAccessor.java @@ -19,6 +19,9 @@ * @author KilaBash * @date 2022/12/2 * @implNote ArrayConfiguratorAccessor + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @AllArgsConstructor public class ArrayConfiguratorAccessor implements IConfiguratorAccessor { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/BlockPosAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/BlockPosAccessor.java index 449b882e4..c974b3f66 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/BlockPosAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/BlockPosAccessor.java @@ -21,6 +21,9 @@ * @author KilaBash * @date 2023/5/27 * @implNote BlockPosAccessor + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @LDLRegisterClient(name = "block_pos", registry = "ldlib2:configurator_accessor") public class BlockPosAccessor extends TypesAccessor { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/BooleanAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/BooleanAccessor.java index 2ed3e7f58..aa9efcc9c 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/BooleanAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/BooleanAccessor.java @@ -14,6 +14,9 @@ * @author KilaBash * @date 2022/12/1 * @implNote NumberAccessor + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @LDLRegisterClient(name = "boolean", registry = "ldlib2:configurator_accessor") public class BooleanAccessor extends TypesAccessor { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/CollectionConfiguratorAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/CollectionConfiguratorAccessor.java index 00d7d8786..29dd4dc6d 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/CollectionConfiguratorAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/CollectionConfiguratorAccessor.java @@ -17,6 +17,9 @@ * @author KilaBash * @date 2022/12/2 * @implNote ArrayConfiguratorAccessor + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @AllArgsConstructor @SuppressWarnings({"unchecked", "rawtypes"}) diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ComponentAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ComponentAccessor.java index d61344754..16d4b44a1 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ComponentAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ComponentAccessor.java @@ -16,6 +16,9 @@ * @author KilaBash * @date 2022/12/2 * @implNote ComponentAccessor + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @LDLRegisterClient(name = "component", registry = "ldlib2:configurator_accessor") public class ComponentAccessor implements IConfiguratorAccessor { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/EnumAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/EnumAccessor.java index 10ee57cfd..b3596f1a4 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/EnumAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/EnumAccessor.java @@ -23,6 +23,9 @@ * @author KilaBash * @date 2022/12/1 * @implNote NumberAccessor + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @LDLRegisterClient(name = "enum", registry = "ldlib2:configurator_accessor") @SuppressWarnings({"rawtypes"}) diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/FluidStackAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/FluidStackAccessor.java index c144f6d33..e0f8d9899 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/FluidStackAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/FluidStackAccessor.java @@ -12,7 +12,7 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.material.Fluids; -import net.neoforged.neoforge.fluids.FluidStack; +import dev.architectury.fluid.FluidStack; import org.jetbrains.annotations.Nullable; import java.lang.reflect.Field; @@ -29,9 +29,9 @@ public FluidStackAccessor() { @Override public FluidStack defaultValue(@Nullable Field field, @Nullable Class type) { if (field != null && field.isAnnotationPresent(DefaultValue.class)) { - return new FluidStack(BuiltInRegistries.FLUID.get(ResourceLocation.parse(field.getAnnotation(DefaultValue.class).stringValue()[0])), 1000); + return FluidStack.create(BuiltInRegistries.FLUID.get(ResourceLocation.parse(field.getAnnotation(DefaultValue.class).stringValue()[0])), 1000); } - return new FluidStack(Fluids.WATER, 1000); + return FluidStack.create(Fluids.WATER, 1000); } @Override @@ -47,39 +47,22 @@ public Configurator create(String name, Supplier supplier, Consumer< group.inlineContainer.addChild(slot); var defaultValue = defaultValue(field); var componentsConfigurator = new DataComponentConfigurator(DataComponentMap.EMPTY, - () -> supplier.get().getComponentsPatch(), - patch -> updater.accept(new FluidStack(supplier.get().getFluid().builtInRegistryHolder(), supplier.get().getAmount(), patch)), forceUpdate); + () -> net.minecraft.core.component.DataComponentPatch.EMPTY, + patch -> updater.accept(FluidStack.create(supplier.get().getFluid(), supplier.get().getAmount(), patch)), forceUpdate); var fluidConfigurator = new RegistrySearchComponent.Fluid("configurator.fluid", () -> supplier.get().getFluid(), - fluid -> updater.accept(new FluidStack(fluid.builtInRegistryHolder(), + fluid -> updater.accept(FluidStack.create(fluid, Math.max(supplier.get().getAmount(), 1), - supplier.get().getComponentsPatch())), + net.minecraft.core.component.DataComponentPatch.EMPTY)), defaultValue.getFluid(), forceUpdate); var countConfigurator = new NumberConfigurator("ldlib.gui.editor.configurator.amount", - () -> supplier.get().getAmount(), count -> updater.accept(supplier.get().copyWithAmount(count.intValue())), + () -> supplier.get().getAmount(), count -> updater.accept(supplier.get().copyWithAmount(count.longValue())), defaultValue.getAmount(), forceUpdate) .setType(ConfigNumber.Type.INTEGER) .setRange(0, Integer.MAX_VALUE) .setWheel(1); group.addConfigurators(fluidConfigurator, countConfigurator, componentsConfigurator); - if (LDLib2.isJeiLoaded()) { - RegistrySearchComponent.JEISupport.ghostFluid(group, Predicates.alwaysTrue(), fluidStack -> { - updater.accept(fluidStack); - group.notifyChanges(); - }); - } - if (LDLib2.isReiLoaded()) { - RegistrySearchComponent.REISupport.ghostFluid(group, Predicates.alwaysTrue(), fluidStack -> { - updater.accept(fluidStack); - group.notifyChanges(); - }); - } - if (LDLib2.isEmiLoaded()) { - RegistrySearchComponent.EMISupport.ghostFluid(group, Predicates.alwaysTrue(), fluidStack -> { - updater.accept(fluidStack); - group.notifyChanges(); - }); - } + return group; } } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/IConfiguratorAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/IConfiguratorAccessor.java index 0e07bbc73..e28456a7c 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/IConfiguratorAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/IConfiguratorAccessor.java @@ -12,6 +12,9 @@ * @author KilaBash * @date 2022/12/1 * @implNote IConfiguratorAccessor + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ public interface IConfiguratorAccessor extends ILDLRegisterClient, IConfiguratorAccessor> { IConfiguratorAccessor DEFAULT = type -> true; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ItemStackAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ItemStackAccessor.java index 6d7dd8b5a..183ccd6c2 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ItemStackAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ItemStackAccessor.java @@ -64,27 +64,7 @@ public Configurator create(String name, Supplier supplier, Consumer { - updater.accept(itemStack); - componentsConfigurator.setPrototype(itemStack.getItem().components()); - group.notifyChanges(); - }); - } - if (LDLib2.isReiLoaded()) { - RegistrySearchComponent.REISupport.ghostItem(group, Predicates.alwaysTrue(), itemStack -> { - updater.accept(itemStack); - componentsConfigurator.setPrototype(itemStack.getItem().components()); - group.notifyChanges(); - }); - } - if (LDLib2.isEmiLoaded()) { - RegistrySearchComponent.EMISupport.ghostItem(group, Predicates.alwaysTrue(), itemStack -> { - updater.accept(itemStack); - componentsConfigurator.setPrototype(itemStack.getItem().components()); - group.notifyChanges(); - }); - } + return group; } } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/RangeAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/RangeAccessor.java index 0e6f6ba42..767d2d265 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/RangeAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/RangeAccessor.java @@ -17,6 +17,9 @@ * @author KilaBash * @date 2022/12/1 * @implNote RangeAccessor + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @LDLRegisterClient(name = "range", registry = "ldlib2:configurator_accessor") public class RangeAccessor extends TypesAccessor { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ResourceLocationAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ResourceLocationAccessor.java index efc1855e0..ab0bfe974 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ResourceLocationAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/ResourceLocationAccessor.java @@ -24,6 +24,9 @@ * @author KilaBash * @date 2022/12/3 * @implNote ResourceLocationAccessor + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @LDLRegisterClient(name = "resource_location", registry = "ldlib2:configurator_accessor") public class ResourceLocationAccessor extends TypesAccessor { @@ -58,18 +61,18 @@ public Configurator create(String name, Supplier supplier, Con Component.literal("---") : Component.literal(font.toString())) ); case ITEM_TAG_KEY -> new TagKeySearchComponent.Item(name, - () -> ItemTags.create(supplier.get()), tagKey -> consumer.accept(tagKey.location()), - ItemTags.create(defaultValue(field, ResourceLocation.class)), + () -> net.minecraft.tags.TagKey.create(net.minecraft.core.registries.Registries.ITEM, supplier.get()), tagKey -> consumer.accept(tagKey.location()), + net.minecraft.tags.TagKey.create(net.minecraft.core.registries.Registries.ITEM, defaultValue(field, ResourceLocation.class)), forceUpdate ); case BLOCK_TAG_KEY -> new TagKeySearchComponent.Block(name, - () -> BlockTags.create(supplier.get()), tagKey -> consumer.accept(tagKey.location()), - BlockTags.create(defaultValue(field, ResourceLocation.class)), + () -> net.minecraft.tags.TagKey.create(net.minecraft.core.registries.Registries.BLOCK, supplier.get()), tagKey -> consumer.accept(tagKey.location()), + net.minecraft.tags.TagKey.create(net.minecraft.core.registries.Registries.BLOCK, defaultValue(field, ResourceLocation.class)), forceUpdate ); case FLUID_TAG_KEY -> new TagKeySearchComponent.Fluid(name, - () -> FluidTags.create(supplier.get()), tagKey -> consumer.accept(tagKey.location()), - FluidTags.create(defaultValue(field, ResourceLocation.class)), + () -> net.minecraft.tags.TagKey.create(net.minecraft.core.registries.Registries.FLUID, supplier.get()), tagKey -> consumer.accept(tagKey.location()), + net.minecraft.tags.TagKey.create(net.minecraft.core.registries.Registries.FLUID, defaultValue(field, ResourceLocation.class)), forceUpdate ); case ENTITY_TYPE_TAG_KEY -> new TagKeySearchComponent.EntityType(name, diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/SizeAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/SizeAccessor.java index c89cee1a4..1bddddbc6 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/SizeAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/SizeAccessor.java @@ -18,6 +18,9 @@ * @author KilaBash * @date 2022/12/2 * @implNote PositionAccessor + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @LDLRegisterClient(name = "size", registry = "ldlib2:configurator_accessor") public class SizeAccessor extends TypesAccessor { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/StringAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/StringAccessor.java index baf8ab78e..b82aad670 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/StringAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/StringAccessor.java @@ -16,6 +16,9 @@ * @author KilaBash * @date 2022/12/1 * @implNote NumberAccessor + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @LDLRegisterClient(name = "string", registry = "ldlib2:configurator_accessor") public class StringAccessor extends TypesAccessor { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/TypesAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/TypesAccessor.java index cf3e2fe3b..f800e0551 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/TypesAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/TypesAccessor.java @@ -8,6 +8,9 @@ * @author KilaBash * @date 2022/12/1 * @implNote TypesAccessor + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ public abstract class TypesAccessor implements IConfiguratorAccessor { public Set> types = new HashSet<>(); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/Vector3iAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/Vector3iAccessor.java index b20b0ed2c..212be961d 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/Vector3iAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/accessors/Vector3iAccessor.java @@ -18,6 +18,9 @@ * @author KilaBash * @date 2023/5/27 * @implNote Vector3iAccessor + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @LDLRegisterClient(name = "vector3i", registry = "ldlib2:configurator_accessor") public class Vector3iAccessor extends TypesAccessor { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/ArrayConfiguratorGroup.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/ArrayConfiguratorGroup.java index eaa848440..226985114 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/ArrayConfiguratorGroup.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/ArrayConfiguratorGroup.java @@ -28,6 +28,9 @@ * @author KilaBash * @date 2022/12/2 * @implNote ArrayConfigurator + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/DimensionConfigurator.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/DimensionConfigurator.java index d1bba4d8c..248a60819 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/DimensionConfigurator.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/DimensionConfigurator.java @@ -11,10 +11,6 @@ import java.util.List; import java.util.function.Consumer; import java.util.function.Supplier; - -/** - * Configurator for TaffyDimension values (width, height, size, min/max-size, etc.) - */ public class DimensionConfigurator extends ValueConfigurator { public enum Unit { AUTO, LENGTH, PERCENT, diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/LPAConfigurator.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/LPAConfigurator.java index 82911183f..b8f6dc7f2 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/LPAConfigurator.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/LPAConfigurator.java @@ -11,10 +11,6 @@ import java.util.List; import java.util.function.Consumer; import java.util.function.Supplier; - -/** - * Configurator for LengthPercentageAuto values (margin, padding, etc.) - */ public class LPAConfigurator extends ValueConfigurator { public enum Unit { AUTO, LENGTH, PERCENT, MIN_CONTENT, MAX_CONTENT, FIT_CONTENT, STRETCH diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/LengthPercentConfigurator.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/LengthPercentConfigurator.java index a9033b618..884c593ac 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/LengthPercentConfigurator.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/LengthPercentConfigurator.java @@ -11,10 +11,6 @@ import java.util.List; import java.util.function.Consumer; import java.util.function.Supplier; - -/** - * Configurator for LengthPercent values (px or %). - */ public class LengthPercentConfigurator extends ValueConfigurator { public enum Unit { PX, PERCENT diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/NumberConfigurator.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/NumberConfigurator.java index 2ef709e09..3323757ca 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/NumberConfigurator.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/NumberConfigurator.java @@ -13,6 +13,9 @@ * @author KilaBash * @date 2022/12/1 * @implNote NumberConfigurator + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ public class NumberConfigurator extends ValueConfigurator { public final TextField textField; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/RegistrySearchComponent.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/RegistrySearchComponent.java index 115df5e37..dbcb5b081 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/RegistrySearchComponent.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/RegistrySearchComponent.java @@ -8,18 +8,9 @@ import com.lowdragmc.lowdraglib2.gui.ui.UIElement; import com.lowdragmc.lowdraglib2.gui.ui.elements.ItemSlot; import com.lowdragmc.lowdraglib2.gui.ui.utils.UIElementProvider; -import com.lowdragmc.lowdraglib2.integration.xei.emi.LDLibEMIPlugin; -import com.lowdragmc.lowdraglib2.integration.xei.jei.LDLibJEIPlugin; -import com.lowdragmc.lowdraglib2.integration.xei.rei.LDLibREIPlugin; import com.lowdragmc.lowdraglib2.utils.search.IResultHandler; -import dev.architectury.hooks.fluid.forge.FluidStackHooksForge; -import dev.emi.emi.api.stack.FluidEmiStack; -import dev.emi.emi.api.stack.ItemEmiStack; import lombok.Setter; import lombok.experimental.Accessors; -import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; -import mezz.jei.api.constants.VanillaTypes; -import mezz.jei.api.neoforge.NeoForgeTypes; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; @@ -32,7 +23,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluids; -import net.neoforged.neoforge.fluids.FluidStack; +import dev.architectury.fluid.FluidStack; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -91,18 +82,6 @@ public Item(String name, Supplier supplier, Consu item -> Component.translatable(item.getDescriptionId()) )); - if (LDLib2.isJeiLoaded()) { - RegistrySearchComponent.JEISupport.ghostItem(this, itemStack -> filter.test(itemStack.getItem()), - itemStack -> setValue(itemStack.getItem(), true)); - } - if (LDLib2.isReiLoaded()) { - RegistrySearchComponent.REISupport.ghostItem(this, itemStack -> filter.test(itemStack.getItem()), - itemStack -> setValue(itemStack.getItem(), true)); - } - if (LDLib2.isEmiLoaded()) { - RegistrySearchComponent.EMISupport.ghostItem(this, itemStack -> filter.test(itemStack.getItem()), - itemStack -> setValue(itemStack.getItem(), true)); - } } } @@ -113,18 +92,6 @@ public Block(String name, Supplier suppli block -> Component.translatable(block.getDescriptionId()) )); - if (LDLib2.isJeiLoaded()) { - RegistrySearchComponent.JEISupport.ghostBlock(this, block -> filter.test(block), - block -> setValue(block, true)); - } - if (LDLib2.isReiLoaded()) { - RegistrySearchComponent.REISupport.ghostBlock(this, block -> filter.test(block), - block -> setValue(block, true)); - } - if (LDLib2.isEmiLoaded()) { - RegistrySearchComponent.EMISupport.ghostBlock(this, block -> filter.test(block), - block -> setValue(block, true)); - } } } @@ -137,22 +104,10 @@ public Fluid(String name, Supplier sup if (fluid == Fluids.EMPTY) return IGuiTexture.EMPTY; return new FluidStackTexture(fluid); }, - fluid -> Component.translatable(fluid.getFluidType().getDescriptionId()) + fluid -> Component.translatable(fluid.defaultFluidState().createLegacyBlock().getBlock().getDescriptionId()) )); setFilter(fluid -> fluid != Fluids.EMPTY && fluid.isSource(fluid.defaultFluidState())); - if (LDLib2.isJeiLoaded()) { - RegistrySearchComponent.JEISupport.ghostFluid(this, fluidStack -> filter.test(fluidStack.getFluid()), - fluidStack -> setValue(fluidStack.getFluid(), true)); - } - if (LDLib2.isReiLoaded()) { - RegistrySearchComponent.REISupport.ghostFluid(this, fluidStack -> filter.test(fluidStack.getFluid()), - fluidStack -> setValue(fluidStack.getFluid(), true)); - } - if (LDLib2.isEmiLoaded()) { - RegistrySearchComponent.EMISupport.ghostFluid(this, fluidStack -> filter.test(fluidStack.getFluid()), - fluidStack -> setValue(fluidStack.getFluid(), true)); - } } } @@ -167,24 +122,6 @@ public EntityType(String name, Supplier net.minecraft.world.entity.EntityType::getDescription )); - if (LDLib2.isJeiLoaded()) { - RegistrySearchComponent.JEISupport.ghostItem(this, itemStack -> - Optional.ofNullable(getTypeFromEgg(itemStack)).map(filter::test).orElse(false), - itemStack -> Optional.ofNullable(getTypeFromEgg(itemStack)).filter(filter) - .ifPresent(entityType -> setValue(entityType, true))); - } - if (LDLib2.isReiLoaded()) { - RegistrySearchComponent.REISupport.ghostItem(this, itemStack -> - Optional.ofNullable(getTypeFromEgg(itemStack)).map(filter::test).orElse(false), - itemStack -> Optional.ofNullable(getTypeFromEgg(itemStack)).filter(filter) - .ifPresent(entityType -> setValue(entityType, true))); - } - if (LDLib2.isEmiLoaded()) { - RegistrySearchComponent.EMISupport.ghostItem(this, itemStack -> - Optional.ofNullable(getTypeFromEgg(itemStack)).map(filter::test).orElse(false), - itemStack -> Optional.ofNullable(getTypeFromEgg(itemStack)).filter(filter) - .ifPresent(entityType -> setValue(entityType, true))); - } } @Nullable @@ -196,116 +133,4 @@ public net.minecraft.world.entity.EntityType getTypeFromEgg(ItemStack itemSta } } - public static class JEISupport { - public static void ghostItem(UIElement element, Predicate filter, Consumer setter) { - LDLibJEIPlugin.ghostIngredient(element, VanillaTypes.ITEM_STACK, - ingredient -> filter.test(ingredient.getIngredient()), - setter); - } - - public static void ghostFluid(UIElement element, Predicate filter, Consumer setter) { - LDLibJEIPlugin.ghostIngredient(element, NeoForgeTypes.FLUID_STACK, - ingredient -> filter.test(ingredient.getIngredient()), - setter); - } - - public static void ghostBlock(UIElement element, Predicate filter, Consumer setter) { - ghostItem(element,itemStack -> { - if (itemStack.getItem() instanceof BlockItem blockItem) { - return filter.test(blockItem.getBlock()); - } - return false; - }, itemStack -> { - if (itemStack.getItem() instanceof BlockItem blockItem) { - setter.accept(blockItem.getBlock()); - } - }); - } - } - - // region XEI Supports - public static class REISupport { - public static void ghostItem(UIElement element, Predicate filter, Consumer setter) { - LDLibREIPlugin.draggableStackBounds(element, - VanillaEntryTypes.ITEM, - stack -> filter.test(stack.getValue())); - LDLibREIPlugin.acceptDraggableStack(element, - VanillaEntryTypes.ITEM, - stack -> filter.test(stack.getValue()), - stack -> setter.accept(stack.getValue())); - } - - public static void ghostFluid(UIElement element, Predicate filter, Consumer setter) { - LDLibREIPlugin.draggableStackBounds(element, - VanillaEntryTypes.FLUID, - stack -> filter.test(FluidStackHooksForge.toForge(stack.getValue()))); - LDLibREIPlugin.acceptDraggableStack(element, - VanillaEntryTypes.FLUID, - stack -> filter.test(FluidStackHooksForge.toForge(stack.getValue())), - stack -> setter.accept(FluidStackHooksForge.toForge(stack.getValue()))); - } - - public static void ghostBlock(UIElement element, Predicate filter, Consumer setter) { - ghostItem(element,itemStack -> { - if (itemStack.getItem() instanceof BlockItem blockItem) { - return filter.test(blockItem.getBlock()); - } - return false; - }, itemStack -> { - if (itemStack.getItem() instanceof BlockItem blockItem) { - setter.accept(blockItem.getBlock()); - } - }); - } - - } - - public static class EMISupport { - public static void ghostItem(UIElement element, Predicate filter, Consumer setter) { - LDLibEMIPlugin.renderDragHandler(element, - dragged -> dragged instanceof ItemEmiStack item && filter.test(item.getItemStack())); - LDLibEMIPlugin.dropStackHandler(element, - dragged -> dragged instanceof ItemEmiStack item && filter.test(item.getItemStack()), - dragged -> { - if (dragged instanceof ItemEmiStack item) { - setter.accept(item.getItemStack()); - } - }); - } - - public static void ghostFluid(UIElement element, Predicate filter, Consumer setter) { - LDLibEMIPlugin.renderDragHandler(element, - dragged -> dragged instanceof FluidEmiStack fluid && filter.test(new FluidStack( - ((net.minecraft.world.level.material.Fluid) fluid.getKey()).builtInRegistryHolder(), - Math.max(1000, (int) fluid.getAmount()), - fluid.getComponentChanges()))); - LDLibEMIPlugin.dropStackHandler(element, - dragged -> dragged instanceof FluidEmiStack fluid && filter.test(new FluidStack( - ((net.minecraft.world.level.material.Fluid) fluid.getKey()).builtInRegistryHolder(), - Math.max(1000, (int) fluid.getAmount()), - fluid.getComponentChanges())), - dragged -> { - if (dragged instanceof FluidEmiStack fluid) { - var fluidstack = new FluidStack( - ((net.minecraft.world.level.material.Fluid) fluid.getKey()).builtInRegistryHolder(), - Math.max(1000, (int) fluid.getAmount()), - fluid.getComponentChanges()); - setter.accept(fluidstack); - } - }); - } - - public static void ghostBlock(UIElement element, Predicate filter, Consumer setter) { - ghostItem(element,itemStack -> { - if (itemStack.getItem() instanceof BlockItem blockItem) { - return filter.test(blockItem.getBlock()); - } - return false; - }, itemStack -> { - if (itemStack.getItem() instanceof BlockItem blockItem) { - setter.accept(blockItem.getBlock()); - } - }); - } - } } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/TagKeySearchComponent.java b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/TagKeySearchComponent.java index 96ae26bad..96eb0e887 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/TagKeySearchComponent.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/configurator/ui/TagKeySearchComponent.java @@ -17,7 +17,7 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.SpawnEggItem; -import net.neoforged.neoforge.fluids.FluidStack; +import dev.architectury.fluid.FluidStack; import javax.annotation.ParametersAreNonnullByDefault; import java.util.function.Consumer; @@ -113,7 +113,7 @@ public Fluid(String name, Supplier holders.map(Holder::value) - .map(fluid -> new FluidStack(fluid, 1000)) + .map(fluid -> FluidStack.create(fluid, 1000)) .toArray(FluidStack[]::new)) .orElseGet(() -> new FluidStack[0]); if (fluids.length == 0) return IGuiTexture.EMPTY; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/BlockEntityMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/BlockEntityMixin.java index 615a2efd0..6a7a10455 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/BlockEntityMixin.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/BlockEntityMixin.java @@ -22,6 +22,9 @@ * @author KilaBash * @date 2022/11/27 * @implNote BlockEntityMixin + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @Mixin(BlockEntity.class) public abstract class BlockEntityMixin { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/BlockModelShaperMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/BlockModelShaperMixin.java index cd561943e..8174154e8 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/BlockModelShaperMixin.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/BlockModelShaperMixin.java @@ -1,10 +1,10 @@ package com.lowdragmc.lowdraglib2.core.mixins; import com.lowdragmc.lowdraglib2.client.renderer.IBlockRendererProvider; +import com.lowdragmc.lowdraglib2.client.renderer.ModelData; import net.minecraft.client.renderer.block.BlockModelShaper; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.client.model.data.ModelData; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/BlockRenderDispatcherMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/BlockRenderDispatcherMixin.java deleted file mode 100644 index 8c6ef957d..000000000 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/BlockRenderDispatcherMixin.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.lowdragmc.lowdraglib2.core.mixins; - -import com.lowdragmc.lowdraglib2.client.model.forge.LDLRendererModel; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.block.BlockRenderDispatcher; -import net.minecraft.client.renderer.block.ModelBlockRenderer; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.core.BlockPos; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.client.model.data.ModelData; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -/** - * @author KilaBash - * @date 2023/7/28 - * @implNote BlockRenderDispatcherMixin - */ -@Mixin(BlockRenderDispatcher.class) -public abstract class BlockRenderDispatcherMixin { - @Redirect(method = "renderBreakingTexture(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/BlockAndTintGetter;Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;Lnet/neoforged/neoforge/client/model/data/ModelData;)V", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/renderer/block/ModelBlockRenderer;tesselateBlock(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/client/resources/model/BakedModel;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;ZLnet/minecraft/util/RandomSource;JILnet/neoforged/neoforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V"), - remap = false) - private void ldlib2$injectTesselateBlock(ModelBlockRenderer instance, - BlockAndTintGetter blockAndTintGetter, - BakedModel bakedModel, - BlockState blockState, - BlockPos pos, - PoseStack poseStack, - VertexConsumer vertexConsumer, - boolean b, - RandomSource randomSource, - long l, int i, - ModelData modelData, - RenderType renderType) { - if (bakedModel instanceof LDLRendererModel.RendererBakedModel model) { - var te = blockAndTintGetter.getBlockEntity(pos); - instance.tesselateBlock(blockAndTintGetter, bakedModel, blockState, pos, poseStack, vertexConsumer, b, randomSource, l, i, - model.getModelData(blockAndTintGetter, pos, blockState, te == null ? ModelData.EMPTY : te.getModelData()), renderType); - } else { - instance.tesselateBlock(blockAndTintGetter, bakedModel, blockState, pos, poseStack, vertexConsumer, b, randomSource, l, i, modelData, renderType); - } - } -} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/BlockStateModelLoaderMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/BlockStateModelLoaderMixin.java index 285c59b10..32b015657 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/BlockStateModelLoaderMixin.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/BlockStateModelLoaderMixin.java @@ -14,16 +14,5 @@ @Mixin(BlockStateModelLoader.class) public abstract class BlockStateModelLoaderMixin { - @WrapOperation(method = "lambda$loadBlockStateDefinitions$10", - at = @At(value = "INVOKE", - target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", - remap = false, ordinal = 0)) - private void ldlib2$injectStateToModelLocation(Logger instance, String s, Object arg1, Object arg2, Operation original, - final @Local(ordinal = 0, argsOnly = true) ModelResourceLocation modelResourceLocation, - @Local(ordinal = 0, argsOnly = true) BlockState blockState) { - if (blockState.getBlock() instanceof IBlockRendererProvider) { - return; - } - original.call(instance, s, arg1, arg2); - } + } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/FluidTankMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/FluidTankMixin.java deleted file mode 100644 index 981ab23f8..000000000 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/FluidTankMixin.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.lowdragmc.lowdraglib2.core.mixins; - -import com.lowdragmc.lowdraglib2.misc.IFluidHandlerModifiable; -import net.neoforged.neoforge.fluids.FluidStack; -import net.neoforged.neoforge.fluids.IFluidTank; -import net.neoforged.neoforge.fluids.capability.templates.FluidTank; -import org.jetbrains.annotations.NotNull; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(value = FluidTank.class, remap = false) -public abstract class FluidTankMixin implements IFluidHandlerModifiable, IFluidTank { - @Shadow - protected FluidStack fluid; - - @Shadow - protected abstract void onContentsChanged(); - @Shadow - public abstract void setFluid(FluidStack fluid); - - @Shadow - public abstract int fill(FluidStack resource, FluidAction action); - - @Shadow - public abstract @NotNull FluidStack drain(int maxDrain, FluidAction action); - - @Override - public void setFluidInTank(int tank, FluidStack fluid) { - setFluid(fluid); - this.onContentsChanged(); - } -} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ItemModelShaperMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ItemModelShaperMixin.java index d29433ecb..d3be7aa9d 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ItemModelShaperMixin.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ItemModelShaperMixin.java @@ -2,6 +2,10 @@ import com.lowdragmc.lowdraglib2.client.renderer.IItemRendererProvider; import com.lowdragmc.lowdraglib2.client.renderer.IRenderer; +import com.lowdragmc.lowdraglib2.client.renderer.ModelData; +import com.lowdragmc.lowdraglib2.client.renderer.TriState; +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; import net.minecraft.client.renderer.ItemModelShaper; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -13,8 +17,6 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.client.model.data.ModelData; -import net.neoforged.neoforge.common.util.TriState; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -25,6 +27,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Supplier; @Mixin(ItemModelShaper.class) public abstract class ItemModelShaperMixin { @@ -36,58 +39,77 @@ public abstract class ItemModelShaperMixin { if (stack.getItem() instanceof IItemRendererProvider provider) { IRenderer renderer = provider.getRenderer(stack); if(renderer != null) { - cir.setReturnValue(SHAPES_CACHE.computeIfAbsent(renderer, r -> new BakedModel() { - @Override - public List getQuads(@Nullable BlockState state, @Nullable Direction direction, RandomSource random) { - return r.renderModel(null, null, state, direction, random, ModelData.EMPTY, null); - } - - @Override - public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand, ModelData data, @Nullable RenderType renderType) { - return r.renderModel(null, null, state, side, rand, data, renderType); - } - - @Override - public boolean useAmbientOcclusion() { - return r.useAO() == TriState.DEFAULT || r.useAO() == TriState.TRUE; - } - - @Override - public TriState useAmbientOcclusion(BlockState state, ModelData data, RenderType renderType) { - return r.useAO(state, data, renderType); - } - - @Override - public boolean isGui3d() { - return renderer.isGui3d(); - } - - @Override - public boolean usesBlockLight() { - return r.useBlockLight(stack); - } - - @Override - public boolean isCustomRenderer() { - return false; - } - - @Override - public TextureAtlasSprite getParticleIcon() { - return r.getParticleTexture(null, null, ModelData.EMPTY); - } - - @Override - public ItemTransforms getTransforms() { - return ItemTransforms.NO_TRANSFORMS; - } - - @Override - public ItemOverrides getOverrides() { - return ItemOverrides.EMPTY; - } - })); + cir.setReturnValue(SHAPES_CACHE.computeIfAbsent(renderer, r -> new LDFabricBakedModel(r, stack))); } } } } + +class LDFabricBakedModel implements BakedModel, FabricBakedModel { + private final IRenderer renderer; + private final ItemStack stack; + + public LDFabricBakedModel(IRenderer renderer, ItemStack stack) { + this.renderer = renderer; + this.stack = stack; + } + + @Override + public boolean isVanillaAdapter() { + return false; + } + + @Override + public void emitBlockQuads(net.minecraft.world.level.BlockAndTintGetter blockView, net.minecraft.world.level.block.state.BlockState state, net.minecraft.core.BlockPos pos, Supplier randomSupplier, RenderContext context) { + } + + @Override + public void emitItemQuads(ItemStack stack, Supplier randomSupplier, RenderContext context) { + var quads = renderer.renderModel(null, null, null, null, randomSupplier.get(), ModelData.EMPTY, null); + var emitter = context.getEmitter(); + for (var quad : quads) { + emitter.fromVanilla(quad, null, null); + emitter.emit(); + } + } + + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction direction, RandomSource random) { + return renderer.renderModel(null, null, state, direction, random, ModelData.EMPTY, null); + } + + @Override + public boolean useAmbientOcclusion() { + return renderer.useAO() == TriState.DEFAULT || renderer.useAO() == TriState.TRUE; + } + + @Override + public boolean isGui3d() { + return renderer.isGui3d(); + } + + @Override + public boolean usesBlockLight() { + return renderer.useBlockLight(stack); + } + + @Override + public boolean isCustomRenderer() { + return false; + } + + @Override + public TextureAtlasSprite getParticleIcon() { + return renderer.getParticleTexture(null, null, ModelData.EMPTY); + } + + @Override + public ItemTransforms getTransforms() { + return ItemTransforms.NO_TRANSFORMS; + } + + @Override + public ItemOverrides getOverrides() { + return ItemOverrides.EMPTY; + } +} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/MixinPluginShared.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/MixinPluginShared.java index 9b1bc6a13..94e2ccb6b 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/MixinPluginShared.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/MixinPluginShared.java @@ -1,15 +1,11 @@ package com.lowdragmc.lowdraglib2.core.mixins; -import net.neoforged.fml.ModList; -import net.neoforged.fml.loading.LoadingModList; +import net.fabricmc.loader.api.FabricLoader; public interface MixinPluginShared { static boolean isModLoaded(String modId) { - if (ModList.get() == null) { - return LoadingModList.get().getModFileById(modId) != null; - } - return ModList.get().isLoaded(modId); + return FabricLoader.getInstance().isModLoaded(modId); } boolean IS_OPT_LOAD = isModLoaded("optifine"); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ModelBakeryMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ModelBakeryMixin.java index b582197e5..739f46065 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ModelBakeryMixin.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ModelBakeryMixin.java @@ -6,6 +6,7 @@ import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.ref.LocalRef; import com.lowdragmc.lowdraglib2.LDLib2; +import com.lowdragmc.lowdraglib2.client.model.ModelFactory; import com.lowdragmc.lowdraglib2.client.renderer.IBlockRendererProvider; import com.lowdragmc.lowdraglib2.client.renderer.IItemRendererProvider; import net.minecraft.client.resources.model.ModelBakery; @@ -16,18 +17,28 @@ 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 java.util.Collection; /** * @author KilaBash * @date 2022/05/28 + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @Mixin(ModelBakery.class) public abstract class ModelBakeryMixin { @Shadow abstract UnbakedModel getModel(ResourceLocation modelPath); + @Inject(method = "", at = @At("RETURN")) + private void ldlib2$saveInstance(CallbackInfo ci) { + ModelFactory.setModelBakery((ModelBakery)(Object)this); + } + @WrapOperation(method = "getModel", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;[Ljava/lang/Object;)V")) @@ -52,7 +63,7 @@ protected void injectStateToModelLocation(Logger instance, String s, Object[] ob protected Collection ldlib2$changeLoadedModel(Collection original, @Local(argsOnly = true) ModelResourceLocation modelResourceLocation, @Local(argsOnly = true) LocalRef model) { - if (!modelResourceLocation.getVariant().equals(ModelResourceLocation.STANDALONE_VARIANT)) { + if (!modelResourceLocation.getVariant().equals("standalone")) { ResourceLocation resourceLocation = modelResourceLocation.id(); var block = BuiltInRegistries.BLOCK.get(resourceLocation); if (block instanceof IBlockRendererProvider) { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ObjModelMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ObjModelMixin.java deleted file mode 100644 index ae4bb7702..000000000 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ObjModelMixin.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.lowdragmc.lowdraglib2.core.mixins; - -import com.llamalad7.mixinextras.sugar.Local; -import com.lowdragmc.lowdraglib2.core.mixins.accessor.ObjModelAccessor; -import com.mojang.math.Transformation; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.resources.model.Material; -import net.minecraft.client.resources.model.ModelState; -import net.neoforged.neoforge.client.model.IModelBuilder; -import net.neoforged.neoforge.client.model.geometry.IGeometryBakingContext; -import net.neoforged.neoforge.client.model.obj.ObjMaterialLibrary; -import net.neoforged.neoforge.client.model.obj.ObjModel; -import net.neoforged.neoforge.client.model.renderable.CompositeRenderable; -import net.neoforged.neoforge.client.textures.UnitTextureAtlasSprite; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.function.Function; - -@Mixin(targets = "net.neoforged.neoforge.client.model.obj.ObjModel$ModelMesh") -public abstract class ObjModelMixin { - - @Shadow @Final ObjModel this$0; - - @Shadow @Nullable public ObjMaterialLibrary.@Nullable Material mat; - - @Inject(method = "bake", at = @At(value = "INVOKE", - target = "Lnet/neoforged/neoforge/client/model/obj/ObjModel;makeQuad([[IILorg/joml/Vector4f;Lorg/joml/Vector4f;Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;Lcom/mojang/math/Transformation;)Lorg/apache/commons/lang3/tuple/Pair;")) - private void ldlib2$bake(CompositeRenderable.PartBuilder builder, - IGeometryBakingContext configuration, - CallbackInfo ci, - @Local List quads, - @Local int[][] faces) { - if (this$0 instanceof ObjModelAccessor model) { - var left = ldlib2$getLeftFaces(faces); - if (left.length >= 3) { - ObjMaterialLibrary.Material mat = this.mat; - assert mat != null; - var tintIndex = mat.diffuseTintIndex; - var colorTint = mat.diffuseColor; - for (int[][] splitFaces : ldlib2$splitFaces(left)) { - var quad = model.invokeMakeQuad(splitFaces, tintIndex, colorTint, mat.ambientColor, UnitTextureAtlasSprite.INSTANCE, Transformation.identity()); - quads.add(quad.getLeft()); - } - } - } - } - - @Inject(method = "addQuads", at = @At(value = "INVOKE", - target = "Lnet/neoforged/neoforge/client/model/obj/ObjModel;makeQuad([[IILorg/joml/Vector4f;Lorg/joml/Vector4f;Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;Lcom/mojang/math/Transformation;)Lorg/apache/commons/lang3/tuple/Pair;")) - private void ldlib2$addQuads(IGeometryBakingContext owner, - IModelBuilder modelBuilder, - Function spriteGetter, - ModelState modelTransform, - CallbackInfo ci, - @Local int[][] faces, - @Local TextureAtlasSprite texture, - @Local(name = "transform") Transformation transform) { - if (this$0 instanceof ObjModelAccessor model) { - var left = ldlib2$getLeftFaces(faces); - if (left.length >= 3) { - ObjMaterialLibrary.Material mat = this.mat; - assert mat != null; - var tintIndex = mat.diffuseTintIndex; - var colorTint = mat.diffuseColor; - for (int[][] splitFaces : ldlib2$splitFaces(left)) { - var quad = model.invokeMakeQuad(splitFaces, tintIndex, colorTint, mat.ambientColor, texture, transform); - if (quad.getRight() == null) - modelBuilder.addUnculledFace(quad.getLeft()); - else - modelBuilder.addCulledFace(quad.getRight(), quad.getLeft()); - } - } - } - } - - @Unique - private int[][] ldlib2$getLeftFaces(int[][] faces) { - if (faces.length <= 4) return new int[0][]; - var left = new int[faces.length - 2][]; - left[0] = faces[3]; - System.arraycopy(faces, 4, left, 1, faces.length - 4); - left[left.length - 1] = faces[0]; - return left; - } - - @Unique - private List ldlib2$splitFaces(int[][] faces) { - int n = faces.length; - List parts = new ArrayList<>(); - - if (n <= 4) { - parts.add(Arrays.copyOf(faces, n)); - return parts; - } - - // fill 4 points first - int remainder = n % 4; // get left point - int limit = n - remainder; // quad index - - for (int i = 0; i < limit; i += 4) { - parts.add(Arrays.copyOfRange(faces, i, i + 4)); - } - - // process left points - switch (remainder) { - case 3 -> - parts.add(Arrays.copyOfRange(faces, limit, n)); - - case 2 -> - parts.add(new int[][] { - faces[limit - 1], faces[limit], faces[limit + 1], faces[0] - }); - - case 1 -> - parts.add(new int[][] { - faces[limit - 1], faces[limit], faces[0] - }); - - default -> { /* remainder == 0,do nothing */ } - } - - return parts; - } -} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ParticleEngineAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ParticleEngineAccessor.java index 9fe450ffa..59b0f8eb0 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ParticleEngineAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ParticleEngineAccessor.java @@ -11,6 +11,6 @@ @Mixin(ParticleEngine.class) public interface ParticleEngineAccessor { @Accessor("providers") - Map> getProviders(); + it.unimi.dsi.fastutil.ints.Int2ObjectMap> getProviders(); } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ParticleEngineMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ParticleEngineMixin.java index 5f154b83f..bd4cd175c 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ParticleEngineMixin.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ParticleEngineMixin.java @@ -1,8 +1,15 @@ package com.lowdragmc.lowdraglib2.core.mixins; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.Tesselator; +import net.minecraft.client.Camera; import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleEngine; import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.texture.TextureManager; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -10,6 +17,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.List; import java.util.Map; import java.util.Queue; @@ -17,15 +25,45 @@ * @author KilaBash * @date 2022/7/23 * @implNote ParticleEngineMixin + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @Mixin(ParticleEngine.class) public abstract class ParticleEngineMixin { @Shadow @Final private Map> particles; + @Shadow @Final private static List RENDER_ORDER; + @Shadow @Final private TextureManager textureManager; @Inject(method = "tick", at = @At("TAIL")) public void injectTick(CallbackInfo ci) { particles.entrySet().removeIf(entry -> entry.getValue().isEmpty()); } + @Inject(method = "render", at = @At("RETURN")) + public void ldlib2$injectCustomParticleRender(LightTexture lightTexture, Camera camera, float partialTick, CallbackInfo ci) { + for (var entry : particles.entrySet()) { + var renderType = entry.getKey(); + if (RENDER_ORDER.contains(renderType) || renderType == ParticleRenderType.NO_RENDER) continue; + var queue = entry.getValue(); + if (queue == null || queue.isEmpty()) continue; + RenderSystem.setShader(GameRenderer::getParticleShader); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + var tesselator = Tesselator.getInstance(); + var bufferBuilder = renderType.begin(tesselator, this.textureManager); + if (bufferBuilder == null) continue; + for (var particle : queue) { + try { + particle.render(bufferBuilder, camera, partialTick); + } catch (Throwable throwable) { + // skip bad particles + } + } + var data = bufferBuilder.build(); + if (data == null) continue; + BufferUploader.drawWithShader(data); + } + } + } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/SpriteSourceListMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/SpriteSourceListMixin.java index 6bc14bbf0..9e96d5611 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/SpriteSourceListMixin.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/SpriteSourceListMixin.java @@ -19,6 +19,9 @@ * @author KilaBash * @date 2023/7/20 * @implNote SpriteSourceListMixin + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @Mixin(SpriteSourceList.class) public abstract class SpriteSourceListMixin { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/accessor/MouseHandlerAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/accessor/MouseHandlerAccessor.java index 84524bde7..66f79ce09 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/accessor/MouseHandlerAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/accessor/MouseHandlerAccessor.java @@ -8,6 +8,9 @@ * @author KilaBash * @date 2023/7/1 * @implNote MouseHandlerMixin + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @Mixin(MouseHandler.class) public interface MouseHandlerAccessor { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/accessor/ObjModelAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/accessor/ObjModelAccessor.java deleted file mode 100644 index cd421ca77..000000000 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/accessor/ObjModelAccessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.lowdragmc.lowdraglib2.core.mixins.accessor; - -import com.mojang.math.Transformation; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.core.Direction; -import net.neoforged.neoforge.client.model.obj.ObjModel; -import org.apache.commons.lang3.tuple.Pair; -import org.joml.Vector4f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(ObjModel.class) -public interface ObjModelAccessor { - @Invoker - Pair invokeMakeQuad(int[][] indices, int tintIndex, Vector4f colorTint, Vector4f ambientColor, TextureAtlasSprite texture, Transformation transform); -} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/accessor/SlotAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/accessor/SlotAccessor.java index 150e1595f..223ec7e50 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/accessor/SlotAccessor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/accessor/SlotAccessor.java @@ -10,6 +10,9 @@ * @author KilaBash * @date 2023/2/9 * @implNote AbstractContainerScreenMixin + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @Mixin(Slot.class) public interface SlotAccessor { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/emi/RecipeScreenMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/emi/RecipeScreenMixin.java deleted file mode 100644 index 50088ccdf..000000000 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/emi/RecipeScreenMixin.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.lowdragmc.lowdraglib2.core.mixins.emi; - -import com.lowdragmc.lowdraglib2.integration.xei.emi.ModularUIEMIWidget; -import dev.emi.emi.screen.RecipeScreen; -import dev.emi.emi.screen.WidgetGroup; -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 java.util.List; - -@Mixin(RecipeScreen.class) -public abstract class RecipeScreenMixin { - @Shadow(remap = false) private List currentPage; - - @Inject(method = "mouseClicked", at = @At(value = "HEAD"), cancellable = true) - private void ldlib2$mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { - for (var group : currentPage) { - for (var widget : group.widgets) { - if (widget instanceof ModularUIEMIWidget modularUIWidget) { - var ox = mouseX - group.x(); - var oy = mouseY - group.y(); - if (modularUIWidget.getBounds().contains((int) ox, (int) oy) && - modularUIWidget.modularUI.getWidget().mouseClicked(mouseX, mouseY, button)) { - cir.setReturnValue(true); - } - } - } - } - } - - @Inject(method = "mouseReleased", at = @At(value = "HEAD"), cancellable = true) - private void ldlib2$mouseReleased(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { - for (var group : currentPage) { - for (var widget : group.widgets) { - if (widget instanceof ModularUIEMIWidget modularUIWidget) { - var ox = mouseX - group.x(); - var oy = mouseY - group.y(); - if (modularUIWidget.getBounds().contains((int) ox, (int) oy) && - modularUIWidget.modularUI.getWidget().mouseReleased(mouseX, mouseY, button)) { - cir.setReturnValue(true); - } - } - } - } - } - - @Inject(method = "mouseDragged", at = @At(value = "HEAD"), cancellable = true) - private void ldlib2$mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY, CallbackInfoReturnable cir) { - for (var group : currentPage) { - for (var widget : group.widgets) { - if (widget instanceof ModularUIEMIWidget modularUIWidget) { - var ox = mouseX - group.x(); - var oy = mouseY - group.y(); - if (modularUIWidget.getBounds().contains((int) ox, (int) oy) && - modularUIWidget.modularUI.getWidget().mouseDragged(mouseX, mouseY, button, deltaX, deltaY)) { - cir.setReturnValue(true); - } - } - } - } - } - - @Inject(method = "mouseScrolled", at = @At(value = "HEAD"), cancellable = true) - private void ldlib2$mouseScrolled(double mouseX, double mouseY, double horizontal, double vertical, CallbackInfoReturnable cir) { - for (var group : currentPage) { - for (var widget : group.widgets) { - if (widget instanceof ModularUIEMIWidget modularUIWidget) { - var ox = mouseX - group.x(); - var oy = mouseY - group.y(); - if (modularUIWidget.getBounds().contains((int) ox, (int) oy) && - modularUIWidget.modularUI.getWidget().mouseScrolled(mouseX, mouseY, horizontal, vertical)) { - cir.setReturnValue(true); - } - } - } - } - } - - @Inject(method = "keyPressed", at = @At(value = "HEAD"), cancellable = true) - private void ldlib2$keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable cir) { - for (var widgetGroup : currentPage) { - for (var widget : widgetGroup.widgets) { - if (widget instanceof ModularUIEMIWidget modularUIWidget) { - if (modularUIWidget.modularUI.getWidget().keyPressed(keyCode, scanCode, modifiers)) { - cir.setReturnValue(true); - } - } - } - } - } -} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/kjs/ServerScriptManagerAccessor.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/kjs/ServerScriptManagerAccessor.java deleted file mode 100644 index d5843379b..000000000 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/kjs/ServerScriptManagerAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.lowdragmc.lowdraglib2.core.mixins.kjs; - -import dev.latvian.mods.kubejs.server.ServerScriptManager; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(ServerScriptManager.class) -public interface ServerScriptManagerAccessor { - @Accessor - static ServerScriptManager getStaticInstance() { - throw new AssertionError(); - } -} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/shader/ShaderInstanceMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/shader/ShaderInstanceMixin.java index 0dd294c94..7e6e9f81c 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/shader/ShaderInstanceMixin.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/shader/ShaderInstanceMixin.java @@ -19,7 +19,9 @@ @Mixin(ShaderInstance.class) public abstract class ShaderInstanceMixin implements ILDShaderInstance { - @Inject(method = "(Lnet/minecraft/server/packs/resources/ResourceProvider;Lnet/minecraft/resources/ResourceLocation;Lcom/mojang/blaze3d/vertex/VertexFormat;)V", + + @SuppressWarnings("UnresolvedMixinReference") + @Inject(method = "(Lnet/minecraft/server/packs/resources/ResourceProvider;Ljava/lang/String;Lcom/mojang/blaze3d/vertex/VertexFormat;)V", require = 1, at = {@At( value = "INVOKE", @@ -27,11 +29,26 @@ public abstract class ShaderInstanceMixin implements ILDShaderInstance { ordinal = 1 )}) public void ldlib2$onCreateShader(ResourceProvider resourceProvider, - ResourceLocation shaderLocation, + String shaderLocation, VertexFormat vertexFormat, CallbackInfo ci, - @Local JsonObject json) throws IOException { - this.onCreateShader(resourceProvider, shaderLocation, vertexFormat, json); + @Local JsonObject json) { + this.onCreateShader(resourceProvider, ResourceLocation.parse(shaderLocation), vertexFormat, json); + } + + @org.spongepowered.asm.mixin.injection.Redirect(method = "(Lnet/minecraft/server/packs/resources/ResourceProvider;Ljava/lang/String;Lcom/mojang/blaze3d/vertex/VertexFormat;)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/resources/ResourceLocation;withDefaultNamespace(Ljava/lang/String;)Lnet/minecraft/resources/ResourceLocation;")) + private ResourceLocation ldlib2$fixShaderLocation(String name) { + if (name.startsWith("shaders/core/") && name.contains(":")) { + String pathPart = name.substring("shaders/core/".length()); + int colonIndex = pathPart.indexOf(':'); + if (colonIndex != -1) { + String namespace = pathPart.substring(0, colonIndex); + String path = pathPart.substring(colonIndex + 1); + return ResourceLocation.fromNamespaceAndPath(namespace, "shaders/core/" + path); + } + } + return ResourceLocation.withDefaultNamespace(name); } @Inject(method = "getOrCreate", at = {@At(value = "HEAD")}, cancellable = true) diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/AbstractContainerScreenMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/AbstractContainerScreenMixin.java index ad4a08601..69cc69217 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/AbstractContainerScreenMixin.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/AbstractContainerScreenMixin.java @@ -14,12 +14,17 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; @Mixin(AbstractContainerScreen.class) public abstract class AbstractContainerScreenMixin implements ContainerEventHandler { @Shadow public abstract T getMenu(); + + @Shadow + protected Slot hoveredSlot; @Inject(method = "removed", at = @At(value = "RETURN")) private void ldlib2$removed(CallbackInfo ci) { @@ -68,13 +73,14 @@ public abstract class AbstractContainerScreenMixin original) { if (getMenu() instanceof IItemSlotHolderMenu menu) { - if (menu.isItemSlot(slot)) { - ci.cancel(); + if (this.hoveredSlot != null && menu.isItemSlot(this.hoveredSlot)) { + return; } } + original.call(guiGraphics, x, y, z); } @Inject(method = "renderSlot", at = @At(value = "HEAD"), cancellable = true) diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/MenuTypeMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/MenuTypeMixin.java index cba7d0ea2..c7ff786b4 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/MenuTypeMixin.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/MenuTypeMixin.java @@ -6,7 +6,6 @@ import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.MenuType; -import net.neoforged.neoforge.common.NeoForge; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -26,20 +25,8 @@ public abstract class MenuTypeMixin { private void ldlib2$create1(int containerId, Inventory playerInventory, CallbackInfoReturnable cir) { var menu = cir.getReturnValue(); if (menu != null) { - NeoForge.EVENT_BUS.post(new ContainerMenuEvent.Create(playerInventory.player, menu)); + ContainerMenuEvent.CREATE.invoker().onCreate(playerInventory.player, menu); } } - - @Inject(method = "create(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/network/RegistryFriendlyByteBuf;)Lnet/minecraft/world/inventory/AbstractContainerMenu;", - at = @At(value = "RETURN")) - private void ldlib2$create2$return(int containerId, Inventory playerInventory, RegistryFriendlyByteBuf extraData, CallbackInfoReturnable cir) { - var menu = cir.getReturnValue(); - if (this.constructor instanceof net.neoforged.neoforge.network.IContainerFactory) { - NeoForge.EVENT_BUS.post(new ContainerMenuEvent.Create(playerInventory.player, menu)); - } - if (menu instanceof IModularUIHolder holder) { - holder.readInitialData(extraData); - } - } } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/ScreenMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/ScreenMixin.java index 30c1ac387..2364d0e4e 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/ScreenMixin.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/ScreenMixin.java @@ -57,7 +57,7 @@ public abstract class ScreenMixin extends AbstractContainerEventHandler implemen if (minecraft != null && mui != null) { if (!mui.shouldCloseOnKeyInventory()) { InputConstants.Key mouseKey = InputConstants.getKey(keyCode, scanCode); - if (minecraft.options.keyInventory.isActiveAndMatches(mouseKey)) { + if (minecraft.options.keyInventory.matchesMouse(mouseKey.getValue())) { cir.setReturnValue(mui.getWidget().keyPressed(keyCode, scanCode, modifiers)); } } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/ServerPlayerMixin.java b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/ServerPlayerMixin.java index 88b93c4e7..d46fdacc9 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/ServerPlayerMixin.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/core/mixins/ui/ServerPlayerMixin.java @@ -1,5 +1,7 @@ package com.lowdragmc.lowdraglib2.core.mixins.ui; +import org.spongepowered.asm.mixin.Mixin; + import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.lowdragmc.lowdraglib2.gui.event.ContainerMenuEvent; import com.lowdragmc.lowdraglib2.gui.holder.IModularUIHolder; @@ -7,8 +9,6 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.MenuProvider; import net.minecraft.world.inventory.AbstractContainerMenu; -import net.neoforged.neoforge.common.NeoForge; -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; @@ -17,25 +17,16 @@ @Mixin(ServerPlayer.class) public abstract class ServerPlayerMixin { - @Inject( - method = "lambda$openMenu$15", - at = @At(value = "RETURN") - ) - private static void ldlib2$writeCustomData(MenuProvider menuProvider, AbstractContainerMenu menu, Consumer extraDataWriter, RegistryFriendlyByteBuf buffer, CallbackInfo ci) { - if (menu instanceof IModularUIHolder holder) { - holder.writeInitialData(buffer); - } - } @ModifyExpressionValue( - method = "openMenu(Lnet/minecraft/world/MenuProvider;Ljava/util/function/Consumer;)Ljava/util/OptionalInt;", + method = "openMenu(Lnet/minecraft/world/MenuProvider;)Ljava/util/OptionalInt;", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/MenuProvider;createMenu(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/entity/player/Player;)Lnet/minecraft/world/inventory/AbstractContainerMenu;" ) ) private AbstractContainerMenu ldlib2$openMenu(AbstractContainerMenu original) { if (original != null) { - NeoForge.EVENT_BUS.post(new ContainerMenuEvent.Create((ServerPlayer)(Object)this, original)); + ContainerMenuEvent.CREATE.invoker().onCreate((ServerPlayer)(Object)this, original); } return original; } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/ClipboardManager.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/ClipboardManager.java index 3bce5bc52..e602a8fe3 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/ClipboardManager.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/ClipboardManager.java @@ -1,13 +1,11 @@ package com.lowdragmc.lowdraglib2.editor; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import lombok.Getter; import net.minecraft.client.Minecraft; import org.jetbrains.annotations.Nullable; import java.util.function.Supplier; -@KJSBindings public final class ClipboardManager { public static ClipboardManager INSTANCE = new ClipboardManager(); private ClipboardManager() {} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/project/IProject.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/project/IProject.java index d1070c2f5..9d7674f34 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/project/IProject.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/project/IProject.java @@ -5,7 +5,7 @@ import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.neoforged.neoforge.common.util.INBTSerializable; +import com.lowdragmc.lowdraglib2.utils.INBTSerializable; import javax.annotation.Nonnull; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/ColorsResource.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/ColorsResource.java index 382705543..d9e4225f2 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/ColorsResource.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/ColorsResource.java @@ -11,7 +11,6 @@ import com.lowdragmc.lowdraglib2.gui.ui.UIElement; import com.lowdragmc.lowdraglib2.gui.ui.elements.Button; import com.lowdragmc.lowdraglib2.gui.ui.elements.ColorSelector; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.IntTag; import net.minecraft.nbt.Tag; @@ -19,7 +18,6 @@ import org.jetbrains.annotations.Nullable; -@KJSBindings public class ColorsResource extends Resource { public static final ColorsResource INSTANCE = new ColorsResource(); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/EditorResourceEvent.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/EditorResourceEvent.java index e69346913..9f2f903a7 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/EditorResourceEvent.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/EditorResourceEvent.java @@ -1,17 +1,18 @@ package com.lowdragmc.lowdraglib2.editor.resource; -import net.neoforged.bus.api.Event; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; -public abstract class EditorResourceEvent extends Event { - public final ResourceInstance resourceInstance; +public interface EditorResourceEvent { + Event LOAD_BUILTIN = EventFactory.createArrayBacked(LoadBuiltin.class, + (listeners) -> (resourceInstance) -> { + for (LoadBuiltin listener : listeners) { + listener.onLoad(resourceInstance); + } + }); - public EditorResourceEvent(ResourceInstance resourceInstance) { - this.resourceInstance = resourceInstance; - } - - public static class LoadBuiltin extends EditorResourceEvent { - public LoadBuiltin(ResourceInstance resourceInstance) { - super(resourceInstance); - } + @FunctionalInterface + interface LoadBuiltin { + void onLoad(ResourceInstance resourceInstance); } } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/IRendererResource.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/IRendererResource.java index df084ae04..e10da0ad1 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/IRendererResource.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/IRendererResource.java @@ -14,7 +14,6 @@ import com.lowdragmc.lowdraglib2.gui.ui.UIElement; import com.lowdragmc.lowdraglib2.gui.ui.elements.Scene; import com.lowdragmc.lowdraglib2.gui.ui.event.UIEvents; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.math.Size; import com.lowdragmc.lowdraglib2.utils.data.BlockInfo; import com.lowdragmc.lowdraglib2.utils.virtuallevel.TrackedDummyWorld; @@ -28,7 +27,6 @@ import java.util.List; import java.util.Optional; -@KJSBindings public class IRendererResource extends Resource { public static final IRendererResource INSTANCE = new IRendererResource(); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/PackResourceManager.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/PackResourceManager.java index 2647c90c5..52f6661b2 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/PackResourceManager.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/PackResourceManager.java @@ -1,5 +1,7 @@ package com.lowdragmc.lowdraglib2.editor.resource; +import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; @@ -8,13 +10,18 @@ import java.util.Collections; import java.util.List; -public final class PackResourceManager implements ResourceManagerReloadListener { +public final class PackResourceManager implements SimpleSynchronousResourceReloadListener { public static PackResourceManager INSTANCE = new PackResourceManager(); private final List> providers = Collections.synchronizedList(new ArrayList<>()); private PackResourceManager() { } + @Override + public ResourceLocation getFabricId() { + return ResourceLocation.fromNamespaceAndPath("ldlib", "pack_resource_manager"); + } + public void registerProvider(PackFileResourceProvider provider) { providers.add(provider); } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/Resource.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/Resource.java index 39a7c9396..6b4ecca58 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/Resource.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/Resource.java @@ -12,7 +12,6 @@ import java.io.File; import net.minecraft.network.chat.Component; -import net.neoforged.neoforge.common.NeoForge; public abstract class Resource { public enum DisplayMode { @@ -63,7 +62,7 @@ public void buildBuiltin(ResourceInstance resourceInstance) { resourceInstance.addBuiltinProvider(global); // send an Event to register built resources - NeoForge.EVENT_BUS.post(new EditorResourceEvent.LoadBuiltin(resourceInstance)); + EditorResourceEvent.LOAD_BUILTIN.invoker().onLoad(resourceInstance); } /** diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/ResourceInstance.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/ResourceInstance.java index b3882ab0c..04aab5307 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/ResourceInstance.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/ResourceInstance.java @@ -13,7 +13,7 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.Tag; -import net.neoforged.neoforge.common.util.INBTSerializable; +import com.lowdragmc.lowdraglib2.utils.INBTSerializable; import javax.annotation.Nonnull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/Resources.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/Resources.java index 767258cf7..8ca950d41 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/Resources.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/Resources.java @@ -10,6 +10,9 @@ * @author KilaBash * @date 2022/12/2 * @implNote Resource + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/TexturesResource.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/TexturesResource.java index cbf90dd20..9d8be845b 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/TexturesResource.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/TexturesResource.java @@ -1,17 +1,16 @@ package com.lowdragmc.lowdraglib2.editor.resource; +import com.lowdragmc.lowdraglib2.Platform; import com.lowdragmc.lowdraglib2.LDLib2Registries; import com.lowdragmc.lowdraglib2.editor.ui.resource.ResourceProviderContainer; import com.lowdragmc.lowdraglib2.gui.texture.Icons; import com.lowdragmc.lowdraglib2.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib2.gui.texture.UIResourceTexture; import com.lowdragmc.lowdraglib2.gui.ui.UIElement; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; -@KJSBindings public class TexturesResource extends Resource { public static final TexturesResource INSTANCE = new TexturesResource(); @@ -44,6 +43,7 @@ public Tag serializeResource(IGuiTexture value, HolderLookup.Provider provider) @Override public IGuiTexture deserializeResource(Tag nbt, HolderLookup.Provider provider) { + if (provider == null) provider = Platform.getFrozenRegistry(); return IGuiTexture.CODEC.parse(provider.createSerializationContext(NbtOps.INSTANCE), nbt).result().orElse(IGuiTexture.MISSING_TEXTURE); } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/UIResource.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/UIResource.java index 18daa781c..2088ab21b 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/UIResource.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/resource/UIResource.java @@ -5,7 +5,6 @@ import com.lowdragmc.lowdraglib2.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib2.gui.texture.Icons; import com.lowdragmc.lowdraglib2.gui.ui.UITemplate; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; @@ -13,7 +12,6 @@ import org.jetbrains.annotations.Nullable; import java.io.File; -@KJSBindings public class UIResource extends Resource { public static final UIResource INSTANCE = new UIResource(); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/settings/EditorSettings.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/settings/EditorSettings.java index 237214185..1321abf93 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/settings/EditorSettings.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/settings/EditorSettings.java @@ -21,7 +21,7 @@ import lombok.Setter; import lombok.experimental.Accessors; import net.minecraft.resources.ResourceLocation; -import net.neoforged.fml.loading.FMLLoader; +import net.fabricmc.loader.api.FabricLoader; import org.appliedenergistics.yoga.YogaEdge; import java.io.File; @@ -34,7 +34,7 @@ public class EditorSettings implements IPersistedSerializable { private final Map settings = new LinkedHashMap<>(); private final Map> codecs = new HashMap<>(); @Getter @Setter @Accessors(chain = true) - private File settingsFile = FMLLoader.getGamePath().resolve("config").resolve(LDLib2.MOD_ID).resolve("editor.json").toFile(); + private File settingsFile = FabricLoader.getInstance().getGameDir().resolve("config").resolve(LDLib2.MOD_ID).resolve("editor.json").toFile(); // runtime private boolean isDirty = false; private JsonObject storedSettings = new JsonObject(); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/SceneEditor.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/SceneEditor.java index fb0b641db..355fe7790 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/SceneEditor.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/SceneEditor.java @@ -39,10 +39,6 @@ import java.util.*; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; - -/** - * A scene which provides editable features as a unity scene. - */ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class SceneEditor extends UIElement implements IScene { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/ISceneInteractable.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/ISceneInteractable.java index 2954a183e..925ace90a 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/ISceneInteractable.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/ISceneInteractable.java @@ -4,8 +4,8 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.jetbrains.annotations.Nullable; @@ -14,9 +14,11 @@ * @author KilaBash * @date 2024/06/26 * @implNote A scene object that can be interacted in the scene editor. - + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ -@OnlyIn(Dist.CLIENT) +@Environment(EnvType.CLIENT) public interface ISceneInteractable extends ISceneObject { /** diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/ISceneObject.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/ISceneObject.java index 75d939a17..dada7eb81 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/ISceneObject.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/ISceneObject.java @@ -1,8 +1,8 @@ package com.lowdragmc.lowdraglib2.editor.ui.sceneeditor.sceneobject; import com.lowdragmc.lowdraglib2.math.Transform; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -13,8 +13,11 @@ * @author KilaBash * @date 2024/06/26 * @implNote A scene object that can be placed in the scene editor. + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ -@OnlyIn(Dist.CLIENT) +@Environment(EnvType.CLIENT) public interface ISceneObject { /** * Get the unique id of the object. diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/ISceneRendering.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/ISceneRendering.java index 51b884772..bcf76bd9b 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/ISceneRendering.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/ISceneRendering.java @@ -2,21 +2,24 @@ import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.MultiBufferSource; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; /** * @author KilaBash * @date 2024/06/26 * @implNote A scene object that can be rendered in the scene editor. + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ -@OnlyIn(Dist.CLIENT) +@Environment(EnvType.CLIENT) public interface ISceneRendering extends ISceneObject { /** * Called before draw the object in the scene. * before the transform is applied. all children will be drawn after this. */ - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) default void preDraw(float partialTicks){ } @@ -24,14 +27,14 @@ default void preDraw(float partialTicks){ * Called after draw the object in the scene. * after the transform is applied. all children will be drawn before this. */ - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) default void postDraw(float partialTicks){ } /** * Draw the object in the scene. execute transform here. */ - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) default void draw(PoseStack poseStack, MultiBufferSource bufferSource, float partialTicks){ poseStack.pushPose(); poseStack.mulPose(transform().localToWorldMatrix()); @@ -42,6 +45,6 @@ default void draw(PoseStack poseStack, MultiBufferSource bufferSource, float par /** * Draw the object in the scene. */ - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) void drawInternal(PoseStack poseStack, MultiBufferSource bufferSource, float partialTicks); } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/TransformRef.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/TransformRef.java index 7f2efca25..f6d7d9846 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/TransformRef.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/TransformRef.java @@ -6,7 +6,7 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.StringTag; -import net.neoforged.neoforge.common.util.INBTSerializable; +import com.lowdragmc.lowdraglib2.utils.INBTSerializable; import org.jetbrains.annotations.UnknownNullability; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/utils/BlockModelObject.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/utils/BlockModelObject.java index 92675665b..0cff7b477 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/utils/BlockModelObject.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/utils/BlockModelObject.java @@ -8,8 +8,8 @@ import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; public class BlockModelObject extends SceneObject implements ISceneRendering { public BlockState blockState = Blocks.STONE.defaultBlockState(); @@ -18,7 +18,7 @@ public BlockModelObject() { } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void drawInternal(PoseStack poseStack, MultiBufferSource bufferSource, float partialTicks) { var renderer = Minecraft.getInstance().getBlockRenderer(); poseStack.translate(-0.5, -0.5, -0.5); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/utils/TransformGizmo.java b/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/utils/TransformGizmo.java index fd19886e1..ba30548ee 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/utils/TransformGizmo.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/editor/ui/sceneeditor/sceneobject/utils/TransformGizmo.java @@ -17,8 +17,8 @@ import net.minecraft.core.Direction; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.joml.Quaternionf; import org.joml.Vector2f; import org.joml.Vector3f; @@ -143,7 +143,7 @@ public boolean isHoverAxis(Direction.Axis axis) { } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void updateFrame(float partialTicks) { super.updateFrame(partialTicks); if (getScene() instanceof SceneEditor editor && editor.getModularUI() != null) { @@ -261,7 +261,7 @@ public void postDraw(float partialTicks) { } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void drawInternal(PoseStack poseStack, MultiBufferSource bufferSource, float partialTicks) { if (targetTransform == null) return; var buffer = bufferSource.getBuffer(LDLibRenderTypes.noDepthLines()); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ColorPattern.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ColorPattern.java index a955a60bf..beab25580 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ColorPattern.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ColorPattern.java @@ -2,15 +2,16 @@ import com.lowdragmc.lowdraglib2.gui.texture.ColorBorderTexture; import com.lowdragmc.lowdraglib2.gui.texture.ColorRectTexture; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.utils.ColorUtils; /** * @author KilaBash * @date 2022/12/1 * @implNote ColorPattern + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ -@KJSBindings public enum ColorPattern { WHITE(0xffffffff, "white"), T_WHITE(0x88ffffff, "transparent white"), diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/event/ContainerMenuEvent.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/event/ContainerMenuEvent.java index 75fefd572..c637bfb96 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/event/ContainerMenuEvent.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/event/ContainerMenuEvent.java @@ -1,39 +1,19 @@ package com.lowdragmc.lowdraglib2.gui.event; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; -import net.neoforged.bus.api.Event; -public abstract class ContainerMenuEvent extends Event { - public final Player player; - public final AbstractContainerMenu menu; - protected ContainerMenuEvent(Player player, AbstractContainerMenu menu) { - this.player = player; - this.menu = menu; - } - - /** - * Event triggered when a new {@link AbstractContainerMenu} is created and associated with a {@link Player}. - * This class is used to represent the creation process of a container menu, - * allowing for further customization or handling through event listeners. - * - *

Usage: This event can be posted to or consumed for adding additional logic when - * a container menu is initialized for a player.

- * - * @see ContainerMenuEvent - * @see AbstractContainerMenu - * @see Player - */ - public static class Create extends ContainerMenuEvent { - public Create(Player player, AbstractContainerMenu menu) { - super(player, menu); +public interface ContainerMenuEvent { + Event CREATE = EventFactory.createArrayBacked(Create.class, callbacks -> (player, menu) -> { + for (Create callback : callbacks) { + callback.onCreate(player, menu); } + }); - /** - * Return if the menu is created on the remote(client) side. - */ - public boolean isRemote() { - return player.level().isClientSide; - } + interface Create { + void onCreate(Player player, AbstractContainerMenu menu); } } + diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/BlockUIMenuType.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/BlockUIMenuType.java index 8d508483e..c238a9b52 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/BlockUIMenuType.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/BlockUIMenuType.java @@ -2,6 +2,7 @@ import com.lowdragmc.lowdraglib2.gui.ui.ModularUI; import com.lowdragmc.lowdraglib2.gui.holder.ModularUIContainerMenu; +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -9,7 +10,6 @@ import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -19,68 +19,47 @@ import javax.annotation.ParametersAreNonnullByDefault; public class BlockUIMenuType { + + public record BlockUIOpeningData(BlockPos pos, BlockState state) {} public static final StreamCodec BLOCK_STATE_STREAM_CODEC = ByteBufCodecs.fromCodecWithRegistries(BlockState.CODEC); + public static final StreamCodec STREAM_CODEC = StreamCodec.of( + (buf, data) -> { + buf.writeBlockPos(data.pos()); + BLOCK_STATE_STREAM_CODEC.encode(buf, data.state()); + }, + buf -> new BlockUIOpeningData(buf.readBlockPos(), BLOCK_STATE_STREAM_CODEC.decode(buf)) + ); - /** - * Opens a UI for the specified player at the given block position if the block at that position - * supports a {@link BlockUI}. - * - * @param player the {@link Player} for whom the UI should be opened. - * @param pos the {@link BlockPos} representing the position of the block where the UI is being opened. - * @return {@code true} if the UI was successfully opened, {@code false} otherwise. - */ public static boolean openUI(ServerPlayer player, BlockPos pos) { var blockstate = player.level().getBlockState(pos); if (blockstate.getBlock() instanceof BlockUI blockUI) { var holder = blockUI.createUIHolder(player, pos, blockstate); - return player.openMenu(holder).isPresent(); + player.openMenu(holder); + return true; } return false; } - public static ModularUIContainerMenu create(int windowId, Inventory inv, RegistryFriendlyByteBuf data) { + public static ModularUIContainerMenu create(int windowId, Inventory inv, BlockUIOpeningData data) { var player = inv.player; - var pos = data.readBlockPos(); - var blockstate = BLOCK_STATE_STREAM_CODEC.decode(data); + var pos = data.pos(); + var blockstate = data.state(); if (blockstate.getBlock() instanceof BlockUI blockUI) { var holder = blockUI.createUIHolder(player, pos, blockstate); - return new ModularUIContainerMenu(LDMenuTypes.BLOCK_UI.get(), windowId, inv, holder); + return new ModularUIContainerMenu(LDMenuTypes.BLOCK_UI, windowId, inv, holder); } - throw new IllegalArgumentException("No held item ui found for block " + blockstate); + throw new IllegalArgumentException("No block ui found for block " + blockstate); } @FunctionalInterface public interface BlockUI { - /** - * Creates and returns the {@link ModularUI} associated with the provided {@link BlockUIHolder}. - * - * @param holder the {@link BlockUIHolder} containing contextual information for constructing the {@link ModularUI}. - * @return a {@link ModularUI} generated based on the given {@link BlockUIHolder}. - */ ModularUI createUI(BlockUIHolder holder); - /** - * Creates a {@link BlockUIHolder} for handling UI interactions associated with a specific block in the world. - * - * @param player the {@link Player} interacting with the block. - * @param pos the {@link BlockPos} representing the position of the block in the world. - * @param blockState the {@link BlockState} representing the current state of the block. - * @return a new {@link BlockUIHolder} instance containing the provided contextual information. - */ default BlockUIHolder createUIHolder(Player player, BlockPos pos, BlockState blockState) { return new BlockUIHolder(this, player, pos, blockState); } - /** - * Determines whether the block state associated with the given {@link BlockUIHolder} - * is still valid in the current game context. - * - * @param holder the {@link BlockUIHolder} that contains the block state, player, and position data. - * @return {@code true} if the block state in the {@link BlockUIHolder} matches the current block state at the position; - * {@code false} otherwise. - */ default boolean stillValid(BlockUIHolder holder) { - // valid if still the same block return holder.blockState.is(holder.player.level().getBlockState(holder.pos).getBlock()); } @@ -91,7 +70,7 @@ default Component getUIDisplayName(BlockUIHolder holder) { @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault - public static class BlockUIHolder implements MenuProvider, IContainerUIHolder { + public static class BlockUIHolder implements ExtendedScreenHandlerFactory, IContainerUIHolder { public final BlockUI blockUI; public final Player player; public final BlockPos pos; @@ -117,14 +96,11 @@ public Component getDisplayName() { @Override @Nullable public ModularUIContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) { - return new ModularUIContainerMenu(LDMenuTypes.BLOCK_UI.get(), containerId, playerInventory, this); + return new ModularUIContainerMenu(LDMenuTypes.BLOCK_UI, containerId, playerInventory, this); } @Override - public void writeClientSideData(AbstractContainerMenu menu, RegistryFriendlyByteBuf buffer) { - buffer.writeBlockPos(pos); - BLOCK_STATE_STREAM_CODEC.encode(buffer, blockState); - } + public BlockUIOpeningData getScreenOpeningData(net.minecraft.server.level.ServerPlayer player) { return new BlockUIOpeningData(pos, blockState); } @Override public ModularUI createUI(Player player) { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/HeldItemUIMenuType.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/HeldItemUIMenuType.java index 465d285b5..7a345f42c 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/HeldItemUIMenuType.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/HeldItemUIMenuType.java @@ -2,12 +2,12 @@ import com.lowdragmc.lowdraglib2.gui.ui.ModularUI; import com.lowdragmc.lowdraglib2.gui.holder.ModularUIContainerMenu; +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; -import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -17,68 +17,44 @@ import javax.annotation.ParametersAreNonnullByDefault; public class HeldItemUIMenuType { - /** - * Opens a user interface (UI) for the specified player using the item held in the specified interaction hand. - * This method checks if the held item can provide a {@link HeldItemUI} instance, creates a corresponding - * UI holder, and attempts to open the menu for the player. - * - * @param player the {@link Player} attempting to open the UI - * @param hand the {@link InteractionHand} used to interact, specifying which hand holds the item - * @return {@code true} if the UI was opened successfully, {@code false} if the held item does not support - * a UI or the menu could not be opened - */ + public record HeldItemUIOpeningData(InteractionHand hand, ItemStack itemStack) {} + public static final net.minecraft.network.codec.StreamCodec STREAM_CODEC = net.minecraft.network.codec.StreamCodec.of( + (buf, data) -> { + buf.writeEnum(data.hand()); + ItemStack.OPTIONAL_STREAM_CODEC.encode(buf, data.itemStack()); + }, + buf -> new HeldItemUIOpeningData(buf.readEnum(InteractionHand.class), ItemStack.OPTIONAL_STREAM_CODEC.decode(buf)) + ); + public static boolean openUI(ServerPlayer player, InteractionHand hand) { var heldItem = player.getItemInHand(hand); if (heldItem.getItem() instanceof HeldItemUI heldItemUI) { var holder = heldItemUI.createUIHolder(player, hand, heldItem); - return player.openMenu(holder).isPresent(); + player.openMenu(holder); + return true; } return false; } - public static ModularUIContainerMenu create(int windowId, Inventory inv, RegistryFriendlyByteBuf data) { + public static ModularUIContainerMenu create(int windowId, Inventory inv, HeldItemUIOpeningData data) { var player = inv.player; - var hand = data.readEnum(InteractionHand.class); - var itemstack = ItemStack.OPTIONAL_STREAM_CODEC.decode(data); + var hand = data.hand(); + var itemstack = data.itemStack(); if (itemstack.getItem() instanceof HeldItemUI heldItemUI) { var holder = heldItemUI.createUIHolder(player, hand, itemstack); - return new ModularUIContainerMenu(LDMenuTypes.HELD_ITEM_UI.get(), windowId, inv, holder); + return new ModularUIContainerMenu(LDMenuTypes.HELD_ITEM_UI, windowId, inv, holder); } throw new IllegalArgumentException("No held item ui found for item " + itemstack); } @FunctionalInterface public interface HeldItemUI { - /** - * Creates a {@code ModularUI} instance based on the provided {@link HeldItemUIHolder}. - * - * @param holder the {@link HeldItemUIHolder} containing contextual data - * required for generating the {@code ModularUI} - * @return a {@code ModularUI} instance constructed using the*/ ModularUI createUI(HeldItemUIHolder holder); - /** - * Creates a new instance of {@link HeldItemUIHolder} with the provided player, hand, and item stack. - * - * @param player The {@link Player} interacting with the UI. - * @param hand The {@link InteractionHand} used by the player, specifying which hand is holding the item. - * @param itemStack The {@link ItemStack} representing the item the player is interacting with. - * @return A new {@link HeldItemUIHolder} instance initialized with the given context. - */ default HeldItemUIHolder createUIHolder(Player player, InteractionHand hand, ItemStack itemStack) { return new HeldItemUIHolder(this, player, hand, itemStack); } - /** - * Checks whether the given {@link HeldItemUIHolder} is still valid. - * Validity is determined by comparing the {@link ItemStack} currently held in the specified player's hand - * with the {@link ItemStack} stored in the {@link HeldItemUIHolder}. - * - * @param holder the {@link HeldItemUIHolder} which contains contextual information including the player, - * the hand being used, and the original {@link ItemStack}. - * @return {@code true} if the current item held in the player's hand matches the stored {@link ItemStack}, - * {@code false} otherwise. - */ default boolean stillValid(HeldItemUIHolder holder) { var current = holder.player.getItemInHand(holder.hand); return ItemStack.matches(current, holder.itemStack); @@ -91,7 +67,7 @@ default Component getUIDisplayName(HeldItemUIHolder holder) { @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault - public static class HeldItemUIHolder implements MenuProvider, IContainerUIHolder { + public static class HeldItemUIHolder implements ExtendedScreenHandlerFactory, IContainerUIHolder { public final HeldItemUI heldItemUI; public final Player player; public final InteractionHand hand; @@ -117,14 +93,10 @@ public Component getDisplayName() { @Override @Nullable public ModularUIContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) { - return new ModularUIContainerMenu(LDMenuTypes.HELD_ITEM_UI.get(), containerId, playerInventory, this); + return new ModularUIContainerMenu(LDMenuTypes.HELD_ITEM_UI, containerId, playerInventory, this); } - @Override - public void writeClientSideData(AbstractContainerMenu menu, RegistryFriendlyByteBuf buffer) { - buffer.writeEnum(hand); - ItemStack.OPTIONAL_STREAM_CODEC.encode(buffer, itemStack); - } + public HeldItemUIOpeningData getScreenOpeningData(net.minecraft.server.level.ServerPlayer player) { return new HeldItemUIOpeningData(hand, itemStack); } @Override public ModularUI createUI(Player player) { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/LDMenuTypes.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/LDMenuTypes.java index a171d6789..a65d0015a 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/LDMenuTypes.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/LDMenuTypes.java @@ -6,28 +6,22 @@ import com.lowdragmc.lowdraglib2.gui.holder.ModularUIContainerMenu; import com.lowdragmc.lowdraglib2.gui.ui.ModularUI; import com.lowdragmc.lowdraglib2.gui.ui.UI; -import com.lowdragmc.lowdraglib2.integration.kjs.ui.LDKJSMenuTypes; +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerType; +import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.inventory.MenuType; -import net.neoforged.bus.api.IEventBus; -import net.neoforged.neoforge.common.extensions.IMenuTypeExtension; -import net.neoforged.neoforge.registries.DeferredRegister; - -import java.util.function.Supplier; public final class LDMenuTypes { - public static final DeferredRegister> MENUS = DeferredRegister.create(BuiltInRegistries.MENU, LDLib2.MOD_ID); - - public static final Supplier> PLAYER_UI = MENUS.register("player_ui", - () -> IMenuTypeExtension.create(PlayerUIMenuType::create)); - public static final Supplier> HELD_ITEM_UI = MENUS.register("held_item_ui", - () -> IMenuTypeExtension.create(HeldItemUIMenuType::create)); + public static MenuType PLAYER_UI; + public static MenuType HELD_ITEM_UI; + public static MenuType BLOCK_UI; - public static final Supplier> BLOCK_UI = MENUS.register("block_ui", - () -> IMenuTypeExtension.create(BlockUIMenuType::create)); + public static void init() { + PLAYER_UI = register("player_ui", new ExtendedScreenHandlerType<>(PlayerUIMenuType::create, net.minecraft.resources.ResourceLocation.STREAM_CODEC)); + HELD_ITEM_UI = register("held_item_ui", new ExtendedScreenHandlerType<>(HeldItemUIMenuType::create, HeldItemUIMenuType.STREAM_CODEC)); + BLOCK_UI = register("block_ui", new ExtendedScreenHandlerType<>(BlockUIMenuType::create, BlockUIMenuType.STREAM_CODEC)); - public static void init(IEventBus eventBus) { PlayerUIMenuType.register(UIEditor.WINDOW_ID, ignored -> player -> { if (player.level().isClientSide) { return new ModularUI(UI.of(EditorWindow.open(UIEditor.WINDOW_ID, UIEditor::new))) @@ -37,9 +31,10 @@ public static void init(IEventBus eventBus) { return new ModularUI(UI.empty()); }); - if (LDLib2.isKubejsLoaded()) { - LDKJSMenuTypes.init(); - } - MENUS.register(eventBus); + // KubeJS integration removed as per Phase 0 + } + + private static > T register(String name, T type) { + return Registry.register(BuiltInRegistries.MENU, LDLib2.id(name), type); } } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/PlayerUIMenuType.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/PlayerUIMenuType.java index 13345c5f3..c638a968d 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/PlayerUIMenuType.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/factory/PlayerUIMenuType.java @@ -1,11 +1,12 @@ package com.lowdragmc.lowdraglib2.gui.factory; import com.lowdragmc.lowdraglib2.gui.holder.ModularUIContainerMenu; +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.MenuProvider; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -28,48 +29,35 @@ public static void unregister(ResourceLocation id) { UI_HOLDERS.remove(id); } - /** - * Opens a UI for the specified player if the given identifier is registered. - * This method checks if a corresponding UI holder exists for the provided id, - * creates the holder instance using the associated provider, and opens the menu for the player. - * - * @param player the {@link Player} for whom the UI should be opened - * @param id the {@link ResourceLocation} identifier of the UI to be opened - * @return {@code true} if the UI was successfully opened, {@code false} if the id is not registered - * or the holder instance could not be created - */ public static boolean openUI(Player player, ResourceLocation id) { if (!UI_HOLDERS.containsKey(id)) return false; var holder = UI_HOLDERS.get(id).apply(player); if (holder == null) return false; - player.openMenu(new MenuProvider() { + player.openMenu(new ExtendedScreenHandlerFactory() { @Override - public Component getDisplayName() { - return Component.translatable(id.toLanguageKey()); + public ResourceLocation getScreenOpeningData(ServerPlayer player) { + return id; } @Override - public AbstractContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) { - return new ModularUIContainerMenu(LDMenuTypes.PLAYER_UI.get(), containerId, playerInventory, holder); + public Component getDisplayName() { + return Component.translatable(id.toLanguageKey()); } - @Override - public void writeClientSideData(AbstractContainerMenu menu, RegistryFriendlyByteBuf buffer) { - buffer.writeResourceLocation(id); + public AbstractContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) { + return new ModularUIContainerMenu(LDMenuTypes.PLAYER_UI, containerId, playerInventory, holder); } }); return true; } - public static ModularUIContainerMenu create(int windowId, Inventory inv, RegistryFriendlyByteBuf data) { - var id = data.readResourceLocation(); + public static ModularUIContainerMenu create(int windowId, Inventory inv, net.minecraft.resources.ResourceLocation id) { var holder = UI_HOLDERS.get(id).apply(inv.player); if (holder == null) throw new IllegalArgumentException("No player ui holder found for id " + id); - return new ModularUIContainerMenu(LDMenuTypes.PLAYER_UI.get(), windowId, inv, holder); + return new ModularUIContainerMenu(LDMenuTypes.PLAYER_UI, windowId, inv, holder); } - @FunctionalInterface public interface PlayerUIHolder extends IContainerUIHolder { @Override diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/holder/DebugScreen.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/holder/DebugScreen.java index 5a4ab9802..ae13977d3 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/holder/DebugScreen.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/holder/DebugScreen.java @@ -12,8 +12,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.joml.Vector2i; import org.lwjgl.glfw.GLFW; import org.lwjgl.opengl.GL11; @@ -124,7 +124,7 @@ public void mouseMoved(double mouseX, double mouseY) { } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { REAL_MOUSE_POS.set(mouseX, mouseY); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/holder/ModularUIContainerScreen.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/holder/ModularUIContainerScreen.java index 853e14192..787cc2a08 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/holder/ModularUIContainerScreen.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/holder/ModularUIContainerScreen.java @@ -5,12 +5,12 @@ import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import javax.annotation.ParametersAreNonnullByDefault; -@OnlyIn(Dist.CLIENT) +@Environment(EnvType.CLIENT) @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ModularUIContainerScreen extends AbstractContainerScreen { @@ -21,12 +21,19 @@ public ModularUIContainerScreen(ModularUIContainerMenu container, Inventory inve @Override public void init() { - // the modular widget has already added + init by events - this.imageWidth = (int) getMenu().getModularUI().getWidth(); - this.imageHeight = (int) getMenu().getModularUI().getHeight(); + var mui = getMenu().getModularUI(); + if (mui != null) { + // Initialize ModularUI with screen dimensions BEFORE super.init(), matching NeoForge's ScreenEvent.Init.Pre behavior. + // This ensures stylesheets and layout are resolved before the screen finalizes its state. + mui.setScreenAndInit(this); + this.imageWidth = (int) mui.getWidth(); + this.imageHeight = (int) mui.getHeight(); + } super.init(); - // initial focus - setFocused(getMenu().modularUI.getWidget()); + if (mui != null) { + this.addRenderableWidget(mui.getWidget()); + setFocused(mui.getWidget()); + } } @Override diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/holder/ModularUIScreen.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/holder/ModularUIScreen.java index 6963d6452..12728f7d8 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/holder/ModularUIScreen.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/holder/ModularUIScreen.java @@ -6,12 +6,12 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import javax.annotation.ParametersAreNonnullByDefault; -@OnlyIn(Dist.CLIENT) +@Environment(EnvType.CLIENT) @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ModularUIScreen extends Screen { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/hud/ModularHudLayer.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/hud/ModularHudLayer.java index 11ff33855..3f693e74b 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/hud/ModularHudLayer.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/hud/ModularHudLayer.java @@ -7,14 +7,14 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.LayeredDraw; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; -@OnlyIn(Dist.CLIENT) +@Environment(EnvType.CLIENT) @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @FunctionalInterface diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/slot/ItemHandlerSlot.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/slot/ItemHandlerSlot.java index 2cac4261a..75e09dce2 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/slot/ItemHandlerSlot.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/slot/ItemHandlerSlot.java @@ -1,7 +1,6 @@ package com.lowdragmc.lowdraglib2.gui.slot; import com.google.common.base.Predicates; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; @@ -10,7 +9,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.items.IItemHandlerModifiable; +import com.lowdragmc.lowdraglib2.utils.items.IItemHandlerModifiable; import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; @@ -19,7 +18,6 @@ import java.util.List; import java.util.function.Predicate; -@KJSBindings public class ItemHandlerSlot extends Slot { private static final Container emptyInventory = new SimpleContainer(0); @Getter @Setter @Accessors(chain = true) diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/slot/LocalSlot.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/slot/LocalSlot.java index 95422fdf4..b7fdf8b06 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/slot/LocalSlot.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/slot/LocalSlot.java @@ -1,10 +1,8 @@ package com.lowdragmc.lowdraglib2.gui.slot; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import net.minecraft.world.SimpleContainer; import net.minecraft.world.inventory.Slot; -@KJSBindings public class LocalSlot extends Slot { public LocalSlot() { super(new SimpleContainer(1), 0, 0, 0); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/UISyncManager.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/UISyncManager.java index 4d95a7166..7dd041749 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/UISyncManager.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/UISyncManager.java @@ -3,6 +3,7 @@ import com.lowdragmc.lowdraglib2.LDLib2; import com.lowdragmc.lowdraglib2.gui.sync.rpc.RPCEvent; import com.lowdragmc.lowdraglib2.gui.ui.ModularUI; +import com.lowdragmc.lowdraglib2.networking.LDLNetworking; import com.lowdragmc.lowdraglib2.networking.both.PacketModularUISync; import com.lowdragmc.lowdraglib2.networking.c2s.CPacketUIRPCEvent; import com.lowdragmc.lowdraglib2.networking.s2c.SPacketUIRPCEventReturn; @@ -11,7 +12,6 @@ import lombok.Getter; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; -import net.neoforged.neoforge.network.PacketDistributor; import org.apache.commons.lang3.function.Consumers; import java.util.*; @@ -68,9 +68,9 @@ public final void tick() { writePack(buf, toSync); }, modularUI.player.level().registryAccess()); if (modularUI.player.level().isClientSide) { - PacketDistributor.sendToServer(new PacketModularUISync(data)); + com.lowdragmc.lowdraglib2.networking.LDLNetworking.sendToServer(new PacketModularUISync(data)); } else if (modularUI.player instanceof ServerPlayer serverPlayer) { - PacketDistributor.sendToPlayer(serverPlayer, new PacketModularUISync(data)); + com.lowdragmc.lowdraglib2.networking.LDLNetworking.sendToPlayer(serverPlayer, new PacketModularUISync(data)); } } @@ -153,7 +153,7 @@ public void sendEvent(RPCEvent event, Consumer responseCallback, Object.. buf.writeVarInt(requestID); event.writeParametersToBuffer(buf, args); }, player.level().registryAccess()); - PacketDistributor.sendToServer(new CPacketUIRPCEvent(data)); + com.lowdragmc.lowdraglib2.networking.LDLNetworking.sendToServer(new CPacketUIRPCEvent(data)); } public void handEvent(RegistryFriendlyByteBuf buf) { @@ -182,7 +182,7 @@ public void handEvent(RegistryFriendlyByteBuf buf) { returnBuf.writeVarInt(requestID); rpcEvent.writeReturnValueToBuffer(returnBuf, returnValue); }, player.level().registryAccess()); - PacketDistributor.sendToPlayer(serverPlayer, new SPacketUIRPCEventReturn(data)); + com.lowdragmc.lowdraglib2.networking.LDLNetworking.sendToPlayer(serverPlayer, new SPacketUIRPCEventReturn(data)); } } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/bindings/impl/DataBindingBuilder.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/bindings/impl/DataBindingBuilder.java index 2c7fbef60..86207ad2f 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/bindings/impl/DataBindingBuilder.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/bindings/impl/DataBindingBuilder.java @@ -3,7 +3,6 @@ import com.lowdragmc.lowdraglib2.LDLib2; import com.lowdragmc.lowdraglib2.gui.sync.bindings.IDataSource; import com.lowdragmc.lowdraglib2.gui.sync.bindings.SyncStrategy; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; @@ -12,7 +11,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; -import net.neoforged.neoforge.fluids.FluidStack; +import dev.architectury.fluid.FluidStack; import org.apache.commons.lang3.function.Consumers; import org.apache.commons.lang3.function.Suppliers; @@ -27,7 +26,6 @@ @Accessors(chain = true, fluent = true) @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -@KJSBindings public class DataBindingBuilder { @Getter @Setter private String name = "unknown"; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/bindings/impl/ScrollDataSource.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/bindings/impl/ScrollDataSource.java index b84629e9a..dd1f11522 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/bindings/impl/ScrollDataSource.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/bindings/impl/ScrollDataSource.java @@ -2,7 +2,6 @@ import com.lowdragmc.lowdraglib2.gui.sync.bindings.IDataProvider; import com.lowdragmc.lowdraglib2.gui.util.ITickable; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.syncdata.ISubscription; import lombok.Data; import lombok.Getter; @@ -17,7 +16,6 @@ import java.util.function.Function; @Data(staticConstructor = "of") -@KJSBindings public final class ScrollDataSource implements IDataProvider, ITickable { @Getter private final List data; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/bindings/impl/SupplierDataSource.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/bindings/impl/SupplierDataSource.java index a1c739f9a..2605d783f 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/bindings/impl/SupplierDataSource.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/bindings/impl/SupplierDataSource.java @@ -2,7 +2,6 @@ import com.lowdragmc.lowdraglib2.gui.sync.bindings.IDataProvider; import com.lowdragmc.lowdraglib2.gui.util.ITickable; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.syncdata.ISubscription; import lombok.Data; import lombok.Getter; @@ -16,7 +15,6 @@ import java.util.function.Function; import java.util.function.Supplier; -@KJSBindings public final class SupplierDataSource implements IDataProvider, ITickable { @Getter private final Supplier supplier; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/rpc/RPCEventBuilder.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/rpc/RPCEventBuilder.java index 0928e75f5..e07f1e351 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/rpc/RPCEventBuilder.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/sync/rpc/RPCEventBuilder.java @@ -1,6 +1,5 @@ package com.lowdragmc.lowdraglib2.gui.sync.rpc; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.syncdata.SyncValueHolder; import com.lowdragmc.lowdraglib2.utils.consumer.*; import com.mojang.datafixers.util.*; @@ -12,7 +11,6 @@ import java.util.List; import java.util.function.*; -@KJSBindings public class RPCEventBuilder { private final List args = new ArrayList<>(); private final List initialArgs = new ArrayList<>(); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/AnimationTexture.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/AnimationTexture.java index 0137f7d84..d581bb584 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/AnimationTexture.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/AnimationTexture.java @@ -13,7 +13,6 @@ import com.lowdragmc.lowdraglib2.gui.ui.elements.Button; import com.lowdragmc.lowdraglib2.gui.ui.style.StyleOrigin; import com.lowdragmc.lowdraglib2.gui.ui.styletemplate.Sprites; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; @@ -22,15 +21,17 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.resources.ResourceLocation; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; /** * @author KilaBash * @date 2022/9/14 * @implNote AnimationTexture + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ -@KJSBindings @LDLRegisterClient(name = "animation_texture", registry = "ldlib2:gui_texture") public class AnimationTexture extends TransformTexture { @@ -114,7 +115,7 @@ public AnimationTexture setColor(int color) { return this; } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void updateTick() { if (Minecraft.getInstance().level != null) { long tick = Minecraft.getInstance().level.getGameTime(); @@ -135,7 +136,7 @@ public void updateTick() { } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { updateTick(); float cell = 1f / this.cellSize; @@ -156,7 +157,7 @@ protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, fl } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void createPreview(ConfiguratorGroup father) { super.createPreview(father); var configurator = new Configurator("ldlib.gui.editor.group.base_image"); @@ -190,7 +191,7 @@ public void createPreview(ConfiguratorGroup father) { )); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawRawTextureGuides(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { SpriteTexture.of(imageLocation.toString()).draw(graphics, mouseX, mouseY, x, y, width, height, partialTicks); float cell = 1f / this.cellSize; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ColorBorderTexture.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ColorBorderTexture.java index 7bcdb30df..bad89ef0d 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ColorBorderTexture.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ColorBorderTexture.java @@ -4,14 +4,12 @@ import com.lowdragmc.lowdraglib2.configurator.annotation.ConfigColor; import com.lowdragmc.lowdraglib2.configurator.annotation.ConfigNumber; import com.lowdragmc.lowdraglib2.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; import com.lowdragmc.lowdraglib2.utils.ColorUtils; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.gui.GuiGraphics; -@KJSBindings @LDLRegisterClient(name = "color_border_texture", registry = "ldlib2:gui_texture") public class ColorBorderTexture extends TransformTexture{ @@ -64,7 +62,7 @@ public IGuiTexture interpolate(IGuiTexture other, float lerp) { return super.interpolate(other, lerp); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) @Override protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { if (width <= 0 || height <= 0) return; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ColorRectTexture.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ColorRectTexture.java index 18e5fb2ab..6eabac987 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ColorRectTexture.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ColorRectTexture.java @@ -3,18 +3,16 @@ import com.lowdragmc.lowdraglib2.configurator.annotation.Configurable; import com.lowdragmc.lowdraglib2.configurator.annotation.ConfigColor; import com.lowdragmc.lowdraglib2.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; import com.lowdragmc.lowdraglib2.utils.ColorUtils; import lombok.Setter; import lombok.experimental.Accessors; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.gui.GuiGraphics; @LDLRegisterClient(name = "color_rect_texture", registry = "ldlib2:gui_texture") @Accessors(chain = true) -@KJSBindings public class ColorRectTexture extends TransformTexture { @Configurable @ConfigColor @@ -48,7 +46,7 @@ public IGuiTexture interpolate(IGuiTexture other, float lerp) { return super.interpolate(other, lerp); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) @Override protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { if (width <= 0 || height <= 0) return; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/DynamicTexture.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/DynamicTexture.java index 1ff2a15b0..9aece382b 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/DynamicTexture.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/DynamicTexture.java @@ -1,13 +1,11 @@ package com.lowdragmc.lowdraglib2.gui.texture; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import net.minecraft.client.gui.GuiGraphics; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import java.util.function.Supplier; -@KJSBindings public class DynamicTexture implements IGuiTexture { public Supplier textureSupplier; @@ -20,7 +18,7 @@ public static DynamicTexture of(Supplier rendererSupplier) { } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void draw(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { textureSupplier.get().draw(graphics, mouseX, mouseY, x, y, width, height, partialTicks); } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/FluidStackTexture.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/FluidStackTexture.java index 9f27e915d..166ff5b12 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/FluidStackTexture.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/FluidStackTexture.java @@ -3,17 +3,15 @@ import com.lowdragmc.lowdraglib2.configurator.annotation.ConfigColor; import com.lowdragmc.lowdraglib2.configurator.annotation.Configurable; import com.lowdragmc.lowdraglib2.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluids; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.fluids.FluidStack; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import dev.architectury.fluid.FluidStack; -@KJSBindings @LDLRegisterClient(name = "fluid_stack_texture", registry = "ldlib2:gui_texture") public class FluidStackTexture extends TransformTexture { @Configurable(name = "ldlib.gui.editor.name.fluids") @@ -37,7 +35,7 @@ public FluidStackTexture(FluidStack... fluidStacks) { public FluidStackTexture(Fluid... fluids) { this.fluids = new FluidStack[fluids.length]; for(int i = 0; i < fluids.length; i++) { - this.fluids[i] = new FluidStack(fluids[i], 1000); + this.fluids[i] = FluidStack.create(fluids[i], 1000L); } } @@ -61,7 +59,7 @@ public FluidStackTexture copy() { return copied; } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void updateTick() { if (Minecraft.getInstance().level != null) { long tick = Minecraft.getInstance().level.getGameTime(); @@ -73,7 +71,7 @@ public void updateTick() { } } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) @Override protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { if (fluids.length == 0) return; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/GuiTextureGroup.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/GuiTextureGroup.java index 38ad61ff6..04bf3f134 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/GuiTextureGroup.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/GuiTextureGroup.java @@ -2,14 +2,12 @@ import com.lowdragmc.lowdraglib2.configurator.annotation.Configurable; import com.lowdragmc.lowdraglib2.gui.ui.rendering.GUIContext; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; import lombok.Getter; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.gui.GuiGraphics; -@KJSBindings @LDLRegisterClient(name = "group_texture", registry = "ldlib2:gui_texture") public class GuiTextureGroup extends TransformTexture { @Configurable(collapse = false) @@ -45,7 +43,7 @@ public GuiTextureGroup setColor(int color) { } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawInternal(GUIContext context, float x, float y, float width, float height) { for (IGuiTexture texture : textures) { texture.draw(context, x, y, width, height); @@ -53,7 +51,7 @@ protected void drawInternal(GUIContext context, float x, float y, float width, f } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { for (IGuiTexture texture : textures) { texture.draw(graphics, mouseX,mouseY, x, y, width, height, partialTicks); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/IGuiRenderable.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/IGuiRenderable.java index 6d187dd85..74820506b 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/IGuiRenderable.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/IGuiRenderable.java @@ -2,13 +2,13 @@ import com.lowdragmc.lowdraglib2.gui.ui.rendering.GUIContext; import net.minecraft.client.gui.GuiGraphics; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; @FunctionalInterface public interface IGuiRenderable extends IGuiTexture { @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) default void draw(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/IGuiTexture.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/IGuiTexture.java index 3c735e370..7da151399 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/IGuiTexture.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/IGuiTexture.java @@ -11,7 +11,6 @@ import com.lowdragmc.lowdraglib2.gui.ui.rendering.GUIContext; import com.lowdragmc.lowdraglib2.gui.ui.style.StyleOrigin; import com.lowdragmc.lowdraglib2.gui.ui.styletemplate.Sprites; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.ILDLRegisterClient; import com.lowdragmc.lowdraglib2.registry.RegistrationEnvironment; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; @@ -26,8 +25,8 @@ import net.minecraft.client.renderer.texture.MissingTextureAtlasSprite; import net.minecraft.nbt.NbtOps; import net.minecraft.resources.ResourceLocation; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.GameRenderer; import org.jetbrains.annotations.Nullable; @@ -37,7 +36,6 @@ import static com.mojang.blaze3d.vertex.DefaultVertexFormat.POSITION_TEX; -@KJSBindings @FunctionalInterface public interface IGuiTexture extends IPersistedSerializable, IConfigurable, ILDLRegisterClient> { //region builtin textures @@ -46,7 +44,7 @@ final class EmptyTexture implements IGuiTexture { @Override public IGuiTexture copy() { return EMPTY; } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) @Override public void draw(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) {} } @@ -56,7 +54,7 @@ final class MissingTexture implements IGuiTexture { @Override public IGuiTexture copy() { return MISSING_TEXTURE; } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) @Override public void draw(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { Tesselator tessellator = Tesselator.getInstance(); @@ -148,7 +146,7 @@ default IGuiTexture copy() { default IGuiTexture interpolate(IGuiTexture other, float lerp) { return new IGuiTexture() { @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void draw(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { IGuiTexture.this.getRawTexture().copy().draw(graphics, mouseX, mouseY, x, y, width, height, partialTicks); other.getRawTexture().copy().setColor(ColorUtils.color(lerp, lerp, lerp, lerp)) @@ -157,16 +155,16 @@ public void draw(GuiGraphics graphics, float mouseX, float mouseY, float x, floa }; } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) void draw(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks); - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) default void draw(GUIContext context, float x, float y, float width, float height) { draw(context.graphics, context.localMouseX, context.localMouseY, x, y, width, height, context.partialTick); } // ***************** EDITOR ***************** // - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) default void createPreview(ConfiguratorGroup father) { father.addConfigurators(new Configurator("ldlib.gui.editor.group.preview") .addChild(new UIElement().layout(layout -> { @@ -185,7 +183,7 @@ default void createPreview(ConfiguratorGroup father) { } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) default void buildConfigurator(ConfiguratorGroup father) { createPreview(father); IConfigurable.super.buildConfigurator(father); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/Icons.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/Icons.java index e3857a36c..d78efac06 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/Icons.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/Icons.java @@ -12,6 +12,9 @@ * @author KilaBash * @date 2022/12/1 * @implNote Icons + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ public class Icons { private static final ResourceLocation GDP_ICONS = LDLib2.id("textures/gui/icon/gdp_icons.png"); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ItemStackTexture.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ItemStackTexture.java index 3d913e120..4ee84f368 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ItemStackTexture.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ItemStackTexture.java @@ -5,17 +5,15 @@ import com.lowdragmc.lowdraglib2.gui.ui.rendering.GUIContext; import com.lowdragmc.lowdraglib2.gui.util.DrawerHelper; import com.lowdragmc.lowdraglib2.utils.ColorUtils; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -@KJSBindings @LDLRegisterClient(name = "item_stack_texture", registry = "ldlib2:gui_texture") public class ItemStackTexture extends TransformTexture { @Configurable(name = "ldlib.gui.editor.name.items") @@ -63,7 +61,7 @@ public ItemStackTexture copy() { return copied; } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void updateTick() { if (Minecraft.getInstance().level != null) { long tick = Minecraft.getInstance().level.getGameTime(); @@ -75,20 +73,20 @@ public void updateTick() { } } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) @Override protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { drawInternalWithColor(graphics, x, y, width, height, color); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) @Override protected void drawInternal(GUIContext context, float x, float y, float width, float height) { int effectiveColor = context.elementColor == -1 ? color : ColorUtils.mulColor(color, context.elementColor); drawInternalWithColor(context.graphics, x, y, width, height, effectiveColor); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void drawInternalWithColor(GuiGraphics graphics, float x, float y, float width, float height, int drawColor) { if (items.length == 0) return; updateTick(); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/RectTexture.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/RectTexture.java index 1151e1731..420054456 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/RectTexture.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/RectTexture.java @@ -6,7 +6,6 @@ import com.lowdragmc.lowdraglib2.configurator.annotation.ConfigSetter; import com.lowdragmc.lowdraglib2.configurator.annotation.Configurable; import com.lowdragmc.lowdraglib2.gui.ui.data.Transform2D; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; import com.lowdragmc.lowdraglib2.utils.ColorUtils; import com.mojang.blaze3d.systems.RenderSystem; @@ -14,8 +13,8 @@ import lombok.Getter; import lombok.experimental.Accessors; import net.minecraft.client.gui.GuiGraphics; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.joml.Matrix4f; import org.joml.Vector2f; import org.joml.Vector4f; @@ -23,7 +22,6 @@ import java.util.ArrayList; import java.util.List; -@KJSBindings @LDLRegisterClient(name = "rect_texture", registry = "ldlib2:gui_texture") @Accessors(chain = true) public class RectTexture extends TransformTexture { @@ -149,7 +147,7 @@ private void ensureCornerCache() { } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { ensureCornerCache(); @@ -167,7 +165,7 @@ protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, fl } } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void drawFill(VertexConsumer buffer, Matrix4f mat, float x, float y, float width, float height) { int r = (color >> 16) & 0xFF; int g = (color >> 8) & 0xFF; @@ -227,7 +225,7 @@ private void drawFill(VertexConsumer buffer, Matrix4f mat, float x, float y, flo } } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void drawBorder(VertexConsumer buffer, Matrix4f mat, float x, float y, float width, float height) { int r = (borderColor >> 16) & 0xFF; int g = (borderColor >> 8) & 0xFF; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/SDFRectTexture.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/SDFRectTexture.java index 7e71ef0c3..03a8c92b7 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/SDFRectTexture.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/SDFRectTexture.java @@ -7,7 +7,6 @@ import com.lowdragmc.lowdraglib2.configurator.annotation.ConfigSetter; import com.lowdragmc.lowdraglib2.configurator.annotation.Configurable; import com.lowdragmc.lowdraglib2.gui.ui.data.Transform2D; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; import com.lowdragmc.lowdraglib2.utils.ColorUtils; import com.mojang.blaze3d.platform.GlStateManager; @@ -19,13 +18,12 @@ import lombok.Setter; import lombok.experimental.Accessors; import net.minecraft.client.gui.GuiGraphics; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.joml.Vector4f; import static com.mojang.blaze3d.vertex.DefaultVertexFormat.*; -@KJSBindings @LDLRegisterClient(name = "sdf_rect_texture", registry = "ldlib2:gui_texture") @Accessors(chain = true) public class SDFRectTexture extends TransformTexture { @@ -103,13 +101,13 @@ public IGuiTexture interpolate(IGuiTexture other, float lerp) { } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { drawInternalWithColorVecs(graphics, x, y, width, height, colorVec4, borderColorVec4); } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawInternal(GUIContext context, float x, float y, float width, float height) { if (context.elementColor == -1) { drawInternalWithColorVecs(context.graphics, x, y, width, height, colorVec4, borderColorVec4); @@ -120,7 +118,7 @@ protected void drawInternal(GUIContext context, float x, float y, float width, f } } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void drawInternalWithColorVecs(GuiGraphics graphics, float x, float y, float width, float height, Vector4f fillVec, Vector4f borderVec) { graphics.flush(); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ShaderTexture.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ShaderTexture.java index 4b9acad46..670dd507e 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ShaderTexture.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/ShaderTexture.java @@ -11,7 +11,6 @@ import com.lowdragmc.lowdraglib2.gui.ui.elements.Button; import com.lowdragmc.lowdraglib2.gui.ui.event.UIEvents; import com.lowdragmc.lowdraglib2.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; import com.lowdragmc.lowdraglib2.utils.TagBuilder; import com.mojang.blaze3d.platform.GlStateManager; @@ -23,8 +22,8 @@ import lombok.experimental.Accessors; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; @@ -34,7 +33,6 @@ import java.io.File; import java.util.concurrent.atomic.AtomicReference; -@KJSBindings @LDLRegisterClient(name = "shader_texture", registry = "ldlib2:gui_texture") public class ShaderTexture extends TransformTexture implements AutoCloseable { @Getter @@ -95,7 +93,7 @@ public void afterDeserialize() { } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/SpriteTexture.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/SpriteTexture.java index 4313f081f..706776d3c 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/SpriteTexture.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/SpriteTexture.java @@ -16,15 +16,14 @@ import com.lowdragmc.lowdraglib2.gui.ui.style.StyleOrigin; import com.lowdragmc.lowdraglib2.gui.ui.styletemplate.Sprites; import com.lowdragmc.lowdraglib2.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.math.Position; import com.lowdragmc.lowdraglib2.math.Size; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; import com.lowdragmc.lowdraglib2.utils.ColorUtils; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; -import dev.latvian.mods.rhino.util.HideFromJS; -import dev.latvian.mods.rhino.util.RemapForJS; + + import dev.vfyjxf.taffy.style.AlignItems; import lombok.Getter; import lombok.Setter; @@ -32,15 +31,14 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.resources.ResourceLocation; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.joml.Matrix4f; import org.jetbrains.annotations.Nullable; import static com.mojang.blaze3d.vertex.DefaultVertexFormat.POSITION_TEX_COLOR; -@KJSBindings @LDLRegisterClient(name = "sprite_texture", registry = "ldlib2:gui_texture") @Accessors(chain = true) public class SpriteTexture extends TransformTexture { @@ -79,17 +77,16 @@ public enum WrapMode { @Nullable private Size imageSizeCache; - @HideFromJS + public static SpriteTexture of(ResourceLocation imageLocation) { return new SpriteTexture().setImageLocation(imageLocation); } - @HideFromJS + public static SpriteTexture of(String imageLocation) { return of(ResourceLocation.parse(imageLocation)); } - @RemapForJS("of") public static SpriteTexture kjs$of(ResourceLocation imageLocation) { return of(imageLocation); } @@ -158,7 +155,7 @@ public IGuiTexture interpolate(IGuiTexture other, float lerp) { if (other.getRawTexture() instanceof SpriteTexture spriteTexture) { return new IGuiTexture() { @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void draw(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { SpriteTexture.this.draw(graphics, mouseX, mouseY, x, y, width, height, partialTicks); @@ -176,7 +173,7 @@ public void draw(GuiGraphics graphics, float mouseX, float mouseY, float x, floa return super.interpolate(other, lerp); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public Size getImageSize() { if (imageSizeCache == null) { try { @@ -190,7 +187,7 @@ public Size getImageSize() { } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { if (width <= 0 || height <= 0) { return; @@ -307,7 +304,7 @@ protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, fl } } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void drawQuad(VertexConsumer buffer, Matrix4f matrix, float x, float y, float w, float h, float u1, float v1, float u2, float v2, int color) { @@ -323,7 +320,7 @@ private void drawQuad(VertexConsumer buffer, Matrix4f matrix, } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void createPreview(ConfiguratorGroup father) { super.createPreview(father); var configurator = new Configurator("ldlib.gui.editor.group.base_image"); @@ -359,7 +356,7 @@ public void createPreview(ConfiguratorGroup father) { )); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawRawTextureGuides(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { SpriteTexture.of(imageLocation.toString()).draw(graphics, mouseX, mouseY, x, y, width, height, partialTicks); // draw border guides diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/TextTexture.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/TextTexture.java index f6f7d94c7..ae019b8c9 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/TextTexture.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/TextTexture.java @@ -7,13 +7,12 @@ import com.lowdragmc.lowdraglib2.configurator.annotation.ConfigNumber; import com.lowdragmc.lowdraglib2.gui.ui.UIElement; import com.lowdragmc.lowdraglib2.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; import com.lowdragmc.lowdraglib2.utils.LocalizationUtils; import com.mojang.blaze3d.systems.RenderSystem; import lombok.Setter; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; @@ -26,7 +25,6 @@ import java.util.function.Supplier; import java.util.stream.Collectors; -@KJSBindings @LDLRegisterClient(name = "text_texture", registry = "ldlib2:gui_texture") public class TextTexture extends TransformTexture { @@ -55,7 +53,7 @@ public class TextTexture extends TransformTexture { public TextType type; public Supplier supplier; - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private List texts; private long lastTick; @@ -90,7 +88,7 @@ public TextTexture setSupplier(Supplier supplier) { return this; } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void updateTick() { if (Minecraft.getInstance().level != null) { long tick = Minecraft.getInstance().level.getGameTime(); @@ -162,7 +160,7 @@ public TextTexture copy() { return copied; } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) @Override protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { updateTick(); @@ -227,7 +225,7 @@ protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, fl RenderSystem.setShaderColor(1, 1, 1, 1); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void drawRollTextLine(GuiGraphics graphics, float x, float y, float width, float height, Font fontRenderer, int textH, String line) { float _y = y + (height - textH) / 2f; float textW = fontRenderer.width(line); @@ -242,7 +240,7 @@ private void drawRollTextLine(GuiGraphics graphics, float x, float y, float widt graphics.disableScissor(); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void drawTextLine(GuiGraphics graphics, float x, float y, float width, float height, Font fontRenderer, int textH, String line) { int textW = fontRenderer.width(line); float _x = x + (width - textW) / 2f; @@ -250,7 +248,7 @@ private void drawTextLine(GuiGraphics graphics, float x, float y, float width, f graphics.drawString(fontRenderer, line, (int) _x, (int) _y, color, dropShadow); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public int getLines() { return texts.size(); } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/TransformTexture.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/TransformTexture.java index cc75a3844..e88cf9cc3 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/TransformTexture.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/TransformTexture.java @@ -4,8 +4,8 @@ import com.lowdragmc.lowdraglib2.gui.ui.data.Transform2D; import com.lowdragmc.lowdraglib2.gui.ui.rendering.GUIContext; import com.lowdragmc.lowdraglib2.syncdata.annotation.SkipPersistedValue; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import lombok.Getter; import net.minecraft.client.gui.GuiGraphics; @@ -13,6 +13,9 @@ * @author KilaBash * @date 2022/12/5 * @implNote TransformTexture + * @port ELB_GG + * @date_port 2026/03/29 + * @port_to fabric */ @Getter public abstract class TransformTexture implements IGuiTexture { @@ -57,34 +60,34 @@ public void copyTransform(Transform2D transform) { transform2D.copyFrom(transform); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void preDraw(GuiGraphics graphics, float x, float y, float width, float height) { transform2D.pushPose(graphics.pose(), x, y, width, height); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void postDraw(GuiGraphics graphics, float x, float y, float width, float height) { transform2D.popPose(graphics.pose()); } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public final void draw(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { preDraw(graphics, x, y, width, height); drawInternal(graphics, mouseX, mouseY, x, y, width, height, partialTicks); postDraw(graphics, x, y, width, height); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected abstract void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks); - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawInternal(GUIContext context, float x, float y, float width, float height) { drawInternal(context.graphics, context.localMouseX, context.localMouseY, x, y, width, height, context.partialTick); } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void draw(GUIContext context, float x, float y, float width, float height) { preDraw(context.graphics, x, y, width, height); drawInternal(context, x, y, width, height); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/UIResourceTexture.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/UIResourceTexture.java index c4047d699..a51c3b8a6 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/UIResourceTexture.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/UIResourceTexture.java @@ -4,20 +4,18 @@ import com.lowdragmc.lowdraglib2.editor.resource.IResourcePath; import com.lowdragmc.lowdraglib2.editor.resource.TexturesResource; import com.lowdragmc.lowdraglib2.gui.ui.rendering.GUIContext; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; import com.lowdragmc.lowdraglib2.syncdata.annotation.Persisted; import lombok.Getter; import lombok.NoArgsConstructor; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.gui.GuiGraphics; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import javax.annotation.ParametersAreNonnullByDefault; import java.util.Optional; -@KJSBindings @LDLRegisterClient(name = "ui_resource_texture", registry = "ldlib2:gui_texture") @NoArgsConstructor @ParametersAreNonnullByDefault @@ -41,13 +39,13 @@ private IGuiTexture getTextureFromResource() { } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawInternal(GUIContext context, float x, float y, float width, float height) { getInternalTexture().draw(context, x, y, width, height); } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { getInternalTexture().draw(graphics, mouseX, mouseY, x, y, width, height, partialTicks); } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/VanillaSpriteTexture.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/VanillaSpriteTexture.java index 8ab928255..dcbfe53f2 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/VanillaSpriteTexture.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/texture/VanillaSpriteTexture.java @@ -6,11 +6,10 @@ import com.lowdragmc.lowdraglib2.configurator.annotation.Configurable; import com.lowdragmc.lowdraglib2.configurator.ui.SearchComponentConfigurator; import com.lowdragmc.lowdraglib2.gui.ui.utils.UIElementProvider; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegisterClient; import com.lowdragmc.lowdraglib2.utils.search.IResultHandler; -import dev.latvian.mods.rhino.util.HideFromJS; -import dev.latvian.mods.rhino.util.RemapForJS; + + import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; @@ -20,15 +19,14 @@ import net.minecraft.client.resources.metadata.gui.GuiSpriteScaling; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.jetbrains.annotations.NotNull; /** * The sprite ResourceLocation should point to a registered vanilla sprite * (e.g. from a GUI atlas), not a raw texture file. */ -@KJSBindings @LDLRegisterClient(name = "vanilla_sprite_texture", registry = "ldlib2:gui_texture") @Accessors(chain = true) public class VanillaSpriteTexture extends TransformTexture { @@ -52,17 +50,16 @@ public VanillaSpriteTexture(ResourceLocation sprite) { this.sprite = sprite; } - @HideFromJS + public static VanillaSpriteTexture of(ResourceLocation sprite) { return new VanillaSpriteTexture(sprite); } - @HideFromJS + public static VanillaSpriteTexture of(String sprite) { return of(ResourceLocation.parse(sprite)); } - @RemapForJS("of") public static VanillaSpriteTexture kjs$of(ResourceLocation sprite) { return of(sprite); } @@ -76,7 +73,7 @@ public VanillaSpriteTexture copy() { } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { if (sprite == null || width <= 0 || height <= 0) { return; @@ -94,7 +91,7 @@ protected void drawInternal(GuiGraphics graphics, float mouseX, float mouseY, fl } } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private SearchComponentConfigurator.ISearchConfigurator searchSprites() { return new SearchComponentConfigurator.ISearchConfigurator<>() { @Override @@ -107,10 +104,10 @@ public ResourceLocation defaultValue() { public void search(String word, IResultHandler searchHandler) { var lowerWord = word.toLowerCase(); var atlas = Minecraft.getInstance().getGuiSprites().textureAtlas; - for (var key : atlas.getTextures().keySet()) { + for (var key : java.util.Collections.emptySet() /* FIXME: atlas textures */) { if (Thread.currentThread().isInterrupted()) return; if (key.toString().toLowerCase().contains(lowerWord)) { - searchHandler.acceptResult(key); + searchHandler.acceptResult((net.minecraft.resources.ResourceLocation)key); } } } @@ -131,7 +128,7 @@ public UIElementProvider candidateUIProvider() { /** * Blit a full sprite with float coordinates (stretch mode). */ - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void blitSpriteFloat(GuiGraphics graphics, TextureAtlasSprite atlasSprite, float x, float y, float width, float height) { innerBlitFloat(graphics, atlasSprite, x, x + width, y, y + height, @@ -141,7 +138,7 @@ private void blitSpriteFloat(GuiGraphics graphics, TextureAtlasSprite atlasSprit /** * Blit a sub-region of a sprite with float coordinates. */ - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void blitSubSpriteFloat(GuiGraphics graphics, TextureAtlasSprite sprite, int textureWidth, int textureHeight, int uPosition, int vPosition, @@ -158,7 +155,7 @@ private void blitSubSpriteFloat(GuiGraphics graphics, TextureAtlasSprite sprite, /** * Core float quad rendering. */ - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void innerBlitFloat(GuiGraphics graphics, TextureAtlasSprite sprite, float x1, float x2, float y1, float y2, float u0, float u1, float v0, float v1) { @@ -175,7 +172,7 @@ private void innerBlitFloat(GuiGraphics graphics, TextureAtlasSprite sprite, buffer.addVertex(matrix, x2, y1, 0).setUv(u1, v0).setColor(r, g, b, a); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void blitTiledSpriteFloat(GuiGraphics graphics, TextureAtlasSprite sprite, float x, float y, float width, float height, int uPosition, int vPosition, @@ -192,7 +189,7 @@ private void blitTiledSpriteFloat(GuiGraphics graphics, TextureAtlasSprite sprit } } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void blitNineSlicedSpriteFloat(GuiGraphics graphics, TextureAtlasSprite sprite, GuiSpriteScaling.NineSlice nineSlice, float x, float y, float width, float height) { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/ModularUI.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/ModularUI.java index 730f2fb06..3e6b884ee 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/ModularUI.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/ModularUI.java @@ -15,7 +15,6 @@ import com.lowdragmc.lowdraglib2.gui.ui.rendering.GUIContext; import com.lowdragmc.lowdraglib2.gui.ui.style.StyleEngine; import com.lowdragmc.lowdraglib2.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.math.Size; import com.mojang.blaze3d.systems.RenderSystem; import dev.vfyjxf.taffy.geometry.TaffySize; @@ -44,8 +43,8 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.ItemStack; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.appliedenergistics.yoga.YogaConstants; import org.joml.Matrix4f; import org.lwjgl.glfw.GLFW; @@ -59,7 +58,6 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -@KJSBindings public class ModularUI { public final UI ui; public final UISyncManager syncManager; @@ -72,12 +70,12 @@ public class ModularUI { private boolean shouldCloseOnKeyInventory = true; // runtime - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) @Nullable private ModularUIWidget widget; @Nullable - @OnlyIn(Dist.CLIENT) - @Getter(onMethod_ = {@OnlyIn(Dist.CLIENT)}) + @Environment(EnvType.CLIENT) + @Getter(onMethod_ = {@Environment(EnvType.CLIENT)}) private Screen screen; @Getter private TaffyTree taffyTree; @@ -150,7 +148,7 @@ public class ModularUI { @Getter private TooltipComponent tooltipComponent; @Nullable - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private Font tooltipFont; @Getter private ItemStack tooltipStack = ItemStack.EMPTY; @@ -468,18 +466,18 @@ public void setMenu(@Nullable AbstractContainerMenu menu) { } /// screen only - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void setScreenAndInit(Screen screen) { setScreen(screen); init(screen.width, screen.height); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void setScreen(@Nullable Screen screen) { this.screen = screen; } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void init(int screenWidth, int screenHeight) { this.screenWidth = screenWidth; this.screenHeight = screenHeight; @@ -560,7 +558,7 @@ private void calculateStyleAndLayout() { if (taffyTree.isDirty(ui.rootElement.nodeId)) { taffyTree.computeLayout(ui.rootElement.nodeId, new TaffySize<>( Float.isNaN(layoutWidth) ? AvailableSpace.MAX_CONTENT : AvailableSpace.definite(layoutWidth), - Float.isNaN(layoutWidth) ? AvailableSpace.MAX_CONTENT : AvailableSpace.definite(layoutHeight) + Float.isNaN(layoutHeight) ? AvailableSpace.MAX_CONTENT : AvailableSpace.definite(layoutHeight) )); for (var nodeId : nodesWithNewLayout) { @@ -609,7 +607,7 @@ public void onRemoved() { * This will trigger FocusOut event on the old focused element and FocusIn event on the new focused element. * @param element the element to focus, or null to clear focus */ - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void requestFocus(@Nullable UIElement element) { if (focusedElement == element) return; @@ -653,12 +651,12 @@ public void requestFocus(@Nullable UIElement element) { } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void clearFocus() { requestFocus(null); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void setHoverTooltip(List tooltipTexts, ItemStack tooltipStack, @Nullable Font tooltipFont, @Nullable TooltipComponent tooltipComponent) { this.tooltipTexts = tooltipTexts; this.tooltipStack = tooltipStack; @@ -666,7 +664,7 @@ public void setHoverTooltip(List tooltipTexts, ItemStack tooltipStack this.tooltipComponent = tooltipComponent; } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void cleanTooltip() { tooltipTexts = null; tooltipComponent = null; @@ -674,13 +672,13 @@ public void cleanTooltip() { tooltipStack = ItemStack.EMPTY; } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) @Nullable public Font getTooltipFont() { return tooltipFont; } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public ModularUIWidget getWidget() { if (widget == null) { widget = new ModularUIWidget(); @@ -688,19 +686,19 @@ public ModularUIWidget getWidget() { return widget; } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public List getGuiExtraAreas() { if (extraAreas.isEmpty()) calculateExtraAreas(); return extraAreas; } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void calculateExtraAreas() { extraAreas.clear(); ui.rootElement.appendExtraAreas(extraAreas); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void enableDebugger(boolean debugMode) { if (this.debugMode == debugMode) return; this.debugMode = debugMode; @@ -708,13 +706,13 @@ public void enableDebugger(boolean debugMode) { if (uiDebuggerCache == null) { uiDebuggerCache = new UIDebugger(this); } - Minecraft.getInstance().pushGuiLayer(new DebugScreen(uiDebuggerCache)); + Minecraft.getInstance().setScreen(new DebugScreen(uiDebuggerCache)); } } @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public class ModularUIWidget implements GuiEventListener, NarratableEntry, Renderable, IModularUIHolder { private long lastTick; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/UI.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/UI.java index 0af7cd2fa..e1c5772f6 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/UI.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/UI.java @@ -2,7 +2,6 @@ import com.lowdragmc.lowdraglib2.gui.ui.style.Stylesheet; import com.lowdragmc.lowdraglib2.gui.ui.style.StylesheetManager; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.math.Size; import com.lowdragmc.lowdraglib2.utils.XmlUtils; import lombok.Data; @@ -19,7 +18,6 @@ import java.util.stream.Stream; @Data(staticConstructor = "of") -@KJSBindings public final class UI { private static final UI EMPTY = UI.of(new UIElement()); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/UIElement.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/UIElement.java index dee00f268..afbfd74f5 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/UIElement.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/UIElement.java @@ -26,7 +26,6 @@ import com.lowdragmc.lowdraglib2.gui.ui.rendering.UIVisualLayer; import com.lowdragmc.lowdraglib2.gui.ui.style.*; import com.lowdragmc.lowdraglib2.gui.ui.style.animation.StyleAnimation; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.math.Rect; import com.lowdragmc.lowdraglib2.registry.AutoRegistry; import com.lowdragmc.lowdraglib2.registry.ILDLRegister; @@ -39,7 +38,7 @@ import com.mojang.blaze3d.platform.InputConstants; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; -import dev.latvian.mods.rhino.util.RemapPrefixForJS; + import dev.vfyjxf.taffy.style.*; import dev.vfyjxf.taffy.tree.Layout; import dev.vfyjxf.taffy.tree.NodeId; @@ -56,8 +55,8 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.appliedenergistics.yoga.*; import org.appliedenergistics.yoga.numeric.FloatOptional; import org.jetbrains.annotations.NotNull; @@ -86,10 +85,9 @@ * please refer to the see Taffy Documentation for more information. * */ -@RemapPrefixForJS("kjs$") + @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -@KJSBindings @LDLRegister(name = "element", registry = "ldlib2:ui_element", priority = -1) public class UIElement implements IConfigurable, IPersistedSerializable, ILDLRegister> { public static Codec CODEC = LDLib2Registries.UI_ELEMENTS.optionalCodec().dispatch(ILDLRegister::getRegistryHolderOptional, @@ -176,7 +174,7 @@ public UIElement() { taffyStyle = new TaffyLayoutStyle(this); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private UIVisualLayer getOrCreateVisualLayer() { if (visualLayer == null) { visualLayer = new UIVisualLayer(this); @@ -553,7 +551,7 @@ public void adaptPositionToScreen() { } } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void appendExtraAreas(List extraAreas) { if (!isDisplayed() || !isVisible()) return; var rect = new Rect2i(Math.round(getPositionX()), Math.round(getPositionY()), @@ -1877,7 +1875,7 @@ public void addEditorChild(UIElement child, int index) { } @Override - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void buildConfigurator(ConfiguratorGroup father) { IConfigurable.super.buildConfigurator(father); additionalConfigurators(father); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/UITemplate.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/UITemplate.java index 0b5212439..a14fa587f 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/UITemplate.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/UITemplate.java @@ -12,8 +12,8 @@ import lombok.Setter; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; -import net.neoforged.bus.api.Event; -import net.neoforged.neoforge.common.NeoForge; + + import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -77,8 +77,7 @@ public UI createUI() { initUI(root); var ui = UI.of(root, getAllStylesheets()); var event = new CreateUI(this, ui); - NeoForge.EVENT_BUS.post(event); - return event.ui; + return event.ui; } public void initUI(UIElement root) { @@ -130,7 +129,7 @@ public void copyStylesFrom(UITemplate other) { this.stylesheets.addAll(other.stylesheets); } - public static class CreateUI extends Event { + public static class CreateUI { public final UITemplate template; public UI ui; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/BindableValue.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/BindableValue.java index fbc4383c4..1ab0d1e86 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/BindableValue.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/BindableValue.java @@ -1,6 +1,5 @@ package com.lowdragmc.lowdraglib2.gui.ui.elements; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegister; import lombok.Getter; import net.minecraft.MethodsReturnNonnullByDefault; @@ -11,7 +10,6 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -@KJSBindings @LDLRegister(name = "bindable-value", group = "utils", registry = "ldlib2:ui_element") public class BindableValue extends BindableUIElement { @Getter diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Button.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Button.java index 5b5837c99..0261c11e7 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Button.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Button.java @@ -14,10 +14,9 @@ import com.lowdragmc.lowdraglib2.gui.ui.style.PropertyRegistry; import com.lowdragmc.lowdraglib2.gui.ui.styletemplate.Sprites; import com.lowdragmc.lowdraglib2.gui.util.UISoundUtils; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegister; -import dev.latvian.mods.rhino.util.HideFromJS; -import dev.latvian.mods.rhino.util.RemapPrefixForJS; + + import dev.vfyjxf.taffy.style.AlignContent; import dev.vfyjxf.taffy.style.FlexDirection; import lombok.Getter; @@ -34,9 +33,8 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -@RemapPrefixForJS("kjs$") + @Accessors(chain = true) -@KJSBindings @LDLRegister(name = "button", group = "basic", registry = "ldlib2:ui_element") public class Button extends UIElement { @Configurable(name = "ButtonStyle") @@ -148,13 +146,13 @@ public Button enableText() { return this; } - @HideFromJS + public Button setText(Component text) { this.text.setText(text); return this; } - @HideFromJS + public Button setText(String text) { this.text.setText(text); return this; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ColorSelector.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ColorSelector.java index df786a512..fb5e7d135 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ColorSelector.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ColorSelector.java @@ -11,7 +11,6 @@ import com.lowdragmc.lowdraglib2.gui.ui.event.UIEvents; import com.lowdragmc.lowdraglib2.gui.ui.styletemplate.Sprites; import com.lowdragmc.lowdraglib2.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegister; import com.lowdragmc.lowdraglib2.utils.ColorUtils; import com.mojang.blaze3d.systems.RenderSystem; @@ -20,8 +19,8 @@ import dev.vfyjxf.taffy.style.FlexDirection; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.gui.GuiGraphics; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.appliedenergistics.yoga.YogaEdge; import org.appliedenergistics.yoga.YogaGutter; import org.lwjgl.system.MemoryUtil; @@ -32,7 +31,6 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -@KJSBindings @LDLRegister(name = "color-selector", group = "misc", registry = "ldlib2:ui_element") public class ColorSelector extends BindableUIElement { public final UIElement pickerContainer; @@ -292,12 +290,12 @@ protected void onSwitchHSB(UIEvent event) { hsbButton.setText(mode.name()); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawColorPreview(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { DrawerHelper.drawSolidRect(graphics, x, y, width, height, argb); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawHsbContext(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { var buffer = graphics.bufferSource().getBuffer(LDLibRenderTypes.hsb()); RenderSystem.disableDepthTest(); @@ -418,7 +416,7 @@ protected void drawHsbContext(GuiGraphics graphics, float mouseX, float mouseY, DrawerHelper.drawSolidRect(graphics, (x + mainX * width) - 1, (y + mainY * height) - 1, 2, 2, b > 0.5f ? 0xff000000 : 0xffffffff); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawColorSlider(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { var buffer = graphics.bufferSource().getBuffer(LDLibRenderTypes.hsb()); RenderSystem.disableDepthTest(); @@ -495,7 +493,7 @@ protected void drawColorSlider(GuiGraphics graphics, float mouseX, float mouseY, } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void drawAlphaSlider(GuiGraphics graphics, float mouseX, float mouseY, float x, float y, float width, float height, float partialTicks) { DrawerHelper.drawGradientRect(graphics, x, y, width, height, argb & 0x00ffffff, argb | 0xff000000, true); @@ -506,7 +504,7 @@ protected void drawAlphaSlider(GuiGraphics graphics, float mouseX, float mouseY, /** * put hsb color into BufferBuilder */ - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void putColor(VertexConsumer buffer, float h, float s, float b, float a) { if (buffer instanceof BufferBuilderAccessor accessor) { var i = accessor.invokeBeginElement(LDLibShaders.HSB_Alpha); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Dialog.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Dialog.java index c96b094b0..0369f403e 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Dialog.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Dialog.java @@ -16,7 +16,6 @@ import com.lowdragmc.lowdraglib2.gui.ui.styletemplate.Sprites; import com.lowdragmc.lowdraglib2.gui.util.FileNode; import com.lowdragmc.lowdraglib2.gui.util.WindowDragHelper; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import dev.vfyjxf.taffy.style.*; import it.unimi.dsi.fastutil.booleans.BooleanConsumer; import lombok.Getter; @@ -34,7 +33,6 @@ import java.util.function.Consumer; import java.util.function.Predicate; -@KJSBindings public class Dialog extends UIElement { public final UIElement overlay; public final UIElement titleBar; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/FluidSlot.dsl.kt b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/FluidSlot.dsl.kt index e9379330f..65603c9f9 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/FluidSlot.dsl.kt +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/FluidSlot.dsl.kt @@ -3,9 +3,8 @@ package com.lowdragmc.lowdraglib2.gui.ui.elements import com.lowdragmc.lowdraglib2.gui.ui.ElementSpec import com.lowdragmc.lowdraglib2.gui.ui.UIContainer import com.lowdragmc.lowdraglib2.gui.ui.data.FillDirection -import com.lowdragmc.lowdraglib2.integration.xei.IngredientIO -import net.neoforged.neoforge.fluids.FluidStack -import net.neoforged.neoforge.fluids.capability.IFluidHandler +import dev.architectury.fluid.FluidStack +import com.lowdragmc.lowdraglib2.utils.fluids.IFluidHandler import java.util.function.Consumer /** @@ -45,7 +44,13 @@ open class FluidSlotElement( spec: (FluidSlotSpec.() -> Unit)? = null, ) : UIContainer>(element, spec) { override fun makeSpec(): FluidSlotSpec? { - return spec?.let { FluidSlotSpec().apply(it) } + val s = spec + if (s != null) { + val fluidSpec = FluidSlotSpec() + s(fluidSpec) + return fluidSpec + } + return null } override fun build(spec: FluidSlotSpec?): T { @@ -154,26 +159,5 @@ fun FluidSlotElement.withLabel(config: Label.() -> Unit): Flu } // =========================== -// XEI Integration Methods +// XEI Integration Methods Removed // =========================== - -/** - * Extension: Mark as JEI/REI/EMI phantom slot - */ -fun FluidSlotElement.asXeiPhantom(): FluidSlotElement = apply { - element.xeiPhantom() -} - -/** - * Extension: Mark as recipe ingredient for JEI/REI/EMI - */ -fun FluidSlotElement.asXeiRecipeIngredient(io: IngredientIO): FluidSlotElement = apply { - element.xeiRecipeIngredient(io) -} - -/** - * Extension: Mark as recipe slot for JEI/REI/EMI - */ -fun FluidSlotElement.asXeiRecipeSlot(io: IngredientIO = IngredientIO.NONE, chance: Float = 1f): FluidSlotElement = apply { - element.xeiRecipeSlot(io, chance) -} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/FluidSlot.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/FluidSlot.java index 594c4a596..7cce645f0 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/FluidSlot.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/FluidSlot.java @@ -23,25 +23,14 @@ import com.lowdragmc.lowdraglib2.gui.ui.styletemplate.Sprites; import com.lowdragmc.lowdraglib2.gui.util.DrawerHelper; import com.lowdragmc.lowdraglib2.gui.util.TextFormattingUtil; -import com.lowdragmc.lowdraglib2.integration.xei.IngredientIO; -import com.lowdragmc.lowdraglib2.integration.xei.emi.LDLibEMIPlugin; -import com.lowdragmc.lowdraglib2.integration.xei.jei.LDLibJEIPlugin; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; -import com.lowdragmc.lowdraglib2.integration.xei.rei.LDLibREIPlugin; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegister; import com.lowdragmc.lowdraglib2.syncdata.ISubscription; import com.lowdragmc.lowdraglib2.syncdata.annotation.SkipPersistedValue; import com.lowdragmc.lowdraglib2.utils.FluidHelper; import com.lowdragmc.lowdraglib2.utils.XmlUtils; -import dev.architectury.hooks.fluid.forge.FluidStackHooksForge; -import dev.emi.emi.api.stack.*; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; -import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; -import me.shedaniel.rei.api.common.util.EntryIngredients; -import me.shedaniel.rei.api.common.util.EntryStacks; -import mezz.jei.api.neoforge.NeoForgeTypes; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.chat.Component; import net.minecraft.sounds.SoundEvent; @@ -49,9 +38,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.material.Fluid; -import net.neoforged.neoforge.fluids.FluidStack; -import net.neoforged.neoforge.fluids.FluidUtil; -import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import dev.architectury.fluid.FluidStack; +import com.lowdragmc.lowdraglib2.utils.fluids.IFluidHandler; import org.w3c.dom.Element; import org.jetbrains.annotations.Nullable; @@ -68,7 +56,6 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault @Accessors(chain = true) -@KJSBindings @LDLRegister(name = "fluid-slot", group = "inventory", registry = "ldlib2:ui_element") public class FluidSlot extends BindableUIElement { @Configurable(name = "SlotStyle") @@ -145,12 +132,12 @@ public SlotStyle showFluidTooltips(boolean showFluidTooltips) { private boolean allowClickDrained = true; // editor support @Configurable(name = "EditorFluidDisplay") - private FluidStack editorFluidDisplay = FluidStack.EMPTY; + private FluidStack editorFluidDisplay = FluidStack.empty(); @Configurable(name = "EditorAllowXEILookup") private boolean allowXEILookup = true; // runtime @Getter - private FluidStack fluid = FluidStack.EMPTY; + private FluidStack fluid = FluidStack.empty(); @Getter @Setter @Configurable(name = "Capacity") @ConfigNumber(range = {0, Integer.MAX_VALUE}) @@ -170,17 +157,6 @@ public FluidSlot() { getStyle().backgroundTexture(Sprites.RECT_DARK); addEventListener(UIEvents.HOVER_TOOLTIPS, this::onHoverTooltips); addEventListener(UIEvents.MOUSE_DOWN, this::onMouseDown); - if (LDLib2.isClient() && !LDLib2.isServer()) { - if (LDLib2.isJeiLoaded()) { - JEISupport.clickableIngredient(this); - } - if (LDLib2.isReiLoaded()) { - REISupport.focusedStack(this); - } - if (LDLib2.isEmiLoaded()) { - EMISupport.stackProvider(this); - } - } clickEvent = addRPCEvent(RPCEventBuilder.simple(Boolean.class, this::tryClickContainer)); amountLabel.addClass("__fluid-slot_amount-label__"); @@ -224,135 +200,9 @@ public FluidSlot bind(@Nullable IFluidHandler fluidTank, int tankIndex) { return this; } - public FluidSlot xeiPhantom() { - if (LDLib2.isJeiLoaded()) { - JEISupport.ghostIngredient(this); - } - if (LDLib2.isReiLoaded()) { - REISupport.draggableStackBounds(this); - REISupport.acceptDraggableStack(this); - } - if (LDLib2.isEmiLoaded()) { - EMISupport.renderDragHandler(this); - EMISupport.dropStackHandler(this); - } - return this; - } - - public FluidSlot xeiRecipeIngredient(IngredientIO io) { - if (LDLib2.isJeiLoaded()) { - JEISupport.recipeIngredient(this, io); - } - if (LDLib2.isReiLoaded()) { - REISupport.recipeIngredient(this, io); - } - if (LDLib2.isEmiLoaded()) { - EMISupport.recipeIngredient(this, io); - } - return this; - } - - public FluidSlot xeiRecipeIngredient(IngredientIO io, Stream allPossibleFluids) { - if (LDLib2.isJeiLoaded()) { - JEISupport.recipeIngredient(this, io, () -> allPossibleFluids); - } - if (LDLib2.isReiLoaded()) { - REISupport.recipeIngredient(this, io, () -> allPossibleFluids); - } - if (LDLib2.isEmiLoaded()) { - EMISupport.recipeIngredient(this, io, () -> allPossibleFluids); - } - return this; - } - - public FluidSlot xeiRecipeSlot() { - return xeiRecipeSlot(IngredientIO.NONE, 1); - } - - public FluidSlot xeiRecipeSlot(IngredientIO io, float chance) { - if (LDLib2.isJeiLoaded()) { - JEISupport.recipeSlot(this); - } - if (LDLib2.isReiLoaded()) { - REISupport.recipeSlot(this, io); - } - if (LDLib2.isEmiLoaded()) { - EMISupport.recipeSlot(this, chance); - } - return this; - } - - public FluidSlot xeiRecipeSlot(IngredientIO io, float chance, int amount, Stream allPossibleFluids) { - if (LDLib2.isJeiLoaded()) { - JEISupport.recipeSlot(this, () -> allPossibleFluids); - } - if (LDLib2.isReiLoaded()) { - REISupport.recipeSlot(this, io, () -> allPossibleFluids); - } - if (LDLib2.isEmiLoaded()) { - EMISupport.recipeSlot(this, () -> chance, () -> amount, () -> allPossibleFluids); - } - return this; - } private void tryClickContainer(boolean isShiftKeyDown) { - if (boundHandler == null) return; - if (tankIndex < 0 || tankIndex >= boundHandler.getTanks()) return; - var mui = getModularUI(); - if (mui == null || mui.getMenu() == null) return; - var player = mui.player; - if (player == null) return; - var menu = mui.getMenu(); - var carried = menu.getCarried(); - var handler = FluidUtil.getFluidHandler(carried); - if (handler.isEmpty()) return; - int maxAttempts = isShiftKeyDown ? carried.getCount() : 1; - var initialFluid = boundHandler.getFluidInTank(tankIndex); - if (allowClickFilled && initialFluid.getAmount() > 0) { - var performedFill = false; - for (int i = 0; i < maxAttempts; i++) { - var result = FluidUtil.tryFillContainer(carried, boundHandler, Integer.MAX_VALUE, null, false); - if (!result.isSuccess()) break; - ItemStack remainingStack = FluidUtil.tryFillContainer(carried, boundHandler, Integer.MAX_VALUE, null, true).getResult(); - carried.shrink(1); - performedFill = true; - if (!remainingStack.isEmpty() && !player.addItem(remainingStack)) { - Block.popResource(player.level(), player.getOnPos(), remainingStack); - break; - } - } - if (performedFill) { - SoundEvent soundevent = FluidHelper.getFillSound(initialFluid); - if (soundevent != null) { - player.level().playSound(null, player.position().x, player.position().y + 0.5, player.position().z, soundevent, SoundSource.BLOCKS, 1.0F, 1.0F); - } - menu.setCarried(carried); - return; - } - } - - if (allowClickDrained) { - var performedEmptying = false; - for (int i = 0; i < maxAttempts; i++) { - var result = FluidUtil.tryEmptyContainer(carried, boundHandler, Integer.MAX_VALUE, null, false); - if (!result.isSuccess()) break; - ItemStack remainingStack = FluidUtil.tryEmptyContainer(carried, boundHandler, Integer.MAX_VALUE, null, true).getResult(); - carried.shrink(1); - performedEmptying = true; - if (!remainingStack.isEmpty() && !player.getInventory().add(remainingStack)) { - Block.popResource(player.level(), player.getOnPos(), remainingStack); - break; - } - } - var filledFluid = boundHandler.getFluidInTank(tankIndex); - if (performedEmptying) { - SoundEvent soundevent = FluidHelper.getEmptySound(filledFluid); - if (soundevent != null) { - player.level().playSound(null, player.position().x, player.position().y + 0.5, player.position().z, soundevent, SoundSource.BLOCKS, 1.0F, 1.0F); - } - menu.setCarried(carried); - } - } + // TODO: Port NeoForge FluidUtil logic to Fabric for GUI fluid container clicking. } @@ -372,7 +222,7 @@ public List getFullTooltipTexts() { var tooltips = new ArrayList(); if (slotStyle.showFluidTooltips()) { var fluidStack = getFluid(); - capacity = Math.max(capacity, fluidStack.getAmount()); + capacity = (int) Math.max(capacity, fluidStack.getAmount()); if (!fluidStack.isEmpty()) { tooltips.add(FluidHelper.getDisplayName(fluidStack)); tooltips.add(Component.translatable("ldlib.fluid.amount", fluidStack.getAmount(), capacity).append(" " + FluidHelper.getUnit())); @@ -406,8 +256,8 @@ public FluidStack getValue() { @Override public FluidSlot setValue(@Nullable FluidStack value, boolean notify) { - if (value == null) value = FluidStack.EMPTY; - if (FluidStack.matches(value, fluid)) return this; + if (value == null) value = FluidStack.empty(); + if (value.isFluidEqual(fluid)) return this; this.fluid = value; if (notify) notifyListeners(); return this; @@ -472,7 +322,7 @@ private void setEditorFluidDisplay(FluidStack fluidStack) { @SkipPersistedValue(field = "editorFluidDisplay") private boolean skipEditorFluidDisplay(FluidStack fluid) { - return fluid == FluidStack.EMPTY; + return fluid == FluidStack.empty(); } @ConfigSetter(field = "allowXEILookup") @@ -493,7 +343,7 @@ private boolean skipCapacity(int capacity) { @Override public void beforeDeserialize() { super.beforeDeserialize(); - this.editorFluidDisplay = FluidStack.EMPTY; + this.editorFluidDisplay = FluidStack.empty(); } @Override @@ -516,155 +366,11 @@ public void loadXml(Element element) { } // fluid display var fluid = XmlUtils.getFluidStack(element); - if (fluid != FluidStack.EMPTY) { + if (fluid != FluidStack.empty()) { setEditorFluidDisplay(fluid); } super.loadXml(element); } - // region XEI Support - public static class JEISupport { - public static void clickableIngredient(FluidSlot fluidSlot) { - LDLibJEIPlugin.clickableIngredient(fluidSlot, () -> { - if (!fluidSlot.allowXEILookup) return null; - var current = fluidSlot.getValue(); - if (current.isEmpty()) return null; - return LDLibJEIPlugin.createTypedIngredient(NeoForgeTypes.FLUID_STACK, current) - .orElse(null); - }); - } - - public static void ghostIngredient(FluidSlot fluidSlot) { - LDLibJEIPlugin.ghostIngredient(fluidSlot, NeoForgeTypes.FLUID_STACK, - ingredient -> true, - fluidSlot::setValue); - } - - public static void recipeIngredient(FluidSlot fluidSlot, IngredientIO io) { - recipeIngredient(fluidSlot, io, () -> Stream.of(fluidSlot.getFluid())); - } - - public static void recipeIngredient(FluidSlot fluidSlot, IngredientIO io, Supplier> allPossibleFluids) { - LDLibJEIPlugin.recipeIngredient(fluidSlot, io, () -> allPossibleFluids.get() - .map(fluidStack -> LDLibJEIPlugin.createTypedIngredient(NeoForgeTypes.FLUID_STACK, fluidStack)) - .filter(Optional::isPresent) - .map(Optional::get) - .collect(Collectors.toList())); - } - - public static void recipeSlot(FluidSlot fluidSlot) { - recipeSlot(fluidSlot, () -> Stream.of(fluidSlot.getFluid())); - } - - public static void recipeSlot(FluidSlot fluidSlot, Supplier> allPossibleFluids) { - LDLibJEIPlugin.recipeSlot(fluidSlot, () -> { - var fluid = fluidSlot.getValue(); - return fluid.isEmpty() ? null : LDLibJEIPlugin - .createTypedIngredient(NeoForgeTypes.FLUID_STACK, fluidSlot.getFluid()) - .orElse(null); - }, () -> allPossibleFluids.get().map(fluid -> LDLibJEIPlugin.createTypedIngredient(NeoForgeTypes.FLUID_STACK, fluid).orElseThrow()).collect(Collectors.toList())); - } - } - - public static class REISupport { - public static void focusedStack(FluidSlot fluidSlot) { - LDLibREIPlugin.focusedStack(fluidSlot, () -> { - if (!fluidSlot.allowXEILookup) return null; - var fluid = fluidSlot.getValue(); - if (fluid.isEmpty()) return null; - return EntryStacks.of(FluidStackHooksForge.fromForge(fluid)); - }); - } - - public static void draggableStackBounds(FluidSlot fluidSlot) { - LDLibREIPlugin.draggableStackBounds(fluidSlot, - VanillaEntryTypes.FLUID, - stack -> true); - } - - public static void acceptDraggableStack(FluidSlot fluidSlot) { - LDLibREIPlugin.acceptDraggableStack(fluidSlot, - VanillaEntryTypes.FLUID, - stack -> true, - stack -> fluidSlot.setValue(FluidStackHooksForge.toForge(stack.getValue()))); - } - - public static void recipeIngredient(FluidSlot fluidSlot, IngredientIO io) { - recipeIngredient(fluidSlot, io, () -> Stream.of(fluidSlot.getFluid())); - } - - public static void recipeIngredient(FluidSlot fluidSlot, IngredientIO io, Supplier> allPossibleFluids) { - LDLibREIPlugin.recipeIngredient(fluidSlot, io, () -> allPossibleFluids.get() - .map(fluidStack -> EntryIngredients.of(FluidStackHooksForge.fromForge(fluidStack))) - .toList() - ); - } - - public static void recipeSlot(FluidSlot fluidSlot, IngredientIO io) { - recipeSlot(fluidSlot, io, () -> Stream.of(fluidSlot.getFluid())); - } - - public static void recipeSlot(FluidSlot fluidSlot, IngredientIO io, Supplier> allPossibleFluids) { - LDLibREIPlugin.recipeSlot(fluidSlot, io, - () -> EntryStacks.of(FluidStackHooksForge.fromForge(fluidSlot.getValue())), - () -> allPossibleFluids.get().map(fluid -> EntryStacks.of(FluidStackHooksForge.fromForge(fluid))).collect(Collectors.toList())); - } - } - - public static class EMISupport { - public static void stackProvider(FluidSlot fluidSlot) { - LDLibEMIPlugin.stackProvider(fluidSlot, () -> { - if (!fluidSlot.allowXEILookup) return null; - var fluid = fluidSlot.getValue(); - if (fluid.isEmpty()) return null; - return new EmiStackInteraction(EmiStack.of(fluid.getFluid(), fluid.getComponentsPatch(), fluid.getAmount()), null, false); - }); - } - - public static void renderDragHandler(FluidSlot fluidSlot) { - LDLibEMIPlugin.renderDragHandler(fluidSlot, dragged -> dragged instanceof FluidEmiStack); - } - - public static void dropStackHandler(FluidSlot fluidSlot) { - LDLibEMIPlugin.dropStackHandler(fluidSlot, - dragged -> dragged instanceof FluidEmiStack, - dragged -> { - if (dragged instanceof FluidEmiStack fluid) { - var fluidStack = new FluidStack( - ((Fluid) fluid.getKey()).builtInRegistryHolder(), - Math.max(1000, (int) fluid.getAmount()), - fluid.getComponentChanges()); - fluidSlot.setValue(fluidStack); - } - }); - } - - public static void recipeIngredient(FluidSlot fluidSlot, IngredientIO io) { - recipeIngredient(fluidSlot, io, () -> Stream.of(fluidSlot.getFluid())); - } - - public static void recipeIngredient(FluidSlot fluidSlot, IngredientIO io, Supplier> allPossibleFluids) { - LDLibEMIPlugin.recipeIngredient(fluidSlot, io, () -> allPossibleFluids.get() - .map(fluid -> EmiStack.of(fluid.getFluid(), fluid.getComponentsPatch(), fluid.getAmount())) - .collect(Collectors.toList()) - ); - } - - public static void recipeSlot(FluidSlot fluidSlot, float chance) { - LDLibEMIPlugin.recipeSlot(fluidSlot, () -> { - var fluid = fluidSlot.getValue(); - return EmiStack.of(fluid.getFluid(), fluid.getComponentsPatch(), fluid.getAmount()).setChance(chance); - }); - } - - public static void recipeSlot(FluidSlot fluidSlot, Supplier chance, IntSupplier amount, Supplier> allPossibleFluids) { - LDLibEMIPlugin.recipeSlot(fluidSlot, () -> - new ListEmiIngredient( - allPossibleFluids.get().map(fluid -> EmiStack.of(fluid.getFluid(), fluid.getComponentsPatch(), fluid.getAmount())) - .map(e -> e.setChance(chance.get())).collect(Collectors.toList()), amount.getAsInt()) - .setChance(chance.get())); - } - } - // endregion } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/GraphView.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/GraphView.java index 197de478f..7f4345574 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/GraphView.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/GraphView.java @@ -10,7 +10,6 @@ import com.lowdragmc.lowdraglib2.gui.ui.Style; import com.lowdragmc.lowdraglib2.gui.ui.style.Property; import com.lowdragmc.lowdraglib2.gui.ui.style.PropertyRegistry; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegister; import dev.vfyjxf.taffy.style.TaffyPosition; import lombok.Getter; @@ -24,7 +23,6 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -@KJSBindings @LDLRegister(name = "graph-view", group = "container", registry = "ldlib2:ui_element") public class GraphView extends UIElement { public record DragOffset(float startOffsetX, float startOffsetY) {} diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Inspector.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Inspector.java index aff1a910c..dea5bd652 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Inspector.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Inspector.java @@ -6,13 +6,12 @@ import com.lowdragmc.lowdraglib2.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib2.gui.ui.UIElement; import com.lowdragmc.lowdraglib2.gui.ui.utils.IHistoryStack; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegister; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; import net.minecraft.network.chat.Component; -import net.neoforged.neoforge.common.util.INBTSerializable; +import com.lowdragmc.lowdraglib2.utils.INBTSerializable; import org.appliedenergistics.yoga.YogaDisplay; import org.appliedenergistics.yoga.YogaEdge; import org.appliedenergistics.yoga.YogaGutter; @@ -21,7 +20,6 @@ import java.util.function.Consumer; @Accessors(chain = true) -@KJSBindings @LDLRegister(name = "inspector", group = "misc", registry = "ldlib2:ui_element") public class Inspector extends UIElement { public final ScrollerView scrollerView; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ItemSlot.dsl.kt b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ItemSlot.dsl.kt index 6ce6def7f..39588762e 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ItemSlot.dsl.kt +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ItemSlot.dsl.kt @@ -4,10 +4,9 @@ import com.lowdragmc.lowdraglib2.gui.ui.Element import com.lowdragmc.lowdraglib2.gui.ui.ElementSpec import com.lowdragmc.lowdraglib2.gui.ui.UIContainer import com.lowdragmc.lowdraglib2.gui.ui.elements.inventory.InventorySlots -import com.lowdragmc.lowdraglib2.integration.xei.IngredientIO +import com.lowdragmc.lowdraglib2.utils.items.IItemHandlerModifiable import net.minecraft.world.inventory.Slot import net.minecraft.world.item.ItemStack -import net.neoforged.neoforge.items.IItemHandlerModifiable /** * Extension function for ItemSlot.SlotStyle DSL @@ -51,7 +50,13 @@ open class ItemSlotElement( spec: (ItemSlotSpec.() -> Unit)? = null, ) : UIContainer>(element, spec) { override fun makeSpec(): ItemSlotSpec? { - return spec?.let { ItemSlotSpec().apply(it) } + val s = spec + if (s != null) { + val itemSpec = ItemSlotSpec() + s(itemSpec) + return itemSpec + } + return null } override fun build(spec: ItemSlotSpec?): T { @@ -163,27 +168,5 @@ fun ItemSlotElement.acceptQuickMove(priority: Int = 0): ItemSl } // =========================== -// XEI Integration Methods +// XEI Integration Methods Removed // =========================== - -/** - * Extension: Mark as JEI/REI/EMI phantom slot - */ -fun ItemSlotElement.asXeiPhantom(): ItemSlotElement = apply { - element.xeiPhantom() -} - -/** - * Extension: Mark as recipe ingredient for JEI/REI/EMI - */ -fun ItemSlotElement.asXeiRecipeIngredient(io: IngredientIO): ItemSlotElement = apply { - element.xeiRecipeIngredient(io) -} - -/** - * Extension: Mark as recipe slot for JEI/REI/EMI - */ -fun ItemSlotElement.asXeiRecipeSlot(io: IngredientIO = IngredientIO.NONE, chance: Float = 1f): ItemSlotElement = apply { - element.xeiRecipeSlot(io, chance) -} - diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ItemSlot.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ItemSlot.java index 5ba61f53e..88393420e 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ItemSlot.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ItemSlot.java @@ -18,31 +18,17 @@ import com.lowdragmc.lowdraglib2.gui.ui.style.PropertyRegistry; import com.lowdragmc.lowdraglib2.gui.ui.styletemplate.Sprites; import com.lowdragmc.lowdraglib2.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib2.integration.xei.IngredientIO; -import com.lowdragmc.lowdraglib2.integration.xei.emi.LDLibEMIPlugin; -import com.lowdragmc.lowdraglib2.integration.xei.jei.*; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; -import com.lowdragmc.lowdraglib2.integration.xei.rei.LDLibREIPlugin; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegister; import com.lowdragmc.lowdraglib2.syncdata.annotation.SkipPersistedValue; import com.lowdragmc.lowdraglib2.utils.XmlUtils; -import dev.emi.emi.api.stack.EmiStack; -import dev.emi.emi.api.stack.EmiStackInteraction; -import dev.emi.emi.api.stack.ItemEmiStack; -import dev.emi.emi.api.stack.ListEmiIngredient; import lombok.Getter; -import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; -import me.shedaniel.rei.api.common.util.EntryIngredients; -import me.shedaniel.rei.api.common.util.EntryStacks; -import mezz.jei.api.constants.VanillaTypes; -import mezz.jei.library.ingredients.itemStacks.TypedItemStack; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.network.chat.Component; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.items.IItemHandlerModifiable; +import com.lowdragmc.lowdraglib2.utils.items.IItemHandlerModifiable; import org.jetbrains.annotations.Nullable; import org.w3c.dom.Element; @@ -58,7 +44,6 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -@KJSBindings @LDLRegister(name = "item-slot", group = "inventory", registry = "ldlib2:ui_element") public class ItemSlot extends BindableUIElement { public final static IGuiTexture ITEM_SLOT_TEXTURE = Sprites.RECT_RD_T.copy().setColor(0xffbbbbbb); @@ -174,17 +159,6 @@ public ItemSlot(Slot slot) { addEventListener(UIEvents.HOVER_TOOLTIPS, this::onHoverTooltips); addEventListener(UIEvents.MOUSE_DOWN, this::onMouseDown); addEventListener(UIEvents.MUI_CHANGED, this::onModularUIChanged); - if (LDLib2.isClient() && !LDLib2.isServer()) { - if (LDLib2.isJeiLoaded()) { - JEISupport.clickableIngredient(this); - } - if (LDLib2.isReiLoaded()) { - REISupport.focusedStack(this); - } - if (LDLib2.isEmiLoaded()) { - EMISupport.stackProvider(this); - } - } bind(slot); internalSetup(); } @@ -205,76 +179,6 @@ public ItemSlot bind(@Nonnull Slot slot) { return this; } - public ItemSlot xeiPhantom() { - if (LDLib2.isJeiLoaded()) { - JEISupport.ghostIngredient(this); - } - if (LDLib2.isReiLoaded()) { - REISupport.draggableStackBounds(this); - REISupport.acceptDraggableStack(this); - } - if (LDLib2.isEmiLoaded()) { - EMISupport.renderDragHandler(this); - EMISupport.dropStackHandler(this); - } - return this; - } - - public ItemSlot xeiRecipeIngredient(IngredientIO io) { - if (LDLib2.isJeiLoaded()) { - JEISupport.recipeIngredient(this, io); - } - if (LDLib2.isReiLoaded()) { - REISupport.recipeIngredient(this, io); - } - if (LDLib2.isEmiLoaded()) { - EMISupport.recipeIngredient(this, io); - } - return this; - } - - public ItemSlot xeiRecipeIngredient(IngredientIO io, Stream allPossibleItems) { - if (LDLib2.isJeiLoaded()) { - JEISupport.recipeIngredient(this, io, () -> allPossibleItems); - } - if (LDLib2.isReiLoaded()) { - REISupport.recipeIngredient(this, io, () -> allPossibleItems); - } - if (LDLib2.isEmiLoaded()) { - EMISupport.recipeIngredient(this, io, () -> allPossibleItems); - } - return this; - } - - public ItemSlot xeiRecipeSlot() { - return xeiRecipeSlot(IngredientIO.NONE, 1); - } - - public ItemSlot xeiRecipeSlot(IngredientIO io, float chance) { - if (LDLib2.isJeiLoaded()) { - JEISupport.recipeSlot(this); - } - if (LDLib2.isReiLoaded()) { - REISupport.recipeSlot(this, io); - } - if (LDLib2.isEmiLoaded()) { - EMISupport.recipeSlot(this, chance); - } - return this; - } - - public ItemSlot xeiRecipeSlot(IngredientIO io, float chance, int amount, Stream allPossibleItems) { - if (LDLib2.isJeiLoaded()) { - JEISupport.recipeSlot(this, () -> allPossibleItems); - } - if (LDLib2.isReiLoaded()) { - REISupport.recipeSlot(this, io, () -> allPossibleItems); - } - if (LDLib2.isEmiLoaded()) { - EMISupport.recipeSlot(this, () -> chance, () -> amount, () -> allPossibleItems); - } - return this; - } private void addSlotToTheMenu() { if (slot instanceof LocalSlot) return; @@ -484,137 +388,4 @@ public void loadXml(Element element) { super.loadXml(element); } - // region XEI Supports - public static class JEISupport { - public static void clickableIngredient(ItemSlot itemSlot) { - LDLibJEIPlugin.clickableIngredient(itemSlot, () -> { - if (!itemSlot.allowXEILookup) return null; - var current = itemSlot.getValue(); - if (current.isEmpty()) return null; - return TypedItemStack.create(current); - }); - } - - public static void ghostIngredient(ItemSlot itemSlot) { - LDLibJEIPlugin.ghostIngredient(itemSlot, VanillaTypes.ITEM_STACK, - ingredient -> itemSlot.getSlot().mayPlace(ingredient.getIngredient()), - itemSlot::setValue); - } - - public static void recipeIngredient(ItemSlot itemSlot, IngredientIO io) { - recipeIngredient(itemSlot, io, () -> Stream.of(itemSlot.getValue())); - } - - public static void recipeIngredient(ItemSlot itemSlot, IngredientIO io, Supplier> allPossibleItems) { - LDLibJEIPlugin.recipeIngredient(itemSlot, io, () -> allPossibleItems.get() - .map(TypedItemStack::create) - .collect(Collectors.toList())); - } - - public static void recipeSlot(ItemSlot itemSlot) { - recipeSlot(itemSlot, () -> Stream.of(itemSlot.getValue())); - } - - public static void recipeSlot(ItemSlot itemSlot, Supplier> allPossibleItems) { - LDLibJEIPlugin.recipeSlot(itemSlot, () -> { - var item = itemSlot.getValue(); - return item.isEmpty() ? null : TypedItemStack.create(item); - }, () ->allPossibleItems.get().map(TypedItemStack::create).collect(Collectors.toList())); - } - } - - public static class REISupport { - public static void focusedStack(ItemSlot itemSlot) { - LDLibREIPlugin.focusedStack(itemSlot, () -> { - if (!itemSlot.allowXEILookup) return null; - var item = itemSlot.getValue(); - if (item.isEmpty()) return null; - return EntryStacks.of(item); - }); - } - - public static void draggableStackBounds(ItemSlot itemSlot) { - LDLibREIPlugin.draggableStackBounds(itemSlot, - VanillaEntryTypes.ITEM, - stack -> itemSlot.getSlot().mayPlace(stack.getValue())); - } - - public static void acceptDraggableStack(ItemSlot itemSlot) { - LDLibREIPlugin.acceptDraggableStack(itemSlot, - VanillaEntryTypes.ITEM, - stack -> itemSlot.getSlot().mayPlace(stack.getValue()), - stack -> itemSlot.setValue(stack.getValue())); - } - - public static void recipeIngredient(ItemSlot itemSlot, IngredientIO io) { - recipeIngredient(itemSlot, io, () -> Stream.of(itemSlot.getValue())); - } - - public static void recipeIngredient(ItemSlot itemSlot, IngredientIO io, Supplier> allPossibleItems) { - LDLibREIPlugin.recipeIngredient(itemSlot, io, () -> allPossibleItems.get() - .map(EntryIngredients::of) - .toList() - ); - } - - public static void recipeSlot(ItemSlot itemSlot, IngredientIO io) { - recipeSlot(itemSlot, io, () -> Stream.of(itemSlot.getValue())); - } - - public static void recipeSlot(ItemSlot itemSlot, IngredientIO io, Supplier> allPossibleItems) { - LDLibREIPlugin.recipeSlot(itemSlot, io, - () -> EntryStacks.of(itemSlot.getValue()), - () -> allPossibleItems.get().map(EntryStacks::of).collect(Collectors.toList())); - } - } - - public static class EMISupport { - public static void stackProvider(ItemSlot itemSlot) { - LDLibEMIPlugin.stackProvider(itemSlot, () -> { - if (!itemSlot.allowXEILookup) return null; - var item = itemSlot.getValue(); - if (item.isEmpty()) return null; - return new EmiStackInteraction(EmiStack.of(item), null, false); - }); - } - - public static void renderDragHandler(ItemSlot itemSlot) { - LDLibEMIPlugin.renderDragHandler(itemSlot, - dragged -> dragged instanceof ItemEmiStack item && itemSlot.getSlot().mayPlace(item.getItemStack())); - } - - public static void dropStackHandler(ItemSlot itemSlot) { - LDLibEMIPlugin.dropStackHandler(itemSlot, - dragged -> dragged instanceof ItemEmiStack item && itemSlot.getSlot().mayPlace(item.getItemStack()), - dragged -> { - if (dragged instanceof ItemEmiStack item) { - itemSlot.setValue(item.getItemStack()); - } - }); - } - - public static void recipeIngredient(ItemSlot itemSlot, IngredientIO io) { - recipeIngredient(itemSlot, io, () -> Stream.of(itemSlot.getValue())); - } - - public static void recipeIngredient(ItemSlot itemSlot, IngredientIO io, Supplier> allPossibleItems) { - LDLibEMIPlugin.recipeIngredient(itemSlot, io, () -> allPossibleItems.get() - .map(EmiStack::of) - .collect(Collectors.toList()) - ); - } - - public static void recipeSlot(ItemSlot itemSlot, float chance) { - LDLibEMIPlugin.recipeSlot(itemSlot, () -> EmiStack.of(itemSlot.getValue()).setChance(chance)); - } - - public static void recipeSlot(ItemSlot itemSlot, Supplier chance, IntSupplier amount, Supplier> allPossibleItems) { - LDLibEMIPlugin.recipeSlot(itemSlot, () -> - new ListEmiIngredient( - allPossibleItems.get().map(EmiStack::of) - .map(e -> e.setChance(chance.get())).collect(Collectors.toList()), amount.getAsInt()) - .setChance(chance.get())); - } - } - // endregion } diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Label.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Label.java index 16342e033..b19814e2d 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Label.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Label.java @@ -5,7 +5,6 @@ import com.lowdragmc.lowdraglib2.gui.sync.bindings.IDataProvider; import com.lowdragmc.lowdraglib2.gui.ui.event.UIEventListener; import com.lowdragmc.lowdraglib2.gui.ui.event.UIEvents; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegister; import com.lowdragmc.lowdraglib2.syncdata.ISubscription; import net.minecraft.MethodsReturnNonnullByDefault; @@ -19,7 +18,6 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -@KJSBindings @LDLRegister(name = "label", group = "basic", registry = "ldlib2:ui_element") public class Label extends TextElement implements IBindable, IDataConsumer { protected final Map, ISubscription> dataSources = new LinkedHashMap<>(); diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Menu.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Menu.java index 2b3320db3..8462ed29c 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Menu.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Menu.java @@ -13,7 +13,6 @@ import com.lowdragmc.lowdraglib2.gui.ui.styletemplate.Sprites; import com.lowdragmc.lowdraglib2.gui.ui.utils.UIElementProvider; import com.lowdragmc.lowdraglib2.gui.util.ITreeNode; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import dev.vfyjxf.taffy.style.AlignItems; import dev.vfyjxf.taffy.style.FlexDirection; import dev.vfyjxf.taffy.style.TaffyPosition; @@ -34,7 +33,6 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @Accessors(chain = true) -@KJSBindings public class Menu extends UIElement { @Configurable(name = "MenuStyle") public class MenuStyle extends Style { diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ProgressBar.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ProgressBar.java index 4bb0c0f80..0b4f77679 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ProgressBar.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/ProgressBar.java @@ -16,7 +16,6 @@ import com.lowdragmc.lowdraglib2.gui.ui.style.Property; import com.lowdragmc.lowdraglib2.gui.ui.style.PropertyRegistry; import com.lowdragmc.lowdraglib2.gui.ui.styletemplate.Sprites; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegister; import com.lowdragmc.lowdraglib2.syncdata.ISubscription; import com.lowdragmc.lowdraglib2.utils.XmlUtils; @@ -40,7 +39,6 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @Accessors(chain = true) -@KJSBindings @LDLRegister(name = "progress-bar", group = "basic", registry = "ldlib2:ui_element") public class ProgressBar extends UIElement implements IBindable, IDataConsumer { @Configurable(name = "ProgressBarStyle") diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Scene.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Scene.java index 8a3f7c6ff..fd6e22633 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Scene.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Scene.java @@ -8,7 +8,6 @@ import com.lowdragmc.lowdraglib2.gui.ui.event.UIEvents; import com.lowdragmc.lowdraglib2.gui.ui.rendering.GUIContext; import com.lowdragmc.lowdraglib2.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.math.Size; import com.lowdragmc.lowdraglib2.math.interpolate.Eases; import com.lowdragmc.lowdraglib2.math.interpolate.Interpolator; @@ -33,8 +32,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import org.appliedenergistics.yoga.YogaOverflow; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; @@ -50,14 +49,13 @@ @Accessors(chain = true) @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -@KJSBindings @LDLRegister(name = "scene", group = "misc", registry = "ldlib2:ui_element") public class Scene extends UIElement { private static final Object ROTATION_DRAGGING = new Object(); private static final Object PAN_DRAGGING = new Object(); @Nullable - @OnlyIn(Dist.CLIENT) - @Getter(onMethod_ = @OnlyIn(Dist.CLIENT)) + @Environment(EnvType.CLIENT) + @Getter(onMethod_ = @Environment(EnvType.CLIENT)) protected WorldSceneRenderer renderer; @Nullable @Getter @@ -150,7 +148,7 @@ public Scene useOrtho(boolean useOrtho) { return this; } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public Scene setBeforeWorldRender(Consumer beforeWorldRender) { this.beforeWorldRender = beforeWorldRender; if (this.beforeWorldRender != null && renderer != null) { @@ -181,7 +179,7 @@ protected void onRemoved() { } @Nullable - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public ParticleManager getParticleManager() { if (renderer == null) return null; return renderer.getParticleManager(); @@ -218,7 +216,7 @@ public void needCompileCache() { /** * Creates a scene with the given world and whether to use FBO scene renderer. */ - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public final Scene createScene(Level world, boolean useFBOSceneRenderer, @Nullable Size fboSize) { releaseRendererResource(); core.clear(); @@ -256,7 +254,7 @@ private static WorldSceneRenderer createWorldSceneRenderer(Level world, boolean } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public final Scene createScene(Level world) { return createScene(world, false, null); } @@ -305,11 +303,11 @@ public Scene setRenderedCore(Collection blocks) { return setRenderedCore(blocks, null); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) protected void renderBeforeBatchEnd(MultiBufferSource bufferSource, float partialTicks) { } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void renderBlockOverLay(WorldSceneRenderer renderer) { if (renderer == null || dummyWorld == null || core == null || core.isEmpty()) { return; @@ -348,7 +346,7 @@ public void renderBlockOverLay(WorldSceneRenderer renderer) { var mui = getModularUI(); if (lastHoverPosFace != null && hit != null && mui != null && mui.player != null) { var state = dummyWorld.getBlockState(lastHoverPosFace.pos()); - lastHoverItem = state.getBlock().getCloneItemStack(state, hit, dummyWorld, lastHoverPosFace.pos(), mui.player); + lastHoverItem = state.getBlock().getCloneItemStack(dummyWorld, lastHoverPosFace.pos(), state); } } @@ -370,12 +368,12 @@ public void renderBlockOverLay(WorldSceneRenderer renderer) { } } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void drawFacingBorder(PoseStack poseStack, BlockPosFace posFace, int color) { drawFacingBorder(poseStack, posFace, color, 0); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) public void drawFacingBorder(PoseStack poseStack, BlockPosFace posFace, int color, int inner) { poseStack.pushPose(); RenderSystem.disableDepthTest(); @@ -388,7 +386,7 @@ public void drawFacingBorder(PoseStack poseStack, BlockPosFace posFace, int colo poseStack.popPose(); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private static void drawBorder(PoseStack poseStack, int x, int y, int width, int height, int color, int border) { drawSolidRect(poseStack,x - border, y - border, width + 2 * border, border, color); drawSolidRect(poseStack,x - border, y + height, width + 2 * border, border, color); @@ -396,13 +394,13 @@ private static void drawBorder(PoseStack poseStack, int x, int y, int width, int drawSolidRect(poseStack,x + width, y, border, height, color); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private static void drawSolidRect(PoseStack poseStack, int x, int y, int width, int height, int color) { fill(poseStack, x, y, x + width, y + height, 0, color); RenderSystem.enableBlend(); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private static void fill(PoseStack matrices, int x1, int y1, int x2, int y2, int z, int color) { Matrix4f matrix4f = matrices.last().pose(); int i; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Scroller.java b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Scroller.java index 8712166ee..be336c9e4 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Scroller.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/gui/ui/elements/Scroller.java @@ -10,7 +10,6 @@ import com.lowdragmc.lowdraglib2.gui.ui.style.Property; import com.lowdragmc.lowdraglib2.gui.ui.style.PropertyRegistry; import com.lowdragmc.lowdraglib2.gui.ui.styletemplate.Sprites; -import com.lowdragmc.lowdraglib2.integration.kjs.KJSBindings; import com.lowdragmc.lowdraglib2.registry.annotation.LDLRegister; import com.lowdragmc.lowdraglib2.utils.XmlUtils; import dev.vfyjxf.taffy.style.AlignItems; @@ -272,8 +271,7 @@ public Scroller scrollBar(Consumer