From cf1520375d903cc88d0ae0d5ea82ebe539e0fb35 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sat, 19 Oct 2024 17:22:27 +0300 Subject: [PATCH 01/70] first try --- .github/workflows/release.yml | 84 ++++++++++++++++++++++ .github/workflows/test.yml | 128 ++++++++++++++++++++++++++++++++++ 2 files changed, 212 insertions(+) create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..bbb40d7 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,84 @@ +# name: Build/release + +# on: +# push: +# tags: +# - "*" + +# jobs: +# release: +# runs-on: ${{ matrix.os }} + +# defaults: +# run: +# shell: bash + +# # env: +# # STEAMWORKS_SDK_ARCHIVE_PASSWORD: ${{ secrets.STEAMWORKS_SDK_ARCHIVE_PASSWORD }} +# # STEAMWORKS_SDK_GOOGLE_DRIVE_LINK: ${{ secrets.STEAMWORKS_SDK_GOOGLE_DRIVE_LINK }} + +# strategy: +# fail-fast: false +# matrix: +# os: [windows-latest, macos-latest, ubuntu-latest] + +# steps: +# - name: Check out Git repository +# uses: actions/checkout@v3 + +# - name: Install Node.js, NPM and Yarn +# uses: actions/setup-node@v3 +# with: +# node-version: "16" +# cache: "npm" + +# - name: TEMPORARY - Install gdown for fetchSteamworksSdk.js +# run: pip3 install gdown + +# - name: Install dependencies +# run: | +# npm install --legacy-peer-deps + +# - name: Build +# run: | +# npm run postinstall +# npm run build + +# - name: Publish to github +# env: +# # These values are used for auto updates signing +# # APPLE_ID: ${{ secrets.APPLE_ID }} +# # APPLE_ID_PASS: ${{ secrets.APPLE_ID_PASS }} +# # CSC_LINK: ${{ secrets.CSC_LINK }} +# # CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} +# # This is used for uploading release assets to github +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# run: npm exec electron-builder -- --publish always + +# # - id: setup-steamcmd +# # uses: CyberAndrii/setup-steamcmd@v1.1.1 + +# # - name: Create steamworks build script +# # run: node ./scripts/createSteamBuildScript.js +# # env: +# # STEAM_APP_ID: 1904150 +# # RELEASE_BRANCH: development +# # DEPOT_WINDOWS_ID: 1904151 +# # DEPOT_LINUX_ID: 1904152 +# # DEPOT_MACOS_ID: 1904153 +# # RUNNER_OS: $RUNNER_OS + +# # - name: Generate steam guard auth code +# # id: generate +# # uses: CyberAndrii/steam-totp@v1.0.2 +# # with: +# # shared_secret: ${{ secrets.STEAM_SHARED_SECRET }} + +# # - name: Publish to Steam +# # run: | +# # node ./scripts/publishToSteam.js +# # env: +# # STEAM_CMD: ${{ steps.setup-steamcmd.outputs.executable }} +# # STEAM_USERNAME: ${{ secrets.STEAM_USERNAME }} +# # STEAM_PASSWORD: ${{ secrets.STEAM_PASSWORD }} +# # STEAM_GUARD_CODE: ${{ steps.generate.outputs.code }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..a2e11f8 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,128 @@ +name: Test + +on: + push: + branches: + - "**" + - "!main" + - "!l10n_main" + +# env: +# STEAMWORKS_SDK_ARCHIVE_PASSWORD: ${{ secrets.STEAMWORKS_SDK_ARCHIVE_PASSWORD }} +# STEAMWORKS_SDK_GOOGLE_DRIVE_LINK: ${{ secrets.STEAMWORKS_SDK_GOOGLE_DRIVE_LINK }} + +jobs: + build: + runs-on: self-hosted + steps: + - name: Check out Git repository + uses: actions/checkout@v3 + with: + repository: https://github.com/Ciberusps/UE_5_4_Blueprint + path: UE_5_4_Blueprint + - name: Build project + uses: OrchidIsle/UE5-Build-Project@latest + with: + RUNUAT_PATH: 'C:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat' + UPROJECT_PATH: ${{ github.workspace }}/UE_5_4_Blueprint/UE_5_4_Blueprint.uproject + BUILD_CONFIG: Development + PLATFORM: Win64 + CLEAN: true + COOK: false + STAGE: false + PACKAGE: false + PAK: false + SERVER: false + ARCHIVE: false + ARCHIVE_PATH: 'C:/Archives/MyGame' + NULLRHI: true + EDITOR: true + ENCRYPT_INI: true + # RELEASE: '1.0.0' + # PATCH: '0.9.0' + # MAPS: 'Map1,Map2' + DELETE_PDB: true + # ANTICHEAT_ENABLED: true + # ANTICHEAT_PRIVATE_KEY: 'base64encodedprivatekey' + # ANTICHEAT_PUBLIC_CERT: 'base64encodedpubliccert' + + + + + + + + + # lint: + # runs-on: self-hosted + # steps: + # - name: Check out Git repository + # uses: actions/checkout@v3 + +# lint-prettier: +# runs-on: ubuntu-latest +# steps: +# - name: Check out Git repository +# uses: actions/checkout@v3 +# - name: Install Node.js, NPM and Yarn +# uses: actions/setup-node@v3 +# with: +# node-version: "16" +# cache: "npm" +# - name: TEMPORARY - Install gdown for fetchSteamworksSdk.js +# run: pip3 install gdown +# - name: Install dependencies +# run: npm install --legacy-peer-deps +# - name: Lint Prettier +# run: npm run lint:prettier + +# lint-types: +# runs-on: ubuntu-latest +# steps: +# - name: Check out Git repository +# uses: actions/checkout@v3 +# - name: Install Node.js, NPM and Yarn +# uses: actions/setup-node@v3 +# with: +# node-version: "16" +# cache: "npm" +# - name: TEMPORARY - Install gdown for fetchSteamworksSdk.js +# run: pip3 install gdown +# - name: Install dependencies +# run: npm install --legacy-peer-deps +# - name: Lint Types +# run: npm run lint:types + +# licenses-check: +# runs-on: ubuntu-latest +# steps: +# - name: Check out Git repository +# uses: actions/checkout@v3 +# - name: Install Node.js, NPM and Yarn +# uses: actions/setup-node@v3 +# with: +# node-version: "16" +# cache: "npm" +# - name: TEMPORARY - Install gdown for fetchSteamworksSdk.js +# run: pip3 install gdown +# - name: Install dependencies +# run: npm install --legacy-peer-deps +# - name: Test +# run: npm run lint:licenses + +# test: +# runs-on: ubuntu-latest +# steps: +# - name: Check out Git repository +# uses: actions/checkout@v3 +# - name: Install Node.js, NPM and Yarn +# uses: actions/setup-node@v3 +# with: +# node-version: "16" +# cache: "npm" +# - name: TEMPORARY - Install gdown for fetchSteamworksSdk.js +# run: pip3 install gdown +# - name: Install dependencies +# run: npm install --legacy-peer-deps +# - name: Test +# run: npm run test From 72d182baca3a477220dbb94c22adc53aabcb56f0 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sat, 19 Oct 2024 17:23:42 +0300 Subject: [PATCH 02/70] 2nd try --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a2e11f8..54e7eb9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,8 +4,8 @@ on: push: branches: - "**" - - "!main" - - "!l10n_main" + # - "!main" + # - "!l10n_main" # env: # STEAMWORKS_SDK_ARCHIVE_PASSWORD: ${{ secrets.STEAMWORKS_SDK_ARCHIVE_PASSWORD }} From f8daeb1e05a2a56775ab79e3a13c86f6a97bba2d Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sat, 19 Oct 2024 17:28:14 +0300 Subject: [PATCH 03/70] 3 --- .github/workflows/test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 54e7eb9..4f9b383 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -52,7 +52,6 @@ jobs: - # lint: # runs-on: self-hosted # steps: From b2511d0717d4d838b78856547fa47de9f39404ff Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sat, 19 Oct 2024 17:29:06 +0300 Subject: [PATCH 04/70] 4 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4f9b383..71f2b6f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,7 +18,7 @@ jobs: - name: Check out Git repository uses: actions/checkout@v3 with: - repository: https://github.com/Ciberusps/UE_5_4_Blueprint + repository: Ciberusps/UE_5_4_Blueprint path: UE_5_4_Blueprint - name: Build project uses: OrchidIsle/UE5-Build-Project@latest From a4e41001e6b763c36becc3ed579d8547dc1b36e1 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sat, 19 Oct 2024 17:39:50 +0300 Subject: [PATCH 05/70] 5 --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 839fecb..8fb06cd 100644 --- a/README.md +++ b/README.md @@ -733,3 +733,9 @@ TODO check ref - https://github.com/Atulin/ChannelMerger ## Special Thanks [@Ingarnm](https://github.com/Ingarnm), [@Vamp1rk0](https://github.com/Vamp1rk0) for feedback + +## Github Actions + +- make your github runner +- Add `UE_5_4_Blueprint` as safe directory +`git config --global --add safe.directory D:/_work/unreal-helper-library/unreal-helper-library/UE_5_4_Blueprint` \ No newline at end of file From 9069b747a9501559e96a0b72cf5ef04db1679c56 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sat, 19 Oct 2024 17:40:45 +0300 Subject: [PATCH 06/70] 6 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 71f2b6f..2f44e24 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,7 +23,7 @@ jobs: - name: Build project uses: OrchidIsle/UE5-Build-Project@latest with: - RUNUAT_PATH: 'C:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat' + RUNUAT_PATH: 'S:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat' UPROJECT_PATH: ${{ github.workspace }}/UE_5_4_Blueprint/UE_5_4_Blueprint.uproject BUILD_CONFIG: Development PLATFORM: Win64 From 2c02d223cd7dce6094220696691ba2758622d309 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sat, 19 Oct 2024 17:47:54 +0300 Subject: [PATCH 07/70] 7 --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2f44e24..f9995f3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -28,8 +28,8 @@ jobs: BUILD_CONFIG: Development PLATFORM: Win64 CLEAN: true - COOK: false - STAGE: false + COOK: true + STAGE: true PACKAGE: false PAK: false SERVER: false From 66fe357ba363e78d0a8289f3d022da00b206cd17 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sat, 19 Oct 2024 17:52:59 +0300 Subject: [PATCH 08/70] 8 --- .github/workflows/test.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f9995f3..080d0f6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,11 +15,15 @@ jobs: build: runs-on: self-hosted steps: - - name: Check out Git repository + - name: Check out UE5.4 project uses: actions/checkout@v3 with: repository: Ciberusps/UE_5_4_Blueprint path: UE_5_4_Blueprint + - name: Check out UnrealHelperLibrary to Plugins folder + uses: actions/checkout@v3 + with: + path: UE_5_4_Blueprint/Plugins/UnrealHelperLibrary - name: Build project uses: OrchidIsle/UE5-Build-Project@latest with: From c750d245e12a5f07350adcfb1b4904419aee61af Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sat, 19 Oct 2024 18:01:36 +0300 Subject: [PATCH 09/70] 8 --- .github/workflows/test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 080d0f6..634637f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,10 +20,12 @@ jobs: with: repository: Ciberusps/UE_5_4_Blueprint path: UE_5_4_Blueprint + - name: Check out UnrealHelperLibrary to Plugins folder uses: actions/checkout@v3 with: path: UE_5_4_Blueprint/Plugins/UnrealHelperLibrary + - name: Build project uses: OrchidIsle/UE5-Build-Project@latest with: From 1bfc492084ceeedfea6d5ce9c93aa98b5c9a5b47 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sat, 19 Oct 2024 18:07:25 +0300 Subject: [PATCH 10/70] 9 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 634637f..540f259 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,7 +36,7 @@ jobs: CLEAN: true COOK: true STAGE: true - PACKAGE: false + PACKAGE: true PAK: false SERVER: false ARCHIVE: false From 8313a704726b3eb35cd21e0d935ce2537098b9e0 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sun, 20 Oct 2024 15:34:10 +0300 Subject: [PATCH 11/70] 10 --- .github/workflows/test.yml | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 540f259..f43564c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,11 @@ on: jobs: build: - runs-on: self-hosted + # runs-on: self-hosted + runs-on: ubuntu-latest + container: + image: ghcr.io/epicgames/unreal-engine:dev-5.4 + steps: - name: Check out UE5.4 project uses: actions/checkout@v3 @@ -21,15 +25,27 @@ jobs: repository: Ciberusps/UE_5_4_Blueprint path: UE_5_4_Blueprint - - name: Check out UnrealHelperLibrary to Plugins folder - uses: actions/checkout@v3 - with: - path: UE_5_4_Blueprint/Plugins/UnrealHelperLibrary - + - name: Check out UE5.4 project + run: ls + # - name: Check out UnrealHelperLibrary to Plugins folder + # uses: actions/checkout@v3 + # with: + # # path: UE_5_4_Blueprint/Plugins/UnrealHelperLibrary + # path: UnrealHelperLibrary + + # - name: Build Plugins (UHL) + # shell: powershell + # run: | + # mkdir "Temp" + # $pluginPath = Resolve-Path -Path "UE_5_4_Blueprint/Plugins/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" + # $tempDirAbsolutePath = Resolve-Path -Path "Temp" + # "S:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat BuildPlugin -plugin="$pluginPath" -package="$tempDirAbsolutePath"" + - name: Build project uses: OrchidIsle/UE5-Build-Project@latest with: - RUNUAT_PATH: 'S:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat' + # RUNUAT_PATH: 'S:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat' + RUNUAT_PATH: 'C:/Epic Games/UE5.4/Engine/Build/BatchFiles/RunUAT.bat' UPROJECT_PATH: ${{ github.workspace }}/UE_5_4_Blueprint/UE_5_4_Blueprint.uproject BUILD_CONFIG: Development PLATFORM: Win64 @@ -37,7 +53,7 @@ jobs: COOK: true STAGE: true PACKAGE: true - PAK: false + PAK: true SERVER: false ARCHIVE: false ARCHIVE_PATH: 'C:/Archives/MyGame' From 701688f20eccc12b637cd0f01a18cba483c6e2bd Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sun, 20 Oct 2024 15:34:59 +0300 Subject: [PATCH 12/70] 11 --- .github/workflows/test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f43564c..d638169 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,7 +26,8 @@ jobs: path: UE_5_4_Blueprint - name: Check out UE5.4 project - run: ls + run: | + ls # - name: Check out UnrealHelperLibrary to Plugins folder # uses: actions/checkout@v3 # with: From 5e46533d99d9e2b14fe2b95d73dd9e5a219396ad Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sun, 20 Oct 2024 15:36:05 +0300 Subject: [PATCH 13/70] 12 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d638169..ee42551 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,6 +26,7 @@ jobs: path: UE_5_4_Blueprint - name: Check out UE5.4 project + shell: bash run: | ls # - name: Check out UnrealHelperLibrary to Plugins folder @@ -33,7 +34,6 @@ jobs: # with: # # path: UE_5_4_Blueprint/Plugins/UnrealHelperLibrary # path: UnrealHelperLibrary - # - name: Build Plugins (UHL) # shell: powershell # run: | From d4875b8eeaa752b574ccd6880b8c1d24cd8d189c Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sun, 20 Oct 2024 15:48:16 +0300 Subject: [PATCH 14/70] 13 --- .github/workflows/test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ee42551..ef14d41 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,6 +17,9 @@ jobs: runs-on: ubuntu-latest container: image: ghcr.io/epicgames/unreal-engine:dev-5.4 + credentials: + username: ${{ github.actor }} + password: ${{ secrets.github_token }} steps: - name: Check out UE5.4 project From 2cfc42487055c912d34f7713f08a04c94950a74b Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sun, 20 Oct 2024 15:49:31 +0300 Subject: [PATCH 15/70] 14 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ef14d41..af85bc0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,7 +19,7 @@ jobs: image: ghcr.io/epicgames/unreal-engine:dev-5.4 credentials: username: ${{ github.actor }} - password: ${{ secrets.github_token }} + password: ${{ secrets.GITHUB_TOKEN }} steps: - name: Check out UE5.4 project From 2a2ba72c333b64858eb25dcb8560d0432bb38fc2 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sun, 20 Oct 2024 16:08:19 +0300 Subject: [PATCH 16/70] 15 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index af85bc0..2b708d0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,7 +19,7 @@ jobs: image: ghcr.io/epicgames/unreal-engine:dev-5.4 credentials: username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} + password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} steps: - name: Check out UE5.4 project From e317976ee3b1fdc5f7d7cf941b81c1d9aa175b55 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sun, 20 Oct 2024 16:20:55 +0300 Subject: [PATCH 17/70] 16 --- .github/workflows/test.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2b708d0..f5236e8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,12 +16,20 @@ jobs: # runs-on: self-hosted runs-on: ubuntu-latest container: - image: ghcr.io/epicgames/unreal-engine:dev-5.4 + image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4 credentials: username: ${{ github.actor }} password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} steps: + # free some space + # - name: Maximize build space + # uses: easimon/maximize-build-space@master + # with: + # root-reserve-mb: 512 + # swap-size-mb: 1024 + # remove-dotnet: 'true' + - name: Check out UE5.4 project uses: actions/checkout@v3 with: From ceb9f30c20b6d911ec825fac1fb053fddbbb28a0 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sun, 20 Oct 2024 18:09:15 +0300 Subject: [PATCH 18/70] 17 --- .github/workflows/test.yml | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f5236e8..3859408 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,6 +12,17 @@ on: # STEAMWORKS_SDK_GOOGLE_DRIVE_LINK: ${{ secrets.STEAMWORKS_SDK_GOOGLE_DRIVE_LINK }} jobs: + clean-up-space: + runs-on: ubuntu-latest + steps: + # free some space + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + build: # runs-on: self-hosted runs-on: ubuntu-latest @@ -20,26 +31,19 @@ jobs: credentials: username: ${{ github.actor }} password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} - - steps: - # free some space - # - name: Maximize build space - # uses: easimon/maximize-build-space@master - # with: - # root-reserve-mb: 512 - # swap-size-mb: 1024 - # remove-dotnet: 'true' + needs: clean-up-space + steps: - name: Check out UE5.4 project uses: actions/checkout@v3 with: repository: Ciberusps/UE_5_4_Blueprint path: UE_5_4_Blueprint - - name: Check out UE5.4 project - shell: bash - run: | - ls + # - name: Check out UE5.4 project + # shell: bash + # run: | + # ls # - name: Check out UnrealHelperLibrary to Plugins folder # uses: actions/checkout@v3 # with: @@ -57,7 +61,8 @@ jobs: uses: OrchidIsle/UE5-Build-Project@latest with: # RUNUAT_PATH: 'S:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat' - RUNUAT_PATH: 'C:/Epic Games/UE5.4/Engine/Build/BatchFiles/RunUAT.bat' + # UE folder in epic provided container - /home/ue4/UnrealEngine/Engine/Binaries + RUNUAT_PATH: 'home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT' UPROJECT_PATH: ${{ github.workspace }}/UE_5_4_Blueprint/UE_5_4_Blueprint.uproject BUILD_CONFIG: Development PLATFORM: Win64 From bc356237edea0231d9d1b5afa1c58b7b5bbf60a1 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sun, 20 Oct 2024 18:16:43 +0300 Subject: [PATCH 19/70] 18 --- .github/workflows/test.yml | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3859408..87de82b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,13 +15,28 @@ jobs: clean-up-space: runs-on: ubuntu-latest steps: - # free some space - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + # this might remove tools that are actually needed, + # if set to "true" but frees about 6 GB + tool-cache: false + + # all of these default to true, but feel free to set to + # "false" if necessary for your workflow + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: false + swap-storage: true + # # free some space + # - name: Maximize build space + # uses: easimon/maximize-build-space@master + # with: + # # root-reserve-mb: 512 + # # swap-size-mb: 1024 + # remove-dotnet: 'true' build: # runs-on: self-hosted From 60f34dde38ef27ea1bb8b017ea31fc201e348fe2 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sun, 20 Oct 2024 23:08:07 +0300 Subject: [PATCH 20/70] save --- .github/workflows/test.yml | 53 +++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 87de82b..f3b2ddb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,24 +12,26 @@ on: # STEAMWORKS_SDK_GOOGLE_DRIVE_LINK: ${{ secrets.STEAMWORKS_SDK_GOOGLE_DRIVE_LINK }} jobs: - clean-up-space: - runs-on: ubuntu-latest - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@main - with: - # this might remove tools that are actually needed, - # if set to "true" but frees about 6 GB - tool-cache: false +# clean-up-space: +# runs-on: ubuntu-latest +# steps: + # Works better + # - name: Free Disk Space (Ubuntu) + # uses: jlumbroso/free-disk-space@main + # with: + # # this might remove tools that are actually needed, + # # if set to "true" but frees about 6 GB + # tool-cache: false - # all of these default to true, but feel free to set to - # "false" if necessary for your workflow - android: true - dotnet: true - haskell: true - large-packages: true - docker-images: false - swap-storage: true + # # all of these default to true, but feel free to set to + # # "false" if necessary for your workflow + # android: true + # dotnet: true + # haskell: true + # large-packages: true + # docker-images: false + # swap-storage: true + # # free some space # - name: Maximize build space # uses: easimon/maximize-build-space@master @@ -37,16 +39,15 @@ jobs: # # root-reserve-mb: 512 # # swap-size-mb: 1024 # remove-dotnet: 'true' - build: - # runs-on: self-hosted - runs-on: ubuntu-latest - container: - image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4 - credentials: - username: ${{ github.actor }} - password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} - needs: clean-up-space + runs-on: self-hosted + # runs-on: ubuntu-latest + # container: + # image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4 + # credentials: + # username: ${{ github.actor }} + # password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} + # needs: clean-up-space steps: - name: Check out UE5.4 project From 45754e4dd8dcdc5e48bd51a89b852769b8f19d15 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Sun, 20 Oct 2024 23:13:12 +0300 Subject: [PATCH 21/70] prepare for FAB release, fix RunUAT "errors" --- Config/FilterPlugin.ini | 8 + .../Private/UnrealHelperEditor.cpp | 2 +- .../Private/UnrealHelperEditorCommands.cpp | 2 +- .../Private/UnrealHelperEditorStyle.cpp | 2 +- .../Public/UnrealHelperEditor.h | 2 +- .../Public/UnrealHelperEditorCommands.h | 2 +- .../Public/UnrealHelperEditorStyle.h | 2 +- .../UnrealHelperEditor.Build.cs | 2 +- .../Private/AI/Data/TurnSettings.cpp | 1 + .../Private/AI/Decorators/BTD_InAngle.cpp | 1 + .../Private/AI/Decorators/BTD_InRange.cpp | 1 + .../AI/Decorators/BTD_RandomChance.cpp | 3 +- .../Private/AI/Tasks/BTT_PlayAnimMontage.cpp | 4 + .../Private/AI/Tasks/BTT_TurnTo.cpp | 2 + .../Tasks/AT_InterpolateToPosition.cpp | 2 + .../Private/AbilitySystem/UHLAbilitySet.cpp | 74 +- .../Notifies/ANS_ActivateAbility.cpp | 3 + .../Notifies/ANS_CatchToAbilityInputCache.cpp | 1 + .../Notifies/ANS_CheckAbilityInputCache.cpp | 1 + .../ANS_EnableRootMotionZAxisMovement.cpp | 2 + .../Animation/Notifies/ANS_MagnetTo.cpp | 11 +- .../Animation/Notifies/ANS_UHL_Base.cpp | 4 + .../Animation/Notifies/AN_UHL_Base.cpp | 1 + .../Characters/UHLBaseCharacterWithASC.cpp | 1 + .../Private/Core/UHLPlayerController.cpp | 2 + .../Private/Input/UHLInputConfig.cpp | 6 +- .../AA_WaitDebugCategoryChange.cpp | 4 + .../DCC_AbilitySystem_Abilities.cpp | 1 + .../DCC_AbilitySystem_Attributes.cpp | 1 + .../DCC_AbilitySystem_Effects.cpp | 1 + .../DebugCategories/DCC_Collisions.cpp | 1 + .../DCC_InputSystem_EnhancedInput.cpp | 1 + .../DebugCategoryButtonWidget.cpp | 1 + .../DebugSubsystem/UHLDebugSubsystem.cpp | 1 + .../UI/UHLDebugCategoriesListWidget.cpp | 1 + .../Private/UnrealHelperLibrary.cpp | 144 ++-- .../Private/Utils/UHLTraceUtilsBPL.cpp | 6 +- .../Private/Utils/UnrealHelperLibraryBPL.cpp | 725 +++++++++--------- .../Public/AI/Data/TurnSettings.h | 2 + .../Public/AI/Decorators/BTD_InAngle.h | 2 + .../Public/AI/Decorators/BTD_InRange.h | 1 - .../Public/AI/Decorators/BTD_RandomChance.h | 2 +- .../Public/AI/Tasks/BTT_TurnTo.h | 1 + .../Abilities/UHLGameplayAbility.h | 29 +- .../Tasks/AT_InterpolateToPosition.h | 7 +- .../Public/AbilitySystem/UHLAbilitySet.h | 59 +- .../Animation/Notifies/ANS_ActivateAbility.h | 4 +- .../ANS_EnableRootMotionZAxisMovement.h | 6 +- .../Public/Animation/Notifies/ANS_MagnetTo.h | 7 +- .../Public/Animation/Notifies/ANS_UHL_Base.h | 4 +- .../Public/Animation/Notifies/AN_UHL_Base.h | 4 +- .../Development/UHLDebugSubsystemSettings.h | 1 + .../Public/Input/UHLInputConfig.h | 27 +- .../AA_WaitDebugCategoryChange.h | 1 - .../Public/UnrealHelperLibrary.h | 3 +- .../Public/Utils/UHLTraceUtilsBPL.h | 2 + .../Public/Utils/UnrealHelperLibraryBPL.h | 347 ++++----- 57 files changed, 788 insertions(+), 750 deletions(-) create mode 100644 Config/FilterPlugin.ini diff --git a/Config/FilterPlugin.ini b/Config/FilterPlugin.ini new file mode 100644 index 0000000..ccebca2 --- /dev/null +++ b/Config/FilterPlugin.ini @@ -0,0 +1,8 @@ +[FilterPlugin] +; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and +; may include "...", "*", and "?" wildcards to match directories, files, and individual characters respectively. +; +; Examples: +; /README.txt +; /Extras/... +; /Binaries/ThirdParty/*.dll diff --git a/Source/UnrealHelperEditor/Private/UnrealHelperEditor.cpp b/Source/UnrealHelperEditor/Private/UnrealHelperEditor.cpp index adb6b47..62dcb11 100644 --- a/Source/UnrealHelperEditor/Private/UnrealHelperEditor.cpp +++ b/Source/UnrealHelperEditor/Private/UnrealHelperEditor.cpp @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (c) 2024 Pavel Penkov #include "UnrealHelperEditor.h" #include "UnrealHelperEditorStyle.h" diff --git a/Source/UnrealHelperEditor/Private/UnrealHelperEditorCommands.cpp b/Source/UnrealHelperEditor/Private/UnrealHelperEditorCommands.cpp index ede8067..e948d4c 100644 --- a/Source/UnrealHelperEditor/Private/UnrealHelperEditorCommands.cpp +++ b/Source/UnrealHelperEditor/Private/UnrealHelperEditorCommands.cpp @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (c) 2024 Pavel Penkov #include "UnrealHelperEditorCommands.h" diff --git a/Source/UnrealHelperEditor/Private/UnrealHelperEditorStyle.cpp b/Source/UnrealHelperEditor/Private/UnrealHelperEditorStyle.cpp index 2a58d8a..44b5de7 100644 --- a/Source/UnrealHelperEditor/Private/UnrealHelperEditorStyle.cpp +++ b/Source/UnrealHelperEditor/Private/UnrealHelperEditorStyle.cpp @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (c) 2024 Pavel Penkov #include "UnrealHelperEditorStyle.h" #include "UnrealHelperEditor.h" diff --git a/Source/UnrealHelperEditor/Public/UnrealHelperEditor.h b/Source/UnrealHelperEditor/Public/UnrealHelperEditor.h index 8dc470e..9132469 100644 --- a/Source/UnrealHelperEditor/Public/UnrealHelperEditor.h +++ b/Source/UnrealHelperEditor/Public/UnrealHelperEditor.h @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (c) 2024 Pavel Penkov #pragma once diff --git a/Source/UnrealHelperEditor/Public/UnrealHelperEditorCommands.h b/Source/UnrealHelperEditor/Public/UnrealHelperEditorCommands.h index c01e132..6d7ba49 100644 --- a/Source/UnrealHelperEditor/Public/UnrealHelperEditorCommands.h +++ b/Source/UnrealHelperEditor/Public/UnrealHelperEditorCommands.h @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (c) 2024 Pavel Penkov #pragma once diff --git a/Source/UnrealHelperEditor/Public/UnrealHelperEditorStyle.h b/Source/UnrealHelperEditor/Public/UnrealHelperEditorStyle.h index 31ef722..44646e0 100644 --- a/Source/UnrealHelperEditor/Public/UnrealHelperEditorStyle.h +++ b/Source/UnrealHelperEditor/Public/UnrealHelperEditorStyle.h @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (c) 2024 Pavel Penkov #pragma once diff --git a/Source/UnrealHelperEditor/UnrealHelperEditor.Build.cs b/Source/UnrealHelperEditor/UnrealHelperEditor.Build.cs index f6e2b46..9039a24 100644 --- a/Source/UnrealHelperEditor/UnrealHelperEditor.Build.cs +++ b/Source/UnrealHelperEditor/UnrealHelperEditor.Build.cs @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (c) 2024 Pavel Penkov using UnrealBuildTool; diff --git a/Source/UnrealHelperLibrary/Private/AI/Data/TurnSettings.cpp b/Source/UnrealHelperLibrary/Private/AI/Data/TurnSettings.cpp index f744647..e329b82 100644 --- a/Source/UnrealHelperLibrary/Private/AI/Data/TurnSettings.cpp +++ b/Source/UnrealHelperLibrary/Private/AI/Data/TurnSettings.cpp @@ -2,6 +2,7 @@ #include "AI/Data/TurnSettings.h" +#include "Animation/AnimMontage.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(TurnSettings) diff --git a/Source/UnrealHelperLibrary/Private/AI/Decorators/BTD_InAngle.cpp b/Source/UnrealHelperLibrary/Private/AI/Decorators/BTD_InAngle.cpp index 76e99e3..32425e8 100644 --- a/Source/UnrealHelperLibrary/Private/AI/Decorators/BTD_InAngle.cpp +++ b/Source/UnrealHelperLibrary/Private/AI/Decorators/BTD_InAngle.cpp @@ -12,6 +12,7 @@ #include "Components/CapsuleComponent.h" #include "GameFramework/Character.h" #include "GameFramework/Controller.h" +#include "DrawDebugHelpers.h" #include "Kismet/KismetMathLibrary.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(BTD_InAngle) diff --git a/Source/UnrealHelperLibrary/Private/AI/Decorators/BTD_InRange.cpp b/Source/UnrealHelperLibrary/Private/AI/Decorators/BTD_InRange.cpp index 29558c2..710e752 100644 --- a/Source/UnrealHelperLibrary/Private/AI/Decorators/BTD_InRange.cpp +++ b/Source/UnrealHelperLibrary/Private/AI/Decorators/BTD_InRange.cpp @@ -10,6 +10,7 @@ #include "BehaviorTree/Blackboard/BlackboardKeyType_Vector.h" #include "Components/CapsuleComponent.h" #include "GameFramework/Character.h" +#include "DrawDebugHelpers.h" #include "Kismet/KismetMathLibrary.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(BTD_InRange) diff --git a/Source/UnrealHelperLibrary/Private/AI/Decorators/BTD_RandomChance.cpp b/Source/UnrealHelperLibrary/Private/AI/Decorators/BTD_RandomChance.cpp index 055e217..5e078e0 100644 --- a/Source/UnrealHelperLibrary/Private/AI/Decorators/BTD_RandomChance.cpp +++ b/Source/UnrealHelperLibrary/Private/AI/Decorators/BTD_RandomChance.cpp @@ -3,7 +3,6 @@ #include "AI/Decorators/BTD_RandomChance.h" -#include "BehaviorTree/BlackboardComponent.h" #include "BehaviorTree/BlackboardData.h" #include "Kismet/KismetMathLibrary.h" @@ -53,4 +52,4 @@ FName UBTD_RandomChance::GetNodeIconName() const // return FName("CodeView.ClassIcon"); return FName("GraphEditor.StructGlyph"); } -#endif // WITH_EDITOR +#endif diff --git a/Source/UnrealHelperLibrary/Private/AI/Tasks/BTT_PlayAnimMontage.cpp b/Source/UnrealHelperLibrary/Private/AI/Tasks/BTT_PlayAnimMontage.cpp index 39a0cf6..425e061 100644 --- a/Source/UnrealHelperLibrary/Private/AI/Tasks/BTT_PlayAnimMontage.cpp +++ b/Source/UnrealHelperLibrary/Private/AI/Tasks/BTT_PlayAnimMontage.cpp @@ -4,6 +4,10 @@ #include "AI/Tasks/BTT_PlayAnimMontage.h" #include "AIController.h" +#include "Engine/World.h" +#include "TimerManager.h" +#include "Animation/AnimMontage.h" +#include "Components/SkeletalMeshComponent.h" #include "GameFramework/Character.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(BTT_PlayAnimMontage) diff --git a/Source/UnrealHelperLibrary/Private/AI/Tasks/BTT_TurnTo.cpp b/Source/UnrealHelperLibrary/Private/AI/Tasks/BTT_TurnTo.cpp index ac7afdc..dac64a0 100644 --- a/Source/UnrealHelperLibrary/Private/AI/Tasks/BTT_TurnTo.cpp +++ b/Source/UnrealHelperLibrary/Private/AI/Tasks/BTT_TurnTo.cpp @@ -8,7 +8,9 @@ #include "BehaviorTree/Blackboard/BlackboardKeyType_Object.h" #include "BehaviorTree/Blackboard/BlackboardKeyType_Rotator.h" #include "BehaviorTree/Blackboard/BlackboardKeyType_Vector.h" +#include "GameFramework/Actor.h" #include "GameFramework/Character.h" +#include "Animation/AnimMontage.h" #include "Utils/UnrealHelperLibraryBPL.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(BTT_TurnTo) diff --git a/Source/UnrealHelperLibrary/Private/AbilitySystem/Tasks/AT_InterpolateToPosition.cpp b/Source/UnrealHelperLibrary/Private/AbilitySystem/Tasks/AT_InterpolateToPosition.cpp index e9d9b7d..4b2eeff 100644 --- a/Source/UnrealHelperLibrary/Private/AbilitySystem/Tasks/AT_InterpolateToPosition.cpp +++ b/Source/UnrealHelperLibrary/Private/AbilitySystem/Tasks/AT_InterpolateToPosition.cpp @@ -4,6 +4,8 @@ #include "AbilitySystem/Tasks/AT_InterpolateToPosition.h" #include "Curves/CurveVector.h" +#include "Curves/CurveFloat.h" +#include "Engine/World.h" #include "GameFramework/Character.h" #include "GameFramework/CharacterMovementComponent.h" #include "Kismet/KismetSystemLibrary.h" diff --git a/Source/UnrealHelperLibrary/Private/AbilitySystem/UHLAbilitySet.cpp b/Source/UnrealHelperLibrary/Private/AbilitySystem/UHLAbilitySet.cpp index a86bb2a..96587ca 100644 --- a/Source/UnrealHelperLibrary/Private/AbilitySystem/UHLAbilitySet.cpp +++ b/Source/UnrealHelperLibrary/Private/AbilitySystem/UHLAbilitySet.cpp @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (c) 2024 Pavel Penkov #include "AbilitySystem/UHLAbilitySet.h" @@ -7,10 +7,7 @@ #include UE_INLINE_GENERATED_CPP_BY_NAME(UHLAbilitySet) -void FUHLAbilitySet_GrantedHandles::SetAbilitySetTags(const FGameplayTagContainer& AbilitySetTagContainer) -{ - AbilitySetTags = AbilitySetTagContainer; -} +void FUHLAbilitySet_GrantedHandles::SetAbilitySetTags(const FGameplayTagContainer& AbilitySetTagContainer) { AbilitySetTags = AbilitySetTagContainer; } void FUHLAbilitySet_GrantedHandles::AddAbilitySpecHandle(const FGameplayAbilitySpecHandle& Handle) { @@ -28,10 +25,7 @@ void FUHLAbilitySet_GrantedHandles::AddGameplayEffectHandle(const FActiveGamepla } } -void FUHLAbilitySet_GrantedHandles::AddAttributeSet(UAttributeSet* Set) -{ - GrantedAttributeSets.Add(Set); -} +void FUHLAbilitySet_GrantedHandles::AddAttributeSet(UAttributeSet* Set) { GrantedAttributeSets.Add(Set); } void FUHLAbilitySet_GrantedHandles::TakeFromAbilitySystem(UAbilitySystemComponent* ASC) { @@ -64,16 +58,13 @@ void FUHLAbilitySet_GrantedHandles::TakeFromAbilitySystem(UAbilitySystemComponen ASC->RemoveSpawnedAttribute(Set); } - AbilitySetTags.Reset(); + AbilitySetTags.Reset(); AbilitySpecHandles.Reset(); GameplayEffectHandles.Reset(); GrantedAttributeSets.Reset(); } -UUHLAbilitySet::UUHLAbilitySet(const FObjectInitializer& ObjectInitializer) - : Super(ObjectInitializer) -{ -} +UUHLAbilitySet::UUHLAbilitySet(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) {} void UUHLAbilitySet::GiveToAbilitySystem(UAbilitySystemComponent* ASC, FUHLAbilitySet_GrantedHandles* OutGrantedHandles, UObject* SourceObject) const { @@ -85,33 +76,33 @@ void UUHLAbilitySet::GiveToAbilitySystem(UAbilitySystemComponent* ASC, FUHLAbili return; } - // Save AbilitySetTags to handles - OutGrantedHandles->SetAbilitySetTags(AbilitySetTags); + // Save AbilitySetTags to handles + OutGrantedHandles->SetAbilitySetTags(AbilitySetTags); - // Grant the simple gameplay abilities. - for (int32 AbilityIndex = 0; AbilityIndex < GrantedSimpleGameplayAbilities.Num(); ++AbilityIndex) - { - TSubclassOf AbilityToGrant = GrantedSimpleGameplayAbilities[AbilityIndex]; + // Grant the simple gameplay abilities. + for (int32 AbilityIndex = 0; AbilityIndex < GrantedSimpleGameplayAbilities.Num(); ++AbilityIndex) + { + TSubclassOf AbilityToGrant = GrantedSimpleGameplayAbilities[AbilityIndex]; - if (!IsValid(AbilityToGrant)) - { - UE_LOG(LogUHLAbilitySystem, Error, TEXT("GrantedSimpleGameplayAbilities[%d] on ability set [%s] is not valid."), AbilityIndex, *GetNameSafe(this)); - continue; - } + if (!IsValid(AbilityToGrant)) + { + UE_LOG(LogUHLAbilitySystem, Error, TEXT("GrantedSimpleGameplayAbilities[%d] on ability set [%s] is not valid."), AbilityIndex, *GetNameSafe(this)); + continue; + } - UGameplayAbility* AbilityCDO = AbilityToGrant->GetDefaultObject(); + UGameplayAbility* AbilityCDO = AbilityToGrant->GetDefaultObject(); - FGameplayAbilitySpec AbilitySpec(AbilityCDO, 1); - AbilitySpec.SourceObject = SourceObject; + FGameplayAbilitySpec AbilitySpec(AbilityCDO, 1); + AbilitySpec.SourceObject = SourceObject; - const FGameplayAbilitySpecHandle AbilitySpecHandle = ASC->GiveAbility(AbilitySpec); + const FGameplayAbilitySpecHandle AbilitySpecHandle = ASC->GiveAbility(AbilitySpec); + + if (OutGrantedHandles) + { + OutGrantedHandles->AddAbilitySpecHandle(AbilitySpecHandle); + } + } - if (OutGrantedHandles) - { - OutGrantedHandles->AddAbilitySpecHandle(AbilitySpecHandle); - } - } - // Grant the gameplay abilities. for (int32 AbilityIndex = 0; AbilityIndex < GrantedGameplayAbilities.Num(); ++AbilityIndex) { @@ -180,11 +171,10 @@ void UUHLAbilitySet::GiveToAbilitySystem(UAbilitySystemComponent* ASC, FUHLAbili TArray> UUHLAbilitySet::GetAllAbilitiesList() const { - TArray> Result = GrantedSimpleGameplayAbilities; - for (const FUHLAbilitySet_GameplayAbility& GrantedGameplayAbility : GrantedGameplayAbilities) - { - Result.Add(GrantedGameplayAbility.Ability); - } - return Result; + TArray> Result = GrantedSimpleGameplayAbilities; + for (const FUHLAbilitySet_GameplayAbility& GrantedGameplayAbility : GrantedGameplayAbilities) + { + Result.Add(GrantedGameplayAbility.Ability); + } + return Result; } - diff --git a/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_ActivateAbility.cpp b/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_ActivateAbility.cpp index a245745..f2b4689 100644 --- a/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_ActivateAbility.cpp +++ b/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_ActivateAbility.cpp @@ -3,8 +3,11 @@ #include "Animation/Notifies/ANS_ActivateAbility.h" +#include "Engine/World.h" +#include "Animation/AnimMontage.h" #include "AbilitySystemComponent.h" #include "AbilitySystemInterface.h" +#include "Components/SkeletalMeshComponent.h" #include "Utils/UnrealHelperLibraryBPL.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(ANS_ActivateAbility) diff --git a/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_CatchToAbilityInputCache.cpp b/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_CatchToAbilityInputCache.cpp index 2e93a5b..bac0a5b 100644 --- a/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_CatchToAbilityInputCache.cpp +++ b/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_CatchToAbilityInputCache.cpp @@ -5,6 +5,7 @@ #include "AbilitySystemInterface.h" #include "AbilitySystem/UHLAbilitySystemComponent.h" +#include "Components/SkeletalMeshComponent.h" #include "Core/UHLGameplayTags.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(ANS_CatchToAbilityInputCache) diff --git a/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_CheckAbilityInputCache.cpp b/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_CheckAbilityInputCache.cpp index d8a34d0..b0f50cb 100644 --- a/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_CheckAbilityInputCache.cpp +++ b/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_CheckAbilityInputCache.cpp @@ -5,6 +5,7 @@ #include "AbilitySystemInterface.h" #include "AbilitySystem/UHLAbilitySystemComponent.h" +#include "Components/SkeletalMeshComponent.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(ANS_CheckAbilityInputCache) diff --git a/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_EnableRootMotionZAxisMovement.cpp b/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_EnableRootMotionZAxisMovement.cpp index 602295e..f927568 100644 --- a/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_EnableRootMotionZAxisMovement.cpp +++ b/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_EnableRootMotionZAxisMovement.cpp @@ -5,6 +5,8 @@ #include "GameFramework/Character.h" #include "GameFramework/CharacterMovementComponent.h" +#include "Animation/AnimInstance.h" +#include "Components/SkeletalMeshComponent.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(ANS_EnableRootMotionZAxisMovement) diff --git a/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_MagnetTo.cpp b/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_MagnetTo.cpp index d531dbb..d6b3f76 100644 --- a/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_MagnetTo.cpp +++ b/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_MagnetTo.cpp @@ -5,6 +5,7 @@ #include "GameFramework/Character.h" #include "Kismet/KismetMathLibrary.h" +#include "Components/SkeletalMeshComponent.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(ANS_MagnetTo) @@ -15,8 +16,8 @@ void UANS_MagnetTo::NotifyBegin(USkeletalMeshComponent* MeshComp, UAnimSequenceB // Speed = Distance / TotalDuration / 60; BaseCharacter = Cast(MeshComp->GetOwner()); - FTimerHandle TimerHandle; - MeshComp->GetWorld()->GetTimerManager().SetTimer(TimerHandle, this, &UANS_MagnetTo::TimerTick, 0.0f, true, -1); + // FTimerHandle TimerHandle; + // MeshComp->GetWorld()->GetTimerManager().SetTimer(TimerHandle, this, &UANS_MagnetTo::TimerTick, 0.0f, true, -1); // GetWorld()->GetTimerManager().SetTimer(TimerHandle, this, &ABaseDestructibleActor::FinalDestruct, TimeToDisappear); } @@ -37,9 +38,3 @@ void UANS_MagnetTo::NotifyEnd(USkeletalMeshComponent* MeshComp, UAnimSequenceBas { Super::NotifyEnd(MeshComp, Animation, EventReference); } - -void UANS_MagnetTo::TimerTick() -{ - float test = 0.0f; -} - diff --git a/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_UHL_Base.cpp b/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_UHL_Base.cpp index 4fec787..3a510ef 100644 --- a/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_UHL_Base.cpp +++ b/Source/UnrealHelperLibrary/Private/Animation/Notifies/ANS_UHL_Base.cpp @@ -2,6 +2,10 @@ #include "Animation/Notifies/ANS_UHL_Base.h" +#include "Animation/AnimInstance.h" +#include "Animation/AnimMontage.h" +#include "Engine/World.h" +#include "Components/SkeletalMeshComponent.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(ANS_UHL_Base) diff --git a/Source/UnrealHelperLibrary/Private/Animation/Notifies/AN_UHL_Base.cpp b/Source/UnrealHelperLibrary/Private/Animation/Notifies/AN_UHL_Base.cpp index 00e534c..f1f6b95 100644 --- a/Source/UnrealHelperLibrary/Private/Animation/Notifies/AN_UHL_Base.cpp +++ b/Source/UnrealHelperLibrary/Private/Animation/Notifies/AN_UHL_Base.cpp @@ -2,6 +2,7 @@ #include "Animation/Notifies/AN_UHL_Base.h" +#include "Components/SkeletalMeshComponent.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(AN_UHL_Base) diff --git a/Source/UnrealHelperLibrary/Private/Characters/UHLBaseCharacterWithASC.cpp b/Source/UnrealHelperLibrary/Private/Characters/UHLBaseCharacterWithASC.cpp index c0745d4..1bed30e 100644 --- a/Source/UnrealHelperLibrary/Private/Characters/UHLBaseCharacterWithASC.cpp +++ b/Source/UnrealHelperLibrary/Private/Characters/UHLBaseCharacterWithASC.cpp @@ -3,6 +3,7 @@ #include "Characters/UHLBaseCharacterWithASC.h" +#include "GameFramework/Controller.h" #include "AbilitySystem/UHLAbilitySystemComponent.h" #include "AbilitySystem/AttributeSets/UHLBaseCharacterAttributeSet.h" diff --git a/Source/UnrealHelperLibrary/Private/Core/UHLPlayerController.cpp b/Source/UnrealHelperLibrary/Private/Core/UHLPlayerController.cpp index 314c4ed..38a69e0 100644 --- a/Source/UnrealHelperLibrary/Private/Core/UHLPlayerController.cpp +++ b/Source/UnrealHelperLibrary/Private/Core/UHLPlayerController.cpp @@ -4,6 +4,8 @@ #include "Core/UHLPlayerController.h" #include "Kismet/GameplayStatics.h" +#include "Engine/World.h" +#include "Engine/GameInstance.h" #include "Subsystems/DebugSubsystem/UHLDebugSubsystem.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(UHLPlayerController) diff --git a/Source/UnrealHelperLibrary/Private/Input/UHLInputConfig.cpp b/Source/UnrealHelperLibrary/Private/Input/UHLInputConfig.cpp index e02613a..a6dcc35 100644 --- a/Source/UnrealHelperLibrary/Private/Input/UHLInputConfig.cpp +++ b/Source/UnrealHelperLibrary/Private/Input/UHLInputConfig.cpp @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (c) 2024 Pavel Penkov #include "Input/UHLInputConfig.h" // #include "LyraLogChannels.h" @@ -8,9 +8,7 @@ #include UE_INLINE_GENERATED_CPP_BY_NAME(UHLInputConfig) -UUHLInputConfig::UUHLInputConfig(const FObjectInitializer& ObjectInitializer) -{ -} +UUHLInputConfig::UUHLInputConfig(const FObjectInitializer& ObjectInitializer) {} // const UInputAction* UGCInputConfig::FindNativeInputActionForTag(const FGameplayTag& InputTag, bool bLogNotFound) const // { diff --git a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/AA_WaitDebugCategoryChange.cpp b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/AA_WaitDebugCategoryChange.cpp index e35fd91..513b60b 100644 --- a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/AA_WaitDebugCategoryChange.cpp +++ b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/AA_WaitDebugCategoryChange.cpp @@ -3,6 +3,10 @@ #include "Subsystems/DebugSubsystem/AA_WaitDebugCategoryChange.h" +#include "UnrealEngine.h" +#include "Engine/Engine.h" +#include "Engine/World.h" +#include "Engine/GameInstance.h" #include "Kismet/GameplayStatics.h" #include "Subsystems/DebugSubsystem/UHLDebugSubsystem.h" diff --git a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_AbilitySystem_Abilities.cpp b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_AbilitySystem_Abilities.cpp index 6bc6a58..3d80041 100644 --- a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_AbilitySystem_Abilities.cpp +++ b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_AbilitySystem_Abilities.cpp @@ -3,6 +3,7 @@ #include "Subsystems/DebugSubsystem/DebugCategories/DCC_AbilitySystem_Abilities.h" +#include "Engine/World.h" #include "Kismet/KismetSystemLibrary.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(DCC_AbilitySystem_Abilities) diff --git a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_AbilitySystem_Attributes.cpp b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_AbilitySystem_Attributes.cpp index a27e8d6..7334248 100644 --- a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_AbilitySystem_Attributes.cpp +++ b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_AbilitySystem_Attributes.cpp @@ -3,6 +3,7 @@ #include "Subsystems/DebugSubsystem/DebugCategories/DCC_AbilitySystem_Attributes.h" +#include "Engine/World.h" #include "Kismet/KismetSystemLibrary.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(DCC_AbilitySystem_Attributes) diff --git a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_AbilitySystem_Effects.cpp b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_AbilitySystem_Effects.cpp index 065b73a..2aaf050 100644 --- a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_AbilitySystem_Effects.cpp +++ b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_AbilitySystem_Effects.cpp @@ -3,6 +3,7 @@ #include "Subsystems/DebugSubsystem/DebugCategories/DCC_AbilitySystem_Effects.h" +#include "Engine/World.h" #include "Kismet/KismetSystemLibrary.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(DCC_AbilitySystem_Effects) diff --git a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_Collisions.cpp b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_Collisions.cpp index 15e1c8d..e568b08 100644 --- a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_Collisions.cpp +++ b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_Collisions.cpp @@ -3,6 +3,7 @@ #include "Subsystems/DebugSubsystem/DebugCategories/DCC_Collisions.h" +#include "Engine/World.h" #include "Kismet/KismetSystemLibrary.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(DCC_Collisions) diff --git a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_InputSystem_EnhancedInput.cpp b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_InputSystem_EnhancedInput.cpp index 8360b4b..e43daeb 100644 --- a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_InputSystem_EnhancedInput.cpp +++ b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategories/DCC_InputSystem_EnhancedInput.cpp @@ -3,6 +3,7 @@ #include "Subsystems/DebugSubsystem/DebugCategories/DCC_InputSystem_EnhancedInput.h" +#include "Engine/World.h" #include "Kismet/KismetSystemLibrary.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(DCC_InputSystem_EnhancedInput) diff --git a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategoryButtonWidget.cpp b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategoryButtonWidget.cpp index 0e76fbf..454f957 100644 --- a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategoryButtonWidget.cpp +++ b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/DebugCategoryButtonWidget.cpp @@ -3,6 +3,7 @@ #include "Subsystems/DebugSubsystem/DebugCategoryButtonWidget.h" +#include "Engine/GameInstance.h" #include "Blueprint/WidgetTree.h" #include "Components/Button.h" #include "Components/ButtonSlot.h" diff --git a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/UHLDebugSubsystem.cpp b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/UHLDebugSubsystem.cpp index 6c11e8b..df8864b 100644 --- a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/UHLDebugSubsystem.cpp +++ b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/UHLDebugSubsystem.cpp @@ -3,6 +3,7 @@ #include "Subsystems/DebugSubsystem/UHLDebugSubsystem.h" +#include "GameFramework/Pawn.h" #include "AbilitySystemInterface.h" #include "AbilitySystem/UHLAbilitySystemComponent.h" #include "Blueprint/UserWidget.h" diff --git a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/UI/UHLDebugCategoriesListWidget.cpp b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/UI/UHLDebugCategoriesListWidget.cpp index ad5f981..e87e3cb 100644 --- a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/UI/UHLDebugCategoriesListWidget.cpp +++ b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/UI/UHLDebugCategoriesListWidget.cpp @@ -3,6 +3,7 @@ #include "Subsystems/DebugSubsystem/UI/UHLDebugCategoriesListWidget.h" +#include "Engine/GameInstance.h" #include "Blueprint/WidgetTree.h" #include "Components/Button.h" #include "Components/ButtonSlot.h" diff --git a/Source/UnrealHelperLibrary/Private/UnrealHelperLibrary.cpp b/Source/UnrealHelperLibrary/Private/UnrealHelperLibrary.cpp index e3f0673..abebec3 100644 --- a/Source/UnrealHelperLibrary/Private/UnrealHelperLibrary.cpp +++ b/Source/UnrealHelperLibrary/Private/UnrealHelperLibrary.cpp @@ -1,7 +1,8 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (c) 2024 Pavel Penkov #include "UnrealHelperLibrary.h" +#include "Misc/Paths.h" #include "GameplayTagsManager.h" #define LOCTEXT_NAMESPACE "FUnrealHelperLibraryModule" @@ -11,80 +12,79 @@ DEFINE_LOG_CATEGORY(LogUHLAbilitySystem); void FUnrealHelperLibraryModule::StartupModule() { - UGameplayTagsManager& TagsManager = UGameplayTagsManager::Get(); + UGameplayTagsManager& TagsManager = UGameplayTagsManager::Get(); // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module - TagsManager.AddTagIniSearchPath(FPaths::ProjectPluginsDir() / TEXT("UnrealHelperLibrary/Config/Tags")); - - // TArray> OutTagArray; - // TArray OutPaths; - // TagsManager.GetTagSourceSearchPaths(OutPaths); - // TagsManager.GetAllTagsFromSource(FApp::GetProjectName(), OutTagArray); - // // GameplayTagsManager.FindTagsWithSource() - // - // // TODO find MainModule name - // FString Test1 = FApp::GetName(); - // FString Test2 = FApp::GetProjectName(); - // FString Test3 = FApp::GetInstanceName(); - // FString Test6 = FModuleManager::Get().GetGameBinariesDirectory(); - // - // // TArray OutModuleStatuses; - // // FModuleManager::Get().QueryModules(OutModuleStatuses); - // - // // FModuleStatus* MyGameModule = OutModuleStatuses.FindByPredicate([](const FModuleStatus& ModuleStatusStatus) { - // // return ModuleStatusStatus.bIsGameModule && ModuleStatusStatus.bIsLoaded; - // // }); - // - // // Ask the module manager for a list of currently-loaded gameplay modules - // UGameplayTagsManager::Get().OnLastChanceToAddNativeTags().AddLambda([this]() - // { - // UGameplayTagsManager& TagsManager2 = UGameplayTagsManager::Get(); - // - // // StaticImpl.RootTag = UGameplayTagsManager::Get().AddNativeGameplayTag(TagT::GetRootTagStr()); - // TArray GameModulesNames; - // TArray ModuleStatuses; - // FModuleManager::Get().QueryModules(ModuleStatuses); - // - // for (FModuleStatus& ModuleStatus : ModuleStatuses) - // { - // // We only care about game modules that are currently loaded - // if (ModuleStatus.bIsLoaded && ModuleStatus.bIsGameModule) - // { - // GameModulesNames.Add(MoveTemp(ModuleStatus.Name)); - // } - // } - // - // for (const FString& GameModulesName : GameModulesNames) - // { - // // GameplayTagsManager.FindTagsWithSource(FString("Bogatyr"), NativeTags); - // TArray NativeTags; - // TagsManager2.FindTagsWithSource(GameModulesName, NativeTags); - // - // for (FGameplayTag& NativeTag : NativeTags) - // { - // FName NativeTagNam = NativeTag.GetTagName(); - // // FNativeGameplayTag* Test = new FNativeGameplayTag(FName("UnrealHelperLibrary"), FName("UnrealHelperLibrary"), NativeTagNam, "", ENativeGameplayTagToken::PRIVATE_USE_MACRO_INSTEAD); - // // TagsManager2.AddNativeGameplayTag(Test); - // TagsManager2.AddNativeGameplayTag(NativeTagNam, ""); - // } - // } - // FName TestTag = "Test123.Test322.Test123"; - // TagsManager2.AddNativeGameplayTag(TestTag, ""); - // // UGameplayTagsManager::Get().DoneAddingNativeTags(); - // }); - // - // TagsManager.ConstructGameplayTagTree(); - // TagsManager.LoadGameplayTagTables(); + TagsManager.AddTagIniSearchPath(FPaths::ProjectPluginsDir() / TEXT("UnrealHelperLibrary/Config/Tags")); + // TArray> OutTagArray; + // TArray OutPaths; + // TagsManager.GetTagSourceSearchPaths(OutPaths); + // TagsManager.GetAllTagsFromSource(FApp::GetProjectName(), OutTagArray); + // // GameplayTagsManager.FindTagsWithSource() + // + // // TODO find MainModule name + // FString Test1 = FApp::GetName(); + // FString Test2 = FApp::GetProjectName(); + // FString Test3 = FApp::GetInstanceName(); + // FString Test6 = FModuleManager::Get().GetGameBinariesDirectory(); + // + // // TArray OutModuleStatuses; + // // FModuleManager::Get().QueryModules(OutModuleStatuses); + // + // // FModuleStatus* MyGameModule = OutModuleStatuses.FindByPredicate([](const FModuleStatus& ModuleStatusStatus) { + // // return ModuleStatusStatus.bIsGameModule && ModuleStatusStatus.bIsLoaded; + // // }); + // + // // Ask the module manager for a list of currently-loaded gameplay modules + // UGameplayTagsManager::Get().OnLastChanceToAddNativeTags().AddLambda([this]() + // { + // UGameplayTagsManager& TagsManager2 = UGameplayTagsManager::Get(); + // + // // StaticImpl.RootTag = UGameplayTagsManager::Get().AddNativeGameplayTag(TagT::GetRootTagStr()); + // TArray GameModulesNames; + // TArray ModuleStatuses; + // FModuleManager::Get().QueryModules(ModuleStatuses); + // + // for (FModuleStatus& ModuleStatus : ModuleStatuses) + // { + // // We only care about game modules that are currently loaded + // if (ModuleStatus.bIsLoaded && ModuleStatus.bIsGameModule) + // { + // GameModulesNames.Add(MoveTemp(ModuleStatus.Name)); + // } + // } + // + // for (const FString& GameModulesName : GameModulesNames) + // { + // // GameplayTagsManager.FindTagsWithSource(FString("Bogatyr"), NativeTags); + // TArray NativeTags; + // TagsManager2.FindTagsWithSource(GameModulesName, NativeTags); + // + // for (FGameplayTag& NativeTag : NativeTags) + // { + // FName NativeTagNam = NativeTag.GetTagName(); + // // FNativeGameplayTag* Test = new FNativeGameplayTag(FName("UnrealHelperLibrary"), FName("UnrealHelperLibrary"), NativeTagNam, "", ENativeGameplayTagToken::PRIVATE_USE_MACRO_INSTEAD); + // // TagsManager2.AddNativeGameplayTag(Test); + // TagsManager2.AddNativeGameplayTag(NativeTagNam, ""); + // } + // } + // FName TestTag = "Test123.Test322.Test123"; + // TagsManager2.AddNativeGameplayTag(TestTag, ""); + // // UGameplayTagsManager::Get().DoneAddingNativeTags(); + // }); + // + // TagsManager.ConstructGameplayTagTree(); + // TagsManager.LoadGameplayTagTables(); - // for (const FGameplayTag& Tag : NativeTags) - // { - // if (IsTagOnlyAvailableFromExcludedSources(Manager, Tag, ExcludedPlugins)) - // { - // FAssetIdentifier TagId = FAssetIdentifier(FGameplayTag::StaticStruct(), Tag.GetTagName()); - // AssetIdsInPlugin.Add(TagId); - // } - // } - // } + // for (const FGameplayTag& Tag : NativeTags) + // { + // if (IsTagOnlyAvailableFromExcludedSources(Manager, Tag, ExcludedPlugins)) + // { + // FAssetIdentifier TagId = FAssetIdentifier(FGameplayTag::StaticStruct(), Tag.GetTagName()); + // AssetIdsInPlugin.Add(TagId); + // } + // } + // } } void FUnrealHelperLibraryModule::ShutdownModule() diff --git a/Source/UnrealHelperLibrary/Private/Utils/UHLTraceUtilsBPL.cpp b/Source/UnrealHelperLibrary/Private/Utils/UHLTraceUtilsBPL.cpp index 7145f0e..3950dae 100644 --- a/Source/UnrealHelperLibrary/Private/Utils/UHLTraceUtilsBPL.cpp +++ b/Source/UnrealHelperLibrary/Private/Utils/UHLTraceUtilsBPL.cpp @@ -2,8 +2,10 @@ #include "Utils/UHLTraceUtilsBPL.h" - -// #include "UnrealHelperLibraryBPLibrary.h" +#include "Engine/World.h" +#include "Engine/EngineTypes.h" +#include "Engine/HitResult.h" +#include "DrawDebugHelpers.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(UHLTraceUtilsBPL) diff --git a/Source/UnrealHelperLibrary/Private/Utils/UnrealHelperLibraryBPL.cpp b/Source/UnrealHelperLibrary/Private/Utils/UnrealHelperLibraryBPL.cpp index b23fffa..c4137fd 100644 --- a/Source/UnrealHelperLibrary/Private/Utils/UnrealHelperLibraryBPL.cpp +++ b/Source/UnrealHelperLibrary/Private/Utils/UnrealHelperLibraryBPL.cpp @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (c) 2024 Pavel Penkov #include "Utils/UnrealHelperLibraryBPL.h" @@ -23,6 +23,11 @@ #include "Kismet/GameplayStatics.h" #include "Kismet/KismetMathLibrary.h" #include "Kismet/KismetSystemLibrary.h" +#include "Misc/ConfigCacheIni.h" +#include "Animation/AnimMontage.h" +#include "DrawDebugHelpers.h" +#include "Engine/World.h" +#include "Engine/GameInstance.h" #include "Subsystems/DebugSubsystem/UHLDebugSubsystem.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(UnrealHelperLibraryBPL) @@ -32,241 +37,230 @@ static const int32 DEPTH_PRIORITY = -1; FString UUnrealHelperLibraryBPL::GetProjectVersion() { FString ProjectVersion; - GConfig->GetString( - TEXT("/Script/EngineSettings.GeneralProjectSettings"), - TEXT("ProjectVersion"), - ProjectVersion, - GGameIni - ); + GConfig->GetString(TEXT("/Script/EngineSettings.GeneralProjectSettings"), TEXT("ProjectVersion"), ProjectVersion, GGameIni); return ProjectVersion; } -void UUnrealHelperLibraryBPL::DebugPrintStrings(const FString& A, const FString& B, const FString& C, - const FString& D, const FString& E, const FString& F, const FString& G, const FString& H, const FString& I, - const FString& J, float Duration, const FName Key, const bool bEnabled) +void UUnrealHelperLibraryBPL::DebugPrintStrings(const FString& A, const FString& B, const FString& C, const FString& D, const FString& E, const FString& F, const FString& G, const FString& H, + const FString& I, const FString& J, float Duration, const FName Key, const bool bEnabled) { FString StringResult; - StringResult.Empty(A.Len() + B.Len() + C.Len() + D.Len() + E.Len() + 1); // adding one for the string terminator + StringResult.Empty(A.Len() + B.Len() + C.Len() + D.Len() + E.Len() + 1); // adding one for the string terminator StringResult += A; StringResult += B; StringResult += C; StringResult += D; StringResult += E; - if (!bEnabled) return; + if (!bEnabled) + return; - UKismetSystemLibrary::PrintString( - nullptr, StringResult,true, true, - FLinearColor(0, 0.66, 1), Duration, Key - ); + UKismetSystemLibrary::PrintString(nullptr, StringResult, true, true, FLinearColor(0, 0.66, 1), Duration, Key); } void UUnrealHelperLibraryBPL::DebugPrintString(const UObject* WorldContextObject, const FString& A, float Duration, const FName Key, const bool bEnabled) { FString StringResult; - StringResult.Empty(A.Len() + 1); // adding one for the string terminator + StringResult.Empty(A.Len() + 1); // adding one for the string terminator - if (!bEnabled) return; + if (!bEnabled) + return; - UKismetSystemLibrary::PrintString( - WorldContextObject, StringResult,true, true, - FLinearColor(0, 0.66, 1), Duration, Key - ); + UKismetSystemLibrary::PrintString(WorldContextObject, StringResult, true, true, FLinearColor(0, 0.66, 1), Duration, Key); } -void UUnrealHelperLibraryBPL::DrawDebugBar() -{ -} +void UUnrealHelperLibraryBPL::DrawDebugBar() {} float UUnrealHelperLibraryBPL::GetAnimMontageSectionLengthByName(UAnimMontage* AnimMontage, FName SectionName) { float Result = -1; - if (!IsValid(AnimMontage)) return Result; + if (!IsValid(AnimMontage)) + return Result; int32 SectionIdx = SectionName.IsNone() ? 0 : AnimMontage->GetSectionIndex(SectionName); - if (SectionIdx == INDEX_NONE) return Result; + if (SectionIdx == INDEX_NONE) + return Result; DebugPrintString(AnimMontage->GetWorld(), FString::Printf(TEXT("Section %s %i"), *SectionName.ToString(), SectionIdx), Result); Result = AnimMontage->GetSectionLength(SectionIdx); return Result; } -FGameplayEffectSpec UUnrealHelperLibraryBPL::CreateGenericGASGameplayEffectSpec(TSubclassOf GameplayEffectClass, AActor* HitInstigator, AActor* InEffectCauser, - const FHitResult& HitResult, const UObject* SourceObject) +FGameplayEffectSpec UUnrealHelperLibraryBPL::CreateGenericGASGameplayEffectSpec( + TSubclassOf GameplayEffectClass, AActor* HitInstigator, AActor* InEffectCauser, const FHitResult& HitResult, const UObject* SourceObject) { - const UGameplayEffect* GameplayEffect = GameplayEffectClass->GetDefaultObject(); - FGameplayEffectContext* GameplayEffectContext = new FGameplayEffectContext(HitInstigator, InEffectCauser); - FGameplayEffectContextHandle GameplayEffectContextHandle(GameplayEffectContext); - GameplayEffectContextHandle.AddHitResult(HitResult); - GameplayEffectContextHandle.AddSourceObject(SourceObject); - FGameplayEffectSpec GameplayEffectSpec(GameplayEffect, GameplayEffectContextHandle); - return GameplayEffectSpec; + const UGameplayEffect* GameplayEffect = GameplayEffectClass->GetDefaultObject(); + FGameplayEffectContext* GameplayEffectContext = new FGameplayEffectContext(HitInstigator, InEffectCauser); + FGameplayEffectContextHandle GameplayEffectContextHandle(GameplayEffectContext); + GameplayEffectContextHandle.AddHitResult(HitResult); + GameplayEffectContextHandle.AddSourceObject(SourceObject); + FGameplayEffectSpec GameplayEffectSpec(GameplayEffect, GameplayEffectContextHandle); + return GameplayEffectSpec; } void UUnrealHelperLibraryBPL::UpdateStateGameplayTags(UAbilitySystemComponent* ASC, bool bCondition, FGameplayTag PositiveConditionTag, FGameplayTag NegativeConditionTag) { - if (!ASC) return; - - if (bCondition) - { - if (!ASC->HasMatchingGameplayTag(PositiveConditionTag)) - { - ASC->AddLooseGameplayTag(PositiveConditionTag); - } - if (NegativeConditionTag != FGameplayTag::EmptyTag) - { - ASC->RemoveLooseGameplayTag(NegativeConditionTag, 999999); - } - } - else - { - if (NegativeConditionTag == FGameplayTag::EmptyTag) - { - ASC->RemoveLooseGameplayTag(PositiveConditionTag, 999999); - } - else - { - if (!ASC->HasMatchingGameplayTag(NegativeConditionTag)) - { - ASC->AddLooseGameplayTag(NegativeConditionTag); - } - ASC->RemoveLooseGameplayTag(PositiveConditionTag, 999999); - } - } + if (!ASC) + return; + + if (bCondition) + { + if (!ASC->HasMatchingGameplayTag(PositiveConditionTag)) + { + ASC->AddLooseGameplayTag(PositiveConditionTag); + } + if (NegativeConditionTag != FGameplayTag::EmptyTag) + { + ASC->RemoveLooseGameplayTag(NegativeConditionTag, 999999); + } + } + else + { + if (NegativeConditionTag == FGameplayTag::EmptyTag) + { + ASC->RemoveLooseGameplayTag(PositiveConditionTag, 999999); + } + else + { + if (!ASC->HasMatchingGameplayTag(NegativeConditionTag)) + { + ASC->AddLooseGameplayTag(NegativeConditionTag); + } + ASC->RemoveLooseGameplayTag(PositiveConditionTag, 999999); + } + } } bool UUnrealHelperLibraryBPL::TryActivateAbilityWithTag(UAbilitySystemComponent* ASC, FGameplayTag GameplayTag, bool bAllowRemoteActivation) { - if (!IsValid(ASC)) return false; - return ASC->TryActivateAbilitiesByTag(FGameplayTagContainer(GameplayTag), bAllowRemoteActivation); + if (!IsValid(ASC)) + return false; + return ASC->TryActivateAbilitiesByTag(FGameplayTagContainer(GameplayTag), bAllowRemoteActivation); } bool UUnrealHelperLibraryBPL::TryCancelAbilityWithTag(UAbilitySystemComponent* ASC, FGameplayTag GameplayTag) { - if (!IsValid(ASC)) return false; + if (!IsValid(ASC)) + return false; - bool bResult = false; - TArray AbilitiesToCancel; - ASC->GetActivatableGameplayAbilitySpecsByAllMatchingTags(FGameplayTagContainer(GameplayTag), AbilitiesToCancel, false); + bool bResult = false; + TArray AbilitiesToCancel; + ASC->GetActivatableGameplayAbilitySpecsByAllMatchingTags(FGameplayTagContainer(GameplayTag), AbilitiesToCancel, false); - for (FGameplayAbilitySpec* AbilitySpec : AbilitiesToCancel) - { - TArray AbilityInstances = AbilitySpec->GetAbilityInstances(); - for (UGameplayAbility* Ability : AbilityInstances) - { - if (Ability->IsActive()) - { - Ability->K2_CancelAbility(); - bResult = true; - } - } - } - return bResult; + for (FGameplayAbilitySpec* AbilitySpec : AbilitiesToCancel) + { + TArray AbilityInstances = AbilitySpec->GetAbilityInstances(); + for (UGameplayAbility* Ability : AbilityInstances) + { + if (Ability->IsActive()) + { + Ability->K2_CancelAbility(); + bResult = true; + } + } + } + return bResult; } TArray UUnrealHelperLibraryBPL::TryCancelAbilitiesWithTags(UAbilitySystemComponent* ASC, TArray GameplayTags) { - if (!IsValid(ASC)) return {}; + if (!IsValid(ASC)) + return {}; - TArray Result; - for (auto GameplayTag : GameplayTags) - { - Result.Add(TryCancelAbilityWithTag(ASC, GameplayTag)); - } - return Result; + TArray Result; + for (auto GameplayTag : GameplayTags) + { + Result.Add(TryCancelAbilityWithTag(ASC, GameplayTag)); + } + return Result; } -int32 UUnrealHelperLibraryBPL::FireGameplayEvent(UAbilitySystemComponent* ASC, FGameplayTag EventTag, const FGameplayEventData& Payload) -{ - return ASC->HandleGameplayEvent(EventTag, &Payload); -} +int32 UUnrealHelperLibraryBPL::FireGameplayEvent(UAbilitySystemComponent* ASC, FGameplayTag EventTag, const FGameplayEventData& Payload) { return ASC->HandleGameplayEvent(EventTag, &Payload); } FGameplayTag UUnrealHelperLibraryBPL::FindTagByString(const FString& TagString, bool bMatchPartialString) { - const UGameplayTagsManager& Manager = UGameplayTagsManager::Get(); - FGameplayTag Tag = Manager.RequestGameplayTag(FName(*TagString), false); + const UGameplayTagsManager& Manager = UGameplayTagsManager::Get(); + FGameplayTag Tag = Manager.RequestGameplayTag(FName(*TagString), false); - if (!Tag.IsValid() && bMatchPartialString) - { - FGameplayTagContainer AllTags; - Manager.RequestAllGameplayTags(AllTags, true); + if (!Tag.IsValid() && bMatchPartialString) + { + FGameplayTagContainer AllTags; + Manager.RequestAllGameplayTags(AllTags, true); - for (const FGameplayTag& TestTag : AllTags) - { - if (TestTag.ToString().Contains(TagString)) - { - // UE_LOG(LogUnrealHelperLibrary, Display, TEXT("Could not find exact match for tag [%s] but found partial match on tag [%s]."), *TagString, *TestTag.ToString()); - Tag = TestTag; - break; - } - } - } + for (const FGameplayTag& TestTag : AllTags) + { + if (TestTag.ToString().Contains(TagString)) + { + // UE_LOG(LogUnrealHelperLibrary, Display, TEXT("Could not find exact match for tag [%s] but found partial match on tag [%s]."), *TagString, *TestTag.ToString()); + Tag = TestTag; + break; + } + } + } - return Tag; + return Tag; } EUHLDirection UUnrealHelperLibraryBPL::GetOppositeDirection(EUHLDirection Direction_In) { switch (Direction_In) { - case EUHLDirection::Left: return EUHLDirection::Right; - case EUHLDirection::Right: return EUHLDirection::Left; - case EUHLDirection::Front: return EUHLDirection::Back; - case EUHLDirection::Back: return EUHLDirection::Front; - default: return EUHLDirection::None; + case EUHLDirection::Left: + return EUHLDirection::Right; + case EUHLDirection::Right: + return EUHLDirection::Left; + case EUHLDirection::Front: + return EUHLDirection::Back; + case EUHLDirection::Back: + return EUHLDirection::Front; + default: + return EUHLDirection::None; } } TArray UUnrealHelperLibraryBPL::GetNamesOfComponentsOnObject(UObject* OwnerObject, UClass* Class) { - TArray Result = {}; + TArray Result = {}; - UBlueprintGeneratedClass* BlueprintGeneratedClass = OwnerObject->IsA() - ? Cast(OwnerObject) - : Cast(OwnerObject->GetClass()); - if (!BlueprintGeneratedClass) return Result; + UBlueprintGeneratedClass* BlueprintGeneratedClass = + OwnerObject->IsA() ? Cast(OwnerObject) : Cast(OwnerObject->GetClass()); + if (!BlueprintGeneratedClass) + return Result; - TArray DefaultObjectSubobjects; - BlueprintGeneratedClass->GetDefaultObjectSubobjects(DefaultObjectSubobjects); + TArray DefaultObjectSubobjects; + BlueprintGeneratedClass->GetDefaultObjectSubobjects(DefaultObjectSubobjects); - // Search for ActorComponents created from C++ - for (UObject* DefaultSubObject : DefaultObjectSubobjects) - { - if (DefaultSubObject->IsA(Class)) - { - Result.Add(DefaultSubObject->GetName()); - } - } + // Search for ActorComponents created from C++ + for (UObject* DefaultSubObject : DefaultObjectSubobjects) + { + if (DefaultSubObject->IsA(Class)) + { + Result.Add(DefaultSubObject->GetName()); + } + } - // Search for ActorComponents created in Blueprint - for (USCS_Node* Node : BlueprintGeneratedClass->SimpleConstructionScript->GetAllNodes()) - { - if (Node->ComponentClass->IsChildOf(Class)) - { - Result.Add(Node->GetVariableName().ToString()); - } - } + // Search for ActorComponents created in Blueprint + for (USCS_Node* Node : BlueprintGeneratedClass->SimpleConstructionScript->GetAllNodes()) + { + if (Node->ComponentClass->IsChildOf(Class)) + { + Result.Add(Node->GetVariableName().ToString()); + } + } - return Result; + return Result; } float UUnrealHelperLibraryBPL::RelativeAngleToActor( - AActor* ActorRelativeToWhomAngleCalculated, - AActor* TargetActor, - bool bRelativeToActorBack, - const bool bDebug, - const float DebugLifetime, - const FLinearColor DebugColor -) + AActor* ActorRelativeToWhomAngleCalculated, AActor* TargetActor, bool bRelativeToActorBack, const bool bDebug, const float DebugLifetime, const FLinearColor DebugColor) { - if (!IsValid(ActorRelativeToWhomAngleCalculated) || !IsValid(TargetActor)) return FLOAT_ERROR; + if (!IsValid(ActorRelativeToWhomAngleCalculated) || !IsValid(TargetActor)) + return FLOAT_ERROR; float Multiplier = bRelativeToActorBack ? 1 : -1; float Result = UKismetAnimationLibrary::CalculateDirection( - ActorRelativeToWhomAngleCalculated->GetActorLocation() - TargetActor->GetActorLocation(), - (ActorRelativeToWhomAngleCalculated->GetActorForwardVector() * Multiplier).ToOrientationRotator() - ); + ActorRelativeToWhomAngleCalculated->GetActorLocation() - TargetActor->GetActorLocation(), (ActorRelativeToWhomAngleCalculated->GetActorForwardVector() * Multiplier).ToOrientationRotator()); if (bDebug) { @@ -285,19 +279,15 @@ float UUnrealHelperLibraryBPL::RelativeAngleToActor( float UUnrealHelperLibraryBPL::RelativeAngleToVector(AActor* ActorRelativeToWhomAngleCalculated, FVector TargetVector) { - if (!IsValid(ActorRelativeToWhomAngleCalculated)) return FLOAT_ERROR; - return UKismetAnimationLibrary::CalculateDirection( - ActorRelativeToWhomAngleCalculated->GetActorLocation() - TargetVector, - (ActorRelativeToWhomAngleCalculated->GetActorForwardVector() * -1).ToOrientationRotator() - ); + if (!IsValid(ActorRelativeToWhomAngleCalculated)) + return FLOAT_ERROR; + return UKismetAnimationLibrary::CalculateDirection( + ActorRelativeToWhomAngleCalculated->GetActorLocation() - TargetVector, (ActorRelativeToWhomAngleCalculated->GetActorForwardVector() * -1).ToOrientationRotator()); } float UUnrealHelperLibraryBPL::RelativeAngleVectorToVector(FVector VectorRelativeToWhomAngleCalculated, FVector TargetVector) { - return UKismetAnimationLibrary::CalculateDirection( - VectorRelativeToWhomAngleCalculated - TargetVector, - (VectorRelativeToWhomAngleCalculated * -1).ToOrientationRotator() - ); + return UKismetAnimationLibrary::CalculateDirection(VectorRelativeToWhomAngleCalculated - TargetVector, (VectorRelativeToWhomAngleCalculated * -1).ToOrientationRotator()); } EUHLDirection UUnrealHelperLibraryBPL::GetHitReactDirection(const FVector& SourceActorLocation, const AActor* TargetActor) @@ -329,306 +319,304 @@ EUHLDirection UUnrealHelperLibraryBPL::GetHitReactDirection(const FVector& Sourc UActorComponent* UUnrealHelperLibraryBPL::GetActorComponentByName(AActor* Actor, FString Name) { - if (!IsValid(Actor)) return nullptr; + if (!IsValid(Actor)) + return nullptr; - for (UActorComponent* Component : Actor->GetComponents()) - { - if (Component->GetName() == Name) - { - return Component; - } - } - return nullptr; + for (UActorComponent* Component : Actor->GetComponents()) + { + if (Component->GetName() == Name) + { + return Component; + } + } + return nullptr; } USceneComponent* UUnrealHelperLibraryBPL::GetSceneComponentByName(AActor* Actor, FString Name) { - if (!IsValid(Actor)) return nullptr; + if (!IsValid(Actor)) + return nullptr; - return Cast(GetActorComponentByName(Actor, Name)); + return Cast(GetActorComponentByName(Actor, Name)); } FVector UUnrealHelperLibraryBPL::GetRandomPointInBox(const USceneComponent* Component, bool bOnGround, bool bDrawDebug, float DebugDrawTime) { - FVector Origin; - FVector BoxExtent; - float SphereRadius; + FVector Origin; + FVector BoxExtent; + float SphereRadius; - UKismetSystemLibrary::GetComponentBounds(Component, Origin, BoxExtent, SphereRadius); - FVector RandomPoint = UKismetMathLibrary::RandomPointInBoundingBox(Origin, BoxExtent); + UKismetSystemLibrary::GetComponentBounds(Component, Origin, BoxExtent, SphereRadius); + FVector RandomPoint = UKismetMathLibrary::RandomPointInBoundingBox(Origin, BoxExtent); - if (bOnGround) - { - RandomPoint.Z = GetHighestPointInBox(Component).Z; - FHitResult OutHit; - UKismetSystemLibrary::LineTraceSingle(Component->GetWorld(), RandomPoint, FVector(0, 0, -999999), - TraceTypeQuery1, false, TArray(), - bDrawDebug ? EDrawDebugTrace::Type::ForDuration : EDrawDebugTrace::Type::None, OutHit, - true, FLinearColor::Red, FLinearColor::Green, DebugDrawTime - ); - if (OutHit.IsValidBlockingHit()) - { - RandomPoint = OutHit.Location; - } - } + if (bOnGround) + { + RandomPoint.Z = GetHighestPointInBox(Component).Z; + FHitResult OutHit; + UKismetSystemLibrary::LineTraceSingle(Component->GetWorld(), RandomPoint, FVector(0, 0, -999999), TraceTypeQuery1, false, TArray(), + bDrawDebug ? EDrawDebugTrace::Type::ForDuration : EDrawDebugTrace::Type::None, OutHit, true, FLinearColor::Red, FLinearColor::Green, DebugDrawTime); + if (OutHit.IsValidBlockingHit()) + { + RandomPoint = OutHit.Location; + } + } - return RandomPoint; + return RandomPoint; } FVector UUnrealHelperLibraryBPL::GetHighestPointInBox(const USceneComponent* Component) { - if (!IsValid(Component)) return VECTOR_ERROR; - - FVector Origin; - FVector BoxExtent; - float SphereRadius = 0.0f; - UKismetSystemLibrary::GetComponentBounds(Component, Origin, BoxExtent, SphereRadius); - - const FVector BoxMin = Origin - BoxExtent; - const FVector BoxMax = Origin + BoxExtent; - return FBox(BoxMin, BoxMax).Max; -} - -void UUnrealHelperLibraryBPL::GetPointAtRelativeAngle(FVector& Point, FRotator& PointRotation, const AActor* ActorIn, const float Angle, const float Distance, const bool bDebug, const float DebugLifetime, const FLinearColor DebugColor) -{ - if (!IsValid(ActorIn)) - { - Point = VECTOR_ERROR; - return; - } - FVector Result = ActorIn->GetActorLocation() + ActorIn->GetActorForwardVector().RotateAngleAxis(Angle, FVector(0, 0, 1)) * Distance; - if (bDebug) - { - DrawDebugString(ActorIn->GetWorld(), Result, FString::Printf(TEXT("Angle %.2f°\nDistance %.2f"), Angle, Distance), 0, DebugColor.ToFColor(true), DebugLifetime, true, 1.0f); - DrawDebugSphere(ActorIn->GetWorld(), Result, 10.0f, 12, DebugColor.ToFColor(true), true, DebugLifetime, DEPTH_PRIORITY, 1); - FVector ArrowLineEnd = ActorIn->GetActorLocation() + ActorIn->GetActorForwardVector().RotateAngleAxis(Angle, FVector(0, 0, 1)) * (Distance - 10); - DrawDebugDirectionalArrow(ActorIn->GetWorld(), ActorIn->GetActorLocation(), ArrowLineEnd, RELATIVE_POINT_ARROW_SIZE, FColor::White, true, DebugLifetime, DEPTH_PRIORITY, 2); - } + if (!IsValid(Component)) + return VECTOR_ERROR; + + FVector Origin; + FVector BoxExtent; + float SphereRadius = 0.0f; + UKismetSystemLibrary::GetComponentBounds(Component, Origin, BoxExtent, SphereRadius); + + const FVector BoxMin = Origin - BoxExtent; + const FVector BoxMax = Origin + BoxExtent; + return FBox(BoxMin, BoxMax).Max; +} + +void UUnrealHelperLibraryBPL::GetPointAtRelativeAngle( + FVector& Point, FRotator& PointRotation, const AActor* ActorIn, const float Angle, const float Distance, const bool bDebug, const float DebugLifetime, const FLinearColor DebugColor) +{ + if (!IsValid(ActorIn)) + { + Point = VECTOR_ERROR; + return; + } + FVector Result = ActorIn->GetActorLocation() + ActorIn->GetActorForwardVector().RotateAngleAxis(Angle, FVector(0, 0, 1)) * Distance; + if (bDebug) + { + DrawDebugString(ActorIn->GetWorld(), Result, FString::Printf(TEXT("Angle %.2f°\nDistance %.2f"), Angle, Distance), 0, DebugColor.ToFColor(true), DebugLifetime, true, 1.0f); + DrawDebugSphere(ActorIn->GetWorld(), Result, 10.0f, 12, DebugColor.ToFColor(true), true, DebugLifetime, DEPTH_PRIORITY, 1); + FVector ArrowLineEnd = ActorIn->GetActorLocation() + ActorIn->GetActorForwardVector().RotateAngleAxis(Angle, FVector(0, 0, 1)) * (Distance - 10); + DrawDebugDirectionalArrow(ActorIn->GetWorld(), ActorIn->GetActorLocation(), ArrowLineEnd, RELATIVE_POINT_ARROW_SIZE, FColor::White, true, DebugLifetime, DEPTH_PRIORITY, 2); + } Point = Result; PointRotation = (Point - ActorIn->GetActorLocation()).ToOrientationRotator(); } -void UUnrealHelperLibraryBPL::GetPointAtRelativeDirection(FVector& Point, FRotator& PointRotation, const AActor* ActorIn, const EUHLDirection Direction, const float Distance, const bool bDebug, const float DebugLifetime, const FLinearColor DebugColor, const FText DebugText) +void UUnrealHelperLibraryBPL::GetPointAtRelativeDirection(FVector& Point, FRotator& PointRotation, const AActor* ActorIn, const EUHLDirection Direction, const float Distance, const bool bDebug, + const float DebugLifetime, const FLinearColor DebugColor, const FText DebugText) { - if (!IsValid(ActorIn)) return; + if (!IsValid(ActorIn)) + return; - float Angle = DirectionToAngle(Direction); - GetPointAtRelativeAngle(Point, PointRotation, ActorIn, Angle, Distance); + float Angle = DirectionToAngle(Direction); + GetPointAtRelativeAngle(Point, PointRotation, ActorIn, Angle, Distance); - if (bDebug) - { - const UEnum* EnumPtr = FindObject(nullptr, TEXT("EUHLDirection"), true); - if (EnumPtr) - { - DrawDebugString(ActorIn->GetWorld(), Point, FString::Printf(TEXT("%s \nDirection %s\nDistance %.2f"), *DebugText.BuildSourceString(), *EnumPtr->GetNameStringByValue((uint8)Direction), Distance), 0, DebugColor.ToFColor(true), DebugLifetime, true, 1.0f); - } - DrawDebugSphere(ActorIn->GetWorld(), Point, 10.0f, 12, DebugColor.ToFColor(true), true, DebugLifetime, DEPTH_PRIORITY, 1); - FVector ArrowLineEnd; - FRotator ArrowLineEndRotation; - GetPointAtRelativeAngle(ArrowLineEnd, ArrowLineEndRotation, ActorIn, Angle, Distance - 10); - DrawDebugDirectionalArrow(ActorIn->GetWorld(), ActorIn->GetActorLocation(), ArrowLineEnd, RELATIVE_POINT_ARROW_SIZE, FColor::White, true, DebugLifetime, DEPTH_PRIORITY, 2); - } + if (bDebug) + { + const UEnum* EnumPtr = FindObject(nullptr, TEXT("EUHLDirection"), true); + if (EnumPtr) + { + DrawDebugString(ActorIn->GetWorld(), Point, + FString::Printf(TEXT("%s \nDirection %s\nDistance %.2f"), *DebugText.BuildSourceString(), *EnumPtr->GetNameStringByValue((uint8)Direction), Distance), 0, DebugColor.ToFColor(true), + DebugLifetime, true, 1.0f); + } + DrawDebugSphere(ActorIn->GetWorld(), Point, 10.0f, 12, DebugColor.ToFColor(true), true, DebugLifetime, DEPTH_PRIORITY, 1); + FVector ArrowLineEnd; + FRotator ArrowLineEndRotation; + GetPointAtRelativeAngle(ArrowLineEnd, ArrowLineEndRotation, ActorIn, Angle, Distance - 10); + DrawDebugDirectionalArrow(ActorIn->GetWorld(), ActorIn->GetActorLocation(), ArrowLineEnd, RELATIVE_POINT_ARROW_SIZE, FColor::White, true, DebugLifetime, DEPTH_PRIORITY, 2); + } } -void UUnrealHelperLibraryBPL::GetPointAtAngleRelativeToOtherActor(FVector& Point, FRotator& PointRotation, const AActor* Actor1, const AActor* Actor2, const float Angle, const float Distance, const bool bTakeZFromActor1, const bool bDebug, const float DebugLifetime, const FLinearColor DebugColor) +void UUnrealHelperLibraryBPL::GetPointAtAngleRelativeToOtherActor(FVector& Point, FRotator& PointRotation, const AActor* Actor1, const AActor* Actor2, const float Angle, const float Distance, + const bool bTakeZFromActor1, const bool bDebug, const float DebugLifetime, const FLinearColor DebugColor) { - if (!IsValid(Actor1) || !IsValid(Actor2)) return; + if (!IsValid(Actor1) || !IsValid(Actor2)) + return; const FVector Actor1Location = Actor1->GetActorLocation(); - const FVector Actor2Location = Actor2->GetActorLocation(); - const FVector DirectionBetweenActors = (Actor2Location - Actor1Location).GetSafeNormal(); - Point = Actor1Location + (DirectionBetweenActors.RotateAngleAxis(Angle, FVector(0, 0, 1)) * Distance); - Point.Z = bTakeZFromActor1 ? Actor1Location.Z : Actor2Location.Z; + const FVector Actor2Location = Actor2->GetActorLocation(); + const FVector DirectionBetweenActors = (Actor2Location - Actor1Location).GetSafeNormal(); + Point = Actor1Location + (DirectionBetweenActors.RotateAngleAxis(Angle, FVector(0, 0, 1)) * Distance); + Point.Z = bTakeZFromActor1 ? Actor1Location.Z : Actor2Location.Z; PointRotation = (Point - Actor1Location).ToOrientationRotator(); - if (bDebug) - { - UWorld* DebugWorld = Actor1->GetWorld(); - DrawDebugString(DebugWorld, Point, FString::Printf(TEXT("Angle %.2f°\nDistance %.2f"), Angle, Distance), 0, DebugColor.ToFColor(true), DebugLifetime, true, 1.0f); - DrawDebugSphere(DebugWorld, Point, 10.0f, 12, DebugColor.ToFColor(true), true, DebugLifetime, DEPTH_PRIORITY, 1); - FVector ArrowLineEnd = Actor1Location + (DirectionBetweenActors.RotateAngleAxis(Angle, FVector(0, 0, 1)) * (Distance - 10)); - Point.Z = bTakeZFromActor1 ? Actor1Location.Z : Actor2Location.Z; - DrawDebugDirectionalArrow(DebugWorld, Actor1Location, Actor2Location, RELATIVE_POINT_ARROW_SIZE, FColor::White, true, DebugLifetime, DEPTH_PRIORITY, 1); - DrawDebugDirectionalArrow(DebugWorld, Actor1Location, ArrowLineEnd, RELATIVE_POINT_ARROW_SIZE, FColor::White, true, DebugLifetime, DEPTH_PRIORITY, 2); - } + if (bDebug) + { + UWorld* DebugWorld = Actor1->GetWorld(); + DrawDebugString(DebugWorld, Point, FString::Printf(TEXT("Angle %.2f°\nDistance %.2f"), Angle, Distance), 0, DebugColor.ToFColor(true), DebugLifetime, true, 1.0f); + DrawDebugSphere(DebugWorld, Point, 10.0f, 12, DebugColor.ToFColor(true), true, DebugLifetime, DEPTH_PRIORITY, 1); + FVector ArrowLineEnd = Actor1Location + (DirectionBetweenActors.RotateAngleAxis(Angle, FVector(0, 0, 1)) * (Distance - 10)); + Point.Z = bTakeZFromActor1 ? Actor1Location.Z : Actor2Location.Z; + DrawDebugDirectionalArrow(DebugWorld, Actor1Location, Actor2Location, RELATIVE_POINT_ARROW_SIZE, FColor::White, true, DebugLifetime, DEPTH_PRIORITY, 1); + DrawDebugDirectionalArrow(DebugWorld, Actor1Location, ArrowLineEnd, RELATIVE_POINT_ARROW_SIZE, FColor::White, true, DebugLifetime, DEPTH_PRIORITY, 2); + } } -void UUnrealHelperLibraryBPL::GetPointAtDirectionRelativeToOtherActor(FVector& Point, FRotator& PointRotation, const AActor* Actor1, const AActor* Actor2, const EUHLDirection Direction, const float Distance, const bool bTakeZFromActor1, const bool bDebug, const float DebugLifetime, const FLinearColor DebugColor) +void UUnrealHelperLibraryBPL::GetPointAtDirectionRelativeToOtherActor(FVector& Point, FRotator& PointRotation, const AActor* Actor1, const AActor* Actor2, const EUHLDirection Direction, + const float Distance, const bool bTakeZFromActor1, const bool bDebug, const float DebugLifetime, const FLinearColor DebugColor) { - if (!IsValid(Actor1) || !IsValid(Actor2)) return; + if (!IsValid(Actor1) || !IsValid(Actor2)) + return; float Angle = DirectionToAngle(Direction); GetPointAtAngleRelativeToOtherActor(Point, PointRotation, Actor1, Actor2, Angle, Distance, bTakeZFromActor1); - if (bDebug) - { - const UEnum* EnumPtr = FindObject(nullptr, TEXT("EUHLDirection"), true); - if (EnumPtr) - { - DrawDebugString(Actor1->GetWorld(), Point, FString::Printf(TEXT("Direction %s\nDistance %.2f"), *EnumPtr->GetNameStringByValue((uint8)Direction), Distance), 0, DebugColor.ToFColor(true), DebugLifetime, true, 1.0f); - } - DrawDebugSphere(Actor1->GetWorld(), Point, 10.0f, 12, DebugColor.ToFColor(true), true, DebugLifetime, DEPTH_PRIORITY, 1); - FVector ArrowLineEnd; - FRotator ArrowLineEndRotation; - GetPointAtAngleRelativeToOtherActor(ArrowLineEnd, ArrowLineEndRotation, Actor1, Actor2, Angle, Distance, bTakeZFromActor1); - DrawDebugDirectionalArrow(Actor1->GetWorld(), Actor1->GetActorLocation(), Actor2->GetActorLocation(), RELATIVE_POINT_ARROW_SIZE, FColor::White, true, DebugLifetime, DEPTH_PRIORITY, 1); - DrawDebugDirectionalArrow(Actor1->GetWorld(), Actor1->GetActorLocation(), ArrowLineEnd, RELATIVE_POINT_ARROW_SIZE, FColor::White, true, DebugLifetime, DEPTH_PRIORITY, 2); - } + if (bDebug) + { + const UEnum* EnumPtr = FindObject(nullptr, TEXT("EUHLDirection"), true); + if (EnumPtr) + { + DrawDebugString(Actor1->GetWorld(), Point, FString::Printf(TEXT("Direction %s\nDistance %.2f"), *EnumPtr->GetNameStringByValue((uint8)Direction), Distance), 0, DebugColor.ToFColor(true), + DebugLifetime, true, 1.0f); + } + DrawDebugSphere(Actor1->GetWorld(), Point, 10.0f, 12, DebugColor.ToFColor(true), true, DebugLifetime, DEPTH_PRIORITY, 1); + FVector ArrowLineEnd; + FRotator ArrowLineEndRotation; + GetPointAtAngleRelativeToOtherActor(ArrowLineEnd, ArrowLineEndRotation, Actor1, Actor2, Angle, Distance, bTakeZFromActor1); + DrawDebugDirectionalArrow(Actor1->GetWorld(), Actor1->GetActorLocation(), Actor2->GetActorLocation(), RELATIVE_POINT_ARROW_SIZE, FColor::White, true, DebugLifetime, DEPTH_PRIORITY, 1); + DrawDebugDirectionalArrow(Actor1->GetWorld(), Actor1->GetActorLocation(), ArrowLineEnd, RELATIVE_POINT_ARROW_SIZE, FColor::White, true, DebugLifetime, DEPTH_PRIORITY, 2); + } } float UUnrealHelperLibraryBPL::DirectionToAngle(const EUHLDirection DirectionIn) { - if (DirectionIn == EUHLDirection::Front) return 0.0f; - if (DirectionIn == EUHLDirection::Back) return 180.0f; - if (DirectionIn == EUHLDirection::Left) return -90.0f; - if (DirectionIn == EUHLDirection::Right) return 90.0f; - if (DirectionIn == EUHLDirection::FrontLeft) return -45.0f; - if (DirectionIn == EUHLDirection::FrontRight) return 45.0f; - if (DirectionIn == EUHLDirection::BackLeft) return -135.0f; - if (DirectionIn == EUHLDirection::BackRight) return 135.0f; - return 0.0f; + if (DirectionIn == EUHLDirection::Front) + return 0.0f; + if (DirectionIn == EUHLDirection::Back) + return 180.0f; + if (DirectionIn == EUHLDirection::Left) + return -90.0f; + if (DirectionIn == EUHLDirection::Right) + return 90.0f; + if (DirectionIn == EUHLDirection::FrontLeft) + return -45.0f; + if (DirectionIn == EUHLDirection::FrontRight) + return 45.0f; + if (DirectionIn == EUHLDirection::BackLeft) + return -135.0f; + if (DirectionIn == EUHLDirection::BackRight) + return 135.0f; + return 0.0f; } -float UUnrealHelperLibraryBPL::ConvertPercentToMultiplier(float Percent) -{ - return (100.0f - Percent) / 100.0f; -} +float UUnrealHelperLibraryBPL::ConvertPercentToMultiplier(float Percent) { return (100.0f - Percent) / 100.0f; } -bool UUnrealHelperLibraryBPL::IsPreviewWorld(UObject* WorldContextObject) -{ - return WorldContextObject->GetWorld()->IsPreviewWorld(); -} +bool UUnrealHelperLibraryBPL::IsPreviewWorld(UObject* WorldContextObject) { return WorldContextObject->GetWorld()->IsPreviewWorld(); } -bool UUnrealHelperLibraryBPL::IsGameWorld(UObject* WorldContextObject) -{ - return WorldContextObject->GetWorld()->IsGameWorld(); -} +bool UUnrealHelperLibraryBPL::IsGameWorld(UObject* WorldContextObject) { return WorldContextObject->GetWorld()->IsGameWorld(); } -bool UUnrealHelperLibraryBPL::IsEditorWorld(UObject* WorldContextObject) -{ - return WorldContextObject->GetWorld()->IsEditorWorld(); -} +bool UUnrealHelperLibraryBPL::IsEditorWorld(UObject* WorldContextObject) { return WorldContextObject->GetWorld()->IsEditorWorld(); } -bool UUnrealHelperLibraryBPL::IsObjectInPreviewWorld(UObject* Object) -{ - return Object->GetWorld()->IsPreviewWorld(); -} +bool UUnrealHelperLibraryBPL::IsObjectInPreviewWorld(UObject* Object) { return Object->GetWorld()->IsPreviewWorld(); } -bool UUnrealHelperLibraryBPL::IsObjectInEditorWorld(UObject* Object) -{ - return Object->GetWorld()->IsEditorWorld(); -} +bool UUnrealHelperLibraryBPL::IsObjectInEditorWorld(UObject* Object) { return Object->GetWorld()->IsEditorWorld(); } -bool UUnrealHelperLibraryBPL::IsObjectInGameWorld(UObject* Object) -{ - return Object->GetWorld()->IsGameWorld(); -} +bool UUnrealHelperLibraryBPL::IsObjectInGameWorld(UObject* Object) { return Object->GetWorld()->IsGameWorld(); } bool UUnrealHelperLibraryBPL::IsOtherActorInAngle(AActor* Actor, AActor* OtherActor, TArray Ranges) { - float RelativeAngle = RelativeAngleToActor(Actor, OtherActor); - bool bInAngle = false; - for (FFloatRange Range : Ranges) - { - bInAngle = UKismetMathLibrary::InRange_FloatFloat(RelativeAngle, Range.GetLowerBoundValue(), Range.GetUpperBoundValue(), true, true); - if (bInAngle) break; - } - return bInAngle; + float RelativeAngle = RelativeAngleToActor(Actor, OtherActor); + bool bInAngle = false; + for (FFloatRange Range : Ranges) + { + bInAngle = UKismetMathLibrary::InRange_FloatFloat(RelativeAngle, Range.GetLowerBoundValue(), Range.GetUpperBoundValue(), true, true); + if (bInAngle) + break; + } + return bInAngle; } bool UUnrealHelperLibraryBPL::IsOtherCharacterInRange(ACharacter* Character, ACharacter* OtherCharacter, FFloatRange Range, bool bIncludeSelfCapsuleRadius, bool bIncludeTargetCapsuleRadius) { - if (!Character || !OtherCharacter) return false; + if (!Character || !OtherCharacter) + return false; - float CurrentDistance = Character->GetDistanceTo(OtherCharacter); + float CurrentDistance = Character->GetDistanceTo(OtherCharacter); - if (bIncludeSelfCapsuleRadius) - { - CurrentDistance -= Character->GetCapsuleComponent()->GetScaledCapsuleRadius(); - } - if (bIncludeTargetCapsuleRadius) - { - CurrentDistance -= OtherCharacter->GetCapsuleComponent()->GetScaledCapsuleRadius(); - } + if (bIncludeSelfCapsuleRadius) + { + CurrentDistance -= Character->GetCapsuleComponent()->GetScaledCapsuleRadius(); + } + if (bIncludeTargetCapsuleRadius) + { + CurrentDistance -= OtherCharacter->GetCapsuleComponent()->GetScaledCapsuleRadius(); + } - bool bInRange = UKismetMathLibrary::InRange_FloatFloat(CurrentDistance, Range.GetLowerBoundValue(), Range.GetUpperBoundValue()); - return bInRange; + bool bInRange = UKismetMathLibrary::InRange_FloatFloat(CurrentDistance, Range.GetLowerBoundValue(), Range.GetUpperBoundValue()); + return bInRange; } FString UUnrealHelperLibraryBPL::GetPathToFile(UObject* Object) { - FString NameAndWithSlash = FString::Printf(TEXT("/%s"), *Object->GetName()); - return Object->GetPathName(NULL).Replace(*Object->GetName(), TEXT("")); + FString NameAndWithSlash = FString::Printf(TEXT("/%s"), *Object->GetName()); + return Object->GetPathName(NULL).Replace(*Object->GetName(), TEXT("")); } bool UUnrealHelperLibraryBPL::IsDebugBuild() { - EBuildConfiguration BuildConfiguration = FApp::GetBuildConfiguration(); - if (BuildConfiguration == EBuildConfiguration::Debug - || BuildConfiguration == EBuildConfiguration::DebugGame) - { - return true; - } - return false; + EBuildConfiguration BuildConfiguration = FApp::GetBuildConfiguration(); + if (BuildConfiguration == EBuildConfiguration::Debug || BuildConfiguration == EBuildConfiguration::DebugGame) + { + return true; + } + return false; } bool UUnrealHelperLibraryBPL::IsDevelopmentBuild() { - EBuildConfiguration BuildConfiguration = FApp::GetBuildConfiguration(); - return BuildConfiguration == EBuildConfiguration::Development; + EBuildConfiguration BuildConfiguration = FApp::GetBuildConfiguration(); + return BuildConfiguration == EBuildConfiguration::Development; } bool UUnrealHelperLibraryBPL::IsShippingBuild() { - EBuildConfiguration BuildConfiguration = FApp::GetBuildConfiguration(); - return BuildConfiguration == EBuildConfiguration::Shipping; + EBuildConfiguration BuildConfiguration = FApp::GetBuildConfiguration(); + return BuildConfiguration == EBuildConfiguration::Shipping; } bool UUnrealHelperLibraryBPL::IsTestBuild() { - EBuildConfiguration BuildConfiguration = FApp::GetBuildConfiguration(); - return BuildConfiguration == EBuildConfiguration::Test; + EBuildConfiguration BuildConfiguration = FApp::GetBuildConfiguration(); + return BuildConfiguration == EBuildConfiguration::Test; } bool UUnrealHelperLibraryBPL::IsInEditor() { #if WITH_EDITOR - return true; + return true; #else - return false; + return false; #endif } EUHLBuildType UUnrealHelperLibraryBPL::GetBuildType() { - if (IsInEditor()) return EUHLBuildType::Editor; + if (IsInEditor()) + return EUHLBuildType::Editor; - EBuildConfiguration BuildConfiguration = FApp::GetBuildConfiguration(); - switch (BuildConfiguration) - { - case EBuildConfiguration::Debug: - return EUHLBuildType::Debug; - break; - case EBuildConfiguration::DebugGame: - return EUHLBuildType::Debug; + EBuildConfiguration BuildConfiguration = FApp::GetBuildConfiguration(); + switch (BuildConfiguration) + { + case EBuildConfiguration::Debug: + return EUHLBuildType::Debug; + break; + case EBuildConfiguration::DebugGame: + return EUHLBuildType::Debug; break; - case EBuildConfiguration::Development: - return EUHLBuildType::Development; + case EBuildConfiguration::Development: + return EUHLBuildType::Development; break; - case EBuildConfiguration::Shipping: - return EUHLBuildType::Shipping; + case EBuildConfiguration::Shipping: + return EUHLBuildType::Shipping; break; - case EBuildConfiguration::Test: - return EUHLBuildType::Test; + case EBuildConfiguration::Test: + return EUHLBuildType::Test; break; - default: - return IsInEditor() ? EUHLBuildType::Editor : EUHLBuildType::None; - break; - } + default: + return IsInEditor() ? EUHLBuildType::Editor : EUHLBuildType::None; + break; + } } -EBBValueType UUnrealHelperLibraryBPL::BlackboardKeyToBBValueType( - FBlackboardKeySelector BlackboardKey) +EBBValueType UUnrealHelperLibraryBPL::BlackboardKeyToBBValueType(FBlackboardKeySelector BlackboardKey) { EBBValueType Result = EBBValueType::None; @@ -700,12 +688,13 @@ FLinearColor UUnrealHelperLibraryBPL::RandomLinearColor(int32 Seed) bool UUnrealHelperLibraryBPL::IsUHLDebugCategoryEnabled(UObject* WorldContextObject, FGameplayTag DebugCategoryGameplayTag) { - UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(WorldContextObject); - if (!IsValid(GameInstance)) return false; + UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(WorldContextObject); + if (!IsValid(GameInstance)) + return false; - UUHLDebugSubsystem* UHLDebugSubsystem = GameInstance->GetSubsystem(); - if (!IsValid(UHLDebugSubsystem)) return false; + UUHLDebugSubsystem* UHLDebugSubsystem = GameInstance->GetSubsystem(); + if (!IsValid(UHLDebugSubsystem)) + return false; - return UHLDebugSubsystem->IsCategoryEnabled(DebugCategoryGameplayTag); + return UHLDebugSubsystem->IsCategoryEnabled(DebugCategoryGameplayTag); } - diff --git a/Source/UnrealHelperLibrary/Public/AI/Data/TurnSettings.h b/Source/UnrealHelperLibrary/Public/AI/Data/TurnSettings.h index 427ff7c..3c40188 100644 --- a/Source/UnrealHelperLibrary/Public/AI/Data/TurnSettings.h +++ b/Source/UnrealHelperLibrary/Public/AI/Data/TurnSettings.h @@ -3,8 +3,10 @@ #pragma once #include "CoreMinimal.h" +#include "Engine/DataAsset.h" #include "TurnSettings.generated.h" +class UAnimMontage; USTRUCT(Blueprintable) struct FTurnRange diff --git a/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_InAngle.h b/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_InAngle.h index 8edeec6..bd22271 100644 --- a/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_InAngle.h +++ b/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_InAngle.h @@ -6,6 +6,8 @@ #include "AI/Decorators/BTD_Base.h" #include "BTD_InAngle.generated.h" +class ACharacter; + struct FBTInAngleMemory { }; diff --git a/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_InRange.h b/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_InRange.h index a0a9d7b..e4bd558 100644 --- a/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_InRange.h +++ b/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_InRange.h @@ -5,7 +5,6 @@ #include "CoreMinimal.h" #include "BTD_Base.h" #include "BehaviorTree/BTCompositeNode.h" -#include "BehaviorTree/BTDecorator.h" #include "BTD_InRange.generated.h" struct FBTInRangeMemory diff --git a/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_RandomChance.h b/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_RandomChance.h index fd0af0d..4f5aa63 100644 --- a/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_RandomChance.h +++ b/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_RandomChance.h @@ -19,7 +19,7 @@ class UNREALHELPERLIBRARY_API UBTD_RandomChance : public UBTDecorator // UPROPERTY(Category="Decorator", EditAnywhere, meta=(UIMin=0.0f, UIMax=1.0f, ClampMin=0.0f, ClampMax=1.0f, EditCondition="!bUseUnclamped && !bUseBlackboardValue", EditConditionHides)) UPROPERTY(Category="Decorator", EditAnywhere, meta=(UIMin=0.0f, UIMax=1.0f, ClampMin=0.0f, ClampMax=1.0f)) - float Chance; + float Chance = 1.0f; // UPROPERTY(Category=Decorator, EditAnywhere, meta=(EditCondition="bUseUnclamped && !bUseBlackboardValue", EditConditionHides)) // float ChanceUnclamped; // TODO value from blackboard diff --git a/Source/UnrealHelperLibrary/Public/AI/Tasks/BTT_TurnTo.h b/Source/UnrealHelperLibrary/Public/AI/Tasks/BTT_TurnTo.h index eec77e5..448b18f 100644 --- a/Source/UnrealHelperLibrary/Public/AI/Tasks/BTT_TurnTo.h +++ b/Source/UnrealHelperLibrary/Public/AI/Tasks/BTT_TurnTo.h @@ -12,6 +12,7 @@ #include "BTT_TurnTo.generated.h" class AAIController; +class ACharacter; struct FBTTurnToMemory : FBTFocusMemory { diff --git a/Source/UnrealHelperLibrary/Public/AbilitySystem/Abilities/UHLGameplayAbility.h b/Source/UnrealHelperLibrary/Public/AbilitySystem/Abilities/UHLGameplayAbility.h index b688346..df74c6f 100644 --- a/Source/UnrealHelperLibrary/Public/AbilitySystem/Abilities/UHLGameplayAbility.h +++ b/Source/UnrealHelperLibrary/Public/AbilitySystem/Abilities/UHLGameplayAbility.h @@ -18,17 +18,29 @@ enum class EUHLAbilityActivationPolicy : uint8 { // Try to activate the ability when the input is triggered. OnInputTriggered, - - // Don't work, known issue, fix will come soon, - // for now just use "WaitInputRelease" in GameplayAbility to check when input released and "EndAbility" - // - // Continually try to activate the ability while the input is active. To cancel ability use WaitInputRelease + + // Continually try to activate the ability while the input is active. + // Subscribe on "WaitInputRelease" and "EndAbility" in blueprint, + // it's not possible to EndAbility from C++ WhileInputActive, // Try to activate the ability when an avatar is assigned. OnSpawn }; +// USTRUCT(BlueprintType) +// struct FUHLWhileInputActiveSettings +// { +// GENERATED_BODY() +// +// UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) +// bool bCancelAbilityAutomatically = true; +// UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) +// bool bReplicateEndAbility = true; +// // UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) +// // bool bMarkAsCanceledOnEnd = false; +// }; + /** * */ @@ -38,8 +50,12 @@ class UNREALHELPERLIBRARY_API UUHLGameplayAbility : public UGameplayAbility GENERATED_BODY() public: + UFUNCTION(BlueprintCallable, Category = "UHL GameplayAbility") EUHLAbilityActivationPolicy GetActivationPolicy() const { return ActivationPolicy; } + // UFUNCTION(BlueprintCallable) + // FUHLWhileInputActiveSettings GetWhileInputActiveSettings() const { return WhileInputActiveSettings; } + // should cache input if ability can't be activated for now // Requirements: // - ASC should enable "bUseAbilityInputCache" @@ -63,6 +79,9 @@ class UNREALHELPERLIBRARY_API UUHLGameplayAbility : public UGameplayAbility // Defines how this ability is meant to activate. UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="UHL GameplayAbility") EUHLAbilityActivationPolicy ActivationPolicy = EUHLAbilityActivationPolicy::OnInputTriggered; + + // UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta=(EditCondition="ActivationPolicy == EUHLAbilityActivationPolicy::WhileInputActive", EditConditionHides)) + // FUHLWhileInputActiveSettings WhileInputActiveSettings; virtual void OnGiveAbility(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec) override; virtual void OnRemoveAbility(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec) override; diff --git a/Source/UnrealHelperLibrary/Public/AbilitySystem/Tasks/AT_InterpolateToPosition.h b/Source/UnrealHelperLibrary/Public/AbilitySystem/Tasks/AT_InterpolateToPosition.h index 259a02b..bf8698b 100644 --- a/Source/UnrealHelperLibrary/Public/AbilitySystem/Tasks/AT_InterpolateToPosition.h +++ b/Source/UnrealHelperLibrary/Public/AbilitySystem/Tasks/AT_InterpolateToPosition.h @@ -6,6 +6,7 @@ #include "Abilities/Tasks/AbilityTask.h" #include "AT_InterpolateToPosition.generated.h" +class UCurveVector; DECLARE_DYNAMIC_MULTICAST_DELEGATE(FInterpolateToPositionSimpleDelegate); /** @@ -58,10 +59,10 @@ class UNREALHELPERLIBRARY_API UAT_InterpolateToPosition : public UAbilityTask FVector TargetLocation; UPROPERTY(Replicated) - float DurationOfMovement; + float DurationOfMovement = 0.0f; - float TimeMoveStarted; - float TimeMoveWillEnd; + float TimeMoveStarted = 0.0f; + float TimeMoveWillEnd = 0.0f; UPROPERTY(Replicated) TObjectPtr LerpCurve; diff --git a/Source/UnrealHelperLibrary/Public/AbilitySystem/UHLAbilitySet.h b/Source/UnrealHelperLibrary/Public/AbilitySystem/UHLAbilitySet.h index c9b71e9..d5a3fae 100644 --- a/Source/UnrealHelperLibrary/Public/AbilitySystem/UHLAbilitySet.h +++ b/Source/UnrealHelperLibrary/Public/AbilitySystem/UHLAbilitySet.h @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (c) 2024 Pavel Penkov #pragma once @@ -17,7 +17,6 @@ class UUHLAbilitySystemComponent; class UUHLGameplayAbility; class UObject; - /** * FUHLAbilitySet_GameplayAbility * @@ -29,21 +28,19 @@ struct FUHLAbilitySet_GameplayAbility GENERATED_BODY() public: - // Gameplay ability to grant. - UPROPERTY(EditDefaultsOnly, Category="GameplayAbility") + UPROPERTY(EditDefaultsOnly, Category = "GameplayAbility") TSubclassOf Ability = nullptr; // Level of ability to grant. - UPROPERTY(EditDefaultsOnly, Category="GameplayAbility") + UPROPERTY(EditDefaultsOnly, Category = "GameplayAbility") int32 AbilityLevel = 1; // Tag used to process input for the ability. - UPROPERTY(EditDefaultsOnly, Category="GameplayAbility", Meta = (Categories = "InputTag")) + UPROPERTY(EditDefaultsOnly, Category = "GameplayAbility", Meta = (Categories = "InputTag")) FGameplayTag InputTag; }; - /** * FUHLAbilitySet_GameplayEffect * @@ -55,13 +52,12 @@ struct FUHLAbilitySet_GameplayEffect GENERATED_BODY() public: - // Gameplay effect to grant. - UPROPERTY(EditDefaultsOnly, Category="GameplayEffect") + UPROPERTY(EditDefaultsOnly, Category = "GameplayEffect") TSubclassOf GameplayEffect = nullptr; // Level of gameplay effect to grant. - UPROPERTY(EditDefaultsOnly, Category="GameplayEffect") + UPROPERTY(EditDefaultsOnly, Category = "GameplayEffect") float EffectLevel = 1.0f; }; @@ -77,9 +73,8 @@ struct FUHLAbilitySet_AttributeSet public: // Gameplay effect to grant. - UPROPERTY(EditDefaultsOnly, Category="AttributeSet") + UPROPERTY(EditDefaultsOnly, Category = "AttributeSet") TSubclassOf AttributeSet; - }; /** @@ -93,9 +88,9 @@ struct FUHLAbilitySet_GrantedHandles GENERATED_BODY() public: - FGameplayTagContainer GetAbilitySetTags() const { return AbilitySetTags; } - void SetAbilitySetTags(const FGameplayTagContainer& AbilitySetTagContainer); - + FGameplayTagContainer GetAbilitySetTags() const { return AbilitySetTags; } + void SetAbilitySetTags(const FGameplayTagContainer& AbilitySetTagContainer); + void AddAbilitySpecHandle(const FGameplayAbilitySpecHandle& Handle); void AddGameplayEffectHandle(const FActiveGameplayEffectHandle& Handle); void AddAttributeSet(UAttributeSet* Set); @@ -103,9 +98,9 @@ struct FUHLAbilitySet_GrantedHandles void TakeFromAbilitySystem(UAbilitySystemComponent* ASC); protected: - UPROPERTY() - FGameplayTagContainer AbilitySetTags; - + UPROPERTY() + FGameplayTagContainer AbilitySetTags; + // Handles to the granted abilities. UPROPERTY() TArray AbilitySpecHandles; @@ -119,7 +114,6 @@ struct FUHLAbilitySet_GrantedHandles TArray> GrantedAttributeSets; }; - /** * UUHLAbilitySet * @@ -133,33 +127,32 @@ class UUHLAbilitySet : public UPrimaryDataAsset GENERATED_BODY() public: - UUHLAbilitySet(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()); // Grants the ability set to the specified ability system component. // The returned handles can be used later to take away anything that was granted. void GiveToAbilitySystem(UAbilitySystemComponent* ASC, FUHLAbilitySet_GrantedHandles* OutGrantedHandles, UObject* SourceObject = nullptr) const; - TArray> GetAllAbilitiesList() const; - + TArray> GetAllAbilitiesList() const; + protected: - // AbilitySetTag to associate with and can be removed "RemoveAbilitySetByTag" - UPROPERTY(EditDefaultsOnly, Category = "AbilitySet Tags", meta=(TitleProperty=Ability)) - FGameplayTagContainer AbilitySetTags; - - // Gameplay abilities to grant when this ability set is granted. - UPROPERTY(EditDefaultsOnly, Category = "Gameplay Abilities", meta=(TitleProperty=Ability)) - TArray> GrantedSimpleGameplayAbilities; - + // AbilitySetTag to associate with and can be removed "RemoveAbilitySetByTag" + UPROPERTY(EditDefaultsOnly, Category = "AbilitySet Tags", meta = (TitleProperty = Ability)) + FGameplayTagContainer AbilitySetTags; + + // Gameplay abilities to grant when this ability set is granted. + UPROPERTY(EditDefaultsOnly, Category = "Gameplay Abilities", meta = (TitleProperty = Ability)) + TArray> GrantedSimpleGameplayAbilities; + // Gameplay abilities to grant when this ability set is granted. - UPROPERTY(EditDefaultsOnly, Category = "Gameplay Abilities", meta=(TitleProperty=Ability)) + UPROPERTY(EditDefaultsOnly, Category = "Gameplay Abilities", meta = (TitleProperty = Ability)) TArray GrantedGameplayAbilities; // Gameplay effects to grant when this ability set is granted. - UPROPERTY(EditDefaultsOnly, Category = "Gameplay Effects", meta=(TitleProperty=GameplayEffect)) + UPROPERTY(EditDefaultsOnly, Category = "Gameplay Effects", meta = (TitleProperty = GameplayEffect)) TArray GrantedGameplayEffects; // Attribute sets to grant when this ability set is granted. - UPROPERTY(EditDefaultsOnly, Category = "Attribute Sets", meta=(TitleProperty=AttributeSet)) + UPROPERTY(EditDefaultsOnly, Category = "Attribute Sets", meta = (TitleProperty = AttributeSet)) TArray GrantedAttributes; }; diff --git a/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_ActivateAbility.h b/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_ActivateAbility.h index 8941a5a..9d9feb7 100644 --- a/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_ActivateAbility.h +++ b/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_ActivateAbility.h @@ -4,11 +4,11 @@ #include "CoreMinimal.h" #include "ANS_UHL_Base.h" +#include "UObject/WeakInterfacePtr.h" #include "GameplayTagContainer.h" +#include "AbilitySystemInterface.h" #include "ANS_ActivateAbility.generated.h" -class IAbilitySystemInterface; - /** * */ diff --git a/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_EnableRootMotionZAxisMovement.h b/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_EnableRootMotionZAxisMovement.h index 69dd635..d0576f2 100644 --- a/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_EnableRootMotionZAxisMovement.h +++ b/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_EnableRootMotionZAxisMovement.h @@ -4,9 +4,11 @@ #include "CoreMinimal.h" #include "Animation/AnimNotifies/AnimNotifyState.h" +#include "Engine/EngineTypes.h" #include "ANS_EnableRootMotionZAxisMovement.generated.h" -class ABBaseCharacter; +class ACharacter; + /** * */ @@ -30,7 +32,7 @@ class UNREALHELPERLIBRARY_API UANS_EnableRootMotionZAxisMovement : public UAnimN private: TWeakObjectPtr BaseCharacter; - EMovementMode InitialMovementMode; + EMovementMode InitialMovementMode = EMovementMode::MOVE_None; UFUNCTION() void OnMontageBlendingOut(UAnimMontage* Montage, bool bInterrupted); diff --git a/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_MagnetTo.h b/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_MagnetTo.h index bc2967c..a4f2a68 100644 --- a/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_MagnetTo.h +++ b/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_MagnetTo.h @@ -7,6 +7,8 @@ #include "BehaviorTree/BlackboardData.h" #include "ANS_MagnetTo.generated.h" +class ACharacter; + /** * */ @@ -45,13 +47,10 @@ class UNREALHELPERLIBRARY_API UANS_MagnetTo : public UAnimNotifyState private: TWeakObjectPtr BaseCharacter; - EMovementMode InitialMovementMode; + // EMovementMode InitialMovementMode; float Speed = 0.0f; float Alpha = 0.0f; - UFUNCTION() - void TimerTick(); - // UFUNCTION() // void OnMontageBlendingOut(UAnimMontage* Montage, bool bInterrupted); }; diff --git a/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_UHL_Base.h b/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_UHL_Base.h index f9f3945..0ef69d3 100644 --- a/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_UHL_Base.h +++ b/Source/UnrealHelperLibrary/Public/Animation/Notifies/ANS_UHL_Base.h @@ -6,6 +6,8 @@ #include "Animation/AnimNotifies/AnimNotifyState.h" #include "ANS_UHL_Base.generated.h" +class UAnimMontage; + /** * with events like OnMontageBlendOut, OnMontageInterrupted... * you can disable subscribing OnMontageBlendOut, by "bUseOnMontageBlendingOut=false" in constructor @@ -15,8 +17,6 @@ class UNREALHELPERLIBRARY_API UANS_UHL_Base : public UAnimNotifyState { GENERATED_BODY() -public: - protected: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="ANS_UHL_Base") bool bUseOnMontageBlendingOut = true; diff --git a/Source/UnrealHelperLibrary/Public/Animation/Notifies/AN_UHL_Base.h b/Source/UnrealHelperLibrary/Public/Animation/Notifies/AN_UHL_Base.h index da27ff1..9cb0810 100644 --- a/Source/UnrealHelperLibrary/Public/Animation/Notifies/AN_UHL_Base.h +++ b/Source/UnrealHelperLibrary/Public/Animation/Notifies/AN_UHL_Base.h @@ -6,9 +6,7 @@ #include "Animation/AnimNotifies/AnimNotify.h" #include "AN_UHL_Base.generated.h" -/** - * - */ +class USkeletalMeshComponent; DECLARE_MULTICAST_DELEGATE_OneParam(FOnNotifySignature, USkeletalMeshComponent*) UCLASS() diff --git a/Source/UnrealHelperLibrary/Public/Development/UHLDebugSubsystemSettings.h b/Source/UnrealHelperLibrary/Public/Development/UHLDebugSubsystemSettings.h index f3f2589..c52a348 100644 --- a/Source/UnrealHelperLibrary/Public/Development/UHLDebugSubsystemSettings.h +++ b/Source/UnrealHelperLibrary/Public/Development/UHLDebugSubsystemSettings.h @@ -4,6 +4,7 @@ #include "CoreMinimal.h" #include "GameplayTagContainer.h" +#include "Misc/App.h" #include "Engine/DeveloperSettingsBackedByCVars.h" #include "Subsystems/DebugSubsystem/UHLDebugSubsystem.h" #include "UHLDebugSubsystemSettings.generated.h" diff --git a/Source/UnrealHelperLibrary/Public/Input/UHLInputConfig.h b/Source/UnrealHelperLibrary/Public/Input/UHLInputConfig.h index 11633d4..84c2c6b 100644 --- a/Source/UnrealHelperLibrary/Public/Input/UHLInputConfig.h +++ b/Source/UnrealHelperLibrary/Public/Input/UHLInputConfig.h @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (c) 2024 Pavel Penkov #pragma once @@ -26,10 +26,9 @@ struct FUHLInputAction GENERATED_BODY() public: - - UPROPERTY(EditDefaultsOnly, Category="InputAction") + UPROPERTY(EditDefaultsOnly, Category = "InputAction") const UInputAction* InputAction = nullptr; - UPROPERTY(EditDefaultsOnly, Category="InputAction", Meta = (Categories = "InputTag")) + UPROPERTY(EditDefaultsOnly, Category = "InputAction", Meta = (Categories = "InputTag")) FGameplayTag InputTag; }; @@ -44,11 +43,11 @@ struct FUHLInputActionAbilities GENERATED_BODY() public: - UPROPERTY(EditDefaultsOnly, Category="InputActionAbilities") - bool bEnabled = true; - UPROPERTY(EditDefaultsOnly, Category="InputActionAbilities") + UPROPERTY(EditDefaultsOnly, Category = "InputActionAbilities") + bool bEnabled = true; + UPROPERTY(EditDefaultsOnly, Category = "InputActionAbilities") const UInputAction* InputAction = nullptr; - UPROPERTY(EditDefaultsOnly, Category="InputActionAbilities") + UPROPERTY(EditDefaultsOnly, Category = "InputActionAbilities") TArray AbilitiesToActivate; }; @@ -72,16 +71,16 @@ class UNREALHELPERLIBRARY_API UUHLInputConfig : public UDataAsset // List of input actions used by the owner. These input actions are mapped to a gameplay tag and must be manually bound. // UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Meta = (TitleProperty = "InputAction")) // TArray NativeInputActions; - UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Native Input Actions") + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Native Input Actions") FUHLInputAction NativeInputAction_Move; - UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Native Input Actions") + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Native Input Actions") FUHLInputAction NativeInputAction_LookMouse; - UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Native Input Actions") + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Native Input Actions") FUHLInputAction NativeInputAction_LookStick; - UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Native Input Actions") - FUHLInputAction NativeInputAction_Interact; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Native Input Actions") + FUHLInputAction NativeInputAction_Interact; // List of input actions used by the owner. These input actions are mapped to a gameplay tag and are automatically bound to abilities with matching input tags. - UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="AbilityInputActions", Meta = (TitleProperty = "InputAction")) + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "AbilityInputActions", Meta = (TitleProperty = "InputAction")) TArray AbilityInputActions; }; diff --git a/Source/UnrealHelperLibrary/Public/Subsystems/DebugSubsystem/AA_WaitDebugCategoryChange.h b/Source/UnrealHelperLibrary/Public/Subsystems/DebugSubsystem/AA_WaitDebugCategoryChange.h index e8aa3d1..b85c807 100644 --- a/Source/UnrealHelperLibrary/Public/Subsystems/DebugSubsystem/AA_WaitDebugCategoryChange.h +++ b/Source/UnrealHelperLibrary/Public/Subsystems/DebugSubsystem/AA_WaitDebugCategoryChange.h @@ -5,7 +5,6 @@ #include "CoreMinimal.h" #include "GameplayTagContainer.h" #include "Kismet/BlueprintAsyncActionBase.h" -#include "UnrealHelperLibrary/UnrealHelperLibraryTypes.h" #include "AA_WaitDebugCategoryChange.generated.h" DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FWaitDebugCategoryChanged, bool, bEnabled); diff --git a/Source/UnrealHelperLibrary/Public/UnrealHelperLibrary.h b/Source/UnrealHelperLibrary/Public/UnrealHelperLibrary.h index 4944de7..91ef517 100644 --- a/Source/UnrealHelperLibrary/Public/UnrealHelperLibrary.h +++ b/Source/UnrealHelperLibrary/Public/UnrealHelperLibrary.h @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (c) 2024 Pavel Penkov #pragma once @@ -10,7 +10,6 @@ UNREALHELPERLIBRARY_API DECLARE_LOG_CATEGORY_EXTERN(LogUHLAbilitySystem, Log, Al class FUnrealHelperLibraryModule : public IModuleInterface { public: - /** IModuleInterface implementation */ virtual void StartupModule() override; virtual void ShutdownModule() override; diff --git a/Source/UnrealHelperLibrary/Public/Utils/UHLTraceUtilsBPL.h b/Source/UnrealHelperLibrary/Public/Utils/UHLTraceUtilsBPL.h index e77b4cb..f49f5df 100644 --- a/Source/UnrealHelperLibrary/Public/Utils/UHLTraceUtilsBPL.h +++ b/Source/UnrealHelperLibrary/Public/Utils/UHLTraceUtilsBPL.h @@ -3,6 +3,8 @@ #pragma once #include "CoreMinimal.h" +#include "Engine/EngineTypes.h" +#include "CollisionQueryParams.h" #include "Kismet/BlueprintFunctionLibrary.h" #include "UHLTraceUtilsBPL.generated.h" diff --git a/Source/UnrealHelperLibrary/Public/Utils/UnrealHelperLibraryBPL.h b/Source/UnrealHelperLibrary/Public/Utils/UnrealHelperLibraryBPL.h index 16d48b1..7ebd06e 100644 --- a/Source/UnrealHelperLibrary/Public/Utils/UnrealHelperLibraryBPL.h +++ b/Source/UnrealHelperLibrary/Public/Utils/UnrealHelperLibraryBPL.h @@ -1,11 +1,12 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (c) 2024 Pavel Penkov #pragma once #include "GameplayEffect.h" +#include "UnrealHelperLibrary/UnrealHelperLibraryTypes.h" +#include "AssetRegistry/AssetData.h" #include "AssetRegistry/AssetRegistryModule.h" #include "Kismet/BlueprintFunctionLibrary.h" -#include "UnrealHelperLibrary/UnrealHelperLibraryTypes.h" #include "UnrealHelperLibraryBPL.generated.h" struct FBlackboardKeySelector; @@ -17,22 +18,22 @@ const float RELATIVE_POINT_ARROW_SIZE = 200.0f; // - keywords for every method /* -* Function library class. -* Each function in it is expected to be static and represents blueprint node that can be called in any blueprint. -* -* When declaring function you can define metadata for the node. Key function specifiers will be BlueprintPure and BlueprintCallable. -* BlueprintPure - means the function does not affect the owning object in any way and thus creates a node without Exec pins. -* BlueprintCallable - makes a function which can be executed in Blueprints - Thus it has Exec pins. -* DisplayName - full name of the node, shown when you mouse over the node and in the blueprint drop down menu. -* Its lets you name the node using characters not allowed in C++ function names. -* CompactNodeTitle - the word(s) that appear on the node. -* Keywords - the list of keywords that helps you to find node when you search for it using Blueprint drop-down menu. -* Good example is "Print String" node which you can find also by using keyword "log". -* Category - the category your node will be under in the Blueprint drop-down menu. -* -* For more info on custom blueprint nodes visit documentation: -* https://wiki.unrealengine.com/Custom_Blueprint_Node_Creation -*/ + * Function library class. + * Each function in it is expected to be static and represents blueprint node that can be called in any blueprint. + * + * When declaring function you can define metadata for the node. Key function specifiers will be BlueprintPure and BlueprintCallable. + * BlueprintPure - means the function does not affect the owning object in any way and thus creates a node without Exec pins. + * BlueprintCallable - makes a function which can be executed in Blueprints - Thus it has Exec pins. + * DisplayName - full name of the node, shown when you mouse over the node and in the blueprint drop down menu. + * Its lets you name the node using characters not allowed in C++ function names. + * CompactNodeTitle - the word(s) that appear on the node. + * Keywords - the list of keywords that helps you to find node when you search for it using Blueprint drop-down menu. + * Good example is "Print String" node which you can find also by using keyword "log". + * Category - the category your node will be under in the Blueprint drop-down menu. + * + * For more info on custom blueprint nodes visit documentation: + * https://wiki.unrealengine.com/Custom_Blueprint_Node_Creation + */ UCLASS() class UNREALHELPERLIBRARY_API UUnrealHelperLibraryBPL : public UBlueprintFunctionLibrary { @@ -42,63 +43,65 @@ class UNREALHELPERLIBRARY_API UUnrealHelperLibraryBPL : public UBlueprintFunctio // UFUNCTION(BlueprintCallable, meta = (Keywords = "UnrealHelperLibrary sample test testing"), Category = "UnrealHelperLibraryTesting") // static float UnrealHelperLibraryRandomWeight(TMap); -/** Gameplay **/ + /** Gameplay **/ // Get HitReactDirection - direction(front/back/left/right) opposite to character(SourceActorLocation) that made hit // TODO add // - GetHitSourceDirection // - bool bUse8Directions UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary") static EUHLDirection GetHitReactDirection(const FVector& SourceActorLocation, const AActor* TargetActor); -/** Gameplay **/ - -/** Debug **/ - UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|Debug", meta = (Keywords = "UnrealHelperLibrary debug Development", AdvancedDisplay="D,E,F,G,H,I,J,Duration")) - static void DebugPrintStrings(const FString& A, const FString& B = "", const FString& C = "", const FString& D = "", const FString& E = "", const FString& F = "", const FString& G = "", const FString& H = "", const FString& I = "", const FString& J = "", float Duration = 2.0f, const FName Key = NAME_None, const bool bEnabled = true); - UFUNCTION(Category = "UnrealHelperLibrary", meta = (WorldContext = "WorldContextObject", Keywords = "UnrealHelperLibrary debug Development", AdvancedDisplay="D,E,F,G,H,I,J,Duration")) - static void DebugPrintString(const UObject* WorldContextObject, const FString& A, float Duration = 2.0f, const FName Key = NAME_None, const bool bEnabled = true); - UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|Debug", meta = (Keywords = "UnrealHelperLibrary debug Development")) - static void DrawDebugBar(); -/** ~Debug **/ - -/** Anims **/ + /** Gameplay **/ + + /** Debug **/ + UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|Debug", meta = (Keywords = "UnrealHelperLibrary debug Development", AdvancedDisplay = "D,E,F,G,H,I,J,Duration")) + static void DebugPrintStrings(const FString& A, const FString& B = "", const FString& C = "", const FString& D = "", const FString& E = "", const FString& F = "", const FString& G = "", + const FString& H = "", const FString& I = "", const FString& J = "", float Duration = 2.0f, const FName Key = NAME_None, const bool bEnabled = true); + UFUNCTION(Category = "UnrealHelperLibrary", meta = (WorldContext = "WorldContextObject", Keywords = "UnrealHelperLibrary debug Development", AdvancedDisplay = "D,E,F,G,H,I,J,Duration")) + static void DebugPrintString(const UObject* WorldContextObject, const FString& A, float Duration = 2.0f, const FName Key = NAME_None, const bool bEnabled = true); + UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|Debug", meta = (Keywords = "UnrealHelperLibrary debug Development")) + static void DrawDebugBar(); + /** ~Debug **/ + + /** Anims **/ // TODO dont work correctly, fix // if SectionName not specified will be used first section UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Animations", meta = (Keywords = "UnrealHelperLibrary anim montage")) static float GetAnimMontageSectionLengthByName(UAnimMontage* AnimMontage, FName SectionName = NAME_None); -/** ~Anims **/ - -/** GAS **/ - UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|GAS", meta = (Keywords = "UnrealHelperLibrary debug GAS Development")) - static FGameplayEffectSpec CreateGenericGASGameplayEffectSpec(TSubclassOf GameplayEffectClass, AActor* HitInstigator, AActor* InEffectCauser, const FHitResult& HitResult, const UObject* SourceObject); - /** - * UUnrealHelperLibraryBPL::UpdateStateGameplayTags(ASC, GetMovementComponent()->Velocity.Length() > 0, - UHLGameplayTags::TAG_Character_State_IsMoving, - UHLGameplayTags::TAG_Character_State_IsIdling); + /** ~Anims **/ + + /** GAS **/ + UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|GAS", meta = (Keywords = "UnrealHelperLibrary debug GAS Development")) + static FGameplayEffectSpec CreateGenericGASGameplayEffectSpec( + TSubclassOf GameplayEffectClass, AActor* HitInstigator, AActor* InEffectCauser, const FHitResult& HitResult, const UObject* SourceObject); + /** + * UUnrealHelperLibraryBPL::UpdateStateGameplayTags(ASC, GetMovementComponent()->Velocity.Length() > 0, + UHLGameplayTags::TAG_Character_State_IsMoving, + UHLGameplayTags::TAG_Character_State_IsIdling); bCondition = true ? TAG_Character_State_IsMoving : TAG_Character_State_IsIdling - UUnrealHelperLibraryBPL::UpdateStateGameplayTags(ASC, CharacterMovementVector.Length() > 0.4f, - UHLGameplayTags::TAG_Character_State_HasMoveInput, - FGameplayTag::EmptyTag); + UUnrealHelperLibraryBPL::UpdateStateGameplayTags(ASC, CharacterMovementVector.Length() > 0.4f, + UHLGameplayTags::TAG_Character_State_HasMoveInput, + FGameplayTag::EmptyTag); bCondition = true ? TAG_Character_State_HasMoveInput : NONE - */ - UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|GAS", meta = (Keywords = "UnrealHelperLibrary ability")) - static void UpdateStateGameplayTags(UAbilitySystemComponent* ASC, bool bCondition, FGameplayTag PositiveConditionTag, FGameplayTag NegativeConditionTag); - UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|GAS", meta = (Keywords = "UnrealHelperLibrary ability")) - static bool TryActivateAbilityWithTag(UAbilitySystemComponent* ASC, FGameplayTag GameplayTag, bool bAllowRemoteActivation); - UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|GAS", meta = (Keywords = "UnrealHelperLibrary ability")) - static bool TryCancelAbilityWithTag(UAbilitySystemComponent* ASC, FGameplayTag GameplayTag); - UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|GAS", meta = (Keywords = "UnrealHelperLibrary ability")) - static TArray TryCancelAbilitiesWithTags(UAbilitySystemComponent* ASC, TArray GameplayTags); - UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|GAS", meta = (Keywords = "UnrealHelperLibrary ability event fire")) - static int32 FireGameplayEvent(UAbilitySystemComponent* ASC, FGameplayTag EventTag, const FGameplayEventData& Payload); - - // "FGameplayTag::RequestGameplayTag()" crashes build on start, use this to find tag - // function from Lyra - UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|GAS", meta = (Keywords = "UnrealHelperLibrary gameplaytag tag")) - static FGameplayTag FindTagByString(const FString& TagString, bool bMatchPartialString = false); -/** ~GAS **/ - -/** Angles **/ + */ + UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|GAS", meta = (Keywords = "UnrealHelperLibrary ability")) + static void UpdateStateGameplayTags(UAbilitySystemComponent* ASC, bool bCondition, FGameplayTag PositiveConditionTag, FGameplayTag NegativeConditionTag); + UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|GAS", meta = (Keywords = "UnrealHelperLibrary ability")) + static bool TryActivateAbilityWithTag(UAbilitySystemComponent* ASC, FGameplayTag GameplayTag, bool bAllowRemoteActivation); + UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|GAS", meta = (Keywords = "UnrealHelperLibrary ability")) + static bool TryCancelAbilityWithTag(UAbilitySystemComponent* ASC, FGameplayTag GameplayTag); + UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|GAS", meta = (Keywords = "UnrealHelperLibrary ability")) + static TArray TryCancelAbilitiesWithTags(UAbilitySystemComponent* ASC, TArray GameplayTags); + UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|GAS", meta = (Keywords = "UnrealHelperLibrary ability event fire")) + static int32 FireGameplayEvent(UAbilitySystemComponent* ASC, FGameplayTag EventTag, const FGameplayEventData& Payload); + + // "FGameplayTag::RequestGameplayTag()" crashes build on start, use this to find tag + // function from Lyra + UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|GAS", meta = (Keywords = "UnrealHelperLibrary gameplaytag tag")) + static FGameplayTag FindTagByString(const FString& TagString, bool bMatchPartialString = false); + /** ~GAS **/ + + /** Angles **/ /** * Calculates relative angle to other actor [-180, 180] * @param ActorRelativeToWhomAngleCalculated @@ -108,128 +111,128 @@ class UNREALHELPERLIBRARY_API UUnrealHelperLibraryBPL : public UBlueprintFunctio * @param DebugLifetime * @param DebugColor */ - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Angles", meta = (DefaultToSelf = "ActorRelativeToWhomAngleCalculated", Keywords = "UnrealHelperLibrary debug Development angle relative GetAngle RelativeTo", AdvancedDisplay="bDebug,DebugLifetime,DebugColor,bRelativeToActorBack")) - static float RelativeAngleToActor( - AActor* ActorRelativeToWhomAngleCalculated, - AActor* TargetActor, - bool bRelativeToActorBack = false, - const bool bDebug = false, - const float DebugLifetime = -1, - const FLinearColor DebugColor = FLinearColor::White - ); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Angles", meta = (DefaultToSelf = "ActorRelativeToWhomAngleCalculated", Keywords = "UnrealHelperLibrary debug Development angle relative GetAngle RelativeTo")) + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Angles", + meta = (DefaultToSelf = "ActorRelativeToWhomAngleCalculated", Keywords = "UnrealHelperLibrary debug Development angle relative GetAngle RelativeTo", + AdvancedDisplay = "bDebug,DebugLifetime,DebugColor,bRelativeToActorBack")) + static float RelativeAngleToActor(AActor* ActorRelativeToWhomAngleCalculated, AActor* TargetActor, bool bRelativeToActorBack = false, const bool bDebug = false, const float DebugLifetime = -1, + const FLinearColor DebugColor = FLinearColor::White); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Angles", + meta = (DefaultToSelf = "ActorRelativeToWhomAngleCalculated", Keywords = "UnrealHelperLibrary debug Development angle relative GetAngle RelativeTo")) static float RelativeAngleToVector(AActor* ActorRelativeToWhomAngleCalculated, FVector TargetVector); UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Angles", meta = (Keywords = "UnrealHelperLibrary debug Development angle relative GetAngle RelativeTo")) static float RelativeAngleVectorToVector(FVector VectorRelativeToWhomAngleCalculated, FVector TargetVector); UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|Angles") static EUHLDirection GetOppositeDirection(EUHLDirection Direction_In); -/** ~Angles **/ - -/** Utils **/ - // Get project version from "Project Settings" - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary version")) - static FString GetProjectVersion(); - UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary debug Development")) - static TArray GetNamesOfComponentsOnObject(UObject* OwnerObject, UClass* Class); - - // return all assets of specified class in template - template - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils") - static void GetAssetsOfClass(TArray& OutArray) - { - FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked("AssetRegistry"); - TArray AssetData; - AssetRegistryModule.Get().GetAssetsByClass(T::StaticClass()->GetClassPathName(), AssetData); - for (int i = 0; i < AssetData.Num(); i++) { - T* Object = Cast(AssetData[i].GetAsset()); - OutArray.Add(Object); - } - } - - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils") - static UActorComponent* GetActorComponentByName(AActor* Actor, FString Name); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils") - static USceneComponent* GetSceneComponentByName(AActor* Actor, FString Name); - - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary bounds box extent")) - static FVector GetRandomPointInBox(const USceneComponent* Component, bool bOnGround, bool bDrawDebug = false, float DebugDrawTime = 5.0f); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary bounds box extent")) - static FVector GetHighestPointInBox(const USceneComponent* Component); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (DefaultToSelf = "ActorIn", AdvancedDisplay="bDebug,DebugLifetime,DebugColor")) - static void GetPointAtRelativeAngle(FVector& Point, FRotator& PointRotation, const AActor* ActorIn, const float Angle, const float Distance, const bool bDebug = false, const float DebugLifetime = -1, const FLinearColor DebugColor = FLinearColor::White); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (DefaultToSelf = "ActorIn", AdvancedDisplay="bDebug,DebugLifetime,DebugColor,DebugText")) - static void GetPointAtRelativeDirection(FVector& Point, FRotator& PointRotation, const AActor* ActorIn, const EUHLDirection Direction, const float Distance, const bool bDebug = false, const float DebugLifetime = -1, const FLinearColor DebugColor = FLinearColor::White, const FText DebugText = FText()); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (DefaultToSelf = "Actor1", AdvancedDisplay="bTakeZFromActor1,bDebug,DebugLifetime,DebugColor")) - static void GetPointAtAngleRelativeToOtherActor(FVector& Point, FRotator& PointRotation, const AActor* Actor1, const AActor* Actor2, const float Angle, const float Distance, const bool bTakeZFromActor1 = true, const bool bDebug = false, const float DebugLifetime = -1, const FLinearColor DebugColor = FLinearColor::White); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (DefaultToSelf = "Actor1", AdvancedDisplay="bTakeZFromActor1,bDebug,DebugLifetime,DebugColor")) - static void GetPointAtDirectionRelativeToOtherActor(FVector& Point, FRotator& PointRotation, const AActor* Actor1, const AActor* Actor2, const EUHLDirection Direction, const float Distance, const bool bTakeZFromActor1 = true, const bool bDebug = false, const float DebugLifetime = -1, const FLinearColor DebugColor = FLinearColor::White); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils") - static float DirectionToAngle(const EUHLDirection DirectionIn); - // e.g. 60% -> x0.4, 40% -> x0.6, 100% -> x0.0, 0% -> x1.0 - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils") - static float ConvertPercentToMultiplier(float Percent); - - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (WorldContext = "WorldContextObject", Keywords = "UnrealHelperLibrary preview editor")) - static bool IsPreviewWorld(UObject* WorldContextObject); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (WorldContext = "WorldContextObject", Keywords = "UnrealHelperLibrary preview editor")) - static bool IsGameWorld(UObject* WorldContextObject); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (WorldContext = "WorldContextObject", Keywords = "UnrealHelperLibrary preview editor")) - static bool IsEditorWorld(UObject* WorldContextObject); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary preview editor")) - static bool IsObjectInPreviewWorld(UObject* Object); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary preview editor")) - static bool IsObjectInEditorWorld(UObject* Object); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary game preview editor")) - static bool IsObjectInGameWorld(UObject* Object); - // TODO: ??? - // UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary") - // static EUHLDirection AngleToDirection(const float AngleIn); - - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Angles", meta = (DefaultToSelf = "Actor", Keywords = "UnrealHelperLibrary angle distance")) - static bool IsOtherActorInAngle(AActor* Actor, AActor* OtherActor, TArray Ranges); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Angles", meta = (DefaultToSelf = "Character", Keywords = "UnrealHelperLibrary angle distance")) - static bool IsOtherCharacterInRange(ACharacter* Character, ACharacter* OtherCharacter, FFloatRange Range, bool bIncludeSelfCapsuleRadius, bool bIncludeTargetCapsuleRadius); - - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary file path")) - static FString GetPathToFile(UObject* Object); - - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta=(Keywords = "UnrealHelperLibrary build debug")) - static bool IsDebugBuild(); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta=(Keywords = "UnrealHelperLibrary build debug development")) - static bool IsDevelopmentBuild(); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta=(Keywords = "UnrealHelperLibrary build debug production release shipping")) - static bool IsShippingBuild(); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta=(Keywords = "UnrealHelperLibrary build debug test")) - static bool IsTestBuild(); - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta=(Keywords = "UnrealHelperLibrary editor InEditor withEditor")) - static bool IsInEditor(); - // Are in Debug/Development/Shipping/Test build or Editor. If we WITH_EDITOR returns Editor, - // no matter what EBuildConfiguration is currently used(mostly WITH_EDITOR is Development) - // if real build returns - FApp::GetBuildConfiguration() result, except Debug and DebugGame are same "Debug" - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta=(Keywords = "UnrealHelperLibrary build debug test")) - static EUHLBuildType GetBuildType(); -/** ~Utils **/ - -/** AI **/ + /** ~Angles **/ + + /** Utils **/ + // Get project version from "Project Settings" + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary version")) + static FString GetProjectVersion(); + UFUNCTION(BlueprintCallable, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary debug Development")) + static TArray GetNamesOfComponentsOnObject(UObject* OwnerObject, UClass* Class); + + // return all assets of specified class in template + template + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils") + static void GetAssetsOfClass(TArray& OutArray) + { + FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked("AssetRegistry"); + TArray AssetData; + AssetRegistryModule.Get().GetAssetsByClass(T::StaticClass()->GetClassPathName(), AssetData); + for (int i = 0; i < AssetData.Num(); i++) + { + T* Object = Cast(AssetData[i].GetAsset()); + OutArray.Add(Object); + } + } + + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils") + static UActorComponent* GetActorComponentByName(AActor* Actor, FString Name); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils") + static USceneComponent* GetSceneComponentByName(AActor* Actor, FString Name); + + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary bounds box extent")) + static FVector GetRandomPointInBox(const USceneComponent* Component, bool bOnGround, bool bDrawDebug = false, float DebugDrawTime = 5.0f); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary bounds box extent")) + static FVector GetHighestPointInBox(const USceneComponent* Component); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (DefaultToSelf = "ActorIn", AdvancedDisplay = "bDebug,DebugLifetime,DebugColor")) + static void GetPointAtRelativeAngle(FVector& Point, FRotator& PointRotation, const AActor* ActorIn, const float Angle, const float Distance, const bool bDebug = false, + const float DebugLifetime = -1, const FLinearColor DebugColor = FLinearColor::White); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (DefaultToSelf = "ActorIn", AdvancedDisplay = "bDebug,DebugLifetime,DebugColor,DebugText")) + static void GetPointAtRelativeDirection(FVector& Point, FRotator& PointRotation, const AActor* ActorIn, const EUHLDirection Direction, const float Distance, const bool bDebug = false, + const float DebugLifetime = -1, const FLinearColor DebugColor = FLinearColor::White, const FText DebugText = FText()); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (DefaultToSelf = "Actor1", AdvancedDisplay = "bTakeZFromActor1,bDebug,DebugLifetime,DebugColor")) + static void GetPointAtAngleRelativeToOtherActor(FVector& Point, FRotator& PointRotation, const AActor* Actor1, const AActor* Actor2, const float Angle, const float Distance, + const bool bTakeZFromActor1 = true, const bool bDebug = false, const float DebugLifetime = -1, const FLinearColor DebugColor = FLinearColor::White); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (DefaultToSelf = "Actor1", AdvancedDisplay = "bTakeZFromActor1,bDebug,DebugLifetime,DebugColor")) + static void GetPointAtDirectionRelativeToOtherActor(FVector& Point, FRotator& PointRotation, const AActor* Actor1, const AActor* Actor2, const EUHLDirection Direction, const float Distance, + const bool bTakeZFromActor1 = true, const bool bDebug = false, const float DebugLifetime = -1, const FLinearColor DebugColor = FLinearColor::White); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils") + static float DirectionToAngle(const EUHLDirection DirectionIn); + // e.g. 60% -> x0.4, 40% -> x0.6, 100% -> x0.0, 0% -> x1.0 + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils") + static float ConvertPercentToMultiplier(float Percent); + + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (WorldContext = "WorldContextObject", Keywords = "UnrealHelperLibrary preview editor")) + static bool IsPreviewWorld(UObject* WorldContextObject); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (WorldContext = "WorldContextObject", Keywords = "UnrealHelperLibrary preview editor")) + static bool IsGameWorld(UObject* WorldContextObject); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (WorldContext = "WorldContextObject", Keywords = "UnrealHelperLibrary preview editor")) + static bool IsEditorWorld(UObject* WorldContextObject); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary preview editor")) + static bool IsObjectInPreviewWorld(UObject* Object); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary preview editor")) + static bool IsObjectInEditorWorld(UObject* Object); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary game preview editor")) + static bool IsObjectInGameWorld(UObject* Object); + // TODO: ??? + // UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary") + // static EUHLDirection AngleToDirection(const float AngleIn); + + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Angles", meta = (DefaultToSelf = "Actor", Keywords = "UnrealHelperLibrary angle distance")) + static bool IsOtherActorInAngle(AActor* Actor, AActor* OtherActor, TArray Ranges); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Angles", meta = (DefaultToSelf = "Character", Keywords = "UnrealHelperLibrary angle distance")) + static bool IsOtherCharacterInRange(ACharacter* Character, ACharacter* OtherCharacter, FFloatRange Range, bool bIncludeSelfCapsuleRadius, bool bIncludeTargetCapsuleRadius); + + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary file path")) + static FString GetPathToFile(UObject* Object); + + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary build debug")) + static bool IsDebugBuild(); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary build debug development")) + static bool IsDevelopmentBuild(); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary build debug production release shipping")) + static bool IsShippingBuild(); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary build debug test")) + static bool IsTestBuild(); + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary editor InEditor withEditor")) + static bool IsInEditor(); + // Are in Debug/Development/Shipping/Test build or Editor. If we WITH_EDITOR returns Editor, + // no matter what EBuildConfiguration is currently used(mostly WITH_EDITOR is Development) + // if real build returns - FApp::GetBuildConfiguration() result, except Debug and DebugGame are same "Debug" + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Utils", meta = (Keywords = "UnrealHelperLibrary build debug test")) + static EUHLBuildType GetBuildType(); + /** ~Utils **/ + + /** AI **/ static EBBValueType BlackboardKeyToBBValueType(FBlackboardKeySelector BlackboardKey); -/** ~AI **/ + /** ~AI **/ -/** Colors **/ + /** Colors **/ // "Makes a random but quite nice color" - literally C++ FColor::MakeRandomColor // if seed >= 0 than FColor::MakeRandomSeededColor will be used - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Colors", meta=(Keywords = "UnrealHelperLibrary color random", AdvancedDisplay="Seed")) + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Colors", meta = (Keywords = "UnrealHelperLibrary color random", AdvancedDisplay = "Seed")) static FColor RandomColor(int32 Seed = -1); // "Makes a random but quite nice color" - literally C++ FLinearColor::MakeRandomColor // if seed >= 0 than FLinearColor::MakeRandomSeededColor will be used - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Colors", meta=(Keywords = "UnrealHelperLibrary color random", AdvancedDisplay="Seed")) + UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Colors", meta = (Keywords = "UnrealHelperLibrary color random", AdvancedDisplay = "Seed")) static FLinearColor RandomLinearColor(int32 Seed = -1); -/** ~Colors **/ + /** ~Colors **/ -/** DebugSubsystem **/ - UFUNCTION(BlueprintPure, Category = "UnrealHelperLibrary|Debug", meta = (Categories = "UHL.DebugCategory,DebugCategory", WorldContext = "WorldContextObject", Keywords = "UnrealHelperLibrary debug")) - static bool IsUHLDebugCategoryEnabled(UObject* WorldContextObject, FGameplayTag DebugCategoryGameplayTag); -/** ~DebugSubsystem **/ + /** DebugSubsystem **/ + UFUNCTION( + BlueprintPure, Category = "UnrealHelperLibrary|Debug", meta = (Categories = "UHL.DebugCategory,DebugCategory", WorldContext = "WorldContextObject", Keywords = "UnrealHelperLibrary debug")) + static bool IsUHLDebugCategoryEnabled(UObject* WorldContextObject, FGameplayTag DebugCategoryGameplayTag); + /** ~DebugSubsystem **/ }; - - - From c380d9da6559f1384f8f9717484c3604eaebb334 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Mon, 21 Oct 2024 14:02:40 +0300 Subject: [PATCH 22/70] Update FilterPlugin.ini --- Config/FilterPlugin.ini | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Config/FilterPlugin.ini b/Config/FilterPlugin.ini index ccebca2..9c78e11 100644 --- a/Config/FilterPlugin.ini +++ b/Config/FilterPlugin.ini @@ -6,3 +6,6 @@ ; /README.txt ; /Extras/... ; /Binaries/ThirdParty/*.dll + +/README.md +/Config/... \ No newline at end of file From 6369f25d923dce214b86ef7dd723dde37146013c Mon Sep 17 00:00:00 2001 From: Ciberus Date: Mon, 21 Oct 2024 22:58:44 +0300 Subject: [PATCH 23/70] fixes for FAB release --- Content/Tools/EUW_UHL_Utils.uasset | Bin 212683 -> 134987 bytes .../Public/AI/Composite/BTC_RandomSelector.h | 3 +++ .../Public/AI/Decorators/BTD_Base.h | 1 + .../Public/AI/Services/BTS_GameplayFocus.h | 3 +++ UnrealHelperLibrary.uplugin | 11 +++++++++++ 5 files changed, 18 insertions(+) diff --git a/Content/Tools/EUW_UHL_Utils.uasset b/Content/Tools/EUW_UHL_Utils.uasset index 4104eb3e0f5a4b60d1a73a65011a8c79bd1498c4..c5a750f2b95dea322fe3473cc846c18b07c9ddac 100644 GIT binary patch literal 134987 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 sp&7`DxtWJf7jiCQLn0;@jee-?uwfSb=X4A?0 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

