PFX: fix heap-floor/capture regressions, add Williams operator menu; … #90
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build | |
| on: | |
| push: | |
| branches: [ main, develop ] | |
| tags: [ 'v*' ] | |
| pull_request: | |
| branches: [ main ] | |
| env: | |
| NDK_VERSION: 'r23c' | |
| jobs: | |
| # ════════════════════════════════════════════════════════════════════ | |
| # Job 1: Build libmodloader.so (ARM64 Android) | |
| # ════════════════════════════════════════════════════════════════════ | |
| build-modloader: | |
| name: Build libmodloader.so | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - name: Setup Android NDK | |
| uses: nttld/setup-ndk@v1 | |
| id: setup-ndk | |
| with: | |
| ndk-version: ${{ env.NDK_VERSION }} | |
| add-to-path: false | |
| - name: Install Ninja | |
| run: sudo apt-get update && sudo apt-get install -y ninja-build | |
| - name: Configure CMake | |
| working-directory: modloader | |
| env: | |
| ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} | |
| run: | | |
| mkdir -p build && cd build | |
| cmake -G Ninja \ | |
| -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \ | |
| -DANDROID_ABI=arm64-v8a \ | |
| -DANDROID_PLATFORM=android-24 \ | |
| -DANDROID_STL=c++_static \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| .. | |
| - name: Build | |
| working-directory: modloader/build | |
| run: ninja -j$(nproc) | |
| - name: Verify output | |
| run: | | |
| ls -la modloader/build/libmodloader.so | |
| file modloader/build/libmodloader.so | |
| - name: Upload artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: libmodloader-arm64 | |
| path: modloader/build/libmodloader.so | |
| retention-days: 30 | |
| # ════════════════════════════════════════════════════════════════════ | |
| # Job 2: Build Installer (Windows GUI + CLI) | |
| # ════════════════════════════════════════════════════════════════════ | |
| build-installer: | |
| name: Build Installer (${{ matrix.os }}) | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: windows-latest | |
| target: x86_64-pc-windows-msvc | |
| artifact: ue-modloader-installer.exe | |
| - os: ubuntu-latest | |
| target: x86_64-unknown-linux-gnu | |
| artifact: ue-modloader-installer | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Setup Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| targets: ${{ matrix.target }} | |
| - name: Cache Rust dependencies | |
| uses: Swatinem/rust-cache@v2 | |
| with: | |
| workspaces: installer | |
| # Linux: install egui/eframe deps (X11, OpenGL) | |
| - name: Install Linux deps | |
| if: runner.os == 'Linux' | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y \ | |
| pkg-config \ | |
| libx11-dev libxrandr-dev libxi-dev libxkbcommon-x11-dev \ | |
| libgl1-mesa-dev \ | |
| libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev \ | |
| libxcb-randr0-dev libxcb-cursor-dev \ | |
| libxkbcommon-dev libssl-dev libgtk-3-dev \ | |
| libglib2.0-dev libatk1.0-dev libcairo2-dev libpango1.0-dev \ | |
| libgdk-pixbuf2.0-dev | |
| - name: Build installer (Release) | |
| working-directory: installer | |
| run: cargo build --release --target ${{ matrix.target }} | |
| - name: Upload installer artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: installer-${{ matrix.target }} | |
| path: installer/target/${{ matrix.target }}/release/${{ matrix.artifact }} | |
| retention-days: 30 | |
| # ════════════════════════════════════════════════════════════════════ | |
| # Job 3: Package Release | |
| # • On tag push (v*): creates a full versioned GitHub Release | |
| # • On push to main: creates/updates a "dev-latest" pre-release | |
| # ════════════════════════════════════════════════════════════════════ | |
| package: | |
| name: Package Release | |
| needs: [build-modloader, build-installer] | |
| if: startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main' | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Download libmodloader.so | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: libmodloader-arm64 | |
| path: release/ | |
| - name: Download Windows installer | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: installer-x86_64-pc-windows-msvc | |
| path: release/ | |
| - name: Download Linux installer | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: installer-x86_64-unknown-linux-gnu | |
| path: release/linux/ | |
| - name: Set release tag | |
| id: tag | |
| run: | | |
| if [[ "${{ github.ref }}" == refs/tags/v* ]]; then | |
| echo "tag=${{ github.ref_name }}" >> "$GITHUB_OUTPUT" | |
| echo "prerelease=false" >> "$GITHUB_OUTPUT" | |
| echo "name=Release ${{ github.ref_name }}" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "tag=dev-latest" >> "$GITHUB_OUTPUT" | |
| echo "prerelease=true" >> "$GITHUB_OUTPUT" | |
| echo "name=Development Build (latest main)" >> "$GITHUB_OUTPUT" | |
| fi | |
| - name: Package mods & tools | |
| run: | | |
| # ── Game mods ── | |
| for game_dir in mods/*/; do | |
| game=$(basename "$game_dir") | |
| for mod in "$game_dir"*/; do | |
| [ -d "$mod" ] || continue | |
| mod_name=$(basename "$mod") | |
| mkdir -p "release/mods/$game/$mod_name" | |
| cp "$mod"*.lua "release/mods/$game/$mod_name/" 2>/dev/null || true | |
| cp "$mod"*.pak "release/mods/$game/$mod_name/" 2>/dev/null || true | |
| done | |
| done | |
| # ── PAK files ── | |
| if [ -d "PAKS" ]; then | |
| mkdir -p release/PAKS | |
| cp PAKS/*.pak release/PAKS/ 2>/dev/null || true | |
| fi | |
| # ── Tools ── | |
| mkdir -p release/tools | |
| cp tools/deploy.py release/tools/ 2>/dev/null || true | |
| cp tools/uncook.py release/tools/ 2>/dev/null || true | |
| cp tools/extract_paks.py release/tools/ 2>/dev/null || true | |
| cp tools/dump_uasset.py release/tools/ 2>/dev/null || true | |
| cp tools/kismet_decompiler.py release/tools/ 2>/dev/null || true | |
| cp tools/build_debug_pak.py release/tools/ 2>/dev/null || true | |
| # ── Examples ── | |
| cp -r examples/ release/examples/ 2>/dev/null || true | |
| # ── Docs ── | |
| cp README.md release/ | |
| cp LICENSE release/ | |
| cp CHANGELOG.md release/ 2>/dev/null || true | |
| cp docs/LUA_API.md release/ 2>/dev/null || true | |
| # ── Linux installer is separate ── | |
| chmod +x release/linux/ue-modloader-installer 2>/dev/null || true | |
| - name: Create Windows release archive | |
| run: | | |
| cd release | |
| # Remove linux subdir from main zip | |
| zip -r ../quest-ue-modloader-${{ steps.tag.outputs.tag }}-windows.zip . -x "linux/*" | |
| - name: Create Linux release archive | |
| run: | | |
| # Copy shared files into linux release | |
| cp release/libmodloader.so release/linux/ | |
| cp -r release/mods release/linux/mods 2>/dev/null || true | |
| cp -r release/tools release/linux/tools 2>/dev/null || true | |
| cp -r release/examples release/linux/examples 2>/dev/null || true | |
| cp -r release/PAKS release/linux/PAKS 2>/dev/null || true | |
| cp release/README.md release/linux/ 2>/dev/null || true | |
| cp release/LICENSE release/linux/ 2>/dev/null || true | |
| cd release/linux | |
| tar czf ../../quest-ue-modloader-${{ steps.tag.outputs.tag }}-linux.tar.gz . | |
| # For dev-latest: delete old release first so we can recreate it | |
| - name: Delete existing dev-latest release | |
| if: steps.tag.outputs.tag == 'dev-latest' | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: | | |
| gh release delete dev-latest --yes --cleanup-tag 2>/dev/null || true | |
| - name: Create Release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: ${{ steps.tag.outputs.tag }} | |
| name: ${{ steps.tag.outputs.name }} | |
| files: | | |
| quest-ue-modloader-${{ steps.tag.outputs.tag }}-windows.zip | |
| quest-ue-modloader-${{ steps.tag.outputs.tag }}-linux.tar.gz | |
| generate_release_notes: true | |
| draft: false | |
| prerelease: ${{ steps.tag.outputs.prerelease }} |