From b4f62b7732fef4839719251e4fddde3ba79b5f04 Mon Sep 17 00:00:00 2001 From: Lukas Date: Mon, 19 Sep 2022 12:43:43 +0200 Subject: [PATCH 01/58] New Build/CI System --- .github/workflows/build.yml | 68 ------ .github/workflows/ci.yml | 157 ++++++++++++++ .gitignore | 11 +- BuildSettings.bat | 8 + InstaGibPlus.sublime-project | 2 +- README.md | 8 +- System/ACETweakList_InstaGibPlus.txt | 6 + .../{InstaGibPlus9.int => InstaGibPlus.int} | 68 +++--- build.bat | 195 +++++++++++++++--- 9 files changed, 383 insertions(+), 140 deletions(-) delete mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/ci.yml create mode 100644 BuildSettings.bat create mode 100644 System/ACETweakList_InstaGibPlus.txt rename System/{InstaGibPlus9.int => InstaGibPlus.int} (81%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index f4b62d79..00000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,68 +0,0 @@ -# This is a basic workflow to help you get started with Actions - -name: CI - -# Controls when the workflow will run -on: - # Triggers the workflow on push or pull request events but only for the master branch - push: - branches: [ master ] - pull_request: - branches: [ master ] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "build" - build: - # The type of runner that the job will run on - runs-on: windows-latest - - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - - name: Download 469b Patch - uses: robinraju/release-downloader@v1.2 - with: - repository: "OldUnreal/UnrealTournamentPatches" - tag: "v469b" - fileName: "OldUnreal-UTPatch469b-Windows.zip" - - - name: Extract Patch - uses: DuckSoft/extract-7z-action@v1.0 - with: - pathSource: "OldUnreal-UTPatch469b-Windows.zip" - pathTarget: . - - - name: Checkout IG+ - uses: actions/checkout@v2 - with: - path: InstaGibPlus9/ - - - name: Extract Necessary Resources - uses: DuckSoft/extract-7z-action@v1.0 - with: - pathSource: InstaGibPlus9/Build/BuildEnv.zip - pathTarget: . - - # Runs a single command using the runners shell - - name: Build IG+ - run: InstaGibPlus9/build.bat silent noint - - - name: Save UCC.log - if: failure() - uses: actions/upload-artifact@v2 - with: - name: ucc-output - path: System/UCC.log - - - name: Save IG+ Package - if: success() - uses: actions/upload-artifact@v2 - with: - name: InstaGibPlus9 - path: | - InstaGibPlus9/System/ - InstaGibPlus9/LICENSE - InstaGibPlus9/README.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..01e6408d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,157 @@ +name: CI + +on: + push: + + pull_request: + + release: + types: [published] + + workflow_dispatch: + +jobs: + build: + runs-on: windows-latest + + steps: + - name: Download 469b Patch + uses: robinraju/release-downloader@v1.2 + with: + repository: "OldUnreal/UnrealTournamentPatches" + tag: "v469b" + fileName: "OldUnreal-UTPatch469b-Windows.zip" + + - name: Extract Patch + uses: DuckSoft/extract-7z-action@v1.0 + with: + pathSource: "OldUnreal-UTPatch469b-Windows.zip" + pathTarget: . + + - name: Determine Package Name + run: | + if ("${{ github.ref_type }}" -eq "tag") { + echo ("PKG_NAME=${{ github.event.repository.name }}_"+"${{ github.ref }}".SubString(10)) >> $env:GITHUB_ENV + } elseif ("${{ github.ref }}".StartsWith("refs/pull/:")) { + echo ("PKG_NAME=${{ github.event.repository.name }}_pr_"+"${{ github.ref }}".SubString(11, $length - 17)) >> $env:GITHUB_ENV + } else { + echo ("PKG_NAME=${{ github.event.repository.name }}_"+"${{ github.ref }}".SubString(11)+"-"+"${{ github.sha }}".SubString(0,8)) >> $env:GITHUB_ENV + } + + - name: Save Package Name In File + run: echo ("${{ env.PKG_NAME }}") >> PackageName + + - name: Create Package Name Artifact + uses: actions/upload-artifact@v2 + with: + name: PackageName + path: PackageName + retention-days: 1 + if-no-files-found: error + + - name: Checkout ${{ github.event.repository.name }} + uses: actions/checkout@v2 + with: + path: ${{ env.PKG_NAME }}/ + + - name: Rename Localization Files + run: | + function Replace-PackageName { + param( + $File + ) + + $OldName = $File.Name + $NewName = ($File.Name -replace "${{ github.event.repository.name }}\.","${{ env.PKG_NAME }}.") + $NewItem = ("${{ env.PKG_NAME }}/System/" + $NewName) + Write-Output ($OldName + " -> " + $NewName) + if (Test-Path -Path $NewItem) { Remove-Item $NewItem } + (Get-Content -Path $File.FullName) | ForEach-Object { + ($_ -replace "${{ github.event.repository.name }}\.","${{ env.PKG_NAME }}.") >> $NewItem + } + Remove-Item $File + } + Get-ChildItem "${{ env.PKG_NAME }}/System/${{ github.event.repository.name }}.*" | ForEach-Object { + Replace-PackageName($_) + } + Get-ChildItem "${{ env.PKG_NAME }}/System/ACEFileList_${{ github.event.repository.name }}.*" | ForEach-Object { + Replace-PackageName($_) + } + Get-ChildItem "${{ env.PKG_NAME }}/System/ACETweakList_${{ github.event.repository.name }}.*" | ForEach-Object { + Replace-PackageName($_) + } + + - name: Extract Necessary Resources + uses: DuckSoft/extract-7z-action@v1.0 + with: + pathSource: "${{ env.PKG_NAME }}/Build/BuildEnv.zip" + pathTarget: . + + - name: Build ${{ github.event.repository.name }} + run: "${{ env.PKG_NAME }}/Build.bat silent noint nouz verbose" + + - name: Save UCC.log + if: failure() + uses: actions/upload-artifact@v2 + with: + name: ucc-output + path: System/UCC.log + + - name: Collect Release Files + run: | + if (Test-Path -Path "${{ env.PKG_NAME }}/System" -PathType Container) { Copy-Item -Path "${{ env.PKG_NAME }}/System" -Destination "Release/System" -Recurse -Force -Verbose } + if (Test-Path -Path "${{ env.PKG_NAME }}/Docs" -PathType Container) { Copy-Item -Path "${{ env.PKG_NAME }}/Docs" -Destination "Release/Docs" -Recurse -Force -Verbose } + if (Test-Path -Path "${{ env.PKG_NAME }}/LICENSE") { Copy-Item -Path "${{ env.PKG_NAME }}/LICENSE" -Destination "Release" -Verbose } + if (Test-Path -Path "${{ env.PKG_NAME }}/README.md") { Copy-Item -Path "${{ env.PKG_NAME }}/README.md" -Destination "Release" -Verbose } + if (Test-Path -Path "${{ env.PKG_NAME }}/Build/Dependencies" -PathType Container) { + Get-ChildItem "${{ env.PKG_NAME }}/Build/Dependencies" | ForEach-Object { + $Dep = $_ + if (Test-Path $Dep -PathType Container) { + Get-ChildItem $Dep | ForEach-Object { + Copy-Item $_ -Destination "Release" -Recurse -Force -Verbose + } + } + } + } + + - name: Save ${{ github.event.repository.name }} Package + uses: actions/upload-artifact@v2 + with: + name: "${{ env.PKG_NAME }}" + path: | + Release/**/* + Release/* + !Release/**/*.uz + + release: + runs-on: windows-latest + needs: build + if: ${{ github.event_name == 'release' }} + + steps: + - name: Download Artifact + uses: actions/download-artifact@v2 + with: + name: PackageName + + - name: Restore Package Name + run: | + echo ("PKG_NAME=" + (Get-Content -Path "PackageName")) >> $env:GITHUB_ENV + Remove-Item -Path "PackageName" + + - name: Download Artifact + uses: actions/download-artifact@v2 + with: + name: ${{ env.PKG_NAME }} + + - name: Create Release Asset + run: > + 7z a -tzip -- "${{ env.PKG_NAME }}.zip" * + + - name: Attach Asset To Release + uses: shogo82148/actions-upload-release-asset@v1 + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: ${{ env.PKG_NAME }}.zip + overwrite: true + diff --git a/.gitignore b/.gitignore index 896ea583..9634f1f2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,9 @@ -*.old -*.old2 -*.uc_ig -*.uc_nn +/Classes/VersionInfo.uc *.sublime-workspace - PostBuildHook.bat /Build/Temp/**/* -/System/**/* -!/System/**/InstaGibPlus*.int +/System/**/*.u +/System/**/*.uz + diff --git a/BuildSettings.bat b/BuildSettings.bat new file mode 100644 index 00000000..dc7d42f4 --- /dev/null +++ b/BuildSettings.bat @@ -0,0 +1,8 @@ +:: List of dependencies, add your own here. +:: Do not use linebreaks to separate dependencies. Always use spaces. +:: Order is important. If package A depends on package B, then B must +:: appear in the list before A. +:: Example: +:: set DEPENDENCIES=MyDependency MyOtherDependency MyThirdDependency +:: +set DEPENDENCIES= diff --git a/InstaGibPlus.sublime-project b/InstaGibPlus.sublime-project index d0f6c2bf..c4cb40ea 100644 --- a/InstaGibPlus.sublime-project +++ b/InstaGibPlus.sublime-project @@ -18,7 +18,7 @@ { "name": "Build IG+", "file_patterns": ["*.uc"], - "cmd": ["$project_path/build.bat", "silent"] + "cmd": ["$project_path/Build.bat", "silent"] } ] } diff --git a/README.md b/README.md index 73a7ade7..86389dbe 100644 --- a/README.md +++ b/README.md @@ -1451,10 +1451,10 @@ Each entry can be used to force a setting on clients: # Building 1. Go to the installation directory of UT99 in a command shell -2. Use `git clone https://github.com/utspect/InstaGibPlus InstaGibPlus9` to clone the repo -3. Navigate to the newly created directory `InstaGibPlus9` -4. Execute `build.bat` -5. The result of the build process will be available in the `System` folder that is next to `build.bat` +2. Use `git clone https://github.com/utspect/InstaGibPlus` to clone the repo +3. Navigate to the newly created directory `InstaGibPlus` +4. Execute `Build.bat` +5. The result of the build process will be available in the `System` folder that is next to `Build.bat` # Credits diff --git a/System/ACETweakList_InstaGibPlus.txt b/System/ACETweakList_InstaGibPlus.txt new file mode 100644 index 00000000..0cec6398 --- /dev/null +++ b/System/ACETweakList_InstaGibPlus.txt @@ -0,0 +1,6 @@ +##################################################################################################################################################################### +# Type Class Name Property Name Condition Property Type Property Value # +##################################################################################################################################################################### +ALLOW InstaGibPlus.ClientSuperShockBeam InstaGibPlus.ClientSuperShockBeam.Free EQ STRING * +ALLOW InstaGibPlus.bbPlayerStatics InstaGibPlus.bbPlayerStatics.* EQ ANY * +ALLOW InstaGibPlus.PureHUDHelper InstaGibPlus.PureHUDHelper.* EQ ANY * \ No newline at end of file diff --git a/System/InstaGibPlus9.int b/System/InstaGibPlus.int similarity index 81% rename from System/InstaGibPlus9.int rename to System/InstaGibPlus.int index 38c64190..98bf9abe 100644 --- a/System/InstaGibPlus9.int +++ b/System/InstaGibPlus.int @@ -1,38 +1,38 @@ [Public] -Object=(Name=InstaGibPlus9.ST_Mutator,Class=Class,MetaClass=Engine.Mutator,Description="IG+9 ST_Mutator,InstaGibPlus9 ST_Mutator") -Object=(Name=InstaGibPlus9.PureStatMutator,Class=Class,MetaClass=Engine.Mutator,Description="PureStatMutator,") -Object=(Name=InstaGibPlus9.UTPure,Class=Class,MetaClass=Engine.Mutator,Description="IG+9 UTPure,InstaGibPlus9 UTPure") -Object=(Name=InstaGibPlus9.MutKillFeed,Class=Class,MetaClass=Engine.Mutator,Description="IG+9 Kill Feed,InstaGibPlus9 Kill Feed Mutator") -Object=(Name=InstaGibPlus9.PureClickBoard,Class=Class,MetaClass=Engine.Mutator,Description="PureClickBoard,") -Object=(Name=InstaGibPlus9.MutFraggerArena,Class=Class,MetaClass=Engine.Mutator,Description="Fragger Arena,Sniper+Translocator camping combat") -Object=(Name=InstaGibPlus9.NewNetArena,Class=Class,MetaClass=Engine.Mutator,Description="NewNetArena,") -Object=(Name=InstaGibPlus9.NewNetIG,Class=Class,MetaClass=Engine.Mutator,Description="IG+9 NewNetIG,InstaGibPlus9 NewNetIG") -Object=(Name=InstaGibPlus9.NNAnnouncer,Class=Class,MetaClass=Engine.Mutator,Description="NNAnnouncer,") -Object=(Name=InstaGibPlus9.NewNetSA,Class=Class,MetaClass=Engine.Mutator,Description="IG+9 NewNetSA,InstaGibPlus9 NewNetSA") -Object=(Name=InstaGibPlus9.DisableNewNet,Class=Class,MetaClass=Engine.Mutator,Description="DisableNewNet,") -Object=(Name=InstaGibPlus9.DisableWeapons,Class=Class,MetaClass=Engine.Mutator,Description="DisableWeapons,") -Object=(Name=InstaGibPlus9.NN_FraggerRifle,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.NN_SniperRifle,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.NN_ShockRifle,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_sgShockRifle,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.NN_ASMD,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.NN_SuperShockRifle,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_ImpactHammer,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_enforcer,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_UT_FlakCannon,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_SniperRifle,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_WarheadLauncher,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_ut_biorifle,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_ShockRifle,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_minigun2,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_UT_Eightball,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_ripper,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_PulseGun,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_SuperShockRifle,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_Translocator,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_FraggerTranslocator,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.ST_WildcardsWeapons,Class=Class,MetaClass=Engine.Weapon) -Object=(Name=InstaGibPlus9.NN_SniperArenaRifle,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_Mutator,Class=Class,MetaClass=Engine.Mutator,Description="IG+9 ST_Mutator,InstaGibPlus9 ST_Mutator") +Object=(Name=InstaGibPlus.PureStatMutator,Class=Class,MetaClass=Engine.Mutator,Description="PureStatMutator,") +Object=(Name=InstaGibPlus.UTPure,Class=Class,MetaClass=Engine.Mutator,Description="IG+9 UTPure,InstaGibPlus9 UTPure") +Object=(Name=InstaGibPlus.MutKillFeed,Class=Class,MetaClass=Engine.Mutator,Description="IG+9 Kill Feed,InstaGibPlus9 Kill Feed Mutator") +Object=(Name=InstaGibPlus.PureClickBoard,Class=Class,MetaClass=Engine.Mutator,Description="PureClickBoard,") +Object=(Name=InstaGibPlus.MutFraggerArena,Class=Class,MetaClass=Engine.Mutator,Description="Fragger Arena,Sniper+Translocator camping combat") +Object=(Name=InstaGibPlus.NewNetArena,Class=Class,MetaClass=Engine.Mutator,Description="NewNetArena,") +Object=(Name=InstaGibPlus.NewNetIG,Class=Class,MetaClass=Engine.Mutator,Description="IG+9 NewNetIG,InstaGibPlus9 NewNetIG") +Object=(Name=InstaGibPlus.NNAnnouncer,Class=Class,MetaClass=Engine.Mutator,Description="NNAnnouncer,") +Object=(Name=InstaGibPlus.NewNetSA,Class=Class,MetaClass=Engine.Mutator,Description="IG+9 NewNetSA,InstaGibPlus9 NewNetSA") +Object=(Name=InstaGibPlus.DisableNewNet,Class=Class,MetaClass=Engine.Mutator,Description="DisableNewNet,") +Object=(Name=InstaGibPlus.DisableWeapons,Class=Class,MetaClass=Engine.Mutator,Description="DisableWeapons,") +Object=(Name=InstaGibPlus.NN_FraggerRifle,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.NN_SniperRifle,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.NN_ShockRifle,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_sgShockRifle,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.NN_ASMD,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.NN_SuperShockRifle,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_ImpactHammer,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_enforcer,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_UT_FlakCannon,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_SniperRifle,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_WarheadLauncher,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_ut_biorifle,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_ShockRifle,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_minigun2,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_UT_Eightball,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_ripper,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_PulseGun,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_SuperShockRifle,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_Translocator,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_FraggerTranslocator,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.ST_WildcardsWeapons,Class=Class,MetaClass=Engine.Weapon) +Object=(Name=InstaGibPlus.NN_SniperArenaRifle,Class=Class,MetaClass=Engine.Weapon) [NN_FraggerRifle] WeaponDescription="Fragger Rifle" diff --git a/build.bat b/build.bat index 06ae02e8..73b336ee 100644 --- a/build.bat +++ b/build.bat @@ -1,50 +1,157 @@ +:: UT99 Build System For Windows +:: +:: Expects to have been placed in the root directory of the +:: package you want to build. +:: +:: Options: +:: BuildDir - Manually specify the root directory of the package +:: Example: C:\UT99\MyPackage\Build\Build.bat BuildDir "C:\UT99\MyPackage\" +:: NoInt - Do not automatically generate a .int for the package +:: NoUz - Do not automatically generate a .u.uz for the package +:: Silent - Suppresses compatibility warnings, automatically resolves them +:: NoBind - Prevents binding native functions to C++ implementations, useful when adding new natives +:: Verbose - Can be used multiple times. More verbose -> More output from script +:: +:: Dependencies: +:: There is a way to specify dependencies. +:: First, you need to add them to the list of dependencies +:: in BuildSettings.bat, which can be found next to this +:: file. +:: Second, you need to add a new folder under +:: Build/Dependencies/ with the name of the dependency. +:: Third, place inside it all resources for the dependency +:: in the same folder structure the game expects packages +:: to be in. That means .u files need to be inside a +:: System subfolder, .utx in a Textures subfolder, etc. +:: Example: +:: Lets say you have a package called MyPackage which +:: depends on a package called MyDependency. Here is what +:: the (simplified) folder structure should look like: +:: C:\UT99\MyPackage\ +:: ├─Build\ +:: │ └─Dependencies\ +:: │ └─MyDependency\ +:: │ ├─System\ +:: │ │ └─MyDependency.u +:: │ └─Textures\ +:: │ └─MyDependencyTex.utx +:: ├─Classes\ +:: │ └─MyClass.uc +:: ├─Build.bat +:: └─BuildSettings.bat +:: +:: A non-exhaustive list of reason you depend on a package: +:: - When you extend a class of another package +:: Example: +:: class MyClass extends MyDependency.CoolBaseClass; +:: - When you declare a variable/member of a type from +:: your dependency within one of your classes +:: Example: +:: var MyDependency.CoolClass MyVar; +:: - When you cast to a class from another package +:: Example: +:: MyVar = CoolClass(SomeActor); +:: - When you refer to an object from a dependency +:: Examples: +:: SomeClass = class'MyDependency.CoolClass'; +:: SomeTex = Texture'MyDependency.CoolTexture'; +:: SomeMesh = LodMesh'MyDependency.CoolMesh'; +:: +:: Be careful about what packages you depend on. +:: - Server admins need to install them together with your +:: package, which also means they need to redirect them +:: for people to download. More work for server admins +:: slows adoption of your package by them. +:: - Packages without obvious versioning might have multiple +:: different and incompatible versions using the same +:: name and being depended on by various other mods. +:: - Server admins might run into problems where your +:: package depends on version 2 of MyDependency, but +:: another package the server admin wants to use depends +:: on version 1 of MyDependency, which cant be resolved. +:: - As a consequence, make sure every package you release +:: has version information in the name, especially if you +:: expect to be depended on by someone else. +:: +:: PostBuildHook: +:: PostBuildHook.bat is executed after a successful build +:: if it exists next to this file. This is intended for +:: use with automation, like, for example, updating a +:: server with the shiny new version of MyPackage that +:: was just built. +:: For this reason PostBuildHook.bat should not be +:: archived in version control or shared with others. +:: +:: If the NoBind option is specified, PostBuildHook will +:: never be called because NoBind is an intermediary step +:: towards the final package. +:: @echo off setlocal enabledelayedexpansion enableextensions -set VERBOSE=0 + set BUILD_DIR=%~dp0 -set BUILD_TEMP=%BUILD_DIR%Build\Temp\ set BUILD_NOINT=0 set BUILD_NOUZ=0 set BUILD_SILENT=0 +set BUILD_NOBIND=0 +set BUILD_BYTEHAX=0 +set VERBOSE=0 :ParseArgs - if /I "%1" EQU "NoInt" ( set BUILD_NOINT=1 ) - if /I "%1" EQU "NoUz" ( set BUILD_NOUZ=1 ) - if /I "%1" EQU "Silent" ( set BUILD_SILENT=1 ) - if /I "%1" EQU "Verbose" ( set /A VERBOSE+=1 ) + if /I "%1" EQU "BuildDir" ( + set BUILD_DIR=%~f2 + shift /1 + ) + + if /I "%1" EQU "NoInt" ( set BUILD_NOINT=1 ) + if /I "%1" EQU "NoUz" ( set BUILD_NOUZ=1 ) + + if /I "%1" EQU "Silent" ( set BUILD_SILENT=1 ) + if /I "%1" EQU "NoBind" ( set BUILD_NOBIND=1 ) + if /I "%1" EQU "ByteHax" ( set BUILD_BYTEHAX=1 ) + + if /I "%1" EQU "Verbose" ( set /A VERBOSE+=1 ) + shift /1 if [%1] NEQ [] goto ParseArgs -call :SetPackageName "%~dp0." +if %VERBOSE% GEQ 3 echo on + +call :SetPackageName "%BUILD_DIR%." +call "%~dp0BuildSettings.bat" + +set BUILD_TEMP=%BUILD_DIR%Build\Temp\ if %VERBOSE% GEQ 1 ( - echo VERBOSE=%VERBOSE% + echo PACKAGE_NAME=%PACKAGE_NAME% + echo DEPENDENCIES=%DEPENDENCIES% echo BUILD_DIR=%BUILD_DIR% echo BUILD_TEMP=%BUILD_TEMP% echo BUILD_NOINT=%BUILD_NOINT% echo BUILD_NOUZ=%BUILD_NOUZ% echo BUILD_SILENT=%BUILD_SILENT% - echo PACKAGE_NAME=%PACKAGE_NAME% + echo BUILD_NOBIND=%BUILD_NOBIND% + echo BUILD_BYTEHAX=%BUILD_BYTEHAX% + echo VERBOSE=%VERBOSE% ) -pushd "%BUILD_DIR%" +pushd "%BUILD_DIR%..\System" set MAKEINI="%BUILD_TEMP%make.ini" -set DEPENDENCIES= - call :GenerateMakeIni %MAKEINI% %DEPENDENCIES% %PACKAGE_NAME% - -pushd ..\System +call :PrepareDependencies %DEPENDENCIES% :: make sure to always rebuild the package :: New package GUID, No doubts about staleness -del %PACKAGE_NAME%.u +if exist "%PACKAGE_NAME%.u" del %PACKAGE_NAME%.u -if %BUILD_SILENT% == 1 ( - call :Invoke ucc make -ini=%MAKEINI% -Silent -) else ( - call :Invoke ucc make -ini=%MAKEINI% -) +set MAKE_PARAMS=-ini=%MAKEINI% + +if %BUILD_SILENT% == 1 set MAKE_PARAMS=!MAKE_PARAMS! -Silent +if %BUILD_NOBIND% == 1 set MAKE_PARAMS=!MAKE_PARAMS! -NoBind +if %BUILD_BYTEHAX% == 1 set MAKE_PARAMS=!MAKE_PARAMS! -ByteHax + +call :Invoke ucc make %MAKE_PARAMS% :: dont do the post-process steps if compilation failed if ERRORLEVEL 1 goto compile_failed @@ -65,9 +172,13 @@ if %BUILD_NOINT% == 0 ( copy %PACKAGE_NAME%.int "%BUILD_DIR%System" >NUL ) -popd - -if exist "PostBuildHook.bat" call "PostBuildHook.bat" +:: The reason we dont call PostBuildHook is because if youre using NoBind, this +:: is not the actual build of the package. This just generates header files for +:: C++. These are then used to build the native library thats bound to the +:: package, which can (and should) then be built without NoBind. +if %BUILD_NOBIND% == 0 ( + call :Hook "%~dp0PostBuildHook.bat" +) echo [Finished at %Date% %Time%] @@ -77,10 +188,23 @@ exit /B 0 :compile_failed popd -popd endlocal exit /B 1 +:Hook +if exist %1 ( + @setlocal enabledelayedexpansion enableextensions + @call %1 + @endlocal + @if %VERBOSE% GEQ 3 ( + @echo on + ) else ( + @echo off + ) + +) +exit /B %ERRORLEVEL% + :Invoke if %VERBOSE% GEQ 1 echo %* %* @@ -103,10 +227,12 @@ exit /B %ERRORLEVEL% if not exist %1 mkdir "%~dp1" call :GenerateMakeIniPreamble %1 - :GenerateMakeIniNextDependency + :GenerateMakeIni_Loop + if [%2] EQU [] goto GenerateMakeIni_EndLoop call :GenerateMakeIniDependency %1 %2 shift /2 - if [%2] NEQ [] goto GenerateMakeIniNextDependency + goto GenerateMakeIni_Loop + :GenerateMakeIni_EndLoop call :GenerateMakeIniPostscript %1 exit /B %ERRORLEVEL% @@ -153,3 +279,20 @@ exit /B %ERRORLEVEL% :GenerateMakeIniDependency echo EditPackages=%2>>%1 exit /B %ERRORLEVEL% + +:PrepareDependencies + if [%1] EQU [] exit /B %ERRORLEVEL% + if exist "%BUILD_DIR%Build/Dependencies/%1/" ( + if %VERBOSE% GEQ 1 echo Copying Dependency %1 + if %VERBOSE% GEQ 1 ( + robocopy "%BUILD_DIR%Build/Dependencies/%1/" .. *.* /S /NJH /NJS /NS /NC /NP + ) else ( + robocopy "%BUILD_DIR%Build/Dependencies/%1/" .. *.* /S >NUL + ) + ) else ( + echo "Could not locate dependency '%1' in '%BUILD_DIR%Build/Dependencies/'" + ) + shift /1 + goto PrepareDependencies +exit /B %ERRORLEVEL% + From b1157a097eea8f6325e1d7141070d205ecfb864a Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Mon, 19 Sep 2022 14:15:31 +0200 Subject: [PATCH 02/58] Automatically Generate Version Info --- .github/workflows/ci.yml | 9 +++++++++ Build/CreateVersionInfo.bat | 20 ++++++++++++++++++++ build.bat | 2 ++ 3 files changed, 31 insertions(+) create mode 100644 Build/CreateVersionInfo.bat diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 01e6408d..1711801b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,10 +32,13 @@ jobs: run: | if ("${{ github.ref_type }}" -eq "tag") { echo ("PKG_NAME=${{ github.event.repository.name }}_"+"${{ github.ref }}".SubString(10)) >> $env:GITHUB_ENV + echo ("PKG_VER="${{ github.ref }}".SubString(10)) >> $env:GITHUB_ENV } elseif ("${{ github.ref }}".StartsWith("refs/pull/:")) { echo ("PKG_NAME=${{ github.event.repository.name }}_pr_"+"${{ github.ref }}".SubString(11, $length - 17)) >> $env:GITHUB_ENV + echo ("PKG_VER="pr_"+"${{ github.ref }}".SubString(11, $length - 17)) >> $env:GITHUB_ENV } else { echo ("PKG_NAME=${{ github.event.repository.name }}_"+"${{ github.ref }}".SubString(11)+"-"+"${{ github.sha }}".SubString(0,8)) >> $env:GITHUB_ENV + echo ("PKG_VER="${{ github.ref }}".SubString(11)+"-"+"${{ github.sha }}".SubString(0,8)) >> $env:GITHUB_ENV } - name: Save Package Name In File @@ -87,6 +90,12 @@ jobs: pathSource: "${{ env.PKG_NAME }}/Build/BuildEnv.zip" pathTarget: . + - name: Create VersionInfo.uc + shell: cmd + run: | + set BUILD_DIR=${{ env.PKG_NAME }} + ${{ env.PKG_NAME }}/Build/CreateVersionInfo.bat ${{ github.event.repository.name }} ${{ env.PKG_VER }} ${{ env.PKG_NAME }} + - name: Build ${{ github.event.repository.name }} run: "${{ env.PKG_NAME }}/Build.bat silent noint nouz verbose" diff --git a/Build/CreateVersionInfo.bat b/Build/CreateVersionInfo.bat new file mode 100644 index 00000000..c9a51653 --- /dev/null +++ b/Build/CreateVersionInfo.bat @@ -0,0 +1,20 @@ +@setlocal enabledelayedexpansion enableextensions + +set INFO_FILE=%BUILD_DIR%Classes\VersionInfo.uc + +@if NOT EXIST %INFO_FILE% ( + echo class VersionInfo extends Info;>%INFO_FILE% + @echo.>>%INFO_FILE% + @echo var string PackageBaseName;>>%INFO_FILE% + @echo var string PackageVersion;>>%INFO_FILE% + @echo var string PackageName;>>%INFO_FILE% + @echo.>>%INFO_FILE% + @echo defaultproperties {>>%INFO_FILE% + @echo PackageBaseName=%1>>%INFO_FILE% + @echo PackageVersion=%2>>%INFO_FILE% + @echo PackageName=%3>>%INFO_FILE% + @echo }>>%INFO_FILE% + @echo.>>%INFO_FILE% +) + +@endlocal diff --git a/build.bat b/build.bat index 73b336ee..2fdf4c60 100644 --- a/build.bat +++ b/build.bat @@ -135,6 +135,8 @@ if %VERBOSE% GEQ 1 ( echo VERBOSE=%VERBOSE% ) +call %BUILD_DIR%Build\CreateVersionInfo.bat %PACKAGE_NAME% dev %PACKAGE_NAME% + pushd "%BUILD_DIR%..\System" set MAKEINI="%BUILD_TEMP%make.ini" From 2ac558ee491d8a0b176e004a8f4d93fadc4e810c Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Mon, 19 Sep 2022 14:18:24 +0200 Subject: [PATCH 03/58] Fix CI Script Syntax --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1711801b..cd1f9fa9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,13 +32,13 @@ jobs: run: | if ("${{ github.ref_type }}" -eq "tag") { echo ("PKG_NAME=${{ github.event.repository.name }}_"+"${{ github.ref }}".SubString(10)) >> $env:GITHUB_ENV - echo ("PKG_VER="${{ github.ref }}".SubString(10)) >> $env:GITHUB_ENV + echo ("PKG_VER="+"${{ github.ref }}".SubString(10)) >> $env:GITHUB_ENV } elseif ("${{ github.ref }}".StartsWith("refs/pull/:")) { echo ("PKG_NAME=${{ github.event.repository.name }}_pr_"+"${{ github.ref }}".SubString(11, $length - 17)) >> $env:GITHUB_ENV - echo ("PKG_VER="pr_"+"${{ github.ref }}".SubString(11, $length - 17)) >> $env:GITHUB_ENV + echo ("PKG_VER=pr_"+"${{ github.ref }}".SubString(11, $length - 17)) >> $env:GITHUB_ENV } else { echo ("PKG_NAME=${{ github.event.repository.name }}_"+"${{ github.ref }}".SubString(11)+"-"+"${{ github.sha }}".SubString(0,8)) >> $env:GITHUB_ENV - echo ("PKG_VER="${{ github.ref }}".SubString(11)+"-"+"${{ github.sha }}".SubString(0,8)) >> $env:GITHUB_ENV + echo ("PKG_VER="+"${{ github.ref }}".SubString(11)+"-"+"${{ github.sha }}".SubString(0,8)) >> $env:GITHUB_ENV } - name: Save Package Name In File From c866e2ffd144ad860a1829758fef6ddfdc92b235 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Mon, 19 Sep 2022 14:36:48 +0200 Subject: [PATCH 04/58] Fix VersionInfo Generation --- .github/workflows/ci.yml | 2 +- Build/CreateVersionInfo.bat | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cd1f9fa9..5b37b0bc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -93,7 +93,7 @@ jobs: - name: Create VersionInfo.uc shell: cmd run: | - set BUILD_DIR=${{ env.PKG_NAME }} + set BUILD_DIR=${{ env.PKG_NAME }}/ ${{ env.PKG_NAME }}/Build/CreateVersionInfo.bat ${{ github.event.repository.name }} ${{ env.PKG_VER }} ${{ env.PKG_NAME }} - name: Build ${{ github.event.repository.name }} diff --git a/Build/CreateVersionInfo.bat b/Build/CreateVersionInfo.bat index c9a51653..4bc18f50 100644 --- a/Build/CreateVersionInfo.bat +++ b/Build/CreateVersionInfo.bat @@ -1,9 +1,13 @@ @setlocal enabledelayedexpansion enableextensions -set INFO_FILE=%BUILD_DIR%Classes\VersionInfo.uc +set INFO_FILE="%BUILD_DIR%Classes/VersionInfo.uc" + +@echo PackageBaseName=%1 +@echo PackageVersion=%2 +@echo PackageName=%3 @if NOT EXIST %INFO_FILE% ( - echo class VersionInfo extends Info;>%INFO_FILE% + echo class VersionInfo extends Info;>%INFO_FILE% @echo.>>%INFO_FILE% @echo var string PackageBaseName;>>%INFO_FILE% @echo var string PackageVersion;>>%INFO_FILE% From ac2b70c53b156a1735d56a3bb823a69089d330c7 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Mon, 19 Sep 2022 14:45:32 +0200 Subject: [PATCH 05/58] Integrate VersionInfo --- Classes/UTPure.uc | 18 +++++------------- Classes/bbPlayer.uc | 2 +- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/Classes/UTPure.uc b/Classes/UTPure.uc index 584678dd..dc836fd9 100644 --- a/Classes/UTPure.uc +++ b/Classes/UTPure.uc @@ -72,10 +72,6 @@ var config bool bAlwaysRenderDroppedFlags; var float zzTeamChangeTime; // This would be to Prevent Team Change Spamming var bool zzbWarmupPlayers; // Do we have any players warming up? var DeathMatchPlus zzDMP; // A place to store the Game Object. -var string VersionStr; // Holds the version code from VUC++ -var string LongVersion; // Holds the version code from VUC++ -var string ThisVer; // Holds the version letters -var string NiceVer; // Holds the version letters (no underscore) var string BADminText; // Text to give players that want admin commands without being admin. var bool bDidEndWarn; // True if screenshot warning has been sent to players. var bool bDidShot; @@ -160,11 +156,11 @@ function PreBeginPlay() function PrintVersionInfo() { local string LongStr; - LongStr = VersionStr@LongVersion$NiceVer; + LongStr = class'VersionInfo'.default.PackageBaseName@class'VersionInfo'.default.PackageVersion; if (Len(LongStr) > 20) { - xxLog("#"$class'StringUtils'.static.CenteredString(VersionStr, 29, " ")$"#"); - LongStr = LongVersion$NiceVer; + xxLog("#"$class'StringUtils'.static.CenteredString(class'VersionInfo'.default.PackageBaseName, 29, " ")$"#"); + LongStr = class'VersionInfo'.default.PackageVersion; } xxLog("#"$class'StringUtils'.static.CenteredString(LongStr, 29, " ")$"#"); @@ -235,7 +231,7 @@ function PostBeginPlay() { // Verify that the PlayerPack Package is in ServerPackages - curMLHPack = PlayerPacks[i]$"H"$ThisVer; + curMLHPack = PlayerPacks[i]$"H"$class'VersionInfo'.default.PackageVersion; fullpack = curMLHPack$"."$PlayerPacks[i]$"LoginHandler"; if (Instr(CAPS(ServPacks), Caps(Chr(34)$curMLHPack$Chr(34))) != -1) { @@ -894,7 +890,7 @@ function Mutate(string MutateString, PlayerPawn Sender) if (MutateString ~= "CheatInfo") { - Sender.ClientMessage("This server is running "$VersionStr@NiceVer); + Sender.ClientMessage("This server is running "$class'VersionInfo'.default.PackageBaseName@class'VersionInfo'.default.PackageVersion); if (bUTPureEnabled) { Sender.ClientMessage("UTPure settings:"); @@ -1469,10 +1465,6 @@ defaultproperties DefaultTeamHitSound=3 TeleRadius=210 ThrowVelocity=750 - VersionStr="IG+" - LongVersion="" - ThisVer="9" - NiceVer="9" BADminText="Not allowed - Log in as admin!" bAlwaysTick=True NNAnnouncer=True diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index c6aca107..0c246b8d 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -7313,7 +7313,7 @@ simulated function xxDrawLogo(canvas zzC, float zzx, float zzY, float zzFadeValu zzC.DrawColor = ChallengeHud(MyHud).CyanColor * zzFadeValue; zzC.SetPos(zzx+70,zzY+8); zzC.Font = ChallengeHud(MyHud).MyFonts.GetBigFont(zzC.ClipX); - zzC.DrawText(class'UTPure'.default.VersionStr@class'UTPure'.default.NiceVer); + zzC.DrawText(class'VersionInfo'.default.PackageBaseName@class'VersionInfo'.default.PackageVersion); zzC.SetPos(zzx+70,zzY+35); zzC.Font = ChallengeHud(MyHud).MyFonts.GetBigFont(zzC.ClipX); if (zzbDoScreenshot) From f12425885c695625e18236f91e2d2dfa6fe7b7f3 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Mon, 26 Sep 2022 16:08:08 +0200 Subject: [PATCH 06/58] Fix OOB Array Access --- Classes/UTPure.uc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/UTPure.uc b/Classes/UTPure.uc index dc836fd9..410fc042 100644 --- a/Classes/UTPure.uc +++ b/Classes/UTPure.uc @@ -787,7 +787,7 @@ function ModifyLogout(Pawn Exiting) { local TeamGamePlus TGP; bbPRI = bbPlayerReplicationInfo(Exiting.PlayerReplicationInfo); - if (bbPRI != none) { + if (bbPRI != none && bbPRI.SkinIndex >= 0) { TGP = TeamGamePlus(Level.Game); if (TGP != none) { SkinIndexToPRIMap[(bbPRI.Team << 4) + bbPRI.SkinIndex] = none; From e14c671d699b36af97fb75cc64c7da4ac5ae87c3 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Mon, 26 Sep 2022 16:08:24 +0200 Subject: [PATCH 07/58] Fix Accessed None --- Classes/bbPlayer.uc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 0c246b8d..e2a9927d 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -4643,7 +4643,8 @@ function TakeDamage( int Damage, Pawn InstigatedBy, Vector HitLocation, if ( Level.Game.DamageMutator != None ) Level.Game.DamageMutator.MutatorTakeDamage( ActualDamage, Self, InstigatedBy, HitLocation, Momentum, DamageType ); - IGPlus_DamageEvent_Add(InstigatedBy.PlayerReplicationInfo, ModifiedDamage1, DamageType); + if (InstigatedBy != none) + IGPlus_DamageEvent_Add(InstigatedBy.PlayerReplicationInfo, ModifiedDamage1, DamageType); if (zzStatMut != None) { // Damn epic. Damn Damn. Why is armor handled before mutator gets it? Instead of doing it simple, I now have From 70d850a36a55689486d2afabd0e6c37279f5f0b5 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Fri, 30 Sep 2022 23:31:48 +0200 Subject: [PATCH 08/58] Send CAP Eagerly Without LoosePositionCheck --- Classes/bbPlayer.uc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index e2a9927d..62b46c58 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -2733,7 +2733,9 @@ function IGPlus_SendCAP() { xxCAP(CurrentTimeStamp, GetStateName(), CAPMiscData | (Physics << 2), ClientLoc.X, ClientLoc.Y, ClientLoc.Z, Velocity.X, Velocity.Y, Velocity.Z, Base); LastCAPTime = ServerTimeStamp; - NextRealCAPTime = ServerTimeStamp + PlayerReplicationInfo.Ping * 0.001 * Level.TimeDilation + AverageServerDeltaTime; + NextRealCAPTime = ServerTimeStamp; + if (class'UTPure'.default.bEnableLoosePositionCheck) + NextRealCAPTime += PlayerReplicationInfo.Ping * 0.001 * Level.TimeDilation + AverageServerDeltaTime; zzLastClientErr = 0; IGPlus_WantCAP = false; IGPlus_NotifiedTranslocate = true; From eb83c0d4d0e1a353adc214cb2c25a901f32f6a39 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Fri, 30 Sep 2022 23:33:06 +0200 Subject: [PATCH 09/58] Match 469 Calculation Of Accel When Merging SavedMoves --- Classes/bbPlayer.uc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 62b46c58..52697ab4 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -3605,15 +3605,23 @@ function IGPlus_SavedMove PickRedundantMove(IGPlus_SavedMove Old, IGPlus_SavedMo } function bool CanMergeMove(IGPlus_SavedMove Pending, vector Accel) { + local vector OldAccel, NewAccel; + local vector OldAccelNorm, NewAccelNorm; + if (Pending.IGPlus_MergeCount >= 31) return false; - if (bIs469Server || Pending.Delta >= 0.005) // only 469 servers like updates for <5ms + if (bIs469Server || Pending.Delta >= 0.005) { // only 469 servers like updates for <5ms + OldAccelNorm = Normal(Pending.Acceleration); + NewAccelNorm = Normal(Accel); + OldAccel = OldAccelNorm * Min(VSize(Pending.Acceleration), AccelRate); + NewAccel = NewAccelNorm * Min(VSize(Accel), AccelRate); return bForcePacketSplit == false && - (VSize(Accel - Pending.Acceleration) < 1 || Normal(Accel) dot Normal(Pending.Acceleration) > 0.95) && + (VSize(NewAccel - OldAccel) < 1 || NewAccelNorm dot OldAccelNorm > 0.95) && Pending.bForceFire == false && Pending.bForceAltFire == false && Pending.bPressedJump == false && (Pending.DodgeMove == DODGE_None || Pending.DodgeMove >= DODGE_Active) && LastAddVelocityAppliedIndex == LastAddVelocityIndex; + } return true; } @@ -3698,8 +3706,8 @@ function xxReplicateMove( IGPlus_AdjustLocationAlpha -= AdjustAlpha; } - if ( VSize(NewAccel) > 3072) - NewAccel = 3072 * Normal(NewAccel); + if ( VSize(NewAccel) > 3072.0) + NewAccel = 3072.0 * Normal(NewAccel); OldAccel = Acceleration; if (bDrawDebugData) { From ad1ba6bf01a88b26369907d46a75cd6f455d3ae8 Mon Sep 17 00:00:00 2001 From: w0ss4g3 Date: Sun, 2 Oct 2022 23:55:59 +0100 Subject: [PATCH 10/58] Fixed bug where switching weapon when mid-switch would take longer than the specified down time settings. --- Classes/ST_ImpactHammer.uc | 2 +- Classes/ST_PulseGun.uc | 2 +- Classes/ST_ShockRifle.uc | 2 +- Classes/ST_SniperRifle.uc | 2 +- Classes/ST_SuperShockRifle.uc | 2 +- Classes/ST_Translocator.uc | 2 +- Classes/ST_UT_Eightball.uc | 2 +- Classes/ST_UT_FlakCannon.uc | 2 +- Classes/ST_WarheadLauncher.uc | 2 +- Classes/ST_enforcer.uc | 2 +- Classes/ST_minigun2.uc | 2 +- Classes/ST_ripper.uc | 2 +- Classes/ST_ut_biorifle.uc | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Classes/ST_ImpactHammer.uc b/Classes/ST_ImpactHammer.uc index 3d35713e..91d1c289 100644 --- a/Classes/ST_ImpactHammer.uc +++ b/Classes/ST_ImpactHammer.uc @@ -239,7 +239,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * 0.4 ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().HammerDownAnimSpeed() ); else PlayAnim('Down', GetWeaponSettings().HammerDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_PulseGun.uc b/Classes/ST_PulseGun.uc index a7634bd0..32d47a40 100644 --- a/Classes/ST_PulseGun.uc +++ b/Classes/ST_PulseGun.uc @@ -78,7 +78,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * 0.4 ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().PulseDownTime ); else TweenAnim('Down', GetWeaponSettings().PulseDownTime); } diff --git a/Classes/ST_ShockRifle.uc b/Classes/ST_ShockRifle.uc index 8f2d9eec..85c1bcb4 100644 --- a/Classes/ST_ShockRifle.uc +++ b/Classes/ST_ShockRifle.uc @@ -146,7 +146,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * 0.4 ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().ShockDownAnimSpeed() ); else PlayAnim('Down', GetWeaponSettings().ShockDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_SniperRifle.uc b/Classes/ST_SniperRifle.uc index 7851cf70..48db2c53 100644 --- a/Classes/ST_SniperRifle.uc +++ b/Classes/ST_SniperRifle.uc @@ -149,7 +149,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * 0.4 ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().SniperDownAnimSpeed() ); else PlayAnim('Down', GetWeaponSettings().SniperDownAnimSpeed(), 0.05); diff --git a/Classes/ST_SuperShockRifle.uc b/Classes/ST_SuperShockRifle.uc index ff5d6f64..8701ba49 100644 --- a/Classes/ST_SuperShockRifle.uc +++ b/Classes/ST_SuperShockRifle.uc @@ -106,7 +106,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * 0.4 ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().ShockDownAnimSpeed() ); else PlayAnim('Down', GetWeaponSettings().ShockDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_Translocator.uc b/Classes/ST_Translocator.uc index 2c69e534..17ee188a 100644 --- a/Classes/ST_Translocator.uc +++ b/Classes/ST_Translocator.uc @@ -97,7 +97,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * 0.36 ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().TranslocatorDownAnimSpeed() ); else if ( bTTargetOut ) PlayAnim('Down2', GetWeaponSettings().TranslocatorDownAnimSpeed(), 0.05); else diff --git a/Classes/ST_UT_Eightball.uc b/Classes/ST_UT_Eightball.uc index a4e65995..c05f95e4 100644 --- a/Classes/ST_UT_Eightball.uc +++ b/Classes/ST_UT_Eightball.uc @@ -234,7 +234,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * 0.4 ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().EightballDownAnimSpeed() ); else PlayAnim('Down', GetWeaponSettings().EightballDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_UT_FlakCannon.uc b/Classes/ST_UT_FlakCannon.uc index 9d042fad..7def094d 100644 --- a/Classes/ST_UT_FlakCannon.uc +++ b/Classes/ST_UT_FlakCannon.uc @@ -156,7 +156,7 @@ function SetSwitchPriority(pawn Other) simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * 0.4 ); + TweenAnim( AnimSequence, AnimFrame * etWeaponSettings().FlakDownAnimSpeed() ); else if ( AmmoType.AmmoAmount < 1 ) TweenAnim('Select', GetWeaponSettings().FlakDownTime + 0.05); else diff --git a/Classes/ST_WarheadLauncher.uc b/Classes/ST_WarheadLauncher.uc index 0587d534..7ff09b57 100644 --- a/Classes/ST_WarheadLauncher.uc +++ b/Classes/ST_WarheadLauncher.uc @@ -78,7 +78,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * 0.4 ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().WarheadDownAnimSpeed() ); else PlayAnim('Down', GetWeaponSettings().WarheadDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_enforcer.uc b/Classes/ST_enforcer.uc index b6f89a11..68eafc3a 100644 --- a/Classes/ST_enforcer.uc +++ b/Classes/ST_enforcer.uc @@ -137,7 +137,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * 0.4 ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().EnforcerDownAnimSpeed() ); else PlayAnim('Down', GetWeaponSettings().EnforcerDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_minigun2.uc b/Classes/ST_minigun2.uc index a0b4c076..0c01fafd 100644 --- a/Classes/ST_minigun2.uc +++ b/Classes/ST_minigun2.uc @@ -346,7 +346,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * 0.4 ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().MinigunDownAnimSpeed() ); else PlayAnim('Down', GetWeaponSettings().MinigunDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_ripper.uc b/Classes/ST_ripper.uc index 8a4a7292..b38524b9 100644 --- a/Classes/ST_ripper.uc +++ b/Classes/ST_ripper.uc @@ -78,7 +78,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * 0.4 ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().RipperDownAnimSpeed() ); else PlayAnim('Down', GetWeaponSettings().RipperDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_ut_biorifle.uc b/Classes/ST_ut_biorifle.uc index 1a426add..6cec22f0 100644 --- a/Classes/ST_ut_biorifle.uc +++ b/Classes/ST_ut_biorifle.uc @@ -78,7 +78,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * 0.4 ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().BioDownAnimSpeed() ); else PlayAnim('Down', GetWeaponSettings().BioDownAnimSpeed(), 0.05); } From f8933f725b9611bcb4fa6cb4021fba09c5fd4ac2 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Mon, 3 Oct 2022 16:50:22 +0200 Subject: [PATCH 11/58] Fix Compile Error --- Classes/ST_UT_FlakCannon.uc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/ST_UT_FlakCannon.uc b/Classes/ST_UT_FlakCannon.uc index 7def094d..028bc609 100644 --- a/Classes/ST_UT_FlakCannon.uc +++ b/Classes/ST_UT_FlakCannon.uc @@ -156,7 +156,7 @@ function SetSwitchPriority(pawn Other) simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * etWeaponSettings().FlakDownAnimSpeed() ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().FlakDownAnimSpeed() ); else if ( AmmoType.AmmoAmount < 1 ) TweenAnim('Select', GetWeaponSettings().FlakDownTime + 0.05); else From aac1122f0b0dedd363305463eea1cc292d4eb2fd Mon Sep 17 00:00:00 2001 From: w0ss4g3 Date: Wed, 12 Oct 2022 23:24:56 +0100 Subject: [PATCH 12/58] Fixed issue with FWS introduced in PR #17. --- Classes/ST_ImpactHammer.uc | 2 +- Classes/ST_ShockRifle.uc | 2 +- Classes/ST_SniperRifle.uc | 2 +- Classes/ST_SuperShockRifle.uc | 2 +- Classes/ST_Translocator.uc | 2 +- Classes/ST_UT_Eightball.uc | 2 +- Classes/ST_UT_FlakCannon.uc | 2 +- Classes/ST_WarheadLauncher.uc | 2 +- Classes/ST_enforcer.uc | 2 +- Classes/ST_minigun2.uc | 2 +- Classes/ST_ripper.uc | 2 +- Classes/ST_ut_biorifle.uc | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Classes/ST_ImpactHammer.uc b/Classes/ST_ImpactHammer.uc index 91d1c289..e9a3fc8d 100644 --- a/Classes/ST_ImpactHammer.uc +++ b/Classes/ST_ImpactHammer.uc @@ -239,7 +239,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().HammerDownAnimSpeed() ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().HammerDownTime ); else PlayAnim('Down', GetWeaponSettings().HammerDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_ShockRifle.uc b/Classes/ST_ShockRifle.uc index 85c1bcb4..bd222a7f 100644 --- a/Classes/ST_ShockRifle.uc +++ b/Classes/ST_ShockRifle.uc @@ -146,7 +146,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().ShockDownAnimSpeed() ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().ShockDownTime ); else PlayAnim('Down', GetWeaponSettings().ShockDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_SniperRifle.uc b/Classes/ST_SniperRifle.uc index 48db2c53..1e52865a 100644 --- a/Classes/ST_SniperRifle.uc +++ b/Classes/ST_SniperRifle.uc @@ -149,7 +149,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().SniperDownAnimSpeed() ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().SniperDownTime ); else PlayAnim('Down', GetWeaponSettings().SniperDownAnimSpeed(), 0.05); diff --git a/Classes/ST_SuperShockRifle.uc b/Classes/ST_SuperShockRifle.uc index 8701ba49..93c15b92 100644 --- a/Classes/ST_SuperShockRifle.uc +++ b/Classes/ST_SuperShockRifle.uc @@ -106,7 +106,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().ShockDownAnimSpeed() ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().ShockDownTime ); else PlayAnim('Down', GetWeaponSettings().ShockDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_Translocator.uc b/Classes/ST_Translocator.uc index 17ee188a..31dc9f38 100644 --- a/Classes/ST_Translocator.uc +++ b/Classes/ST_Translocator.uc @@ -97,7 +97,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().TranslocatorDownAnimSpeed() ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().TranslocatorDownTime ); else if ( bTTargetOut ) PlayAnim('Down2', GetWeaponSettings().TranslocatorDownAnimSpeed(), 0.05); else diff --git a/Classes/ST_UT_Eightball.uc b/Classes/ST_UT_Eightball.uc index c05f95e4..bf34bf0d 100644 --- a/Classes/ST_UT_Eightball.uc +++ b/Classes/ST_UT_Eightball.uc @@ -234,7 +234,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().EightballDownAnimSpeed() ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().EightballDownTime ); else PlayAnim('Down', GetWeaponSettings().EightballDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_UT_FlakCannon.uc b/Classes/ST_UT_FlakCannon.uc index 028bc609..f21394f6 100644 --- a/Classes/ST_UT_FlakCannon.uc +++ b/Classes/ST_UT_FlakCannon.uc @@ -156,7 +156,7 @@ function SetSwitchPriority(pawn Other) simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().FlakDownAnimSpeed() ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().FlakDownTime ); else if ( AmmoType.AmmoAmount < 1 ) TweenAnim('Select', GetWeaponSettings().FlakDownTime + 0.05); else diff --git a/Classes/ST_WarheadLauncher.uc b/Classes/ST_WarheadLauncher.uc index 7ff09b57..32e57a8e 100644 --- a/Classes/ST_WarheadLauncher.uc +++ b/Classes/ST_WarheadLauncher.uc @@ -78,7 +78,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().WarheadDownAnimSpeed() ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().WarheadDownTime ); else PlayAnim('Down', GetWeaponSettings().WarheadDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_enforcer.uc b/Classes/ST_enforcer.uc index 68eafc3a..bbafa848 100644 --- a/Classes/ST_enforcer.uc +++ b/Classes/ST_enforcer.uc @@ -137,7 +137,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().EnforcerDownAnimSpeed() ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().EnforcerDownTime ); else PlayAnim('Down', GetWeaponSettings().EnforcerDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_minigun2.uc b/Classes/ST_minigun2.uc index 0c01fafd..93e02eaa 100644 --- a/Classes/ST_minigun2.uc +++ b/Classes/ST_minigun2.uc @@ -346,7 +346,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().MinigunDownAnimSpeed() ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().MinigunDownTime ); else PlayAnim('Down', GetWeaponSettings().MinigunDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_ripper.uc b/Classes/ST_ripper.uc index b38524b9..51983f1e 100644 --- a/Classes/ST_ripper.uc +++ b/Classes/ST_ripper.uc @@ -78,7 +78,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().RipperDownAnimSpeed() ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().RipperDownTime ); else PlayAnim('Down', GetWeaponSettings().RipperDownAnimSpeed(), 0.05); } diff --git a/Classes/ST_ut_biorifle.uc b/Classes/ST_ut_biorifle.uc index 6cec22f0..7217437e 100644 --- a/Classes/ST_ut_biorifle.uc +++ b/Classes/ST_ut_biorifle.uc @@ -78,7 +78,7 @@ simulated function PlaySelect() { simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) - TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().BioDownAnimSpeed() ); + TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().BioDownTime ); else PlayAnim('Down', GetWeaponSettings().BioDownAnimSpeed(), 0.05); } From e62ce1a2123abb4c4dea4f59126beb828822a50b Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Thu, 13 Oct 2022 23:29:20 +0200 Subject: [PATCH 13/58] Make CI Work For Pull Requests --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5b37b0bc..f1b586bd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,9 +33,9 @@ jobs: if ("${{ github.ref_type }}" -eq "tag") { echo ("PKG_NAME=${{ github.event.repository.name }}_"+"${{ github.ref }}".SubString(10)) >> $env:GITHUB_ENV echo ("PKG_VER="+"${{ github.ref }}".SubString(10)) >> $env:GITHUB_ENV - } elseif ("${{ github.ref }}".StartsWith("refs/pull/:")) { - echo ("PKG_NAME=${{ github.event.repository.name }}_pr_"+"${{ github.ref }}".SubString(11, $length - 17)) >> $env:GITHUB_ENV - echo ("PKG_VER=pr_"+"${{ github.ref }}".SubString(11, $length - 17)) >> $env:GITHUB_ENV + } elseif ("${{ github.ref }}".StartsWith("refs/pull/")) { + echo ("PKG_NAME=${{ github.event.repository.name }}_pr_"+"${{ github.ref }}".SubString(10, $length - 16)) >> $env:GITHUB_ENV + echo ("PKG_VER=pr_"+"${{ github.ref }}".SubString(10, $length - 16)) >> $env:GITHUB_ENV } else { echo ("PKG_NAME=${{ github.event.repository.name }}_"+"${{ github.ref }}".SubString(11)+"-"+"${{ github.sha }}".SubString(0,8)) >> $env:GITHUB_ENV echo ("PKG_VER="+"${{ github.ref }}".SubString(11)+"-"+"${{ github.sha }}".SubString(0,8)) >> $env:GITHUB_ENV From 6aaa3a4458a00855a73892a40d3dcdf0b4f75399 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Wed, 19 Oct 2022 18:07:45 +0200 Subject: [PATCH 14/58] Smooth Translocator Movement When Hit Mid-Air --- Classes/ST_TranslocatorTarget.uc | 4 ++++ Classes/ST_UT_Eightball.uc | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Classes/ST_TranslocatorTarget.uc b/Classes/ST_TranslocatorTarget.uc index 3aa0e673..ce54a931 100644 --- a/Classes/ST_TranslocatorTarget.uc +++ b/Classes/ST_TranslocatorTarget.uc @@ -15,3 +15,7 @@ auto state Pickup { bbPlayer(Master.Owner).ClientDebugMessage("TTarget took"@Damage@"damage (Total"@int(Disruption)$")"); } } + +defaultproperties { + bSimFall=True +} diff --git a/Classes/ST_UT_Eightball.uc b/Classes/ST_UT_Eightball.uc index bf34bf0d..bbdca3ad 100644 --- a/Classes/ST_UT_Eightball.uc +++ b/Classes/ST_UT_Eightball.uc @@ -151,7 +151,7 @@ state FireRockets r.NumExtraRockets = DupRockets; if (RocketsLoaded>4 && bTightWad) r.bRing=True; if ( Angle > 0 ) - r.Velocity *= (0.9 + 0.2 * FRand()); + r.Velocity *= (0.9 + 0.2 * FRand()); } } else From c5624f2d1ec7365d290e8dce5d7f1bc4a52687e7 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Sun, 30 Oct 2022 19:29:50 +0100 Subject: [PATCH 15/58] Use 469c to compile --- .github/workflows/ci.yml | 8 ++++---- Classes/NN_ASMD.uc | 2 +- Classes/UTPure.uc | 11 ----------- Classes/bbPlayer.uc | 19 +++++++------------ System/InstaGibPlus.int | 2 +- 5 files changed, 13 insertions(+), 29 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f1b586bd..19b1e14e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,17 +15,17 @@ jobs: runs-on: windows-latest steps: - - name: Download 469b Patch + - name: Download 469c Patch uses: robinraju/release-downloader@v1.2 with: repository: "OldUnreal/UnrealTournamentPatches" - tag: "v469b" - fileName: "OldUnreal-UTPatch469b-Windows.zip" + tag: "v469c" + fileName: "OldUnreal-UTPatch469c-Windows.zip" - name: Extract Patch uses: DuckSoft/extract-7z-action@v1.0 with: - pathSource: "OldUnreal-UTPatch469b-Windows.zip" + pathSource: "OldUnreal-UTPatch469c-Windows.zip" pathTarget: . - name: Determine Package Name diff --git a/Classes/NN_ASMD.uc b/Classes/NN_ASMD.uc index 7727b26b..0c664075 100644 --- a/Classes/NN_ASMD.uc +++ b/Classes/NN_ASMD.uc @@ -906,7 +906,7 @@ defaultproperties //AltProjectileClass=Class'ST_TazerProj' bNewNet=True hitdamage=35 - WeaponDescription="Classification: Energy Rifle\n\nPrimary Fire: Lightning-Fast Burst of focused energy.\n\nSecondary Fire: Unstable Energy projectile, expands radially.\n\nTechniques: Hitting the secondary fire energy projectiles with the regular fire's energy will cause an immensely powerful explosion." + WeaponDescription="Classification: Energy Rifle\\n\\nPrimary Fire: Lightning-Fast Burst of focused energy.\\n\\nSecondary Fire: Unstable Energy projectile, expands radially.\\n\\nTechniques: Hitting the secondary fire energy projectiles with the regular fire's energy will cause an immensely powerful explosion." PickupAmmoCount=20 bInstantHit=True bAltWarnTarget=True diff --git a/Classes/UTPure.uc b/Classes/UTPure.uc index 410fc042..3cf17930 100644 --- a/Classes/UTPure.uc +++ b/Classes/UTPure.uc @@ -122,19 +122,8 @@ replication zzAutoPauser; } -//XC_Engine interface -native(1718) final function bool AddToPackageMap( optional string PkgName); - function PreBeginPlay() { - local int XC_Version; - - XC_Version = int(ConsoleCommand("get ini:engine.engine.gameengine XC_Version")); - if ( XC_Version >= 11 ) - { - AddToPackageMap(); - } - zzDMP = DeathMatchPlus(Level.Game); if (zzDMP == None) return; diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 52697ab4..9b979286 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -510,9 +510,6 @@ replication DemoReceiveWeaponEffect; } -//XC_Engine interface -native(1719) final function bool IsInPackageMap( optional string PkgName, optional bool bServerPackagesOnly); - static final operator(34) int or_eq (out int A, int B) { A = A | B; return A; @@ -7672,16 +7669,14 @@ static function bool xxValidSP(string zzSkinName, string zzMeshName, optional Ac zzPackName = xxGetClass(zzSkinName); //Attempt to use XC_Engine natives - if ( bbPlayer(SkinActor) != none && SkinActor.Role == ROLE_Authority ) - { - XC_Version = int(SkinActor.ConsoleCommand("get ini:Unreali.SkaarjPlayer XC_Version")); - if ( XC_Version >= 13 ) - { - if ( !bbPlayer(SkinActor).IsInPackageMap( zzPackName, true) ) + if ( bbPlayer(SkinActor) != none && SkinActor.Role == ROLE_Authority ) + { + XC_Version = int(SkinActor.ConsoleCommand("get ini:Unreali.SkaarjPlayer XC_Version")); + if ( XC_Version >= 13 ) + { return false; - return (Left(zzPackName, Len(zzMeshName)) ~= zzMeshName && !(Right(zzSkinName,2) ~= "t_")); - } - } + } + } //Extra pass before potentially crash code if ( zzPackName ~= "BOTPACK" || zzPackName ~= "UNREALI" || zzPackName ~= "UNREALSHARE") return false; diff --git a/System/InstaGibPlus.int b/System/InstaGibPlus.int index 98bf9abe..bbe8e0e2 100644 --- a/System/InstaGibPlus.int +++ b/System/InstaGibPlus.int @@ -249,7 +249,7 @@ StyleModulated="Modulated" SmoothText="Smooth" [NN_ASMD] -WeaponDescription="Classification: Energy RiflenPrimary Fire: Lightning-Fast Burst of focused energy.nSecondary Fire: Unstable Energy projectile, expands radially.nTechniques: Hitting the secondary fire energy projectiles with the regular fire's energy will cause an immensely powerful explosion." +WeaponDescription="Classification: Energy Rifle\n\nPrimary Fire: Lightning-Fast Burst of focused energy.\n\nSecondary Fire: Unstable Energy projectile, expands radially.\n\nTechniques: Hitting the secondary fire energy projectiles with the regular fire's energy will cause an immensely powerful explosion." PickupMessage="You got the ASMD" ItemName="ASMD" From ad1e4664b813a954e62243128a38dbc79902538c Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Wed, 16 Nov 2022 22:41:31 +0100 Subject: [PATCH 16/58] Stop Auto-Demo Immediately After End Of Game --- Classes/bbPlayer.uc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 9b979286..622e4205 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -6421,6 +6421,8 @@ function xxPlayerTickEvents(float DeltaTime) zzbDemoRecording = PureLevel.zzDemoRecDriver != None; if (!zzbDemoRecording && zzbGameStarted && (zzbForceDemo || Settings.bAutoDemo && (DeathMatchPlus(Level.Game) == none || DeathMatchPlus(Level.Game).CountDown < 1))) xxClientDemoRec(); + if (zzbDemoRecording && GameReplicationInfo.GameEndedComments != "" && (zzbForceDemo || Settings.bAutoDemo)) + ConsoleCommand("StopDemo"); } } From 76a1237ee3389f94e533f50b068a64aa4f1c76eb Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Sat, 12 Nov 2022 02:16:47 +0100 Subject: [PATCH 17/58] Dont Destroy Rockets On Clients --- Classes/ST_RocketBlastDecal.uc | 16 ++++++++++++++ Classes/ST_RocketMk2.uc | 34 ++++++++++++++++++++++++++++- Classes/ST_UT_SeekingRocket.uc | 33 +++++++++++++++++++++++++++- Classes/WeaponEffect.uc | 39 ++++++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 Classes/ST_RocketBlastDecal.uc diff --git a/Classes/ST_RocketBlastDecal.uc b/Classes/ST_RocketBlastDecal.uc new file mode 100644 index 00000000..cc07c77f --- /dev/null +++ b/Classes/ST_RocketBlastDecal.uc @@ -0,0 +1,16 @@ +class ST_RocketBlastDecal extends WeaponEffect; + +static function Play( + PlayerPawn Player, + ClientSettings Settings, + PlayerReplicationInfo SourcePRI, + vector SourceLocation, + vector SourceOffset, + Actor Target, + vector TargetLocation, + vector TargetOffset, + vector HitNormal +) { + Player.Spawn(class'Botpack.BlastMark',,,TargetLocation, rotator(HitNormal)); +} + diff --git a/Classes/ST_RocketMk2.uc b/Classes/ST_RocketMk2.uc index eab8cbe7..f86d3345 100644 --- a/Classes/ST_RocketMk2.uc +++ b/Classes/ST_RocketMk2.uc @@ -11,7 +11,7 @@ var bool bDirect; auto state Flying { - simulated function ProcessTouch (Actor Other, Vector HitLocation) + function ProcessTouch(Actor Other, Vector HitLocation) { if ( (Other != instigator) && !Other.IsA('Projectile') ) { @@ -20,6 +20,36 @@ auto state Flying } } + function HitWall(vector HitNormal, actor Wall) + { + if ( (Mover(Wall) != None) && Mover(Wall).bDamageTriggered ) + Wall.TakeDamage( Damage, instigator, Location, MomentumTransfer * Normal(Velocity), ''); + + MakeNoise(1.0); + Explode(Location + ExploWallOut * HitNormal, HitNormal); + + class'WeaponEffect'.static.Send( + Level, + class'ST_RocketBlastDecal', + Instigator.PlayerReplicationInfo, + vect(0,0,0), + vect(0,0,0), + none, + Location, + vect(0,0,0), + HitNormal + ); + } + + function Explode(vector HitLocation, vector HitNormal) + { + Spawn(class'UT_SpriteBallExplosion',,,HitLocation + HitNormal*16); + + BlowUp(HitLocation); + + Destroy(); + } + function BlowUp(vector HitLocation) { STM.PlayerHit(Instigator, 16, bDirect); // 16 = Rockets. @@ -30,9 +60,11 @@ auto state Flying STM.WeaponSettings.RocketMomentum * MomentumTransfer, HitLocation); STM.PlayerClear(); + MakeNoise(1.0); } } defaultproperties { + bNetTemporary=False } diff --git a/Classes/ST_UT_SeekingRocket.uc b/Classes/ST_UT_SeekingRocket.uc index ccf105c2..d7b26bf7 100644 --- a/Classes/ST_UT_SeekingRocket.uc +++ b/Classes/ST_UT_SeekingRocket.uc @@ -11,7 +11,7 @@ var bool bDirect; auto state Flying { - simulated function ProcessTouch (Actor Other, Vector HitLocation) + function ProcessTouch (Actor Other, Vector HitLocation) { if ( (Other != instigator) && !Other.IsA('Projectile') ) { @@ -20,6 +20,35 @@ auto state Flying } } + function HitWall (vector HitNormal, actor Wall) + { + if ( (Mover(Wall) != None) && Mover(Wall).bDamageTriggered ) + Wall.TakeDamage( Damage, instigator, Location, MomentumTransfer * Normal(Velocity), ''); + + Explode(Location + ExploWallOut * HitNormal, HitNormal); + + class'WeaponEffect'.static.Send( + Level, + class'ST_RocketBlastDecal', + Instigator.PlayerReplicationInfo, + vect(0,0,0), + vect(0,0,0), + none, + Location, + vect(0,0,0), + HitNormal + ); + } + + function Explode(vector HitLocation, vector HitNormal) + { + Spawn(class'UT_SpriteBallExplosion',,,HitLocation + HitNormal*16); + + BlowUp(HitLocation); + + Destroy(); + } + function BlowUp(vector HitLocation) { STM.PlayerHit(Instigator, 16, bDirect); // 16 = Rockets. No special for seeking, a seeker just means it has a larger chance of direct (yeah rite :P) @@ -30,9 +59,11 @@ auto state Flying STM.WeaponSettings.RocketMomentum * MomentumTransfer, HitLocation); STM.PlayerClear(); + MakeNoise(1.0); } } defaultproperties { + bNetTemporary=False } diff --git a/Classes/WeaponEffect.uc b/Classes/WeaponEffect.uc index 518cf963..c9e4b31c 100644 --- a/Classes/WeaponEffect.uc +++ b/Classes/WeaponEffect.uc @@ -13,6 +13,45 @@ static function Play( vector HitNormal ); +static function Send( + LevelInfo Level, + class Effect, + PlayerReplicationInfo SourcePRI, + vector SourceLocation, + vector SourceOffset, + Actor Target, + vector TargetLocation, + vector TargetOffset, + vector HitNormal, + optional Pawn Exclude +) { + local Pawn P; + + for (P = Level.PawnList; P != none; P = P.NextPawn) { + if (P == Exclude) continue; + if (bbPlayer(P) != none) + bbPlayer(P).SendWeaponEffect( + Effect, + SourcePRI, + SourceLocation, + SourceOffset, + Target, + TargetLocation, + TargetOffset, + HitNormal); + else if (bbCHSpectator(P) != none) + bbCHSpectator(P).SendWeaponEffect( + Effect, + SourcePRI, + SourceLocation, + SourceOffset, + Target, + TargetLocation, + TargetOffset, + HitNormal); + } +} + static final function vector GetPlayerLocation(Actor PotentialPlayer) { if (PotentialPlayer.IsA('bbPlayer')) return bbPlayer(PotentialPlayer).IGPlus_CurrentLocation(); From b13e0f4ea616ba377e50e200f3c6c035923c1842 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Sat, 12 Nov 2022 02:17:23 +0100 Subject: [PATCH 18/58] Dont Destroy Flak Chunks On Clients --- Classes/ST_UTChunk.uc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Classes/ST_UTChunk.uc b/Classes/ST_UTChunk.uc index c5906865..f0c3d424 100644 --- a/Classes/ST_UTChunk.uc +++ b/Classes/ST_UTChunk.uc @@ -9,7 +9,7 @@ class ST_UTChunk extends UTChunk; var ST_UTChunkInfo Chunkie; var int ChunkIndex; -simulated function ProcessTouch (Actor Other, vector HitLocation) +function ProcessTouch (Actor Other, vector HitLocation) { if ( (Chunk(Other) == None) && ((Physics == PHYS_Falling) || (Other != Instigator)) ) { @@ -36,4 +36,5 @@ simulated function ProcessTouch (Actor Other, vector HitLocation) defaultproperties { + bNetTemporary=False } From b8b8fa0a3598e7cbf7caf3f7ec0213c8abd7618e Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Sat, 12 Nov 2022 02:19:11 +0100 Subject: [PATCH 19/58] Remove Random Rocket Velocity --- Classes/ST_UT_Eightball.uc | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Classes/ST_UT_Eightball.uc b/Classes/ST_UT_Eightball.uc index bbdca3ad..532f2129 100644 --- a/Classes/ST_UT_Eightball.uc +++ b/Classes/ST_UT_Eightball.uc @@ -140,18 +140,13 @@ state FireRockets s = Spawn( class 'ST_ut_SeekingRocket',, '', FireLocation,FireRot); s.STM = STM; s.Seeking = LockedTarget; - s.NumExtraRockets = DupRockets; - if ( Angle > 0 ) - s.Velocity *= (0.9 + 0.2 * FRand()); + s.NumExtraRockets = DupRockets; } else { r = Spawn( class'ST_rocketmk2',, '', FireLocation,FireRot); r.STM = STM; r.NumExtraRockets = DupRockets; - if (RocketsLoaded>4 && bTightWad) r.bRing=True; - if ( Angle > 0 ) - r.Velocity *= (0.9 + 0.2 * FRand()); } } else From 71c365d770b51bb9b4736ed7522ed48b4cabb817 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Sat, 12 Nov 2022 02:21:07 +0100 Subject: [PATCH 20/58] Remove Random Rocket Offset --- Classes/ST_UT_Eightball.uc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/ST_UT_Eightball.uc b/Classes/ST_UT_Eightball.uc index 532f2129..e0d131c5 100644 --- a/Classes/ST_UT_Eightball.uc +++ b/Classes/ST_UT_Eightball.uc @@ -120,7 +120,7 @@ state FireRockets { if ( bMultiRockets ) - Firelocation = StartLoc - (Sin(Angle)*RocketRad - 7.5)*Y + (Cos(Angle)*RocketRad - 7)*Z - X * 4 * FRand(); + Firelocation = StartLoc - (Sin(Angle)*RocketRad - 7.5)*Y + (Cos(Angle)*RocketRad - 7)*Z; else FireLocation = StartLoc; if (bFireLoad) From 64ce8e21dffbb6f8cd098bb5015ace223d67be71 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Sat, 12 Nov 2022 02:24:26 +0100 Subject: [PATCH 21/58] Improve Logic For Spreading Rockets --- Classes/ST_UT_Eightball.uc | 41 ++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/Classes/ST_UT_Eightball.uc b/Classes/ST_UT_Eightball.uc index e0d131c5..7c5e7f68 100644 --- a/Classes/ST_UT_Eightball.uc +++ b/Classes/ST_UT_Eightball.uc @@ -67,7 +67,8 @@ state FireRockets local pawn BestTarget, PawnOwner; local PlayerPawn PlayerOwner; local int DupRockets; - local bool bMultiRockets; + local float Spread; + local int i; PawnOwner = Pawn(Owner); if ( PawnOwner == None ) @@ -112,28 +113,31 @@ state FireRockets bPendingLock = false; bPointing = true; FireRot = AdjustedAim; - RocketRad = 4; - if (bTightWad || !bFireLoad) RocketRad=7; - bMultiRockets = ( RocketsLoaded > 1 ); + if (bTightWad || !bFireLoad) + RocketRad = 7; + else + RocketRad = 4; - While ( RocketsLoaded > 0 ) + for (i = 0; i < RocketsLoaded; i++) { - - if ( bMultiRockets ) - Firelocation = StartLoc - (Sin(Angle)*RocketRad - 7.5)*Y + (Cos(Angle)*RocketRad - 7)*Z; - else + Spread = (-0.5 * (RocketsLoaded-1) + i); + + if (RocketsLoaded == 1) { FireLocation = StartLoc; + } else if (bTightWad || bFireLoad == false) { + FireLocation = StartLoc - (Sin(Angle)*RocketRad - 7.5)*Y + (Cos(Angle)*RocketRad - 7)*Z; + } else { + FireLocation = StartLoc + (Spread*4.0*Y); + } + if (bFireLoad) { - if ( Angle > 0 ) - { - if ( Angle < 3 && !bTightWad) - FireRot.Yaw = AdjustedAim.Yaw - Angle * 600; - else if ( Angle > 3.5 && !bTightWad) - FireRot.Yaw = AdjustedAim.Yaw + (Angle - 3) * 600; - else - FireRot.Yaw = AdjustedAim.Yaw; + if (bTightWad) { + FireRot.Yaw = AdjustedAim.Yaw; + } else { + FireRot.Yaw = AdjustedAim.Yaw + Spread*660.0; } + STM.PlayerFire(PawnOwner, 16); // 16 = Rockets if ( LockedTarget != None ) { @@ -164,8 +168,7 @@ state FireRockets } } - Angle += 1.0484; //2*3.1415/6; - RocketsLoaded--; + Angle += 1.04719755; //2*Pi/6; } bTightWad=False; bRotated = false; From 35995131229bf7f376d2932a6ff9cda03a8552ef Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Sat, 12 Nov 2022 19:25:27 +0100 Subject: [PATCH 22/58] Dont Destroy Grenades On Client --- Classes/ST_UT_Grenade.uc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Classes/ST_UT_Grenade.uc b/Classes/ST_UT_Grenade.uc index ad4cb67e..02b214ce 100644 --- a/Classes/ST_UT_Grenade.uc +++ b/Classes/ST_UT_Grenade.uc @@ -8,6 +8,24 @@ class ST_UT_Grenade extends UT_Grenade; var ST_Mutator STM; +function Explosion(vector HitLocation) +{ + BlowUp(HitLocation); + Spawn(class'UT_SpriteBallExplosion',,,HitLocation); + class'WeaponEffect'.static.Send( + Level, + class'ST_RocketBlastDecal', + Instigator.PlayerReplicationInfo, + vect(0,0,0), + vect(0,0,0), + none, + Location, + vect(0,0,0), + vect(0,0,1) + ); + Destroy(); +} + function BlowUp(vector HitLocation) { STM.PlayerHit(Instigator, 17, !bCanHitOwner); // bCanHitOwner is set to True after the Grenade has bounced once. Neat hax @@ -22,4 +40,5 @@ function BlowUp(vector HitLocation) } defaultproperties { + bNetTemporary=False } From cf3456caa6e4683e9d9750e3f38ae633514357bf Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Mon, 14 Nov 2022 16:44:54 +0100 Subject: [PATCH 23/58] Dont Destroy Razors On Clients --- Classes/ST_Razor2.uc | 59 ++++++++++++++++++++++++++++++++++++++++- Classes/ST_Razor2Alt.uc | 38 ++++++++++++++------------ 2 files changed, 79 insertions(+), 18 deletions(-) diff --git a/Classes/ST_Razor2.uc b/Classes/ST_Razor2.uc index e5f530d1..a374f2b1 100644 --- a/Classes/ST_Razor2.uc +++ b/Classes/ST_Razor2.uc @@ -58,10 +58,67 @@ auto state Flying PlaySound(MiscSound, SLOT_Misc, 2.0); else PlaySound(ImpactSound, SLOT_Misc, 2.0); - destroy(); + + if (Role == ROLE_Authority) + Destroy(); } } + + simulated function HitWall (vector HitNormal, actor Wall) + { + local vector Vel2D, Norm2D; + + bCanHitInstigator = true; + PlaySound(ImpactSound, SLOT_Misc, 2.0); + LoopAnim('Spin',1.0); + if ( (Mover(Wall) != None) && Mover(Wall).bDamageTriggered ) + { + if ( Role == ROLE_Authority ) { + Wall.TakeDamage( Damage, instigator, Location, MomentumTransfer * Normal(Velocity), MyDamageType); + Destroy(); + } + return; + } + NumWallHits++; + SetTimer(0, False); + MakeNoise(0.3); + if ( NumWallHits > 6 && Role == ROLE_Authority ) + Destroy(); + + if ( NumWallHits == 1 ) + { + Spawn(class'WallCrack',,,Location, rotator(HitNormal)); + Vel2D = Velocity; + Vel2D.Z = 0; + Norm2D = HitNormal; + Norm2D.Z = 0; + Norm2D = Normal(Norm2D); + Vel2D = Normal(Vel2D); + if ( (Vel2D Dot Norm2D) < -0.999 ) + { + HitNormal = Normal(HitNormal + 0.6 * Vel2D); + Norm2D = HitNormal; + Norm2D.Z = 0; + Norm2D = Normal(Norm2D); + if ( (Vel2D Dot Norm2D) < -0.999 ) + { + if ( Rand(1) == 0 ) + HitNormal = HitNormal + vect(0.05,0,0); + else + HitNormal = HitNormal - vect(0.05,0,0); + if ( Rand(1) == 0 ) + HitNormal = HitNormal + vect(0,0.05,0); + else + HitNormal = HitNormal - vect(0,0.05,0); + HitNormal = Normal(HitNormal); + } + } + } + Velocity -= 2 * (Velocity dot HitNormal) * HitNormal; + SetRoll(Velocity); + } } defaultproperties { + bNetTemporary=False } diff --git a/Classes/ST_Razor2Alt.uc b/Classes/ST_Razor2Alt.uc index 8b2679f6..3f2f080b 100644 --- a/Classes/ST_Razor2Alt.uc +++ b/Classes/ST_Razor2Alt.uc @@ -22,31 +22,34 @@ simulated function PostBeginPlay() auto state Flying { - simulated function ProcessTouch (Actor Other, Vector HitLocation) + function ProcessTouch (Actor Other, Vector HitLocation) { - local RipperPulse s; - if ( Other != Instigator ) { - if ( Role == ROLE_Authority ) - { - STM.PlayerHit(Instigator, 12, Other.IsA('Pawn')); // 12 = Ripper Secondary, Direct if Pawn - Other.TakeDamage( - STM.WeaponSettings.RipperSecondaryDamage, - instigator, - HitLocation, - STM.WeaponSettings.RipperSecondaryMomentum * MomentumTransfer * Normal(Velocity), - MyDamageType - ); - STM.PlayerClear(); - } - s = spawn(class'RipperPulse',,,HitLocation); - s.RemoteRole = ROLE_None; + STM.PlayerHit(Instigator, 12, Other.IsA('Pawn')); // 12 = Ripper Secondary, Direct if Pawn + Other.TakeDamage( + STM.WeaponSettings.RipperSecondaryDamage, + instigator, + HitLocation, + STM.WeaponSettings.RipperSecondaryMomentum * MomentumTransfer * Normal(Velocity), + MyDamageType + ); + STM.PlayerClear(); + Spawn(class'RipperPulse',,,HitLocation); MakeNoise(1.0); Destroy(); } } + function Explode(vector HitLocation, vector HitNormal) + { + Spawn(class'RipperPulse',,,HitLocation + HitNormal*16); + + BlowUp(HitLocation); + + Destroy(); + } + function BlowUp(vector HitLocation) { local actor Victims; @@ -89,4 +92,5 @@ auto state Flying defaultproperties { + bNetTemporary=False } From 4c9edf6adddb2135d9d7f725cc2bc1439fd8cdb7 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Wed, 14 Dec 2022 12:17:36 +0100 Subject: [PATCH 24/58] Add Command IGPlus_FOV --- Classes/bbPlayer.uc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 622e4205..8281feb5 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -9085,6 +9085,19 @@ exec function ZoomToggle(float SensitivityX, optional float SensitivityY) { } } +exec function IGPlus_FOV(float NewFov) { + if( (NewFov >= 80.0) || Level.bAllowFOV || bAdmin || (Level.Netmode==NM_Standalone) ) + { + // stijn: fix for game types not enforcing FOV limits + MinFOV = FClamp(MinFOV, 1.0 , 80.0 ); + MaxFOV = FClamp(MaxFOV, 130.0, 360.0 ); + // end fix + + DefaultFOV = FClamp(NewFov, MinFOV, MaxFOV); + DesiredFOV = DefaultFOV; + } +} + exec function IGPlusMenu() { local WindowConsole C; From 4541807be0c4d23dfd8080ca8ca3b177b2f15b22 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Sat, 17 Dec 2022 15:24:31 +0100 Subject: [PATCH 25/58] Make Self-Boost By Hammer Client-Side --- Classes/ST_ImpactHammer.uc | 82 +++++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 2 deletions(-) diff --git a/Classes/ST_ImpactHammer.uc b/Classes/ST_ImpactHammer.uc index e9a3fc8d..52ec6fda 100644 --- a/Classes/ST_ImpactHammer.uc +++ b/Classes/ST_ImpactHammer.uc @@ -7,9 +7,15 @@ class ST_ImpactHammer extends ImpactHammer; var ST_Mutator STM; - var WeaponSettingsRepl WSettings; +var byte ChargeSizeRepl; + +replication { + reliable if (bNetOwner && Role == ROLE_Authority) + ChargeSizeRepl; +} + simulated final function WeaponSettingsRepl FindWeaponSettings() { local WeaponSettingsRepl S; @@ -39,6 +45,8 @@ simulated function Tick(float deltaTime) { // This fixes the really annoying issue regarding IH sound if (Pawn(Owner) == None || Pawn(Owner).Weapon != Self) AmbientSound = None; + + ChargeSizeRepl = byte(Clamp(int(ChargeSize*170.0), 0, 255)); } State ClientDown @@ -68,6 +76,63 @@ State ClientDown simulated function BeginState(); } +simulated function ClientWeaponEvent(name EventType) { + if (EventType == 'FireBlast' && GetStateName() != 'ClientFireBlast') { + PlayFiring(); + GotoState('ClientFireBlast'); + } +} + +state ClientFiring { + simulated function Tick(float Delta) { + global.Tick(Delta); + + if (Owner == none || Owner.IsA('bbPlayer') == false) + return; + + if (Pawn(Owner).bFire == 0) { + ClientTraceFire(0); + PlayFiring(); + GotoState('ClientFireBlast'); + } + } +} + +simulated function ClientTraceFire(float Accuracy) { + local vector HitLocation, HitNormal, StartTrace, EndTrace, X, Y, Z; + local actor Other; + local bbPlayer P; + local WeaponSettingsRepl WS; + local vector Momentum; + + P = bbPlayer(Owner); + WS = GetWeaponSettings(); + if (P == none || WS == none) + return; + + GetAxes(P.ViewRotation, X, Y, Z); + StartTrace = Owner.Location + vect(0,0,1)*P.EyeHeight; + AdjustedAim = P.ViewRotation; + EndTrace = StartTrace + 120.0 * vector(AdjustedAim); + Other = P.NN_TraceShot(HitLocation, HitNormal, EndTrace, StartTrace, P); + + if ((Other == Level) || (Other != none && Other.IsA('Mover'))) { + Momentum = WS.HammerSelfMomentum * -69000.0 * FMax(ChargeSizeRepl / 170.0, 1.0) * X; + if (P.Physics == PHYS_Walking) + Momentum.Z = FMax(Momentum.Z, 0.4 * VSize(Momentum)); + Momentum = Momentum * 0.6 / P.Mass; + P.AddVelocity(Momentum); + } +} + +state Firing { + function Tick(float DeltaTime) { + super.Tick(DeltaTime); + + ChargeSizeRepl = byte(Clamp(int(ChargeSize*170.0), 0, 255)); + } +} + function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local Pawn PawnOwner; @@ -90,10 +155,23 @@ function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vect STM.WeaponSettings.HammerSelfDamage, PawnOwner, HitLocation, - STM.WeaponSettings.HammerSelfMomentum * -69000.0 * ChargeSize * X, + vect(0,0,0), MyDamageType ); STM.PlayerClear(); + + // Manually do what PawnOwner.AddVelocity from PawnOwner.TakeDamage would do. + // Cant use AddVelocity because it takes an additional round trip. + // Client does the same manual modification of PawnOwner.Velocity in parallel, so it should all work out. + Momentum = GetWeaponSettings().HammerSelfMomentum * -69000.0 * ChargeSize * X; + if (PawnOwner.Physics == PHYS_Walking) + Momentum.Z = FMax(Momentum.Z, 0.4 * VSize(Momentum)); + Momentum = Momentum * 0.6 / PawnOwner.Mass; + if (PawnOwner.Physics == PHYS_Walking) + PawnOwner.SetPhysics(PHYS_Falling); + if ((PawnOwner.Velocity.Z > 380) && (Momentum.Z > 0)) + Momentum.Z *= 0.5; + PawnOwner.Velocity += Momentum; } if ( Other != Level ) { From 2cef754b1ace74198879cadc5e2fd28e48194580 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Thu, 22 Dec 2022 21:33:05 +0100 Subject: [PATCH 26/58] Make RocketLauncher Spread Configurable --- Classes/ST_UT_Eightball.uc | 2 +- Classes/WeaponSettings.uc | 2 ++ Classes/WeaponSettingsRepl.uc | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Classes/ST_UT_Eightball.uc b/Classes/ST_UT_Eightball.uc index 7c5e7f68..62363a47 100644 --- a/Classes/ST_UT_Eightball.uc +++ b/Classes/ST_UT_Eightball.uc @@ -135,7 +135,7 @@ state FireRockets if (bTightWad) { FireRot.Yaw = AdjustedAim.Yaw; } else { - FireRot.Yaw = AdjustedAim.Yaw + Spread*660.0; + FireRot.Yaw = AdjustedAim.Yaw + Spread*WSettings.RocketSpreadSpacingDegrees*(65536.0/360.0); } STM.PlayerFire(PawnOwner, 16); // 16 = Rockets diff --git a/Classes/WeaponSettings.uc b/Classes/WeaponSettings.uc index 965ad9ee..a3ddc03c 100644 --- a/Classes/WeaponSettings.uc +++ b/Classes/WeaponSettings.uc @@ -30,6 +30,7 @@ var config float EightballDownTime; var config float RocketDamage; var config float RocketHurtRadius; var config float RocketMomentum; +var config float RocketSpreadSpacingDegrees; var config float GrenadeDamage; var config float GrenadeHurtRadius; var config float GrenadeMomentum; @@ -144,6 +145,7 @@ defaultproperties RocketDamage=75 RocketHurtRadius=220 RocketMomentum=1.0 + RocketSpreadSpacingDegrees=3.6 GrenadeDamage=80 GrenadeHurtRadius=200 GrenadeMomentum=1.0 diff --git a/Classes/WeaponSettingsRepl.uc b/Classes/WeaponSettingsRepl.uc index 1314ac4d..0d490db9 100644 --- a/Classes/WeaponSettingsRepl.uc +++ b/Classes/WeaponSettingsRepl.uc @@ -16,6 +16,7 @@ var float EightballDownTime; var float RocketDamage; var float RocketHurtRadius; var float RocketMomentum; +var float RocketSpreadSpacingDegrees; var float GrenadeDamage; var float GrenadeHurtRadius; var float GrenadeMomentum; @@ -366,6 +367,7 @@ function InitFromWeaponSettings(WeaponSettings S) { RocketDamage = S.RocketDamage; RocketHurtRadius = S.RocketHurtRadius; RocketMomentum = S.RocketMomentum; + RocketSpreadSpacingDegrees = S.RocketSpreadSpacingDegrees; GrenadeDamage = S.GrenadeDamage; GrenadeHurtRadius = S.GrenadeHurtRadius; GrenadeMomentum = S.GrenadeMomentum; @@ -472,6 +474,7 @@ defaultproperties RocketDamage=75 RocketHurtRadius=220 RocketMomentum=1.0 + RocketSpreadSpacingDegrees=3.6 GrenadeDamage=80 GrenadeHurtRadius=200 GrenadeMomentum=1.0 From f8c847c71337ecc2eaa001de52cd7d070b0ff60d Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Fri, 23 Dec 2022 01:50:11 +0100 Subject: [PATCH 27/58] Update CI --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 19b1e14e..1730d23d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Download 469c Patch - uses: robinraju/release-downloader@v1.2 + uses: robinraju/release-downloader@v1.5 with: repository: "OldUnreal/UnrealTournamentPatches" tag: "v469c" @@ -45,7 +45,7 @@ jobs: run: echo ("${{ env.PKG_NAME }}") >> PackageName - name: Create Package Name Artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: PackageName path: PackageName @@ -101,7 +101,7 @@ jobs: - name: Save UCC.log if: failure() - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ucc-output path: System/UCC.log @@ -124,7 +124,7 @@ jobs: } - name: Save ${{ github.event.repository.name }} Package - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: "${{ env.PKG_NAME }}" path: | From 1bd1d83b17eeb0c4189e88e617667d481bdcadaf Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Fri, 23 Dec 2022 11:16:23 +0100 Subject: [PATCH 28/58] Update CI --- .github/workflows/ci.yml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1730d23d..ce7e4dda 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,10 +23,7 @@ jobs: fileName: "OldUnreal-UTPatch469c-Windows.zip" - name: Extract Patch - uses: DuckSoft/extract-7z-action@v1.0 - with: - pathSource: "OldUnreal-UTPatch469c-Windows.zip" - pathTarget: . + run: 7z x "OldUnreal-UTPatch469c-Windows.zip" - name: Determine Package Name run: | @@ -53,7 +50,7 @@ jobs: if-no-files-found: error - name: Checkout ${{ github.event.repository.name }} - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: ${{ env.PKG_NAME }}/ @@ -85,10 +82,7 @@ jobs: } - name: Extract Necessary Resources - uses: DuckSoft/extract-7z-action@v1.0 - with: - pathSource: "${{ env.PKG_NAME }}/Build/BuildEnv.zip" - pathTarget: . + run: 7z x "${{ env.PKG_NAME }}/Build/BuildEnv.zip" - name: Create VersionInfo.uc shell: cmd From e603e0df0a52a268961e9af62099c0d28ad1ff15 Mon Sep 17 00:00:00 2001 From: Lukas Date: Mon, 26 Dec 2022 12:53:19 +0100 Subject: [PATCH 29/58] Add StringToName To StringUtils --- Classes/StringUtils.uc | 11 +++++++++++ Classes/bbPlayer.uc | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Classes/StringUtils.uc b/Classes/StringUtils.uc index ed450818..17ea4da8 100644 --- a/Classes/StringUtils.uc +++ b/Classes/StringUtils.uc @@ -1,5 +1,7 @@ class StringUtils extends Object; +var name TempName; + static final function string PackageOfClass(class C) { local string Result; local int DotPos; @@ -136,3 +138,12 @@ static final function string MergeAffixes(string Prefix, string Suffix) { return Prefix$Suffix; } + +final function name StringToName(coerce string S) { + SetPropertyText("TempName", S); + return TempName; +} + +static final function StringUtils Instance() { + return new (none, 'IGPlus_StringUtils') class'StringUtils'; +} diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 8281feb5..5e1381da 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -920,7 +920,7 @@ event PostBeginPlay() Super.PostBeginPlay(); Utils = new(none) class'Utilities'; - StringUtils = new(none) class'StringUtils'; + StringUtils = class'StringUtils'.static.Instance(); PlayerStatics = Spawn(class'bbPlayerStatics'); InitSettings(); From 0d93661cfcfcf751fb13c32a08e2117549910dd9 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Tue, 27 Dec 2022 03:57:27 +0100 Subject: [PATCH 30/58] Update CI --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ce7e4dda..1afb2324 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Download 469c Patch - uses: robinraju/release-downloader@v1.5 + uses: robinraju/release-downloader@v1.7 with: repository: "OldUnreal/UnrealTournamentPatches" tag: "v469c" From 157dadfd0948cafedd13dcbb21c0d08c9acc6e34 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Tue, 27 Dec 2022 09:43:50 +0100 Subject: [PATCH 31/58] Add Old FWS Back Now off by default. Admins should make sure to delete old mentions of bUseFastWeaponSwitch to get new default. --- Classes/UTPure.uc | 2 ++ Classes/bbPlayer.uc | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/Classes/UTPure.uc b/Classes/UTPure.uc index 3cf17930..df90c69f 100644 --- a/Classes/UTPure.uc +++ b/Classes/UTPure.uc @@ -44,6 +44,7 @@ var config bool bAutoPause; // Enable or disable autopause. (bTournament only) var config byte ForceModels; // 0 = Disallow, 1 = Client Selectable, 2 = Forced var config byte ImprovedHUD; // 0 = Disabled, 1 = Boots/Clock, 2 = Enhanced Team Info var config bool bDelayedPickupSpawn; // Enable or disable delayed first pickup spawn. +var config bool bUseFastWeaponSwitch; var config bool bTellSpectators; // Enable or disable telling spectators of reason for kicks. var config string PlayerPacks[8]; // Config list of supported player packs var config int DefaultHitSound, DefaultTeamHitSound; @@ -1449,6 +1450,7 @@ defaultproperties ForceModels=1 ImprovedHUD=1 bDelayedPickupSpawn=False + bUseFastWeaponSwitch=False PlayerPacks(0)="" DefaultHitSound=2 DefaultTeamHitSound=3 diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 5e1381da..ca95546e 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -339,6 +339,7 @@ var bool IGPlus_InitFlagSprites; var IGPlus_FlagSprite IGPlus_TeamFlagSprite[4]; var bool IGPlus_EnableDualButtonSwitch; +var bool IGPlus_UseFastWeaponSwitch; replication { @@ -358,6 +359,7 @@ replication IGPlus_AlwaysRenderFlagCarrier, IGPlus_EnableWarpFix, IGPlus_WarpFixDelay, + IGPlus_UseFastWeaponSwitch, KillCamDelay, KillCamDuration, LastKiller, @@ -1077,6 +1079,7 @@ event Possess() IGPlus_WarpFixDelay = class'UTPure'.default.WarpFixDelay; IGPlus_AlwaysRenderFlagCarrier = class'UTPure'.default.bAlwaysRenderFlagCarrier; IGPlus_AlwaysRenderDroppedFlags = class'UTPure'.default.bAlwaysRenderDroppedFlags; + IGPlus_UseFastWeaponSwitch = class'UTPure'.default.bUseFastWeaponSwitch; if(!zzUTPure.bExludeKickers) { @@ -2414,6 +2417,9 @@ function IGPlus_ApplyServerMove(IGPlus_ServerMove SM) { } } + if (IGPlus_UseFastWeaponSwitch && PendingWeapon != None) + ChangedWeapon(); + CurrentTimeStamp = SM.TimeStamp; ServerTimeStamp = Level.TimeSeconds; Rot.Roll = ClientRoll << 8; @@ -8461,6 +8467,14 @@ exec function NextWeapon() Weapon.PutDown(); } +simulated function ChangedWeapon() { + if (Weapon != None && IGPlus_UseFastWeaponSwitch) { + Weapon.GotoState(''); + ClientPutDown(none, PendingWeapon); + } + Super.ChangedWeapon(); +} + exec function Say(string Msg) { if (Msg ~= "r" || Msg ~= "rdy" || From 22c66a2bc4651003d8114818f7ed07d269c5aa67 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Tue, 27 Dec 2022 16:39:17 +0100 Subject: [PATCH 32/58] Escape xLevel Property Text (Fix Maps with ][) --- Classes/bbPlayer.uc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index ca95546e..6cbdfb36 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -1045,7 +1045,7 @@ event Possess() Class'PlayerShadow'.Default.Texture = Texture'Botpack.EnergyMark'; xxServerCheater(chr(90)$chr(69)); // ZE } - SetPropertyText("PureLevel", GetPropertyText("xLevel")); + SetPropertyText("PureLevel", "\""$GetPropertyText("xLevel")$"\""); FakeCAPInterval = Settings.FakeCAPInterval; IGPlus_DamageEvent_ShowOnDeath = Settings.bShowDeathReport; ClientSetMusic( Level.Song, Level.SongSection, Level.CdTrack, MTRAN_Fade ); From e742e19b2753e82540865bb83160fdc53dc99a79 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Tue, 27 Dec 2022 21:43:47 +0100 Subject: [PATCH 33/58] Make IG+ Settings Presets Work Using ?IGPlusSettings= URL parameter. --- Classes/ServerSettings.uc | 161 ++++++++++++++++ Classes/UTPure.uc | 289 +++++++++-------------------- Classes/bbCHCoach.uc | 2 +- Classes/bbPlayer.uc | 124 ++++++------- Classes/bbPlayerReplicationInfo.uc | 7 +- 5 files changed, 321 insertions(+), 262 deletions(-) create mode 100644 Classes/ServerSettings.uc diff --git a/Classes/ServerSettings.uc b/Classes/ServerSettings.uc new file mode 100644 index 00000000..84db7fe1 --- /dev/null +++ b/Classes/ServerSettings.uc @@ -0,0 +1,161 @@ +class ServerSettings extends Object + config(InstaGibPlus) + perobjectconfig; + +var config float HeadshotDamage; +var config float SniperSpeed; +var config float SniperDamagePri; + +var config bool SetPendingWeapon; +var config bool NNAnnouncer; + +// Enable or disable. +var config bool bUTPureEnabled; // Possible to enable/disable UTPure without changing ini's +// Advertising +var config byte Advertise; // Adds [CSHP] to the Server Name +var config byte AdvertiseMsg; // Decides if [CSHP] or [PURE] will be added to server name +// CenterView +var config bool bAllowCenterView; // Allow use of CenterView +var config float CenterViewDelay; // How long before allowing use of CenterView again +// BehindView +var config bool bAllowBehindView; // Allow use of BehindView +// Others +var config byte TrackFOV; // Track the FOV cheats [0 = no, 1 = strict, 2 = loose] +var config bool bAllowMultiWeapon; // if true allows the multiweapon bug to be used on server. +var config bool bFastTeams; // Allow quick teams changes +var config bool bUseClickboard; // Use clickboard in Tournament Mode or not +var config int MinClientRate; // Minimum allowed client rate. +var config int MaxClientRate; // Maximum allowed client rate. +var config bool bAdvancedTeamSay; // Enable or disable Advanced TeamSay. +var config byte ForceSettingsLevel; // 0 = off, 1 = PostNetBeginPlay, 2 = SpawnNotify, 3 = Intervalled +var config bool bWarmup; // Enable or disable warmup. (bTournament only) +var config int WarmupTimeLimit; // Warmup lasts at most this long +var config bool bCoaches; // Enable or disable coaching. (bTournament only) +var config bool bAutoPause; // Enable or disable autopause. (bTournament only) +var config byte ForceModels; // 0 = Disallow, 1 = Client Selectable, 2 = Forced +var config byte ImprovedHUD; // 0 = Disabled, 1 = Boots/Clock, 2 = Enhanced Team Info +var config bool bDelayedPickupSpawn; // Enable or disable delayed first pickup spawn. +var config bool bUseFastWeaponSwitch; +var config bool bTellSpectators; // Enable or disable telling spectators of reason for kicks. +var config string PlayerPacks[8]; // Config list of supported player packs +var config int DefaultHitSound, DefaultTeamHitSound; +var config bool bForceDefaultHitSounds; +var config int TeleRadius; +var config int ThrowVelocity; // How far a player can throw weapons +var config bool bForceDemo; // Forces clients to do demos. +var config bool bRestrictTrading; +var config float MaxTradeTimeMargin; // Only relevant when bRestrictTrading is true +var config float TradePingMargin; +var config float KillCamDelay; +var config float KillCamDuration; +var config bool bJumpingPreservesMomentum; +var config bool bOldLandingMomentum; +var config bool bEnableSingleButtonDodge; +var config bool bUseFlipAnimation; +var config bool bEnableWallDodging; +var config bool bDodgePreserveZMomentum; +var config int MaxMultiDodges; +var config int BrightskinMode; //0=None,1=Unlit +var config float PlayerScale; +var config bool bAlwaysRenderFlagCarrier; +var config bool bAlwaysRenderDroppedFlags; +var config int MaxPosError; +var config int MaxHitError; +var config float MaxJitterTime; +var config float WarpFixDelay; +var config float MinNetUpdateRate; +var config float MaxNetUpdateRate; +var config bool bEnableServerExtrapolation; +var config bool bEnableServerPacketReordering; +var config bool bEnableLoosePositionCheck; +var config bool bPlayersAlwaysRelevant; +var config bool bEnablePingCompensatedSpawn; +var config bool bEnableJitterBounding; +var config bool bEnableWarpFix; +var config bool ShowTouchedPackage; + +//Add the maplist where kickers will work using normal network +var config array ExcludeMapsForKickers; + +struct ForceSettingsEntry{ + var string Key; + var string Value; + var int Mode; +}; +var config array ForcedSettings; + +// function int GetForcedSettingsLength() { +// return ForcedSettings.Length; +// } + +// function string GetForcedSettingsKey(int Index) { +// return ForcedSettings[Index].Key; +// } + +// function string GetForcedSettingsValue(int Index) { +// return ForcedSettings[Index].Value; +// } + +// function int GetForcedSettingsMode(int Index) { +// return ForcedSettings[Index].Mode; +// } + +defaultproperties +{ + SniperDamagePri=60 + HeadshotDamage=100 + SniperSpeed=1.0 + bUTPureEnabled=True + Advertise=1 + AdvertiseMsg=1 + CenterViewDelay=1.000000 + bAllowBehindView=False + TrackFOV=0 + bAutoPause=True + bFastTeams=True + bUseClickboard=True + MinClientRate=10000 + MaxClientRate=25000 + bAdvancedTeamSay=True + ForceSettingsLevel=2 + bWarmup=True + ForceModels=1 + ImprovedHUD=1 + bDelayedPickupSpawn=False + bUseFastWeaponSwitch=False + DefaultHitSound=2 + DefaultTeamHitSound=3 + TeleRadius=210 + ThrowVelocity=750 + NNAnnouncer=True + MaxPosError=1000 + MaxHitError=10000 + MaxJitterTime=0.1 + WarpFixDelay=0.25 + MinNetUpdateRate=60.0 + MaxNetUpdateRate=200.0 + ShowTouchedPackage=False + bRestrictTrading=True + MaxTradeTimeMargin=0.1 + TradePingMargin=0.5 + KillCamDelay=0.0 + KillCamDuration=2.0 + bJumpingPreservesMomentum=False + bOldLandingMomentum=True + bEnableSingleButtonDodge=True + bUseFlipAnimation=True + bEnableWallDodging=False + bDodgePreserveZMomentum=False + MaxMultiDodges=1 + BrightskinMode=1 + PlayerScale=1.0 + bAlwaysRenderFlagCarrier=False + bAlwaysRenderDroppedFlags=False + bEnableServerExtrapolation=True + bEnableServerPacketReordering=False + bEnableLoosePositionCheck=True + bPlayersAlwaysRelevant=True + bEnablePingCompensatedSpawn=True + bEnableJitterBounding=True + bEnableWarpFix=True +} diff --git a/Classes/UTPure.uc b/Classes/UTPure.uc index df90c69f..a91caa5c 100644 --- a/Classes/UTPure.uc +++ b/Classes/UTPure.uc @@ -11,64 +11,6 @@ class UTPure extends Mutator config(InstaGibPlus); var ModifyLoginHandler NextMLH; // Link list of handlers -var config float HeadshotDamage; -var config float SniperSpeed; -var config float SniperDamagePri; - -var config bool SetPendingWeapon; -var config bool NNAnnouncer; - -// Enable or disable. -var config bool bUTPureEnabled; // Possible to enable/disable UTPure without changing ini's -// Advertising -var config byte Advertise; // Adds [CSHP] to the Server Name -var config byte AdvertiseMsg; // Decides if [CSHP] or [PURE] will be added to server name -// CenterView -var config bool bAllowCenterView; // Allow use of CenterView -var config float CenterViewDelay; // How long before allowing use of CenterView again -// BehindView -var config bool bAllowBehindView; // Allow use of BehindView -// Others -var config byte TrackFOV; // Track the FOV cheats [0 = no, 1 = strict, 2 = loose] -var config bool bAllowMultiWeapon; // if true allows the multiweapon bug to be used on server. -var config bool bFastTeams; // Allow quick teams changes -var config bool bUseClickboard; // Use clickboard in Tournament Mode or not -var config int MinClientRate; // Minimum allowed client rate. -var config int MaxClientRate; // Maximum allowed client rate. -var config bool bAdvancedTeamSay; // Enable or disable Advanced TeamSay. -var config byte ForceSettingsLevel; // 0 = off, 1 = PostNetBeginPlay, 2 = SpawnNotify, 3 = Intervalled -var config bool bWarmup; // Enable or disable warmup. (bTournament only) -var config int WarmupTimeLimit; // Warmup lasts at most this long -var config bool bCoaches; // Enable or disable coaching. (bTournament only) -var config bool bAutoPause; // Enable or disable autopause. (bTournament only) -var config byte ForceModels; // 0 = Disallow, 1 = Client Selectable, 2 = Forced -var config byte ImprovedHUD; // 0 = Disabled, 1 = Boots/Clock, 2 = Enhanced Team Info -var config bool bDelayedPickupSpawn; // Enable or disable delayed first pickup spawn. -var config bool bUseFastWeaponSwitch; -var config bool bTellSpectators; // Enable or disable telling spectators of reason for kicks. -var config string PlayerPacks[8]; // Config list of supported player packs -var config int DefaultHitSound, DefaultTeamHitSound; -var config bool bForceDefaultHitSounds; -var config int TeleRadius; -var config int ThrowVelocity; // How far a player can throw weapons -var config bool bForceDemo; // Forces clients to do demos. -var config bool bRestrictTrading; -var config float MaxTradeTimeMargin; // Only relevant when bRestrictTrading is true -var config float TradePingMargin; -var config float KillCamDelay; -var config float KillCamDuration; -var config bool bJumpingPreservesMomentum; -var config bool bOldLandingMomentum; -var config bool bEnableSingleButtonDodge; -var config bool bUseFlipAnimation; -var config bool bEnableWallDodging; -var config bool bDodgePreserveZMomentum; -var config int MaxMultiDodges; -var config int BrightskinMode; //0=None,1=Unlit -var config float PlayerScale; -var config bool bAlwaysRenderFlagCarrier; -var config bool bAlwaysRenderDroppedFlags; - // Nice variables. var float zzTeamChangeTime; // This would be to Prevent Team Change Spamming var bool zzbWarmupPlayers; // Do we have any players warming up? @@ -81,20 +23,6 @@ var float EndWarnDelay; // Pause control (for Event PlayerCalcView) var bool zzbPaused; // Game has been paused at one time. var float zzPauseCountdown; // Give 120 seconds of "ignore FT" -var config int MaxPosError; -var config int MaxHitError; -var config float MaxJitterTime; -var config float WarpFixDelay; -var config float MinNetUpdateRate; -var config float MaxNetUpdateRate; -var config bool bEnableServerExtrapolation; -var config bool bEnableServerPacketReordering; -var config bool bEnableLoosePositionCheck; -var config bool bPlayersAlwaysRelevant; -var config bool bEnablePingCompensatedSpawn; -var config bool bEnableJitterBounding; -var config bool bEnableWarpFix; -var config bool ShowTouchedPackage; var name zzDefaultWeapons[8]; var string zzDefaultPackages[8]; @@ -102,24 +30,19 @@ var string zzDefaultPackages[8]; var PureAutoPause zzAutoPauser; //Add the maplist where kickers will work using normal network -var config string ExcludeMapsForKickers[128]; var bool bExludeKickers; var bbPlayerReplicationInfo SkinIndexToPRIMap[64]; -struct ForceSettingsEntry{ - var string Key; - var string Value; - var int Mode; -}; -var config ForceSettingsEntry ForcedSettings[128]; +var StringUtils StringUtils; + +var Object SettingsHelper; +var ServerSettings Settings; replication { unreliable if (Role == ROLE_Authority) bExludeKickers, - MaxPosError, - NNAnnouncer, zzAutoPauser; } @@ -129,6 +52,8 @@ function PreBeginPlay() if (zzDMP == None) return; + StringUtils = class'StringUtils'.static.Instance(); + // toggle first blood so it doesn't get triggered during warmup zzDMP.bFirstBlood = True; @@ -149,11 +74,34 @@ function PrintVersionInfo() { LongStr = class'VersionInfo'.default.PackageBaseName@class'VersionInfo'.default.PackageVersion; if (Len(LongStr) > 20) { - xxLog("#"$class'StringUtils'.static.CenteredString(class'VersionInfo'.default.PackageBaseName, 29, " ")$"#"); + xxLog("#"$StringUtils.CenteredString(class'VersionInfo'.default.PackageBaseName, 29, " ")$"#"); LongStr = class'VersionInfo'.default.PackageVersion; } - xxLog("#"$class'StringUtils'.static.CenteredString(LongStr, 29, " ")$"#"); + xxLog("#"$StringUtils.CenteredString(LongStr, 29, " ")$"#"); +} + +function string GetAllOptions() { + local string O; + local int Pos; + + O = Level.GetLocalURL(); + Pos = InStr(O, "?"); + if (Pos < 0) + return ""; + return Mid(O, Pos); +} + +function InitializeSettings() { + local string SettingsName; + + SettingsName = Level.Game.ParseOption(GetAllOptions(), "IGPlusSettings"); + if (SettingsName == "") + SettingsName = "ServerSettings"; + + SettingsHelper = new(none, 'InstaGibPlus') class'Object'; + Settings = new(SettingsHelper, StringUtils.StringToName(SettingsName)) class'ServerSettings'; + Settings.SaveConfig(); } function PostBeginPlay() @@ -168,6 +116,8 @@ function PostBeginPlay() Super.PostBeginPlay(); + InitializeSettings(); + xxLog(""); xxLog("###############################"); PrintVersionInfo(); @@ -177,7 +127,7 @@ function PostBeginPlay() xxLog("# Game is not based on #"); xxLog("# DeathMatchPlus! #"); xxLog("###############################"); - bUTPureEnabled = False; + Settings.bUTPureEnabled = False; Disable('Tick'); return; } @@ -187,23 +137,23 @@ function PostBeginPlay() } xxLog("#"); - if (AdvertiseMsg == 0) + if (Settings.AdvertiseMsg == 0) sTag = "[CSHP]"; - else if (AdvertiseMsg == 1) + else if (Settings.AdvertiseMsg == 1) sTag = "[IG+]"; else sTag = "[PWND]"; // Setup name advertising - if ( (Advertise>0) && (Level != None && Level.NetMode != NM_Standalone) && (zzDMP.GameReplicationInfo != None && instr(zzDMP.GameReplicationInfo.ServerName,sTag)==-1) ) + if ( (Settings.Advertise>0) && (Level != None && Level.NetMode != NM_Standalone) && (zzDMP.GameReplicationInfo != None && instr(zzDMP.GameReplicationInfo.ServerName,sTag)==-1) ) { - if (Advertise==1) + if (Settings.Advertise==1) zzDMP.GameReplicationInfo.ServerName = sTag@zzDMP.GameReplicationInfo.ServerName; - else if (Advertise==2) + else if (Settings.Advertise==2) zzDMP.GameReplicationInfo.ServerName = zzDMP.GameReplicationInfo.ServerName@sTag; } - for (i = 0; PlayerPacks[i] != ""; i++); + for (i = 0; Settings.PlayerPacks[i] != ""; i++); ppCnt = i; XC_Version = int(ConsoleCommand("get ini:engine.engine.gameengine XC_Version")); @@ -217,12 +167,12 @@ function PostBeginPlay() ServPacks = Caps(ConsoleCommand("get engine.gameengine serverpackages")); } // Create the ModifyLoginHandler chain list - for (i = 0; PlayerPacks[i] != ""; i++) + for (i = 0; Settings.PlayerPacks[i] != ""; i++) { // Verify that the PlayerPack Package is in ServerPackages - curMLHPack = PlayerPacks[i]$"H"$class'VersionInfo'.default.PackageVersion; - fullpack = curMLHPack$"."$PlayerPacks[i]$"LoginHandler"; + curMLHPack = Settings.PlayerPacks[i]$"H"$class'VersionInfo'.default.PackageVersion; + fullpack = curMLHPack$"."$Settings.PlayerPacks[i]$"LoginHandler"; if (Instr(CAPS(ServPacks), Caps(Chr(34)$curMLHPack$Chr(34))) != -1) { MLHClass = class(DynamicLoadObject(fullpack, class'Class')); @@ -258,22 +208,22 @@ function PostBeginPlay() MLH.Accepted(); //Log("bAutoPause:"@bAutoPause@"bTeamGame:"@zzDMP.bTeamGame@"bTournament:"@zzDMP.bTournament); - if (bAutoPause && zzDMP.bTeamGame && zzDMP.bTournament) + if (Settings.bAutoPause && zzDMP.bTeamGame && zzDMP.bTournament) zzAutoPauser = Spawn(Class'PureAutoPause'); - if (bUseClickboard) + if (Settings.bUseClickboard) SetupClickBoard(); - if (ImprovedHUD == 2 && zzDMP.bTeamGame) + if (Settings.ImprovedHUD == 2 && zzDMP.bTeamGame) xxReplaceTeamInfo(); // Do really nasty replacement of TeamInfo with Pures own. - if (bDelayedPickupSpawn) + if (Settings.bDelayedPickupSpawn) Spawn(Class'PureDPS'); Spawn(class'NN_SpawnNotify'); Spawn(class'IGPlus_UnlagPause'); - if (NNAnnouncer) + if (Settings.NNAnnouncer) Spawn(class'NNAnnouncerSA'); // Necessary functions to let the "bExludeKickers" list work @@ -358,8 +308,8 @@ function bool IsMapExcluded (string MapName) { local int index; - while (index < arrayCount(ExcludeMapsForKickers)) { - if ((Left(ExcludeMapsForKickers[index], Len(MapName)) ~= MapName)) + while (index < Settings.ExcludeMapsForKickers.Length) { + if ((Left(Settings.ExcludeMapsForKickers[index], Len(MapName)) ~= MapName)) return true; ++index; } @@ -447,7 +397,7 @@ event Tick(float zzDelta) } // Cause clients to force an actor check. - if (ForceSettingsLevel > 2 && rand(5000) == 0) + if (Settings.ForceSettingsLevel > 2 && rand(5000) == 0) zzb = True; if (Level.Game.bGameEnded && !bDidShot) { @@ -697,7 +647,7 @@ function ModifyLogin(out class SpawnClass, out string Portal, out st // Quick Fix: Turn Commanders into our Spectator class. if (SpawnClass == class'Commander' || SpawnClass == class'Spectator' || SpawnClass == class'CHSpectator') { - if (zzDMP.bTeamGame && zzDMP.bTournament && bCoaches) // Only allow coaches in bTournament Team games. + if (zzDMP.bTeamGame && zzDMP.bTournament && Settings.bCoaches) // Only allow coaches in bTournament Team games. SpawnClass = class'bbCHCoach'; else SpawnClass = class'bbCHSpectator'; @@ -708,7 +658,7 @@ function ModifyLogin(out class SpawnClass, out string Portal, out st if ( NextMutator != None ) NextMutator.ModifyLogin(SpawnClass, Portal, Options); - if (!bUTPureEnabled) + if (!Settings.bUTPureEnabled) return; // Let VAPure handle login first ! @@ -735,7 +685,7 @@ function ModifyPlayer(Pawn Other) { local bbPlayer zzP; - if (Other.IsA('TournamentPlayer') && bUTPureEnabled) + if (Other.IsA('TournamentPlayer') && Settings.bUTPureEnabled) { zzP = bbPlayer(Other); if (zzP == None && Spectator(Other) == None) @@ -746,17 +696,17 @@ function ModifyPlayer(Pawn Other) } else if (zzP != None) { - zzP.zzTrackFOV = TrackFOV; - zzP.zzCVDelay = CenterViewDelay; - zzP.zzCVDeny = !bAllowCenterView; - zzP.zzbNoMultiWeapon = !bAllowMultiWeapon; - zzP.zzForceSettingsLevel = ForceSettingsLevel; + zzP.zzTrackFOV = Settings.TrackFOV; + zzP.zzCVDelay = Settings.CenterViewDelay; + zzP.zzCVDeny = !Settings.bAllowCenterView; + zzP.zzbNoMultiWeapon = !Settings.bAllowMultiWeapon; + zzP.zzForceSettingsLevel = Settings.ForceSettingsLevel; if (zzDMP.CountDown < 1) { // only set on first spawn after warmup - zzP.zzbForceDemo = bForceDemo; + zzP.zzbForceDemo = Settings.bForceDemo; zzP.zzbGameStarted = True; } - if (default.bEnablePingCompensatedSpawn) { + if (Settings.bEnablePingCompensatedSpawn) { zzP.bHidden = true; zzP.SetCollision(false, false, false); // we are not undoing the effects because we cant "unplay" a sound @@ -766,8 +716,8 @@ function ModifyPlayer(Pawn Other) } AssignFixedSkinIndex(Other); - Other.SetCollisionSize(Other.default.CollisionRadius * PlayerScale, Other.default.CollisionHeight * PlayerScale); - Other.DrawScale = Other.default.DrawScale * PlayerScale; + Other.SetCollisionSize(Other.default.CollisionRadius * Settings.PlayerScale, Other.default.CollisionHeight * Settings.PlayerScale); + Other.DrawScale = Other.default.DrawScale * Settings.PlayerScale; Super.ModifyPlayer(Other); } @@ -800,7 +750,7 @@ function bool AlwaysKeep(Actor Other) if ( bbPlayer(Other) != None ) { bbPlayer(Other).zzUTPure = Self; - bbPlayer(Other).zzThrowVelocity = ThrowVelocity; + bbPlayer(Other).zzThrowVelocity = Settings.ThrowVelocity; } return Super.AlwaysKeep(Other); } @@ -881,42 +831,42 @@ function Mutate(string MutateString, PlayerPawn Sender) if (MutateString ~= "CheatInfo") { Sender.ClientMessage("This server is running "$class'VersionInfo'.default.PackageBaseName@class'VersionInfo'.default.PackageVersion); - if (bUTPureEnabled) + if (Settings.bUTPureEnabled) { Sender.ClientMessage("UTPure settings:"); - Sender.ClientMessage("- FOV Tracking:"@TrackFOV@"(0 = off, 1 = strict, 2 = loose)"); - Sender.ClientMessage("- Forced Settings:"@ForceSettingsLevel@"(0 = off, 1 = simple, 2 = passive, 3 = active)"); - Sender.ClientMessage("- Minimum Clientrate:"@MinClientRate); - Sender.ClientMessage("- Maximum Clientrate:"@MaxClientRate); - Sender.ClientMessage("- Advanced TeamSay:"@bAdvancedTeamSay); - Sender.ClientMessage("- Allow CenterView:"@bAllowCenterView); - if (bAllowCenterView) - Sender.ClientMessage("- CenterView Delay:"@CenterViewDelay); - Sender.ClientMessage("- Allow BehindView:"@bAllowBehindView); - Sender.ClientMessage("- Delayed First Pickup Spawn:"@bDelayedPickupSpawn); - Sender.ClientMessage("- Improved HUD:"@ImprovedHUD@"(0 = off, 1 = clock/boots, 2 = team)"); - Sender.ClientMessage("- Forced Models:"@ForceModels@"(0 = off, 1 = allowed, 2 = forced)"); + Sender.ClientMessage("- FOV Tracking:"@Settings.TrackFOV@"(0 = off, 1 = strict, 2 = loose)"); + Sender.ClientMessage("- Forced Settings:"@Settings.ForceSettingsLevel@"(0 = off, 1 = simple, 2 = passive, 3 = active)"); + Sender.ClientMessage("- Minimum Clientrate:"@Settings.MinClientRate); + Sender.ClientMessage("- Maximum Clientrate:"@Settings.MaxClientRate); + Sender.ClientMessage("- Advanced TeamSay:"@Settings.bAdvancedTeamSay); + Sender.ClientMessage("- Allow CenterView:"@Settings.bAllowCenterView); + if (Settings.bAllowCenterView) + Sender.ClientMessage("- CenterView Delay:"@Settings.CenterViewDelay); + Sender.ClientMessage("- Allow BehindView:"@Settings.bAllowBehindView); + Sender.ClientMessage("- Delayed First Pickup Spawn:"@Settings.bDelayedPickupSpawn); + Sender.ClientMessage("- Improved HUD:"@Settings.ImprovedHUD@"(0 = off, 1 = clock/boots, 2 = team)"); + Sender.ClientMessage("- Forced Models:"@Settings.ForceModels@"(0 = off, 1 = allowed, 2 = forced)"); zzbbPP = bbPlayer(Sender); if (zzbbPP != None) { Sender.ClientMessage("Your settings:"); - if (ImprovedHUD > 0) + if (Settings.ImprovedHUD > 0) Sender.ClientMessage("- Improved HUD:"@zzbbPP.HUDInfo@"(0 = off, 1 = clock/boots, 2 = team)"); - if (ForceModels > 0) + if (Settings.ForceModels > 0) Sender.ClientMessage("- Forced Models:"@zzbbPP.zzbForceModels); Sender.ClientMessage("- Using New Net Code:"@zzbbPP.bNewNet); } } else Sender.ClientMessage("UTPure is Disabled!"); - Sender.ClientMessage("Fast Teams:"@bFastTeams); + Sender.ClientMessage("Fast Teams:"@Settings.bFastTeams); } else if (MutateString ~= "PlayerHelp") { Sender.ClientMessage("InstaGib Plus Client Commands: (Type directly into console)"); Sender.ClientMessage("- PureLogo (Shows Logo and Version Information in lower left corner)"); Sender.ClientMessage("- ForceModels x (0 = Off, 1 = On. Default = 0) - The models will be forced to the model you select."); - if (ImprovedHUD == 2) + if (Settings.ImprovedHUD == 2) Sender.ClientMessage("- TeamInfo x (0 = Off, 1 = On, Default = 1)"); Sender.ClientMessage("- MyIGSettings (Displays your current IG+ settings)"); Sender.ClientMessage("- ShowNetSpeeds (Shows the netspeeds other players currently have)"); @@ -959,7 +909,7 @@ function Mutate(string MutateString, PlayerPawn Sender) { if (Sender.bAdmin) { - Default.bUTPureEnabled = True; + Settings.bUTPureEnabled = True; StaticSaveConfig(); Sender.ClientMessage("UTPure will be ENABLED after next map change!"); } @@ -970,7 +920,7 @@ function Mutate(string MutateString, PlayerPawn Sender) { if (Sender.bAdmin) { - Default.bUTPureEnabled = False; + Settings.bUTPureEnabled = False; StaticSaveConfig(); Sender.ClientMessage("UTPure will be DISABLED after next map change!"); } @@ -1051,7 +1001,7 @@ function Mutate(string MutateString, PlayerPawn Sender) Sender.ClientMessage(BADminText); } else if (MutateString ~= "geterrordata") { - Sender.ClientMessage("MaxPosError:"@MaxPosError); + Sender.ClientMessage("MaxPosError:"@Settings.MaxPosError); } else if (Left(MutateString,7) ~= "KICKID ") { @@ -1181,7 +1131,7 @@ function Mutate(string MutateString, PlayerPawn Sender) } } - if (bFastTeams) + if (Settings.bFastTeams) { if (MutateString ~= "FixTeams") MakeTeamsEven(Sender); @@ -1416,77 +1366,20 @@ event Destroyed() // Make sure config is stored. (Don't think this is ever calle Super.Destroyed(); } -static function string GetForcedSettingKey(int Index) { - return default.ForcedSettings[Index].Key; +function string GetForcedSettingKey(int Index) { + return Settings.ForcedSettings[Index].Key; } -static function string GetForcedSettingValue(int Index) { - return default.ForcedSettings[Index].Value; +function string GetForcedSettingValue(int Index) { + return Settings.ForcedSettings[Index].Value; } -static function int GetForcedSettingMode(int Index) { - return default.ForcedSettings[Index].Mode; +function int GetForcedSettingMode(int Index) { + return Settings.ForcedSettings[Index].Mode; } defaultproperties { - SniperDamagePri=60 - HeadshotDamage=100 - SniperSpeed=1.0 - bUTPureEnabled=True - Advertise=1 - AdvertiseMsg=1 - CenterViewDelay=1.000000 - bAllowBehindView=False - TrackFOV=0 - bAutoPause=True - bFastTeams=True - bUseClickboard=True - MinClientRate=10000 - MaxClientRate=25000 - bAdvancedTeamSay=True - ForceSettingsLevel=2 - bWarmup=True - ForceModels=1 - ImprovedHUD=1 - bDelayedPickupSpawn=False - bUseFastWeaponSwitch=False - PlayerPacks(0)="" - DefaultHitSound=2 - DefaultTeamHitSound=3 - TeleRadius=210 - ThrowVelocity=750 BADminText="Not allowed - Log in as admin!" bAlwaysTick=True - NNAnnouncer=True - MaxPosError=1000 - MaxHitError=10000 - MaxJitterTime=0.1 - WarpFixDelay=0.25 - MinNetUpdateRate=60.0 - MaxNetUpdateRate=200.0 - ShowTouchedPackage=False - bRestrictTrading=True - MaxTradeTimeMargin=0.1 - TradePingMargin=0.5 - KillCamDelay=0.0 - KillCamDuration=2.0 - bJumpingPreservesMomentum=False - bOldLandingMomentum=True - bEnableSingleButtonDodge=True - bUseFlipAnimation=True - bEnableWallDodging=False - bDodgePreserveZMomentum=False - MaxMultiDodges=1 - BrightskinMode=1 - PlayerScale=1.0 - bAlwaysRenderFlagCarrier=False - bAlwaysRenderDroppedFlags=False - bEnableServerExtrapolation=True - bEnableServerPacketReordering=False - bEnableLoosePositionCheck=True - bPlayersAlwaysRelevant=True - bEnablePingCompensatedSpawn=True - bEnableJitterBounding=True - bEnableWarpFix=True } diff --git a/Classes/bbCHCoach.uc b/Classes/bbCHCoach.uc index 251ad9b1..522a0d5a 100644 --- a/Classes/bbCHCoach.uc +++ b/Classes/bbCHCoach.uc @@ -125,7 +125,7 @@ state Coaching extends CheatFlying exec function BehindView( Bool B ) { // Limit behindview if pure wishes it so - if (Class'UTPure'.Default.bAllowBehindView) + if (zzUTPure.Settings.bAllowBehindView) bBehindView = B; else bBehindView = False; diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 6cbdfb36..685914fa 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -668,7 +668,7 @@ simulated function Touch( actor Other ) { if(Level.NetMode != NM_Client) { - if (Class'UTPure'.Default.ShowTouchedPackage) + if (zzUTPure.Settings.ShowTouchedPackage) { ClientMessage(class'StringUtils'.static.PackageOfObject(Other)); } @@ -929,8 +929,8 @@ event PostBeginPlay() if ( Level.NetMode != NM_Client ) { - zzMinimumNetspeed = Class'UTPure'.Default.MinClientRate; - zzMaximumNetspeed = Class'UTPure'.Default.MaxClientRate; + zzMinimumNetspeed = zzUTPure.Settings.MinClientRate; + zzMaximumNetspeed = zzUTPure.Settings.MaxClientRate; zzWaitTime = 5.0; } @@ -954,7 +954,7 @@ event PostBeginPlay() simulated event PostNetBeginPlay() { Utils = new(none) class'Utilities'; - StringUtils = new(none) class'StringUtils'; + StringUtils = class'StringUtils'.static.Instance(); PlayerStatics = Spawn(class'bbPlayerStatics'); InitSettings(); @@ -1054,32 +1054,32 @@ event Possess() } else { - TeleRadius = zzUTPure.Default.TeleRadius; + TeleRadius = zzUTPure.Settings.TeleRadius; xxSetTeleRadius(TeleRadius); - BrightskinMode = class'UTPure'.default.BrightskinMode; + BrightskinMode = zzUTPure.Settings.BrightskinMode; - xxSetSniperSpeed(class'UTPure'.default.SniperSpeed); + xxSetSniperSpeed(zzUTPure.Settings.SniperSpeed); xxSetDefaultWeapon(Level.Game.BaseMutator.MutatedDefaultWeapon().name); GameReplicationInfo.RemainingTime = DeathMatchPlus(Level.Game).RemainingTime; GameReplicationInfo.ElapsedTime = DeathMatchPlus(Level.Game).ElapsedTime; xxSetTimes(GameReplicationInfo.RemainingTime, GameReplicationInfo.ElapsedTime); - KillCamDelay = FMax(0.0, class'UTPure'.default.KillCamDelay); - KillCamDuration = class'UTPure'.default.KillCamDuration; - bJumpingPreservesMomentum = class'UTPure'.default.bJumpingPreservesMomentum; - bOldLandingMomentum = class'UTPure'.default.bOldLandingMomentum; - bEnableSingleButtonDodge = class'UTPure'.default.bEnableSingleButtonDodge; - bUseFlipAnimation = class'UTPure'.default.bUseFlipAnimation; - bCanWallDodge = class'UTPure'.default.bEnableWallDodging; - bDodgePreserveZMomentum = class'UTPure'.default.bDodgePreserveZMomentum; - bAlwaysRelevant = class'UTPure'.default.bPlayersAlwaysRelevant; - IGPlus_EnableWarpFix = class 'UTPure'.default.bEnableWarpFix; - IGPlus_WarpFixDelay = class'UTPure'.default.WarpFixDelay; - IGPlus_AlwaysRenderFlagCarrier = class'UTPure'.default.bAlwaysRenderFlagCarrier; - IGPlus_AlwaysRenderDroppedFlags = class'UTPure'.default.bAlwaysRenderDroppedFlags; - IGPlus_UseFastWeaponSwitch = class'UTPure'.default.bUseFastWeaponSwitch; + KillCamDelay = FMax(0.0, zzUTPure.Settings.KillCamDelay); + KillCamDuration = zzUTPure.Settings.KillCamDuration; + bJumpingPreservesMomentum = zzUTPure.Settings.bJumpingPreservesMomentum; + bOldLandingMomentum = zzUTPure.Settings.bOldLandingMomentum; + bEnableSingleButtonDodge = zzUTPure.Settings.bEnableSingleButtonDodge; + bUseFlipAnimation = zzUTPure.Settings.bUseFlipAnimation; + bCanWallDodge = zzUTPure.Settings.bEnableWallDodging; + bDodgePreserveZMomentum = zzUTPure.Settings.bDodgePreserveZMomentum; + bAlwaysRelevant = zzUTPure.Settings.bPlayersAlwaysRelevant; + IGPlus_EnableWarpFix = zzUTPure.Settings.bEnableWarpFix; + IGPlus_WarpFixDelay = zzUTPure.Settings.WarpFixDelay; + IGPlus_AlwaysRenderFlagCarrier = zzUTPure.Settings.bAlwaysRenderFlagCarrier; + IGPlus_AlwaysRenderDroppedFlags = zzUTPure.Settings.bAlwaysRenderDroppedFlags; + IGPlus_UseFastWeaponSwitch = zzUTPure.Settings.bUseFastWeaponSwitch; if(!zzUTPure.bExludeKickers) { @@ -2169,7 +2169,7 @@ function ExtrapolationDiscardData() { function WarpCompensation(float DeltaTime) { if (Level.Pauser == "" && !bWasPaused) { - if (class'UTPure'.default.bEnableServerExtrapolation && + if (zzUTPure.Settings.bEnableServerExtrapolation && bExtrapolatedLastUpdate == false && ExtrapolationDelta > AverageServerDeltaTime ) { bExtrapolatedLastUpdate = true; @@ -2197,7 +2197,7 @@ function ClearLastServerMoveParams() { function IGPlus_ProcessRemoteMovement() { IGPlus_ApplyAllServerMoves(); - if (class'UTPure'.default.bEnableLoosePositionCheck) + if (zzUTPure.Settings.bEnableLoosePositionCheck) IGPlus_LooseCheckClientError(); else IGPlus_CheckClientError(); @@ -2407,7 +2407,7 @@ function IGPlus_ApplyServerMove(IGPlus_ServerMove SM) { if ((Level.Pauser == "") && (DeltaTime > 0)) { UndoExtrapolation(); - if (class'UTPure'.default.bEnablePingCompensatedSpawn) { + if (zzUTPure.Settings.bEnablePingCompensatedSpawn) { if (bHidden && (IsInState('PlayerWalking') || IsInState('PlayerSwimming'))) { bClientDead = false; bHidden = false; @@ -2450,13 +2450,13 @@ function IGPlus_ApplyServerMove(IGPlus_ServerMove SM) { // Predict new position if ((Level.Pauser == "") && (DeltaTime > 0) && - (class'UTPure'.default.bEnableWarpFix == false || DeltaTime <= class'UTPure'.default.WarpFixDelay) + (zzUTPure.Settings.bEnableWarpFix == false || DeltaTime <= zzUTPure.Settings.WarpFixDelay) ) { - if (class'UTPure'.default.bEnableJitterBounding && DeltaTime > class'UTPure'.default.MaxJitterTime) { - SimTime = DeltaTime - class'UTPure'.default.MaxJitterTime; + if (zzUTPure.Settings.bEnableJitterBounding && DeltaTime > zzUTPure.Settings.MaxJitterTime) { + SimTime = DeltaTime - zzUTPure.Settings.MaxJitterTime; if (SimTime >= 0.005 || bIs469Server) { SimMoveAutonomous(SimTime); - DeltaTime = class'UTPure'.default.MaxJitterTime; + DeltaTime = zzUTPure.Settings.MaxJitterTime; } } @@ -2532,7 +2532,7 @@ function IGPlus_ApplyServerMove(IGPlus_ServerMove SM) { bWasPaused = false; } - if (IGPlus_WantCAP || class'UTPure'.default.bEnableLoosePositionCheck == false) + if (IGPlus_WantCAP || zzUTPure.Settings.bEnableLoosePositionCheck == false) return; IGPlus_WantCAP = IGPlus_IsCAPNecessary(); @@ -2737,7 +2737,7 @@ function IGPlus_SendCAP() { LastCAPTime = ServerTimeStamp; NextRealCAPTime = ServerTimeStamp; - if (class'UTPure'.default.bEnableLoosePositionCheck) + if (zzUTPure.Settings.bEnableLoosePositionCheck) NextRealCAPTime += PlayerReplicationInfo.Ping * 0.001 * Level.TimeDilation + AverageServerDeltaTime; zzLastClientErr = 0; IGPlus_WantCAP = false; @@ -2803,7 +2803,7 @@ function bool IGPlus_OldServerMove(float TimeStamp, int OldMoveData1, int OldMov return false; DeltaTime = OldTimeStamp - CurrentTimeStamp; - if (class'UTPure'.default.bEnableWarpFix && DeltaTime > class'UTPure'.default.WarpFixDelay) { + if (zzUTPure.Settings.bEnableWarpFix && DeltaTime > zzUTPure.Settings.WarpFixDelay) { return false; } @@ -2820,11 +2820,11 @@ function bool IGPlus_OldServerMove(float TimeStamp, int OldMoveData1, int OldMov UndoExtrapolation(); - if (class'UTPure'.default.bEnableJitterBounding && DeltaTime > class'UTPure'.default.MaxJitterTime) { - SimTime = DeltaTime - class'UTPure'.default.MaxJitterTime; + if (zzUTPure.Settings.bEnableJitterBounding && DeltaTime > zzUTPure.Settings.MaxJitterTime) { + SimTime = DeltaTime - zzUTPure.Settings.MaxJitterTime; if (SimTime >= 0.005 || bIs469Server) { SimMoveAutonomous(SimTime); - DeltaTime = class'UTPure'.default.MaxJitterTime; + DeltaTime = zzUTPure.Settings.MaxJitterTime; } } @@ -2959,7 +2959,7 @@ function xxServerMove( SM.OldMoveData1 = OldMoveData1; SM.OldMoveData2 = OldMoveData2; - if (class'UTPure'.default.bEnableServerPacketReordering) { + if (zzUTPure.Settings.bEnableServerPacketReordering) { IGPlus_InsertServerMove(SM); } else { IGPlus_ApplyServerMove(SM); @@ -3061,7 +3061,7 @@ function float CalculateLocError(float DeltaTime, EPhysics Phys, vector ClientVe ClientVelCalc.Y = FMax(ClientVel.Y, Velocity.Y); ClientVelCalc.Z = FMax(ClientVel.Z, Velocity.Z); - PosErrFactor = FMin(DeltaTime, class'UTPure'.default.MaxJitterTime); + PosErrFactor = FMin(DeltaTime, zzUTPure.Settings.MaxJitterTime); switch (Phys) { case PHYS_Walking: @@ -3167,7 +3167,7 @@ function bool xxCloseEnough(vector HitLoc, optional int HitRadius) local vector Loc; local bbOldMovementInfo MI; - MaxHitError = zzUTPure.default.MaxHitError + HitRadius; + MaxHitError = zzUTPure.Settings.MaxHitError + HitRadius; if (VSize(HitLoc - Location) < MaxHitError) return true; @@ -3323,16 +3323,16 @@ function xxNN_Fire( float TimeStamp, int ProjIndex, vector ClientLoc, vector Cli } else { - if (class'UTPure'.default.bRestrictTrading && IsInState('Dying')) { + if (zzUTPure.Settings.bRestrictTrading && IsInState('Dying')) { if (bbPlayer(LastKiller) != none) TradeTimeMargin = FMin( - class'UTPure'.default.MaxTradeTimeMargin, + zzUTPure.Settings.MaxTradeTimeMargin, ((AverageServerDeltaTime + TimeBetweenNetUpdates)/Level.TimeDilation + - 0.0005 * PlayerReplicationInfo.Ping * class'UTPure'.default.TradePingMargin + + 0.0005 * PlayerReplicationInfo.Ping * zzUTPure.Settings.TradePingMargin + 0.0005 * (PlayerReplicationInfo.Ping - bbPlayer(LastKiller).PlayerReplicationInfo.Ping)) ); else - TradeTimeMargin = class'UTPure'.default.MaxTradeTimeMargin; + TradeTimeMargin = zzUTPure.Settings.MaxTradeTimeMargin; if (RealTimeDead < TradeTimeMargin) { Log("["$Level.TimeSeconds$"] Traded! TradeTimeMargin="$TradeTimeMargin@"RealTimeDead="$RealTimeDead, 'IGPlus'); @@ -3558,7 +3558,7 @@ simulated function xxSetDefaultWeapon(name W) simulated function xxSetSniperSpeed(float SniperSpeed) { - class'UTPure'.default.SniperSpeed = SniperSpeed; + zzUTPure.Settings.SniperSpeed = SniperSpeed; } simulated function xxSetTimes(int RemainingTime, int ElapsedTime) @@ -4445,7 +4445,7 @@ simulated function ClientAddMomentum(vector Momentum, float TimeStamp, int Index function ServerAddMomentum(vector Momentum) { local int Next; - if (class'UTPure'.default.bEnableLoosePositionCheck) { + if (zzUTPure.Settings.bEnableLoosePositionCheck) { if (Momentum == vect(0,0,0)) return; @@ -5051,16 +5051,16 @@ event ServerTick(float DeltaTime) { DelayedNavPoint = DelayedNavPoint.NextNavigationPoint; } - if (IGPlus_ForcedSettings_Index < arraycount(IGPlus_ForcedSettings)) { - if (class'UTPure'.static.GetForcedSettingKey(IGPlus_ForcedSettings_Index) != "") { + if (IGPlus_ForcedSettings_Index < Min(zzUTPure.Settings.ForcedSettings.Length, arraycount(IGPlus_ForcedSettings))) { + if (zzUTPure.GetForcedSettingKey(IGPlus_ForcedSettings_Index) != "") { IGPlus_ForcedSettings_Counter++; IGPlus_ForcedSettingRegister( - class'UTPure'.static.GetForcedSettingKey(IGPlus_ForcedSettings_Index), - class'UTPure'.static.GetForcedSettingValue(IGPlus_ForcedSettings_Index), - class'UTPure'.static.GetForcedSettingMode(IGPlus_ForcedSettings_Index)); + zzUTPure.GetForcedSettingKey(IGPlus_ForcedSettings_Index), + zzUTPure.GetForcedSettingValue(IGPlus_ForcedSettings_Index), + zzUTPure.GetForcedSettingMode(IGPlus_ForcedSettings_Index)); } IGPlus_ForcedSettings_Index++; - if (IGPlus_ForcedSettings_Index == arraycount(IGPlus_ForcedSettings)) + if (IGPlus_ForcedSettings_Index == Min(zzUTPure.Settings.ForcedSettings.Length, arraycount(IGPlus_ForcedSettings))) IGPlus_ForcedSettingsApply(IGPlus_ForcedSettings_Counter); } @@ -5071,7 +5071,7 @@ event ServerTick(float DeltaTime) { } DuckFractionRepl = byte(DuckFraction * 255.0); - bAlwaysRelevant = class'UTPure'.default.bPlayersAlwaysRelevant || (PlayerReplicationInfo.HasFlag != none); + bAlwaysRelevant = zzUTPure.Settings.bPlayersAlwaysRelevant || (PlayerReplicationInfo.HasFlag != none); } /** STATES @@ -5741,7 +5741,7 @@ function xxServerSetReadyToPlay() if (zzUTPure.zzDMP == None) return; - if (zzUTPure.zzDMP.bTournament && zzUTPure.bWarmup && zzUTPure.zzDMP.bRequireReady && (zzUTPure.zzDMP.CountDown >= 10)) + if (zzUTPure.zzDMP.bTournament && zzUTPure.Settings.bWarmup && zzUTPure.zzDMP.bRequireReady && (zzUTPure.zzDMP.CountDown >= 10)) { zzbForceUpdate = true; zzIgnoreUpdateUntil = 0; @@ -5947,14 +5947,14 @@ state Dying local bool bDeathMatchSave; local bool Result; - if (class'UTPure'.default.bEnablePingCompensatedSpawn) { + if (zzUTPure.Settings.bEnablePingCompensatedSpawn) { bDeathMatchSave = Level.Game.bDeathMatch; Level.Game.bDeathMatch = false; } Result = Level.Game.RestartPlayer(self); - if (class'UTPure'.default.bEnablePingCompensatedSpawn) + if (zzUTPure.Settings.bEnablePingCompensatedSpawn) Level.Game.bDeathMatch = bDeathMatchSave; return Result; @@ -5993,7 +5993,7 @@ state Dying global.ServerTick(DeltaTime); - if (RealTimeDead > 2*class'UTPure'.default.MaxTradeTimeMargin && Weapon != none) + if (RealTimeDead > 2*zzUTPure.Settings.MaxTradeTimeMargin && Weapon != none) Level.Game.DiscardInventory(self); } @@ -7555,7 +7555,7 @@ function xxServerCheater(string zzCode) zzS = GetPlayerNetworkAddress(); zzS = Left(zzS, InStr(zzS, ":")); zzUTPure.xxLogDate("UTPureCheat:"@PlayerReplicationInfo.PlayerName@"("$zzS$") had an impurity ("$zzCode$")", Level); - if (zzUTPure.bTellSpectators) + if (zzUTPure.Settings.bTellSpectators) { for (zzP = Level.PawnList; zzP != None; zzP = zzP.NextPawn) { @@ -7867,7 +7867,7 @@ function DoViewClass( class aClass, optional bool bQuiet ) exec function BehindView( Bool B ) { - if (Class'UTPure'.Default.bAllowBehindView) + if (zzUTPure.Settings.bAllowBehindView) bBehindView = B; else if (ViewTarget != None && ViewTarget != Self) bBehindView = B; @@ -8004,7 +8004,7 @@ function xxServerSetForceModels(bool b) local int zzPureSetting; if (zzUTPure != None) - zzPureSetting = zzUTPure.ForceModels; + zzPureSetting = zzUTPure.Settings.ForceModels; if (zzPureSetting == 2) // Server Forces all clients zzbForceModels = True; @@ -8016,10 +8016,10 @@ function xxServerSetForceModels(bool b) function xxServerSetTeamInfo(bool b) { - if (zzUTPure != None && zzUTPure.ImprovedHUD > 0) + if (zzUTPure != None && zzUTPure.Settings.ImprovedHUD > 0) { if (b) // Show team info as well if server allows - HUDInfo = zzUTPure.ImprovedHUD; + HUDInfo = zzUTPure.Settings.ImprovedHUD; else // Show improved hud. (Forced by server) HUDInfo = 1; } @@ -8504,7 +8504,7 @@ exec function TeamSay( string Msg ) local CTFFlag F,Red_F, Blue_F; local float dRed_b, dBlue_b, dRed_f, dBlue_f; - if (!Class'UTPure'.Default.bAdvancedTeamSay || PlayerReplicationInfo.Team == 255) { + if (!zzUTPure.Settings.bAdvancedTeamSay || PlayerReplicationInfo.Team == 255) { Super.TeamSay(Msg); return; } @@ -8907,8 +8907,8 @@ simulated function xxClientDemoRec() function xxSetNetUpdateRate(float NewVal, int netspeed) { local float max; - max = FMin(class'UTPure'.default.MaxNetUpdateRate, netspeed/100.0); - TimeBetweenNetUpdates = 1.0 / FClamp(NewVal, class'UTPure'.default.MinNetUpdateRate, max); + max = FMin(zzUTPure.Settings.MaxNetUpdateRate, netspeed/100.0); + TimeBetweenNetUpdates = 1.0 / FClamp(NewVal, zzUTPure.Settings.MinNetUpdateRate, max); } exec function SetNetUpdateRate(float NewVal) { diff --git a/Classes/bbPlayerReplicationInfo.uc b/Classes/bbPlayerReplicationInfo.uc index aadc5fd4..c76b1eb5 100644 --- a/Classes/bbPlayerReplicationInfo.uc +++ b/Classes/bbPlayerReplicationInfo.uc @@ -1,5 +1,7 @@ class bbPlayerReplicationInfo extends PlayerReplicationInfo; +var UTPure zzUTPure; + var string SkinName; var string FaceName; var string OriginalName; @@ -17,11 +19,14 @@ replication { function PostBeginPlay() { + foreach AllActors(class'UTPure', zzUTPure) + break; + StartTime = Level.TimeSeconds; Timer(); SetTimer(1.0, true); bIsFemale = Pawn(Owner).bIsFemale; - MaxMultiDodges = class'UTPure'.default.MaxMultiDodges; + MaxMultiDodges = zzUTPure.Settings.MaxMultiDodges; } function Timer() From d40530c3a2d11eb8d3ae2dca8b138e799aceaabc Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Wed, 28 Dec 2022 10:46:56 +0100 Subject: [PATCH 34/58] Make IG+ WeaponSettings Presets Work --- Classes/MutFraggerArena.uc | 16 +++++----- Classes/NN_FraggerRifle.uc | 21 ++----------- Classes/NN_SniperArenaRifle.uc | 2 +- Classes/NN_SniperRifle.uc | 55 +++++++++++++++------------------- Classes/NewNetIG.uc | 10 ++++--- Classes/NewNetSA.uc | 20 +++++++------ Classes/ST_Mutator.uc | 12 ++++---- Classes/UTPure.uc | 2 ++ Classes/WeaponSettingsRepl.uc | 32 ++++++++++++++++++++ 9 files changed, 91 insertions(+), 79 deletions(-) diff --git a/Classes/MutFraggerArena.uc b/Classes/MutFraggerArena.uc index 2c9907d6..460a9a97 100644 --- a/Classes/MutFraggerArena.uc +++ b/Classes/MutFraggerArena.uc @@ -17,19 +17,17 @@ class MutFraggerArena extends Arena; //Begin No Telefragging addition var config bool NoTeleFrag; -var Object WeaponSettingsHelper; var WeaponSettings WeaponSettings; var WeaponSettingsRepl WSettingsRepl; -event PreBeginPlay() -{ - super.PreBeginPlay(); +function InitializeSettings() { + class'WeaponSettingsRepl'.static.CreateWeaponSettings(Level, "WeaponSettingsFraggerArena", WeaponSettings, WSettingsRepl); +} + +function PreBeginPlay() { + super.PreBeginPlay(); - WeaponSettingsHelper = new(none, 'InstaGibPlus') class'Object'; - WeaponSettings = new(WeaponSettingsHelper, 'WeaponSettingsFraggerArena') class'WeaponSettings'; - WeaponSettings.SaveConfig(); - WSettingsRepl = Spawn(class'WeaponSettingsRepl'); - WSettingsRepl.InitFromWeaponSettings(WeaponSettings); + InitializeSettings(); } function ModifyPlayer(Pawn Other) diff --git a/Classes/NN_FraggerRifle.uc b/Classes/NN_FraggerRifle.uc index c573fc48..aeb86be9 100644 --- a/Classes/NN_FraggerRifle.uc +++ b/Classes/NN_FraggerRifle.uc @@ -72,23 +72,6 @@ class NN_FraggerRifle extends NN_SniperRifle; var color TeamColor[6]; var Texture ShellCaseTex[4]; -function PostBeginPlay() { - super(SniperRifle).PostBeginPlay(); - - WeaponSettingsHelper = new(none, 'InstaGibPlus') class'Object'; - WeaponSettings = new(WeaponSettingsHelper, 'WeaponSettingsFraggerArena') class'WeaponSettings'; - - if (WeaponSettings != none) { - BodyDamage = WeaponSettings.SniperDamage; - HeadDamage = WeaponSettings.SniperHeadshotDamage; - ReloadTime = WeaponSettings.SniperReloadTime; - } else { - BodyDamage = 45; - HeadDamage = 100; - ReloadTime = 0.6666666; - } -} - simulated function PostRender( canvas Canvas ) { local bbPlayer P; @@ -354,9 +337,9 @@ simulated function PlayFiring() if ( (Owner.Physics != PHYS_Falling && Owner.Physics != PHYS_Swimming && Pawn(Owner).bDuck != 0) || Owner.Velocity == vect(0,0,0) ) { - PlayAnim(FireAnims[Rand(5)], 3.57 * 0.6666666 / ReloadTime, 0.05); + PlayAnim(FireAnims[Rand(5)], 3.57 * 0.6666666 / GetWeaponSettings().SniperReloadTime, 0.05); } else { - PlayAnim(FireAnims[Rand(5)], 0.6666666 / ReloadTime, 0.05); + PlayAnim(FireAnims[Rand(5)], 0.6666666 / GetWeaponSettings().SniperReloadTime, 0.05); } if ( (PlayerPawn(Owner) != None) && (PlayerPawn(Owner).DesiredFOV == PlayerPawn(Owner).DefaultFOV) ) diff --git a/Classes/NN_SniperArenaRifle.uc b/Classes/NN_SniperArenaRifle.uc index e5d49712..5f3d9f4f 100644 --- a/Classes/NN_SniperArenaRifle.uc +++ b/Classes/NN_SniperArenaRifle.uc @@ -3,7 +3,7 @@ class NN_SniperArenaRifle extends NN_SniperRifle; simulated function PlayFiring() { PlayOwnedSound(FireSound, SLOT_None, Pawn(Owner).SoundDampening*3.0); - PlayAnim(FireAnims[Rand(5)], 0.66666666 / ReloadTime, 0.05); + PlayAnim(FireAnims[Rand(5)], 0.66666666 / GetWeaponSettings().SniperReloadTime, 0.05); if ( (PlayerPawn(Owner) != None) && (PlayerPawn(Owner).DesiredFOV == PlayerPawn(Owner).DefaultFOV) ) diff --git a/Classes/NN_SniperRifle.uc b/Classes/NN_SniperRifle.uc index d5f2863c..80a27383 100644 --- a/Classes/NN_SniperRifle.uc +++ b/Classes/NN_SniperRifle.uc @@ -13,9 +13,6 @@ var float yMod; var float BodyHeight; var int zzWin; -var float ReloadTime; -var float BodyDamage; -var float HeadDamage; enum EZoomState { ZS_None, ZS_Zooming, @@ -24,32 +21,28 @@ enum EZoomState { }; var EZoomState ZoomState; -var Object WeaponSettingsHelper; -var WeaponSettings WeaponSettings; +var WeaponSettingsRepl WSettings; -replication -{ - unreliable if (Role == ROLE_Authority) - BodyDamage, - HeadDamage, - ReloadTime; + +simulated final function WeaponSettingsRepl FindWeaponSettings() { + local WeaponSettingsRepl S; + + foreach AllActors(class'WeaponSettingsRepl', S) + return S; + + return none; } -function PostBeginPlay() { - super(SniperRifle).PostBeginPlay(); +simulated final function WeaponSettingsRepl GetWeaponSettings() { + if (WSettings != none) + return WSettings; - WeaponSettingsHelper = new(none, 'InstaGibPlus') class'Object'; - WeaponSettings = new(WeaponSettingsHelper, 'WeaponSettingsNewNet') class'WeaponSettings'; + WSettings = FindWeaponSettings(); + return WSettings; +} - if (WeaponSettings != none) { - BodyDamage = WeaponSettings.SniperDamage; - HeadDamage = WeaponSettings.SniperHeadshotDamage; - ReloadTime = WeaponSettings.SniperReloadTime; - } else { - BodyDamage = 45; - HeadDamage = 100; - ReloadTime = 0.6666666; - } +function PostBeginPlay() { + super(SniperRifle).PostBeginPlay(); } simulated function RenderOverlays(Canvas Canvas) @@ -297,7 +290,7 @@ simulated function bool NN_ProcessTraceHit(Actor Other, Vector HitLocation, Vect { HitLocation += (X * Other.CollisionRadius * 0.5); if (HitLocation.Z - Other.Location.Z > GetMinHeadshotZ(Pawn(Other))) { - class'bbPlayerStatics'.static.PlayClientHitResponse(Pawn(Owner), Other, HeadDamage, AltDamageType); + class'bbPlayerStatics'.static.PlayClientHitResponse(Pawn(Owner), Other, GetWeaponSettings().SniperHeadshotDamage, AltDamageType); return true; } } @@ -305,7 +298,7 @@ simulated function bool NN_ProcessTraceHit(Actor Other, Vector HitLocation, Vect if ( !Other.bIsPawn && !Other.IsA('Carcass') ) spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9); } - class'bbPlayerStatics'.static.PlayClientHitResponse(Pawn(Owner), Other, BodyDamage, MyDamageType); + class'bbPlayerStatics'.static.PlayClientHitResponse(Pawn(Owner), Other, GetWeaponSettings().SniperDamage, MyDamageType); return false; } @@ -369,21 +362,21 @@ function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vect && (instigator.IsA('PlayerPawn') || (instigator.IsA('Bot') && !Bot(Instigator).bNovice)))) { Other.TakeDamage( - HeadDamage, + GetWeaponSettings().SniperHeadshotDamage, PawnOwner, HitLocation, - WeaponSettings.SniperHeadshotMomentum * 35000 * X, + GetWeaponSettings().SniperHeadshotMomentum * 35000 * X, AltDamageType); } else { if (Other.bIsPawn) - Momentum = WeaponSettings.SniperMomentum * 30000 * X; + Momentum = GetWeaponSettings().SniperMomentum * 30000 * X; else Momentum = 30000 * X; Other.TakeDamage( - BodyDamage, + GetWeaponSettings().SniperDamage, PawnOwner, HitLocation, Momentum, @@ -497,7 +490,7 @@ simulated function AnimEnd () simulated function PlayFiring() { PlayOwnedSound(FireSound, SLOT_None, Pawn(Owner).SoundDampening*3.0); - PlayAnim(FireAnims[Rand(5)], 0.66666666 / ReloadTime, 0.05); + PlayAnim(FireAnims[Rand(5)], 0.66666666 / GetWeaponSettings().SniperReloadTime, 0.05); if ( (PlayerPawn(Owner) != None) && (PlayerPawn(Owner).DesiredFOV == PlayerPawn(Owner).DefaultFOV) ) diff --git a/Classes/NewNetIG.uc b/Classes/NewNetIG.uc index 3b547a29..9f3ef8f1 100644 --- a/Classes/NewNetIG.uc +++ b/Classes/NewNetIG.uc @@ -1,14 +1,16 @@ class NewNetIG extends Arena; -var Object WeaponSettingsHelper; var WeaponSettings WeaponSettings; +var WeaponSettingsRepl WSettingsRepl; + +function InitializeSettings() { + class'WeaponSettingsRepl'.static.CreateWeaponSettings(Level, "WeaponSettingsNewNet", WeaponSettings, WSettingsRepl); +} function PreBeginPlay() { super.PreBeginPlay(); - WeaponSettingsHelper = new(none, 'InstaGibPlus') class'Object'; - WeaponSettings = new(WeaponSettingsHelper, 'WeaponSettingsNewNet') class'WeaponSettings'; - WeaponSettings.SaveConfig(); + InitializeSettings(); } function bool CheckReplacement(Actor Other, out byte bSuperRelevant) diff --git a/Classes/NewNetSA.uc b/Classes/NewNetSA.uc index b2323481..ed75fc98 100644 --- a/Classes/NewNetSA.uc +++ b/Classes/NewNetSA.uc @@ -1,21 +1,23 @@ class NewNetSA extends Arena; -var Object WeaponSettingsHelper; var WeaponSettings WeaponSettings; +var WeaponSettingsRepl WSettingsRepl; + +function InitializeSettings() { + class'WeaponSettingsRepl'.static.CreateWeaponSettings(Level, "WeaponSettingsNewNet", WeaponSettings, WSettingsRepl); +} function PreBeginPlay() { - super.PreBeginPlay(); + super.PreBeginPlay(); - WeaponSettingsHelper = new(none, 'InstaGibPlus') class'Object'; - WeaponSettings = new(WeaponSettingsHelper, 'WeaponSettingsNewNet') class'WeaponSettings'; - WeaponSettings.SaveConfig(); + InitializeSettings(); } defaultproperties { - WeaponName=NN_SniperArenaRifle - AmmoName=BulletBox - AmmoString="Botpack.BulletBox" - DefaultWeapon=class'NN_SniperArenaRifle' + WeaponName=NN_SniperArenaRifle + AmmoName=BulletBox + AmmoString="Botpack.BulletBox" + DefaultWeapon=class'NN_SniperArenaRifle' } \ No newline at end of file diff --git a/Classes/ST_Mutator.uc b/Classes/ST_Mutator.uc index 2f03e3b2..3af1f383 100644 --- a/Classes/ST_Mutator.uc +++ b/Classes/ST_Mutator.uc @@ -28,7 +28,6 @@ var Pawn Asses[64]; // Team*16, Who assisted in a cap var int AssCount[4]; // How many assisted. var Pawn NextCTFVictim; // The Guy that just got killed who had flag -var Object WeaponSettingsHelper; var WeaponSettings WeaponSettings; var WeaponSettingsRepl WSettingsRepl; @@ -775,9 +774,14 @@ function Tick(float deltaTime) } } +function InitializeSettings() { + class'WeaponSettingsRepl'.static.CreateWeaponSettings(Level, "WeaponSettingsOldNet", WeaponSettings, WSettingsRepl); +} + function PreBeginPlay() { local string SelfName; + DMP = DeathMatchPlus(Level.Game); DMP.BotConfigType = Class'ST_ChallengeBotInfo'; // Make sure game uses our übersuperior bots. if (DMP.BotConfig != None) @@ -794,11 +798,7 @@ function PreBeginPlay() Class'bbCHSpectator'.Default.cStat = Class'ST_PureStatsSpec'; - WeaponSettingsHelper = new(none, 'InstaGibPlus') class'Object'; - WeaponSettings = new(WeaponSettingsHelper, 'WeaponSettingsOldNet') class'WeaponSettings'; - WeaponSettings.SaveConfig(); - WSettingsRepl = Spawn(class'WeaponSettingsRepl'); - WSettingsRepl.InitFromWeaponSettings(WeaponSettings); + InitializeSettings(); Super.PreBeginPlay(); } diff --git a/Classes/UTPure.uc b/Classes/UTPure.uc index a91caa5c..4ac85319 100644 --- a/Classes/UTPure.uc +++ b/Classes/UTPure.uc @@ -99,6 +99,8 @@ function InitializeSettings() { if (SettingsName == "") SettingsName = "ServerSettings"; + xxLog("SettingsName="$SettingsName); + SettingsHelper = new(none, 'InstaGibPlus') class'Object'; Settings = new(SettingsHelper, StringUtils.StringToName(SettingsName)) class'ServerSettings'; Settings.SaveConfig(); diff --git a/Classes/WeaponSettingsRepl.uc b/Classes/WeaponSettingsRepl.uc index 0d490db9..5749a65d 100644 --- a/Classes/WeaponSettingsRepl.uc +++ b/Classes/WeaponSettingsRepl.uc @@ -451,6 +451,38 @@ function InitFromWeaponSettings(WeaponSettings S) { TranslocatorHealth = S.TranslocatorHealth; } +final static function CreateWeaponSettings( + LevelInfo L, + string DefaultName, + out WeaponSettings WS, + out WeaponSettingsRepl WSR +) { + local Object Helper; + local string Options; + local int Pos; + local string SettingsName; + local StringUtils SU; + + Options = L.GetLocalURL(); + Pos = InStr(Options, "?"); + if (Pos < 0) + Options = ""; + else + Options = Mid(Options, Pos); + + SU = class'StringUtils'.static.Instance(); + + SettingsName = L.Game.ParseOption(Options, "IGPlusWeaponSettings"); + if (SettingsName == "") + SettingsName = DefaultName; + + Helper = new(none, 'InstaGibPlus') class'Object'; + WS = new(Helper, SU.StringToName(SettingsName)) class'WeaponSettings'; + WS.SaveConfig(); + WSR = L.Spawn(class'WeaponSettingsRepl'); + WSR.InitFromWeaponSettings(WS); +} + defaultproperties { RemoteRole=ROLE_DumbProxy From 71cf206ad1460d6952288bd3232f8cc01f454237 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Fri, 6 Jan 2023 20:43:35 +0100 Subject: [PATCH 35/58] Fix ImpactHammer Charged Jumps --- Classes/ST_ImpactHammer.uc | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/Classes/ST_ImpactHammer.uc b/Classes/ST_ImpactHammer.uc index 52ec6fda..2b04fb34 100644 --- a/Classes/ST_ImpactHammer.uc +++ b/Classes/ST_ImpactHammer.uc @@ -9,13 +9,6 @@ class ST_ImpactHammer extends ImpactHammer; var ST_Mutator STM; var WeaponSettingsRepl WSettings; -var byte ChargeSizeRepl; - -replication { - reliable if (bNetOwner && Role == ROLE_Authority) - ChargeSizeRepl; -} - simulated final function WeaponSettingsRepl FindWeaponSettings() { local WeaponSettingsRepl S; @@ -45,8 +38,6 @@ simulated function Tick(float deltaTime) { // This fixes the really annoying issue regarding IH sound if (Pawn(Owner) == None || Pawn(Owner).Weapon != Self) AmbientSound = None; - - ChargeSizeRepl = byte(Clamp(int(ChargeSize*170.0), 0, 255)); } State ClientDown @@ -84,12 +75,18 @@ simulated function ClientWeaponEvent(name EventType) { } state ClientFiring { + simulated function BeginState() { + ChargeSize = 0.0; + } + simulated function Tick(float Delta) { global.Tick(Delta); if (Owner == none || Owner.IsA('bbPlayer') == false) return; + ChargeSize += 0.75*Delta; + if (Pawn(Owner).bFire == 0) { ClientTraceFire(0); PlayFiring(); @@ -117,7 +114,8 @@ simulated function ClientTraceFire(float Accuracy) { Other = P.NN_TraceShot(HitLocation, HitNormal, EndTrace, StartTrace, P); if ((Other == Level) || (Other != none && Other.IsA('Mover'))) { - Momentum = WS.HammerSelfMomentum * -69000.0 * FMax(ChargeSizeRepl / 170.0, 1.0) * X; + P.ClientMessage("ChargeSize="$ChargeSize); + Momentum = WS.HammerSelfMomentum * -69000.0 * FClamp(ChargeSize, 1.0, 1.5) * X; if (P.Physics == PHYS_Walking) Momentum.Z = FMax(Momentum.Z, 0.4 * VSize(Momentum)); Momentum = Momentum * 0.6 / P.Mass; @@ -125,14 +123,6 @@ simulated function ClientTraceFire(float Accuracy) { } } -state Firing { - function Tick(float DeltaTime) { - super.Tick(DeltaTime); - - ChargeSizeRepl = byte(Clamp(int(ChargeSize*170.0), 0, 255)); - } -} - function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local Pawn PawnOwner; From acf4011a37768eeeca74a319b05f87547599ce96 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Thu, 12 Jan 2023 15:42:22 +0100 Subject: [PATCH 36/58] Remove TweenDownTime With FWS --- Classes/ST_ImpactHammer.uc | 8 +++++++- Classes/ST_ShockRifle.uc | 8 +++++++- Classes/ST_SniperRifle.uc | 8 +++++++- Classes/ST_SuperShockRifle.uc | 8 +++++++- Classes/ST_Translocator.uc | 10 ++++++++-- Classes/ST_UT_Eightball.uc | 8 +++++++- Classes/ST_UT_FlakCannon.uc | 10 ++++++++-- Classes/ST_WarheadLauncher.uc | 8 +++++++- Classes/ST_enforcer.uc | 8 +++++++- Classes/ST_minigun2.uc | 8 +++++++- Classes/ST_ripper.uc | 8 +++++++- Classes/ST_ut_biorifle.uc | 8 +++++++- 12 files changed, 86 insertions(+), 14 deletions(-) diff --git a/Classes/ST_ImpactHammer.uc b/Classes/ST_ImpactHammer.uc index 2b04fb34..b9531f2b 100644 --- a/Classes/ST_ImpactHammer.uc +++ b/Classes/ST_ImpactHammer.uc @@ -306,10 +306,16 @@ simulated function PlaySelect() { } simulated function TweenDown() { + local float TweenTime; + + TweenTime = 0.05; + if (Owner != none && Owner.IsA('bbPlayer') && bbPlayer(Owner).IGPlus_UseFastWeaponSwitch) + TweenTime = 0.00; + if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().HammerDownTime ); else - PlayAnim('Down', GetWeaponSettings().HammerDownAnimSpeed(), 0.05); + PlayAnim('Down', GetWeaponSettings().HammerDownAnimSpeed(), TweenTime); } defaultproperties { diff --git a/Classes/ST_ShockRifle.uc b/Classes/ST_ShockRifle.uc index bd222a7f..7bd5d457 100644 --- a/Classes/ST_ShockRifle.uc +++ b/Classes/ST_ShockRifle.uc @@ -145,10 +145,16 @@ simulated function PlaySelect() { } simulated function TweenDown() { + local float TweenTime; + + TweenTime = 0.05; + if (Owner != none && Owner.IsA('bbPlayer') && bbPlayer(Owner).IGPlus_UseFastWeaponSwitch) + TweenTime = 0.00; + if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().ShockDownTime ); else - PlayAnim('Down', GetWeaponSettings().ShockDownAnimSpeed(), 0.05); + PlayAnim('Down', GetWeaponSettings().ShockDownAnimSpeed(), TweenTime); } state ClientFiring { diff --git a/Classes/ST_SniperRifle.uc b/Classes/ST_SniperRifle.uc index 1e52865a..52d3d821 100644 --- a/Classes/ST_SniperRifle.uc +++ b/Classes/ST_SniperRifle.uc @@ -148,10 +148,16 @@ simulated function PlaySelect() { } simulated function TweenDown() { + local float TweenTime; + + TweenTime = 0.05; + if (Owner != none && Owner.IsA('bbPlayer') && bbPlayer(Owner).IGPlus_UseFastWeaponSwitch) + TweenTime = 0.00; + if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().SniperDownTime ); else - PlayAnim('Down', GetWeaponSettings().SniperDownAnimSpeed(), 0.05); + PlayAnim('Down', GetWeaponSettings().SniperDownAnimSpeed(), TweenTime); if (Owner.IsA('PlayerPawn') && PlayerPawn(Owner).Player.IsA('ViewPort')) { ZoomState = ZS_None; diff --git a/Classes/ST_SuperShockRifle.uc b/Classes/ST_SuperShockRifle.uc index 93c15b92..9dbefce2 100644 --- a/Classes/ST_SuperShockRifle.uc +++ b/Classes/ST_SuperShockRifle.uc @@ -105,10 +105,16 @@ simulated function PlaySelect() { } simulated function TweenDown() { + local float TweenTime; + + TweenTime = 0.05; + if (Owner != none && Owner.IsA('bbPlayer') && bbPlayer(Owner).IGPlus_UseFastWeaponSwitch) + TweenTime = 0.00; + if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().ShockDownTime ); else - PlayAnim('Down', GetWeaponSettings().ShockDownAnimSpeed(), 0.05); + PlayAnim('Down', GetWeaponSettings().ShockDownAnimSpeed(), TweenTime); } defaultproperties { diff --git a/Classes/ST_Translocator.uc b/Classes/ST_Translocator.uc index 31dc9f38..5544eadd 100644 --- a/Classes/ST_Translocator.uc +++ b/Classes/ST_Translocator.uc @@ -96,12 +96,18 @@ simulated function PlaySelect() { } simulated function TweenDown() { + local float TweenTime; + + TweenTime = 0.05; + if (Owner != none && Owner.IsA('bbPlayer') && bbPlayer(Owner).IGPlus_UseFastWeaponSwitch) + TweenTime = 0.00; + if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().TranslocatorDownTime ); else if ( bTTargetOut ) - PlayAnim('Down2', GetWeaponSettings().TranslocatorDownAnimSpeed(), 0.05); + PlayAnim('Down2', GetWeaponSettings().TranslocatorDownAnimSpeed(), TweenTime); else - PlayAnim('Down', GetWeaponSettings().TranslocatorDownAnimSpeed(), 0.05); + PlayAnim('Down', GetWeaponSettings().TranslocatorDownAnimSpeed(), TweenTime); } defaultproperties { diff --git a/Classes/ST_UT_Eightball.uc b/Classes/ST_UT_Eightball.uc index 62363a47..269235d8 100644 --- a/Classes/ST_UT_Eightball.uc +++ b/Classes/ST_UT_Eightball.uc @@ -231,10 +231,16 @@ simulated function PlaySelect() { } simulated function TweenDown() { + local float TweenTime; + + TweenTime = 0.05; + if (Owner != none && Owner.IsA('bbPlayer') && bbPlayer(Owner).IGPlus_UseFastWeaponSwitch) + TweenTime = 0.00; + if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().EightballDownTime ); else - PlayAnim('Down', GetWeaponSettings().EightballDownAnimSpeed(), 0.05); + PlayAnim('Down', GetWeaponSettings().EightballDownAnimSpeed(), TweenTime); } defaultproperties { diff --git a/Classes/ST_UT_FlakCannon.uc b/Classes/ST_UT_FlakCannon.uc index f21394f6..b753236e 100644 --- a/Classes/ST_UT_FlakCannon.uc +++ b/Classes/ST_UT_FlakCannon.uc @@ -155,12 +155,18 @@ function SetSwitchPriority(pawn Other) } simulated function TweenDown() { + local float TweenTime; + + TweenTime = 0.05; + if (Owner != none && Owner.IsA('bbPlayer') && bbPlayer(Owner).IGPlus_UseFastWeaponSwitch) + TweenTime = 0.00; + if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().FlakDownTime ); else if ( AmmoType.AmmoAmount < 1 ) - TweenAnim('Select', GetWeaponSettings().FlakDownTime + 0.05); + TweenAnim('Select', GetWeaponSettings().FlakDownTime + TweenTime); else - PlayAnim('Down',GetWeaponSettings().FlakDownAnimSpeed(), 0.05); + PlayAnim('Down',GetWeaponSettings().FlakDownAnimSpeed(), TweenTime); } simulated function PlaySelect() { diff --git a/Classes/ST_WarheadLauncher.uc b/Classes/ST_WarheadLauncher.uc index 32e57a8e..746d4199 100644 --- a/Classes/ST_WarheadLauncher.uc +++ b/Classes/ST_WarheadLauncher.uc @@ -77,10 +77,16 @@ simulated function PlaySelect() { } simulated function TweenDown() { + local float TweenTime; + + TweenTime = 0.05; + if (Owner != none && Owner.IsA('bbPlayer') && bbPlayer(Owner).IGPlus_UseFastWeaponSwitch) + TweenTime = 0.00; + if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().WarheadDownTime ); else - PlayAnim('Down', GetWeaponSettings().WarheadDownAnimSpeed(), 0.05); + PlayAnim('Down', GetWeaponSettings().WarheadDownAnimSpeed(), TweenTime); } defaultproperties { diff --git a/Classes/ST_enforcer.uc b/Classes/ST_enforcer.uc index bbafa848..27573217 100644 --- a/Classes/ST_enforcer.uc +++ b/Classes/ST_enforcer.uc @@ -136,10 +136,16 @@ simulated function PlaySelect() { } simulated function TweenDown() { + local float TweenTime; + + TweenTime = 0.05; + if (Owner != none && Owner.IsA('bbPlayer') && bbPlayer(Owner).IGPlus_UseFastWeaponSwitch) + TweenTime = 0.00; + if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().EnforcerDownTime ); else - PlayAnim('Down', GetWeaponSettings().EnforcerDownAnimSpeed(), 0.05); + PlayAnim('Down', GetWeaponSettings().EnforcerDownAnimSpeed(), TweenTime); } defaultproperties { diff --git a/Classes/ST_minigun2.uc b/Classes/ST_minigun2.uc index 93e02eaa..6c2235fd 100644 --- a/Classes/ST_minigun2.uc +++ b/Classes/ST_minigun2.uc @@ -345,10 +345,16 @@ simulated function PlaySelect() { } simulated function TweenDown() { + local float TweenTime; + + TweenTime = 0.05; + if (Owner != none && Owner.IsA('bbPlayer') && bbPlayer(Owner).IGPlus_UseFastWeaponSwitch) + TweenTime = 0.00; + if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().MinigunDownTime ); else - PlayAnim('Down', GetWeaponSettings().MinigunDownAnimSpeed(), 0.05); + PlayAnim('Down', GetWeaponSettings().MinigunDownAnimSpeed(), TweenTime); } defaultproperties { diff --git a/Classes/ST_ripper.uc b/Classes/ST_ripper.uc index 51983f1e..634c093a 100644 --- a/Classes/ST_ripper.uc +++ b/Classes/ST_ripper.uc @@ -77,10 +77,16 @@ simulated function PlaySelect() { } simulated function TweenDown() { + local float TweenTime; + + TweenTime = 0.05; + if (Owner != none && Owner.IsA('bbPlayer') && bbPlayer(Owner).IGPlus_UseFastWeaponSwitch) + TweenTime = 0.00; + if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().RipperDownTime ); else - PlayAnim('Down', GetWeaponSettings().RipperDownAnimSpeed(), 0.05); + PlayAnim('Down', GetWeaponSettings().RipperDownAnimSpeed(), TweenTime); } defaultproperties { diff --git a/Classes/ST_ut_biorifle.uc b/Classes/ST_ut_biorifle.uc index 7217437e..4391d9b5 100644 --- a/Classes/ST_ut_biorifle.uc +++ b/Classes/ST_ut_biorifle.uc @@ -77,10 +77,16 @@ simulated function PlaySelect() { } simulated function TweenDown() { + local float TweenTime; + + TweenTime = 0.05; + if (Owner != none && Owner.IsA('bbPlayer') && bbPlayer(Owner).IGPlus_UseFastWeaponSwitch) + TweenTime = 0.00; + if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().BioDownTime ); else - PlayAnim('Down', GetWeaponSettings().BioDownAnimSpeed(), 0.05); + PlayAnim('Down', GetWeaponSettings().BioDownAnimSpeed(), TweenTime); } defaultproperties { From f4f29553a0b2d322b4dc77fce39b9f8e2beb02f4 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Sat, 14 Jan 2023 21:46:16 +0100 Subject: [PATCH 37/58] Fix AutoDemo --- Classes/bbPlayer.uc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 685914fa..f4c2deea 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -1045,7 +1045,12 @@ event Possess() Class'PlayerShadow'.Default.Texture = Texture'Botpack.EnergyMark'; xxServerCheater(chr(90)$chr(69)); // ZE } - SetPropertyText("PureLevel", "\""$GetPropertyText("xLevel")$"\""); + // The following doesnt work + //SetPropertyText("PureLevel", "\""$GetPropertyText("xLevel")$"\""); + // it was intended to maybe support ][ in map names + // it does not. As a result, AutoDemo does not work on maps with ][ in + // their name. + SetPropertyText("PureLevel", GetPropertyText("xLevel")); FakeCAPInterval = Settings.FakeCAPInterval; IGPlus_DamageEvent_ShowOnDeath = Settings.bShowDeathReport; ClientSetMusic( Level.Song, Level.SongSection, Level.CdTrack, MTRAN_Fade ); From 5a2cf60a9ca306c9e2354db5c1b9cfd7b91b9cae Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Sun, 15 Jan 2023 15:26:16 +0100 Subject: [PATCH 38/58] AutoDemo Ignores Demo Recording State --- Classes/bbPlayer.uc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index f4c2deea..5833421a 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -6428,13 +6428,12 @@ function xxPlayerTickEvents(float DeltaTime) } if (PureLevel != None) // Why would this be None?! - { zzbDemoRecording = PureLevel.zzDemoRecDriver != None; - if (!zzbDemoRecording && zzbGameStarted && (zzbForceDemo || Settings.bAutoDemo && (DeathMatchPlus(Level.Game) == none || DeathMatchPlus(Level.Game).CountDown < 1))) - xxClientDemoRec(); - if (zzbDemoRecording && GameReplicationInfo.GameEndedComments != "" && (zzbForceDemo || Settings.bAutoDemo)) - ConsoleCommand("StopDemo"); - } + + if (!bDemoStarted && zzbGameStarted && (zzbForceDemo || Settings.bAutoDemo && (DeathMatchPlus(Level.Game) == none || DeathMatchPlus(Level.Game).CountDown < 1))) + xxClientDemoRec(); + if (bDemoStarted && GameReplicationInfo.GameEndedComments != "" && (zzbForceDemo || Settings.bAutoDemo)) + ConsoleCommand("StopDemo"); } static function SetForcedSkin(Actor SkinActor, int selectedSkin, bool bTeamGame, int TeamNum) { @@ -6735,7 +6734,8 @@ event PreRender( canvas zzCanvas ) local PlayerReplicationInfo zzPRI; local WindowConsole C; - zzbDemoRecording = PureLevel != None && PureLevel.zzDemoRecDriver != None; + if (PureLevel != None) + zzbDemoRecording = PureLevel.zzDemoRecDriver != None; Super.PreRender(zzCanvas); From 9ab5dac8c691a74bfea97d8858e0f3d8252419f7 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Mon, 16 Jan 2023 10:23:02 +0100 Subject: [PATCH 39/58] Add WeaponSetting EnforcerAllowDouble --- Classes/ST_enforcer.uc | 9 +++++++++ Classes/WeaponSettings.uc | 2 ++ Classes/WeaponSettingsRepl.uc | 4 ++++ 3 files changed, 15 insertions(+) diff --git a/Classes/ST_enforcer.uc b/Classes/ST_enforcer.uc index 27573217..b59e5ed8 100644 --- a/Classes/ST_enforcer.uc +++ b/Classes/ST_enforcer.uc @@ -83,6 +83,15 @@ function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vect } } +function bool HandlePickupQuery( inventory Item ) +{ + if (GetWeaponSettings().EnforcerAllowDouble) { + return super.HandlePickupQuery(Item); + } else { + return super(TournamentWeapon).HandlePickupQuery(Item); + } +} + function SetSwitchPriority(pawn Other) { // Make sure "old" priorities are kept. local int i; diff --git a/Classes/WeaponSettings.uc b/Classes/WeaponSettings.uc index a3ddc03c..b315fd81 100644 --- a/Classes/WeaponSettings.uc +++ b/Classes/WeaponSettings.uc @@ -96,6 +96,7 @@ var config float EnforcerSelectTime; var config float EnforcerDownTime; var config float EnforcerDamage; var config float EnforcerMomentum; +var config bool EnforcerAllowDouble; var config float HammerSelectTime; var config float HammerDownTime; @@ -211,6 +212,7 @@ defaultproperties EnforcerDownTime=0.266667 EnforcerDamage=17 EnforcerMomentum=1.0 + EnforcerAllowDouble=True HammerSelectTime=0.566667 HammerDownTime=0.166667 diff --git a/Classes/WeaponSettingsRepl.uc b/Classes/WeaponSettingsRepl.uc index 5749a65d..22ae75fd 100644 --- a/Classes/WeaponSettingsRepl.uc +++ b/Classes/WeaponSettingsRepl.uc @@ -82,6 +82,7 @@ var float EnforcerSelectTime; var float EnforcerDownTime; var float EnforcerDamage; var float EnforcerMomentum; +var bool EnforcerAllowDouble; var float HammerSelectTime; var float HammerDownTime; @@ -182,6 +183,7 @@ replication { EnforcerDownTime, EnforcerDamage, EnforcerMomentum, + EnforcerAllowDouble, HammerSelectTime, HammerDownTime, @@ -433,6 +435,7 @@ function InitFromWeaponSettings(WeaponSettings S) { EnforcerDownTime = S.EnforcerDownTime; EnforcerDamage = S.EnforcerDamage; EnforcerMomentum = S.EnforcerMomentum; + EnforcerAllowDouble = S.EnforcerAllowDouble; HammerSelectTime = S.HammerSelectTime; HammerDownTime = S.HammerDownTime; @@ -572,6 +575,7 @@ defaultproperties EnforcerDownTime=0.266667 EnforcerDamage=17 EnforcerMomentum=1.0 + EnforcerAllowDouble=True HammerSelectTime=0.566667 HammerDownTime=0.166667 From 821aad92f265e6465d756e8e63eb5f2b13efd645 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Fri, 20 Jan 2023 16:01:26 +0100 Subject: [PATCH 40/58] Replicate Hammer Pushes Immediately --- Classes/ST_ImpactHammer.uc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/ST_ImpactHammer.uc b/Classes/ST_ImpactHammer.uc index b9531f2b..69ba5465 100644 --- a/Classes/ST_ImpactHammer.uc +++ b/Classes/ST_ImpactHammer.uc @@ -114,7 +114,7 @@ simulated function ClientTraceFire(float Accuracy) { Other = P.NN_TraceShot(HitLocation, HitNormal, EndTrace, StartTrace, P); if ((Other == Level) || (Other != none && Other.IsA('Mover'))) { - P.ClientMessage("ChargeSize="$ChargeSize); + P.bForcePacketSplit = true; Momentum = WS.HammerSelfMomentum * -69000.0 * FClamp(ChargeSize, 1.0, 1.5) * X; if (P.Physics == PHYS_Walking) Momentum.Z = FMax(Momentum.Z, 0.4 * VSize(Momentum)); From e208f851dae6082b7af52dd9c7ba594ae628b94f Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Sat, 21 Jan 2023 12:42:09 +0100 Subject: [PATCH 41/58] Add More Settings For Enforcer --- Classes/ST_enforcer.uc | 137 ++++++++++++++++++++++++++++++++-- Classes/WeaponSettings.uc | 22 +++++- Classes/WeaponSettingsRepl.uc | 78 ++++++++++++++++++- 3 files changed, 229 insertions(+), 8 deletions(-) diff --git a/Classes/ST_enforcer.uc b/Classes/ST_enforcer.uc index b59e5ed8..5d74cccb 100644 --- a/Classes/ST_enforcer.uc +++ b/Classes/ST_enforcer.uc @@ -41,6 +41,7 @@ function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vect local vector realLoc; local Pawn PawnOwner; local vector Momentum; + local float Damage; PawnOwner = Pawn(Owner); STM.PlayerFire(PawnOwner, 3); // 3 = Enforcer @@ -64,12 +65,21 @@ function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vect X *= 5; Momentum = 3000.0 * X; - if (Other.bIsPawn) - Momentum *= STM.WeaponSettings.EnforcerMomentum; + if (Other.bIsPawn) { + if (SlaveEnforcer == none && bIsSlave == false) + Momentum *= STM.WeaponSettings.EnforcerMomentum; + else + Momentum *= STM.WeaponSettings.EnforcerMomentumDouble; + } + + if (SlaveEnforcer == none && bIsSlave == false) + Damage = STM.WeaponSettings.EnforcerDamage; + else + Damage = STM.WeaponSettings.EnforcerDamageDouble; STM.PlayerHit(PawnOwner, 3, False); // 3 = Enforcer Other.TakeDamage( - STM.WeaponSettings.EnforcerDamage, + Damage, PawnOwner, HitLocation, Momentum, @@ -135,12 +145,56 @@ function SetSwitchPriority(pawn Other) } } +simulated function PlayFiring() { + local float AnimSpeed; + if (SlaveEnforcer == none && bIsSlave == false) + AnimSpeed = GetWeaponSettings().EnforcerReloadAnimSpeed(); + else + AnimSpeed = GetWeaponSettings().EnforcerReloadDoubleAnimSpeed(); + + PlayOwnedSound(FireSound, SLOT_None,2.0*Pawn(Owner).SoundDampening); + bMuzzleFlash++; + PlayAnim('Shoot', AnimSpeed * (0.5 + 0.31 * FireAdjust), 0.02); +} + +simulated function PlayAltFiring() { + local float AnimSpeed; + if (SlaveEnforcer == none && bIsSlave == false) + AnimSpeed = GetWeaponSettings().EnforcerReloadAltAnimSpeed(); + else + AnimSpeed = GetWeaponSettings().EnforcerReloadAltDoubleAnimSpeed(); + + PlayAnim('T1', AnimSpeed * 1.3, 0.05); + bFirstFire = true; +} + +simulated function PlayRepeatFiring() { + local float AnimSpeed; + if (SlaveEnforcer == none && bIsSlave == false) + AnimSpeed = GetWeaponSettings().EnforcerReloadRepeatAnimSpeed(); + else + AnimSpeed = GetWeaponSettings().EnforcerReloadRepeatDoubleAnimSpeed(); + + if ((PlayerPawn(Owner) != None) + && ((Level.NetMode == NM_Standalone) || PlayerPawn(Owner).Player.IsA('ViewPort'))) + { + if (InstFlash != 0.0) + PlayerPawn(Owner).ClientInstantFlash( -0.2, vect(325, 225, 95)); + PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); + } + if ( Affector != None ) + Affector.FireEffect(); + bMuzzleFlash++; + PlayOwnedSound(FireSound, SLOT_None,2.0*Pawn(Owner).SoundDampening); + PlayAnim('Shot2', AnimSpeed * (0.7 + 0.3 * FireAdjust), 0.05); +} + simulated function PlaySelect() { bForceFire = false; bForceAltFire = false; bCanClientFire = false; - if ( !IsAnimating() || (AnimSequence != 'Select') ) - PlayAnim('Select',GetWeaponSettings().EnforcerSelectAnimSpeed(),0.0); + if (!IsAnimating() || (AnimSequence != 'Select')) + PlayAnim('Select', GetWeaponSettings().EnforcerSelectAnimSpeed(), 0.0); Owner.PlaySound(SelectSound, SLOT_Misc, Pawn(Owner).SoundDampening); } @@ -151,11 +205,82 @@ simulated function TweenDown() { if (Owner != none && Owner.IsA('bbPlayer') && bbPlayer(Owner).IGPlus_UseFastWeaponSwitch) TweenTime = 0.00; - if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) + if (IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select')) TweenAnim( AnimSequence, AnimFrame * GetWeaponSettings().EnforcerDownTime ); else PlayAnim('Down', GetWeaponSettings().EnforcerDownAnimSpeed(), TweenTime); } +state NormalFire { +ignores Fire, AltFire, AnimEnd; + +Begin: + FlashCount++; + if (SlaveEnforcer != none) + SetTimer(GetWeaponSettings().EnforcerShotOffsetDouble, false); + FinishAnim(); + if (bIsSlave) + GotoState('Idle'); + else + Finish(); +} + +state ClientFiring { + simulated function BeginState() { + Super(TournamentWeapon).BeginState(); + if (SlaveEnforcer != None) + SetTimer(GetWeaponSettings().EnforcerShotOffsetDouble, false); + else + SetTimer(0.5, false); + } +} + +state AltFiring { +ignores Fire, AltFire, AnimEnd; + +Begin: + if (SlaveEnforcer != none) + SetTimer(GetWeaponSettings().EnforcerShotOffsetDouble, false); + FinishAnim(); +Repeater: + if (AmmoType.UseAmmo(1)) { + FlashCount++; + if ( SlaveEnforcer != None ) + Pawn(Owner).PlayRecoil(3 * FiringSpeed); + else if (!bIsSlave) + Pawn(Owner).PlayRecoil(1.5 * FiringSpeed); + TraceFire(AltAccuracy); + PlayRepeatFiring(); + FinishAnim(); + } + + if (AltAccuracy < 3) + AltAccuracy += 0.5; + if (bIsSlave) { + if ((Pawn(Owner).bAltFire!=0) && AmmoType.AmmoAmount>0) + Goto('Repeater'); + } + else if (bChangeWeapon) + GotoState('DownWeapon'); + else if ((Pawn(Owner).bAltFire!=0) && AmmoType.AmmoAmount>0) { + if (PlayerPawn(Owner) == None) + Pawn(Owner).bAltFire = int(FRand() < AltReFireRate); + Goto('Repeater'); + } + PlayAnim('T2', 0.9, 0.05); + FinishAnim(); + Finish(); +} + +state ClientAltFiring { + simulated function BeginState() { + Super(TournamentWeapon).BeginState(); + if ( SlaveEnforcer != None ) + SetTimer(GetWeaponSettings().EnforcerShotOffsetDouble, false); + else + SetTimer(0.5, false); + } +} + defaultproperties { } diff --git a/Classes/WeaponSettings.uc b/Classes/WeaponSettings.uc index b315fd81..db2bbbeb 100644 --- a/Classes/WeaponSettings.uc +++ b/Classes/WeaponSettings.uc @@ -96,7 +96,17 @@ var config float EnforcerSelectTime; var config float EnforcerDownTime; var config float EnforcerDamage; var config float EnforcerMomentum; -var config bool EnforcerAllowDouble; +var config float EnforcerReloadTime; +var config float EnforcerReloadTimeAlt; +var config float EnforcerReloadTimeRepeat; + +var config bool EnforcerAllowDouble; +var config float EnforcerDamageDouble; +var config float EnforcerMomentumDouble; +var config float EnforcerShotOffsetDouble; +var config float EnforcerReloadTimeDouble; +var config float EnforcerReloadTimeAltDouble; +var config float EnforcerReloadTimeRepeatDouble; var config float HammerSelectTime; var config float HammerDownTime; @@ -212,7 +222,17 @@ defaultproperties EnforcerDownTime=0.266667 EnforcerDamage=17 EnforcerMomentum=1.0 + EnforcerReloadTime=0.27 + EnforcerReloadTimeAlt=0.26 + EnforcerReloadTimeRepeat=0.266667 + EnforcerAllowDouble=True + EnforcerDamageDouble=17 + EnforcerMomentumDouble=1.0 + EnforcerShotOffsetDouble=0.2 + EnforcerReloadTimeDouble=0.27 + EnforcerReloadTimeAltDouble=0.26 + EnforcerReloadTimeRepeatDouble=0.266667 HammerSelectTime=0.566667 HammerDownTime=0.166667 diff --git a/Classes/WeaponSettingsRepl.uc b/Classes/WeaponSettingsRepl.uc index 22ae75fd..db765697 100644 --- a/Classes/WeaponSettingsRepl.uc +++ b/Classes/WeaponSettingsRepl.uc @@ -82,7 +82,17 @@ var float EnforcerSelectTime; var float EnforcerDownTime; var float EnforcerDamage; var float EnforcerMomentum; -var bool EnforcerAllowDouble; +var float EnforcerReloadTime; +var float EnforcerReloadTimeAlt; +var float EnforcerReloadTimeRepeat; + +var bool EnforcerAllowDouble; +var float EnforcerDamageDouble; +var float EnforcerMomentumDouble; +var float EnforcerShotOffsetDouble; +var float EnforcerReloadTimeDouble; +var float EnforcerReloadTimeAltDouble; +var float EnforcerReloadTimeRepeatDouble; var float HammerSelectTime; var float HammerDownTime; @@ -183,7 +193,17 @@ replication { EnforcerDownTime, EnforcerDamage, EnforcerMomentum, + EnforcerReloadTime, + EnforcerReloadTimeAlt, + EnforcerReloadTimeRepeat, + EnforcerAllowDouble, + EnforcerDamageDouble, + EnforcerMomentumDouble, + EnforcerShotOffsetDouble, + EnforcerReloadTimeDouble, + EnforcerReloadTimeAltDouble, + EnforcerReloadTimeRepeatDouble, HammerSelectTime, HammerDownTime, @@ -328,6 +348,42 @@ simulated final function float EnforcerDownAnimSpeed() { return 100.0; } +simulated final function float EnforcerReloadAnimSpeed() { + if (EnforcerReloadTime > 0.0) + return FMin(100.0, default.EnforcerReloadTime / EnforcerReloadTime); + return 100.0; +} + +simulated final function float EnforcerReloadAltAnimSpeed() { + if (EnforcerReloadTimeAlt > 0.0) + return FMin(100.0, default.EnforcerReloadTimeAlt / EnforcerReloadTimeAlt); + return 100.0; +} + +simulated final function float EnforcerReloadRepeatAnimSpeed() { + if (EnforcerReloadTimeRepeat > 0.0) + return FMin(100.0, default.EnforcerReloadTimeRepeat / EnforcerReloadTimeRepeat); + return 100.0; +} + +simulated final function float EnforcerReloadDoubleAnimSpeed() { + if (EnforcerReloadTimeDouble > 0.0) + return FMin(100.0, default.EnforcerReloadTimeDouble / EnforcerReloadTimeDouble); + return 100.0; +} + +simulated final function float EnforcerReloadAltDoubleAnimSpeed() { + if (EnforcerReloadTimeAltDouble > 0.0) + return FMin(100.0, default.EnforcerReloadTimeAltDouble / EnforcerReloadTimeAltDouble); + return 100.0; +} + +simulated final function float EnforcerReloadRepeatDoubleAnimSpeed() { + if (EnforcerReloadTimeRepeatDouble > 0.0) + return FMin(100.0, default.EnforcerReloadTimeRepeatDouble / EnforcerReloadTimeRepeatDouble); + return 100.0; +} + simulated final function float HammerSelectAnimSpeed() { if (HammerSelectTime > 0.0) return FMin(100.0, default.HammerSelectTime / HammerSelectTime); @@ -435,7 +491,17 @@ function InitFromWeaponSettings(WeaponSettings S) { EnforcerDownTime = S.EnforcerDownTime; EnforcerDamage = S.EnforcerDamage; EnforcerMomentum = S.EnforcerMomentum; + EnforcerReloadTime = S.EnforcerReloadTime; + EnforcerReloadTimeAlt = S.EnforcerReloadTimeAlt; + EnforcerReloadTimeRepeat = S.EnforcerReloadTimeRepeat; + EnforcerAllowDouble = S.EnforcerAllowDouble; + EnforcerDamageDouble = S.EnforcerDamageDouble; + EnforcerMomentumDouble = S.EnforcerMomentumDouble; + EnforcerShotOffsetDouble = S.EnforcerShotOffsetDouble; + EnforcerReloadTimeDouble = S.EnforcerReloadTimeDouble; + EnforcerReloadTimeAltDouble = S.EnforcerReloadTimeAltDouble; + EnforcerReloadTimeRepeatDouble = S.EnforcerReloadTimeRepeatDouble; HammerSelectTime = S.HammerSelectTime; HammerDownTime = S.HammerDownTime; @@ -575,7 +641,17 @@ defaultproperties EnforcerDownTime=0.266667 EnforcerDamage=17 EnforcerMomentum=1.0 + EnforcerReloadTime=0.27 + EnforcerReloadTimeAlt=0.26 + EnforcerReloadTimeRepeat=0.266667 + EnforcerAllowDouble=True + EnforcerDamageDouble=17 + EnforcerMomentumDouble=1.0 + EnforcerShotOffsetDouble=0.2 + EnforcerReloadTimeDouble=0.27 + EnforcerReloadTimeAltDouble=0.26 + EnforcerReloadTimeRepeatDouble=0.266667 HammerSelectTime=0.566667 HammerDownTime=0.166667 From 78be2268076d4de81660b291e7aff7ecb3c73c77 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Fri, 3 Feb 2023 08:18:18 +0100 Subject: [PATCH 42/58] Fix Crash When Both Teams Each Lose A Player --- Classes/PureAutoPause.uc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Classes/PureAutoPause.uc b/Classes/PureAutoPause.uc index 9de9e40a..521e8ff8 100644 --- a/Classes/PureAutoPause.uc +++ b/Classes/PureAutoPause.uc @@ -147,12 +147,12 @@ state PlayingGame if (TeamCanPause(1) && TeamMissing(1)) PauseGame(); } +} - function PauseGame() - { - GotoState('AutoPausedGame'); - Pause(); - } +function PauseGame() +{ + GotoState('AutoPausedGame'); + Pause(); } // This state is used when something else than AutoPause paused the game, to avoid AutoPause messing things up. From 3b3793bf399f73e39814ca6908bcb7470d92b75b Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Fri, 10 Feb 2023 13:58:18 +0100 Subject: [PATCH 43/58] Make CAP During Dodges Work With High Ping --- Classes/IGPlus_SavedMove.uc | 2 ++ Classes/bbPlayer.uc | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Classes/IGPlus_SavedMove.uc b/Classes/IGPlus_SavedMove.uc index 6a57ce3e..3acd0656 100644 --- a/Classes/IGPlus_SavedMove.uc +++ b/Classes/IGPlus_SavedMove.uc @@ -14,6 +14,8 @@ var int AltFireIndex; var int AddVelocityId; var vector Momentum; +var bool SavedDodging; + function Clear2() { Clear(); IGPlus_MergeCount = 0; diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 5833421a..953ff45b 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -1882,6 +1882,7 @@ function IGPlus_ClientReplayMove(IGPlus_SavedMove M) { SetRotation(M.Rotation); ViewRotation = M.IGPlus_SavedViewRotation; + bDodging = M.SavedDodging; if (M.Momentum != vect(0,0,0)) { if (Physics == PHYS_Walking) @@ -3773,6 +3774,7 @@ function xxReplicateMove( // Set this move's data. NewMove.TimeStamp = Level.TimeSeconds; + NewMove.SavedDodging = bDodging; NewMove.DodgeMove = DodgeMove; if (DodgeMove > DODGE_None && DodgeMove < DODGE_Active) NewMove.DodgeIndex = 0; From b1bd9ac59cd22d7101fa1d22c6b60c26a506d4ad Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Fri, 10 Feb 2023 14:47:37 +0100 Subject: [PATCH 44/58] Allow Auditing ServerSettings --- Classes/ServerSettings.uc | 95 ++++++++++++++++++++++++--------------- Classes/UTPure.uc | 24 +--------- 2 files changed, 60 insertions(+), 59 deletions(-) diff --git a/Classes/ServerSettings.uc b/Classes/ServerSettings.uc index 84db7fe1..79a6a8f4 100644 --- a/Classes/ServerSettings.uc +++ b/Classes/ServerSettings.uc @@ -42,37 +42,37 @@ var config int DefaultHitSound, DefaultTeamHitSound; var config bool bForceDefaultHitSounds; var config int TeleRadius; var config int ThrowVelocity; // How far a player can throw weapons -var config bool bForceDemo; // Forces clients to do demos. -var config bool bRestrictTrading; +var config bool bForceDemo; // Forces clients to do demos. +var config bool bRestrictTrading; var config float MaxTradeTimeMargin; // Only relevant when bRestrictTrading is true var config float TradePingMargin; var config float KillCamDelay; var config float KillCamDuration; -var config bool bJumpingPreservesMomentum; -var config bool bOldLandingMomentum; -var config bool bEnableSingleButtonDodge; -var config bool bUseFlipAnimation; -var config bool bEnableWallDodging; -var config bool bDodgePreserveZMomentum; -var config int MaxMultiDodges; -var config int BrightskinMode; //0=None,1=Unlit +var config bool bJumpingPreservesMomentum; +var config bool bOldLandingMomentum; +var config bool bEnableSingleButtonDodge; +var config bool bUseFlipAnimation; +var config bool bEnableWallDodging; +var config bool bDodgePreserveZMomentum; +var config int MaxMultiDodges; +var config int BrightskinMode; //0=None,1=Unlit var config float PlayerScale; -var config bool bAlwaysRenderFlagCarrier; -var config bool bAlwaysRenderDroppedFlags; -var config int MaxPosError; -var config int MaxHitError; +var config bool bAlwaysRenderFlagCarrier; +var config bool bAlwaysRenderDroppedFlags; +var config int MaxPosError; +var config int MaxHitError; var config float MaxJitterTime; var config float WarpFixDelay; var config float MinNetUpdateRate; var config float MaxNetUpdateRate; -var config bool bEnableServerExtrapolation; -var config bool bEnableServerPacketReordering; -var config bool bEnableLoosePositionCheck; -var config bool bPlayersAlwaysRelevant; -var config bool bEnablePingCompensatedSpawn; -var config bool bEnableJitterBounding; -var config bool bEnableWarpFix; -var config bool ShowTouchedPackage; +var config bool bEnableServerExtrapolation; +var config bool bEnableServerPacketReordering; +var config bool bEnableLoosePositionCheck; +var config bool bPlayersAlwaysRelevant; +var config bool bEnablePingCompensatedSpawn; +var config bool bEnableJitterBounding; +var config bool bEnableWarpFix; +var config bool ShowTouchedPackage; //Add the maplist where kickers will work using normal network var config array ExcludeMapsForKickers; @@ -84,21 +84,44 @@ struct ForceSettingsEntry{ }; var config array ForcedSettings; -// function int GetForcedSettingsLength() { -// return ForcedSettings.Length; -// } - -// function string GetForcedSettingsKey(int Index) { -// return ForcedSettings[Index].Key; -// } - -// function string GetForcedSettingsValue(int Index) { -// return ForcedSettings[Index].Value; -// } +function DumpSetting(PlayerPawn P, string S) { + P.ClientMessage(S$"="$GetPropertyText(S)); +} -// function int GetForcedSettingsMode(int Index) { -// return ForcedSettings[Index].Mode; -// } +function DumpServerSettings(PlayerPawn P) { + P.ClientMessage("SettingsObject="$self); + DumpSetting(P, "bForceDemo"); + DumpSetting(P, "bRestrictTrading"); + DumpSetting(P, "MaxTradeTimeMargin"); + DumpSetting(P, "TradePingMargin"); + DumpSetting(P, "KillCamDelay"); + DumpSetting(P, "KillCamDuration"); + DumpSetting(P, "bJumpingPreservesMomentum"); + DumpSetting(P, "bOldLandingMomentum"); + DumpSetting(P, "bEnableSingleButtonDodge"); + DumpSetting(P, "bUseFlipAnimation"); + DumpSetting(P, "bEnableWallDodging"); + DumpSetting(P, "bDodgePreserveZMomentum"); + DumpSetting(P, "MaxMultiDodges"); + DumpSetting(P, "BrightskinMode"); + DumpSetting(P, "PlayerScale"); + DumpSetting(P, "bAlwaysRenderFlagCarrier"); + DumpSetting(P, "bAlwaysRenderDroppedFlags"); + DumpSetting(P, "MaxPosError"); + DumpSetting(P, "MaxHitError"); + DumpSetting(P, "MaxJitterTime"); + DumpSetting(P, "WarpFixDelay"); + DumpSetting(P, "MinNetUpdateRate"); + DumpSetting(P, "MaxNetUpdateRate"); + DumpSetting(P, "bEnableServerExtrapolation"); + DumpSetting(P, "bEnableServerPacketReordering"); + DumpSetting(P, "bEnableLoosePositionCheck"); + DumpSetting(P, "bPlayersAlwaysRelevant"); + DumpSetting(P, "bEnablePingCompensatedSpawn"); + DumpSetting(P, "bEnableJitterBounding"); + DumpSetting(P, "bEnableWarpFix"); + DumpSetting(P, "ShowTouchedPackage"); +} defaultproperties { diff --git a/Classes/UTPure.uc b/Classes/UTPure.uc index 4ac85319..e718ff39 100644 --- a/Classes/UTPure.uc +++ b/Classes/UTPure.uc @@ -835,29 +835,7 @@ function Mutate(string MutateString, PlayerPawn Sender) Sender.ClientMessage("This server is running "$class'VersionInfo'.default.PackageBaseName@class'VersionInfo'.default.PackageVersion); if (Settings.bUTPureEnabled) { - Sender.ClientMessage("UTPure settings:"); - Sender.ClientMessage("- FOV Tracking:"@Settings.TrackFOV@"(0 = off, 1 = strict, 2 = loose)"); - Sender.ClientMessage("- Forced Settings:"@Settings.ForceSettingsLevel@"(0 = off, 1 = simple, 2 = passive, 3 = active)"); - Sender.ClientMessage("- Minimum Clientrate:"@Settings.MinClientRate); - Sender.ClientMessage("- Maximum Clientrate:"@Settings.MaxClientRate); - Sender.ClientMessage("- Advanced TeamSay:"@Settings.bAdvancedTeamSay); - Sender.ClientMessage("- Allow CenterView:"@Settings.bAllowCenterView); - if (Settings.bAllowCenterView) - Sender.ClientMessage("- CenterView Delay:"@Settings.CenterViewDelay); - Sender.ClientMessage("- Allow BehindView:"@Settings.bAllowBehindView); - Sender.ClientMessage("- Delayed First Pickup Spawn:"@Settings.bDelayedPickupSpawn); - Sender.ClientMessage("- Improved HUD:"@Settings.ImprovedHUD@"(0 = off, 1 = clock/boots, 2 = team)"); - Sender.ClientMessage("- Forced Models:"@Settings.ForceModels@"(0 = off, 1 = allowed, 2 = forced)"); - zzbbPP = bbPlayer(Sender); - if (zzbbPP != None) - { - Sender.ClientMessage("Your settings:"); - if (Settings.ImprovedHUD > 0) - Sender.ClientMessage("- Improved HUD:"@zzbbPP.HUDInfo@"(0 = off, 1 = clock/boots, 2 = team)"); - if (Settings.ForceModels > 0) - Sender.ClientMessage("- Forced Models:"@zzbbPP.zzbForceModels); - Sender.ClientMessage("- Using New Net Code:"@zzbbPP.bNewNet); - } + Settings.DumpServerSettings(Sender); } else Sender.ClientMessage("UTPure is Disabled!"); From f9541e68d94448e5e8f6ef0636000ed62365899b Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Sat, 11 Feb 2023 14:05:31 +0100 Subject: [PATCH 45/58] Loosen ThrowWeapon Restrictions With FWS Enabled --- Classes/bbPlayer.uc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 953ff45b..751f71f4 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -3964,10 +3964,10 @@ exec function ThrowWeapon() return; if( Weapon==None || (Weapon.Class==Level.Game.BaseMutator.MutatedDefaultWeapon()) - || !Weapon.bCanThrow || Weapon.IsInState('Idle') == false ) + || !Weapon.bCanThrow || (IGPlus_UseFastWeaponSwitch == false && Weapon.IsInState('Idle') == false) ) return; - Weapon.Velocity = Vector(ViewRotation) * vect(1,1,0) * zzThrowVelocity + vect(0,0,220); + Weapon.Velocity = Normal(Vector(ViewRotation) * vect(1,1,0)) * zzThrowVelocity + vect(0,0,220); Weapon.bTossedOut = true; TossWeapon(); if ( Weapon == None ) From 5c2c3adc0a4167ddc5007a002013e8af37f570de Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Sun, 12 Feb 2023 21:20:32 +0100 Subject: [PATCH 46/58] Fix Multiple CAPs In Same Tick This fixes the problem of wrong adjustments being performed when more than one ClientAdjustPosition RPC arrive and are processed in the same Tick. --- Classes/bbPlayer.uc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 751f71f4..391d3598 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -1822,7 +1822,8 @@ simulated function xxPureCAP(float TimeStamp, name newState, int MiscData, vecto // Higor: keep track of Position prior to adjustment // and stop current smoothed adjustment (if in progress). - IGPlus_PreAdjustLocation = Location; + if (bUpdatePosition == false) + IGPlus_PreAdjustLocation = Location; if ( IGPlus_AdjustLocationAlpha > 0 ) { IGPlus_AdjustLocationAlpha = 0; From 1af3d7ec5c20a285bce31ec2eb7c8b446a395b6f Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Wed, 15 Feb 2023 23:39:54 +0100 Subject: [PATCH 47/58] Fix Dodging At High Ping While Replaying Moves --- Classes/bbPlayer.uc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 391d3598..3b40d6e0 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -1939,6 +1939,8 @@ function ClientUpdatePosition() local int realbRun, realbDuck; local bool bRealJump; local rotator RealViewRotation, RealRotation; + local EDodgeDir RealDodgeDir; + local float RealDodgeClickTimer; local float AdjustDistance; local vector PostAdjustLocation; @@ -1949,6 +1951,8 @@ function ClientUpdatePosition() bRealJump = bPressedJump; RealRotation = Rotation; RealViewRotation = ViewRotation; + RealDodgeDir = DodgeDir; + RealDodgeClickTimer = DodgeClickTimer; bUpdating = true; IGPlus_FreeAcknowledgedMoves(CurrentTimeStamp); @@ -1994,6 +1998,8 @@ function ClientUpdatePosition() bPressedJump = bRealJump; SetRotation( RealRotation); ViewRotation = RealViewRotation; + DodgeDir = RealDodgeDir; + DodgeClickTimer = RealDodgeClickTimer; zzbFakeUpdate = true; UpdatePing(); @@ -5375,7 +5381,7 @@ ignores SeePlayer, HearNoise, Bump; if (bDodging || DodgeDir == DODGE_Done) { DodgeDir = DODGE_Done; - DodgeClickTimer = FMin(DodgeClickTimer, 0.0); + DodgeClickTimer = 0.0; bDodging = false; } else { DodgeDir = DODGE_None; From 62f5b873ef89ef7711a85e5b05d3c52d81070b1c Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Thu, 23 Feb 2023 21:00:16 +0100 Subject: [PATCH 48/58] Only Check Netspeed After ForcedSettings Were Applied --- Classes/bbPlayer.uc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 3b40d6e0..b5b7c1a3 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -7256,7 +7256,7 @@ event PostRender( canvas zzCanvas ) xxRenderLogo(zzCanvas); xxCleanAvars(); - if (Player.CurrentNetspeed != zzNetspeed) { + if (IGPlus_ForcedSettings_Applied && Player.CurrentNetspeed != zzNetspeed) { Netspeed = int(ConsoleCommand("get ini:Engine.Engine.NetworkDevice MaxClientRate")); if (Netspeed < Settings.DesiredNetspeed) { ConsoleCommand("set ini:Engine.Engine.NetworkDevice MaxClientRate"@Settings.DesiredNetspeed); From e474b79a4a71298370105d4bc18e3195585a35e2 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Thu, 23 Feb 2023 23:35:49 +0100 Subject: [PATCH 49/58] Delay Replicating ForcedSettings Until Possessed Event --- Classes/bbPlayer.uc | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index b5b7c1a3..700d1155 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -281,6 +281,7 @@ struct IGPlus_ForcedSettings_Entry { var IGPlus_ForcedSettings_Entry IGPlus_ForcedSettings[128]; var int IGPlus_ForcedSettings_Counter; var int IGPlus_ForcedSettings_Index; +var bool IGPlus_ForcedSettings_Initialized; var bool IGPlus_ForcedSettings_Applied; var IGPlus_DamageEvent IGPlus_DamageEvent_First; @@ -469,6 +470,7 @@ replication Hold, IGPlus_ForcedSettingsRetry, IGPlus_ForcedSettingsOK, + IGPlus_ForcedSettings_InitOK, PrintWeaponState, ShowStats, xxExplodeOther, @@ -1115,6 +1117,7 @@ event Possess() } IGPlus_ForcedSettingsInit(); + ClientMessage("Sending ForcedSettingsInit"); } if (Role == ROLE_AutonomousProxy || (Role == ROLE_Authority && RemoteRole != ROLE_AutonomousProxy)) { @@ -1147,6 +1150,11 @@ function bool IGPlus_DetermineDualButtonSwitchSetting() { function IGPlus_ForcedSettingsInit() { IGPlus_ForcedSettings_Counter = 0; ClientMessage("Forced Settings initialized", 'IGPlus'); + IGPlus_ForcedSettings_InitOK(); +} + +function IGPlus_ForcedSettings_InitOK() { + IGPlus_ForcedSettings_Initialized = true; } function IGPlus_ForcedSettingRegister(string Key, string Value, int Mode) { @@ -5065,17 +5073,19 @@ event ServerTick(float DeltaTime) { DelayedNavPoint = DelayedNavPoint.NextNavigationPoint; } - if (IGPlus_ForcedSettings_Index < Min(zzUTPure.Settings.ForcedSettings.Length, arraycount(IGPlus_ForcedSettings))) { - if (zzUTPure.GetForcedSettingKey(IGPlus_ForcedSettings_Index) != "") { - IGPlus_ForcedSettings_Counter++; - IGPlus_ForcedSettingRegister( - zzUTPure.GetForcedSettingKey(IGPlus_ForcedSettings_Index), - zzUTPure.GetForcedSettingValue(IGPlus_ForcedSettings_Index), - zzUTPure.GetForcedSettingMode(IGPlus_ForcedSettings_Index)); + if (IGPlus_ForcedSettings_Initialized) { + if (IGPlus_ForcedSettings_Index < Min(zzUTPure.Settings.ForcedSettings.Length, arraycount(IGPlus_ForcedSettings))) { + if (zzUTPure.GetForcedSettingKey(IGPlus_ForcedSettings_Index) != "") { + IGPlus_ForcedSettings_Counter++; + IGPlus_ForcedSettingRegister( + zzUTPure.GetForcedSettingKey(IGPlus_ForcedSettings_Index), + zzUTPure.GetForcedSettingValue(IGPlus_ForcedSettings_Index), + zzUTPure.GetForcedSettingMode(IGPlus_ForcedSettings_Index)); + } + IGPlus_ForcedSettings_Index++; + if (IGPlus_ForcedSettings_Index == Min(zzUTPure.Settings.ForcedSettings.Length, arraycount(IGPlus_ForcedSettings))) + IGPlus_ForcedSettingsApply(IGPlus_ForcedSettings_Counter); } - IGPlus_ForcedSettings_Index++; - if (IGPlus_ForcedSettings_Index == Min(zzUTPure.Settings.ForcedSettings.Length, arraycount(IGPlus_ForcedSettings))) - IGPlus_ForcedSettingsApply(IGPlus_ForcedSettings_Counter); } if (bIsCrouching) { From 874d2484e11a7ad77f585da5ac085d3136061c0c Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Sun, 5 Mar 2023 12:50:42 +0100 Subject: [PATCH 50/58] Prevent Logging During ServerMove --- Classes/bbPlayer.uc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 700d1155..2dca2188 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -2405,7 +2405,7 @@ function IGPlus_ApplyServerMove(IGPlus_ServerMove SM) { else MaxTimeMargin = 0.5; DeltaTime = 0; - Log("["$Level.TimeSeconds$"]"@PlayerReplicationInfo.PlayerName@"MaxTimeMargin exceeded ("$TimeMargin$")", 'IGPlus'); + ClientDebugMessage("["$Level.TimeSeconds$"]"@PlayerReplicationInfo.PlayerName@"MaxTimeMargin exceeded ("$TimeMargin$")", 'IGPlus'); } } @@ -3036,7 +3036,7 @@ function xxServerMoveDead( else MaxTimeMargin = 0.5; DeltaTime = 0; - Log("["$Level.TimeSeconds$"]"@PlayerReplicationInfo.PlayerName@"MaxTimeMargin exceeded ("$TimeMargin$")", 'IGPlus'); + ClientDebugMessage("["$Level.TimeSeconds$"]"@PlayerReplicationInfo.PlayerName@"MaxTimeMargin exceeded ("$TimeMargin$")", 'IGPlus'); } } From 88122b6b4fb9ab9bbadc1d87059a77bf2d2503d0 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Tue, 28 Mar 2023 12:33:03 +0200 Subject: [PATCH 51/58] Update Build System and CI --- .github/workflows/ci.yml | 52 +++++++++++-------- ...Plus.txt => ACETweakList-InstaGibPlus.txt} | 0 build.bat | 25 +++++---- 3 files changed, 45 insertions(+), 32 deletions(-) rename System/{ACETweakList_InstaGibPlus.txt => ACETweakList-InstaGibPlus.txt} (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1afb2324..65a15754 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,15 +27,18 @@ jobs: - name: Determine Package Name run: | + $ref = "${{ github.ref }}" + $repoName = "${{ github.event.repository.name }}" + $sha = "${{ github.sha }}" if ("${{ github.ref_type }}" -eq "tag") { - echo ("PKG_NAME=${{ github.event.repository.name }}_"+"${{ github.ref }}".SubString(10)) >> $env:GITHUB_ENV - echo ("PKG_VER="+"${{ github.ref }}".SubString(10)) >> $env:GITHUB_ENV - } elseif ("${{ github.ref }}".StartsWith("refs/pull/")) { - echo ("PKG_NAME=${{ github.event.repository.name }}_pr_"+"${{ github.ref }}".SubString(10, $length - 16)) >> $env:GITHUB_ENV - echo ("PKG_VER=pr_"+"${{ github.ref }}".SubString(10, $length - 16)) >> $env:GITHUB_ENV + echo ("PKG_NAME="+$repoName+"_"+$ref.SubString(10)) >> $env:GITHUB_ENV + echo ("PKG_VER="+$ref.SubString(10)) >> $env:GITHUB_ENV + } elseif ($ref.StartsWith("refs/pull/")) { + echo ("PKG_NAME="+$repoName+"_pr_"+$ref.SubString(10, $ref.Length - 16)) >> $env:GITHUB_ENV + echo ("PKG_VER=pr_"+$ref.SubString(10, $ref.Length - 16)) >> $env:GITHUB_ENV } else { - echo ("PKG_NAME=${{ github.event.repository.name }}_"+"${{ github.ref }}".SubString(11)+"-"+"${{ github.sha }}".SubString(0,8)) >> $env:GITHUB_ENV - echo ("PKG_VER="+"${{ github.ref }}".SubString(11)+"-"+"${{ github.sha }}".SubString(0,8)) >> $env:GITHUB_ENV + echo ("PKG_NAME="+$repoName+"_"+$ref.SubString(11)+"-"+$sha.SubString(0,8)) >> $env:GITHUB_ENV + echo ("PKG_VER="+$ref.SubString(11)+"-"+$sha.SubString(0,8)) >> $env:GITHUB_ENV } - name: Save Package Name In File @@ -56,31 +59,38 @@ jobs: - name: Rename Localization Files run: | - function Replace-PackageName { + function Replace-PackageName-File { param( - $File + $File, + $SubDir ) $OldName = $File.Name $NewName = ($File.Name -replace "${{ github.event.repository.name }}\.","${{ env.PKG_NAME }}.") - $NewItem = ("${{ env.PKG_NAME }}/System/" + $NewName) - Write-Output ($OldName + " -> " + $NewName) + $NewItem = ("${{ env.PKG_NAME }}"+$SubDir+$NewName) + Write-Output ($SubDir + $OldName + " -> " + $SubDir + $NewName) if (Test-Path -Path $NewItem) { Remove-Item $NewItem } (Get-Content -Path $File.FullName) | ForEach-Object { ($_ -replace "${{ github.event.repository.name }}\.","${{ env.PKG_NAME }}.") >> $NewItem } Remove-Item $File } - Get-ChildItem "${{ env.PKG_NAME }}/System/${{ github.event.repository.name }}.*" | ForEach-Object { - Replace-PackageName($_) - } - Get-ChildItem "${{ env.PKG_NAME }}/System/ACEFileList_${{ github.event.repository.name }}.*" | ForEach-Object { - Replace-PackageName($_) - } - Get-ChildItem "${{ env.PKG_NAME }}/System/ACETweakList_${{ github.event.repository.name }}.*" | ForEach-Object { - Replace-PackageName($_) + + function Replace-PackageName { + param( + [string]$SubDir, + [string]$FilePattern + ) + Get-ChildItem ("${{ env.PKG_NAME }}"+$SubDir+$FilePattern) | ForEach-Object { + Replace-PackageName-File $_ $SubDir + } } + Replace-PackageName "/System/" "${{ github.event.repository.name }}.*" + Replace-PackageName "/System/" "ACEFileList-${{ github.event.repository.name }}.*" + Replace-PackageName "/System/" "ACETweakList-${{ github.event.repository.name }}.*" + Replace-PackageName "/Classes/" "${{ github.event.repository.name }}.upkg" + - name: Extract Necessary Resources run: 7z x "${{ env.PKG_NAME }}/Build/BuildEnv.zip" @@ -133,7 +143,7 @@ jobs: steps: - name: Download Artifact - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: PackageName @@ -143,7 +153,7 @@ jobs: Remove-Item -Path "PackageName" - name: Download Artifact - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: ${{ env.PKG_NAME }} diff --git a/System/ACETweakList_InstaGibPlus.txt b/System/ACETweakList-InstaGibPlus.txt similarity index 100% rename from System/ACETweakList_InstaGibPlus.txt rename to System/ACETweakList-InstaGibPlus.txt diff --git a/build.bat b/build.bat index 2fdf4c60..48c319bd 100644 --- a/build.bat +++ b/build.bat @@ -135,7 +135,7 @@ if %VERBOSE% GEQ 1 ( echo VERBOSE=%VERBOSE% ) -call %BUILD_DIR%Build\CreateVersionInfo.bat %PACKAGE_NAME% dev %PACKAGE_NAME% +call "%BUILD_DIR%Build\CreateVersionInfo.bat" %PACKAGE_NAME% dev %PACKAGE_NAME% pushd "%BUILD_DIR%..\System" @@ -145,7 +145,7 @@ call :PrepareDependencies %DEPENDENCIES% :: make sure to always rebuild the package :: New package GUID, No doubts about staleness -if exist "%PACKAGE_NAME%.u" del %PACKAGE_NAME%.u +if exist "%PACKAGE_NAME%.u" del "%PACKAGE_NAME%.u" set MAKE_PARAMS=-ini=%MAKEINI% @@ -160,18 +160,21 @@ if ERRORLEVEL 1 goto compile_failed :: copy to release location if not exist "%BUILD_DIR%System" (mkdir "%BUILD_DIR%System") -copy %PACKAGE_NAME%.u %BUILD_DIR%System >NUL +copy "%PACKAGE_NAME%.u" "%BUILD_DIR%System" >NUL if %BUILD_NOUZ% == 0 ( :: generate compressed file for redirects - call :Invoke ucc compress %PACKAGE_NAME%.u - copy %PACKAGE_NAME%.u.uz "%BUILD_DIR%System" >NUL + call :Invoke ucc compress "%PACKAGE_NAME%.u" + copy "%PACKAGE_NAME%.u.uz" "%BUILD_DIR%System" >NUL ) if %BUILD_NOINT% == 0 ( :: dump localization strings - call :Invoke ucc dumpint %PACKAGE_NAME%.u - copy %PACKAGE_NAME%.int "%BUILD_DIR%System" >NUL + if exist "%PACKAGE_NAME%.int" del "%PACKAGE_NAME%.int" >NUL + if exist "..\SystemLocalized\int\%PACKAGE_NAME%.int" del "..\SystemLocalized\int\%PACKAGE_NAME%.int" >NUL + call :Invoke ucc dumpint "%PACKAGE_NAME%.u" + if exist "%PACKAGE_NAME%.int" copy "%PACKAGE_NAME%.int" "%BUILD_DIR%System" >NUL + if exist "..\SystemLocalized\int\%PACKAGE_NAME%.int" copy "..\SystemLocalized\int\%PACKAGE_NAME%.int" "%BUILD_DIR%System" >NUL ) :: The reason we dont call PostBuildHook is because if youre using NoBind, this @@ -226,7 +229,7 @@ exit /B %ERRORLEVEL% :: Usually the last Package is the one that you are trying to compile :: If Package A depends on Package B, then B must appear before A in this list. :GenerateMakeIni - if not exist %1 mkdir "%~dp1" + if not exist "%~dp1" mkdir "%~dp1" call :GenerateMakeIniPreamble %1 :GenerateMakeIni_Loop @@ -285,11 +288,11 @@ exit /B %ERRORLEVEL% :PrepareDependencies if [%1] EQU [] exit /B %ERRORLEVEL% if exist "%BUILD_DIR%Build/Dependencies/%1/" ( - if %VERBOSE% GEQ 1 echo Copying Dependency %1 + if %VERBOSE% GEQ 1 echo Copying Dependency %1 if %VERBOSE% GEQ 1 ( - robocopy "%BUILD_DIR%Build/Dependencies/%1/" .. *.* /S /NJH /NJS /NS /NC /NP + robocopy "%BUILD_DIR%Build/Dependencies/%1/" .. *.* /S /NJH /NJS /NS /NC /NP ) else ( - robocopy "%BUILD_DIR%Build/Dependencies/%1/" .. *.* /S >NUL + robocopy "%BUILD_DIR%Build/Dependencies/%1/" .. *.* /S >NUL ) ) else ( echo "Could not locate dependency '%1' in '%BUILD_DIR%Build/Dependencies/'" From 4d0480a7566a60fa2e59ecaccf35b5508424a9d6 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Tue, 28 Mar 2023 12:51:30 +0200 Subject: [PATCH 52/58] Fix CI --- .github/workflows/ci.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 65a15754..104d17cf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -81,8 +81,10 @@ jobs: [string]$SubDir, [string]$FilePattern ) - Get-ChildItem ("${{ env.PKG_NAME }}"+$SubDir+$FilePattern) | ForEach-Object { - Replace-PackageName-File $_ $SubDir + if (Test-Path -Path ("${{ env.PKG_NAME }}"+$SubDir+$FilePattern)) { + Get-ChildItem ("${{ env.PKG_NAME }}"+$SubDir+$FilePattern) | ForEach-Object { + Replace-PackageName-File $_ $SubDir + } } } From b6f932aa0a4a6680bd62c70e039c4b2e4fea952a Mon Sep 17 00:00:00 2001 From: w0ss4g3 <97363958+w0ss4g3@users.noreply.github.com> Date: Wed, 12 Apr 2023 17:26:10 +0100 Subject: [PATCH 53/58] Added setting to control the minigun unwind/spin down time (#19) --- Classes/ST_minigun2.uc | 12 ++++++++++++ Classes/WeaponSettings.uc | 2 ++ Classes/WeaponSettingsRepl.uc | 10 ++++++++++ 3 files changed, 24 insertions(+) diff --git a/Classes/ST_minigun2.uc b/Classes/ST_minigun2.uc index 6c2235fd..521d7acf 100644 --- a/Classes/ST_minigun2.uc +++ b/Classes/ST_minigun2.uc @@ -357,6 +357,18 @@ simulated function TweenDown() { PlayAnim('Down', GetWeaponSettings().MinigunDownAnimSpeed(), TweenTime); } +simulated function PlayUnwind() +{ + local float TweenTime; + + TweenTime = 0.05; + if ( Owner != None ) + { + PlayOwnedSound(Misc1Sound, SLOT_Misc, 3.0*Pawn(Owner).SoundDampening); + PlayAnim('UnWind', GetWeaponSettings().MinigunUnwindAnimSpeed(), TweenTime); + } +} + defaultproperties { FireInterval=0.130 NextFireInterval=0.08 diff --git a/Classes/WeaponSettings.uc b/Classes/WeaponSettings.uc index db2bbbeb..9f62d2ea 100644 --- a/Classes/WeaponSettings.uc +++ b/Classes/WeaponSettings.uc @@ -57,6 +57,7 @@ var config float RipperSecondaryMomentum; var config float MinigunSelectTime; var config float MinigunDownTime; var config float MinigunSpinUpTime; +var config float MinigunUnwindTime; var config float MinigunBulletInterval; var config float MinigunAlternateBulletInterval; var config float MinigunMinDamage; @@ -183,6 +184,7 @@ defaultproperties MinigunSelectTime=0.555556 MinigunDownTime=0.333333 MinigunSpinUpTime=0.130 + MinigunUnwindTime=0.866666 MinigunBulletInterval=0.080 MinigunAlternateBulletInterval=0.050 MinigunMinDamage=5 diff --git a/Classes/WeaponSettingsRepl.uc b/Classes/WeaponSettingsRepl.uc index db765697..646d8142 100644 --- a/Classes/WeaponSettingsRepl.uc +++ b/Classes/WeaponSettingsRepl.uc @@ -43,6 +43,7 @@ var float RipperSecondaryMomentum; var float MinigunSelectTime; var float MinigunDownTime; var float MinigunSpinUpTime; +var float MinigunUnwindTime; var float MinigunBulletInterval; var float MinigunAlternateBulletInterval; var float MinigunMinDamage; @@ -154,6 +155,7 @@ replication { MinigunSelectTime, MinigunDownTime, MinigunSpinUpTime, + MinigunUnwindTime, MinigunBulletInterval, MinigunAlternateBulletInterval, MinigunMinDamage, @@ -306,6 +308,12 @@ simulated final function float MinigunDownAnimSpeed() { return 100.0; } +simulated final function float MinigunUnwindAnimSpeed() { + if (MinigunUnwindTime > 0.0) + return FMin(100.0, 1.5 * default.MinigunUnwindTime / MinigunUnwindTime); + return 100.0; +} + simulated final function float PulseSelectAnimSpeed() { if (PulseSelectTime > 0.0) return FMin(100.0, default.PulseSelectTime / PulseSelectTime); @@ -452,6 +460,7 @@ function InitFromWeaponSettings(WeaponSettings S) { MinigunSelectTime = S.MinigunSelectTime; MinigunDownTime = S.MinigunDownTime; MinigunSpinUpTime = S.MinigunSpinUpTime; + MinigunUnwindTime = S.MinigunUnwindTime; MinigunBulletInterval = S.MinigunBulletInterval; MinigunAlternateBulletInterval = S.MinigunAlternateBulletInterval; MinigunMinDamage = S.MinigunMinDamage; @@ -602,6 +611,7 @@ defaultproperties MinigunSelectTime=0.555556 MinigunDownTime=0.333333 MinigunSpinUpTime=0.130 + MinigunUnwindTime=0.866666 MinigunBulletInterval=0.080 MinigunAlternateBulletInterval=0.050 MinigunMinDamage=5 From 60b71028c721c53a3508cddc58b2c1e403a2cb62 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Tue, 18 Apr 2023 10:35:37 +0200 Subject: [PATCH 54/58] Fix Dying During FeignDeath Not Removing Weapons --- Classes/bbPlayer.uc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 2dca2188..0c654c4d 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -6017,7 +6017,7 @@ state Dying global.ServerTick(DeltaTime); - if (RealTimeDead > 2*zzUTPure.Settings.MaxTradeTimeMargin && Weapon != none) + if (RealTimeDead > 2*zzUTPure.Settings.MaxTradeTimeMargin) Level.Game.DiscardInventory(self); } From 6eb646f9be2a126f94944f4f2b75243458d2ecfa Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Tue, 18 Apr 2023 10:38:09 +0200 Subject: [PATCH 55/58] Always Discard Inventory Before Respawning --- Classes/bbPlayer.uc | 1 + 1 file changed, 1 insertion(+) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 0c654c4d..2aca880c 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -6195,6 +6195,7 @@ state Dying function EndState() { + Level.Game.DiscardInventory(self); RotationRate = default.RotationRate; SetPhysics(PHYS_None); Super.EndState(); From 7dbcc2deab69eb8a2268877e3cc8242267240513 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Wed, 19 Apr 2023 19:21:28 +0200 Subject: [PATCH 56/58] Revert "Always Discard Inventory Before Respawning" This reverts commit 6eb646f9be2a126f94944f4f2b75243458d2ecfa. --- Classes/bbPlayer.uc | 1 - 1 file changed, 1 deletion(-) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 2aca880c..0c654c4d 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -6195,7 +6195,6 @@ state Dying function EndState() { - Level.Game.DiscardInventory(self); RotationRate = default.RotationRate; SetPhysics(PHYS_None); Super.EndState(); From b60b451a451a927f6233fdb6ed4b4fa56a4b8210 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Wed, 19 Apr 2023 19:22:34 +0200 Subject: [PATCH 57/58] Try Fixing Crash On Map Change --- Classes/bbPlayer.uc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index 0c654c4d..c3eca8b2 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -9204,6 +9204,12 @@ exec function DrawServerLocation() { IGPlus_LocationOffsetFix_DrawServerLocation = !IGPlus_LocationOffsetFix_DrawServerLocation; } +simulated function SetMesh() { + if (bDeleteMe) + return; + super.SetMesh(); +} + defaultproperties { bNewNet=True From 90de9ad37101982412380d138ce1624fba3a18a0 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Wed, 19 Apr 2023 19:57:17 +0200 Subject: [PATCH 58/58] Always Discard Inventory Before Respawning --- Classes/bbPlayer.uc | 1 + 1 file changed, 1 insertion(+) diff --git a/Classes/bbPlayer.uc b/Classes/bbPlayer.uc index c3eca8b2..9ec3c2b2 100644 --- a/Classes/bbPlayer.uc +++ b/Classes/bbPlayer.uc @@ -5976,6 +5976,7 @@ state Dying Level.Game.bDeathMatch = false; } + Level.Game.DiscardInventory(self); // last possible place to rid ourselves of old inventory Result = Level.Game.RestartPlayer(self); if (zzUTPure.Settings.bEnablePingCompensatedSpawn)