From c7f5bd93262011ef96cb0a2437a521921a32244d Mon Sep 17 00:00:00 2001 From: Kyrium Date: Thu, 24 Oct 2024 18:06:58 +0200 Subject: [PATCH] feat: wip --- .gitea/workflows/main.yaml | 140 ++++++++++++++++++ .gitignore | 101 +++++++++++++ .gitlab-ci.yml | 96 ++++++++++++ .gitlab-ci.yml.old | 73 +++++++++ CHANGELOG.md | 85 +++++++++++ Config/AccessTransformers.ini | 1 + Config/Alpakit.ini | 4 + Config/DefaultGame.ini | 2 + Config/Engine.ini | 2 + Config/Game.ini | 2 + Config/PluginSettings.ini | 3 + README.md | 1 + RefinedRDApi.uplugin | 33 +++++ Resources/Icon128.png | Bin 0 -> 37900 bytes .../DataAssets/RRDABoilerDataAsset.cpp | 3 + .../DataAssets/RRDACoolerDataAsset.cpp | 3 + .../Private/DataAssets/RRDADirtDataAsset.cpp | 30 ++++ .../DataAssets/RRDAHeaterDataAsset.cpp | 3 + .../DataAssets/RRDATurbineDataAsset.cpp | 3 + Source/RefinedRDApi/Private/RefinedRDApi.cpp | 14 ++ Source/RefinedRDApi/Private/Structs/.gitkeep | 0 .../Subsystems/RRDADataAssetSubsystem.cpp | 93 ++++++++++++ .../Public/DataAssets/RRDABoilerDataAsset.h | 28 ++++ .../Public/DataAssets/RRDACoolerDataAsset.h | 22 +++ .../Public/DataAssets/RRDADataAssetBase.h | 42 ++++++ .../Public/DataAssets/RRDADirtDataAsset.h | 51 +++++++ .../Public/DataAssets/RRDAHeaterDataAsset.h | 36 +++++ .../Public/DataAssets/RRDATurbineDataAsset.h | 29 ++++ .../RefinedRDApi/Public/Enums/RRDARPEnums.h | 19 +++ Source/RefinedRDApi/Public/RefinedRDApi.h | 11 ++ Source/RefinedRDApi/Public/Structs/.gitkeep | 0 .../Subsystems/RRDADataAssetSubsystem.h | 132 +++++++++++++++++ Source/RefinedRDApi/RefinedRDApi.Build.cs | 65 ++++++++ VERSION | 1 + bump.sh | 98 ++++++++++++ 35 files changed, 1226 insertions(+) create mode 100644 .gitea/workflows/main.yaml create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 .gitlab-ci.yml.old create mode 100644 CHANGELOG.md create mode 100644 Config/AccessTransformers.ini create mode 100644 Config/Alpakit.ini create mode 100644 Config/DefaultGame.ini create mode 100644 Config/Engine.ini create mode 100644 Config/Game.ini create mode 100644 Config/PluginSettings.ini create mode 100644 README.md create mode 100644 RefinedRDApi.uplugin create mode 100644 Resources/Icon128.png create mode 100644 Source/RefinedRDApi/Private/DataAssets/RRDABoilerDataAsset.cpp create mode 100644 Source/RefinedRDApi/Private/DataAssets/RRDACoolerDataAsset.cpp create mode 100644 Source/RefinedRDApi/Private/DataAssets/RRDADirtDataAsset.cpp create mode 100644 Source/RefinedRDApi/Private/DataAssets/RRDAHeaterDataAsset.cpp create mode 100644 Source/RefinedRDApi/Private/DataAssets/RRDATurbineDataAsset.cpp create mode 100644 Source/RefinedRDApi/Private/RefinedRDApi.cpp create mode 100644 Source/RefinedRDApi/Private/Structs/.gitkeep create mode 100644 Source/RefinedRDApi/Private/Subsystems/RRDADataAssetSubsystem.cpp create mode 100644 Source/RefinedRDApi/Public/DataAssets/RRDABoilerDataAsset.h create mode 100644 Source/RefinedRDApi/Public/DataAssets/RRDACoolerDataAsset.h create mode 100644 Source/RefinedRDApi/Public/DataAssets/RRDADataAssetBase.h create mode 100644 Source/RefinedRDApi/Public/DataAssets/RRDADirtDataAsset.h create mode 100644 Source/RefinedRDApi/Public/DataAssets/RRDAHeaterDataAsset.h create mode 100644 Source/RefinedRDApi/Public/DataAssets/RRDATurbineDataAsset.h create mode 100644 Source/RefinedRDApi/Public/Enums/RRDARPEnums.h create mode 100644 Source/RefinedRDApi/Public/RefinedRDApi.h create mode 100644 Source/RefinedRDApi/Public/Structs/.gitkeep create mode 100644 Source/RefinedRDApi/Public/Subsystems/RRDADataAssetSubsystem.h create mode 100644 Source/RefinedRDApi/RefinedRDApi.Build.cs create mode 100644 VERSION create mode 100644 bump.sh diff --git a/.gitea/workflows/main.yaml b/.gitea/workflows/main.yaml new file mode 100644 index 0000000..808ad29 --- /dev/null +++ b/.gitea/workflows/main.yaml @@ -0,0 +1,140 @@ +name: Mod Build +on: + push: + tags: + - "*" +env: + MOD_NAME: "RefinedRDLib" + MOD_ID: "B24emzbs6xVZQr" + SML_DIR: "E:/SF/SML" + ENGINE_DIR: "F:/5.2.1-CSS" + BUILT_MODS_DIR: "${{ gitea.workspace }}/BuiltMods" + DEV_BUILDS_DIR: "${{ gitea.workspace }}/DevBuilds" +jobs: + Setup: + runs-on: windows-2022 + defaults: + run: + shell: pwsh + steps: + - name: Setup SML + run: | + if (!(Test-Path ${{env.SML_DIR}} -PathType Container)) {git clone --branch master https://github.com/satisfactorymodding/SatisfactoryModLoader.git ${{env.SML_DIR}}} + - name: Install WWise + run: | + cd ${{env.SML_DIR}} + if ((Test-Path ${{env.SML_DIR}}/Plugins/Wwise) -eq $true){ echo "WWise already Installed Skipping.."; exit 0 } + E:/SF/Scripts/wwise-cli.exe integrate-ue --integration-version "2022.1.5.2714" --project "${{env.SML_DIR}}/FactoryGame.uproject" + - name: "SML Headers" + run: | + cd E:/SF/Scripts/sml-fixer + ./sml-fixer.exe + PullMods: + needs: Setup + strategy: + matrix: + value: ["RefinedRDLib"] + runs-on: windows-2022 + defaults: + run: + shell: pwsh + steps: + - name: "Clone Mod" + run: | + echo "Cloning Mod ${{matrix.value}}" + cd ${{env.SML_DIR}}/Mods + if (!(Test-Path ${{env.SML_DIR}}/Mods/${{matrix.value}} -PathType Container)) {git clone --branch main git@10.10.10.14:RefinedRD/sf_mod_${{matrix.value}}.git ${{env.SML_DIR}}/Mods/${{matrix.value}}} + cd ${{env.SML_DIR}}/Mods/${{matrix.value}} + git fetch --all + git reset --hard origin/main + echo "Done" + UpdateUPlugins: + needs: PullMods + strategy: + matrix: + value: ["RefinedRDLib"] + runs-on: windows-2022 + defaults: + run: + shell: pwsh + steps: + - name: "Update Mod UPlugin Version" + run: | + echo "Updating ${{env.SML_DIR}}/Mods/${{matrix.value}}/${{matrix.value}}.uplugin" + $Uplugin = (Get-Content ${{env.SML_DIR}}/Mods/${{matrix.value}}/${{matrix.value}}.uplugin | convertfrom-json) + $UPlugin.SemVersion = $(Get-Content "${{env.SML_DIR}}/Mods/${{matrix.value}}/VERSION") + $UPlugin.VersionName = $(Get-Content "${{env.SML_DIR}}/Mods/${{matrix.value}}/VERSION") + $Version = $Uplugin.SemVersion + ($UPlugin | convertto-json -Depth 100) -replace '\\u0026', '&' | Set-Content ${{env.SML_DIR}}/Mods/${{matrix.value}}/${{matrix.value}}.uplugin + echo "Done" + CompileEditor: + needs: UpdateModUPluginDependencies + runs-on: windows-2022 + outputs: + version: ${{steps.getversion.outputs.version}} + defaults: + run: + shell: pwsh + env: + BUILD_TOOL_EXE: ${{env.ENGINE_DIR}}/Engine/Binaries/DotNET/UnrealBuildTool/UnrealBuildTool.exe + steps: + - name: Get Version + id: getversion + run: | + $Version = $(Get-Content "${{env.SML_DIR}}/Mods/${{env.MOD_NAME}}/VERSION") + Write-Output "version=$($Version)" >> $Env:GITHUB_OUTPUT + - name: "Gen-VS-Files" + run: | + cd ${{env.SML_DIR}} + ${{env.BUILD_TOOL_EXE}} -projectfiles -project="${{env.SML_DIR}}/FactoryGame.uproject" -game -rocket -progress + - name: Compile Editor + run: | + cd ${{env.SML_DIR}} + ${{env.BUILD_TOOL_EXE}} Development Win64 -project="${{env.SML_DIR}}/FactoryGame.uproject" -TargetType="Editor" -progress + BuildMods: + needs: CompileEditor + strategy: + matrix: + value: ["RefinedRDLib"] + runs-on: windows-2022 + defaults: + run: + shell: pwsh + steps: + - name: "Build Mod" + run: | + $Version = $(Get-Content "${{env.SML_DIR}}/Mods/${{matrix.value}}/VERSION") + & "${{env.ENGINE_DIR}}/Engine/Build/BatchFiles/RunUAT.bat" -ScriptsForProject="${{env.SML_DIR}}/FactoryGame.uproject" PackagePlugin -Project="${{env.SML_DIR}}/FactoryGame.uproject" -dlcname="${{matrix.value}}" -build -server -clientconfig=Shipping -serverconfig=Shipping -platform=Win64 -serverplatform=Win64+Linux -nocompileeditor -installed -merge + if (!(Test-Path ${{env.BUILT_MODS_DIR}})) {New-Item -ItemType Directory -Force -Path ${{env.BUILT_MODS_DIR}}} + Copy-Item ${{env.SML_DIR}}/Saved/ArchivedPlugins/${{matrix.value}}/${{matrix.value}}.zip ${{env.BUILT_MODS_DIR}}/${{matrix.value}}.$Version.zip -Force + - uses: actions/upload-artifact@v3 + with: + name: built-mods + path: ${{env.BUILT_MODS_DIR}}/${{matrix.value}}.*.zip + overwrite: true + SMRDeploy: + if: ${{ vars.DEPLOY != 'false' }} + needs: BuildMods + runs-on: windows-2022 + defaults: + run: + shell: pwsh + steps: + - name: Download a artifact + uses: actions/download-artifact@v3 + with: + name: built-mods + path: ${{env.BUILT_MODS_DIR}} + - name: "Deploy to SMR" + run: | + echo "Deploying to SMR" + $Version = $(Get-Content "${{env.SML_DIR}}/Mods/${{env.MOD_NAME}}/VERSION") + $query = '{ "query": "query { getModByReference(modReference:\"${{env.MOD_NAME}}\"){ versions(filter:{limit: 1}){ version } }}"}' + echo $query + $SMRVersion = (Invoke-RestMethod -Method POST -uri "https://api.ficsit.app/v2/query" -body $query -ContentType "application/json").data.getModByReference.versions[0].version + if($Version -eq $SMRVersion) { echo "SMR Mod Version Already Exists.. Skip"; exit 0 } + $File = (Get-ChildItem "${{env.BUILT_MODS_DIR}}/${{env.MOD_NAME}}*").FullName + $APIURL="https://api.ficsit.app" + write-host "$File, $APIURL" + & "E:/SF/Scripts/ficsit_windows_amd64.exe" smr upload --api-base "$APIURL" --api-key "${{secrets.FICSIT_TOKEN}}" "${{env.MOD_ID}}" "$File" "${{vars.CHANGELOG}}" + echo "Done" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b337069 --- /dev/null +++ b/.gitignore @@ -0,0 +1,101 @@ +# Visual Studio 2015 user specific files +.vs/ + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +# *.dll + +!*.pdb + +# Fortran module files +*.mod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app +*.ipa + +# These project files can be generated by the engine +*.xcodeproj +*.xcworkspace +*.sln +*.suo +*.opensdf +*.sdf +*.VC.db +*.VC.opendb + +# Precompiled Assets +SourceArt/**/*.png +SourceArt/**/*.tga + +# Binary Files +Binaries/* + +# Binaries/* +Plugins/*/Binaries/* + +# Builds +Build/* + +# Whitelist PakBlacklist-.txt files +!Build/*/ +Build/*/** +!Build/*/PakBlacklist*.txt + +# Don't ignore icon files in Build +!Build/**/*.ico + +# Built data for maps +*_BuiltData.uasset + +# Configuration files generated by the Editor +Saved/* + +# Compiled source files for the engine to use +Intermediate/* +Plugins/*/Intermediate/* + +# Cache files for the editor to use +DerivedDataCache/* + +# Wwise +*_WwiseProject/* +Plugins/Wwise/* + +# ModLoader-Solution +!ModLoader/*.sln + +# ModLoader-Binaries +ModLoader/x64 +ModLoader/*/x64 + +Plugins/* + + + +# Mod Zip Files +ZipDir +PreZipDir + +GitNoCommit +SF_ModProject/Plugins/RefinedRDLib/Metadata/Crypto.json +Metadata/Crypto.json diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..296cad8 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,96 @@ +workflow: + rules: + - if: $CI_COMMIT_TAG + when: always + - when: never + +variables: + GIT_STRATEGY: none + GIT_CHECKOUT: "false" + ErrorActionPreference: STOP + GIT_TEST_DEBUG_UNSAFE_DIRECTORIES: "true" + + # Unreal Engine 4 Project Settings + MOD_NAME: "RefinedRDApi" + MOD_REPO: "refined-rd/sf_mod_refinedrdapi.git" + MOD_ID: "B24emzbs6xVZQr" + SML_DIR: "E:/SF/SML" + ENGINE_DIR: "F:/5.2.1-CSS" + BUILT_MODS_DIR: "$CI_PROJECT_DIR/BuiltMods" + DEV_BUILDS_DIR: "$CI_PROJECT_DIR/DevBuilds" + +stages: + - setup + - compile + - build + - package + - deploy + +1-pull-sml: + stage: setup + script: + - "if (!(Test-Path $BUILT_MODS_DIR)) {New-Item -ItemType Directory -Force -Path $BUILT_MODS_DIR}" + - "if (!(Test-Path $DEV_BUILDS_DIR)) {New-Item -ItemType Directory -Force -Path $DEV_BUILDS_DIR}" + - "Remove-Item $BUILT_MODS_DIR/*" + - "Remove-Item $DEV_BUILDS_DIR/*" + - "if (!(Test-Path $SML_DIR -PathType Container)) {git clone --branch master https://github.com/satisfactorymodding/SatisfactoryModLoader.git $SML_DIR}" + +2-install-wwise: + stage: setup + variables: + WWISE_VERSION: "2022.1.5.8242" + script: + - "cd $SML_DIR" + - "if ((Test-Path $SML_DIR/Plugins/Wwise) -eq $true){ exit 0 }" + - 'E:/SF/Scripts/wwise-cli.exe integrate-ue --integration-version "2022.1.5.2714" --project "$SML_DIR/FactoryGame.uproject"' + +3-pull-mod: + stage: setup + script: + - "cd $SML_DIR/Mods" + - "if (!(Test-Path $SML_DIR/Mods/$MOD_NAME -PathType Container)) {git clone --branch ue5 git@10.10.10.6:$MOD_REPO $SML_DIR/Mods/$MOD_NAME}" + - "cd $SML_DIR/Mods/$MOD_NAME" + - "git fetch --all" + - "git reset --hard origin/ue5" + +4-header-update: + stage: setup + script: + - "cd E:/SF/Scripts/sml-fixer" + - "./sml-fixer.exe" + +1-gen-vs-files: + stage: compile + script: + - "cd $SML_DIR" + - '& "$ENGINE_DIR/Engine/Binaries/DotNET/UnrealBuildTool/UnrealBuildTool.exe" -projectfiles -project="$SML_DIR/FactoryGame.uproject" -game -rocket -progress' + +2-compile-editor: + stage: compile + script: + - '& "$ENGINE_DIR/Engine/Binaries/DotNET/UnrealBuildTool/UnrealBuildTool.exe" Development Win64 -project="$SML_DIR/FactoryGame.uproject" -TargetType="Editor" -progress' + +1-build-mod: + stage: build + script: + - "$UPlugin = (Get-Content $SML_DIR/Mods/$MOD_NAME/$MOD_NAME.uplugin | convertfrom-json)" + - '$UPlugin.SemVersion = $(Get-Content "$SML_DIR/Mods/$MOD_NAME/VERSION")' + - '$UPlugin.VersionName = $(Get-Content "$SML_DIR/Mods/$MOD_NAME/VERSION")' + - '$Version="$($UPlugin.SemVersion)"' + - "($UPlugin | convertto-json -Depth 100) -replace '\\u0026', '&' | Set-Content $SML_DIR/Mods/$MOD_NAME/$MOD_NAME.uplugin" + - 'Write-Host "Building $MOD_NAME $($Version)"' + - '& "$ENGINE_DIR/Engine/Build/BatchFiles/RunUAT.bat" -ScriptsForProject="$SML_DIR/FactoryGame.uproject" PackagePlugin -Project="$SML_DIR/FactoryGame.uproject" -dlcname="$MOD_NAME" -build -server -clientconfig=Shipping -serverconfig=Shipping -platform=Win64 -serverplatform=Win64+Linux -nocompileeditor -installed -merge' + - 'Copy-Item "$SML_DIR/Saved/ArchivedPlugins/$MOD_NAME/$MOD_NAME.zip" "$BUILT_MODS_DIR/$MOD_NAME.$Version.zip" -Force' + artifacts: + paths: + - ./BuiltMods/*.zip + expire_in: 1 month + +deploy-live: + stage: deploy + script: + - 'cd "$CI_PROJECT_DIR"' + - '$File = (Get-ChildItem "./BuiltMods/$MOD_NAME*").FullName' + - '$APIURL="https://api.ficsit.app"' + - '& "E:/SF/Scripts/ficsit_windows_amd64.exe" smr upload --api-base $APIURL --api-key $FICSIT_TOKEN "$MOD_ID" "$File" "$CHANGELOG"' + when: manual diff --git a/.gitlab-ci.yml.old b/.gitlab-ci.yml.old new file mode 100644 index 0000000..dd94ec0 --- /dev/null +++ b/.gitlab-ci.yml.old @@ -0,0 +1,73 @@ +workflow: + rules: + - when: always + + +variables: + GIT_STRATEGY: none + GIT_CHECKOUT: "false" + ErrorActionPreference: STOP + + # Unreal Engine 4 Project Settings + MOD_NAME: "RefinedRDLib" + MOD_VERSION: "1.0.18" + GIT_TEST_DEBUG_UNSAFE_DIRECTORIES: "true" + +stages: + - setupenv + - compile + - package + - deploy + +setup_env: + stage: setupenv + script: + - "C:\\BuildScripts\\SF\\01-SetupEnv.ps1" + +setup_plugins: + stage: setupenv + script: + - "C:\\BuildScripts\\SF\\02-SetupPlugins.ps1" + +compile-dev: + variables: + BuildConfig: "Development Editor" + BuildPlatform: "Win64" + stage: compile + script: + - "C:\\BuildScripts\\SF\\03-CompileMod.ps1" + +compile-client: + variables: + BuildConfig: "Shipping" + BuildPlatform: "Win64" + stage: compile + script: + - "C:\\BuildScripts\\SF\\03-CompileMod.ps1" + +compile-winserver: + variables: + BuildConfig: "Shipping Server" + BuildPlatform: "Win64" + stage: compile + script: + - "C:\\BuildScripts\\SF\\03-CompileMod.ps1" + +compile-linuxserver: + variables: + BuildConfig: "Shipping Server" + BuildPlatform: "Linux" + stage: compile + script: + - "C:\\BuildScripts\\SF\\03-CompileMod.ps1" + +package: + stage: package + script: + - "C:\\BuildScripts\\SF\\04-PackageMod.ps1" + +deploy-live: + stage: deploy + script: + - "C:\\BuildScripts\\SF\\06-DeployLive.ps1" + when: manual \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..9d942f2 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,85 @@ +## 1.1.18 (April 15, 2024) + - feat: New config management subsystem + - feat: Updated Icon generation code + +## 1.1.17 (March 17, 2024) + - fix: More fixes to sound manager + - fix: Fixes to config manager + - ci: Gitea Workflow + - chore: Update uplugin + +## 1.1.16 (March 07, 2024) + - fix: Fixed infinite loop crash + +## 1.1.15 (February 27, 2024) + - fix: Fixed major bug with Item storage functions + - fix: Fixed config delegates + +## 1.1.14 (February 20, 2024) + - feat: Mod Icons + - feat: Updated fonts + - feat: remove check + - fix: Fixed slot size is 0 + - feat: New icon descriptors + +## 1.1.13 (January 18, 2024) + - feat: Serverside hologram replication + +## 1.1.12 (January 13, 2024) + - fix: More attempts to fix Modular buildings + +## 1.1.11 (January 13, 2024) + - fix: Hopefully fixes the FF platform issues + +## 1.1.10 (January 12, 2024) + - feat: Debug for modular buildings + +## 1.1.9 (January 09, 2024) + - feat: Updated http response validation + - feat: Accessors for http component + +## 1.1.8 (January 07, 2024) + - ci: Updates to build pipeline + - fix: Compile Errors for linux build + - ci: Bump SML Version + - Merge branch 'ue5' of git.hostxtra.co.uk:refined-rd/sf_mod_refinedrdlib into ue5 + - fix(sub-level-subsystem): clear level refs on deinitialize since is cause some weired issues + +## 1.1.7 (December 05, 2023) + - ci: Updated Pipeline + - feat: Updated SML Version + +## 1.1.6 (November 28, 2023) + - feat: updated Icons + - feat: New Icon creation system + - fix: ensure modular building can place if the build effect is finished or not played + +## 1.1.5 (November 21, 2023) + - fix(patreon): fix patreon content registry + - ci: Fix mod id for upload + - feat: Updated IconMap + +## 1.1.4 (November 17, 2023) + - fix: More fixes for resource wells + - fix: More fixes for resource wells + - fix: Fixed resource well descriptor loading + - bump version + +## 1.1.3 (November 15, 2023) + + +## 1.1.2 (November 15, 2023) + - ci: Updated pipeline + - fix: Fixes to Sublevel Spawning + - ci: Update UE + - fix: Removed sub level spawning configs + - fix: Removal of sub level spawning + - feat: Removal of Sub level spawning + - feat: Icon map updates + - feat: Updated Icon Map + - ci: Moved token to gitlab vars + - ci: Added Depoy Stage + +## 1.1.1 (October 13, 2023) + + diff --git a/Config/AccessTransformers.ini b/Config/AccessTransformers.ini new file mode 100644 index 0000000..99e638a --- /dev/null +++ b/Config/AccessTransformers.ini @@ -0,0 +1 @@ +[AccessTransformers] \ No newline at end of file diff --git a/Config/Alpakit.ini b/Config/Alpakit.ini new file mode 100644 index 0000000..5d52841 --- /dev/null +++ b/Config/Alpakit.ini @@ -0,0 +1,4 @@ +[ModTargets] +Targets=Windows +Targets=WindowsServer + diff --git a/Config/DefaultGame.ini b/Config/DefaultGame.ini new file mode 100644 index 0000000..3db982d --- /dev/null +++ b/Config/DefaultGame.ini @@ -0,0 +1,2 @@ +[/Script/Engine.AssetManagerSettings] ++PrimaryAssetTypesToScan=(PrimaryAssetType="RRDADataAsset",AssetBaseClass="/Script/RefinedRDApi.RRDADataAssetBase",bHasBlueprintClasses=True,bIsEditorOnly=False,Directories=((Path="/")),SpecificAssets=,Rules=(Priority=-1,ChunkId=-1,bApplyRecursively=True,CookRule=AlwaysCook)) diff --git a/Config/Engine.ini b/Config/Engine.ini new file mode 100644 index 0000000..87de056 --- /dev/null +++ b/Config/Engine.ini @@ -0,0 +1,2 @@ +[AssetManagerSettings] ++PrimaryAssetTypesToScan=(PrimaryAssetType="RRDADataAsset",AssetBaseClass="/Script/RefinedRDApi.RRDADataAssetBase",bHasBlueprintClasses=True,bIsEditorOnly=False,Directories=((Path="/")),SpecificAssets=,Rules=(Priority=-1,ChunkId=-1,bApplyRecursively=True,CookRule=AlwaysCook)) diff --git a/Config/Game.ini b/Config/Game.ini new file mode 100644 index 0000000..3db982d --- /dev/null +++ b/Config/Game.ini @@ -0,0 +1,2 @@ +[/Script/Engine.AssetManagerSettings] ++PrimaryAssetTypesToScan=(PrimaryAssetType="RRDADataAsset",AssetBaseClass="/Script/RefinedRDApi.RRDADataAssetBase",bHasBlueprintClasses=True,bIsEditorOnly=False,Directories=((Path="/")),SpecificAssets=,Rules=(Priority=-1,ChunkId=-1,bApplyRecursively=True,CookRule=AlwaysCook)) diff --git a/Config/PluginSettings.ini b/Config/PluginSettings.ini new file mode 100644 index 0000000..13b0331 --- /dev/null +++ b/Config/PluginSettings.ini @@ -0,0 +1,3 @@ +[StageSettings] ++AdditionalNonUSFDirectories=Resources ++AdditionalNonUSFDirectories=Config \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..9f634c6 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# SF_Mod_ModularUI diff --git a/RefinedRDApi.uplugin b/RefinedRDApi.uplugin new file mode 100644 index 0000000..c9d6a2e --- /dev/null +++ b/RefinedRDApi.uplugin @@ -0,0 +1,33 @@ +{ + "FileVersion": 3, + "Version": 1, + "VersionName": "1.0.0", + "SemVersion": "1.0.0", + "FriendlyName": "Refined R&D Api", + "Description": "This Lib can be used to create Mod Compatability with Refined R&D Mods", + "Category": "Modding", + "CreatedBy": "Refined R&D", + "CreatedByURL": "https://github.com/mrhid6", + "DocsURL": "https://docs.ficsit.app", + "MarketplaceURL": "", + "SupportURL": "", + "CanContainContent": true, + "IsBetaVersion": false, + "IsExperimentalVersion": false, + "Installed": true, + "Modules": [ + { + "Name": "RefinedRDApi", + "Type": "Runtime", + "LoadingPhase": "PostDefault" + } + ], + "Plugins": [ + { + "Name": "SML", + "Enabled": true, + "SemVersion": "^3.8.0" + } + ], + "GameVersion": ">=365306" +} \ No newline at end of file diff --git a/Resources/Icon128.png b/Resources/Icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..4d61e2cb179e5ef847ea795156fc067257b7685f GIT binary patch literal 37900 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�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 URRDADirtDataAsset::GetExtractableSeed(URRDADirtDataAsset* Asset) +{ + if(!Asset) + { + return TArray(); + } + return Asset->mExtractableSeed; +} + +float URRDADirtDataAsset::GetExtractionCycleTime(URRDADirtDataAsset* Asset) { + if(!Asset) + { + return 0.f; + } + return Asset->mExtractionCycleTime; +} + +int32 URRDADirtDataAsset::GetDirtConsume(URRDADirtDataAsset* Asset) { + if(!Asset) + { + return 0; + } + return Asset->mDirtConsume; +} \ No newline at end of file diff --git a/Source/RefinedRDApi/Private/DataAssets/RRDAHeaterDataAsset.cpp b/Source/RefinedRDApi/Private/DataAssets/RRDAHeaterDataAsset.cpp new file mode 100644 index 0000000..1867a66 --- /dev/null +++ b/Source/RefinedRDApi/Private/DataAssets/RRDAHeaterDataAsset.cpp @@ -0,0 +1,3 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#include "DataAssets/RRDAHeaterDataAsset.h" \ No newline at end of file diff --git a/Source/RefinedRDApi/Private/DataAssets/RRDATurbineDataAsset.cpp b/Source/RefinedRDApi/Private/DataAssets/RRDATurbineDataAsset.cpp new file mode 100644 index 0000000..5ce1b30 --- /dev/null +++ b/Source/RefinedRDApi/Private/DataAssets/RRDATurbineDataAsset.cpp @@ -0,0 +1,3 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#include "DataAssets/RRDATurbineDataAsset.h" \ No newline at end of file diff --git a/Source/RefinedRDApi/Private/RefinedRDApi.cpp b/Source/RefinedRDApi/Private/RefinedRDApi.cpp new file mode 100644 index 0000000..7ef8aea --- /dev/null +++ b/Source/RefinedRDApi/Private/RefinedRDApi.cpp @@ -0,0 +1,14 @@ +#include "RefinedRDApi.h" + +DEFINE_LOG_CATEGORY(LogRRDApi); + + +void FRefinedRDApiModule::StartupModule() { + // Nothing here... yet +} + +void FRefinedRDApiModule::ShutdownModule() { + // Nothing here... yet +} + +IMPLEMENT_MODULE(FRefinedRDApiModule, RefinedRDApi); diff --git a/Source/RefinedRDApi/Private/Structs/.gitkeep b/Source/RefinedRDApi/Private/Structs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Source/RefinedRDApi/Private/Subsystems/RRDADataAssetSubsystem.cpp b/Source/RefinedRDApi/Private/Subsystems/RRDADataAssetSubsystem.cpp new file mode 100644 index 0000000..819965c --- /dev/null +++ b/Source/RefinedRDApi/Private/Subsystems/RRDADataAssetSubsystem.cpp @@ -0,0 +1,93 @@ +#include "Subsystems/RRDADataAssetSubsystem.h" + +#include "RefinedRDApi.h" +#include "DataAssets/RRDADirtDataAsset.h" +#include "Engine/AssetManager.h" + +URRDADataAssetSubsystem::URRDADataAssetSubsystem() {} + +URRDADataAssetSubsystem* URRDADataAssetSubsystem::Get(UObject* Context) +{ + if (IsValid(Context)) + { + return Context->GetWorld()->GetSubsystem(); + } + return nullptr; +} + +URRDADataAssetSubsystem* URRDADataAssetSubsystem::GetChecked(UObject* Context) +{ + URRDADataAssetSubsystem* Subsystem = Get(Context); + fgcheck(Subsystem); + return Subsystem; +} + +void URRDADataAssetSubsystem::Initialize(FSubsystemCollectionBase& Collection) +{ + Super::Initialize(Collection); + + StartScanForDataAssets(); +} + +void URRDADataAssetSubsystem::Deinitialize() +{ + Super::Deinitialize(); +} + +void URRDADataAssetSubsystem::StartScanForDataAssets() +{ + UAssetManager& Manager = UAssetManager::Get(); + Manager.LoadPrimaryAssetsWithType(FPrimaryAssetType("RRDADataAsset")); + + mDisabledDataAssets.Empty(); + mAllDataAssets.Empty(); + + ReCacheBoilerDataAssets(); + ReCacheCoolerDataAssets(); + ReCacheDirtDataAssets(); + ReCacheHeaterDataAssets(); + ReCacheTurbineDataAssets(); +} + +void URRDADataAssetSubsystem::ReCacheDirtDataAssets() +{ + mDirtAssets.Empty(); + TSet DirtDataAssets; + if(FindAllDataAssetsOfClass(DirtDataAssets)) + { + for (URRDADirtDataAsset* DirtDataAsset : DirtDataAssets) + { + mDirtAssets.Add(DirtDataAsset->mItem, DirtDataAsset); + } + } + UE_LOG(LogRRDApi, Log, TEXT("ReCacheDirtDataAssets: %d"), mDirtAssets.Num()); +} + +void URRDADataAssetSubsystem::ReCacheTurbineDataAssets() +{ + UE_LOG(LogRRDApi, Log, TEXT("ReCacheTurbineDataAssets")); +} + +void URRDADataAssetSubsystem::ReCacheBoilerDataAssets() { + UE_LOG(LogRRDApi, Log, TEXT("ReCacheBoilerDataAssets")); +} + +void URRDADataAssetSubsystem::ReCacheCoolerDataAssets() { + UE_LOG(LogRRDApi, Log, TEXT("ReCacheCoolerDataAssets")); +} + +void URRDADataAssetSubsystem::ReCacheHeaterDataAssets() { + UE_LOG(LogRRDApi, Log, TEXT("ReCacheHeaterDataAssets")); +} + +int32 URRDADataAssetSubsystem::GetAllDirtItems(TArray>& Items) const +{ + return mDirtAssets.GetKeys(Items); +} + +URRDADirtDataAsset* URRDADataAssetSubsystem::GetDataForDirtItem(TSubclassOf Item) const +{ + if(!Item) return nullptr; + return *mDirtAssets.Find(Item); +} + diff --git a/Source/RefinedRDApi/Public/DataAssets/RRDABoilerDataAsset.h b/Source/RefinedRDApi/Public/DataAssets/RRDABoilerDataAsset.h new file mode 100644 index 0000000..8b7673a --- /dev/null +++ b/Source/RefinedRDApi/Public/DataAssets/RRDABoilerDataAsset.h @@ -0,0 +1,28 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "RRDADataAssetBase.h" +#include "ItemAmount.h" + +#include "RRDABoilerDataAsset.generated.h" + +UCLASS( BlueprintType ) +class REFINEDRDAPI_API URRDABoilerDataAsset : public URRDADataAssetBase +{ + GENERATED_BODY() + +public: + /** + * Fuel item that this heater uses + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Boiler") + FItemAmount mItem; + + /** + * What this boiler produces + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Boiler") + FItemAmount mOutputItem; +}; \ No newline at end of file diff --git a/Source/RefinedRDApi/Public/DataAssets/RRDACoolerDataAsset.h b/Source/RefinedRDApi/Public/DataAssets/RRDACoolerDataAsset.h new file mode 100644 index 0000000..ae02739 --- /dev/null +++ b/Source/RefinedRDApi/Public/DataAssets/RRDACoolerDataAsset.h @@ -0,0 +1,22 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "ItemAmount.h" +#include "RRDADataAssetBase.h" + +#include "RRDACoolerDataAsset.generated.h" + +UCLASS( BlueprintType ) +class REFINEDRDAPI_API URRDACoolerDataAsset : public URRDADataAssetBase +{ + GENERATED_BODY() + +public: + /** + * Fuel item that this heater uses + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cooler") + FItemAmount mItem; +}; \ No newline at end of file diff --git a/Source/RefinedRDApi/Public/DataAssets/RRDADataAssetBase.h b/Source/RefinedRDApi/Public/DataAssets/RRDADataAssetBase.h new file mode 100644 index 0000000..dcb8f6b --- /dev/null +++ b/Source/RefinedRDApi/Public/DataAssets/RRDADataAssetBase.h @@ -0,0 +1,42 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" + +#include "RRDADataAssetBase.generated.h" + +UCLASS( BlueprintType ) +class REFINEDRDAPI_API URRDADataAssetBase : public UPrimaryDataAsset +{ + GENERATED_BODY() + +protected: + /** + * Can be overridden to disable the asset or make some other checks + */ + virtual bool IsEnabled_Internal(UObject* WorldContextObject) const + { + return !mIsDisabled; + } + + virtual FPrimaryAssetId GetPrimaryAssetId() const override + { + return FPrimaryAssetId(FPrimaryAssetType("RRDADataAsset"), GetFName()); + } + +public: + UFUNCTION( BlueprintPure, Category="FicsitFarming|Dirt" ) + static bool IsEnabled(URRDADataAssetBase* Asset, UObject* WorldContextObject) + { + if(!Asset) return false; + return Asset->IsEnabled_Internal(WorldContextObject); + }; + + /** + * Disable this asset from being used in the game + * For example if a mod is disabling some content from another mod + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Asset") + bool mIsDisabled; +}; \ No newline at end of file diff --git a/Source/RefinedRDApi/Public/DataAssets/RRDADirtDataAsset.h b/Source/RefinedRDApi/Public/DataAssets/RRDADirtDataAsset.h new file mode 100644 index 0000000..94a2799 --- /dev/null +++ b/Source/RefinedRDApi/Public/DataAssets/RRDADirtDataAsset.h @@ -0,0 +1,51 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "RRDADataAssetBase.h" +#include "ItemAmount.h" + +#include "RRDADirtDataAsset.generated.h" + +UCLASS( BlueprintType ) +class REFINEDRDAPI_API URRDADirtDataAsset : public URRDADataAssetBase +{ + GENERATED_BODY() + +public: + UFUNCTION( BlueprintPure, Category="FicsitFarming|Dirt" ) + static TArray GetExtractableSeed(URRDADirtDataAsset* Asset); + + UFUNCTION( BlueprintPure, Category="FicsitFarming|Dirt" ) + static float GetExtractionCycleTime(URRDADirtDataAsset* Asset); + + UFUNCTION( BlueprintPure, Category="FicsitFarming|Dirt" ) + static int32 GetDirtConsume(URRDADirtDataAsset* Asset); + +public: + /** + * What Item should be a Dirt? + * @warning - If 2 DirtDataAssets have the same Item, the game will use the last one which was loaded + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FicsitFarming") + TSubclassOf mItem; + + /** + * Seeds that can be extracted from this dirt every cycle + */ + UPROPERTY( EditAnywhere, BlueprintReadWrite, Category="FicsitFarming" ) + TArray mExtractableSeed; + + /** + * Production time for the extraction of seeds + */ + UPROPERTY( EditAnywhere, BlueprintReadWrite, Category="FicsitFarming" ) + float mExtractionCycleTime = 6.0f; + + /** + * How much dirt should be consumed? + */ + UPROPERTY( EditAnywhere, BlueprintReadWrite, Category="FicsitFarming" ) + int32 mDirtConsume = 2; +}; \ No newline at end of file diff --git a/Source/RefinedRDApi/Public/DataAssets/RRDAHeaterDataAsset.h b/Source/RefinedRDApi/Public/DataAssets/RRDAHeaterDataAsset.h new file mode 100644 index 0000000..d565c3f --- /dev/null +++ b/Source/RefinedRDApi/Public/DataAssets/RRDAHeaterDataAsset.h @@ -0,0 +1,36 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "RRDADataAssetBase.h" +#include "ItemAmount.h" +#include "Enums/RRDARPEnums.h" + +#include "RRDAHeaterDataAsset.generated.h" + +UCLASS( BlueprintType ) +class REFINEDRDAPI_API URRDAHeaterDataAsset : public URRDADataAssetBase +{ + GENERATED_BODY() + +public: + /** + * What type of heater this is + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater") + ERRDAHeaterType mHeaterType; + + /** + * Fuel item that this heater uses + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater") + FItemAmount mInput; + + /** + * Item that this turbine produces + * @Note - Can be nullptr + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater") + FItemAmount mOutput; +}; \ No newline at end of file diff --git a/Source/RefinedRDApi/Public/DataAssets/RRDATurbineDataAsset.h b/Source/RefinedRDApi/Public/DataAssets/RRDATurbineDataAsset.h new file mode 100644 index 0000000..38ef9c6 --- /dev/null +++ b/Source/RefinedRDApi/Public/DataAssets/RRDATurbineDataAsset.h @@ -0,0 +1,29 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "RRDADataAssetBase.h" +#include "ItemAmount.h" + +#include "RRDATurbineDataAsset.generated.h" + +UCLASS( BlueprintType ) +class REFINEDRDAPI_API URRDATurbineDataAsset : public URRDADataAssetBase +{ + GENERATED_BODY() + +public: + /** + * Fuel item that this heater uses + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Turbine") + FItemAmount mItem; + + /** + * Item that this turbine produces + * @Note - Can be nullptr so that the turbine doesn't produce anything + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Turbine") + FItemAmount mWasteItem; +}; \ No newline at end of file diff --git a/Source/RefinedRDApi/Public/Enums/RRDARPEnums.h b/Source/RefinedRDApi/Public/Enums/RRDARPEnums.h new file mode 100644 index 0000000..5500bd6 --- /dev/null +++ b/Source/RefinedRDApi/Public/Enums/RRDARPEnums.h @@ -0,0 +1,19 @@ +#pragma once + +#include "CoreMinimal.h" + +UENUM(BlueprintType) +enum class ERRDAHeaterType : uint8 +{ + Biomass, + Coal, + Solution, + Nuclear +}; + +UENUM(BlueprintType) +enum class ERRDACoolerType : uint8 +{ + Chemical, + Steam +}; \ No newline at end of file diff --git a/Source/RefinedRDApi/Public/RefinedRDApi.h b/Source/RefinedRDApi/Public/RefinedRDApi.h new file mode 100644 index 0000000..5c6b9cd --- /dev/null +++ b/Source/RefinedRDApi/Public/RefinedRDApi.h @@ -0,0 +1,11 @@ +#pragma once + +DECLARE_LOG_CATEGORY_EXTERN(LogRRDApi, Log, All) + +class FRefinedRDApiModule : public IModuleInterface +{ +public: + /** IModuleInterface implementation */ + virtual void StartupModule() override; + virtual void ShutdownModule() override; +}; \ No newline at end of file diff --git a/Source/RefinedRDApi/Public/Structs/.gitkeep b/Source/RefinedRDApi/Public/Structs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Source/RefinedRDApi/Public/Subsystems/RRDADataAssetSubsystem.h b/Source/RefinedRDApi/Public/Subsystems/RRDADataAssetSubsystem.h new file mode 100644 index 0000000..a7d75ed --- /dev/null +++ b/Source/RefinedRDApi/Public/Subsystems/RRDADataAssetSubsystem.h @@ -0,0 +1,132 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "RefinedRDApi.h" +#include "AssetRegistry/AssetRegistryModule.h" +#include "DataAssets/RRDADataAssetBase.h" +#include "DataAssets/RRDADirtDataAsset.h" +#include "Engine/AssetManager.h" +#include "Enums/RRDARPEnums.h" +#include "Resources/FGItemDescriptor.h" + +#include "RRDADataAssetSubsystem.generated.h" + +class IAssetRegistry; + +UCLASS() +class REFINEDRDAPI_API URRDADataAssetSubsystem : public UWorldSubsystem +{ + GENERATED_BODY() + +public: + URRDADataAssetSubsystem(); + + static URRDADataAssetSubsystem* Get(UObject* Context); + static URRDADataAssetSubsystem* GetChecked(UObject* Context); + + /** Implement this for initialization of instances of the system */ + virtual void Initialize(FSubsystemCollectionBase& Collection) override; + + virtual void Deinitialize() override; + + /** + * Note: call this function only in the constructor of the subsystem OR if you change some mDisabled value in runtime to refresh cached data + */ + UFUNCTION(BlueprintCallable, Category = "RRDA|DataAsset") + void StartScanForDataAssets(); + + void ReCacheDirtDataAssets(); + void ReCacheTurbineDataAssets(); + void ReCacheBoilerDataAssets(); + void ReCacheCoolerDataAssets(); + void ReCacheHeaterDataAssets(); + +public: + UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|FF") + int32 GetAllDirtItems(TArray>& Items) const; + + UFUNCTION(BlueprintCallable, Category = "RRDA|DataAsset|FF") + URRDADirtDataAsset* GetDataForDirtItem(TSubclassOf Item) const; + +public: + /** + * Find all data assets of a specific class + * @param OutDataAssets - Set of data assets + * @return true if found any data assets + */ + template + bool FindAllDataAssetsOfClass(TSet& OutDataAssets); + +private: + UPROPERTY() + TMap, class URRDADirtDataAsset*> mDirtAssets; + + TMap, class URRDATurbineDataAsset*>> mTurbineAssets; + TMap, class URRDABoilerDataAsset*>> mBoilerAssets; + TMap, class URRDACoolerDataAsset*>> mCoolerAssets; + TMap, class URRDAHeaterDataAsset*>> mHeaterAssets; + +public: + UPROPERTY(BlueprintReadOnly, Transient, Category = "RRDA|DataAsset") + TSet mDisabledDataAssets; + + UPROPERTY(BlueprintReadOnly, Transient, Category = "RRDA|DataAsset") + TSet mAllDataAssets; +}; + +template +bool URRDADataAssetSubsystem::FindAllDataAssetsOfClass(TSet& OutDataAssets) +{ + OutDataAssets.Empty(); + + // This doesn't work the AssetDatas are always invalid + /*UAssetManager& Manager = UAssetManager::Get(); + + TArray AssetDatas; + Manager.GetPrimaryAssetDataList(FPrimaryAssetType("RRDADataAsset"), AssetDatas); + + for (FAssetData AssetData : AssetDatas) + { + if(AssetData.IsValid()) + { + if(URRDADataAssetBase* Asset = Cast(AssetData.GetAsset())) + { + if(!URRDADataAssetBase::IsEnabled(Asset, GetWorld())) + { + UE_LOG(LogRRDApi, Error, TEXT("Asset Disabled: %s"), *AssetData.AssetName.ToString()); + continue; + } + + OutDataAssets.Add(Cast(Asset)); + UE_LOG(LogRRDApi, Log, TEXT("Found %s"), *AssetData.GetAsset()->GetPathName()); + } + } else + { + UE_LOG(LogRRDApi, Error, TEXT("Invalid AssetData: %s"), *AssetData.AssetName.ToString()); + return false; + } + }*/ + + TArray FoundClasses; + GetDerivedClasses(T::StaticClass(), FoundClasses, true); + + for (UClass* FoundClass : FoundClasses) + { + if(FoundClass->IsNative()) continue; + + if(URRDADataAssetBase* Asset = FoundClass->GetDefaultObject()) + { + if(!URRDADataAssetBase::IsEnabled(Asset, GetWorld())) + { + UE_LOG(LogRRDApi, Error, TEXT("Asset Disabled: %s"), *FoundClass->GetPathName()); + continue; + } + OutDataAssets.Add(FoundClass->GetDefaultObject()); + UE_LOG(LogRRDApi, Log, TEXT("Found %s"), *FoundClass->GetPathName()); + } + } + + return OutDataAssets.Num() > 0; +} diff --git a/Source/RefinedRDApi/RefinedRDApi.Build.cs b/Source/RefinedRDApi/RefinedRDApi.Build.cs new file mode 100644 index 0000000..607dba9 --- /dev/null +++ b/Source/RefinedRDApi/RefinedRDApi.Build.cs @@ -0,0 +1,65 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +using UnrealBuildTool; + +public class RefinedRDApi : ModuleRules +{ + public RefinedRDApi(ReadOnlyTargetRules Target) : base(Target) + { + CppStandard = CppStandardVersion.Cpp20; + PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; + bLegacyPublicIncludePaths = false; + + PublicDependencyModuleNames.AddRange( + new[] + { + "Json", + "Core", + "CoreUObject", + "Engine", + "DeveloperSettings", + "PhysicsCore", + "InputCore", + "OnlineSubsystem", "OnlineSubsystemNull", "OnlineSubsystemUtils", + "SignificanceManager", + "GeometryCollectionEngine", + "ChaosVehiclesCore", "ChaosVehicles", "ChaosSolverEngine", + "AnimGraphRuntime", + "AkAudio", "HTTP", + "AssetRegistry", + "NavigationSystem", + "ReplicationGraph", + "AIModule", + "GameplayTasks", + "SlateCore", "Slate", "UMG", + "RenderCore", + "CinematicCamera", + "Foliage", + "Niagara", + "EnhancedInput", + "GameplayCameras", + "TemplateSequence", + "NetCore", + "GameplayTags" + }); + + // FactoryGame plugins + PublicDependencyModuleNames.AddRange(new[] + { + "AbstractInstance", + "InstancedSplinesComponent", + "SignificanceISPC" + }); + + // Header stubs + PublicDependencyModuleNames.AddRange(new[] + { + "DummyHeaders" + }); + + if (Target.Type == TargetRules.TargetType.Editor) + PublicDependencyModuleNames.AddRange(new[] { "OnlineBlueprintSupport", "AnimGraph" }); + + PublicDependencyModuleNames.AddRange(new[] { "FactoryGame", "SML" }); + } +} \ No newline at end of file diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..b0c8928 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.1.18 \ No newline at end of file diff --git a/bump.sh b/bump.sh new file mode 100644 index 0000000..2282a7f --- /dev/null +++ b/bump.sh @@ -0,0 +1,98 @@ +#!/bin/bash + +# Thanks goes to @pete-otaqui for the initial gist: +# https://gist.github.com/pete-otaqui/4188238 +# +# Original version modified by Marek Suscak +# +# works with a file called VERSION in the current directory, +# the contents of which should be a semantic version number +# such as "1.2.3" or even "1.2.3-beta+001.ab" + +# this script will display the current version, automatically +# suggest a "minor" version update, and ask for input to use +# the suggestion, or a newly entered value. + +# once the new version number is determined, the script will +# pull a list of changes from git history, prepend this to +# a file called CHANGELOG.md (under the title of the new version +# number), give user a chance to review and update the changelist +# manually if needed and create a GIT tag. + +NOW="$(date +'%B %d, %Y')" +RED="\033[1;31m" +GREEN="\033[0;32m" +YELLOW="\033[1;33m" +BLUE="\033[1;34m" +PURPLE="\033[1;35m" +CYAN="\033[1;36m" +WHITE="\033[1;37m" +RESET="\033[0m" + +LATEST_HASH=$(git log --pretty=format:'%h' -n 1) + +QUESTION_FLAG="${GREEN}?" +WARNING_FLAG="${YELLOW}!" +NOTICE_FLAG="${CYAN}❯" + +ADJUSTMENTS_MSG="${QUESTION_FLAG} ${CYAN}Now you can make adjustments to ${WHITE}CHANGELOG.md${CYAN}. Then press enter to continue.${RESET}" +PUSHING_MSG="${NOTICE_FLAG} Pushing new version to the ${WHITE}origin${CYAN}...${RESET}" + +if [ -f VERSION ]; then + BASE_STRING=$(cat VERSION) + BASE_LIST=($(echo $BASE_STRING | tr '.' ' ')) + V_MAJOR=${BASE_LIST[0]} + V_MINOR=${BASE_LIST[1]} + V_PATCH=${BASE_LIST[2]} + echo -e "${NOTICE_FLAG} Current version: ${WHITE}$BASE_STRING${RESET}" + echo -e "${NOTICE_FLAG} Latest commit hash: ${WHITE}$LATEST_HASH${RESET}" + V_PATCH=$((V_PATCH + 1)) + SUGGESTED_VERSION="$V_MAJOR.$V_MINOR.$V_PATCH" + echo -ne "${QUESTION_FLAG} ${CYAN}Enter a version number [${WHITE}$SUGGESTED_VERSION${CYAN}]:${RESET} " + read INPUT_STRING + if [ "$INPUT_STRING" = "" ]; then + INPUT_STRING=$SUGGESTED_VERSION + fi + echo -e "${NOTICE_FLAG} Will set new version to be ${WHITE}$INPUT_STRING${RESET}" + echo -en $INPUT_STRING >VERSION + echo "## $INPUT_STRING ($NOW)" >tmpfile + git log --pretty=format:" - %s" "v$BASE_STRING"...HEAD >>tmpfile + echo "" >>tmpfile + echo "" >>tmpfile + cat CHANGELOG.md >>tmpfile + mv tmpfile CHANGELOG.md + echo -e "$ADJUSTMENTS_MSG" + read + echo -e "$PUSHING_MSG" + git add CHANGELOG.md VERSION + git commit -m "Bump version to ${INPUT_STRING}." + git push + git tag -a -m "Tag version ${INPUT_STRING}." "v$INPUT_STRING" + git push origin --tags +else + echo -e "${WARNING_FLAG} Could not find a VERSION file.${RESET}" + echo -ne "${QUESTION_FLAG} ${CYAN}Do you want to create a version file and start from scratch? [${WHITE}y${CYAN}]:${RESET} " + read RESPONSE + if [ "$RESPONSE" = "" ]; then RESPONSE="y"; fi + if [ "$RESPONSE" = "Y" ]; then RESPONSE="y"; fi + if [ "$RESPONSE" = "Yes" ]; then RESPONSE="y"; fi + if [ "$RESPONSE" = "yes" ]; then RESPONSE="y"; fi + if [ "$RESPONSE" = "YES" ]; then RESPONSE="y"; fi + if [ "$RESPONSE" = "y" ]; then + echo -en "1.0.0" >VERSION + echo "## 1.0.0 ($NOW)" >CHANGELOG.md + git log --pretty=format:" - %s" >>CHANGELOG.md + echo "" >>CHANGELOG.md + echo "" >>CHANGELOG.md + echo -e "$ADJUSTMENTS_MSG" + read + echo -e "$PUSHING_MSG" + git add VERSION CHANGELOG.md + git commit -m "Add VERSION and CHANGELOG.md files, Bump version to v1.0.0." + git push + git tag -a -m "Tag version 1.0.0." "v1.0.0" + git push origin --tags + fi +fi + +echo -e "${NOTICE_FLAG} Finished.${RESET}"