-6QH$(q_uOs4K1z!*B-OVMjUAca+KpBwV;d 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ņhA7zvCB1p+4@B0^p{W052ib2p9oUZh-R{?JI~ zMXo-s{;p!5W=&j0er{f3FHbjDe-B@=M^k?nACaF(0RQqp5DLyqSvYnl*82>M8aVxp+47bMbR`XPTum5T`2WW*KS>&mXHDqFLu_haW5R z=&tf*-Yjh|yiN$`rt;;vFJ#gLQ+gdsIib-|b-pB;)hvbA2_+fB^T%q3*dyyT_+5?i zG2IrP;%H$ni(ym&f6#i-cMpMM7#s<3@OErMNURJ8hI*Pv`>Xx0r3{i^-ONjP?8$kxW$I+cuP6lUpLy%U53M?lcImt0D5}OWKu!` zetC;wuO?!CnZ!wON=jf*^NJZ`nPLW6rkMUl7o&olyt2XO)su}S8!krsOv5X2gT$5N z631JN+7OQexy4wLMj?9>v2@5;9u5q7x?}uT0T@bYqCCC7){TFLnfR*s3KGw- zC9Gg$?6$MnbBrFd=U4{zo*3|)Et9!UgkPpc966U}Ah?n9e~MnRIQPSRvWB1g&B9eS zKX-ZdJ{ISG4X5kYPQXWzs7*MZhLdeo;iv{jbvUqZt_VjZI8Xp6Lc*ji%ax5l2&jfh zoE#Gfh4>3WTgwutVy^}h^niF49C(`z#Ms+O;lO|*(Ob@i<%#5KDJjTTZ`e>GWVR0zhYJ$%bHJ_1cDZnp3_d*f|nIrSHtf*wY*YNrz{L6X7j zTOThog@OOXmZ%1?7eWIzP)|58*uoJilSRNnuIMN&yJ$I`sL>83J|%OQFoF;~(S=0`XI{I?6#hD;Z%Y znNks>)>ehpi{$;KuttQDlnY!_WQMD0iOh(nq}5~(xBIAsq_O~|G$x$4E}r($UAc>G ziv1e~^m-1=nZ^s&Vb9SkIm)&_?UnJy)66cfbqJ;zFZ=} zJtF%tsc(BSywrLyIAjn?nFxu-)yX?#z-JBKVG)j*bwwsHuNWLN8&}L&L)4%WS)iDBZZTH?z>ud& zYXFFT3Im^lh%ga5R?LhKhlAjl1Vjnul8m;L$#CZsIC!-d zr-Y2tTBGZn3PnycROd*e>*Q5&Y*b!L!PeFjmwCmYvKUtkwkIz&*w7Xz2K7X@n7t|W i=goYwG_i4uAAdogh#pxt#9i_1Q0z!fJr@?l{Qn2!^}DSA diff --git a/Source/UnrealHelperLibrary/Public/AI/Composite/BTC_RandomSelector.h b/Source/UnrealHelperLibrary/Public/AI/Composite/BTC_RandomSelector.h index a4be644..9129c69 100644 --- a/Source/UnrealHelperLibrary/Public/AI/Composite/BTC_RandomSelector.h +++ b/Source/UnrealHelperLibrary/Public/AI/Composite/BTC_RandomSelector.h @@ -4,9 +4,12 @@ #include "CoreMinimal.h" #include "BehaviorTree/BTCompositeNode.h" +#include "BehaviorTree/BehaviorTreeTypes.h" #include "Misc/EngineVersionComparison.h" #include "BTC_RandomSelector.generated.h" +class UBehaviorTreeComponent; + struct FBTRandomSelectorMemory { }; diff --git a/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_Base.h b/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_Base.h index b15be97..3ba88ce 100644 --- a/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_Base.h +++ b/Source/UnrealHelperLibrary/Public/AI/Decorators/BTD_Base.h @@ -3,6 +3,7 @@ #pragma once #include "CoreMinimal.h" +#include "BehaviorTree/BehaviorTreeTypes.h" #include "BehaviorTree/BTDecorator.h" #include "BTD_Base.generated.h" diff --git a/Source/UnrealHelperLibrary/Public/AI/Services/BTS_GameplayFocus.h b/Source/UnrealHelperLibrary/Public/AI/Services/BTS_GameplayFocus.h index 83dcfb6..61b3626 100644 --- a/Source/UnrealHelperLibrary/Public/AI/Services/BTS_GameplayFocus.h +++ b/Source/UnrealHelperLibrary/Public/AI/Services/BTS_GameplayFocus.h @@ -4,9 +4,12 @@ #include "CoreMinimal.h" #include "Misc/EngineVersionComparison.h" +#include "BehaviorTree/BehaviorTreeTypes.h" #include "BehaviorTree/Services/BTService_DefaultFocus.h" #include "BTS_GameplayFocus.generated.h" +class UBehaviorTreeComponent; + /** * Prevents rotation jittering while moving to enemy * Requires to turned on "UseControllerDesiredRotation" diff --git a/UnrealHelperLibrary.uplugin b/UnrealHelperLibrary.uplugin index d225577..10c52d7 100644 --- a/UnrealHelperLibrary.uplugin +++ b/UnrealHelperLibrary.uplugin @@ -40,6 +40,17 @@ "Name": "GameplayAbilities", "Enabled": true }, + { + "Name": "DataRegistry", + "Enabled": true + }, + { + "Name": "GameplayTagsEditor", + "Enabled": true, + "TargetAllowList": [ + "Editor" + ] + }, { "Name": "EnhancedInput", "Enabled": true From b470968efce543bbc5538d3961eef175b2f1bfa5 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Mon, 21 Oct 2024 23:15:32 +0300 Subject: [PATCH 24/70] copyright --- .../Subsystems/DebugSubsystem/UHLDebugCategoryComponent.cpp | 5 ++++- .../Subsystems/DebugSubsystem/UHLDebugCategoryComponent.h | 4 +++- Source/UnrealHelperLibrary/UnrealHelperLibrary.Build.cs | 2 +- Source/UnrealHelperLibrary/UnrealHelperLibraryTypes.h | 4 +++- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/UHLDebugCategoryComponent.cpp b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/UHLDebugCategoryComponent.cpp index 51e912a..a506bfb 100644 --- a/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/UHLDebugCategoryComponent.cpp +++ b/Source/UnrealHelperLibrary/Private/Subsystems/DebugSubsystem/UHLDebugCategoryComponent.cpp @@ -1,4 +1,7 @@ -#include "Subsystems/DebugSubsystem/UHLDebugCategoryComponent.h" +// Copyright (c) 2024 Pavel Penkov + + +#include "Subsystems/DebugSubsystem/UHLDebugCategoryComponent.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(UHLDebugCategoryComponent) diff --git a/Source/UnrealHelperLibrary/Public/Subsystems/DebugSubsystem/UHLDebugCategoryComponent.h b/Source/UnrealHelperLibrary/Public/Subsystems/DebugSubsystem/UHLDebugCategoryComponent.h index 89c02f4..ce75bcc 100644 --- a/Source/UnrealHelperLibrary/Public/Subsystems/DebugSubsystem/UHLDebugCategoryComponent.h +++ b/Source/UnrealHelperLibrary/Public/Subsystems/DebugSubsystem/UHLDebugCategoryComponent.h @@ -1,4 +1,6 @@ -#pragma once +// Copyright (c) 2024 Pavel Penkov + +#pragma once #include "CoreMinimal.h" #include "UHLDebugCategoryComponent.generated.h" diff --git a/Source/UnrealHelperLibrary/UnrealHelperLibrary.Build.cs b/Source/UnrealHelperLibrary/UnrealHelperLibrary.Build.cs index 2b63f14..f0cc6f5 100644 --- a/Source/UnrealHelperLibrary/UnrealHelperLibrary.Build.cs +++ b/Source/UnrealHelperLibrary/UnrealHelperLibrary.Build.cs @@ -1,4 +1,4 @@ -// Some copyright should be here... +// Copyright (c) 2024 Pavel Penkov using UnrealBuildTool; diff --git a/Source/UnrealHelperLibrary/UnrealHelperLibraryTypes.h b/Source/UnrealHelperLibrary/UnrealHelperLibraryTypes.h index abc1695..3751ded 100644 --- a/Source/UnrealHelperLibrary/UnrealHelperLibraryTypes.h +++ b/Source/UnrealHelperLibrary/UnrealHelperLibraryTypes.h @@ -1,4 +1,6 @@ -#pragma once +// Copyright (c) 2024 Pavel Penkov + +#pragma once const FVector VECTOR_ERROR = FVector(404, 404, 404); const float FLOAT_ERROR = -99999.0f; From 53e81316b38558f99a9595891c9f9d32a6c5c593 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Tue, 22 Oct 2024 15:07:57 +0300 Subject: [PATCH 25/70] fixes for FAB release --- README.md | 2 -- .../Private/AI/Composite/BTC_RandomSelector.cpp | 3 +++ .../Private/AI/Services/BTS_GameplayFocus.cpp | 4 ++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 052e90f..9b03ec7 100644 --- a/README.md +++ b/README.md @@ -81,8 +81,6 @@ UHL consists of 3 modules: > - AnimNotifyState (ANS) > - [ANS_UHL_Base](#ans_uhl_base) > - [ANS_ActivateAbility](#ans_activateability) - - > - [AI](#ai) > - Components > - [AIPerceptionComponent](#uhlaiperceptioncomponent) diff --git a/Source/UnrealHelperLibrary/Private/AI/Composite/BTC_RandomSelector.cpp b/Source/UnrealHelperLibrary/Private/AI/Composite/BTC_RandomSelector.cpp index d4d7403..052e06e 100644 --- a/Source/UnrealHelperLibrary/Private/AI/Composite/BTC_RandomSelector.cpp +++ b/Source/UnrealHelperLibrary/Private/AI/Composite/BTC_RandomSelector.cpp @@ -4,6 +4,9 @@ #include "AI/Composite/BTC_RandomSelector.h" #include "BehaviorTree/BTTaskNode.h" +#include "BehaviorTree/BTCompositeNode.h" +#include "BehaviorTree/BehaviorTreeComponent.h" +#include "Misc/EngineVersionComparison.h" #include "Kismet/KismetMathLibrary.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(BTC_RandomSelector) diff --git a/Source/UnrealHelperLibrary/Private/AI/Services/BTS_GameplayFocus.cpp b/Source/UnrealHelperLibrary/Private/AI/Services/BTS_GameplayFocus.cpp index b320d00..d0fbbd6 100644 --- a/Source/UnrealHelperLibrary/Private/AI/Services/BTS_GameplayFocus.cpp +++ b/Source/UnrealHelperLibrary/Private/AI/Services/BTS_GameplayFocus.cpp @@ -3,6 +3,10 @@ #include "AI/Services/BTS_GameplayFocus.h" +#include "GameFramework/Actor.h" +#include "BehaviorTree/BlackboardComponent.h" +#include "BehaviorTree/BehaviorTreeComponent.h" +#include "BehaviorTree/BehaviorTreeTypes.h" #include "AIController.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(BTS_GameplayFocus) From 7895fef93975af9c6558eb7ef76a297fb29f11ad Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 16:37:17 +0300 Subject: [PATCH 26/70] 19 --- .github/workflows/test.yml | 111 ++++++++++++++++++++----------------- 1 file changed, 61 insertions(+), 50 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f3b2ddb..22a9e51 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,64 +42,75 @@ jobs: build: runs-on: self-hosted # runs-on: ubuntu-latest - # container: - # image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4 - # credentials: - # username: ${{ github.actor }} - # password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} + container: + image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4 + credentials: + username: ${{ github.actor }} + password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} # needs: clean-up-space steps: - - name: Check out UE5.4 project - uses: actions/checkout@v3 - with: - repository: Ciberusps/UE_5_4_Blueprint - path: UE_5_4_Blueprint + # - name: Check out UE5.4 project + # uses: actions/checkout@v3 + # with: + # repository: Ciberusps/UE_5_4_Blueprint + # path: UE_5_4_Blueprint # - name: Check out UE5.4 project # shell: bash # run: | # ls - # - name: Check out UnrealHelperLibrary to Plugins folder - # uses: actions/checkout@v3 - # with: - # # path: UE_5_4_Blueprint/Plugins/UnrealHelperLibrary - # path: UnrealHelperLibrary - # - name: Build Plugins (UHL) - # shell: powershell - # run: | - # mkdir "Temp" - # $pluginPath = Resolve-Path -Path "UE_5_4_Blueprint/Plugins/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" - # $tempDirAbsolutePath = Resolve-Path -Path "Temp" - # "S:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat BuildPlugin -plugin="$pluginPath" -package="$tempDirAbsolutePath"" - - - name: Build project - uses: OrchidIsle/UE5-Build-Project@latest - with: - # RUNUAT_PATH: 'S:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat' - # UE folder in epic provided container - /home/ue4/UnrealEngine/Engine/Binaries - RUNUAT_PATH: 'home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT' - UPROJECT_PATH: ${{ github.workspace }}/UE_5_4_Blueprint/UE_5_4_Blueprint.uproject - BUILD_CONFIG: Development - PLATFORM: Win64 - CLEAN: true - COOK: true - STAGE: true - PACKAGE: true - PAK: true - SERVER: false - ARCHIVE: false - ARCHIVE_PATH: 'C:/Archives/MyGame' - NULLRHI: true - EDITOR: true - ENCRYPT_INI: true - # RELEASE: '1.0.0' - # PATCH: '0.9.0' - # MAPS: 'Map1,Map2' - DELETE_PDB: true - # ANTICHEAT_ENABLED: true - # ANTICHEAT_PRIVATE_KEY: 'base64encodedprivatekey' - # ANTICHEAT_PUBLIC_CERT: 'base64encodedpubliccert' + + - name: Check out UnrealHelperLibrary to Plugins folder + uses: actions/checkout@v3 + with: + path: UnrealHelperLibrary + + - name: Build Plugins (UHL) + shell: sh + run: | + "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" + + # - name: Check out UnrealHelperLibrary to Plugins folder + # uses: actions/checkout@v3 + # with: + # # path: UE_5_4_Blueprint/Plugins/UnrealHelperLibrary + # path: UnrealHelperLibrary + # - name: Build Plugins (UHL) + # shell: powershell + # run: | + # mkdir "Temp" + # $pluginPath = Resolve-Path -Path "UE_5_4_Blueprint/Plugins/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" + # $tempDirAbsolutePath = Resolve-Path -Path "Temp" + # "S:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat BuildPlugin -plugin="$pluginPath" -package="$tempDirAbsolutePath"" + + # - name: Build project + # uses: OrchidIsle/UE5-Build-Project@latest + # with: + # # RUNUAT_PATH: 'S:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat' + # # UE folder in epic provided container - /home/ue4/UnrealEngine/Engine/Binaries + # RUNUAT_PATH: 'home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT' + # UPROJECT_PATH: ${{ github.workspace }}/UE_5_4_Blueprint/UE_5_4_Blueprint.uproject + # BUILD_CONFIG: Development + # PLATFORM: Win64 + # CLEAN: true + # COOK: true + # STAGE: true + # PACKAGE: true + # PAK: true + # SERVER: false + # ARCHIVE: false + # ARCHIVE_PATH: 'C:/Archives/MyGame' + # NULLRHI: true + # EDITOR: true + # ENCRYPT_INI: true + # # RELEASE: '1.0.0' + # # PATCH: '0.9.0' + # # MAPS: 'Map1,Map2' + # DELETE_PDB: true + # # ANTICHEAT_ENABLED: true + # # ANTICHEAT_PRIVATE_KEY: 'base64encodedprivatekey' + # # ANTICHEAT_PUBLIC_CERT: 'base64encodedpubliccert' From 9068ec97df5c104266cf436a84904f5ee976ae15 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 16:40:11 +0300 Subject: [PATCH 27/70] 20 --- .github/workflows/test.yml | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 22a9e51..47f213a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -39,7 +39,8 @@ jobs: # # root-reserve-mb: 512 # # swap-size-mb: 1024 # remove-dotnet: 'true' - build: + + build-plugins: runs-on: self-hosted # runs-on: ubuntu-latest container: @@ -47,9 +48,28 @@ jobs: credentials: username: ${{ github.actor }} password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} - # needs: clean-up-space - steps: + - name: Check out UnrealHelperLibrary to Plugins folder + uses: actions/checkout@v3 + with: + path: UnrealHelperLibrary + + - name: Build Plugins (UHL) + shell: sh + run: | + "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" + +# build: +# runs-on: self-hosted +# # runs-on: ubuntu-latest +# container: +# image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4 +# credentials: +# username: ${{ github.actor }} +# password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} +# # needs: clean-up-space + +# steps: # - name: Check out UE5.4 project # uses: actions/checkout@v3 # with: @@ -60,16 +80,6 @@ jobs: # shell: bash # run: | # ls - - - name: Check out UnrealHelperLibrary to Plugins folder - uses: actions/checkout@v3 - with: - path: UnrealHelperLibrary - - - name: Build Plugins (UHL) - shell: sh - run: | - "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" # - name: Check out UnrealHelperLibrary to Plugins folder # uses: actions/checkout@v3 From ade935745c29ae72e7cedc55765478f0450cf2d6 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 16:41:11 +0300 Subject: [PATCH 28/70] 21 --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 47f213a..d8d3c5c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,9 +12,9 @@ on: # STEAMWORKS_SDK_GOOGLE_DRIVE_LINK: ${{ secrets.STEAMWORKS_SDK_GOOGLE_DRIVE_LINK }} jobs: -# clean-up-space: -# runs-on: ubuntu-latest -# steps: + # clean-up-space: + # runs-on: ubuntu-latest + # steps: # Works better # - name: Free Disk Space (Ubuntu) # uses: jlumbroso/free-disk-space@main From f8e79b9c0764fa29bda0eff9784a5a072f51b152 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 16:41:56 +0300 Subject: [PATCH 29/70] 22 --- .github/workflows/test.yml | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d8d3c5c..946188b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,24 +40,23 @@ jobs: # # swap-size-mb: 1024 # remove-dotnet: 'true' - build-plugins: - runs-on: self-hosted - # runs-on: ubuntu-latest - container: - image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4 - credentials: - username: ${{ github.actor }} - password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} - steps: - - name: Check out UnrealHelperLibrary to Plugins folder - uses: actions/checkout@v3 - with: - path: UnrealHelperLibrary - - - name: Build Plugins (UHL) - shell: sh - run: | - "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" + build-plugins: + runs-on: self-hosted + container: + image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4 + credentials: + username: ${{ github.actor }} + password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} + steps: + - name: Check out UnrealHelperLibrary to Plugins folder + uses: actions/checkout@v3 + with: + path: UnrealHelperLibrary + + - name: Build Plugins (UHL) + shell: sh + run: | + "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" # build: # runs-on: self-hosted From 752c7eb9873fb67656e63703a117d382320b2d83 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 16:42:49 +0300 Subject: [PATCH 30/70] 23 --- .github/workflows/test.yml | 56 ++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 946188b..76a4595 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,34 +12,6 @@ on: # STEAMWORKS_SDK_GOOGLE_DRIVE_LINK: ${{ secrets.STEAMWORKS_SDK_GOOGLE_DRIVE_LINK }} jobs: - # clean-up-space: - # runs-on: ubuntu-latest - # steps: - # Works better - # - name: Free Disk Space (Ubuntu) - # uses: jlumbroso/free-disk-space@main - # with: - # # this might remove tools that are actually needed, - # # if set to "true" but frees about 6 GB - # tool-cache: false - - # # all of these default to true, but feel free to set to - # # "false" if necessary for your workflow - # android: true - # dotnet: true - # haskell: true - # large-packages: true - # docker-images: false - # swap-storage: true - - # # free some space - # - name: Maximize build space - # uses: easimon/maximize-build-space@master - # with: - # # root-reserve-mb: 512 - # # swap-size-mb: 1024 - # remove-dotnet: 'true' - build-plugins: runs-on: self-hosted container: @@ -57,7 +29,33 @@ jobs: shell: sh run: | "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" - +# clean-up-space: +# runs-on: ubuntu-latest +# steps: +# Works better +# - name: Free Disk Space (Ubuntu) +# uses: jlumbroso/free-disk-space@main +# with: +# # this might remove tools that are actually needed, +# # if set to "true" but frees about 6 GB +# tool-cache: false + +# # all of these default to true, but feel free to set to +# # "false" if necessary for your workflow +# android: true +# dotnet: true +# haskell: true +# large-packages: true +# docker-images: false +# swap-storage: true + +# # free some space +# - name: Maximize build space +# uses: easimon/maximize-build-space@master +# with: +# # root-reserve-mb: 512 +# # swap-size-mb: 1024 +# remove-dotnet: 'true' # build: # runs-on: self-hosted # # runs-on: ubuntu-latest From 0f03e48a1f2bcc13ec00691d2e08e6ef0763e138 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 16:43:22 +0300 Subject: [PATCH 31/70] 24 --- .github/workflows/test.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 76a4595..f0bf561 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -39,7 +39,6 @@ jobs: # # this might remove tools that are actually needed, # # if set to "true" but frees about 6 GB # tool-cache: false - # # all of these default to true, but feel free to set to # # "false" if necessary for your workflow # android: true @@ -48,7 +47,6 @@ jobs: # large-packages: true # docker-images: false # swap-storage: true - # # free some space # - name: Maximize build space # uses: easimon/maximize-build-space@master @@ -65,7 +63,6 @@ jobs: # username: ${{ github.actor }} # password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} # # needs: clean-up-space - # steps: # - name: Check out UE5.4 project # uses: actions/checkout@v3 @@ -77,7 +74,6 @@ jobs: # shell: bash # run: | # ls - # - name: Check out UnrealHelperLibrary to Plugins folder # uses: actions/checkout@v3 # with: @@ -90,7 +86,6 @@ jobs: # $pluginPath = Resolve-Path -Path "UE_5_4_Blueprint/Plugins/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" # $tempDirAbsolutePath = Resolve-Path -Path "Temp" # "S:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat BuildPlugin -plugin="$pluginPath" -package="$tempDirAbsolutePath"" - # - name: Build project # uses: OrchidIsle/UE5-Build-Project@latest # with: From 2a86871347ad5c4b1ec39995f9a3ee59eba5b7b1 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 16:44:26 +0300 Subject: [PATCH 32/70] 25 --- .github/workflows/test.yml | 107 ++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 54 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f0bf561..0f2be62 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -64,55 +64,54 @@ jobs: # password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} # # needs: clean-up-space # steps: - # - name: Check out UE5.4 project - # uses: actions/checkout@v3 - # with: - # repository: Ciberusps/UE_5_4_Blueprint - # path: UE_5_4_Blueprint - - # - name: Check out UE5.4 project - # shell: bash - # run: | - # ls - # - name: Check out UnrealHelperLibrary to Plugins folder - # uses: actions/checkout@v3 - # with: - # # path: UE_5_4_Blueprint/Plugins/UnrealHelperLibrary - # path: UnrealHelperLibrary - # - name: Build Plugins (UHL) - # shell: powershell - # run: | - # mkdir "Temp" - # $pluginPath = Resolve-Path -Path "UE_5_4_Blueprint/Plugins/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" - # $tempDirAbsolutePath = Resolve-Path -Path "Temp" - # "S:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat BuildPlugin -plugin="$pluginPath" -package="$tempDirAbsolutePath"" - # - name: Build project - # uses: OrchidIsle/UE5-Build-Project@latest - # with: - # # RUNUAT_PATH: 'S:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat' - # # UE folder in epic provided container - /home/ue4/UnrealEngine/Engine/Binaries - # RUNUAT_PATH: 'home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT' - # UPROJECT_PATH: ${{ github.workspace }}/UE_5_4_Blueprint/UE_5_4_Blueprint.uproject - # BUILD_CONFIG: Development - # PLATFORM: Win64 - # CLEAN: true - # COOK: true - # STAGE: true - # PACKAGE: true - # PAK: true - # SERVER: false - # ARCHIVE: false - # ARCHIVE_PATH: 'C:/Archives/MyGame' - # NULLRHI: true - # EDITOR: true - # ENCRYPT_INI: true - # # RELEASE: '1.0.0' - # # PATCH: '0.9.0' - # # MAPS: 'Map1,Map2' - # DELETE_PDB: true - # # ANTICHEAT_ENABLED: true - # # ANTICHEAT_PRIVATE_KEY: 'base64encodedprivatekey' - # # ANTICHEAT_PUBLIC_CERT: 'base64encodedpubliccert' +# - name: Check out UE5.4 project +# uses: actions/checkout@v3 +# with: +# repository: Ciberusps/UE_5_4_Blueprint +# path: UE_5_4_Blueprint +# - name: Check out UE5.4 project +# shell: bash +# run: | +# ls +# - name: Check out UnrealHelperLibrary to Plugins folder +# uses: actions/checkout@v3 +# with: +# # path: UE_5_4_Blueprint/Plugins/UnrealHelperLibrary +# path: UnrealHelperLibrary +# - name: Build Plugins (UHL) +# shell: powershell +# run: | +# mkdir "Temp" +# $pluginPath = Resolve-Path -Path "UE_5_4_Blueprint/Plugins/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" +# $tempDirAbsolutePath = Resolve-Path -Path "Temp" +# "S:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat BuildPlugin -plugin="$pluginPath" -package="$tempDirAbsolutePath"" +# - name: Build project +# uses: OrchidIsle/UE5-Build-Project@latest +# with: +# # RUNUAT_PATH: 'S:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat' +# # UE folder in epic provided container - /home/ue4/UnrealEngine/Engine/Binaries +# RUNUAT_PATH: 'home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT' +# UPROJECT_PATH: ${{ github.workspace }}/UE_5_4_Blueprint/UE_5_4_Blueprint.uproject +# BUILD_CONFIG: Development +# PLATFORM: Win64 +# CLEAN: true +# COOK: true +# STAGE: true +# PACKAGE: true +# PAK: true +# SERVER: false +# ARCHIVE: false +# ARCHIVE_PATH: 'C:/Archives/MyGame' +# NULLRHI: true +# EDITOR: true +# ENCRYPT_INI: true +# # RELEASE: '1.0.0' +# # PATCH: '0.9.0' +# # MAPS: 'Map1,Map2' +# DELETE_PDB: true +# # ANTICHEAT_ENABLED: true +# # ANTICHEAT_PRIVATE_KEY: 'base64encodedprivatekey' +# # ANTICHEAT_PUBLIC_CERT: 'base64encodedpubliccert' @@ -120,11 +119,11 @@ jobs: - # lint: - # runs-on: self-hosted - # steps: - # - name: Check out Git repository - # uses: actions/checkout@v3 +# lint: +# runs-on: self-hosted +# steps: +# - name: Check out Git repository +# uses: actions/checkout@v3 # lint-prettier: # runs-on: ubuntu-latest From 6308b4d3788e03906f37637fa3747e295153bfc0 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 16:45:52 +0300 Subject: [PATCH 33/70] 26 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0f2be62..9a2b882 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,7 @@ on: jobs: build-plugins: - runs-on: self-hosted + runs-on: ubuntu-latest container: image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4 credentials: From 9b6e4ce89f85d7138bc77321cacbd930777dc844 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 16:54:06 +0300 Subject: [PATCH 34/70] 27 --- .github/workflows/test.yml | 44 +++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9a2b882..7f8c808 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,21 +14,45 @@ on: jobs: build-plugins: runs-on: ubuntu-latest - container: - image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4 - credentials: - username: ${{ github.actor }} - password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} + # container: + # image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4 + # credentials: + # username: ${{ github.actor }} + # password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} steps: + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + # this might remove tools that are actually needed, + # if set to "true" but frees about 6 GB + tool-cache: false + # all of these default to true, but feel free to set to + # "false" if necessary for your workflow + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: false + swap-storage: true - name: Check out UnrealHelperLibrary to Plugins folder uses: actions/checkout@v3 with: path: UnrealHelperLibrary - - - name: Build Plugins (UHL) - shell: sh - run: | - "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" + - uses: addnab/docker-run-action@v3 + with: + username: ${{ github.actor }} + password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} + registry: ghcr.io + image: epicgames/unreal-engine:dev-slim-5.4 + options: -v ${{ github.workspace }}:/work -e ABC=123 + run: | + echo "Running Script" + ls + "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" + # - name: Build Plugins (UHL) + # shell: sh + # run: | + # "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" # clean-up-space: # runs-on: ubuntu-latest # steps: From 3d1e4fea0dce69ddf9247b5d13c2d6c984e13ef8 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 16:55:57 +0300 Subject: [PATCH 35/70] 28 --- .github/workflows/test.yml | 77 ++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 41 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7f8c808..fe46710 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,47 +12,42 @@ on: # STEAMWORKS_SDK_GOOGLE_DRIVE_LINK: ${{ secrets.STEAMWORKS_SDK_GOOGLE_DRIVE_LINK }} jobs: - build-plugins: - runs-on: ubuntu-latest - # container: - # image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4 - # credentials: - # username: ${{ github.actor }} - # password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@main - with: - # this might remove tools that are actually needed, - # if set to "true" but frees about 6 GB - tool-cache: false - # all of these default to true, but feel free to set to - # "false" if necessary for your workflow - android: true - dotnet: true - haskell: true - large-packages: true - docker-images: false - swap-storage: true - - name: Check out UnrealHelperLibrary to Plugins folder - uses: actions/checkout@v3 - with: - path: UnrealHelperLibrary - - uses: addnab/docker-run-action@v3 - with: - username: ${{ github.actor }} - password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} - registry: ghcr.io - image: epicgames/unreal-engine:dev-slim-5.4 - options: -v ${{ github.workspace }}:/work -e ABC=123 - run: | - echo "Running Script" - ls - "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" - # - name: Build Plugins (UHL) - # shell: sh - # run: | - # "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" + build-plugins: + runs-on: ubuntu-latest + steps: + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + # this might remove tools that are actually needed, + # if set to "true" but frees about 6 GB + tool-cache: false + # all of these default to true, but feel free to set to + # "false" if necessary for your workflow + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: false + swap-storage: true + - name: Check out UnrealHelperLibrary to Plugins folder + uses: actions/checkout@v3 + with: + path: UnrealHelperLibrary + - uses: addnab/docker-run-action@v3 + with: + username: ${{ github.actor }} + password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} + registry: ghcr.io + image: epicgames/unreal-engine:dev-slim-5.4 + options: -v ${{ github.workspace }}:/work -e ABC=123 + run: | + echo "Running Script" + ls + "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" + # - name: Build Plugins (UHL) + # shell: sh + # run: | + # "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" # clean-up-space: # runs-on: ubuntu-latest # steps: From 6e4d6fdb9a55711b6b9793fad75b4f5df135747d Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 16:56:29 +0300 Subject: [PATCH 36/70] 29 --- .github/workflows/test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fe46710..c254d70 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -44,10 +44,10 @@ jobs: echo "Running Script" ls "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" - # - name: Build Plugins (UHL) - # shell: sh - # run: | - # "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" +# - name: Build Plugins (UHL) +# shell: sh +# run: | +# "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" # clean-up-space: # runs-on: ubuntu-latest # steps: From 2191a433554dfe4d91dff3ae1d06ac2da32aa80c Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 17:03:47 +0300 Subject: [PATCH 37/70] 30 --- .github/workflows/test.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c254d70..d4bad20 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,7 +24,7 @@ jobs: # all of these default to true, but feel free to set to # "false" if necessary for your workflow android: true - dotnet: true + # dotnet: true haskell: true large-packages: true docker-images: false @@ -33,6 +33,9 @@ jobs: uses: actions/checkout@v3 with: path: UnrealHelperLibrary + - name: + run: | + echo ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin - uses: addnab/docker-run-action@v3 with: username: ${{ github.actor }} From fcfeb348284f10e3f15a04f8a43f17ebd607bfe1 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 17:09:36 +0300 Subject: [PATCH 38/70] 31 --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d4bad20..698a503 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,6 +36,7 @@ jobs: - name: run: | echo ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin + docker pull ghcr.io/epicgames/unreal-engine:dev-slim-5.4 - uses: addnab/docker-run-action@v3 with: username: ${{ github.actor }} From 496ad6e5906bd32aefdd9731b5801c49f1e51f1c Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 17:18:59 +0300 Subject: [PATCH 39/70] 32 --- .github/workflows/test.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 698a503..ebc613e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,9 +24,9 @@ jobs: # all of these default to true, but feel free to set to # "false" if necessary for your workflow android: true - # dotnet: true + dotnet: false haskell: true - large-packages: true + large-packages: false docker-images: false swap-storage: true - name: Check out UnrealHelperLibrary to Plugins folder @@ -35,6 +35,7 @@ jobs: path: UnrealHelperLibrary - name: run: | + lsof | grep deleted echo ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin docker pull ghcr.io/epicgames/unreal-engine:dev-slim-5.4 - uses: addnab/docker-run-action@v3 From 7bb97e23c0f1f558d597eb75826b47817cf0264e Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 17:22:29 +0300 Subject: [PATCH 40/70] 33 --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ebc613e..7c4c434 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,13 +20,13 @@ jobs: with: # this might remove tools that are actually needed, # if set to "true" but frees about 6 GB - tool-cache: false + tool-cache: true # all of these default to true, but feel free to set to # "false" if necessary for your workflow android: true - dotnet: false + dotnet: true haskell: true - large-packages: false + large-packages: true docker-images: false swap-storage: true - name: Check out UnrealHelperLibrary to Plugins folder From 88634b90ecf9c749489aa8320965048cf39f8d71 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 17:27:16 +0300 Subject: [PATCH 41/70] 34 --- .github/workflows/test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7c4c434..0213bf5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -35,7 +35,6 @@ jobs: path: UnrealHelperLibrary - name: run: | - lsof | grep deleted echo ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin docker pull ghcr.io/epicgames/unreal-engine:dev-slim-5.4 - uses: addnab/docker-run-action@v3 From 7d2e13cdc8b34044862a0915f68f1ef05ddcc58b Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 17:42:07 +0300 Subject: [PATCH 42/70] 35 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0213bf5..28b4dcb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,7 +42,7 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} registry: ghcr.io - image: epicgames/unreal-engine:dev-slim-5.4 + image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4 options: -v ${{ github.workspace }}:/work -e ABC=123 run: | echo "Running Script" From 20c680605bda6fc01fe0e18c4de01bec06650b55 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 17:54:35 +0300 Subject: [PATCH 43/70] 36 --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 28b4dcb..87b9dcd 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -46,8 +46,8 @@ jobs: options: -v ${{ github.workspace }}:/work -e ABC=123 run: | echo "Running Script" - ls - "home/ue4/UnrealEngine/Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" + ls -R + "Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" # - name: Build Plugins (UHL) # shell: sh # run: | From 3b8100da79261ce30897c5d39e74b6abed76aa4e Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 18:29:06 +0300 Subject: [PATCH 44/70] 37 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 87b9dcd..2ecbb44 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -47,7 +47,7 @@ jobs: run: | echo "Running Script" ls -R - "Engine/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" + "./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" # - name: Build Plugins (UHL) # shell: sh # run: | From 9ec1e739769d7654fa0e85b7f4ebf1063b133d8f Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 18:46:33 +0300 Subject: [PATCH 45/70] 38 --- .github/workflows/test.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2ecbb44..5537b13 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -46,8 +46,7 @@ jobs: options: -v ${{ github.workspace }}:/work -e ABC=123 run: | echo "Running Script" - ls -R - "./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" + "./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" # - name: Build Plugins (UHL) # shell: sh # run: | From 495af45e1b9d84b1e4662802b427e6126c8c0f40 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 19:05:46 +0300 Subject: [PATCH 46/70] 39 --- .github/workflows/test.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5537b13..2cb8762 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -46,7 +46,11 @@ jobs: options: -v ${{ github.workspace }}:/work -e ABC=123 run: | echo "Running Script" - "./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/Result"" + mkdir "Result" + test -e "./Engine/Build/BatchFiles/RunUAT.sh" && echo file exists || echo file not found + test -e "${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found + test -e "${{ github.workspace }}/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found + "./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/UnrealHelperLibrary/Result"" # - name: Build Plugins (UHL) # shell: sh # run: | From 784b84423d22025386bfd145e7f63de2a67c7194 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 19:19:45 +0300 Subject: [PATCH 47/70] 40 --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2cb8762..5841493 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -48,9 +48,9 @@ jobs: echo "Running Script" mkdir "Result" test -e "./Engine/Build/BatchFiles/RunUAT.sh" && echo file exists || echo file not found - test -e "${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found - test -e "${{ github.workspace }}/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found - "./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="${{ github.workspace }}/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="${{ github.workspace }}/UnrealHelperLibrary/Result"" + test -e "/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found + test -e "/work/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found + "./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="/work/Result"" # - name: Build Plugins (UHL) # shell: sh # run: | From 723700136da0b13f74fddc777c7d073dd57acf84 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 19:32:27 +0300 Subject: [PATCH 48/70] 41 --- .github/workflows/test.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5841493..2b836fe 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -46,10 +46,12 @@ jobs: options: -v ${{ github.workspace }}:/work -e ABC=123 run: | echo "Running Script" - mkdir "Result" + mkdir -p "Result" + mkdir -p "/work/Result" test -e "./Engine/Build/BatchFiles/RunUAT.sh" && echo file exists || echo file not found test -e "/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found - test -e "/work/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found + test -e "/work/Result" && echo file exists || echo file not found + test -e "Result" && echo file exists || echo file not found "./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="/work/Result"" # - name: Build Plugins (UHL) # shell: sh From c5c43d6f6af267419256457b2a9ec4f2b2577434 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 19:44:23 +0300 Subject: [PATCH 49/70] 42 --- .github/workflows/test.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2b836fe..cc1f24f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -47,12 +47,11 @@ jobs: run: | echo "Running Script" mkdir -p "Result" - mkdir -p "/work/Result" test -e "./Engine/Build/BatchFiles/RunUAT.sh" && echo file exists || echo file not found test -e "/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found test -e "/work/Result" && echo file exists || echo file not found test -e "Result" && echo file exists || echo file not found - "./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="/work/Result"" + "./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="./Result"" # - name: Build Plugins (UHL) # shell: sh # run: | From 0fb921e65a5eea23c2a4bc7ab3a991e652da0c6f Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 19:53:56 +0300 Subject: [PATCH 50/70] 43 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cc1f24f..654aa3c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -51,7 +51,7 @@ jobs: test -e "/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found test -e "/work/Result" && echo file exists || echo file not found test -e "Result" && echo file exists || echo file not found - "./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="./Result"" + "/work/Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="./Result"" # - name: Build Plugins (UHL) # shell: sh # run: | From 1f05a568847166a4a9faea8eb27a454544be29cf Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:04:55 +0300 Subject: [PATCH 51/70] 44 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 654aa3c..7635015 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -51,7 +51,7 @@ jobs: test -e "/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found test -e "/work/Result" && echo file exists || echo file not found test -e "Result" && echo file exists || echo file not found - "/work/Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="./Result"" + "./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="/work/Result"" # - name: Build Plugins (UHL) # shell: sh # run: | From 5df2855b3073ee33b8691d42e6566e80ec497375 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:06:15 +0300 Subject: [PATCH 52/70] 45 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7635015..6e7aa1b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -51,7 +51,7 @@ jobs: test -e "/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found test -e "/work/Result" && echo file exists || echo file not found test -e "Result" && echo file exists || echo file not found - "./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="/work/Result"" + ./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="/work/Result" # - name: Build Plugins (UHL) # shell: sh # run: | From 5f14232a64b02abfb9a4dfba1fed35901beadf76 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:06:42 +0300 Subject: [PATCH 53/70] 46 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6e7aa1b..9f664fa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -51,7 +51,7 @@ jobs: test -e "/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found test -e "/work/Result" && echo file exists || echo file not found test -e "Result" && echo file exists || echo file not found - ./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="/work/Result" + "/work/Engine/Build/BatchFiles/RunUAT.sh" BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="/work/Result" # - name: Build Plugins (UHL) # shell: sh # run: | From 7d33e848255df789b21cfd10f797752c68984433 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:06:59 +0300 Subject: [PATCH 54/70] 47 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9f664fa..12b3c3d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -51,7 +51,7 @@ jobs: test -e "/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found test -e "/work/Result" && echo file exists || echo file not found test -e "Result" && echo file exists || echo file not found - "/work/Engine/Build/BatchFiles/RunUAT.sh" BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="/work/Result" + "/work/Engine/Build/BatchFiles/RunUAT.sh" BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="./Result" # - name: Build Plugins (UHL) # shell: sh # run: | From 334f045340dcd4a60edc58b5eda33def5c9ee4c8 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:16:37 +0300 Subject: [PATCH 55/70] 48 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 12b3c3d..bcabb53 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -51,7 +51,7 @@ jobs: test -e "/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found test -e "/work/Result" && echo file exists || echo file not found test -e "Result" && echo file exists || echo file not found - "/work/Engine/Build/BatchFiles/RunUAT.sh" BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="./Result" + ./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="./Result" # - name: Build Plugins (UHL) # shell: sh # run: | From 97f21b85f36cb7f7fab88e08231d91d28966994f Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:25:02 +0300 Subject: [PATCH 56/70] 49 --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bcabb53..1c781aa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -52,6 +52,7 @@ jobs: test -e "/work/Result" && echo file exists || echo file not found test -e "Result" && echo file exists || echo file not found ./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="./Result" + # - name: Build Plugins (UHL) # shell: sh # run: | From 34407da4647e2028f7cf04d721deefbd6c9affb9 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:25:11 +0300 Subject: [PATCH 57/70] 50 --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1c781aa..a1069a4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -53,6 +53,7 @@ jobs: test -e "Result" && echo file exists || echo file not found ./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="./Result" + # - name: Build Plugins (UHL) # shell: sh # run: | From 5758121105e25abe9b66dfd28d222c643c80d6ab Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:25:23 +0300 Subject: [PATCH 58/70] 51 --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a1069a4..ee74110 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -54,6 +54,7 @@ jobs: ./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="./Result" + # - name: Build Plugins (UHL) # shell: sh # run: | From 5d6d2fcb24ac31bb4d3aeafe040148a5fab15ed9 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:25:35 +0300 Subject: [PATCH 59/70] 52 --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ee74110..40ce2d1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -55,6 +55,7 @@ jobs: + # - name: Build Plugins (UHL) # shell: sh # run: | From 7de13bc5fe338aa24c64e6d5825eeafac65bd1de Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:25:43 +0300 Subject: [PATCH 60/70] 53 --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 40ce2d1..c837b48 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -56,6 +56,7 @@ jobs: + # - name: Build Plugins (UHL) # shell: sh # run: | From 5cbb0ae600b79d99aeb052a458b0a41db2d49cc3 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:27:20 +0300 Subject: [PATCH 61/70] 54 - UE5.4.0 --- .github/workflows/test.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c837b48..0c7b566 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,7 +42,7 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} registry: ghcr.io - image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4 + image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4.0 options: -v ${{ github.workspace }}:/work -e ABC=123 run: | echo "Running Script" @@ -52,11 +52,6 @@ jobs: test -e "/work/Result" && echo file exists || echo file not found test -e "Result" && echo file exists || echo file not found ./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="./Result" - - - - - # - name: Build Plugins (UHL) # shell: sh # run: | From 5e8e570dccfb4f72f1c92fc5022e5f689e78079a Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:27:38 +0300 Subject: [PATCH 62/70] 54 - UE5.4.1 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0c7b566..63d88c0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,7 +42,7 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} registry: ghcr.io - image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4.0 + image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4.1 options: -v ${{ github.workspace }}:/work -e ABC=123 run: | echo "Running Script" From a6d2b6b708fc95d596f64a4adfc2f904b3e4e105 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:27:51 +0300 Subject: [PATCH 63/70] 54 - UE5.4.2 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 63d88c0..072ca21 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,7 +42,7 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} registry: ghcr.io - image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4.1 + image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4.2 options: -v ${{ github.workspace }}:/work -e ABC=123 run: | echo "Running Script" From d882ddb895c9f1b16a0657dd5dc3e2f19274da8b Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:27:59 +0300 Subject: [PATCH 64/70] 54 - UE5.4.3 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 072ca21..065119f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,7 +42,7 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} registry: ghcr.io - image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4.2 + image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4.3 options: -v ${{ github.workspace }}:/work -e ABC=123 run: | echo "Running Script" From 173932f61093a57a506b50f04dda69f5c26c0de6 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:28:07 +0300 Subject: [PATCH 65/70] 54 - UE5.4.4 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 065119f..8b01965 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,7 +42,7 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} registry: ghcr.io - image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4.3 + image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4.4 options: -v ${{ github.workspace }}:/work -e ABC=123 run: | echo "Running Script" From 3949c78d9370b8f47776ff7fd94d0452bebdcd19 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 20:44:38 +0300 Subject: [PATCH 66/70] win64 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8b01965..05347d9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -51,7 +51,7 @@ jobs: test -e "/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" && echo file exists || echo file not found test -e "/work/Result" && echo file exists || echo file not found test -e "Result" && echo file exists || echo file not found - ./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="./Result" + ./Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin="/work/UnrealHelperLibrary/UnrealHelperLibrary.uplugin" -package="./Result" -platform=Win64 # - name: Build Plugins (UHL) # shell: sh # run: | From 8002ad51d8986caad55b645e0495506042edf584 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 22:32:10 +0300 Subject: [PATCH 67/70] Create build-with-project.yml --- .github/workflows/build-with-project.yml | 41 ++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .github/workflows/build-with-project.yml diff --git a/.github/workflows/build-with-project.yml b/.github/workflows/build-with-project.yml new file mode 100644 index 0000000..c48da4c --- /dev/null +++ b/.github/workflows/build-with-project.yml @@ -0,0 +1,41 @@ +name: Build with blueprint project + +on: + push: + branches: + - "**" + +jobs: + build: + runs-on: self-hosted + steps: + - name: Check out Git repository + uses: actions/checkout@v3 + with: + repository: Ciberusps/UE_5_4_Blueprint + path: UE_5_4_Blueprint + - name: Build project + uses: OrchidIsle/UE5-Build-Project@latest + with: + RUNUAT_PATH: 'S:/Epic Games/UE_5.4/Engine/Build/BatchFiles/RunUAT.bat' + UPROJECT_PATH: ${{ github.workspace }}/UE_5_4_Blueprint/UE_5_4_Blueprint.uproject + BUILD_CONFIG: Development + PLATFORM: Win64 + CLEAN: true + COOK: true + STAGE: true + PACKAGE: false + PAK: false + SERVER: false + ARCHIVE: false + ARCHIVE_PATH: 'C:/Archives/MyGame' + NULLRHI: true + EDITOR: true + ENCRYPT_INI: true + # RELEASE: '1.0.0' + # PATCH: '0.9.0' + # MAPS: 'Map1,Map2' + DELETE_PDB: true + # ANTICHEAT_ENABLED: true + # ANTICHEAT_PRIVATE_KEY: 'base64encodedprivatekey' + # ANTICHEAT_PUBLIC_CERT: 'base64encodedpubliccert' From d12fa136df050d709fba1098311c0e2d1ac08b78 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 22:32:59 +0300 Subject: [PATCH 68/70] fix FAB build issues --- .../Private/AI/Composite/BTC_RandomSelector.cpp | 14 +++++++------- .../Private/AI/Services/BTS_GameplayFocus.cpp | 1 + .../Public/AI/Composite/BTC_RandomSelector.h | 11 ++++++----- .../Public/AI/Services/BTS_GameplayFocus.h | 1 - 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Source/UnrealHelperLibrary/Private/AI/Composite/BTC_RandomSelector.cpp b/Source/UnrealHelperLibrary/Private/AI/Composite/BTC_RandomSelector.cpp index 052e06e..6b87ee8 100644 --- a/Source/UnrealHelperLibrary/Private/AI/Composite/BTC_RandomSelector.cpp +++ b/Source/UnrealHelperLibrary/Private/AI/Composite/BTC_RandomSelector.cpp @@ -6,7 +6,12 @@ #include "BehaviorTree/BTTaskNode.h" #include "BehaviorTree/BTCompositeNode.h" #include "BehaviorTree/BehaviorTreeComponent.h" +#include "BehaviorTree/BlackboardComponent.h" #include "Misc/EngineVersionComparison.h" +#include "GameFramework/Actor.h" +#include "VisualLogger/VisualLogger.h" +#include "BehaviorTree/BTTaskNode.h" +#include "BehaviorTree/BTAuxiliaryNode.h" #include "Kismet/KismetMathLibrary.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(BTC_RandomSelector) @@ -87,21 +92,16 @@ FName UBTC_RandomSelector::GetNodeIconName() const #endif #if UE_VERSION_NEWER_THAN(5, 4, 0) -uint16 UBTC_RandomSelector::GetInstanceMemorySize() const -{ - return sizeof(FBTRandomSelectorMemory); -} - void UBTC_RandomSelector::InitializeMemory(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, EBTMemoryInit::Type InitType) const { - InitializeNodeMemory(NodeMemory, InitType); + InitializeNodeMemory(NodeMemory, InitType); } void UBTC_RandomSelector::CleanupMemory(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, EBTMemoryClear::Type CleanupType) const { - CleanupNodeMemory(NodeMemory, CleanupType); + CleanupNodeMemory(NodeMemory, CleanupType); } #endif diff --git a/Source/UnrealHelperLibrary/Private/AI/Services/BTS_GameplayFocus.cpp b/Source/UnrealHelperLibrary/Private/AI/Services/BTS_GameplayFocus.cpp index d0fbbd6..e6993bf 100644 --- a/Source/UnrealHelperLibrary/Private/AI/Services/BTS_GameplayFocus.cpp +++ b/Source/UnrealHelperLibrary/Private/AI/Services/BTS_GameplayFocus.cpp @@ -7,6 +7,7 @@ #include "BehaviorTree/BlackboardComponent.h" #include "BehaviorTree/BehaviorTreeComponent.h" #include "BehaviorTree/BehaviorTreeTypes.h" +#include "BehaviorTree/Services/BTService_DefaultFocus.h" #include "AIController.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(BTS_GameplayFocus) diff --git a/Source/UnrealHelperLibrary/Public/AI/Composite/BTC_RandomSelector.h b/Source/UnrealHelperLibrary/Public/AI/Composite/BTC_RandomSelector.h index 9129c69..b0275b4 100644 --- a/Source/UnrealHelperLibrary/Public/AI/Composite/BTC_RandomSelector.h +++ b/Source/UnrealHelperLibrary/Public/AI/Composite/BTC_RandomSelector.h @@ -3,6 +3,7 @@ #pragma once #include "CoreMinimal.h" +#include "UObject/ObjectMacros.h" #include "BehaviorTree/BTCompositeNode.h" #include "BehaviorTree/BehaviorTreeTypes.h" #include "Misc/EngineVersionComparison.h" @@ -10,9 +11,10 @@ class UBehaviorTreeComponent; -struct FBTRandomSelectorMemory -{ -}; +// Should nest from "FBTCompositeMemory" or build error fail on FAB servers +// struct FBTRandomSelectorMemory : public FBTCompositeMemory +// { +// }; /** * RandomSelector composite node. @@ -28,7 +30,7 @@ class UNREALHELPERLIBRARY_API UBTC_RandomSelector : public UBTCompositeNode GENERATED_BODY() public: - explicit UBTC_RandomSelector(const FObjectInitializer& ObjectInitializer); + UBTC_RandomSelector(const FObjectInitializer& ObjectInitializer); // TODO validate that chances count == ChildrenNum // if no chance specified, node without chance will win always @@ -48,7 +50,6 @@ class UNREALHELPERLIBRARY_API UBTC_RandomSelector : public UBTCompositeNode #if UE_VERSION_NEWER_THAN(5, 4, 0) // 5.4.0 and up only code - virtual uint16 GetInstanceMemorySize() const override; virtual void InitializeMemory(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, EBTMemoryInit::Type InitType) const override; virtual void CleanupMemory(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, EBTMemoryClear::Type CleanupType) const override; #endif diff --git a/Source/UnrealHelperLibrary/Public/AI/Services/BTS_GameplayFocus.h b/Source/UnrealHelperLibrary/Public/AI/Services/BTS_GameplayFocus.h index 61b3626..8470057 100644 --- a/Source/UnrealHelperLibrary/Public/AI/Services/BTS_GameplayFocus.h +++ b/Source/UnrealHelperLibrary/Public/AI/Services/BTS_GameplayFocus.h @@ -27,7 +27,6 @@ class UNREALHELPERLIBRARY_API UBTS_GameplayFocus : public UBTService_DefaultFocu UBTS_GameplayFocus(const FObjectInitializer& ObjectInitializer); #if UE_VERSION_NEWER_THAN(5, 4, 0) - virtual uint16 GetInstanceMemorySize() const override { return sizeof(FBTFocusMemory); } virtual void InitializeMemory(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, EBTMemoryInit::Type InitType) const override; virtual void CleanupMemory(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, EBTMemoryClear::Type CleanupType) const override; #endif From 5866de9dfd8496db4f17432fa85e563691532fef Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 22:34:19 +0300 Subject: [PATCH 69/70] use 5.4 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 05347d9..a9a34c1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,7 +42,7 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.UNREAL_ENGINE_PERSONAL_TOKEN }} registry: ghcr.io - image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4.4 + image: ghcr.io/epicgames/unreal-engine:dev-slim-5.4 options: -v ${{ github.workspace }}:/work -e ABC=123 run: | echo "Running Script" From 98c6346d4dff7ada2b3328555bc95198f7794cb7 Mon Sep 17 00:00:00 2001 From: Ciberus Date: Thu, 24 Oct 2024 22:36:25 +0300 Subject: [PATCH 70/70] Update build-with-project.yml --- .github/workflows/build-with-project.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-with-project.yml b/.github/workflows/build-with-project.yml index c48da4c..0f8a281 100644 --- a/.github/workflows/build-with-project.yml +++ b/.github/workflows/build-with-project.yml @@ -9,11 +9,17 @@ jobs: build: runs-on: self-hosted steps: - - name: Check out Git repository + - name: Check out UE5.4 project uses: actions/checkout@v3 with: repository: Ciberusps/UE_5_4_Blueprint path: UE_5_4_Blueprint + + - name: Check out UnrealHelperLibrary to Plugins folder + uses: actions/checkout@v3 + with: + path: UE_5_4_Blueprint/Plugins/UnrealHelperLibrary + - name: Build project uses: OrchidIsle/UE5-Build-Project@latest with: @@ -24,7 +30,7 @@ jobs: CLEAN: true COOK: true STAGE: true - PACKAGE: false + PACKAGE: true PAK: false SERVER: false ARCHIVE: false