mirror of
https://github.com/roflmuffin/CounterStrikeSharp.git
synced 2025-12-06 08:03:12 -08:00
Compare commits
205 Commits
v1.0.264
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
135f594175 | ||
|
|
f32e74515b | ||
|
|
0318713cbe | ||
|
|
0322548ebd | ||
|
|
e4b1a35308 | ||
|
|
fd8defc1b9 | ||
|
|
cebec419fa | ||
|
|
52550e31bc | ||
|
|
e59e9cf148 | ||
|
|
1568d077e8 | ||
|
|
55542dba7c | ||
|
|
33538eca60 | ||
|
|
b4e83dfb4a | ||
|
|
4ff2732d8a | ||
|
|
67d3d044fd | ||
|
|
f50540583d | ||
|
|
97957f6220 | ||
|
|
0c2f1cd078 | ||
|
|
9eefe9c61a | ||
|
|
7be329466a | ||
|
|
a21f0b5277 | ||
|
|
b4ba7d8ca0 | ||
|
|
0eb73eb348 | ||
|
|
43c1c89596 | ||
|
|
53996666f8 | ||
|
|
a8510d183d | ||
|
|
a52f5e737d | ||
|
|
34598dd56e | ||
|
|
325728e753 | ||
|
|
56e007402b | ||
|
|
bf75d43039 | ||
|
|
7572722de4 | ||
|
|
638d74470e | ||
|
|
37951f2875 | ||
|
|
7b9df9097c | ||
|
|
31cedca2b7 | ||
|
|
4869acac41 | ||
|
|
2c80971393 | ||
|
|
44922da680 | ||
|
|
1ca8ff2172 | ||
|
|
99f7f37b10 | ||
|
|
54f8d5ef95 | ||
|
|
a7443b2a60 | ||
|
|
72d66cb5d5 | ||
|
|
adccc4b9e9 | ||
|
|
fc7301a8d3 | ||
|
|
ef4b8f9442 | ||
|
|
245f55daf3 | ||
|
|
936b88d57c | ||
|
|
ee792de1a0 | ||
|
|
624ca0f0de | ||
|
|
592acc28aa | ||
|
|
51b6b45390 | ||
|
|
d5fad8d801 | ||
|
|
bf1ce2e8a3 | ||
|
|
0761d267ba | ||
|
|
92959dea6e | ||
|
|
f7c69a60be | ||
|
|
6f796d9ae9 | ||
|
|
1f9c7a090b | ||
|
|
2cf2d45e8e | ||
|
|
fa383cda68 | ||
|
|
e1acada35e | ||
|
|
dc503e7f57 | ||
|
|
fedfe75601 | ||
|
|
3508fdfd8c | ||
|
|
741d6a3fc8 | ||
|
|
356152a567 | ||
|
|
31e12ba809 | ||
|
|
529a0cbf5b | ||
|
|
ed7c28f9e3 | ||
|
|
1f30e5619f | ||
|
|
af3bb528d7 | ||
|
|
b7abd1d59e | ||
|
|
dd50221321 | ||
|
|
9491732a38 | ||
|
|
6c9321e3e7 | ||
|
|
6acfa1491a | ||
|
|
ad8116d4d2 | ||
|
|
26a8f641c8 | ||
|
|
f08b5e8439 | ||
|
|
6e27a67917 | ||
|
|
a8eff60d0b | ||
|
|
89fc5aeaf9 | ||
|
|
ffb274d636 | ||
|
|
b5303d15ab | ||
|
|
1a521ec3bb | ||
|
|
ec61ad37f0 | ||
|
|
260015d765 | ||
|
|
d346a02f98 | ||
|
|
8ab61b00e8 | ||
|
|
c746c4e2e7 | ||
|
|
32d3e18657 | ||
|
|
d5fa42cb50 | ||
|
|
22809e3ec6 | ||
|
|
87d197309b | ||
|
|
e6bfb7939d | ||
|
|
0ae9227d73 | ||
|
|
7285d29454 | ||
|
|
124ffac7a9 | ||
|
|
267b017787 | ||
|
|
018bcba655 | ||
|
|
011401adb9 | ||
|
|
bebeedf272 | ||
|
|
7af153cf25 | ||
|
|
6f663164ee | ||
|
|
22f5c06c49 | ||
|
|
073728b4ce | ||
|
|
6511a0098a | ||
|
|
f50fb783bb | ||
|
|
49e8ab0e27 | ||
|
|
4be0634625 | ||
|
|
7025b62615 | ||
|
|
462ca52229 | ||
|
|
d7e23e8282 | ||
|
|
3ddfa71e3f | ||
|
|
688b226bcf | ||
|
|
0d23387347 | ||
|
|
68e6ffaebe | ||
|
|
2f8f370cd3 | ||
|
|
169d43e31d | ||
|
|
0ce4a2903c | ||
|
|
33b46eb214 | ||
|
|
a27ba3b005 | ||
|
|
57286c9990 | ||
|
|
ae808c05c8 | ||
|
|
c9f8e477d3 | ||
|
|
2398ba0a5d | ||
|
|
e45c20481d | ||
|
|
fe321ee93d | ||
|
|
be19103556 | ||
|
|
64cb26b86d | ||
|
|
637224dc55 | ||
|
|
3aca7c37f1 | ||
|
|
87f38d72ee | ||
|
|
5daf94791f | ||
|
|
c50213c442 | ||
|
|
c02d31cb2e | ||
|
|
98cbca44d4 | ||
|
|
4cf88fc03e | ||
|
|
f1dff6d4d3 | ||
|
|
414a59a36d | ||
|
|
f1c108087b | ||
|
|
47ddf42c11 | ||
|
|
ded133f1db | ||
|
|
bbc621acdc | ||
|
|
f7784c26c6 | ||
|
|
2da5448c8e | ||
|
|
e406b78044 | ||
|
|
3839831ea9 | ||
|
|
54ad6c0b79 | ||
|
|
7c2cc8a7f6 | ||
|
|
e99d27ca30 | ||
|
|
44d3c51bc7 | ||
|
|
f72e6d5daf | ||
|
|
c8bccb07e0 | ||
|
|
2c0640700a | ||
|
|
0f71e1aebe | ||
|
|
ac38ec249b | ||
|
|
cff24f4321 | ||
|
|
f05cc5e043 | ||
|
|
bd1105d752 | ||
|
|
9b4ee727c7 | ||
|
|
38d248defe | ||
|
|
6b4306948b | ||
|
|
3fee00e8c4 | ||
|
|
d22af142cb | ||
|
|
c1176a3192 | ||
|
|
3c321be5a0 | ||
|
|
466da1b193 | ||
|
|
ba860a92d2 | ||
|
|
461fc0ea67 | ||
|
|
6349c11d07 | ||
|
|
b2046b21c4 | ||
|
|
3c6be481c5 | ||
|
|
0a6fe0946d | ||
|
|
79297511e3 | ||
|
|
c6d3988902 | ||
|
|
8a063f4fb6 | ||
|
|
6cf124bfb6 | ||
|
|
1f904a52a7 | ||
|
|
32c99b2e49 | ||
|
|
5c9d38b2b0 | ||
|
|
b54f5c3dee | ||
|
|
761380dff6 | ||
|
|
71ae253e5e | ||
|
|
c2f212df51 | ||
|
|
ad7f7bd365 | ||
|
|
a0fcb7817e | ||
|
|
cdb7a6ed17 | ||
|
|
38e29531c3 | ||
|
|
5f95969980 | ||
|
|
42dd270b78 | ||
|
|
b807c3eda8 | ||
|
|
3ede4c366c | ||
|
|
49cc91e373 | ||
|
|
8a795de9fa | ||
|
|
e36d2e07e4 | ||
|
|
cdd2a8275e | ||
|
|
2b31f519eb | ||
|
|
2c7f896189 | ||
|
|
5a354a25e3 | ||
|
|
74ce0d295a | ||
|
|
9c8f25f721 | ||
|
|
4b1a2c427e |
@@ -38,7 +38,7 @@ BraceWrapping:
|
||||
SplitEmptyNamespace: true
|
||||
|
||||
PointerAlignment: Left
|
||||
SortIncludes: CaseSensitive
|
||||
SortIncludes: Never
|
||||
IncludeBlocks: Regroup
|
||||
IncludeCategories:
|
||||
# External headers in <> with extension or /
|
||||
|
||||
21
.devcontainer/devcontainer.json
Normal file
21
.devcontainer/devcontainer.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "SteamRT Sniper SDK",
|
||||
"image": "registry.gitlab.steamos.cloud/steamrt/sniper/sdk:latest",
|
||||
"updateContentCommand": "git submodule update --init --recursive",
|
||||
"postCreateCommand": "cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -G Ninja && cmake --build build -j$(nproc)",
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"ms-dotnettools.csdevkit",
|
||||
"ms-vscode.cpptools",
|
||||
"ms-vscode.cpptools-extension-pack",
|
||||
"GitHub.copilot",
|
||||
"jeff-hykin.better-cpp-syntax"
|
||||
]
|
||||
}
|
||||
},
|
||||
"features": {
|
||||
"ghcr.io/devcontainers/features/dotnet": "8.0",
|
||||
"ghcr.io/devcontainers/features/node": "lts"
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"name": "SteamRT Sniper SDK",
|
||||
"image": "registry.gitlab.steamos.cloud/steamrt/sniper/sdk:latest",
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"ms-vscode.cpptools"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
3
.github/dependabot.yaml
vendored
3
.github/dependabot.yaml
vendored
@@ -6,7 +6,8 @@ updates:
|
||||
allow:
|
||||
- dependency-name: "libraries/hl2sdk-cs2"
|
||||
- dependency-name: "libraries/metamod-source"
|
||||
- dependency-name: "libraries/Protobufs"
|
||||
schedule:
|
||||
interval: "daily"
|
||||
commit-message:
|
||||
prefix: "chore(deps)"
|
||||
prefix: "chore(deps)"
|
||||
|
||||
270
.github/workflows/build-and-publish.yml
vendored
Normal file
270
.github/workflows/build-and-publish.yml
vendored
Normal file
@@ -0,0 +1,270 @@
|
||||
name: Build & Publish
|
||||
|
||||
env:
|
||||
BUILD_TYPE: Release
|
||||
|
||||
# Remove default permissions of GITHUB_TOKEN for security
|
||||
# https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs
|
||||
permissions: {}
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- "docfx/**"
|
||||
branches: ["main"]
|
||||
tags:
|
||||
- "v*"
|
||||
pull_request:
|
||||
branches: ["main"]
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
gitversion_semver: ${{ steps.gitversion.outputs.semVer }}
|
||||
gitversion_fullsemver: ${{ steps.gitversion.outputs.fullSemVer }}
|
||||
gitversion_assemblysemver: ${{ steps.gitversion.outputs.assemblySemVer }}
|
||||
gitversion_informationalversion: ${{ steps.gitversion.outputs.informationalVersion }}
|
||||
steps:
|
||||
- name: Install GitVersion
|
||||
uses: gittools/actions/gitversion/setup@v1
|
||||
with:
|
||||
versionSpec: 6.0.x
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Execute GitVersion
|
||||
id: gitversion
|
||||
uses: gittools/actions/gitversion/execute@v1
|
||||
with:
|
||||
useConfigFile: true
|
||||
|
||||
build_windows:
|
||||
needs: setup
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Prepare env
|
||||
shell: bash
|
||||
run: |
|
||||
echo "GITHUB_SHA_SHORT=${GITHUB_SHA::7}" >> $GITHUB_ENV
|
||||
echo "SEMVER=${{ needs.setup.outputs.gitversion_semver }}" >> $GITHUB_ENV
|
||||
|
||||
- name: Visual Studio environment
|
||||
shell: cmd
|
||||
run: |
|
||||
:: See https://github.com/microsoft/vswhere/wiki/Find-VC
|
||||
for /f "usebackq delims=*" %%i in (`vswhere -latest -property installationPath`) do (
|
||||
call "%%i"\Common7\Tools\vsdevcmd.bat -arch=x64 -host_arch=x64
|
||||
)
|
||||
|
||||
:: Loop over all environment variables and make them global.
|
||||
for /f "delims== tokens=1,2" %%a in ('set') do (
|
||||
echo>>"%GITHUB_ENV%" %%a=%%b
|
||||
)
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: "recursive"
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
mkdir -p build
|
||||
cd build
|
||||
cmake -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} ..
|
||||
cmake --build . --config ${{env.BUILD_TYPE}} -- /m:16
|
||||
|
||||
- name: Clean build directory
|
||||
run: |
|
||||
mkdir -p build/addons/counterstrikesharp/bin/win64
|
||||
mv build/${{env.BUILD_TYPE}}/*.dll build/addons/counterstrikesharp/bin/win64
|
||||
mkdir build/output/
|
||||
mv build/addons build/output
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: counterstrikesharp-windows-${{ needs.setup.outputs.gitversion_semver }}
|
||||
path: build/output/
|
||||
|
||||
build_linux:
|
||||
needs: setup
|
||||
runs-on: ubuntu-latest
|
||||
# Could not figure out how to run in a container only on some matrix paths, so I've split it out into its own build.
|
||||
container:
|
||||
image: registry.gitlab.steamos.cloud/steamrt/sniper/sdk:latest
|
||||
steps:
|
||||
- name: Prepare env
|
||||
shell: bash
|
||||
run: |
|
||||
echo "GITHUB_SHA_SHORT=${GITHUB_SHA::7}" >> $GITHUB_ENV
|
||||
echo "SEMVER=${{ needs.setup.outputs.gitversion_semver }}" >> $GITHUB_ENV
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: "recursive"
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
mkdir -p build
|
||||
cd build
|
||||
cmake -G Ninja -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} ..
|
||||
cmake --build . --config ${{env.BUILD_TYPE}} -- -j16
|
||||
|
||||
- name: Clean build directory
|
||||
run: |
|
||||
mkdir build/output/
|
||||
mv build/addons build/output
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: counterstrikesharp-linux-${{ needs.setup.outputs.gitversion_semver }}
|
||||
path: build/output/
|
||||
|
||||
build_managed:
|
||||
needs: setup
|
||||
permissions:
|
||||
contents: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Prepare env
|
||||
shell: bash
|
||||
run: echo "GITHUB_SHA_SHORT=${GITHUB_SHA::7}" >> $GITHUB_ENV
|
||||
|
||||
# We don't need expensive submodules for the managed side.
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Build runtime v${{ needs.setup.outputs.gitversion_semver }}
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: "8.0.x"
|
||||
|
||||
- name: Install dependencies
|
||||
run: dotnet restore managed/CounterStrikeSharp.sln
|
||||
|
||||
- name: Run tests
|
||||
run: dotnet test --logger trx --results-directory "TestResults-${{ needs.setup.outputs.gitversion_semver }}" managed/CounterStrikeSharp.API.Tests/CounterStrikeSharp.API.Tests.csproj
|
||||
|
||||
- name: Upload dotnet test results
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: test-results-${{ needs.setup.outputs.gitversion_semver }}
|
||||
path: TestResults-${{ needs.setup.outputs.gitversion_semver }}
|
||||
if: ${{ always() }}
|
||||
|
||||
- name: Publish artifacts
|
||||
run: |
|
||||
dotnet publish -c Release \
|
||||
/p:Version=${{ needs.setup.outputs.gitversion_semver }} \
|
||||
/p:AssemblyVersion=${{ needs.setup.outputs.gitversion_assemblySemver }} \
|
||||
/p:InformationalVersion=${{ needs.setup.outputs.gitversion_informationalversion }} \
|
||||
managed/CounterStrikeSharp.API
|
||||
|
||||
dotnet pack -c Release \
|
||||
/p:Version=${{ needs.setup.outputs.gitversion_semver }} \
|
||||
/p:AssemblyVersion=${{ needs.setup.outputs.gitversion_assemblySemver }} \
|
||||
/p:InformationalVersion=${{ needs.setup.outputs.gitversion_informationalversion }} \
|
||||
managed/CounterStrikeSharp.API
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: counterstrikesharp-api-${{ needs.setup.outputs.gitversion_semver }}
|
||||
path: managed/CounterStrikeSharp.API/bin/Release
|
||||
|
||||
publish:
|
||||
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') && github.repository == 'roflmuffin/CounterStrikeSharp' }}
|
||||
permissions:
|
||||
contents: write
|
||||
needs: ["setup", "build_linux", "build_windows", "build_managed"]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Prepare env
|
||||
shell: bash
|
||||
run: echo "GITHUB_SHA_SHORT=${GITHUB_SHA::7}" >> $GITHUB_ENV
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: counterstrikesharp-windows-${{ needs.setup.outputs.gitversion_semver }}
|
||||
path: build/windows
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: counterstrikesharp-linux-${{ needs.setup.outputs.gitversion_semver }}
|
||||
path: build/linux
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: counterstrikesharp-api-${{ needs.setup.outputs.gitversion_semver }}
|
||||
path: build/api
|
||||
|
||||
# TODO: This stuff should really be in a matrix
|
||||
- name: Add API to Artifacts
|
||||
run: |
|
||||
mkdir -p build/linux/addons/counterstrikesharp/api
|
||||
mkdir -p build/windows/addons/counterstrikesharp/api
|
||||
cp -r build/api/net8.0/publish/* build/linux/addons/counterstrikesharp/api
|
||||
cp -r build/api/net8.0/publish/* build/windows/addons/counterstrikesharp/api
|
||||
|
||||
- name: Zip Builds
|
||||
run: |
|
||||
(cd build/linux && zip -qq -r ../../counterstrikesharp-linux-${{ needs.setup.outputs.gitversion_semver }}.zip *)
|
||||
(cd build/windows && zip -qq -r ../../counterstrikesharp-windows-${{ needs.setup.outputs.gitversion_semver }}.zip *)
|
||||
|
||||
- name: Add dotnet runtime
|
||||
run: |
|
||||
mkdir -p build/linux/addons/counterstrikesharp/dotnet
|
||||
curl -s -L https://download.visualstudio.microsoft.com/download/pr/c1371dc2-eed2-47be-9af3-ae060dbe3c7d/bd509e0a87629764ed47608466d183e6/aspnetcore-runtime-8.0.3-linux-x64.tar.gz \
|
||||
| tar xvz -C build/linux/addons/counterstrikesharp/dotnet
|
||||
|
||||
mkdir -p build/windows/addons/counterstrikesharp/dotnet
|
||||
curl -s -L https://download.visualstudio.microsoft.com/download/pr/086d1dd6-57a5-437a-a1ef-549cf702fb48/dd4a8fe6c53a1016a414d6f2925c1323/aspnetcore-runtime-8.0.3-win-x64.zip -o dotnet.zip
|
||||
unzip -qq dotnet.zip -d build/windows/addons/counterstrikesharp/dotnet
|
||||
|
||||
- name: Zip Builds
|
||||
run: |
|
||||
(cd build/linux && zip -qq -r ../../counterstrikesharp-with-runtime-linux-${{ needs.setup.outputs.gitversion_semver }}.zip *)
|
||||
(cd build/windows && zip -qq -r ../../counterstrikesharp-with-runtime-windows-${{ needs.setup.outputs.gitversion_semver }}.zip *)
|
||||
|
||||
- name: Generate a changelog
|
||||
uses: orhun/git-cliff-action@v4
|
||||
id: git-cliff
|
||||
with:
|
||||
config: cliff.toml
|
||||
args: --current -s footer
|
||||
|
||||
- name: Release
|
||||
id: release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
append_body: true
|
||||
body: |
|
||||
${{ steps.git-cliff.outputs.content }}
|
||||
|
||||
Please refer to [CHANGELOG.md](https://github.com/roflmuffin/CounterStrikeSharp/blob/${{ github.ref_name }}/CHANGELOG.md) for details.
|
||||
files: |
|
||||
counterstrikesharp-windows-${{ needs.setup.outputs.gitversion_semver }}.zip
|
||||
counterstrikesharp-with-runtime-windows-${{ needs.setup.outputs.gitversion_semver }}.zip
|
||||
counterstrikesharp-linux-${{ needs.setup.outputs.gitversion_semver }}.zip
|
||||
counterstrikesharp-with-runtime-linux-${{ needs.setup.outputs.gitversion_semver }}.zip
|
||||
|
||||
- name: Publish NuGet package
|
||||
run: |
|
||||
dotnet nuget push build/api/CounterStrikeSharp.API.${{ needs.setup.outputs.gitversion_semver }}.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
|
||||
dotnet nuget push build/api/CounterStrikeSharp.API.${{ needs.setup.outputs.gitversion_semver }}.snupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
|
||||
|
||||
- name: Send Notification to Discord
|
||||
env:
|
||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
||||
uses: Ilshidur/action-discord@0.3.2
|
||||
with:
|
||||
args: |
|
||||
A new release of CS# has been tagged [v${{ needs.setup.outputs.gitversion_semver }}](${{ steps.release.outputs.url }})
|
||||
|
||||
${{ steps.git-cliff.outputs.content }}
|
||||
|
||||
Please refer to [CHANGELOG.md](https://github.com/roflmuffin/CounterStrikeSharp/blob/${{ github.ref_name }}/CHANGELOG.md) for details.
|
||||
248
.github/workflows/cmake-single-platform.yml
vendored
248
.github/workflows/cmake-single-platform.yml
vendored
@@ -1,248 +0,0 @@
|
||||
name: Build & Publish
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- "docfx/**"
|
||||
branches: ["main", "dev"]
|
||||
pull_request:
|
||||
branches: ["main", "dev"]
|
||||
|
||||
env:
|
||||
BUILD_TYPE: Release
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
permissions:
|
||||
contents: write
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
buildnumber: ${{ steps.buildnumber.outputs.build_number }}
|
||||
steps:
|
||||
- name: Generate build number
|
||||
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
|
||||
id: buildnumber
|
||||
uses: onyxmueller/build-tag-number@v1
|
||||
with:
|
||||
token: ${{secrets.github_token}}
|
||||
|
||||
build_windows:
|
||||
needs: setup
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Prepare env
|
||||
shell: bash
|
||||
run: echo "GITHUB_SHA_SHORT=${GITHUB_SHA::7}" >> $GITHUB_ENV
|
||||
|
||||
- name: Fallback build number
|
||||
if: ${{ github.event_name == 'pull_request' || github.ref != 'refs/heads/main' }}
|
||||
shell: bash
|
||||
run: echo "BUILD_NUMBER=0" >> $GITHUB_ENV
|
||||
|
||||
- name: Main build number
|
||||
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
|
||||
run: echo "BUILD_NUMBER=${{ needs.setup.outputs.buildnumber }}" >> $GITHUB_ENV
|
||||
|
||||
- name: Visual Studio environment
|
||||
shell: cmd
|
||||
run: |
|
||||
:: See https://github.com/microsoft/vswhere/wiki/Find-VC
|
||||
for /f "usebackq delims=*" %%i in (`vswhere -latest -property installationPath`) do (
|
||||
call "%%i"\Common7\Tools\vsdevcmd.bat -arch=x64 -host_arch=x64
|
||||
)
|
||||
|
||||
:: Loop over all environment variables and make them global.
|
||||
for /f "delims== tokens=1,2" %%a in ('set') do (
|
||||
echo>>"%GITHUB_ENV%" %%a=%%b
|
||||
)
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: "recursive"
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
mkdir -p build
|
||||
cd build
|
||||
cmake -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} ..
|
||||
cmake --build . --config ${{env.BUILD_TYPE}} -- /m:16
|
||||
|
||||
- name: Clean build directory
|
||||
run: |
|
||||
mkdir -p build/addons/counterstrikesharp/bin/win64
|
||||
mv build/${{env.BUILD_TYPE}}/*.dll build/addons/counterstrikesharp/bin/win64
|
||||
mkdir build/output/
|
||||
mv build/addons build/output
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: counterstrikesharp-build-windows-${{ env.GITHUB_SHA_SHORT }}
|
||||
path: build/output/
|
||||
|
||||
build_linux:
|
||||
needs: setup
|
||||
runs-on: ubuntu-latest
|
||||
# Could not figure out how to run in a container only on some matrix paths, so I've split it out into its own build.
|
||||
container:
|
||||
image: registry.gitlab.steamos.cloud/steamrt/sniper/sdk:latest
|
||||
steps:
|
||||
- name: Prepare env
|
||||
shell: bash
|
||||
run: echo "GITHUB_SHA_SHORT=${GITHUB_SHA::7}" >> $GITHUB_ENV
|
||||
|
||||
- name: Fallback build number
|
||||
if: ${{ github.event_name == 'pull_request' || github.ref != 'refs/heads/main' }}
|
||||
shell: bash
|
||||
run: echo "BUILD_NUMBER=0" >> $GITHUB_ENV
|
||||
|
||||
- name: Main build number
|
||||
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
|
||||
run: echo "BUILD_NUMBER=${{ needs.setup.outputs.buildnumber }}" >> $GITHUB_ENV
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: "recursive"
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
mkdir -p build
|
||||
cd build
|
||||
cmake -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} ..
|
||||
cmake --build . --config ${{env.BUILD_TYPE}} -- -j16
|
||||
|
||||
- name: Clean build directory
|
||||
run: |
|
||||
mkdir build/output/
|
||||
mv build/addons build/output
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: counterstrikesharp-build-linux-${{ env.GITHUB_SHA_SHORT }}
|
||||
path: build/output/
|
||||
|
||||
build_managed:
|
||||
needs: setup
|
||||
permissions:
|
||||
contents: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Prepare env
|
||||
shell: bash
|
||||
run: echo "GITHUB_SHA_SHORT=${GITHUB_SHA::7}" >> $GITHUB_ENV
|
||||
|
||||
- name: Fallback build number
|
||||
if: ${{ github.event_name == 'pull_request' || github.ref != 'refs/heads/main' }}
|
||||
shell: bash
|
||||
run: echo "BUILD_NUMBER=0" >> $GITHUB_ENV
|
||||
|
||||
- name: Main build number
|
||||
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
|
||||
run: echo "BUILD_NUMBER=${{ needs.setup.outputs.buildnumber }}" >> $GITHUB_ENV
|
||||
|
||||
# We don't need expensive submodules for the managed side.
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Build runtime v${{ env.BUILD_NUMBER }}
|
||||
uses: actions/setup-dotnet@v3
|
||||
with:
|
||||
dotnet-version: "8.0.x"
|
||||
|
||||
- name: Install dependencies
|
||||
run: dotnet restore managed/CounterStrikeSharp.sln
|
||||
|
||||
- name: Run tests
|
||||
run: dotnet test --logger trx --results-directory "TestResults-${{ env.GITHUB_SHA_SHORT }}" managed/CounterStrikeSharp.API.Tests/CounterStrikeSharp.API.Tests.csproj
|
||||
|
||||
- name: Upload dotnet test results
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: test-results-${{ env.GITHUB_SHA_SHORT }}
|
||||
path: TestResults-${{ env.GITHUB_SHA_SHORT }}
|
||||
if: ${{ always() }}
|
||||
|
||||
- name: Publish artifacts
|
||||
run: |
|
||||
dotnet publish -c Release /p:Version=1.0.${{ env.BUILD_NUMBER }} managed/CounterStrikeSharp.API
|
||||
dotnet pack -c Release /p:Version=1.0.${{ env.BUILD_NUMBER }} managed/CounterStrikeSharp.API
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: counterstrikesharp-build-api-${{ env.GITHUB_SHA_SHORT }}
|
||||
path: managed/CounterStrikeSharp.API/bin/Release
|
||||
|
||||
publish:
|
||||
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
|
||||
permissions:
|
||||
contents: write
|
||||
needs: ["setup", "build_linux", "build_windows", "build_managed"]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Prepare env
|
||||
shell: bash
|
||||
run: echo "GITHUB_SHA_SHORT=${GITHUB_SHA::7}" >> $GITHUB_ENV
|
||||
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: counterstrikesharp-build-windows-${{ env.GITHUB_SHA_SHORT }}
|
||||
path: build/windows
|
||||
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: counterstrikesharp-build-linux-${{ env.GITHUB_SHA_SHORT }}
|
||||
path: build/linux
|
||||
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: counterstrikesharp-build-api-${{ env.GITHUB_SHA_SHORT }}
|
||||
path: build/api
|
||||
|
||||
# TODO: This stuff should really be in a matrix
|
||||
- name: Add API to Artifacts
|
||||
run: |
|
||||
mkdir -p build/linux/addons/counterstrikesharp/api
|
||||
mkdir -p build/windows/addons/counterstrikesharp/api
|
||||
cp -r build/api/net8.0/publish/* build/linux/addons/counterstrikesharp/api
|
||||
cp -r build/api/net8.0/publish/* build/windows/addons/counterstrikesharp/api
|
||||
|
||||
- name: Zip Builds
|
||||
run: |
|
||||
(cd build/linux && zip -qq -r ../../counterstrikesharp-build-${{ needs.setup.outputs.buildnumber }}-linux-${{ env.GITHUB_SHA_SHORT }}.zip *)
|
||||
(cd build/windows && zip -qq -r ../../counterstrikesharp-build-${{ needs.setup.outputs.buildnumber }}-windows-${{ env.GITHUB_SHA_SHORT }}.zip *)
|
||||
|
||||
- name: Add dotnet runtime
|
||||
run: |
|
||||
mkdir -p build/linux/addons/counterstrikesharp/dotnet
|
||||
curl -s -L https://download.visualstudio.microsoft.com/download/pr/c1371dc2-eed2-47be-9af3-ae060dbe3c7d/bd509e0a87629764ed47608466d183e6/aspnetcore-runtime-8.0.3-linux-x64.tar.gz \
|
||||
| tar xvz -C build/linux/addons/counterstrikesharp/dotnet
|
||||
|
||||
mkdir -p build/windows/addons/counterstrikesharp/dotnet
|
||||
curl -s -L https://download.visualstudio.microsoft.com/download/pr/086d1dd6-57a5-437a-a1ef-549cf702fb48/dd4a8fe6c53a1016a414d6f2925c1323/aspnetcore-runtime-8.0.3-win-x64.zip -o dotnet.zip
|
||||
unzip -qq dotnet.zip -d build/windows/addons/counterstrikesharp/dotnet
|
||||
|
||||
- name: Zip Builds
|
||||
run: |
|
||||
(cd build/linux && zip -qq -r ../../counterstrikesharp-with-runtime-build-${{ needs.setup.outputs.buildnumber }}-linux-${{ env.GITHUB_SHA_SHORT }}.zip *)
|
||||
(cd build/windows && zip -qq -r ../../counterstrikesharp-with-runtime-build-${{ needs.setup.outputs.buildnumber }}-windows-${{ env.GITHUB_SHA_SHORT }}.zip *)
|
||||
|
||||
- name: Release
|
||||
id: release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
tag_name: v${{ needs.setup.outputs.buildnumber }}
|
||||
files: |
|
||||
counterstrikesharp-build-${{ needs.setup.outputs.buildnumber }}-windows-${{ env.GITHUB_SHA_SHORT }}.zip
|
||||
counterstrikesharp-with-runtime-build-${{ needs.setup.outputs.buildnumber }}-windows-${{ env.GITHUB_SHA_SHORT }}.zip
|
||||
counterstrikesharp-build-${{ needs.setup.outputs.buildnumber }}-linux-${{ env.GITHUB_SHA_SHORT }}.zip
|
||||
counterstrikesharp-with-runtime-build-${{ needs.setup.outputs.buildnumber }}-linux-${{ env.GITHUB_SHA_SHORT }}.zip
|
||||
|
||||
- name: Publish NuGet package
|
||||
run: |
|
||||
dotnet nuget push build/api/CounterStrikeSharp.API.1.0.${{ needs.setup.outputs.buildnumber }}.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
|
||||
dotnet nuget push build/api/CounterStrikeSharp.API.1.0.${{ needs.setup.outputs.buildnumber }}.snupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
|
||||
|
||||
- name: Send Notification to Discord
|
||||
env:
|
||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
||||
uses: Ilshidur/action-discord@0.3.2
|
||||
with:
|
||||
args: "A new release of CS# has been tagged (v${{ needs.setup.outputs.buildnumber }}) at ${{ steps.release.outputs.url }}"
|
||||
25
.github/workflows/lint-code.yaml
vendored
Normal file
25
.github/workflows/lint-code.yaml
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
name: Code format checks
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/**'
|
||||
- 'src/**'
|
||||
- '.clang-format'
|
||||
push:
|
||||
paths:
|
||||
- '.github/workflows/**'
|
||||
- 'src/**'
|
||||
- '.clang-format'
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
name: Lint code with clang-format
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: jidicula/clang-format-action@4726374d1aa3c6aecf132e5197e498979588ebc8
|
||||
with:
|
||||
clang-format-version: '20'
|
||||
check-path: 'src'
|
||||
exclude-regex: '(sdk|\.proto)'
|
||||
11
.github/workflows/publish-docs.yml
vendored
11
.github/workflows/publish-docs.yml
vendored
@@ -2,6 +2,7 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
@@ -22,10 +23,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Dotnet Setup
|
||||
uses: actions/setup-dotnet@v3
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: 8.x
|
||||
|
||||
@@ -34,13 +35,13 @@ jobs:
|
||||
- run: docfx docfx/docfx.json
|
||||
|
||||
- name: Setup Pages
|
||||
uses: actions/configure-pages@v3
|
||||
uses: actions/configure-pages@v4
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v2
|
||||
uses: actions/upload-pages-artifact@v3
|
||||
with:
|
||||
path: "docfx/_site"
|
||||
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v2
|
||||
uses: actions/deploy-pages@v4
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,7 +2,6 @@
|
||||
.cmake/
|
||||
cmake-build-*/
|
||||
.kdev4/
|
||||
generated/
|
||||
!**/protobuf/generated/
|
||||
|
||||
# configure_file auto generated.
|
||||
|
||||
50
.vscode/tasks.json
vendored
Normal file
50
.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
{
|
||||
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
||||
// for the documentation about the tasks.json format
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "sync-linux",
|
||||
"type": "shell",
|
||||
"command": "lftp -c \"open -u $LINUX_SERVER_SFTP_USERNAME,$LINUX_SERVER_SFTP_PASSWORD $LINUX_SERVER_SFTP_HOST; mirror -R ${workspaceFolder}/build/addons /game/csgo/addons; mirror -R ${workspaceFolder}/managed/CounterStrikeSharp.API/bin/Release/net8.0/ /game/csgo/addons/counterstrikesharp/api; mirror -R ${workspaceFolder}/managed/CounterStrikeSharp.Tests.Native/bin/Debug/net8.0/ /game/csgo/addons/counterstrikesharp/plugins/NativeTestsPlugin\"",
|
||||
"dependsOn": [
|
||||
"build",
|
||||
"build-api",
|
||||
"build-test-plugin"
|
||||
],
|
||||
"problemMatcher": []
|
||||
},
|
||||
{
|
||||
"label": "build",
|
||||
"type": "shell",
|
||||
"group": "build",
|
||||
"command": "cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -G Ninja && cmake --build build -j$(nproc)",
|
||||
},
|
||||
{
|
||||
"label": "build-api",
|
||||
"type": "shell",
|
||||
"group": "build",
|
||||
"command": "dotnet build -c Release",
|
||||
"options": {
|
||||
"cwd": "${workspaceFolder}/managed/CounterStrikeSharp.API"
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "build-test-plugin",
|
||||
"type": "shell",
|
||||
"group": "build",
|
||||
"command": "dotnet build -c Debug",
|
||||
"options": {
|
||||
"cwd": "${workspaceFolder}/managed/CounterStrikeSharp.Tests.Native"
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "generate-schema",
|
||||
"type": "shell",
|
||||
"command": "dotnet run -- ../CounterStrikeSharp.API/Core/Schema",
|
||||
"options": {
|
||||
"cwd": "${workspaceFolder}/managed/CounterStrikeSharp.SchemaGen"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
1528
CHANGELOG.md
Normal file
1528
CHANGELOG.md
Normal file
File diff suppressed because it is too large
Load Diff
@@ -7,6 +7,11 @@ include("makefiles/shared.cmake")
|
||||
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
||||
|
||||
set(FUNCHOOK_BUILD_TESTS OFF CACHE BOOL "Disable building tests for funchook." FORCE)
|
||||
set(ZYDIS_BUILD_EXAMPLES OFF CACHE BOOL "Disable building examples for Zydis." FORCE)
|
||||
set(ZYDIS_BUILD_TOOLS OFF CACHE BOOL "Disable building tools for Zydis." FORCE)
|
||||
set(DYNOHOOK_BUILD_TESTS OFF CACHE BOOL "Disable building tests for funchook." FORCE)
|
||||
|
||||
add_subdirectory(libraries/spdlog)
|
||||
add_subdirectory(libraries/dyncall)
|
||||
add_subdirectory(libraries/funchook)
|
||||
@@ -43,6 +48,8 @@ set(SOURCE_FILES
|
||||
src/core/coreconfig.cpp
|
||||
src/core/gameconfig.h
|
||||
src/core/gameconfig.cpp
|
||||
src/core/gameconfig_updater.h
|
||||
src/core/gameconfig_updater.cpp
|
||||
src/core/log.h
|
||||
src/core/log.cpp
|
||||
src/scripting/script_engine.h
|
||||
@@ -70,6 +77,7 @@ set(SOURCE_FILES
|
||||
src/core/managers/con_command_manager.cpp
|
||||
src/core/managers/con_command_manager.h
|
||||
src/scripting/natives/natives_commands.cpp
|
||||
src/scripting/natives/natives_convars.cpp
|
||||
src/core/memory_module.h
|
||||
src/core/memory_module.cpp
|
||||
src/core/cs2_sdk/interfaces/cgameresourceserviceserver.h
|
||||
@@ -83,6 +91,9 @@ set(SOURCE_FILES
|
||||
src/scripting/natives/natives_schema.cpp
|
||||
src/scripting/natives/natives_entities.cpp
|
||||
src/scripting/natives/natives_voice.cpp
|
||||
src/scripting/natives/natives_metamod.cpp
|
||||
src/scripting/natives/natives_cvariant.cpp
|
||||
src/scripting/natives/natives_cutil.cpp
|
||||
src/core/managers/entity_manager.cpp
|
||||
src/core/managers/entity_manager.h
|
||||
src/core/managers/chat_manager.cpp
|
||||
|
||||
17
Dockerfile
Normal file
17
Dockerfile
Normal file
@@ -0,0 +1,17 @@
|
||||
FROM registry.gitlab.steamos.cloud/steamrt/sniper/sdk:latest
|
||||
|
||||
WORKDIR /workspace
|
||||
|
||||
RUN apt update && apt install -y \
|
||||
clang-16 \
|
||||
cmake \
|
||||
ninja-build \
|
||||
git \
|
||||
zlib1g-dev \
|
||||
libssl-dev \
|
||||
libprotobuf-dev \
|
||||
protobuf-compiler \
|
||||
pkg-config \
|
||||
curl && \
|
||||
ln -sf /usr/bin/clang-16 /usr/bin/clang && \
|
||||
ln -sf /usr/bin/clang++-16 /usr/bin/clang++
|
||||
1
GitVersion.yml
Normal file
1
GitVersion.yml
Normal file
@@ -0,0 +1 @@
|
||||
workflow: GitHubFlow/v1
|
||||
85
cliff.toml
Normal file
85
cliff.toml
Normal file
@@ -0,0 +1,85 @@
|
||||
# git-cliff ~ configuration file
|
||||
# https://git-cliff.org/docs/configuration
|
||||
|
||||
[remote.github]
|
||||
owner = "roflmuffin"
|
||||
repo = "CounterStrikeSharp"
|
||||
# token = ""
|
||||
|
||||
[changelog]
|
||||
# A Tera template to be rendered for each release in the changelog.
|
||||
# See https://keats.github.io/tera/docs/#introduction
|
||||
body = """
|
||||
## What's Changed
|
||||
|
||||
{%- if version %} in {{ version }}{%- endif -%}
|
||||
{% for commit in commits %}
|
||||
* {{ commit.message | split(pat="\n") | first | trim }}\
|
||||
{% if commit.remote.username and commit.remote.username != remote.github.owner %} by \
|
||||
[@{{ commit.remote.username }}](https://github.com/{{ commit.remote.username }}) \
|
||||
{%- endif -%}
|
||||
{% if commit.remote.pr_number %} in \
|
||||
[#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull/{{ commit.remote.pr_number }})\
|
||||
{%- endif %}
|
||||
{%- if commit.id %} ([{{ commit.id | truncate(length=7, end="") }}]({{ self::remote_url()}}/commit/{{ commit.id }})){%- endif -%}
|
||||
|
||||
{%- endfor -%}
|
||||
|
||||
{%- if github -%}
|
||||
{% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
|
||||
{% raw %}\n{% endraw -%}
|
||||
## New Contributors
|
||||
{%- endif %}\
|
||||
{% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %}
|
||||
* [@{{ contributor.username }}](https://github.com/{{ contributor.username }}) made their first contribution
|
||||
{%- if contributor.pr_number %} in \
|
||||
[#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \
|
||||
{%- endif %}
|
||||
{%- endfor -%}
|
||||
{%- endif -%}
|
||||
|
||||
{% if version %}
|
||||
|
||||
{% else -%}
|
||||
{% raw %}\n{% endraw %}
|
||||
{% endif %}
|
||||
|
||||
{%- macro remote_url() -%}
|
||||
https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}
|
||||
{%- endmacro -%}
|
||||
"""
|
||||
# Remove leading and trailing whitespaces from the changelog's body.
|
||||
trim = true
|
||||
# A Tera template to be rendered as the changelog's footer.
|
||||
# See https://keats.github.io/tera/docs/#introduction
|
||||
footer = """
|
||||
<!-- generated by git-cliff -->
|
||||
"""
|
||||
# An array of regex based postprocessors to modify the changelog.
|
||||
# Replace the placeholder `<REPO>` with a URL.
|
||||
postprocessors = []
|
||||
|
||||
[git]
|
||||
# Parse commits according to the conventional commits specification.
|
||||
# See https://www.conventionalcommits.org
|
||||
conventional_commits = false
|
||||
# Exclude commits that do not match the conventional commits specification.
|
||||
filter_unconventional = true
|
||||
# Split commits on newlines, treating each line as an individual commit.
|
||||
split_commits = false
|
||||
# An array of regex based parsers to modify commit messages prior to further processing.
|
||||
commit_preprocessors = [
|
||||
{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" },
|
||||
{ pattern = '\[no ci\]', replace = "" }
|
||||
]
|
||||
commit_parsers = [
|
||||
{ message = "^release:", skip = true }
|
||||
]
|
||||
# Exclude commits that are not matched by any commit parser.
|
||||
filter_commits = false
|
||||
# Order releases topologically instead of chronologically.
|
||||
topo_order = false
|
||||
# Order of commits in each group/release within the changelog.
|
||||
# Allowed values: newest, oldest
|
||||
sort_commits = "newest"
|
||||
tag_pattern = "v[0-9]+\\.[0-9]+\\.[0-9]+"
|
||||
@@ -4,7 +4,10 @@
|
||||
"FollowCS2ServerGuidelines": true,
|
||||
"PluginHotReloadEnabled": true,
|
||||
"PluginAutoLoadEnabled": true,
|
||||
"PluginResolveNugetPackages": false,
|
||||
"ServerLanguage": "en",
|
||||
"UnlockConCommands": true,
|
||||
"UnlockConVars": true
|
||||
"UnlockConVars": true,
|
||||
"AutoUpdateEnabled": true,
|
||||
"AutoUpdateURL": "http://gamedata.cssharp.dev"
|
||||
}
|
||||
@@ -2,62 +2,62 @@
|
||||
"UTIL_ClientPrintAll": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 48 81 EC 70 01 ? ? 8B E9",
|
||||
"linux": "55 48 89 E5 41 57 49 89 D7 41 56 49 89 F6 41 55 41 89 FD"
|
||||
"windows": "48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 48 83 EC 60 8B E9",
|
||||
"linux": "55 48 89 E5 41 57 4D 89 CF 41 56 4D 89 C6 41 55 49 89 CD 41 54 49 89 D4 53 48 8D"
|
||||
}
|
||||
},
|
||||
"ClientPrint": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 85 C9 0F 84 ? ? ? ? 48 89 5C 24 ? 55",
|
||||
"linux": "55 48 89 E5 41 57 49 89 CF 41 56 49 89 D6 41 55 41 89 F5 41 54 4C 8D A5 A0 FE FF FF"
|
||||
"linux": "55 48 8D 05 ? ? ? ? 48 89 E5 41 57 41 89 F7 31 F6"
|
||||
}
|
||||
},
|
||||
"CCSPlayerController_SwitchTeam": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "40 56 57 48 81 EC ? ? ? ? 48 8B F9 8B F2 8B CA",
|
||||
"linux": "55 48 89 E5 41 55 49 89 FD 89 F7"
|
||||
"windows": "40 53 57 48 81 EC ? ? ? ? 48 8B D9 8B FA",
|
||||
"linux": "55 48 89 E5 41 54 49 89 FC 89 F7"
|
||||
}
|
||||
},
|
||||
"CCSPlayerController_ChangeTeam": {
|
||||
"offsets": {
|
||||
"windows": 98,
|
||||
"linux": 97
|
||||
"windows": 109,
|
||||
"linux": 108
|
||||
}
|
||||
},
|
||||
"CCSPlayerController_Respawn": {
|
||||
"offsets": {
|
||||
"windows": 254,
|
||||
"linux": 256
|
||||
"windows": 277,
|
||||
"linux": 279
|
||||
}
|
||||
},
|
||||
"CBasePlayerController_SetPawn": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 89 74 24 ? 55 41 54 41 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 4C 8B F9",
|
||||
"linux": "55 48 89 E5 41 57 41 56 41 55 49 89 FD 41 54 45 89 C4"
|
||||
"windows": "44 88 4C 24 ? 53 57",
|
||||
"linux": "55 48 8D 87 ? ? ? ? 48 89 E5 41 57 41 56 41 89 CE 41 55 45 89 CD"
|
||||
}
|
||||
},
|
||||
"CCSPlayerPawnBase_PostThink": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 ? ? 55 53 56 57 41 ? 48 ? ? ? 48 ? ? ? ? ? ? 4C 89 68",
|
||||
"linux": "55 48 89 E5 41 56 41 55 41 54 53 48 89 FB 48 83 EC 30 E8 ? ? ? ?"
|
||||
"linux": "55 48 89 E5 41 56 41 55 41 54 53 48 89 FB 48 83 EC 40 E8 ? ? ? ? F3 0F 10 83"
|
||||
}
|
||||
},
|
||||
"CGameEventManager_Init": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "40 53 48 83 EC 20 48 8B 01 48 8B D9 FF 50 10",
|
||||
"linux": "55 48 89 E5 41 54 49 89 FC 48 83 EC 08 48 8B 07 FF 50 18"
|
||||
"linux": "55 48 89 E5 53 48 89 FB 48 83 EC 08 48 8B 07 FF 50 18"
|
||||
}
|
||||
},
|
||||
"GiveNamedItem": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 89 5C 24 ? 48 89 74 24 ? 55 57 41 ? 41 ? 41 ? 48 ? ? ? ? 48 ? ? ? ? ? ? 4D ? ? 48",
|
||||
"linux": "55 48 89 E5 41 57 41 56 49 89 D6 41 55 49 89 CD 41 54 49 89 F4 53 48 89 FB 48 8D 3D"
|
||||
"windows": "48 89 5C 24 ? 48 89 74 24 ? 55 57 41 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 4D 8B F9",
|
||||
"linux": "55 48 89 E5 41 57 41 56 41 55 41 54 53 48 81 EC D8 00 00 00 48 89 8D 18 FF FF FF"
|
||||
}
|
||||
},
|
||||
"UTIL_Remove": {
|
||||
@@ -67,43 +67,50 @@
|
||||
"linux": "48 89 FE 48 85 FF 74 ? 48 8D 05 ? ? ? ? 48"
|
||||
}
|
||||
},
|
||||
"Host_Say": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "44 89 4C 24 20 44 88 44 24 18",
|
||||
"linux": "55 48 89 E5 41 57 41 56 41 89 D6 41 55 4D 89 C5"
|
||||
}
|
||||
},
|
||||
"CBaseModelEntity_SetModel": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 89 5C 24 ? 48 89 7C 24 ? 55 48 8B EC 48 83 EC 50 48 8B F9 4C 8B C2",
|
||||
"linux": "55 48 89 F2 48 89 E5 41 54 49 89 FC 48 8D 7D E0 48 83 EC ? 48 8D 05 ? ? ? ? 48 8B 30 48 8B 06"
|
||||
"windows": "40 53 48 83 EC ? 48 8B D9 4C 8B C2 48 8B 0D ? ? ? ? 48 8D 54 24 ? 48 8B 01 FF 50 ? 48 8B 44 24 ? 48 8D 54 24 ? 48 8B CB 48 89 44 24 ? E8 ? ? ? ? 48 83 C4 ? 5B C3 CC CC CC CC CC 48 89 5C 24",
|
||||
"linux": "55 48 89 F2 48 89 E5 53 48 89 FB 48 8D 7D ? 48 83 EC ? 48 8D 05 ? ? ? ? 48 8B 30 48 8B 06 FF 50 ? 48 8B 45 ? 48 8D 75 ? 48 89 DF 48 89 45 ? E8 ? ? ? ? 48 8B 5D ? C9 C3 CC CC CC 55"
|
||||
}
|
||||
},
|
||||
"CCSPlayer_WeaponServices_CanUse": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 89 5C 24 10 48 89 6C 24 18 56 57 41 56 48 83 EC 30 48 8B 01",
|
||||
"linux": "55 48 8D 15 ? ? ? ? 48 89 E5 41 55 49 89 FD 41 54 49 89 F4"
|
||||
"windows": "48 89 5C 24 ? 48 89 6C 24 ? 56 57 41 56 48 83 EC ? 48 8B 01 48 8B FA",
|
||||
"linux": "55 48 8D 15 ? ? ? ? 48 89 E5 41 55 41 54 49 89 FC 53 48 89 F3 48 83 EC ? 48 8B 07 48 8B 80 ? ? ? ?"
|
||||
}
|
||||
},
|
||||
"CCSPlayer_ItemServices_CanAcquire": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "44 89 44 24 ? 48 89 54 24 ? 48 89 4C 24 ? 55 53 56 57 41 55 41 56 41 57 48 8B EC",
|
||||
"linux": "55 48 89 E5 41 57 41 56 41 55 49 89 CD 41 54 49 89 FC 53 48 89 F3 48 83 EC 78"
|
||||
}
|
||||
},
|
||||
"GetCSWeaponDataFromKey": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 89 5C 24 ? 57 48 83 EC ? 33 FF 4C 8B CA 8B D9",
|
||||
"linux": "55 31 D2 48 89 E5 41 56 41 55 41 54"
|
||||
}
|
||||
},
|
||||
"CCSPlayer_ItemServices_GiveNamedItem": {
|
||||
"offsets": {
|
||||
"windows": 17,
|
||||
"linux": 18
|
||||
}
|
||||
},
|
||||
"CCSPlayer_ItemServices_DropActivePlayerWeapon": {
|
||||
"offsets": {
|
||||
"windows": 18,
|
||||
"linux": 19
|
||||
}
|
||||
},
|
||||
"CCSPlayer_ItemServices_DropActivePlayerWeapon": {
|
||||
"offsets": {
|
||||
"windows": 21,
|
||||
"linux": 22
|
||||
}
|
||||
},
|
||||
"CCSPlayer_ItemServices_RemoveWeapons": {
|
||||
"offsets": {
|
||||
"windows": 19,
|
||||
"linux": 20
|
||||
"windows": 22,
|
||||
"linux": 23
|
||||
}
|
||||
},
|
||||
"CGameSceneNode_GetSkeletonInstance": {
|
||||
@@ -116,7 +123,19 @@
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 8B C4 4C 89 48 ? 48 89 48 ? 55 56",
|
||||
"linux": "55 48 89 E5 41 57 41 56 41 55 41 54 49 89 FC 53 48 81 EC 88 00 00 00 48 8D 05 ? ? ? ?"
|
||||
"linux": "55 48 89 E5 41 57 41 56 49 89 FE 41 55 41 54 53 48 81 EC ? ? ? ? 48 8D 05 ? ? ? ? F3 0F 11 85"
|
||||
}
|
||||
},
|
||||
"CCSGameRules_FindPickerEntity": {
|
||||
"offsets": {
|
||||
"windows": 25,
|
||||
"linux": 26
|
||||
}
|
||||
},
|
||||
"CTakeDamageInfo_HitGroup": {
|
||||
"offsets": {
|
||||
"windows": 104,
|
||||
"linux": 104
|
||||
}
|
||||
},
|
||||
"UTIL_CreateEntityByName": {
|
||||
@@ -130,84 +149,77 @@
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 89 5C 24 10 57 48 83 EC 30 48 8B DA 48 8B F9 48 85 C9",
|
||||
"linux": "48 85 FF 74 ? 55 48 89 E5 41 56"
|
||||
"linux": "48 85 FF 74 ? 55 48 89 E5 41 55 49 89 FD"
|
||||
}
|
||||
},
|
||||
"CBaseEntity_EmitSoundFilter": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "40 53 48 83 EC ? 4C 89 4C 24 ? 48 8B D9 45 8B C8",
|
||||
"linux": "55 48 89 E5 53 48 89 FB 48 83 EC ? E8 ? ? ? ? 48 89 D8 48 8B 5D ? C9 C3 CC CC CC CC CC CC 48 B8"
|
||||
}
|
||||
},
|
||||
"CEntityInstance_AcceptInput": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 89 5C 24 10 48 89 74 24 18 57 48 83 EC 40 49 8B F0",
|
||||
"linux": "55 48 89 E5 41 57 49 89 FF 41 56 48 8D 7D C0"
|
||||
"windows": "89 5C 24 ? 48 89 74 24 ? 57 48 83 EC ? 49 8B F0 48 8B D9 48 8B 0D",
|
||||
"linux": "55 48 89 F0 48 89 E5 41 57 49 89 FF 41 56 48 8D 7D C0"
|
||||
}
|
||||
},
|
||||
"CEntitySystem_AddEntityIOEvent": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 89 5C 24 ? 48 89 74 24 ? 57 48 ? ? ? 49 ? ? 48 ? ? 48 ? ? 74",
|
||||
"linux": "55 41 BA FF FF FF FF"
|
||||
"windows": "48 89 5C 24 ? 4C 89 4C 24 ? 48 89 4C 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 83 EC ? 49 8B F9",
|
||||
"linux": "55 48 89 E5 41 55 49 89 CD 41 54 49 89 FC"
|
||||
}
|
||||
},
|
||||
"LegacyGameEventListener": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 8B 15 ? ? ? ? 48 85 D2 74 ? 85 C9 74",
|
||||
"linux": "48 8B 05 ? ? ? ? 48 85 C0 74 ? 85 FF"
|
||||
"windows": "48 8B 15 ? ? ? ? 48 85 D2 74 ? 83 F9 ? 77 ? 48 63 C1 48 C1 E0",
|
||||
"linux": "48 8B 05 ? ? ? ? 48 85 C0 74 ? 83 FF ? 77 ? 48 63 FF 48 C1 E7 ? 48 8D 44 38"
|
||||
}
|
||||
},
|
||||
"CBasePlayerPawn_CommitSuicide": {
|
||||
"offsets": {
|
||||
"windows": 372,
|
||||
"linux": 372
|
||||
"windows": 408,
|
||||
"linux": 408
|
||||
}
|
||||
},
|
||||
"CBasePlayerPawn_RemovePlayerItem": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 ? ? 0F 84 ? ? ? ? 48 89 5C 24 ? 57 48 ? ? ? 48 ? ? 48 ? ? E8",
|
||||
"linux": "55 48 89 ? 41 ? 49 89 ? 41 ? 49 89 ? E8 ? ? ? ? 49 39"
|
||||
"linux": "55 48 89 E5 41 54 49 89 FC 53 48 89 F3 E8 ? ? ? ? 48 39 C3 74 ? 4C 89 E7 E8 ? ? ? ? 48 39 C3 74 ? 4C 89 E7 48 89 DE E8 ? ? ? ? 48 89 DF 5B 41 5C 5D E9 ? ? ? ? 0F 1F 44 00 00"
|
||||
}
|
||||
},
|
||||
"CBaseEntity_Teleport": {
|
||||
"offsets": {
|
||||
"windows": 155,
|
||||
"linux": 154
|
||||
"windows": 168,
|
||||
"linux": 167
|
||||
}
|
||||
},
|
||||
"CBaseEntity_TakeDamageOld": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 89 74 24 20 57 48 83 EC 60 48 8B 41 10",
|
||||
"linux": "55 48 89 E5 41 57 41 56 41 55 41 54 49 89 FC 53 48 83 EC 48 4C 8D 2D ? ? ? ? 49 8B 7D 00 48 85 FF 0F 84 ? ? ? ?"
|
||||
"windows": "40 55 41 54 41 55 41 56 41 57 48 81 EC ? ? ? ? 48 8D 6C 24 ? 48 89 9D ? ? ? ? 45 33 ED",
|
||||
"linux": "55 48 89 E5 41 57 41 56 49 89 F6 41 55 41 54 49 89 FC 53 48 89 D3 48 83 EC ? 48 85 D2"
|
||||
}
|
||||
},
|
||||
"CBaseTrigger_StartTouch": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "41 56 41 57 48 83 EC 58 48 8B 01",
|
||||
"linux": "55 48 89 E5 41 56 49 89 F6 41 55 49 89 FD 41 54 53 BB"
|
||||
"windows": "40 57 41 56 48 83 EC ? 48 8B 01",
|
||||
"linux": "55 48 89 E5 41 56 41 55 49 89 F5 41 54 53 48 89 FB 48 83 EC 10 48 8B 07"
|
||||
}
|
||||
},
|
||||
"CBaseTrigger_EndTouch": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "40 53 57 41 55 48 83 EC 40",
|
||||
"windows": "40 53 41 55 48 83 EC 28",
|
||||
"linux": "55 BA FF FF FF FF 48 89 E5 41 57 41 56 41 55 49 89 F5 41"
|
||||
}
|
||||
},
|
||||
"StateChanged": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "40 ? 53 56 41 ? 41 ? 48 ? ? ? ? 48 ? ? ? ? ? ? 48 ? ? 45",
|
||||
"linux": "55 48 89 E5 41 57 41 56 41 55 41 54 53 89 D3"
|
||||
}
|
||||
},
|
||||
"NetworkStateChanged": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "4C 8B C9 48 8B 09 48 85 C9 74 ? 48 8B 41 10",
|
||||
"linux": "4C 8B 07 4D 85 C0 74 ? 49 8B 40 10"
|
||||
}
|
||||
},
|
||||
"GameEntitySystem": {
|
||||
"offsets": {
|
||||
"windows": 88,
|
||||
@@ -223,15 +235,15 @@
|
||||
"CEntityIOOutput_FireOutputInternal": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "4C 89 4C 24 20 53 55 57 41 54 41 56 48 81 EC",
|
||||
"linux": "55 48 89 E5 41 57 41 56 41 55 41 54 49 89 D4 53 48 89 F3 48 83 EC 58"
|
||||
"windows": "4C 89 4C 24 ? 48 89 4C 24 ? 53 56",
|
||||
"linux": "55 48 89 E5 41 57 49 89 FF 41 56 41 55 41 54 49 89 D4 53 48 89 F3"
|
||||
}
|
||||
},
|
||||
"IGameSystem_InitAllSystems_pFirst": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 8B 1D ? ? ? ? 48 85 DB 0F 84 ? ? ? ? BE ? ? ? ? 0F 1F 00 48 8B 7B 10",
|
||||
"linux": "4C 8B 35 ? ? ? ? 4D 85 F6 75 2D E9 ? ? ? ? 0F 1F 40 00 48 8B 05"
|
||||
"windows": "48 8B 1D ? ? ? ? 48 85 DB 0F 84 ? ? ? ? BD",
|
||||
"linux": "4C 8B 35 ? ? ? ? 4D 85 F6 75"
|
||||
}
|
||||
},
|
||||
"CEntityResourceManifest_AddResource": {
|
||||
@@ -239,5 +251,44 @@
|
||||
"windows": 2,
|
||||
"linux": 0
|
||||
}
|
||||
},
|
||||
"CheckTransmit": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "48 8B C4 4C 89 48 ? 48 89 50 ? 48 89 48 ? 55 48 8D A8",
|
||||
"linux": "55 48 89 E5 41 57 49 89 FF 41 56 48 8D 3D ? ? ? ? 41 55 41 89 D5"
|
||||
}
|
||||
},
|
||||
"CheckTransmitPlayerSlot": {
|
||||
"offsets": {
|
||||
"windows": 576,
|
||||
"linux": 576
|
||||
}
|
||||
},
|
||||
"NetworkStateChanged": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "4C 8B C2 48 8B D1 48 8B 09",
|
||||
"linux": "48 8B 07 48 85 C0 74 ? 48 8B 50 10"
|
||||
}
|
||||
},
|
||||
"SetStateChanged": {
|
||||
"offsets": {
|
||||
"windows": 25,
|
||||
"linux": 26
|
||||
}
|
||||
},
|
||||
"ISource2GameEntities::CheckTransmit": {
|
||||
"offsets": {
|
||||
"windows": 12,
|
||||
"linux": 13
|
||||
}
|
||||
},
|
||||
"Host_Say": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "44 89 4C 24 20 44 88 44 24 18",
|
||||
"linux": "55 48 89 E5 41 57 49 89 F7 41 56 41 55 41 54 4D 89 C4"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
27
configs/addons/counterstrikesharp/lang/en.json
Normal file
27
configs/addons/counterstrikesharp/lang/en.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"menu.button.previous": "Prev",
|
||||
"menu.button.next": "Next",
|
||||
"menu.button.close": "Close",
|
||||
|
||||
"all": "all players",
|
||||
"bots": "bots",
|
||||
"humans": "humans",
|
||||
"alive": "alive players",
|
||||
"dead": "dead players",
|
||||
"notme": "all players except self",
|
||||
"ct": "ct players",
|
||||
"t": "t players",
|
||||
"spec": "spec players",
|
||||
|
||||
"No matching client": "No matching client was found.",
|
||||
"No matching clients": "No matching clients were found.",
|
||||
"Target must be alive": "This command can only be used on alive players.",
|
||||
"Target must be dead": "This command can only be used on dead players.",
|
||||
"Unable to target": "You cannot target this player.",
|
||||
"Cannot target bot": "Unable to perform this command on a bot.",
|
||||
"More than one client matched": "More than one client matched the given pattern.",
|
||||
|
||||
"Missing permissions": "You are missing the correct permissions",
|
||||
"Missing one permission": "You do not have one of the correct permissions",
|
||||
"Command permission denied": "[CSS] {0} ({1}) to execute this command."
|
||||
}
|
||||
27
configs/addons/counterstrikesharp/lang/es.json
Normal file
27
configs/addons/counterstrikesharp/lang/es.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"menu.button.previous": "Anterior",
|
||||
"menu.button.next": "Siguiente",
|
||||
"menu.button.close": "Cerrar",
|
||||
|
||||
"all": "todos los jugadores",
|
||||
"bots": "bots",
|
||||
"humans": "humanos",
|
||||
"alive": "jugadores vivos",
|
||||
"dead": "jugadores muertos",
|
||||
"notme": "todos los jugadores excepto yo",
|
||||
"ct": "jugadores CT",
|
||||
"t": "jugadores T",
|
||||
"spec": "espectadores",
|
||||
|
||||
"No matching client": "No se encontró ningún cliente que coincida.",
|
||||
"No matching clients": "No se encontraron clientes que coincidan.",
|
||||
"Target must be alive": "Este comando solo puede usarse en jugadores vivos.",
|
||||
"Target must be dead": "Este comando solo puede usarse en jugadores muertos.",
|
||||
"Unable to target": "No puedes seleccionar a este jugador.",
|
||||
"Cannot target bot": "No se puede ejecutar este comando en un bot.",
|
||||
"More than one client matched": "Más de un cliente coincidió con el patrón dado.",
|
||||
|
||||
"Missing permissions": "No tienes los permisos correctos",
|
||||
"Missing one permission": "No tienes uno de los permisos correctos",
|
||||
"Command permission denied": "[CSS] {0} ({1}) para ejecutar este comando."
|
||||
}
|
||||
27
configs/addons/counterstrikesharp/lang/tr.json
Normal file
27
configs/addons/counterstrikesharp/lang/tr.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"menu.button.previous": "Geri",
|
||||
"menu.button.next": "İleri",
|
||||
"menu.button.close": "Çıkış",
|
||||
|
||||
"all": "tüm oyuncular",
|
||||
"bots": "botlar",
|
||||
"humans": "insanlar",
|
||||
"alive": "hayatta olan oyuncular",
|
||||
"dead": "ölü oyuncular",
|
||||
"notme": "kendi hariç tüm oyuncular",
|
||||
"ct": "CT oyuncular",
|
||||
"t": "T oyuncular",
|
||||
"spec": "izleyici oyuncular",
|
||||
|
||||
"No matching client": "{white}Eşleşen bir istemci bulunamadı.",
|
||||
"No matching clients": "{white}Eşleşen istemciler bulunamadı.",
|
||||
"Target must be alive": "{white}Bu komut yalnızca hayatta olan oyunculara uygulanabilir.",
|
||||
"Target must be dead": "{white}Bu komut yalnızca ölü oyunculara uygulanabilir.",
|
||||
"Unable to target": "{white}Bu oyuncu hedeflenemez.",
|
||||
"Cannot target bot": "{white}Bu komut bir bota uygulanamaz.",
|
||||
"More than one client matched": "{white}Verilen kalıba birden fazla istemci eşleşti.",
|
||||
|
||||
"Missing permissions": "{white}Doğru izinlere sahip değilsiniz",
|
||||
"Missing one permission": "{white}Doğru izinlerden birine sahip değilsiniz",
|
||||
"Command permission denied": "[CSS] {0} ({1}) bu komutu çalıştırmak için."
|
||||
}
|
||||
80
create-release.sh
Executable file
80
create-release.sh
Executable file
@@ -0,0 +1,80 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
DRY_RUN=false
|
||||
if [[ "$1" == "--dry-run" || "$1" == "-d" ]]; then
|
||||
DRY_RUN=true
|
||||
echo "Running in DRY-RUN mode - no changes will be pushed"
|
||||
fi
|
||||
|
||||
echo "Starting automated release process..."
|
||||
|
||||
echo "Fetching latest tags from remote..."
|
||||
git fetch --tags
|
||||
|
||||
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v1.0.0")
|
||||
echo "Latest tag found: $LATEST_TAG"
|
||||
|
||||
if [[ $LATEST_TAG =~ ^v([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then
|
||||
MAJOR=${BASH_REMATCH[1]}
|
||||
MINOR=${BASH_REMATCH[2]}
|
||||
PATCH=${BASH_REMATCH[3]}
|
||||
else
|
||||
echo "Error: Could not parse version from tag $LATEST_TAG"
|
||||
echo "Expected format: v1.0.x (e.g., v1.0.322)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
NEW_PATCH=$((PATCH + 1))
|
||||
NEW_TAG="v$MAJOR.$MINOR.$NEW_PATCH"
|
||||
|
||||
echo "New version will be: $NEW_TAG"
|
||||
|
||||
echo "Generating changelog with git-cliff..."
|
||||
npx git-cliff -o CHANGELOG.md -t "$NEW_TAG"
|
||||
|
||||
if ! git diff --quiet CHANGELOG.md; then
|
||||
echo "Changelog updated successfully"
|
||||
|
||||
git add CHANGELOG.md
|
||||
|
||||
COMMIT_MSG="release: $NEW_TAG"
|
||||
echo "Committing changelog with message: $COMMIT_MSG"
|
||||
|
||||
if [ "$DRY_RUN" = true ]; then
|
||||
git commit -m "$COMMIT_MSG"
|
||||
|
||||
echo "Creating tag locally: $NEW_TAG"
|
||||
git tag "$NEW_TAG"
|
||||
|
||||
echo "DRY-RUN: Would push commit to remote"
|
||||
echo "DRY-RUN: Would push tag to remote"
|
||||
else
|
||||
git commit -m "$COMMIT_MSG"
|
||||
|
||||
echo "Pushing commit to remote..."
|
||||
git push origin $(git branch --show-current)
|
||||
|
||||
echo "Creating and pushing tag: $NEW_TAG"
|
||||
git tag "$NEW_TAG"
|
||||
git push origin tag "$NEW_TAG"
|
||||
fi
|
||||
|
||||
echo "Release $NEW_TAG completed successfully!"
|
||||
echo "Summary:"
|
||||
echo " - Previous version: $LATEST_TAG"
|
||||
echo " - New version: $NEW_TAG"
|
||||
echo " - Changelog updated: Yes"
|
||||
if [ "$DRY_RUN" = true ]; then
|
||||
echo " - Commit pushed: (dry-run)"
|
||||
echo " - Tag created and pushed: (dry-run)"
|
||||
else
|
||||
echo " - Commit pushed: Yes"
|
||||
echo " - Tag created and pushed: Yes"
|
||||
fi
|
||||
else
|
||||
echo "No changes detected in CHANGELOG.md"
|
||||
echo "This might indicate that there are no new commits since the last release."
|
||||
exit 1
|
||||
fi
|
||||
@@ -54,6 +54,9 @@ The specific subclass of `GameEvent` will provide strongly typed parameters from
|
||||
|
||||
These event properties are mutable so you can update them as normal and they will update in the event instance.
|
||||
|
||||
> [!CAUTION]
|
||||
> `GameEvent` instances and their properties will cease to exist after the event listener function is called, which means that you will encounter errors when accessing properties in timers and functions like `Server.NextFrame()`. You should store the value of properties in variables before calling functions like `Server.NextFrame()` so you can read the data safely.
|
||||
|
||||
## Preventing Broadcast
|
||||
|
||||
You can modify a game event so that it does not get broadcast to clients by modifying the `bool info.DontBroadcast` property. e.g.
|
||||
|
||||
@@ -5,6 +5,9 @@ description: How to add inter-plugin communication to CounterStrikeSharp plugins
|
||||
|
||||
# Shared Plugin API
|
||||
|
||||
> [!NOTE]
|
||||
> **New (experimental)**: You can now resolve plugin dependencies directly from your local **NuGet packages cache** instead of copying every DLL into the `shared/` folder. See **Dependency Resolution** below. This feature **disabled by default.**
|
||||
|
||||
How to expose and use shared plugin APIs between multiple plugins.
|
||||
|
||||
## Creating a Contract Library
|
||||
@@ -65,3 +68,36 @@ balance.Add(500);
|
||||
```
|
||||
|
||||
This value _MUST_ be checked for null, as if there are no plugins providing implementations for a given capability, this method will return null, and you must handle this flow in your plugin.
|
||||
|
||||
|
||||
## Dependency Resolution
|
||||
|
||||
CounterStrikeSharp supports two complementary ways to resolve **external** assemblies used by your plugins and shared contracts:
|
||||
|
||||
1. **Shared Folder Resolution (manual)**: copy dependency DLLs into `shared/<PackageName>/<Assembly>.dll`.
|
||||
2. **NuGet Dependency Resolver (auto)**: when enabled, resolves missing assemblies from the local **NuGet packages root**
|
||||
|
||||
### Enabling the NuGet Resolver
|
||||
|
||||
Add the following property to your core config (disabled by default):
|
||||
|
||||
```json
|
||||
{
|
||||
...
|
||||
"PluginResolveNugetPackages": true
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> The engine looks for assemblies in the NuGet cache defined by the `NUGET_PACKAGES` environment variable, or falls back to the default user cache (e.g., `~/.nuget/packages` on Linux/macOS, `%UserProfile%\.nuget\packages` on Windows).
|
||||
|
||||
### Dependencies Resolution Order
|
||||
|
||||
When the NuGet resolver is **enabled**, resolution proceeds in this general order:
|
||||
|
||||
1. **Plugins directory** (in-place assemblies)
|
||||
2. `shared/` **folder** (existing shared assemblies mechanism)
|
||||
3. **NuGet cache** (auto-resolver)
|
||||
|
||||
This lets you keep proven `shared/` workflows while reducing manual copying for common NuGet dependencies.
|
||||
99
docfx/docs/guides/auto-build-and-deploy.md
Normal file
99
docfx/docs/guides/auto-build-and-deploy.md
Normal file
@@ -0,0 +1,99 @@
|
||||
---
|
||||
title: Automatically build/deploy your changes
|
||||
description: Automatically build and deploy plugin changes to a remote development server as you work.
|
||||
---
|
||||
|
||||
# Automatically build and deploy your changes
|
||||
|
||||
<sup>Adapted from the
|
||||
[original guide](https://github.com/uFloppyDisk/create-cssharp-plugin/blob/c8fca43f86a61a5e874624f2f3ed39c5271c9a55/templates/standard-plugin/docs/auto-live-hot-reloading.md).
|
||||
</sup>
|
||||
|
||||
During development of your plugin, you may find yourself repeating a workflow
|
||||
similar to the following:
|
||||
1. Make a change to your plugin
|
||||
2. Run your build task (ex. `dotnet build`)
|
||||
3. Upload plugin DLLs to your server using an FTP client
|
||||
4. Alt-tab to the game
|
||||
5. Test your changes
|
||||
6. Repeat
|
||||
|
||||
Iterating on your plugin this way is painfully slow and impacts your productivity.
|
||||
Below, you will find a guide and recommendations on how to setup your dev environment
|
||||
to watch for file changes and automatically update plugin files on your server as you work.
|
||||
By following this guide, your new workflow should look like this:
|
||||
1. Make a change to your plugin
|
||||
2. Alt-tab to the game
|
||||
3. Test your changes
|
||||
4. Repeat
|
||||
|
||||
> [!CAUTION]
|
||||
> Exercise caution when developing your plugin while using this workflow.
|
||||
> Build time errors are mostly caught by .NET SDK before files are committed
|
||||
> but incomplete implementation may lead to issues such as server crashes.
|
||||
> Avoid using this workflow on a production server meant for players.
|
||||
|
||||
## Setup
|
||||
|
||||
#### 1. Build plugin on file changes
|
||||
|
||||
The `dotnet` CLI, included with the .NET SDK, offers a convenient command for
|
||||
automatically watching for source file changes. If you have access to the `dotnet`
|
||||
CLI, run the following command to start watching your source code.
|
||||
```shell
|
||||
dotnet watch build --project path/to/projectName.csproj
|
||||
```
|
||||
<sup>By default, `dotnet watch` executes the `dotnet run` command on file changes
|
||||
so specifying `build` as the first argument is required.</sup>
|
||||
|
||||
Your plugin will now build automatically on file change. By default, your builds
|
||||
should be placed in `bin/<config>/<framework>` in the same directory as your `.csproj`.
|
||||
|
||||
```txt
|
||||
projectDirectory
|
||||
├── projectName.csproj
|
||||
├── bin
|
||||
│ └── Debug
|
||||
│ └── net8.0
|
||||
│ └── PLUGIN BUILDS HERE
|
||||
```
|
||||
|
||||
> [!TIP]
|
||||
> You can have your plugin build to a more convenient location by setting the
|
||||
> `<OutDir>` build property in your `.csproj` file.
|
||||
> Example: `<OutDir>./build/$(MSBuildProjectName)</OutDir>`
|
||||
|
||||
|
||||
#### 2. Setup automatic uploads
|
||||
|
||||
##### Using WinSCP (Windows only)
|
||||
Once connected to your server:
|
||||
1. Go to the `Commands` tab at the top of the WinSCP window
|
||||
and click `Keep Remote Directory up to Date`.
|
||||
2. Select the plugin build directory containing your DLLs.
|
||||
3. Select the plugin destination.
|
||||
(`csgo/addons/counterstrikesharp/plugins/<projectName>`)
|
||||
4. Click `Start`
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **For WSL users:**
|
||||
> Applications running on Windows, such as WinSCP, cannot watch your Linux subsystem for file
|
||||
> changes. Try using [this workaround](#using-winscp-while-developing-in-wsl) or consider
|
||||
> moving development to Windows.
|
||||
|
||||
##### Using `lsyncd` (Linux)
|
||||
> **TODO:** in-depth guide for setting up lsyncd
|
||||
|
||||
Learn more about `lsyncd`: https://github.com/lsyncd/lsyncd
|
||||
|
||||
___
|
||||
|
||||
#### Using WinSCP while developing in WSL
|
||||
Run the following watch command in place of the one mentioned in
|
||||
[Step 1](#1-build-plugin-on-file-changes) to build to a directory in your Windows filesystem
|
||||
```shell
|
||||
dotnet watch build --project path/to/<projectName>.csproj --property:OutDir=/mnt/<drive-letter>/some/path/<projectName>`
|
||||
```
|
||||
and have [WinSCP in Step 2](#2-setup-automatic-uploads) watch that path instead.
|
||||
|
||||
[Learn about Windows filesystem mounts in WSL](https://blogs.windows.com/windowsdeveloper/2016/07/22/fun-with-the-windows-subsystem-for-linux/#Working%20with%20Windows%20files:~:text=Working%20with%20Windows%20files)
|
||||
@@ -10,7 +10,7 @@ In this guide you will learn how to install CounterStrikeSharp onto your vanilla
|
||||
If you're more of a visual person, here is a <a href="https://www.youtube.com/watch?v=FlsKzStHJuY" target="_blank">Youtube video</a> that covers everything.
|
||||
|
||||
## Prerequisites
|
||||
- <a href="https://www.sourcemm.net/downloads.php/?branch=master" target="_blank">Metamod: Source 2.X Dev Build</a>
|
||||
- <a href="https://www.metamodsource.net/downloads.php/?branch=master" target="_blank">Metamod: Source 2.X Dev Build</a>
|
||||
- <a href="https://github.com/roflmuffin/CounterStrikeSharp/releases" target="_blank">CounterStrikeSharp With Runtime</a>
|
||||
|
||||
## Installing Metamod
|
||||
|
||||
@@ -6,3 +6,9 @@
|
||||
|
||||
- name: Dependency Injection
|
||||
href: dependency-injection.md
|
||||
|
||||
- name: Referencing Players
|
||||
href: referencing-players.md
|
||||
|
||||
- name: Automatically build and deploy your changes
|
||||
href: auto-build-and-deploy.md
|
||||
|
||||
@@ -47,3 +47,10 @@ When enabled, will remove the `FCVAR_HIDDEN`,`FCVAR_DEVELOPMENTONLY`, `FCVAR_MIS
|
||||
## UnlockConVars
|
||||
|
||||
When enabled, will remove the `FCVAR_HIDDEN`,`FCVAR_DEVELOPMENTONLY`, `FCVAR_MISSING0`, `FCVAR_MISSING1`, `FCVAR_MISSING2`, `FCVAR_MISSING3` flags from all console variables.
|
||||
|
||||
## AutoUpdateEnabled
|
||||
|
||||
When enabled, CS# will check for any updates to the gamedata.json file and automatically update it if a new version is available.
|
||||
|
||||
## AutoUpdateURL
|
||||
The URL to use for the auto-update feature. This URL should point to a JSON file that contains the latest version of the gamedata.json file.
|
||||
@@ -1,5 +1,2 @@
|
||||
- name: Core Configuration
|
||||
href: core-configuration.md
|
||||
|
||||
- name: Referencing Players
|
||||
href: referencing-players.md
|
||||
href: core-configuration.md
|
||||
2
examples/WithCheckTransmit/README.md
Normal file
2
examples/WithCheckTransmit/README.md
Normal file
@@ -0,0 +1,2 @@
|
||||
# With CheckTransmit
|
||||
This example shows how to work with the `CheckTransmit` listener.
|
||||
13
examples/WithCheckTransmit/WithCheckTransmit.csproj
Normal file
13
examples/WithCheckTransmit/WithCheckTransmit.csproj
Normal file
@@ -0,0 +1,13 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\managed\CounterStrikeSharp.API\CounterStrikeSharp.API.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
115
examples/WithCheckTransmit/WithCheckTransmitPlugin.cs
Normal file
115
examples/WithCheckTransmit/WithCheckTransmitPlugin.cs
Normal file
@@ -0,0 +1,115 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace WithCheckTransmit;
|
||||
|
||||
[MinimumApiVersion(276)]
|
||||
public class WithCheckTransmitPlugin : BasePlugin
|
||||
{
|
||||
public override string ModuleName => "Example: With CheckTransmit";
|
||||
public override string ModuleVersion => "1.0.0";
|
||||
public override string ModuleAuthor => "CounterStrikeSharp & Contributors";
|
||||
public override string ModuleDescription => "A simple plugin that uses the CheckTransmit listener!";
|
||||
|
||||
private Dictionary<int, bool> ShouldSeeDoors = new Dictionary<int, bool>();
|
||||
|
||||
public override void Load(bool hotReload)
|
||||
{
|
||||
// This command is related to the following example.
|
||||
AddCommand("nodoors", "Toggle door transmit", (player, info) =>
|
||||
{
|
||||
if (player == null)
|
||||
return;
|
||||
|
||||
if (ShouldSeeDoors.ContainsKey(player.Slot))
|
||||
{
|
||||
ShouldSeeDoors[player.Slot] = !ShouldSeeDoors[player.Slot];
|
||||
} else
|
||||
{
|
||||
ShouldSeeDoors.Add(player.Slot, false);
|
||||
}
|
||||
|
||||
info.ReplyToCommand($"You should {(ShouldSeeDoors[player.Slot] ? "see" : "not see")} doors");
|
||||
});
|
||||
|
||||
// In this example, we will hide every door for players that have enabled the option with the command 'nodoors'
|
||||
RegisterListener<Listeners.CheckTransmit>((CCheckTransmitInfoList infoList) =>
|
||||
{
|
||||
// Get the list of the currently available doors (prop_door_rotating)
|
||||
IEnumerable<CPropDoorRotating> doors = Utilities.FindAllEntitiesByDesignerName<CPropDoorRotating>("prop_door_rotating");
|
||||
|
||||
// Do nothing if there is none.
|
||||
if (!doors.Any())
|
||||
return;
|
||||
|
||||
// Go through every received info
|
||||
foreach ((CCheckTransmitInfo info, CCSPlayerController? player) in infoList)
|
||||
{
|
||||
// If no player is found, we can continue
|
||||
if (player == null)
|
||||
continue;
|
||||
|
||||
// Otherwise, lets do the work:
|
||||
|
||||
// Check if we should clear or not:
|
||||
|
||||
// If we have no data saved for this player, then we should not continue
|
||||
if (!ShouldSeeDoors.ContainsKey(player.Slot))
|
||||
continue;
|
||||
|
||||
// If this value is true, then this player should see doors
|
||||
if (ShouldSeeDoors[player.Slot])
|
||||
continue;
|
||||
|
||||
// Otherwise, lets remove the door entity indexes from the info list so they won't be transmitted
|
||||
foreach (CPropDoorRotating door in doors)
|
||||
{
|
||||
info.TransmitEntities.Remove(door);
|
||||
}
|
||||
|
||||
// NOTE: this is a barebone example, saving data and doing sanity checks is up to you.
|
||||
}
|
||||
});
|
||||
|
||||
// In this example, we will hide other players in the same team as the player.
|
||||
// NOTE: 'Hiding' players requires extra work to do, killing non-transmitted players results in crash.
|
||||
RegisterListener<Listeners.CheckTransmit>((CCheckTransmitInfoList infoList) =>
|
||||
{
|
||||
// Get the list of the current players, we only work with this value later on
|
||||
List<CCSPlayerController> players = Utilities.GetPlayers();
|
||||
|
||||
// Go through every received info
|
||||
foreach ((CCheckTransmitInfo info, CCSPlayerController? player) in infoList)
|
||||
{
|
||||
// If no player is found, we can continue
|
||||
if (player == null)
|
||||
continue;
|
||||
|
||||
// Otherwise, lets do the work:
|
||||
|
||||
// as an example, lets hide everyone for this player who is in the same team.
|
||||
IEnumerable<CCSPlayerController> targetPlayers = players.Where(p =>
|
||||
// is the player and its pawn valid
|
||||
p.IsValid && p.Pawn.IsValid &&
|
||||
|
||||
// we shouldn't hide ourselves
|
||||
p.Slot != player.Slot &&
|
||||
|
||||
// is the player is in the same team
|
||||
p.Team == player.Team &&
|
||||
|
||||
// is alive
|
||||
p.PlayerPawn.Value?.LifeState == (byte)LifeState_t.LIFE_ALIVE
|
||||
);
|
||||
|
||||
foreach (CCSPlayerController targetPlayer in targetPlayers)
|
||||
{
|
||||
// Calling 'Remove' will clear the entity index of the target player pawn from the transmission list
|
||||
// so it won't be transmitted for the 'player'.
|
||||
info.TransmitEntities.Remove(targetPlayer.Pawn);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,38 +1,60 @@
|
||||
using System.Text.Json.Serialization;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace WithConfig;
|
||||
|
||||
public class SampleConfig : BasePluginConfig
|
||||
{
|
||||
[JsonPropertyName("ChatPrefix")] public string ChatPrefix { get; set; } = "My Cool Plugin";
|
||||
|
||||
[JsonPropertyName("ChatInterval")] public float ChatInterval { get; set; } = 60;
|
||||
}
|
||||
|
||||
[MinimumApiVersion(80)]
|
||||
public class WithConfigPlugin : BasePlugin, IPluginConfig<SampleConfig>
|
||||
{
|
||||
public override string ModuleName => "Example: With Config";
|
||||
public override string ModuleVersion => "1.0.0";
|
||||
|
||||
public SampleConfig Config { get; set; }
|
||||
|
||||
public void OnConfigParsed(SampleConfig config)
|
||||
{
|
||||
// Do manual verification of the config and override any invalid values
|
||||
if (config.ChatInterval > 60)
|
||||
{
|
||||
config.ChatInterval = 60;
|
||||
}
|
||||
|
||||
if (config.ChatPrefix.Length > 25)
|
||||
{
|
||||
throw new Exception($"Invalid value has been set to config value 'ChatPrefix': {config.ChatPrefix}");
|
||||
}
|
||||
|
||||
// Once we've validated the config, we can set it to the instance
|
||||
Config = config;
|
||||
}
|
||||
}
|
||||
using System.Text.Json.Serialization;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
using CounterStrikeSharp.API.Core.Attributes.Registration;
|
||||
using CounterStrikeSharp.API.Modules.Admin;
|
||||
using CounterStrikeSharp.API.Modules.Commands;
|
||||
using CounterStrikeSharp.API.Modules.Config;
|
||||
using CounterStrikeSharp.API.Modules.Extensions;
|
||||
|
||||
namespace WithConfig;
|
||||
|
||||
public class SampleConfig : BasePluginConfig
|
||||
{
|
||||
[JsonPropertyName("ChatPrefix")] public string ChatPrefix { get; set; } = "My Cool Plugin";
|
||||
|
||||
[JsonPropertyName("ChatInterval")] public float ChatInterval { get; set; } = 60;
|
||||
}
|
||||
|
||||
[MinimumApiVersion(80)]
|
||||
public class WithConfigPlugin : BasePlugin, IPluginConfig<SampleConfig>
|
||||
{
|
||||
public override string ModuleName => "Example: With Config";
|
||||
public override string ModuleVersion => "1.0.0";
|
||||
|
||||
public SampleConfig Config { get; set; }
|
||||
|
||||
public void OnConfigParsed(SampleConfig config)
|
||||
{
|
||||
// Do manual verification of the config and override any invalid values
|
||||
if (config.ChatInterval > 60)
|
||||
{
|
||||
config.ChatInterval = 60;
|
||||
}
|
||||
|
||||
if (config.ChatPrefix.Length > 25)
|
||||
{
|
||||
throw new Exception($"Invalid value has been set to config value 'ChatPrefix': {config.ChatPrefix}");
|
||||
}
|
||||
|
||||
// Once we've validated the config, we can set it to the instance
|
||||
Config = config;
|
||||
}
|
||||
|
||||
[ConsoleCommand("css_reload_config", "Reloads the plugin config")]
|
||||
public void OnReloadConfig(CCSPlayerController? player, CommandInfo commandInfo)
|
||||
{
|
||||
commandInfo.ReplyToCommand("Chat Interval before reload: " + Config.ChatInterval);
|
||||
Config.Reload();
|
||||
commandInfo.ReplyToCommand("Chat Interval after reload: " + Config.ChatInterval);
|
||||
}
|
||||
|
||||
[ConsoleCommand("css_reset_config", "Resets the plugin config")]
|
||||
public void OnResetConfig(CCSPlayerController? player, CommandInfo commandInfo)
|
||||
{
|
||||
commandInfo.ReplyToCommand("Chat Interval before reset: " + Config.ChatInterval);
|
||||
Config.ChatInterval = 60;
|
||||
Config.Update();
|
||||
commandInfo.ReplyToCommand("Chat Interval after reset: " + Config.ChatInterval);
|
||||
}
|
||||
}
|
||||
|
||||
Submodule libraries/Protobufs updated: 686a0628e6...7af53a5e1c
Submodule libraries/hl2sdk-cs2 updated: f21e0c9d8f...da981a8984
12818
libraries/httplib/httplib.h
Normal file
12818
libraries/httplib/httplib.h
Normal file
File diff suppressed because it is too large
Load Diff
Submodule libraries/metamod-source updated: 607301adc3...349444486a
@@ -14,7 +14,6 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-invalid-offsetof -Wno-reorder")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpmath=sse -msse -fno-strict-aliasing")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics -v -fvisibility=default")
|
||||
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libgcc -static-libstdc++")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--exclude-libs=libprotobuf.a")
|
||||
|
||||
set(
|
||||
|
||||
@@ -11,7 +11,7 @@ set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING
|
||||
FORCE
|
||||
)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
|
||||
if(LINUX)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
||||
@@ -35,10 +35,10 @@ else()
|
||||
add_definitions(-DGITHUB_SHA="Local")
|
||||
endif()
|
||||
|
||||
if(DEFINED ENV{BUILD_NUMBER})
|
||||
add_definitions(-DBUILD_NUMBER="$ENV{BUILD_NUMBER}")
|
||||
if(DEFINED ENV{SEMVER})
|
||||
add_definitions(-DSEMVER="$ENV{SEMVER}")
|
||||
else()
|
||||
add_definitions(-DBUILD_NUMBER="0")
|
||||
add_definitions(-DSEMVER="Local")
|
||||
endif()
|
||||
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||
@@ -58,7 +58,6 @@ include_directories(
|
||||
${SOURCESDK}/public/tier1
|
||||
${SOURCESDK}/public/entity2
|
||||
${SOURCESDK}/public/game/server
|
||||
${SOURCESDK}/public/entity2
|
||||
${SOURCESDK}/public/schemasystem
|
||||
${METAMOD_DIR}/core
|
||||
${METAMOD_DIR}/core/sourcehook
|
||||
|
||||
@@ -11,8 +11,10 @@ using CounterStrikeSharp.API.Core.Plugin;
|
||||
using CounterStrikeSharp.API.Core.Plugin.Host;
|
||||
using CounterStrikeSharp.API.Core.Translations;
|
||||
using CounterStrikeSharp.API.Modules.Admin;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Serilog;
|
||||
|
||||
@@ -44,7 +46,11 @@ public static class Bootstrap
|
||||
services.AddSingleton<IPluginManager, PluginManager>();
|
||||
services.AddSingleton<IPlayerLanguageManager, PlayerLanguageManager>();
|
||||
services.AddScoped<IPluginContextQueryHandler, PluginContextQueryHandler>();
|
||||
services.AddSingleton<ICommandManager, CommandManager>();
|
||||
services.AddSingleton<ICommandManager, CommandManager>();
|
||||
|
||||
services.TryAddSingleton<IStringLocalizerFactory, CoreJsonStringLocalizerFactory>();
|
||||
services.TryAddTransient(typeof(IStringLocalizer<>), typeof(StringLocalizer<>));
|
||||
services.TryAddTransient(typeof(IStringLocalizer), typeof(StringLocalizer));
|
||||
|
||||
services.Scan(i => i.FromCallingAssembly()
|
||||
.AddClasses(c => c.AssignableTo<IStartupService>())
|
||||
@@ -71,4 +77,4 @@ public static class Bootstrap
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -17,6 +17,7 @@
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using CounterStrikeSharp.API.Core.Commands;
|
||||
using CounterStrikeSharp.API.Core.Hosting;
|
||||
using CounterStrikeSharp.API.Core.Plugin;
|
||||
@@ -28,6 +29,7 @@ using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Menu;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core
|
||||
@@ -35,6 +37,8 @@ namespace CounterStrikeSharp.API.Core
|
||||
public sealed class Application
|
||||
{
|
||||
private static Application _instance = null!;
|
||||
public static IStringLocalizer Localizer => Instance._localizer;
|
||||
|
||||
public ILogger Logger { get; }
|
||||
|
||||
public static Application Instance => _instance!;
|
||||
@@ -48,11 +52,12 @@ namespace CounterStrikeSharp.API.Core
|
||||
private readonly IPluginContextQueryHandler _pluginContextQueryHandler;
|
||||
private readonly IPlayerLanguageManager _playerLanguageManager;
|
||||
private readonly ICommandManager _commandManager;
|
||||
private readonly IStringLocalizer _localizer;
|
||||
|
||||
public Application(ILoggerFactory loggerFactory, IScriptHostConfiguration scriptHostConfiguration,
|
||||
GameDataProvider gameDataProvider, CoreConfig coreConfig, IPluginManager pluginManager,
|
||||
IPluginContextQueryHandler pluginContextQueryHandler, IPlayerLanguageManager playerLanguageManager,
|
||||
ICommandManager commandManager)
|
||||
ICommandManager commandManager, IStringLocalizer localizer)
|
||||
{
|
||||
Logger = loggerFactory.CreateLogger("Core");
|
||||
_scriptHostConfiguration = scriptHostConfiguration;
|
||||
@@ -62,11 +67,28 @@ namespace CounterStrikeSharp.API.Core
|
||||
_pluginContextQueryHandler = pluginContextQueryHandler;
|
||||
_playerLanguageManager = playerLanguageManager;
|
||||
_commandManager = commandManager;
|
||||
_localizer = localizer;
|
||||
_instance = this;
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
|
||||
{
|
||||
if ((e.ExceptionObject as Exception) is PluginTerminationException pluginEx)
|
||||
{
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
TaskScheduler.UnobservedTaskException += (sender, e) =>
|
||||
{
|
||||
if (e.Exception.InnerExceptions.Any(ex => ex is PluginTerminationException))
|
||||
{
|
||||
e.SetObserved();
|
||||
}
|
||||
};
|
||||
|
||||
Logger.LogInformation("CounterStrikeSharp is starting up...");
|
||||
|
||||
_coreConfig.Load();
|
||||
@@ -122,123 +144,135 @@ namespace CounterStrikeSharp.API.Core
|
||||
switch (info.GetArg(1))
|
||||
{
|
||||
case "list":
|
||||
{
|
||||
info.ReplyToCommand(
|
||||
$" List of all plugins currently loaded by CounterStrikeSharp: {_pluginManager.GetLoadedPlugins().Count()} plugins loaded.");
|
||||
|
||||
foreach (var plugin in _pluginManager.GetLoadedPlugins())
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
sb.AppendFormat(" [#{0}:{1}]: \"{2}\" ({3})", plugin.PluginId,
|
||||
plugin.State.ToString().ToUpper(), plugin.Plugin?.ModuleName ?? "Unknown",
|
||||
plugin.Plugin?.ModuleVersion ?? "Unknown");
|
||||
if (!string.IsNullOrEmpty(plugin.Plugin?.ModuleAuthor))
|
||||
sb.AppendFormat(" by {0}", plugin.Plugin.ModuleAuthor);
|
||||
if (!string.IsNullOrEmpty(plugin.Plugin?.ModuleDescription))
|
||||
{
|
||||
sb.Append("\n");
|
||||
sb.Append(" ");
|
||||
sb.Append(plugin.Plugin.ModuleDescription);
|
||||
}
|
||||
|
||||
info.ReplyToCommand(sb.ToString());
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case "start":
|
||||
case "load":
|
||||
{
|
||||
if (info.ArgCount < 3)
|
||||
{
|
||||
info.ReplyToCommand(
|
||||
"Valid usage: css_plugins start/load [relative plugin path || absolute plugin path] (e.g \"TestPlugin\", \"plugins/TestPlugin/TestPlugin.dll\")\n");
|
||||
$" List of all plugins currently loaded by CounterStrikeSharp: {_pluginManager.GetLoadedPlugins().Count()} plugins loaded.");
|
||||
|
||||
foreach (var plugin in _pluginManager.GetLoadedPlugins())
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
sb.AppendFormat(" [#{0}:{1}]: \"{2}\" ({3})", plugin.PluginId,
|
||||
plugin.State.ToString().ToUpper(), plugin.Plugin?.ModuleName ?? "Unknown",
|
||||
plugin.Plugin?.ModuleVersion ?? "Unknown");
|
||||
if (!string.IsNullOrEmpty(plugin.Plugin?.ModuleAuthor))
|
||||
sb.AppendFormat(" by {0}", plugin.Plugin.ModuleAuthor);
|
||||
if (!string.IsNullOrEmpty(plugin.Plugin?.ModuleDescription))
|
||||
{
|
||||
sb.Append("\n");
|
||||
sb.Append(" ");
|
||||
sb.Append(plugin.Plugin.ModuleDescription);
|
||||
}
|
||||
|
||||
if (plugin.State == PluginState.Unloaded && !string.IsNullOrEmpty(plugin.TerminationReason))
|
||||
{
|
||||
sb.Append("\n");
|
||||
sb.AppendFormat(" Termination Reason: {0}", plugin.TerminationReason);
|
||||
}
|
||||
|
||||
info.ReplyToCommand(sb.ToString());
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// If our argument doesn't end in ".dll" - try and construct a path similar to PluginName/PluginName.dll.
|
||||
// We'll assume we have a full path if we have ".dll".
|
||||
var path = info.GetArg(2);
|
||||
path = Path.Combine(_scriptHostConfiguration.RootPath, !path.EndsWith(".dll") ? $"plugins/{path}/{path}.dll" : path);
|
||||
|
||||
var plugin = _pluginContextQueryHandler.FindPluginByModulePath(path);
|
||||
|
||||
if (plugin == null)
|
||||
case "start":
|
||||
case "load":
|
||||
{
|
||||
try
|
||||
if (info.ArgCount < 3)
|
||||
{
|
||||
_pluginManager.LoadPlugin(path);
|
||||
plugin = _pluginContextQueryHandler.FindPluginByModulePath(path);
|
||||
info.ReplyToCommand(
|
||||
"Valid usage: css_plugins start/load [relative plugin path || absolute plugin path] (e.g \"TestPlugin\", \"plugins/TestPlugin/TestPlugin.dll\")\n");
|
||||
break;
|
||||
}
|
||||
|
||||
// If our argument doesn't end in ".dll" - try and construct a path similar to PluginName/PluginName.dll.
|
||||
// We'll assume we have a full path if we have ".dll".
|
||||
var path = info.GetArg(2);
|
||||
|
||||
path = Path.Combine(
|
||||
_scriptHostConfiguration.RootPath,
|
||||
!path.EndsWith(".dll")
|
||||
? $"plugins/{path}/{Path.GetFileName(path)}.dll"
|
||||
: path
|
||||
);
|
||||
|
||||
var plugin = _pluginContextQueryHandler.FindPluginByModulePath(path);
|
||||
|
||||
if (plugin == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
_pluginManager.LoadPlugin(path);
|
||||
plugin = _pluginContextQueryHandler.FindPluginByModulePath(path);
|
||||
plugin.Plugin.OnAllPluginsLoaded(false);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
info.ReplyToCommand($"Could not load plugin \"{path}\"");
|
||||
Logger.LogError(e, "Could not load plugin \"{Path}\"", path);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
plugin.Load(false);
|
||||
plugin.Plugin.OnAllPluginsLoaded(false);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
info.ReplyToCommand($"Could not load plugin \"{path}\"");
|
||||
Logger.LogError(e, "Could not load plugin \"{Path}\"", path);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
plugin.Load(false);
|
||||
plugin.Plugin.OnAllPluginsLoaded(false);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "stop":
|
||||
case "unload":
|
||||
{
|
||||
if (info.ArgCount < 3)
|
||||
{
|
||||
info.ReplyToCommand(
|
||||
"Valid usage: css_plugins stop/unload [plugin name || #plugin id] (e.g \"TestPlugin\", \"1\")\n");
|
||||
if (info.ArgCount < 3)
|
||||
{
|
||||
info.ReplyToCommand(
|
||||
"Valid usage: css_plugins stop/unload [plugin name || #plugin id] (e.g \"TestPlugin\", \"1\")\n");
|
||||
break;
|
||||
}
|
||||
|
||||
var pluginIdentifier = info.GetArg(2);
|
||||
string path;
|
||||
path = Path.Combine(_scriptHostConfiguration.RootPath,
|
||||
!pluginIdentifier.EndsWith(".dll") ? $"plugins/{pluginIdentifier}/{pluginIdentifier}.dll" : pluginIdentifier);
|
||||
|
||||
var plugin = _pluginContextQueryHandler.FindPluginByIdOrName(pluginIdentifier)
|
||||
?? _pluginContextQueryHandler.FindPluginByModulePath(path);
|
||||
|
||||
if (plugin == null)
|
||||
{
|
||||
info.ReplyToCommand($"Could not unload plugin \"{pluginIdentifier}\"");
|
||||
break;
|
||||
}
|
||||
|
||||
plugin.Unload(false);
|
||||
break;
|
||||
}
|
||||
|
||||
var pluginIdentifier = info.GetArg(2);
|
||||
string path;
|
||||
path = Path.Combine(_scriptHostConfiguration.RootPath,
|
||||
!pluginIdentifier.EndsWith(".dll") ? $"plugins/{pluginIdentifier}/{pluginIdentifier}.dll" : pluginIdentifier);
|
||||
|
||||
var plugin = _pluginContextQueryHandler.FindPluginByIdOrName(pluginIdentifier)
|
||||
?? _pluginContextQueryHandler.FindPluginByModulePath(path);
|
||||
|
||||
if (plugin == null)
|
||||
{
|
||||
info.ReplyToCommand($"Could not unload plugin \"{pluginIdentifier}\"");
|
||||
break;
|
||||
}
|
||||
|
||||
plugin.Unload(false);
|
||||
break;
|
||||
}
|
||||
|
||||
case "restart":
|
||||
case "reload":
|
||||
{
|
||||
if (info.ArgCount < 3)
|
||||
{
|
||||
info.ReplyToCommand(
|
||||
"Valid usage: css_plugins restart/reload [plugin name || #plugin id] (e.g \"TestPlugin\", \"#1\")\n");
|
||||
if (info.ArgCount < 3)
|
||||
{
|
||||
info.ReplyToCommand(
|
||||
"Valid usage: css_plugins restart/reload [plugin name || #plugin id] (e.g \"TestPlugin\", \"#1\")\n");
|
||||
break;
|
||||
}
|
||||
|
||||
var pluginIdentifier = info.GetArg(2);
|
||||
var plugin = _pluginContextQueryHandler.FindPluginByIdOrName(pluginIdentifier);
|
||||
|
||||
if (plugin == null)
|
||||
{
|
||||
info.ReplyToCommand($"Could not reload plugin \"{pluginIdentifier}\"");
|
||||
break;
|
||||
}
|
||||
|
||||
plugin.Unload(true);
|
||||
plugin.Load(true);
|
||||
plugin.Plugin.OnAllPluginsLoaded(true);
|
||||
break;
|
||||
}
|
||||
|
||||
var pluginIdentifier = info.GetArg(2);
|
||||
var plugin = _pluginContextQueryHandler.FindPluginByIdOrName(pluginIdentifier);
|
||||
|
||||
if (plugin == null)
|
||||
{
|
||||
info.ReplyToCommand($"Could not reload plugin \"{pluginIdentifier}\"");
|
||||
break;
|
||||
}
|
||||
|
||||
plugin.Unload(true);
|
||||
plugin.Load(true);
|
||||
plugin.Plugin.OnAllPluginsLoaded(true);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
info.ReplyToCommand("Valid usage: css_plugins [option]\n" +
|
||||
" list - List all plugins currently loaded.\n" +
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
using System;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core.Attributes.Registration;
|
||||
|
||||
[AttributeUsage(AttributeTargets.Method)]
|
||||
public class ListenerHandlerAttribute<T> : Attribute
|
||||
where T: Delegate
|
||||
{
|
||||
}
|
||||
@@ -53,20 +53,27 @@ namespace CounterStrikeSharp.API.Core
|
||||
|
||||
public abstract string ModuleName { get; }
|
||||
public abstract string ModuleVersion { get; }
|
||||
|
||||
|
||||
public virtual string ModuleAuthor { get; }
|
||||
|
||||
|
||||
public virtual string ModuleDescription { get; }
|
||||
|
||||
public string ModulePath { get; set; }
|
||||
|
||||
public string ModuleDirectory => Path.GetDirectoryName(ModulePath);
|
||||
public ILogger Logger { get; set; }
|
||||
|
||||
|
||||
public ICommandManager CommandManager { get; set; }
|
||||
|
||||
public IStringLocalizer Localizer { get; set; }
|
||||
|
||||
|
||||
internal Plugin.ISelfPluginControl SelfControl { get; set; }
|
||||
|
||||
public void TerminateSelf(string reason)
|
||||
{
|
||||
SelfControl?.TerminateSelf(reason);
|
||||
}
|
||||
|
||||
public virtual void Load(bool hotReload)
|
||||
{
|
||||
}
|
||||
@@ -74,7 +81,7 @@ namespace CounterStrikeSharp.API.Core
|
||||
public virtual void Unload(bool hotReload)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public virtual void OnAllPluginsLoaded(bool hotReload)
|
||||
{
|
||||
}
|
||||
@@ -117,9 +124,6 @@ namespace CounterStrikeSharp.API.Core
|
||||
public readonly Dictionary<Delegate, CallbackSubscriber> Handlers =
|
||||
new Dictionary<Delegate, CallbackSubscriber>();
|
||||
|
||||
public readonly Dictionary<Delegate, CallbackSubscriber> CommandHandlers =
|
||||
new Dictionary<Delegate, CallbackSubscriber>();
|
||||
|
||||
public readonly Dictionary<Delegate, CallbackSubscriber> CommandListeners =
|
||||
new Dictionary<Delegate, CallbackSubscriber>();
|
||||
|
||||
@@ -132,8 +136,10 @@ namespace CounterStrikeSharp.API.Core
|
||||
internal readonly Dictionary<Delegate, EntityIO.EntityOutputCallback> EntitySingleOutputHooks =
|
||||
new Dictionary<Delegate, EntityIO.EntityOutputCallback>();
|
||||
|
||||
public readonly List<CommandDefinition> CommandDefinitions = new List<CommandDefinition>();
|
||||
|
||||
public readonly List<Timer> Timers = new List<Timer>();
|
||||
|
||||
|
||||
public delegate HookResult GameEventHandler<T>(T @event, GameEventInfo info) where T : GameEvent;
|
||||
|
||||
private void RegisterEventHandlerInternal<T>(string name, GameEventHandler<T> handler, bool post)
|
||||
@@ -157,7 +163,7 @@ namespace CounterStrikeSharp.API.Core
|
||||
var name = typeof(T).GetCustomAttribute<EventNameAttribute>()?.Name;
|
||||
RegisterEventHandlerInternal(name, handler, hookMode == HookMode.Post);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// De-registers a game event handler.
|
||||
/// </summary>
|
||||
@@ -165,7 +171,7 @@ namespace CounterStrikeSharp.API.Core
|
||||
public void DeregisterEventHandler<T>(GameEventHandler<T> handler, HookMode hookMode = HookMode.Post) where T : GameEvent
|
||||
{
|
||||
var name = typeof(T).GetCustomAttribute<EventNameAttribute>()!.Name;
|
||||
|
||||
|
||||
if (!Handlers.TryGetValue(handler, out var subscriber)) return;
|
||||
|
||||
NativeAPI.UnhookEvent(name, subscriber.GetInputArgument(), hookMode == HookMode.Post);
|
||||
@@ -193,11 +199,13 @@ namespace CounterStrikeSharp.API.Core
|
||||
public void AddCommand(string name, string description, CommandInfo.CommandCallback handler)
|
||||
{
|
||||
var definition = new CommandDefinition(name, description, handler);
|
||||
CommandDefinitions.Add(definition);
|
||||
CommandManager.RegisterCommand(definition);
|
||||
}
|
||||
|
||||
|
||||
private void AddCommand(CommandDefinition definition)
|
||||
{
|
||||
CommandDefinitions.Add(definition);
|
||||
CommandManager.RegisterCommand(definition);
|
||||
}
|
||||
|
||||
@@ -229,14 +237,13 @@ namespace CounterStrikeSharp.API.Core
|
||||
/// <param name="handler">The callback function to be invoked when the command is executed.</param>
|
||||
public void RemoveCommand(string name, CommandInfo.CommandCallback handler)
|
||||
{
|
||||
if (CommandHandlers.ContainsKey(handler))
|
||||
var definition = CommandDefinitions.FirstOrDefault(
|
||||
definition => definition.Name == name && definition.Callback == handler);
|
||||
|
||||
if (definition != null)
|
||||
{
|
||||
var subscriber = CommandHandlers[handler];
|
||||
|
||||
NativeAPI.RemoveCommand(name, subscriber.GetInputArgument());
|
||||
|
||||
FunctionReference.Remove(subscriber.GetReferenceIdentifier());
|
||||
CommandHandlers.Remove(handler);
|
||||
CommandDefinitions.Remove(definition);
|
||||
CommandManager.RemoveCommand(definition);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -319,9 +326,9 @@ namespace CounterStrikeSharp.API.Core
|
||||
throw new ArgumentException("Listener of type T is invalid and does not have a name attribute",
|
||||
nameof(T));
|
||||
}
|
||||
|
||||
|
||||
if (!Listeners.TryGetValue(handler, out var subscriber)) return;
|
||||
|
||||
|
||||
NativeAPI.RemoveListener(listenerName, subscriber.GetInputArgument());
|
||||
FunctionReference.Remove(subscriber.GetReferenceIdentifier());
|
||||
Listeners.Remove(handler);
|
||||
@@ -396,20 +403,26 @@ namespace CounterStrikeSharp.API.Core
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Registers all game event handlers that are decorated with the <see cref="GameEventHandlerAttribute"/> attribute.
|
||||
/// Registers all game event handlers that are decorated with the <see cref="GameEventHandlerAttribute"/> and <see cref="ListenerHandlerAttribute{T}"/> attribute.
|
||||
/// </summary>
|
||||
/// <param name="instance">The instance of the object where the event handlers are defined.</param>
|
||||
public void RegisterAttributeHandlers(object instance)
|
||||
{
|
||||
var eventHandlers = instance.GetType()
|
||||
.GetMethods()
|
||||
var methods = instance.GetType().GetMethods();
|
||||
|
||||
var eventHandlers = methods
|
||||
.Where(method => method.GetCustomAttribute<GameEventHandlerAttribute>() != null)
|
||||
.Where(method =>
|
||||
method.GetParameters().FirstOrDefault()?.ParameterType.IsSubclassOf(typeof(GameEvent)) == true)
|
||||
.ToArray();
|
||||
|
||||
var method = typeof(BasePlugin).GetMethod("RegisterEventHandlerInternal", BindingFlags.NonPublic |
|
||||
var listenerHandlers = methods
|
||||
.Where(method => method.GetCustomAttribute(typeof(ListenerHandlerAttribute<>)) != null)
|
||||
.ToArray();
|
||||
|
||||
var registerEvent = typeof(BasePlugin).GetMethod(nameof(RegisterEventHandlerInternal), BindingFlags.NonPublic |
|
||||
BindingFlags.Instance)!;
|
||||
var registerListener = GetType().GetMethod(nameof(RegisterListener))!;
|
||||
|
||||
foreach (var eventHandler in eventHandlers)
|
||||
{
|
||||
@@ -421,8 +434,22 @@ namespace CounterStrikeSharp.API.Core
|
||||
var actionType = typeof(GameEventHandler<>).MakeGenericType(parameterType);
|
||||
var action = Delegate.CreateDelegate(actionType, instance, eventHandler);
|
||||
|
||||
var generic = method.MakeGenericMethod(parameterType);
|
||||
generic.Invoke(this, new object[] { eventName, action, hookMode == HookMode.Post });
|
||||
var registerEventGeneric = registerEvent.MakeGenericMethod(parameterType);
|
||||
registerEventGeneric.Invoke(this, [eventName, action, hookMode == HookMode.Post]);
|
||||
}
|
||||
|
||||
foreach (var listnerHandler in listenerHandlers)
|
||||
{
|
||||
var attribute = listnerHandler.GetCustomAttribute(typeof(ListenerHandlerAttribute<>))!;
|
||||
var listenerType = attribute.GetType().GetGenericArguments().First();
|
||||
|
||||
if (listenerType.GetCustomAttribute<ListenerNameAttribute>() == null)
|
||||
throw new ArgumentException("Listener of type T is invalid and does not have a name attribute",
|
||||
listenerType.Name);
|
||||
|
||||
var listenerDelegate = Delegate.CreateDelegate(listenerType, instance, listnerHandler);
|
||||
|
||||
registerListener.MakeGenericMethod(listenerType).Invoke(this, [listenerDelegate]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -482,29 +509,29 @@ namespace CounterStrikeSharp.API.Core
|
||||
{
|
||||
var convars = type
|
||||
.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static)
|
||||
.Where(prop => prop.FieldType.IsGenericType &&
|
||||
.Where(prop => prop.FieldType.IsGenericType &&
|
||||
prop.FieldType.GetGenericTypeDefinition() == typeof(FakeConVar<>));
|
||||
|
||||
|
||||
foreach (var prop in convars)
|
||||
{
|
||||
object propValue = prop.GetValue(instance); // FakeConvar<?> instance
|
||||
var propValueType = prop.FieldType.GenericTypeArguments[0];
|
||||
var name = prop.FieldType.GetProperty("Name", BindingFlags.Public | BindingFlags.Instance)
|
||||
.GetValue(propValue);
|
||||
|
||||
|
||||
var description = prop.FieldType.GetProperty("Description", BindingFlags.Public | BindingFlags.Instance)
|
||||
.GetValue(propValue);
|
||||
|
||||
MethodInfo executeCommandMethod = prop.FieldType
|
||||
.GetMethod("ExecuteCommand", BindingFlags.Instance | BindingFlags.NonPublic);
|
||||
|
||||
this.AddCommand((string)name, (string) description, (caller, command) =>
|
||||
|
||||
this.AddCommand((string)name, (string)description, (caller, command) =>
|
||||
{
|
||||
executeCommandMethod.Invoke(propValue, new object[] {caller, command});
|
||||
executeCommandMethod.Invoke(propValue, new object[] { caller, command });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Used to bind a fake ConVar to a plugin command. Only required for ConVars that are not public properties of the plugin class.
|
||||
/// </summary>
|
||||
@@ -529,7 +556,7 @@ namespace CounterStrikeSharp.API.Core
|
||||
NativeAPI.HookEntityOutput(classname, outputName, subscriber.GetInputArgument(), mode);
|
||||
EntityOutputHooks[handler] = subscriber;
|
||||
}
|
||||
|
||||
|
||||
public void HookUserMessage(int messageId, UserMessage.UserMessageHandler handler, HookMode mode = HookMode.Pre)
|
||||
{
|
||||
var subscriber = new CallbackSubscriber(handler, handler,
|
||||
@@ -538,7 +565,7 @@ namespace CounterStrikeSharp.API.Core
|
||||
NativeAPI.HookUsermessage(messageId, subscriber.GetInputArgument(), mode);
|
||||
Handlers[handler] = subscriber;
|
||||
}
|
||||
|
||||
|
||||
public void UnhookUserMessage(int messageId, UserMessage.UserMessageHandler handler, HookMode mode = HookMode.Pre)
|
||||
{
|
||||
if (!Handlers.TryGetValue(handler, out var subscriber)) return;
|
||||
@@ -622,11 +649,6 @@ namespace CounterStrikeSharp.API.Core
|
||||
subscriber.Dispose();
|
||||
}
|
||||
|
||||
foreach (var subscriber in CommandHandlers.Values)
|
||||
{
|
||||
subscriber.Dispose();
|
||||
}
|
||||
|
||||
foreach (var subscriber in CommandListeners.Values)
|
||||
{
|
||||
subscriber.Dispose();
|
||||
@@ -642,6 +664,11 @@ namespace CounterStrikeSharp.API.Core
|
||||
subscriber.Dispose();
|
||||
}
|
||||
|
||||
foreach (var definition in CommandDefinitions)
|
||||
{
|
||||
CommandManager.RemoveCommand(definition);
|
||||
}
|
||||
|
||||
foreach (var timer in Timers)
|
||||
{
|
||||
timer.Kill();
|
||||
@@ -650,4 +677,4 @@ namespace CounterStrikeSharp.API.Core
|
||||
_disposed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,18 +65,23 @@ public class CommandManager : ICommandManager
|
||||
var info = new CommandInfo(commandInfo, caller);
|
||||
|
||||
var name = info.GetArg(0).ToLower();
|
||||
|
||||
|
||||
using var temporaryCulture = new WithTemporaryCulture(caller.GetLanguage());
|
||||
|
||||
if (_commandDefinitions.TryGetValue(name, out var handler))
|
||||
{
|
||||
foreach (var command in handler)
|
||||
foreach (var command in handler.ToList())
|
||||
{
|
||||
if (!handler.Contains(command))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var methodInfo = command.Callback?.GetMethodInfo();
|
||||
|
||||
// We do not need to do permission checks on commands executed from the server console.
|
||||
// The server will always be allowed to execute commands (unless marked as client only like above)
|
||||
if (caller != null)
|
||||
if (caller != null)
|
||||
{
|
||||
// Do not execute command if we do not have the correct permissions.
|
||||
var adminData = AdminManager.GetPlayerAdminData(caller!.AuthorizedSteamID);
|
||||
@@ -115,11 +120,12 @@ public class CommandManager : ICommandManager
|
||||
if (!attr.CanExecuteCommand(caller))
|
||||
{
|
||||
var responseStr = (attr.GetType() == typeof(RequiresPermissions)) ?
|
||||
"You are missing the correct permissions" : "You do not have one of the correct permissions";
|
||||
Application.Localizer["Missing permissions"] :
|
||||
Application.Localizer["Missing one permission"];
|
||||
|
||||
var flags = attr.Permissions.Except(adminData?.GetAllFlags() ?? new HashSet<string>());
|
||||
flags = flags.Except(adminData?.Groups ?? new HashSet<string>());
|
||||
info.ReplyToCommand($"[CSS] {responseStr} ({string.Join(", ", flags)}) to execute this command.");
|
||||
info.ReplyToCommand(Application.Localizer["Command permission denied", responseStr, string.Join(", ", flags)]);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -53,6 +53,9 @@ namespace CounterStrikeSharp.API.Core
|
||||
[JsonPropertyName("PluginAutoLoadEnabled")]
|
||||
public bool PluginAutoLoadEnabled { get; set; } = true;
|
||||
|
||||
[JsonPropertyName("PluginResolveNugetPackages")]
|
||||
public bool PluginResolveNugetPackages { get; set; }
|
||||
|
||||
[JsonPropertyName("ServerLanguage")]
|
||||
public string ServerLanguage { get; set; } = "en";
|
||||
|
||||
@@ -61,6 +64,12 @@ namespace CounterStrikeSharp.API.Core
|
||||
|
||||
[JsonPropertyName("UnlockConVars")]
|
||||
public bool UnlockConVars { get; set; } = true;
|
||||
|
||||
[JsonPropertyName("AutoUpdateEnabled")]
|
||||
public bool AutoUpdateEnabled { get; set; } = true;
|
||||
|
||||
[JsonPropertyName("AutoUpdateURL")]
|
||||
public string AutoUpdateURL { get; set; } = "http://gamedata.cssharp.dev";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -109,6 +118,8 @@ namespace CounterStrikeSharp.API.Core
|
||||
/// </summary>
|
||||
public static bool PluginAutoLoadEnabled => _coreConfig.PluginAutoLoadEnabled;
|
||||
|
||||
public static bool PluginResolveNugetPackages => _coreConfig.PluginResolveNugetPackages;
|
||||
|
||||
public static string ServerLanguage => _coreConfig.ServerLanguage;
|
||||
|
||||
public static bool UnlockConCommands => _coreConfig.UnlockConCommands;
|
||||
@@ -151,27 +162,28 @@ namespace CounterStrikeSharp.API.Core
|
||||
_commandsRegistered = true;
|
||||
}
|
||||
|
||||
if (!File.Exists(_coreConfigPath))
|
||||
if (File.Exists(_coreConfigPath))
|
||||
{
|
||||
try
|
||||
{
|
||||
var data = JsonSerializer.Deserialize<CoreConfigData>(File.ReadAllText(_coreConfigPath),
|
||||
new JsonSerializerOptions() { ReadCommentHandling = JsonCommentHandling.Skip });
|
||||
|
||||
if (data != null)
|
||||
{
|
||||
_coreConfig = data;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogWarning(ex, "Failed to load core configuration, fallback values will be used");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogWarning(
|
||||
"Core configuration could not be found at path \"{CoreConfigPath}\", fallback values will be used.",
|
||||
_coreConfigPath);
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var data = JsonSerializer.Deserialize<CoreConfigData>(File.ReadAllText(_coreConfigPath),
|
||||
new JsonSerializerOptions() { ReadCommentHandling = JsonCommentHandling.Skip });
|
||||
|
||||
if (data != null)
|
||||
{
|
||||
_coreConfig = data;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogWarning(ex, "Failed to load core configuration, fallback values will be used");
|
||||
}
|
||||
|
||||
var serverCulture = CultureInfo.GetCultures(CultureTypes.AllCultures)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/*
|
||||
* This file is part of CounterStrikeSharp.
|
||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
using System.Collections.Concurrent;
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Extensions.Logging;
|
||||
@@ -26,7 +27,7 @@ namespace CounterStrikeSharp.API.Core
|
||||
/// </summary>
|
||||
public enum FunctionLifetime
|
||||
{
|
||||
/// <summary>Delegate will be removed after the first invocation.</summary>
|
||||
/// <summary>Delegate will be removed after the first invocation.</summary>
|
||||
SingleUse,
|
||||
|
||||
/// <summary>Delegate will remain in memory for the lifetime of the application (or until <see cref="FunctionReference.Remove"/> is called).</summary>
|
||||
@@ -57,7 +58,7 @@ namespace CounterStrikeSharp.API.Core
|
||||
_targetMethod = method;
|
||||
_nativeCallback = CreateWrappedCallback();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// <inheritdoc cref="FunctionLifetime"/>
|
||||
/// </summary>
|
||||
@@ -106,6 +107,11 @@ namespace CounterStrikeSharp.API.Core
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
if ((e.InnerException ?? e) is Plugin.PluginTerminationException pluginEx)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Application.Instance.Logger.LogError(e, "Error invoking callback");
|
||||
}
|
||||
finally
|
||||
@@ -176,4 +182,4 @@ namespace CounterStrikeSharp.API.Core
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -30,4 +30,4 @@ namespace CounterStrikeSharp.API.Core
|
||||
[DllImport(dllPath, EntryPoint = "InvokeNative")]
|
||||
public static extern void InvokeNative(IntPtr ptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,5 +34,11 @@ public interface IScriptHostConfiguration
|
||||
/// Gets the absolute path to the directory that contains CounterStrikeSharp game data.
|
||||
/// e.g. /game/csgo/addons/counterstrikesharp/gamedata
|
||||
/// </summary>
|
||||
string GameDataPath { get; }
|
||||
}
|
||||
string GameDataPath { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the absolute path to the directory that contains CounterStrikeSharp translation files.
|
||||
/// e.g. /game/csgo/addons/counterstrikesharp/lang
|
||||
/// </summary>
|
||||
string LanguagePath { get; }
|
||||
}
|
||||
|
||||
@@ -9,7 +9,8 @@ internal sealed class ScriptHostConfiguration : IScriptHostConfiguration
|
||||
public string PluginPath { get; }
|
||||
public string SharedPath { get; }
|
||||
public string ConfigsPath { get; }
|
||||
public string GameDataPath { get; }
|
||||
public string GameDataPath { get; }
|
||||
public string LanguagePath { get; }
|
||||
|
||||
public ScriptHostConfiguration(IHostEnvironment hostEnvironment)
|
||||
{
|
||||
@@ -17,6 +18,7 @@ internal sealed class ScriptHostConfiguration : IScriptHostConfiguration
|
||||
SharedPath = Path.Join(new[] { hostEnvironment.ContentRootPath, "shared" });
|
||||
PluginPath = Path.Join(new[] { hostEnvironment.ContentRootPath, "plugins" });
|
||||
ConfigsPath = Path.Join(new[] { hostEnvironment.ContentRootPath, "configs" });
|
||||
GameDataPath = Path.Join(new[] { hostEnvironment.ContentRootPath, "gamedata" });
|
||||
GameDataPath = Path.Join(new[] { hostEnvironment.ContentRootPath, "gamedata" });
|
||||
LanguagePath = Path.Join(new[] { hostEnvironment.ContentRootPath, "lang" });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,8 +6,8 @@ using CounterStrikeSharp.API.Modules.Utils;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core
|
||||
{
|
||||
public class Listeners {
|
||||
|
||||
public class Listeners
|
||||
{
|
||||
/// <summary>
|
||||
/// Called when an entity is spawned.
|
||||
/// </summary>
|
||||
@@ -44,6 +44,18 @@ namespace CounterStrikeSharp.API.Core
|
||||
[ListenerName("OnTick")]
|
||||
public delegate void OnTick();
|
||||
|
||||
/// <summary>
|
||||
/// Called on every server frame before entities think.
|
||||
/// </summary>
|
||||
[ListenerName("OnServerPreEntityThink")]
|
||||
public delegate void OnServerPreEntityThink();
|
||||
|
||||
/// <summary>
|
||||
/// Called on every server frame after entities think.
|
||||
/// </summary>
|
||||
[ListenerName("OnServerPostEntityThink")]
|
||||
public delegate void OnServerPostEntityThink();
|
||||
|
||||
/// <summary>
|
||||
/// Called when a new map is loaded.
|
||||
/// </summary>
|
||||
@@ -107,7 +119,7 @@ namespace CounterStrikeSharp.API.Core
|
||||
/// <param name="playerSlot">The player slot of the authorized client.</param>
|
||||
/// <param name="steamId">The Steam ID of the authorized client.</param>
|
||||
[ListenerName("OnClientAuthorized")]
|
||||
public delegate void OnClientAuthorized(int playerSlot, [CastFrom(typeof(ulong))]SteamID steamId);
|
||||
public delegate void OnClientAuthorized(int playerSlot, [CastFrom(typeof(ulong))] SteamID steamId);
|
||||
|
||||
/// <summary>
|
||||
/// Called when the server is updating the hibernation state.
|
||||
@@ -163,5 +175,37 @@ namespace CounterStrikeSharp.API.Core
|
||||
/// <param name="manifest">Resource Manifest</param>
|
||||
[ListenerName("OnServerPrecacheResources")]
|
||||
public delegate void OnServerPrecacheResources(ResourceManifest manifest);
|
||||
|
||||
/// <summary>
|
||||
/// Called when checking transmit on entities.
|
||||
/// </summary>
|
||||
/// <param name="infoList">Transmit info list</param>
|
||||
[ListenerName("CheckTransmit")]
|
||||
public delegate void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList);
|
||||
|
||||
/// <summary>
|
||||
/// Called in the entity pre-think when the player's buttons have changed.
|
||||
/// </summary>
|
||||
/// <param name="player"></param>
|
||||
/// <param name="pressed"></param>
|
||||
/// <param name="released"></param>
|
||||
[ListenerName("OnPlayerButtonsChanged")]
|
||||
public delegate void OnPlayerButtonsChanged(CCSPlayerController player, PlayerButtons pressed, PlayerButtons released);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Called when a player sends a chat message.
|
||||
/// </summary>
|
||||
/// <param name="player">The player who sent the chat message.</param>
|
||||
/// <param name="message">The content of the chat message.</param>
|
||||
/// <param name="teamChat">If the chat message was sent to team only.</param>
|
||||
[ListenerName("OnPlayerChat")]
|
||||
public delegate void OnPlayerChat(CCSPlayerController player, string message, bool teamChat);
|
||||
|
||||
/// <summary>
|
||||
/// Called when all metamod plugins are loaded.
|
||||
/// </summary>
|
||||
[ListenerName("OnMetamodAllPluginsLoaded")]
|
||||
public delegate void OnMetamodAllPluginsLoaded();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,71 @@
|
||||
using System;
|
||||
using System.Numerics;
|
||||
using System.Runtime.InteropServices;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CBaseEntity
|
||||
{
|
||||
/// <exception cref="InvalidOperationException">Entity is not valid</exception>
|
||||
/// <exception cref="ArgumentNullException">No valid argument</exception>
|
||||
/// <exception cref="ArgumentNullException">At least one parameter must be specified</exception>
|
||||
public void Teleport(Vector? position = null, QAngle? angles = null, Vector? velocity = null)
|
||||
{
|
||||
Guard.IsValidEntity(this);
|
||||
|
||||
|
||||
if (position == null && angles == null && velocity == null)
|
||||
throw new ArgumentNullException("No valid argument");
|
||||
|
||||
throw new ArgumentException("At least one parameter must be specified");
|
||||
|
||||
nint _position = position?.Handle ?? 0;
|
||||
nint _angles = angles?.Handle ?? 0;
|
||||
nint _velocity = velocity?.Handle ?? 0;
|
||||
|
||||
VirtualFunction.CreateVoid<IntPtr, IntPtr, IntPtr, IntPtr>(Handle, GameData.GetOffset("CBaseEntity_Teleport"))(Handle, _position, _angles, _velocity);
|
||||
nint _handle = Handle;
|
||||
|
||||
VirtualFunction.CreateVoid<IntPtr, IntPtr, IntPtr, IntPtr>(_handle, GameData.GetOffset("CBaseEntity_Teleport"))(_handle, _position,
|
||||
_angles, _velocity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Teleports the entity to the specified position, angles, and velocity using Vector3 parameters.
|
||||
/// This overload is optimized for memory efficiency by directly working with a Vector3 struct.
|
||||
/// </summary>
|
||||
/// <exception cref="InvalidOperationException">Entity is not valid</exception>
|
||||
/// <exception cref="ArgumentException">At least one parameter must be specified</exception>
|
||||
public void Teleport(Vector3? position = null, Vector3? angles = null, Vector3? velocity = null)
|
||||
{
|
||||
Guard.IsValidEntity(this);
|
||||
|
||||
if (position == null && angles == null && velocity == null)
|
||||
throw new ArgumentException("At least one parameter must be specified");
|
||||
|
||||
unsafe
|
||||
{
|
||||
void* positionPtr = null, anglePtr = null, velocityPtr = null;
|
||||
|
||||
if (position.HasValue)
|
||||
{
|
||||
var pos = position.Value;
|
||||
positionPtr = &pos;
|
||||
}
|
||||
|
||||
if (angles.HasValue)
|
||||
{
|
||||
var ang = angles.Value;
|
||||
anglePtr = ∠
|
||||
}
|
||||
|
||||
if (velocity.HasValue)
|
||||
{
|
||||
var vel = velocity.Value;
|
||||
velocityPtr = &vel;
|
||||
}
|
||||
|
||||
VirtualFunction.CreateVoid<IntPtr, IntPtr, IntPtr, IntPtr>(Handle, GameData.GetOffset("CBaseEntity_Teleport"))(Handle,
|
||||
(nint)positionPtr,
|
||||
(nint)anglePtr, (nint)velocityPtr);
|
||||
}
|
||||
}
|
||||
|
||||
/// <exception cref="InvalidOperationException">Entity is not valid</exception>
|
||||
@@ -48,4 +93,25 @@ public partial class CBaseEntity
|
||||
|
||||
return (T)Activator.CreateInstance(typeof(T), Marshal.ReadIntPtr(SubclassID.Handle + 4));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Emit a soundevent to all players.
|
||||
/// </summary>
|
||||
/// <param name="soundEventName">The name of the soundevent to emit.</param>
|
||||
/// <param name="recipients">The recipients of the soundevent.</param>
|
||||
/// <param name="volume">The volume of the soundevent.</param>
|
||||
/// <param name="pitch">The pitch of the soundevent.</param>
|
||||
/// <returns>The sound event guid.</returns>
|
||||
public uint EmitSound(string soundEventName, RecipientFilter? recipients = null, float volume = 1f, float pitch = 0)
|
||||
{
|
||||
Guard.IsValidEntity(this);
|
||||
|
||||
if (recipients == null)
|
||||
{
|
||||
recipients = new RecipientFilter();
|
||||
recipients.AddAllPlayers();
|
||||
}
|
||||
|
||||
return NativeAPI.EmitSoundFilter(recipients.GetRecipientMask(), this.Index, soundEventName, volume, pitch);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,8 +14,11 @@
|
||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
||||
*/
|
||||
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
@@ -28,4 +31,49 @@ public partial class CCSGameRules
|
||||
{
|
||||
VirtualFunctions.TerminateRound(Handle, roundEndReason, delay, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
internal CBaseEntity? FindPickerEntityInternal(CBasePlayerController player)
|
||||
{
|
||||
// TODO: TEST!
|
||||
// the third parameter seems to be something like `CDefaultTypedEntityInstanceFilter<CBaseEntity>` but its optional (earlier it was a string?)
|
||||
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
VirtualFunctionWithReturn<CCSGameRules, CBasePlayerController, IntPtr?, CBaseEntity?> CCSGameRules_FindPickerEntity = new(Handle, GameData.GetOffset("CCSGameRules_FindPickerEntity"));
|
||||
return CCSGameRules_FindPickerEntity.Invoke(this, player, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
VirtualFunctionWithReturn<CCSGameRules, CBasePlayerController, IntPtr?, double, double, CBaseEntity?> CCSGameRules_FindPickerEntity = new(Handle, GameData.GetOffset("CCSGameRules_FindPickerEntity"));
|
||||
return CCSGameRules_FindPickerEntity.Invoke(this, player, null, 0, 0); // on linux we have a fourth and fifth parameter aswell, but they are unused because the condition for them is always unmet.
|
||||
}
|
||||
}
|
||||
|
||||
public T? FindPickerEntity<T>(CBasePlayerController player)
|
||||
where T : CBaseEntity
|
||||
{
|
||||
CBaseEntity? entity = FindPickerEntityInternal(player);
|
||||
|
||||
if (entity == null || !entity.IsValid)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return entity.As<T>();
|
||||
}
|
||||
|
||||
public CCSPlayerController? GetClientAimTarget(CCSPlayerController player)
|
||||
{
|
||||
CCSPlayerPawn? pawn = FindPickerEntity<CCSPlayerPawn>(player);
|
||||
|
||||
if (pawn == null || !pawn.IsValid)
|
||||
return null;
|
||||
|
||||
if (pawn.DesignerName == "player")
|
||||
{
|
||||
return pawn.OriginalController.Value;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ public partial class CCSPlayerController
|
||||
{
|
||||
Guard.IsValidEntity(this);
|
||||
|
||||
VirtualFunctions.ClientPrint(Handle, HudDestination.Chat, message, 0, 0, 0, 0);
|
||||
NativeAPI.ClientPrint(this.Slot, (int)HudDestination.Chat, message);
|
||||
}
|
||||
|
||||
/// <exception cref="InvalidOperationException">Entity is not valid</exception>
|
||||
@@ -58,7 +58,7 @@ public partial class CCSPlayerController
|
||||
{
|
||||
Guard.IsValidEntity(this);
|
||||
|
||||
VirtualFunctions.ClientPrint(Handle, HudDestination.Center, message, 0, 0, 0, 0);
|
||||
NativeAPI.ClientPrint(this.Slot, (int)HudDestination.Center, message);
|
||||
}
|
||||
|
||||
/// <exception cref="InvalidOperationException">Entity is not valid</exception>
|
||||
@@ -66,7 +66,7 @@ public partial class CCSPlayerController
|
||||
{
|
||||
Guard.IsValidEntity(this);
|
||||
|
||||
VirtualFunctions.ClientPrint(Handle, HudDestination.Alert, message, 0, 0, 0, 0);
|
||||
NativeAPI.ClientPrint(this.Slot, (int)HudDestination.Alert, message);
|
||||
}
|
||||
|
||||
public void PrintToCenterHtml(string message) => PrintToCenterHtml(message, 5);
|
||||
@@ -340,4 +340,16 @@ public partial class CCSPlayerController
|
||||
NativeAPI.SetClientVoiceFlags(Handle, (Byte)value);
|
||||
}
|
||||
}
|
||||
|
||||
[Obsolete(
|
||||
"You are trying to call Teleport on a non-physical player. Maybe you mean Pawn? (See: https://docs.cssharp.dev/docs/guides/referencing-players.html#controllers--pawns)")]
|
||||
public new void Teleport(Vector? position = null, QAngle? angles = null, Vector? velocity = null)
|
||||
{
|
||||
base.Teleport(position, angles, velocity);
|
||||
}
|
||||
|
||||
public void ReplicateConVar(string conVar, string value)
|
||||
{
|
||||
NativeAPI.ReplicateConvar(Slot, conVar, value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
@@ -54,4 +56,9 @@ public partial class CCSPlayer_ItemServices
|
||||
|
||||
return (T)Activator.CreateInstance(typeof(T), pointer)!;
|
||||
}
|
||||
|
||||
public AcquireResult CanAcquire(CEconItemView itemView, AcquireMethod method, IntPtr unknown = 0)
|
||||
{
|
||||
return VirtualFunctions.CCSPlayer_ItemServices_CanAcquireFunc.Invoke(this, itemView, method, unknown);
|
||||
}
|
||||
}
|
||||
|
||||
106
managed/CounterStrikeSharp.API/Core/Model/CCheckTransmitInfo.cs
Normal file
106
managed/CounterStrikeSharp.API/Core/Model/CCheckTransmitInfo.cs
Normal file
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* This file is part of CounterStrikeSharp.
|
||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
||||
*/
|
||||
|
||||
using System.Collections;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core
|
||||
{
|
||||
[StructLayout(LayoutKind.Explicit)]
|
||||
public struct CCheckTransmitInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// Entity n is already marked for transmission
|
||||
/// </summary>
|
||||
[FieldOffset(0x0)]
|
||||
public CFixedBitVecBase TransmitEntities;
|
||||
|
||||
/// <summary>
|
||||
/// Entity n is always send even if not in PVS (HLTV and Replay only)
|
||||
/// </summary>
|
||||
[FieldOffset(0x8)]
|
||||
public CFixedBitVecBase TransmitAlways;
|
||||
};
|
||||
|
||||
public sealed class CCheckTransmitInfoList : NativeObject, IReadOnlyList<(CCheckTransmitInfo info, CCSPlayerController? player)>
|
||||
{
|
||||
private int CheckTransmitPlayerSlotOffset = GameData.GetOffset("CheckTransmitPlayerSlot");
|
||||
|
||||
private unsafe nint* Inner => (nint*)base.Handle;
|
||||
|
||||
public unsafe int Count { get => (int)(*(this.Inner + 1)); }
|
||||
|
||||
public unsafe CCheckTransmitInfoList(IntPtr pointer) : base(pointer)
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Get transmit info for the given index.
|
||||
/// </summary>
|
||||
/// <param name="index">Index of the info you want to retrieve from the list, should be between 0 and '<see cref="Count"/>' - 1</param>
|
||||
/// <returns></returns>
|
||||
public (CCheckTransmitInfo info, CCSPlayerController? player) this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
var (transmit, slot) = this.Get(index);
|
||||
CCSPlayerController? player = Utilities.GetPlayerFromSlot(slot);
|
||||
return (transmit, player);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get transmit info for the given index.
|
||||
/// </summary>
|
||||
/// <param name="index">Index of the info you want to retrieve from the list, should be between 0 and '<see cref="Count"/>' - 1</param>
|
||||
/// <returns></returns>
|
||||
private unsafe (CCheckTransmitInfo, int) Get(int index)
|
||||
{
|
||||
if (index < 0 || index >= this.Count)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException("index");
|
||||
}
|
||||
|
||||
// 'base.Handle' holds the pointer for our 'CCheckTransmitInfoList' wrapper class
|
||||
|
||||
// Get the pointer to the array of 'CCheckTransmitInfo'
|
||||
nint* infoListPtr = *(nint**)this.Inner; // Dereference 'Inner' to get the pointer to the array
|
||||
|
||||
// Access the specific 'CCheckTransmitInfo*'
|
||||
nint infoPtr = *(infoListPtr + index);
|
||||
|
||||
// Retrieve the 'CCheckTransmitInfo' from the pointer
|
||||
CCheckTransmitInfo info = Marshal.PtrToStructure<CCheckTransmitInfo>(infoPtr);
|
||||
|
||||
// Get player slot from the 'infoPtr' using the 'CheckTransmitPlayerSlotOffset' offset
|
||||
int playerSlot = *(int*)((byte*)infoPtr + CheckTransmitPlayerSlotOffset);
|
||||
|
||||
return (info, playerSlot);
|
||||
}
|
||||
|
||||
public IEnumerator<(CCheckTransmitInfo, CCSPlayerController?)> GetEnumerator()
|
||||
{
|
||||
for (int i = 0; i < this.Count; i++)
|
||||
{
|
||||
yield return this[i];
|
||||
}
|
||||
}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
{
|
||||
return this.GetEnumerator();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
* This file is part of CounterStrikeSharp.
|
||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
||||
*/
|
||||
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core
|
||||
{
|
||||
// credits: qstage
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public unsafe struct CFixedBitVecBase
|
||||
{
|
||||
private const int LOG2_BITS_PER_INT = 5;
|
||||
private const int BITS_PER_INT = 32;
|
||||
|
||||
private readonly uint* m_Ints;
|
||||
|
||||
public void Add(CEntityInstance entityInstance) => Write(entityInstance.Index);
|
||||
|
||||
public void Add(int bitNum) => Write(bitNum);
|
||||
|
||||
public void Add(uint bitNum) => Write(bitNum);
|
||||
|
||||
public void Remove(CEntityInstance entityInstance) => Clear(entityInstance.Index);
|
||||
|
||||
public void Remove(int bitNum) => Clear(bitNum);
|
||||
|
||||
public void Remove(uint bitNum) => Clear(bitNum);
|
||||
|
||||
public bool Contains(CEntityInstance entityInstance) => Contains(entityInstance.Index);
|
||||
|
||||
public bool Contains(uint bitNum) => Contains((int)bitNum);
|
||||
|
||||
private void Clear(uint bitNum) => Clear((int)bitNum);
|
||||
|
||||
private void Write(uint bitNum) => Write((int)bitNum);
|
||||
|
||||
private void Clear(int bitNum)
|
||||
{
|
||||
if (!(bitNum >= 0 && bitNum < Utilities.MaxEdicts))
|
||||
return;
|
||||
|
||||
uint* pInt = m_Ints + BitVec_Int(bitNum);
|
||||
*pInt &= ~(uint)BitVec_Bit(bitNum);
|
||||
}
|
||||
|
||||
private void Write(int bitNum)
|
||||
{
|
||||
if (!(bitNum >= 0 && bitNum < Utilities.MaxEdicts))
|
||||
return;
|
||||
|
||||
uint* pInt = m_Ints + BitVec_Int(bitNum);
|
||||
*pInt |= (uint)BitVec_Bit(bitNum);
|
||||
}
|
||||
|
||||
public bool Contains(int bitNum)
|
||||
{
|
||||
if (!(bitNum >= 0 && bitNum < Utilities.MaxEdicts))
|
||||
return false;
|
||||
|
||||
uint* pInt = m_Ints + BitVec_Int(bitNum);
|
||||
return (*pInt & (uint)BitVec_Bit(bitNum)) != 0;
|
||||
}
|
||||
|
||||
private int BitVec_Int(int bitNum) => bitNum >> LOG2_BITS_PER_INT;
|
||||
|
||||
private int BitVec_Bit(int bitNum) => 1 << (bitNum & (BITS_PER_INT - 1));
|
||||
}
|
||||
}
|
||||
32
managed/CounterStrikeSharp.API/Core/Model/CTakeDamageInfo.cs
Normal file
32
managed/CounterStrikeSharp.API/Core/Model/CTakeDamageInfo.cs
Normal file
@@ -0,0 +1,32 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CTakeDamageInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// Retrieves the hitgroup
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// Returns a <see cref="HitGroup_t"/> enumeration representing the player's current hit group,
|
||||
/// or <see cref="HitGroup_t.HITGROUP_INVALID"/> if the hit group cannot be determined.
|
||||
/// </returns>
|
||||
public HitGroup_t GetHitGroup()
|
||||
{
|
||||
IntPtr v4 = Marshal.ReadIntPtr(Handle, GameData.GetOffset("CTakeDamageInfo_HitGroup"));
|
||||
|
||||
if (v4 == nint.Zero)
|
||||
{
|
||||
return HitGroup_t.HITGROUP_INVALID;
|
||||
}
|
||||
|
||||
IntPtr v1 = Marshal.ReadIntPtr(v4, 16);
|
||||
|
||||
if (v1 == nint.Zero)
|
||||
{
|
||||
return HitGroup_t.HITGROUP_GENERIC;
|
||||
}
|
||||
|
||||
return (HitGroup_t)Marshal.ReadInt32(v1, 56);
|
||||
}
|
||||
}
|
||||
18
managed/CounterStrikeSharp.API/Core/Model/CUtlSymbolLarge.cs
Normal file
18
managed/CounterStrikeSharp.API/Core/Model/CUtlSymbolLarge.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public class CUtlSymbolLarge : NativeObject
|
||||
{
|
||||
public CUtlSymbolLarge(IntPtr pointer) : base(pointer)
|
||||
{
|
||||
}
|
||||
|
||||
public bool IsValid => Handle != IntPtr.Zero;
|
||||
|
||||
public string String
|
||||
{
|
||||
get
|
||||
{
|
||||
return NativeAPI.GetStringFromSymbolLarge(Handle);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,56 @@
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
using System.Reflection.Metadata;
|
||||
|
||||
/// <summary>
|
||||
/// Placeholder for CVariant
|
||||
/// <see href="https://github.com/alliedmodders/hl2sdk/blob/cs2/public/variant.h"/>
|
||||
/// <remarks>A lot of entity outputs do not use this value</remarks>
|
||||
/// </summary>
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public class CVariant : NativeObject
|
||||
{
|
||||
public CVariant(IntPtr pointer) : base(pointer)
|
||||
{
|
||||
}
|
||||
|
||||
public bool IsValid => Handle != IntPtr.Zero;
|
||||
|
||||
public fieldtype_t FieldType => (fieldtype_t)NativeAPI.GetVariantType(Handle);
|
||||
|
||||
public T Get<T>()
|
||||
{
|
||||
var type = typeof(T);
|
||||
object result = type switch
|
||||
{
|
||||
_ when type == typeof(float) => NativeAPI.GetVariantFloat(Handle),
|
||||
_ when type == typeof(int) => NativeAPI.GetVariantInt(Handle),
|
||||
_ when type == typeof(uint) => NativeAPI.GetVariantUint(Handle),
|
||||
_ when type == typeof(string) => NativeAPI.GetVariantString(Handle),
|
||||
_ when type == typeof(bool) => NativeAPI.GetVariantBool(Handle),
|
||||
_ => throw new NotSupportedException(),
|
||||
};
|
||||
|
||||
return (T)result;
|
||||
}
|
||||
|
||||
public void Set<T>(T value)
|
||||
{
|
||||
var type = typeof(T);
|
||||
switch (type)
|
||||
{
|
||||
case var _ when value is float f:
|
||||
NativeAPI.SetVariantFloat(Handle, f);
|
||||
break;
|
||||
case var _ when value is int i:
|
||||
NativeAPI.SetVariantInt(Handle, i);
|
||||
break;
|
||||
case var _ when value is uint ui:
|
||||
NativeAPI.SetVariantUint(Handle, ui);
|
||||
break;
|
||||
case var _ when value is bool b:
|
||||
NativeAPI.SetVariantBool(Handle, b);
|
||||
break;
|
||||
case var _ when value is string s:
|
||||
NativeAPI.SetVariantString(Handle, s);
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ public partial class NetworkedVector<T> : NativeObject, IReadOnlyCollection<T>
|
||||
}
|
||||
|
||||
public unsafe uint Size => Unsafe.Read<uint>((void*)Handle);
|
||||
|
||||
|
||||
public unsafe int Count => NativeAPI.GetNetworkVectorSize(Handle);
|
||||
|
||||
public T this[int index]
|
||||
@@ -28,7 +28,7 @@ public partial class NetworkedVector<T> : NativeObject, IReadOnlyCollection<T>
|
||||
{
|
||||
throw new NotSupportedException("Networked vectors currently only support CHandle<T>");
|
||||
}
|
||||
|
||||
|
||||
return (T)Activator.CreateInstance(typeof(T), NativeAPI.GetNetworkVectorElementAt(Handle, index));
|
||||
}
|
||||
}
|
||||
@@ -50,4 +50,4 @@ public partial class NetworkedVector<T> : NativeObject, IReadOnlyCollection<T>
|
||||
{
|
||||
return GetEnumerator();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace CounterStrikeSharp.API.Core.Plugin.Host;
|
||||
|
||||
public interface IPluginContextDependencyResolver
|
||||
{
|
||||
public string? ResolvePath();
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
using System.Reflection;
|
||||
using Microsoft.Extensions.DependencyModel;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core.Plugin.Host;
|
||||
|
||||
public class PluginContextNuGetDependencyResolver : IPluginContextDependencyResolver
|
||||
{
|
||||
private const string NuGetPackagesEnvName = "NUGET_PACKAGES";
|
||||
|
||||
private readonly string _rootAssemblyName;
|
||||
private readonly string _rootAssemblyPath;
|
||||
private readonly AssemblyName _assemblyName;
|
||||
|
||||
public PluginContextNuGetDependencyResolver(string rootAssemblyName,
|
||||
string rootAssemblyPath,
|
||||
AssemblyName assemblyName)
|
||||
{
|
||||
_rootAssemblyName = rootAssemblyName;
|
||||
_rootAssemblyPath = rootAssemblyPath;
|
||||
_assemblyName = assemblyName;
|
||||
}
|
||||
|
||||
public string? ResolvePath()
|
||||
{
|
||||
var packagesRoot = GetNuGetPackagesRoot();
|
||||
if (string.IsNullOrWhiteSpace(packagesRoot))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var packageName = _assemblyName.Name;
|
||||
if (string.IsNullOrWhiteSpace(packageName))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var dependenciesPath = Path.Combine(_rootAssemblyPath, $"{_rootAssemblyName}.deps.json");
|
||||
if (!File.Exists(dependenciesPath))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
using var dependenciesStream = File.OpenRead(dependenciesPath);
|
||||
|
||||
using var dependencyReader = new DependencyContextJsonReader();
|
||||
var context = dependencyReader.Read(dependenciesStream);
|
||||
|
||||
var dependencyPath = string.Empty;
|
||||
foreach (var dependency in context.RuntimeLibraries)
|
||||
{
|
||||
if (dependency.Name == packageName)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(dependency.Path) || !dependency.RuntimeAssemblyGroups.Any())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var runtimeAssemblyGroup = dependency.RuntimeAssemblyGroups[0];
|
||||
if (!runtimeAssemblyGroup.AssetPaths.Any())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
dependencyPath = Path.Combine(dependency.Path, runtimeAssemblyGroup.AssetPaths[0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(dependencyPath))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return Path.Combine(packagesRoot, dependencyPath);
|
||||
}
|
||||
|
||||
private static string? GetNuGetPackagesRoot()
|
||||
{
|
||||
var nugetPath = Environment.GetEnvironmentVariable(NuGetPackagesEnvName);
|
||||
if (!string.IsNullOrWhiteSpace(nugetPath) && Directory.Exists(nugetPath))
|
||||
{
|
||||
return nugetPath;
|
||||
}
|
||||
|
||||
var userProfilePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
|
||||
if (string.IsNullOrWhiteSpace(userProfilePath))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return Path.Combine(userProfilePath, ".nuget", "packages");
|
||||
}
|
||||
}
|
||||
@@ -1,127 +1,251 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Runtime.Loader;
|
||||
using CounterStrikeSharp.API.Core.Capabilities;
|
||||
using CounterStrikeSharp.API.Core.Commands;
|
||||
using CounterStrikeSharp.API.Core.Hosting;
|
||||
using McMaster.NETCore.Plugins;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core.Plugin.Host;
|
||||
|
||||
public class PluginManager : IPluginManager
|
||||
{
|
||||
private readonly HashSet<PluginContext> _loadedPluginContexts = new();
|
||||
private readonly IScriptHostConfiguration _scriptHostConfiguration;
|
||||
private readonly ICommandManager _commandManager;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly ILogger<PluginManager> _logger;
|
||||
private readonly Dictionary<string, Assembly> _sharedAssemblies = new();
|
||||
private bool _loadedSharedLibs = false;
|
||||
|
||||
public PluginManager(IScriptHostConfiguration scriptHostConfiguration, ICommandManager commandManager,
|
||||
ILogger<PluginManager> logger, IServiceProvider serviceProvider, IServiceScopeFactory serviceScopeFactory)
|
||||
{
|
||||
_scriptHostConfiguration = scriptHostConfiguration;
|
||||
_commandManager = commandManager;
|
||||
_logger = logger;
|
||||
_serviceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
private void LoadLibrary(string path)
|
||||
{
|
||||
var loader = PluginLoader.CreateFromAssemblyFile(path, new[] { typeof(IPlugin), typeof(PluginCapability<>), typeof(PlayerCapability<>) },
|
||||
config => { config.PreferSharedTypes = true; });
|
||||
var assembly = loader.LoadDefaultAssembly();
|
||||
|
||||
_sharedAssemblies[assembly.GetName().Name] = assembly;
|
||||
}
|
||||
|
||||
private void LoadSharedLibraries()
|
||||
{
|
||||
var sharedDirectory = Directory.GetDirectories(_scriptHostConfiguration.SharedPath);
|
||||
var sharedAssemblyPaths = sharedDirectory
|
||||
.Select(dir => Path.Combine(dir, Path.GetFileName(dir) + ".dll"))
|
||||
.Where(File.Exists)
|
||||
.ToArray();
|
||||
|
||||
foreach (var sharedAssemblyPath in sharedAssemblyPaths)
|
||||
{
|
||||
try
|
||||
{
|
||||
LoadLibrary(sharedAssemblyPath);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(e, "Failed to load shared assembly from {Path}", sharedAssemblyPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Load()
|
||||
{
|
||||
var pluginDirectories = Directory.GetDirectories(_scriptHostConfiguration.PluginPath);
|
||||
var pluginAssemblyPaths = pluginDirectories
|
||||
.Select(dir => Path.Combine(dir, Path.GetFileName(dir) + ".dll"))
|
||||
.Where(File.Exists)
|
||||
.ToArray();
|
||||
|
||||
AssemblyLoadContext.Default.Resolving += (context, name) =>
|
||||
{
|
||||
if (!_loadedSharedLibs)
|
||||
{
|
||||
LoadSharedLibraries();
|
||||
_loadedSharedLibs = true;
|
||||
}
|
||||
|
||||
if (!_sharedAssemblies.TryGetValue(name.Name, out var assembly))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return assembly;
|
||||
};
|
||||
|
||||
if (CoreConfig.PluginAutoLoadEnabled)
|
||||
{
|
||||
foreach (var path in pluginAssemblyPaths)
|
||||
{
|
||||
try
|
||||
{
|
||||
LoadPlugin(path);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(e, "Failed to load plugin from {Path}", path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var plugin in _loadedPluginContexts)
|
||||
{
|
||||
try
|
||||
{
|
||||
plugin.Plugin?.OnAllPluginsLoaded(false);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(e, "OnAllPluginsLoaded failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerable<PluginContext> GetLoadedPlugins()
|
||||
{
|
||||
return _loadedPluginContexts;
|
||||
}
|
||||
|
||||
public void LoadPlugin(string path)
|
||||
{
|
||||
var plugin = new PluginContext(_serviceProvider, _commandManager, _scriptHostConfiguration, path,
|
||||
_loadedPluginContexts.Select(x => x.PluginId).DefaultIfEmpty(0).Max() + 1);
|
||||
_loadedPluginContexts.Add(plugin);
|
||||
plugin.Load();
|
||||
}
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Runtime.Loader;
|
||||
using CounterStrikeSharp.API.Core.Capabilities;
|
||||
using CounterStrikeSharp.API.Core.Commands;
|
||||
using CounterStrikeSharp.API.Core.Hosting;
|
||||
using McMaster.NETCore.Plugins;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core.Plugin.Host;
|
||||
|
||||
public class PluginManager : IPluginManager
|
||||
{
|
||||
private readonly HashSet<PluginContext> _loadedPluginContexts = new();
|
||||
private readonly IScriptHostConfiguration _scriptHostConfiguration;
|
||||
private readonly ICommandManager _commandManager;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly ILogger<PluginManager> _logger;
|
||||
private readonly Dictionary<string, Assembly> _sharedAssemblies = new();
|
||||
private bool _loadedSharedLibs = false;
|
||||
|
||||
public PluginManager(IScriptHostConfiguration scriptHostConfiguration, ICommandManager commandManager,
|
||||
ILogger<PluginManager> logger, IServiceProvider serviceProvider, IServiceScopeFactory serviceScopeFactory)
|
||||
{
|
||||
_scriptHostConfiguration = scriptHostConfiguration;
|
||||
_commandManager = commandManager;
|
||||
_logger = logger;
|
||||
_serviceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
private void LoadLibrary(string path)
|
||||
{
|
||||
var loader = PluginLoader.CreateFromAssemblyFile(path, new[] { typeof(IPlugin), typeof(PluginCapability<>), typeof(PlayerCapability<>) },
|
||||
config => { config.PreferSharedTypes = true; });
|
||||
var assembly = loader.LoadDefaultAssembly();
|
||||
|
||||
if (CoreConfig.PluginResolveNugetPackages)
|
||||
{
|
||||
foreach (var assemblyName in assembly.GetReferencedAssemblies())
|
||||
{
|
||||
if (TryLoadDependency(path, assembly.GetName().Name, assemblyName, out var dependency))
|
||||
{
|
||||
_sharedAssemblies.TryAdd(dependency.GetName().Name, dependency);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_sharedAssemblies[assembly.GetName().Name] = assembly;
|
||||
}
|
||||
|
||||
private void LoadSharedLibraries()
|
||||
{
|
||||
var sharedDirectory = Directory.GetDirectories(_scriptHostConfiguration.SharedPath);
|
||||
var sharedAssemblyPaths = sharedDirectory
|
||||
.Select(dir => Path.Combine(dir, Path.GetFileName(dir) + ".dll"))
|
||||
.Where(File.Exists)
|
||||
.ToArray();
|
||||
|
||||
foreach (var sharedAssemblyPath in sharedAssemblyPaths)
|
||||
{
|
||||
try
|
||||
{
|
||||
LoadLibrary(sharedAssemblyPath);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(e, "Failed to load shared assembly from {Path}", sharedAssemblyPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Load()
|
||||
{
|
||||
var pluginAssemblyPaths = GetPluginsAssemblyPaths();
|
||||
|
||||
AssemblyLoadContext.Default.Resolving += (context, name) =>
|
||||
{
|
||||
if (!_loadedSharedLibs)
|
||||
{
|
||||
LoadSharedLibraries();
|
||||
_loadedSharedLibs = true;
|
||||
}
|
||||
|
||||
if (!_sharedAssemblies.TryGetValue(name.Name, out var assembly))
|
||||
{
|
||||
if (CoreConfig.PluginResolveNugetPackages && TryLoadExternalLibrary(name, out assembly))
|
||||
{
|
||||
return assembly;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
return assembly;
|
||||
};
|
||||
|
||||
if (CoreConfig.PluginAutoLoadEnabled)
|
||||
{
|
||||
foreach (var path in pluginAssemblyPaths)
|
||||
{
|
||||
try
|
||||
{
|
||||
LoadPlugin(path);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(e, "Failed to load plugin from {Path}", path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var plugin in _loadedPluginContexts)
|
||||
{
|
||||
try
|
||||
{
|
||||
plugin.Plugin?.OnAllPluginsLoaded(false);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(e, "OnAllPluginsLoaded failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool TryLoadExternalLibrary(AssemblyName assemblyName, out Assembly? assembly)
|
||||
{
|
||||
assembly = null;
|
||||
if (!TryResolveReflectionAssemblyPath(out var pluginName, out var pluginPath))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!TryLoadDependency(pluginPath, pluginName, assemblyName, out assembly))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool TryLoadDependency(string pluginAssemblyPath,
|
||||
string pluginAssemblyName,
|
||||
AssemblyName dependencyAssemblyName,
|
||||
out Assembly? assembly)
|
||||
{
|
||||
assembly = null;
|
||||
|
||||
var dependencyName = dependencyAssemblyName.Name!;
|
||||
if (string.IsNullOrEmpty(pluginAssemblyPath) || _sharedAssemblies.ContainsKey(dependencyName))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var resolver = new PluginContextNuGetDependencyResolver(
|
||||
rootAssemblyName: pluginAssemblyName,
|
||||
rootAssemblyPath: Path.GetDirectoryName(pluginAssemblyPath)!,
|
||||
assemblyName: dependencyAssemblyName);
|
||||
|
||||
var dependencyPath = resolver.ResolvePath();
|
||||
if (string.IsNullOrWhiteSpace(dependencyPath))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var loader = PluginLoader.CreateFromAssemblyFile(dependencyPath, configure: c =>
|
||||
{
|
||||
c.PreferSharedTypes = true;
|
||||
});
|
||||
|
||||
assembly = loader.LoadDefaultAssembly();
|
||||
_sharedAssemblies[dependencyAssemblyName.Name!] = assembly;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public IEnumerable<PluginContext> GetLoadedPlugins()
|
||||
{
|
||||
return _loadedPluginContexts;
|
||||
}
|
||||
|
||||
public void LoadPlugin(string path)
|
||||
{
|
||||
var plugin = new PluginContext(_serviceProvider, _commandManager, _scriptHostConfiguration, path,
|
||||
_loadedPluginContexts.Select(x => x.PluginId).DefaultIfEmpty(0).Max() + 1);
|
||||
_loadedPluginContexts.Add(plugin);
|
||||
plugin.Load();
|
||||
}
|
||||
|
||||
private static bool TryResolveReflectionAssemblyPath(out string? assemblyName, out string? assemblyPath)
|
||||
{
|
||||
assemblyPath = null;
|
||||
assemblyName = null;
|
||||
|
||||
if (AssemblyLoadContext.CurrentContextualReflectionContext is var reflectionContext && reflectionContext is null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var mainAssemblyPathField = reflectionContext
|
||||
.GetType()
|
||||
.GetField("_mainAssemblyPath", BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
|
||||
if (mainAssemblyPathField is null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
assemblyPath = (string)mainAssemblyPathField.GetValue(reflectionContext)!;
|
||||
return !string.IsNullOrEmpty(assemblyPath);
|
||||
}
|
||||
|
||||
private string[] GetPluginsAssemblyPaths()
|
||||
{
|
||||
// Skip "disabled" at root level
|
||||
var rootSubDirs = Directory.GetDirectories(_scriptHostConfiguration.PluginPath)
|
||||
.Where(d => !Path.GetFileName(d).Equals("disabled", StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
var pluginDirectories = new List<string>();
|
||||
|
||||
foreach (var subDir in rootSubDirs)
|
||||
{
|
||||
var stack = new Stack<string>();
|
||||
stack.Push(subDir);
|
||||
|
||||
while (stack.Count > 0)
|
||||
{
|
||||
var currentDir = stack.Pop();
|
||||
var dirName = Path.GetFileName(currentDir);
|
||||
var expectedDll = Path.Combine(currentDir, dirName + ".dll");
|
||||
|
||||
if (File.Exists(expectedDll))
|
||||
{
|
||||
pluginDirectories.Add(currentDir);
|
||||
// Stop scanning deeper in this directory
|
||||
continue;
|
||||
}
|
||||
|
||||
// Add subdirectories to stack for further scanning
|
||||
foreach (var child in Directory.GetDirectories(currentDir))
|
||||
stack.Push(child);
|
||||
}
|
||||
}
|
||||
|
||||
return pluginDirectories
|
||||
.Select(d => Path.Combine(d, Path.GetFileName(d) + ".dll"))
|
||||
.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,10 +31,17 @@ using Microsoft.Extensions.Localization;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Serilog;
|
||||
using ILogger = Microsoft.Extensions.Logging.ILogger;
|
||||
using System.Threading;
|
||||
using System;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core.Plugin
|
||||
{
|
||||
public class PluginContext : IPluginContext
|
||||
public interface ISelfPluginControl
|
||||
{
|
||||
void TerminateSelf(string reason);
|
||||
}
|
||||
|
||||
public class PluginContext : IPluginContext, ISelfPluginControl
|
||||
{
|
||||
public PluginState State { get; set; } = PluginState.Unregistered;
|
||||
public IPlugin Plugin { get; private set; }
|
||||
@@ -50,10 +57,12 @@ namespace CounterStrikeSharp.API.Core.Plugin
|
||||
private readonly string _path;
|
||||
private readonly FileSystemWatcher _fileWatcher;
|
||||
private readonly IServiceProvider _applicationServiceProvider;
|
||||
|
||||
|
||||
public string FilePath => _path;
|
||||
private IServiceScope _serviceScope;
|
||||
|
||||
public string TerminationReason { get; private set; }
|
||||
|
||||
// TOOD: ServiceCollection
|
||||
private ILogger _logger = CoreLogging.Factory.CreateLogger<PluginContext>();
|
||||
|
||||
@@ -65,7 +74,7 @@ namespace CounterStrikeSharp.API.Core.Plugin
|
||||
_hostConfiguration = hostConfiguration;
|
||||
_path = path;
|
||||
PluginId = id;
|
||||
|
||||
|
||||
Loader = PluginLoader.CreateFromAssemblyFile(path,
|
||||
new[]
|
||||
{
|
||||
@@ -77,7 +86,7 @@ namespace CounterStrikeSharp.API.Core.Plugin
|
||||
config.IsUnloadable = true;
|
||||
config.PreferSharedTypes = true;
|
||||
});
|
||||
|
||||
|
||||
if (CoreConfig.PluginHotReloadEnabled)
|
||||
{
|
||||
_fileWatcher = new FileSystemWatcher
|
||||
@@ -113,14 +122,14 @@ namespace CounterStrikeSharp.API.Core.Plugin
|
||||
Load(hotReload: true);
|
||||
Plugin.OnAllPluginsLoaded(hotReload: true);
|
||||
});
|
||||
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public void Load(bool hotReload = false)
|
||||
{
|
||||
if (State == PluginState.Loaded) return;
|
||||
|
||||
|
||||
using (Loader.EnterContextualReflection())
|
||||
{
|
||||
var defaultAssembly = Loader.LoadDefaultAssembly();
|
||||
@@ -178,7 +187,7 @@ namespace CounterStrikeSharp.API.Core.Plugin
|
||||
method?.Invoke(pluginServiceCollection, new object[] { serviceCollection });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
serviceCollection.AddScoped<ICommandManager>(c => _commandManager);
|
||||
serviceCollection.DecorateSingleton<ICommandManager, PluginCommandManagerDecorator>();
|
||||
|
||||
@@ -215,7 +224,33 @@ namespace CounterStrikeSharp.API.Core.Plugin
|
||||
Plugin.Logger = ServiceProvider.GetRequiredService<ILoggerFactory>().CreateLogger(pluginType);
|
||||
|
||||
Plugin.InitializeConfig(Plugin, pluginType);
|
||||
Plugin.Load(hotReload);
|
||||
|
||||
if (Plugin is BasePlugin basePlugin)
|
||||
{
|
||||
basePlugin.SelfControl = this;
|
||||
}
|
||||
|
||||
this.TerminationReason = string.Empty;
|
||||
try
|
||||
{
|
||||
Plugin.Load(hotReload);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if ((ex.InnerException ?? ex) is PluginTerminationException pluginEx)
|
||||
{
|
||||
_logger.LogCritical("Terminating plugin {Name} with reason: {Reason}", Plugin.ModuleName, pluginEx.TerminationReason);
|
||||
this.TerminationReason = pluginEx.TerminationReason;
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogError(ex, "Failed to load plugin {Name}", Plugin.ModuleName);
|
||||
this.TerminationReason = ex.Message ?? "Unknown";
|
||||
}
|
||||
|
||||
Unload(hotReload);
|
||||
return;
|
||||
}
|
||||
|
||||
_logger.LogInformation("Finished loading plugin {Name}", Plugin.ModuleName);
|
||||
|
||||
@@ -233,12 +268,60 @@ namespace CounterStrikeSharp.API.Core.Plugin
|
||||
|
||||
_logger.LogInformation("Unloading plugin {Name}", Plugin.ModuleName);
|
||||
|
||||
Plugin.Unload(hotReload);
|
||||
|
||||
Plugin.Dispose();
|
||||
_serviceScope.Dispose();
|
||||
try
|
||||
{
|
||||
Plugin.Unload(hotReload);
|
||||
}
|
||||
catch
|
||||
{
|
||||
_logger.LogError("Failed to unload {Name} during error recovery, forcing cleanup", Plugin.ModuleName);
|
||||
return;
|
||||
}
|
||||
finally
|
||||
{
|
||||
Plugin.Dispose();
|
||||
_serviceScope.Dispose();
|
||||
}
|
||||
|
||||
_logger.LogInformation("Finished unloading plugin {Name}", cachedName);
|
||||
}
|
||||
|
||||
public void TerminateWithReason(string reason)
|
||||
{
|
||||
this.TerminationReason = reason;
|
||||
|
||||
switch (State)
|
||||
{
|
||||
case PluginState.Unloaded:
|
||||
case PluginState.Loading:
|
||||
break;
|
||||
case PluginState.Loaded:
|
||||
_logger.LogInformation("Terminating plugin {Name} with reason: {Reason}", Plugin.ModuleName, reason);
|
||||
Unload(false);
|
||||
break;
|
||||
}
|
||||
|
||||
// Force execution flow interruption via globally-handled exception to prevent stack unwinding
|
||||
throw new PluginTerminationException(reason);
|
||||
}
|
||||
|
||||
void ISelfPluginControl.TerminateSelf(string reason)
|
||||
{
|
||||
if (State != PluginState.Unloaded)
|
||||
{
|
||||
if (Thread.CurrentThread.IsThreadPoolThread)
|
||||
{
|
||||
Server.NextFrame(() => TerminateWithReason(reason));
|
||||
}
|
||||
else
|
||||
{
|
||||
TerminateWithReason(reason);
|
||||
}
|
||||
|
||||
// **Failsafe mechanism** ensures execution termination
|
||||
// Prevents control flow leakage back to plugin execution context
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
using System;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core.Plugin
|
||||
{
|
||||
public class PluginTerminationException : Exception
|
||||
{
|
||||
public string PluginName { get; }
|
||||
public string TerminationReason { get; }
|
||||
|
||||
public PluginTerminationException(string reason) : base($"Plugin terminated: {reason}")
|
||||
{
|
||||
TerminationReason = reason;
|
||||
}
|
||||
|
||||
public PluginTerminationException(string pluginName, string reason) : base($"Plugin '{pluginName}' terminated: {reason}")
|
||||
{
|
||||
PluginName = pluginName;
|
||||
TerminationReason = reason;
|
||||
}
|
||||
|
||||
public PluginTerminationException(string reason, Exception innerException) : base($"Plugin terminated: {reason}", innerException)
|
||||
{
|
||||
TerminationReason = reason;
|
||||
}
|
||||
|
||||
public PluginTerminationException(string pluginName, string reason, Exception innerException) : base($"Plugin '{pluginName}' terminated: {reason}", innerException)
|
||||
{
|
||||
PluginName = pluginName;
|
||||
TerminationReason = reason;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CAISound : CPointEntity
|
||||
{
|
||||
public CAISound (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_iSoundType
|
||||
[SchemaMember("CAISound", "m_iSoundType")]
|
||||
public ref SoundTypes_t SoundType => ref Schema.GetRef<SoundTypes_t>(this.Handle, "CAISound", "m_iSoundType");
|
||||
|
||||
// m_iSoundFlags
|
||||
[SchemaMember("CAISound", "m_iSoundFlags")]
|
||||
public ref SoundFlags_t SoundFlags => ref Schema.GetRef<SoundFlags_t>(this.Handle, "CAISound", "m_iSoundFlags");
|
||||
|
||||
// m_iVolume
|
||||
[SchemaMember("CAISound", "m_iVolume")]
|
||||
public ref Int32 Volume => ref Schema.GetRef<Int32>(this.Handle, "CAISound", "m_iVolume");
|
||||
|
||||
// m_iSoundIndex
|
||||
[SchemaMember("CAISound", "m_iSoundIndex")]
|
||||
public ref Int32 SoundIndex => ref Schema.GetRef<Int32>(this.Handle, "CAISound", "m_iSoundIndex");
|
||||
|
||||
// m_flDuration
|
||||
[SchemaMember("CAISound", "m_flDuration")]
|
||||
public ref float Duration => ref Schema.GetRef<float>(this.Handle, "CAISound", "m_flDuration");
|
||||
|
||||
// m_iszProxyEntityName
|
||||
[SchemaMember("CAISound", "m_iszProxyEntityName")]
|
||||
public string ProxyEntityName
|
||||
{
|
||||
get { return Schema.GetUtf8String(this.Handle, "CAISound", "m_iszProxyEntityName"); }
|
||||
set { Schema.SetString(this.Handle, "CAISound", "m_iszProxyEntityName", value); }
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CAI_ExpresserWithFollowup : CAI_Expresser
|
||||
{
|
||||
public CAI_ExpresserWithFollowup (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_pPostponedFollowup
|
||||
[SchemaMember("CAI_ExpresserWithFollowup", "m_pPostponedFollowup")]
|
||||
public ResponseFollowup? PostponedFollowup => Schema.GetPointer<ResponseFollowup>(this.Handle, "CAI_ExpresserWithFollowup", "m_pPostponedFollowup");
|
||||
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CBaseFire : CBaseEntity
|
||||
{
|
||||
public CBaseFire (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_flScale
|
||||
[SchemaMember("CBaseFire", "m_flScale")]
|
||||
public ref float Scale => ref Schema.GetRef<float>(this.Handle, "CBaseFire", "m_flScale");
|
||||
|
||||
// m_flStartScale
|
||||
[SchemaMember("CBaseFire", "m_flStartScale")]
|
||||
public ref float StartScale => ref Schema.GetRef<float>(this.Handle, "CBaseFire", "m_flStartScale");
|
||||
|
||||
// m_flScaleTime
|
||||
[SchemaMember("CBaseFire", "m_flScaleTime")]
|
||||
public ref float ScaleTime => ref Schema.GetRef<float>(this.Handle, "CBaseFire", "m_flScaleTime");
|
||||
|
||||
// m_nFlags
|
||||
[SchemaMember("CBaseFire", "m_nFlags")]
|
||||
public ref UInt32 FireFlags => ref Schema.GetRef<UInt32>(this.Handle, "CBaseFire", "m_nFlags");
|
||||
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CBaseViewModel : CBaseAnimGraph
|
||||
{
|
||||
public CBaseViewModel (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_vecLastFacing
|
||||
[SchemaMember("CBaseViewModel", "m_vecLastFacing")]
|
||||
public Vector LastFacing => Schema.GetDeclaredClass<Vector>(this.Handle, "CBaseViewModel", "m_vecLastFacing");
|
||||
|
||||
// m_nViewModelIndex
|
||||
[SchemaMember("CBaseViewModel", "m_nViewModelIndex")]
|
||||
public ref UInt32 ViewModelIndex => ref Schema.GetRef<UInt32>(this.Handle, "CBaseViewModel", "m_nViewModelIndex");
|
||||
|
||||
// m_nAnimationParity
|
||||
[SchemaMember("CBaseViewModel", "m_nAnimationParity")]
|
||||
public ref UInt32 AnimationParity => ref Schema.GetRef<UInt32>(this.Handle, "CBaseViewModel", "m_nAnimationParity");
|
||||
|
||||
// m_flAnimationStartTime
|
||||
[SchemaMember("CBaseViewModel", "m_flAnimationStartTime")]
|
||||
public ref float AnimationStartTime => ref Schema.GetRef<float>(this.Handle, "CBaseViewModel", "m_flAnimationStartTime");
|
||||
|
||||
// m_hWeapon
|
||||
[SchemaMember("CBaseViewModel", "m_hWeapon")]
|
||||
public CHandle<CBasePlayerWeapon> Weapon => Schema.GetDeclaredClass<CHandle<CBasePlayerWeapon>>(this.Handle, "CBaseViewModel", "m_hWeapon");
|
||||
|
||||
// m_sVMName
|
||||
[SchemaMember("CBaseViewModel", "m_sVMName")]
|
||||
public string VMName
|
||||
{
|
||||
get { return Schema.GetUtf8String(this.Handle, "CBaseViewModel", "m_sVMName"); }
|
||||
set { Schema.SetString(this.Handle, "CBaseViewModel", "m_sVMName", value); }
|
||||
}
|
||||
|
||||
// m_sAnimationPrefix
|
||||
[SchemaMember("CBaseViewModel", "m_sAnimationPrefix")]
|
||||
public string AnimationPrefix
|
||||
{
|
||||
get { return Schema.GetUtf8String(this.Handle, "CBaseViewModel", "m_sAnimationPrefix"); }
|
||||
set { Schema.SetString(this.Handle, "CBaseViewModel", "m_sAnimationPrefix", value); }
|
||||
}
|
||||
|
||||
// m_hOldLayerSequence
|
||||
[SchemaMember("CBaseViewModel", "m_hOldLayerSequence")]
|
||||
public ref Int32 OldLayerSequence => ref Schema.GetRef<Int32>(this.Handle, "CBaseViewModel", "m_hOldLayerSequence");
|
||||
|
||||
// m_oldLayer
|
||||
[SchemaMember("CBaseViewModel", "m_oldLayer")]
|
||||
public ref Int32 OldLayer => ref Schema.GetRef<Int32>(this.Handle, "CBaseViewModel", "m_oldLayer");
|
||||
|
||||
// m_oldLayerStartTime
|
||||
[SchemaMember("CBaseViewModel", "m_oldLayerStartTime")]
|
||||
public ref float OldLayerStartTime => ref Schema.GetRef<float>(this.Handle, "CBaseViewModel", "m_oldLayerStartTime");
|
||||
|
||||
// m_hControlPanel
|
||||
[SchemaMember("CBaseViewModel", "m_hControlPanel")]
|
||||
public CHandle<CBaseEntity> ControlPanel => Schema.GetDeclaredClass<CHandle<CBaseEntity>>(this.Handle, "CBaseViewModel", "m_hControlPanel");
|
||||
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CBubbling : CBaseModelEntity
|
||||
{
|
||||
public CBubbling (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_density
|
||||
[SchemaMember("CBubbling", "m_density")]
|
||||
public ref Int32 Density => ref Schema.GetRef<Int32>(this.Handle, "CBubbling", "m_density");
|
||||
|
||||
// m_frequency
|
||||
[SchemaMember("CBubbling", "m_frequency")]
|
||||
public ref Int32 Frequency => ref Schema.GetRef<Int32>(this.Handle, "CBubbling", "m_frequency");
|
||||
|
||||
// m_state
|
||||
[SchemaMember("CBubbling", "m_state")]
|
||||
public ref Int32 State => ref Schema.GetRef<Int32>(this.Handle, "CBubbling", "m_state");
|
||||
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CBuoyancyHelper : NativeObject
|
||||
{
|
||||
public CBuoyancyHelper (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_flFluidDensity
|
||||
[SchemaMember("CBuoyancyHelper", "m_flFluidDensity")]
|
||||
public ref float FluidDensity => ref Schema.GetRef<float>(this.Handle, "CBuoyancyHelper", "m_flFluidDensity");
|
||||
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CCSGOViewModel : CPredictedViewModel
|
||||
{
|
||||
public CCSGOViewModel (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_bShouldIgnoreOffsetAndAccuracy
|
||||
[SchemaMember("CCSGOViewModel", "m_bShouldIgnoreOffsetAndAccuracy")]
|
||||
public ref bool ShouldIgnoreOffsetAndAccuracy => ref Schema.GetRef<bool>(this.Handle, "CCSGOViewModel", "m_bShouldIgnoreOffsetAndAccuracy");
|
||||
|
||||
// m_nWeaponParity
|
||||
[SchemaMember("CCSGOViewModel", "m_nWeaponParity")]
|
||||
public ref UInt32 WeaponParity => ref Schema.GetRef<UInt32>(this.Handle, "CCSGOViewModel", "m_nWeaponParity");
|
||||
|
||||
// m_nOldWeaponParity
|
||||
[SchemaMember("CCSGOViewModel", "m_nOldWeaponParity")]
|
||||
public ref UInt32 OldWeaponParity => ref Schema.GetRef<UInt32>(this.Handle, "CCSGOViewModel", "m_nOldWeaponParity");
|
||||
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CCSObserver_ViewModelServices : CPlayer_ViewModelServices
|
||||
{
|
||||
public CCSObserver_ViewModelServices (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CCSPlayer_ViewModelServices : CPlayer_ViewModelServices
|
||||
{
|
||||
public CCSPlayer_ViewModelServices (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_hViewModel
|
||||
[SchemaMember("CCSPlayer_ViewModelServices", "m_hViewModel")]
|
||||
public Span<CHandle<CBaseViewModel>> ViewModel => Schema.GetFixedArray<CHandle<CBaseViewModel>>(this.Handle, "CCSPlayer_ViewModelServices", "m_hViewModel", 3);
|
||||
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CEnvFireSensor : CBaseEntity
|
||||
{
|
||||
public CEnvFireSensor (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_bEnabled
|
||||
[SchemaMember("CEnvFireSensor", "m_bEnabled")]
|
||||
public ref bool Enabled => ref Schema.GetRef<bool>(this.Handle, "CEnvFireSensor", "m_bEnabled");
|
||||
|
||||
// m_bHeatAtLevel
|
||||
[SchemaMember("CEnvFireSensor", "m_bHeatAtLevel")]
|
||||
public ref bool HeatAtLevel => ref Schema.GetRef<bool>(this.Handle, "CEnvFireSensor", "m_bHeatAtLevel");
|
||||
|
||||
// m_radius
|
||||
[SchemaMember("CEnvFireSensor", "m_radius")]
|
||||
public ref float Radius => ref Schema.GetRef<float>(this.Handle, "CEnvFireSensor", "m_radius");
|
||||
|
||||
// m_targetLevel
|
||||
[SchemaMember("CEnvFireSensor", "m_targetLevel")]
|
||||
public ref float TargetLevel => ref Schema.GetRef<float>(this.Handle, "CEnvFireSensor", "m_targetLevel");
|
||||
|
||||
// m_targetTime
|
||||
[SchemaMember("CEnvFireSensor", "m_targetTime")]
|
||||
public ref float TargetTime => ref Schema.GetRef<float>(this.Handle, "CEnvFireSensor", "m_targetTime");
|
||||
|
||||
// m_levelTime
|
||||
[SchemaMember("CEnvFireSensor", "m_levelTime")]
|
||||
public ref float LevelTime => ref Schema.GetRef<float>(this.Handle, "CEnvFireSensor", "m_levelTime");
|
||||
|
||||
// m_OnHeatLevelStart
|
||||
[SchemaMember("CEnvFireSensor", "m_OnHeatLevelStart")]
|
||||
public CEntityIOOutput OnHeatLevelStart => Schema.GetDeclaredClass<CEntityIOOutput>(this.Handle, "CEnvFireSensor", "m_OnHeatLevelStart");
|
||||
|
||||
// m_OnHeatLevelEnd
|
||||
[SchemaMember("CEnvFireSensor", "m_OnHeatLevelEnd")]
|
||||
public CEntityIOOutput OnHeatLevelEnd => Schema.GetDeclaredClass<CEntityIOOutput>(this.Handle, "CEnvFireSensor", "m_OnHeatLevelEnd");
|
||||
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CEnvFireSource : CBaseEntity
|
||||
{
|
||||
public CEnvFireSource (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_bEnabled
|
||||
[SchemaMember("CEnvFireSource", "m_bEnabled")]
|
||||
public ref bool Enabled => ref Schema.GetRef<bool>(this.Handle, "CEnvFireSource", "m_bEnabled");
|
||||
|
||||
// m_radius
|
||||
[SchemaMember("CEnvFireSource", "m_radius")]
|
||||
public ref float Radius => ref Schema.GetRef<float>(this.Handle, "CEnvFireSource", "m_radius");
|
||||
|
||||
// m_damage
|
||||
[SchemaMember("CEnvFireSource", "m_damage")]
|
||||
public ref float Damage => ref Schema.GetRef<float>(this.Handle, "CEnvFireSource", "m_damage");
|
||||
|
||||
}
|
||||
@@ -1,101 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CEnvMicrophone : CPointEntity
|
||||
{
|
||||
public CEnvMicrophone (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_bDisabled
|
||||
[SchemaMember("CEnvMicrophone", "m_bDisabled")]
|
||||
public ref bool Disabled => ref Schema.GetRef<bool>(this.Handle, "CEnvMicrophone", "m_bDisabled");
|
||||
|
||||
// m_hMeasureTarget
|
||||
[SchemaMember("CEnvMicrophone", "m_hMeasureTarget")]
|
||||
public CHandle<CBaseEntity> MeasureTarget => Schema.GetDeclaredClass<CHandle<CBaseEntity>>(this.Handle, "CEnvMicrophone", "m_hMeasureTarget");
|
||||
|
||||
// m_nSoundType
|
||||
[SchemaMember("CEnvMicrophone", "m_nSoundType")]
|
||||
public ref SoundTypes_t SoundType => ref Schema.GetRef<SoundTypes_t>(this.Handle, "CEnvMicrophone", "m_nSoundType");
|
||||
|
||||
// m_nSoundFlags
|
||||
[SchemaMember("CEnvMicrophone", "m_nSoundFlags")]
|
||||
public ref SoundFlags_t SoundFlags => ref Schema.GetRef<SoundFlags_t>(this.Handle, "CEnvMicrophone", "m_nSoundFlags");
|
||||
|
||||
// m_flSensitivity
|
||||
[SchemaMember("CEnvMicrophone", "m_flSensitivity")]
|
||||
public ref float Sensitivity => ref Schema.GetRef<float>(this.Handle, "CEnvMicrophone", "m_flSensitivity");
|
||||
|
||||
// m_flSmoothFactor
|
||||
[SchemaMember("CEnvMicrophone", "m_flSmoothFactor")]
|
||||
public ref float SmoothFactor => ref Schema.GetRef<float>(this.Handle, "CEnvMicrophone", "m_flSmoothFactor");
|
||||
|
||||
// m_flMaxRange
|
||||
[SchemaMember("CEnvMicrophone", "m_flMaxRange")]
|
||||
public ref float MaxRange => ref Schema.GetRef<float>(this.Handle, "CEnvMicrophone", "m_flMaxRange");
|
||||
|
||||
// m_iszSpeakerName
|
||||
[SchemaMember("CEnvMicrophone", "m_iszSpeakerName")]
|
||||
public string SpeakerName
|
||||
{
|
||||
get { return Schema.GetUtf8String(this.Handle, "CEnvMicrophone", "m_iszSpeakerName"); }
|
||||
set { Schema.SetString(this.Handle, "CEnvMicrophone", "m_iszSpeakerName", value); }
|
||||
}
|
||||
|
||||
// m_hSpeaker
|
||||
[SchemaMember("CEnvMicrophone", "m_hSpeaker")]
|
||||
public CHandle<CBaseEntity> Speaker => Schema.GetDeclaredClass<CHandle<CBaseEntity>>(this.Handle, "CEnvMicrophone", "m_hSpeaker");
|
||||
|
||||
// m_bAvoidFeedback
|
||||
[SchemaMember("CEnvMicrophone", "m_bAvoidFeedback")]
|
||||
public ref bool AvoidFeedback => ref Schema.GetRef<bool>(this.Handle, "CEnvMicrophone", "m_bAvoidFeedback");
|
||||
|
||||
// m_iSpeakerDSPPreset
|
||||
[SchemaMember("CEnvMicrophone", "m_iSpeakerDSPPreset")]
|
||||
public ref Int32 SpeakerDSPPreset => ref Schema.GetRef<Int32>(this.Handle, "CEnvMicrophone", "m_iSpeakerDSPPreset");
|
||||
|
||||
// m_iszListenFilter
|
||||
[SchemaMember("CEnvMicrophone", "m_iszListenFilter")]
|
||||
public string IszListenFilter
|
||||
{
|
||||
get { return Schema.GetUtf8String(this.Handle, "CEnvMicrophone", "m_iszListenFilter"); }
|
||||
set { Schema.SetString(this.Handle, "CEnvMicrophone", "m_iszListenFilter", value); }
|
||||
}
|
||||
|
||||
// m_hListenFilter
|
||||
[SchemaMember("CEnvMicrophone", "m_hListenFilter")]
|
||||
public CHandle<CBaseFilter> HListenFilter => Schema.GetDeclaredClass<CHandle<CBaseFilter>>(this.Handle, "CEnvMicrophone", "m_hListenFilter");
|
||||
|
||||
// m_OnRoutedSound
|
||||
[SchemaMember("CEnvMicrophone", "m_OnRoutedSound")]
|
||||
public CEntityIOOutput OnRoutedSound => Schema.GetDeclaredClass<CEntityIOOutput>(this.Handle, "CEnvMicrophone", "m_OnRoutedSound");
|
||||
|
||||
// m_OnHeardSound
|
||||
[SchemaMember("CEnvMicrophone", "m_OnHeardSound")]
|
||||
public CEntityIOOutput OnHeardSound => Schema.GetDeclaredClass<CEntityIOOutput>(this.Handle, "CEnvMicrophone", "m_OnHeardSound");
|
||||
|
||||
// m_szLastSound
|
||||
[SchemaMember("CEnvMicrophone", "m_szLastSound")]
|
||||
public string LastSound
|
||||
{
|
||||
get { return Schema.GetString(this.Handle, "CEnvMicrophone", "m_szLastSound"); }
|
||||
set { Schema.SetStringBytes(this.Handle, "CEnvMicrophone", "m_szLastSound", value, 256); }
|
||||
}
|
||||
|
||||
// m_iLastRoutedFrame
|
||||
[SchemaMember("CEnvMicrophone", "m_iLastRoutedFrame")]
|
||||
public ref Int32 LastRoutedFrame => ref Schema.GetRef<Int32>(this.Handle, "CEnvMicrophone", "m_iLastRoutedFrame");
|
||||
|
||||
}
|
||||
@@ -1,149 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CEnvProjectedTexture : CModelPointEntity
|
||||
{
|
||||
public CEnvProjectedTexture (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_hTargetEntity
|
||||
[SchemaMember("CEnvProjectedTexture", "m_hTargetEntity")]
|
||||
public CHandle<CBaseEntity> TargetEntity => Schema.GetDeclaredClass<CHandle<CBaseEntity>>(this.Handle, "CEnvProjectedTexture", "m_hTargetEntity");
|
||||
|
||||
// m_bState
|
||||
[SchemaMember("CEnvProjectedTexture", "m_bState")]
|
||||
public ref bool State => ref Schema.GetRef<bool>(this.Handle, "CEnvProjectedTexture", "m_bState");
|
||||
|
||||
// m_bAlwaysUpdate
|
||||
[SchemaMember("CEnvProjectedTexture", "m_bAlwaysUpdate")]
|
||||
public ref bool AlwaysUpdate => ref Schema.GetRef<bool>(this.Handle, "CEnvProjectedTexture", "m_bAlwaysUpdate");
|
||||
|
||||
// m_flLightFOV
|
||||
[SchemaMember("CEnvProjectedTexture", "m_flLightFOV")]
|
||||
public ref float LightFOV => ref Schema.GetRef<float>(this.Handle, "CEnvProjectedTexture", "m_flLightFOV");
|
||||
|
||||
// m_bEnableShadows
|
||||
[SchemaMember("CEnvProjectedTexture", "m_bEnableShadows")]
|
||||
public ref bool EnableShadows => ref Schema.GetRef<bool>(this.Handle, "CEnvProjectedTexture", "m_bEnableShadows");
|
||||
|
||||
// m_bSimpleProjection
|
||||
[SchemaMember("CEnvProjectedTexture", "m_bSimpleProjection")]
|
||||
public ref bool SimpleProjection => ref Schema.GetRef<bool>(this.Handle, "CEnvProjectedTexture", "m_bSimpleProjection");
|
||||
|
||||
// m_bLightOnlyTarget
|
||||
[SchemaMember("CEnvProjectedTexture", "m_bLightOnlyTarget")]
|
||||
public ref bool LightOnlyTarget => ref Schema.GetRef<bool>(this.Handle, "CEnvProjectedTexture", "m_bLightOnlyTarget");
|
||||
|
||||
// m_bLightWorld
|
||||
[SchemaMember("CEnvProjectedTexture", "m_bLightWorld")]
|
||||
public ref bool LightWorld => ref Schema.GetRef<bool>(this.Handle, "CEnvProjectedTexture", "m_bLightWorld");
|
||||
|
||||
// m_bCameraSpace
|
||||
[SchemaMember("CEnvProjectedTexture", "m_bCameraSpace")]
|
||||
public ref bool CameraSpace => ref Schema.GetRef<bool>(this.Handle, "CEnvProjectedTexture", "m_bCameraSpace");
|
||||
|
||||
// m_flBrightnessScale
|
||||
[SchemaMember("CEnvProjectedTexture", "m_flBrightnessScale")]
|
||||
public ref float BrightnessScale => ref Schema.GetRef<float>(this.Handle, "CEnvProjectedTexture", "m_flBrightnessScale");
|
||||
|
||||
// m_LightColor
|
||||
[SchemaMember("CEnvProjectedTexture", "m_LightColor")]
|
||||
public Color LightColor
|
||||
{
|
||||
get { return Schema.GetCustomMarshalledType<Color>(this.Handle, "CEnvProjectedTexture", "m_LightColor"); }
|
||||
set { Schema.SetCustomMarshalledType<Color>(this.Handle, "CEnvProjectedTexture", "m_LightColor", value); }
|
||||
}
|
||||
|
||||
// m_flIntensity
|
||||
[SchemaMember("CEnvProjectedTexture", "m_flIntensity")]
|
||||
public ref float Intensity => ref Schema.GetRef<float>(this.Handle, "CEnvProjectedTexture", "m_flIntensity");
|
||||
|
||||
// m_flLinearAttenuation
|
||||
[SchemaMember("CEnvProjectedTexture", "m_flLinearAttenuation")]
|
||||
public ref float LinearAttenuation => ref Schema.GetRef<float>(this.Handle, "CEnvProjectedTexture", "m_flLinearAttenuation");
|
||||
|
||||
// m_flQuadraticAttenuation
|
||||
[SchemaMember("CEnvProjectedTexture", "m_flQuadraticAttenuation")]
|
||||
public ref float QuadraticAttenuation => ref Schema.GetRef<float>(this.Handle, "CEnvProjectedTexture", "m_flQuadraticAttenuation");
|
||||
|
||||
// m_bVolumetric
|
||||
[SchemaMember("CEnvProjectedTexture", "m_bVolumetric")]
|
||||
public ref bool Volumetric => ref Schema.GetRef<bool>(this.Handle, "CEnvProjectedTexture", "m_bVolumetric");
|
||||
|
||||
// m_flNoiseStrength
|
||||
[SchemaMember("CEnvProjectedTexture", "m_flNoiseStrength")]
|
||||
public ref float NoiseStrength => ref Schema.GetRef<float>(this.Handle, "CEnvProjectedTexture", "m_flNoiseStrength");
|
||||
|
||||
// m_flFlashlightTime
|
||||
[SchemaMember("CEnvProjectedTexture", "m_flFlashlightTime")]
|
||||
public ref float FlashlightTime => ref Schema.GetRef<float>(this.Handle, "CEnvProjectedTexture", "m_flFlashlightTime");
|
||||
|
||||
// m_nNumPlanes
|
||||
[SchemaMember("CEnvProjectedTexture", "m_nNumPlanes")]
|
||||
public ref UInt32 NumPlanes => ref Schema.GetRef<UInt32>(this.Handle, "CEnvProjectedTexture", "m_nNumPlanes");
|
||||
|
||||
// m_flPlaneOffset
|
||||
[SchemaMember("CEnvProjectedTexture", "m_flPlaneOffset")]
|
||||
public ref float PlaneOffset => ref Schema.GetRef<float>(this.Handle, "CEnvProjectedTexture", "m_flPlaneOffset");
|
||||
|
||||
// m_flVolumetricIntensity
|
||||
[SchemaMember("CEnvProjectedTexture", "m_flVolumetricIntensity")]
|
||||
public ref float VolumetricIntensity => ref Schema.GetRef<float>(this.Handle, "CEnvProjectedTexture", "m_flVolumetricIntensity");
|
||||
|
||||
// m_flColorTransitionTime
|
||||
[SchemaMember("CEnvProjectedTexture", "m_flColorTransitionTime")]
|
||||
public ref float ColorTransitionTime => ref Schema.GetRef<float>(this.Handle, "CEnvProjectedTexture", "m_flColorTransitionTime");
|
||||
|
||||
// m_flAmbient
|
||||
[SchemaMember("CEnvProjectedTexture", "m_flAmbient")]
|
||||
public ref float Ambient => ref Schema.GetRef<float>(this.Handle, "CEnvProjectedTexture", "m_flAmbient");
|
||||
|
||||
// m_SpotlightTextureName
|
||||
[SchemaMember("CEnvProjectedTexture", "m_SpotlightTextureName")]
|
||||
public string SpotlightTextureName
|
||||
{
|
||||
get { return Schema.GetString(this.Handle, "CEnvProjectedTexture", "m_SpotlightTextureName"); }
|
||||
set { Schema.SetStringBytes(this.Handle, "CEnvProjectedTexture", "m_SpotlightTextureName", value, 512); }
|
||||
}
|
||||
|
||||
// m_nSpotlightTextureFrame
|
||||
[SchemaMember("CEnvProjectedTexture", "m_nSpotlightTextureFrame")]
|
||||
public ref Int32 SpotlightTextureFrame => ref Schema.GetRef<Int32>(this.Handle, "CEnvProjectedTexture", "m_nSpotlightTextureFrame");
|
||||
|
||||
// m_nShadowQuality
|
||||
[SchemaMember("CEnvProjectedTexture", "m_nShadowQuality")]
|
||||
public ref UInt32 ShadowQuality => ref Schema.GetRef<UInt32>(this.Handle, "CEnvProjectedTexture", "m_nShadowQuality");
|
||||
|
||||
// m_flNearZ
|
||||
[SchemaMember("CEnvProjectedTexture", "m_flNearZ")]
|
||||
public ref float NearZ => ref Schema.GetRef<float>(this.Handle, "CEnvProjectedTexture", "m_flNearZ");
|
||||
|
||||
// m_flFarZ
|
||||
[SchemaMember("CEnvProjectedTexture", "m_flFarZ")]
|
||||
public ref float FarZ => ref Schema.GetRef<float>(this.Handle, "CEnvProjectedTexture", "m_flFarZ");
|
||||
|
||||
// m_flProjectionSize
|
||||
[SchemaMember("CEnvProjectedTexture", "m_flProjectionSize")]
|
||||
public ref float ProjectionSize => ref Schema.GetRef<float>(this.Handle, "CEnvProjectedTexture", "m_flProjectionSize");
|
||||
|
||||
// m_flRotation
|
||||
[SchemaMember("CEnvProjectedTexture", "m_flRotation")]
|
||||
public ref float Rotation => ref Schema.GetRef<float>(this.Handle, "CEnvProjectedTexture", "m_flRotation");
|
||||
|
||||
// m_bFlipHorizontal
|
||||
[SchemaMember("CEnvProjectedTexture", "m_bFlipHorizontal")]
|
||||
public ref bool FlipHorizontal => ref Schema.GetRef<bool>(this.Handle, "CEnvProjectedTexture", "m_bFlipHorizontal");
|
||||
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CEnvScreenOverlay : CPointEntity
|
||||
{
|
||||
public CEnvScreenOverlay (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_iszOverlayNames
|
||||
[SchemaMember("CEnvScreenOverlay", "m_iszOverlayNames")]
|
||||
public Span<string> OverlayNames => Schema.GetFixedArray<string>(this.Handle, "CEnvScreenOverlay", "m_iszOverlayNames", 10);
|
||||
|
||||
// m_flOverlayTimes
|
||||
[SchemaMember("CEnvScreenOverlay", "m_flOverlayTimes")]
|
||||
public Span<float> OverlayTimes => Schema.GetFixedArray<float>(this.Handle, "CEnvScreenOverlay", "m_flOverlayTimes", 10);
|
||||
|
||||
// m_flStartTime
|
||||
[SchemaMember("CEnvScreenOverlay", "m_flStartTime")]
|
||||
public ref float StartTime => ref Schema.GetRef<float>(this.Handle, "CEnvScreenOverlay", "m_flStartTime");
|
||||
|
||||
// m_iDesiredOverlay
|
||||
[SchemaMember("CEnvScreenOverlay", "m_iDesiredOverlay")]
|
||||
public ref Int32 DesiredOverlay => ref Schema.GetRef<Int32>(this.Handle, "CEnvScreenOverlay", "m_iDesiredOverlay");
|
||||
|
||||
// m_bIsActive
|
||||
[SchemaMember("CEnvScreenOverlay", "m_bIsActive")]
|
||||
public ref bool IsOverlayActive => ref Schema.GetRef<bool>(this.Handle, "CEnvScreenOverlay", "m_bIsActive");
|
||||
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CEnvTracer : CPointEntity
|
||||
{
|
||||
public CEnvTracer (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_vecEnd
|
||||
[SchemaMember("CEnvTracer", "m_vecEnd")]
|
||||
public Vector End => Schema.GetDeclaredClass<Vector>(this.Handle, "CEnvTracer", "m_vecEnd");
|
||||
|
||||
// m_flDelay
|
||||
[SchemaMember("CEnvTracer", "m_flDelay")]
|
||||
public ref float Delay => ref Schema.GetRef<float>(this.Handle, "CEnvTracer", "m_flDelay");
|
||||
|
||||
}
|
||||
@@ -1,97 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CFire : CBaseModelEntity
|
||||
{
|
||||
public CFire (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_hEffect
|
||||
[SchemaMember("CFire", "m_hEffect")]
|
||||
public CHandle<CBaseFire> Effect => Schema.GetDeclaredClass<CHandle<CBaseFire>>(this.Handle, "CFire", "m_hEffect");
|
||||
|
||||
// m_hOwner
|
||||
[SchemaMember("CFire", "m_hOwner")]
|
||||
public CHandle<CBaseEntity> Owner => Schema.GetDeclaredClass<CHandle<CBaseEntity>>(this.Handle, "CFire", "m_hOwner");
|
||||
|
||||
// m_nFireType
|
||||
[SchemaMember("CFire", "m_nFireType")]
|
||||
public ref Int32 FireType => ref Schema.GetRef<Int32>(this.Handle, "CFire", "m_nFireType");
|
||||
|
||||
// m_flFuel
|
||||
[SchemaMember("CFire", "m_flFuel")]
|
||||
public ref float Fuel => ref Schema.GetRef<float>(this.Handle, "CFire", "m_flFuel");
|
||||
|
||||
// m_flDamageTime
|
||||
[SchemaMember("CFire", "m_flDamageTime")]
|
||||
public ref float DamageTime => ref Schema.GetRef<float>(this.Handle, "CFire", "m_flDamageTime");
|
||||
|
||||
// m_lastDamage
|
||||
[SchemaMember("CFire", "m_lastDamage")]
|
||||
public ref float LastDamage => ref Schema.GetRef<float>(this.Handle, "CFire", "m_lastDamage");
|
||||
|
||||
// m_flFireSize
|
||||
[SchemaMember("CFire", "m_flFireSize")]
|
||||
public ref float FireSize => ref Schema.GetRef<float>(this.Handle, "CFire", "m_flFireSize");
|
||||
|
||||
// m_flLastNavUpdateTime
|
||||
[SchemaMember("CFire", "m_flLastNavUpdateTime")]
|
||||
public ref float LastNavUpdateTime => ref Schema.GetRef<float>(this.Handle, "CFire", "m_flLastNavUpdateTime");
|
||||
|
||||
// m_flHeatLevel
|
||||
[SchemaMember("CFire", "m_flHeatLevel")]
|
||||
public ref float HeatLevel => ref Schema.GetRef<float>(this.Handle, "CFire", "m_flHeatLevel");
|
||||
|
||||
// m_flHeatAbsorb
|
||||
[SchemaMember("CFire", "m_flHeatAbsorb")]
|
||||
public ref float HeatAbsorb => ref Schema.GetRef<float>(this.Handle, "CFire", "m_flHeatAbsorb");
|
||||
|
||||
// m_flDamageScale
|
||||
[SchemaMember("CFire", "m_flDamageScale")]
|
||||
public ref float DamageScale => ref Schema.GetRef<float>(this.Handle, "CFire", "m_flDamageScale");
|
||||
|
||||
// m_flMaxHeat
|
||||
[SchemaMember("CFire", "m_flMaxHeat")]
|
||||
public ref float MaxHeat => ref Schema.GetRef<float>(this.Handle, "CFire", "m_flMaxHeat");
|
||||
|
||||
// m_flLastHeatLevel
|
||||
[SchemaMember("CFire", "m_flLastHeatLevel")]
|
||||
public ref float LastHeatLevel => ref Schema.GetRef<float>(this.Handle, "CFire", "m_flLastHeatLevel");
|
||||
|
||||
// m_flAttackTime
|
||||
[SchemaMember("CFire", "m_flAttackTime")]
|
||||
public ref float AttackTime => ref Schema.GetRef<float>(this.Handle, "CFire", "m_flAttackTime");
|
||||
|
||||
// m_bEnabled
|
||||
[SchemaMember("CFire", "m_bEnabled")]
|
||||
public ref bool Enabled => ref Schema.GetRef<bool>(this.Handle, "CFire", "m_bEnabled");
|
||||
|
||||
// m_bStartDisabled
|
||||
[SchemaMember("CFire", "m_bStartDisabled")]
|
||||
public ref bool StartDisabled => ref Schema.GetRef<bool>(this.Handle, "CFire", "m_bStartDisabled");
|
||||
|
||||
// m_bDidActivate
|
||||
[SchemaMember("CFire", "m_bDidActivate")]
|
||||
public ref bool DidActivate => ref Schema.GetRef<bool>(this.Handle, "CFire", "m_bDidActivate");
|
||||
|
||||
// m_OnIgnited
|
||||
[SchemaMember("CFire", "m_OnIgnited")]
|
||||
public CEntityIOOutput OnIgnited => Schema.GetDeclaredClass<CEntityIOOutput>(this.Handle, "CFire", "m_OnIgnited");
|
||||
|
||||
// m_OnExtinguished
|
||||
[SchemaMember("CFire", "m_OnExtinguished")]
|
||||
public CEntityIOOutput OnExtinguished => Schema.GetDeclaredClass<CEntityIOOutput>(this.Handle, "CFire", "m_OnExtinguished");
|
||||
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CFireSmoke : CBaseFire
|
||||
{
|
||||
public CFireSmoke (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_nFlameModelIndex
|
||||
[SchemaMember("CFireSmoke", "m_nFlameModelIndex")]
|
||||
public ref Int32 FlameModelIndex => ref Schema.GetRef<Int32>(this.Handle, "CFireSmoke", "m_nFlameModelIndex");
|
||||
|
||||
// m_nFlameFromAboveModelIndex
|
||||
[SchemaMember("CFireSmoke", "m_nFlameFromAboveModelIndex")]
|
||||
public ref Int32 FlameFromAboveModelIndex => ref Schema.GetRef<Int32>(this.Handle, "CFireSmoke", "m_nFlameFromAboveModelIndex");
|
||||
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CFists : CCSWeaponBase
|
||||
{
|
||||
public CFists (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_bPlayingUninterruptableAct
|
||||
[SchemaMember("CFists", "m_bPlayingUninterruptableAct")]
|
||||
public ref bool PlayingUninterruptableAct => ref Schema.GetRef<bool>(this.Handle, "CFists", "m_bPlayingUninterruptableAct");
|
||||
|
||||
// m_nUninterruptableActivity
|
||||
[SchemaMember("CFists", "m_nUninterruptableActivity")]
|
||||
public ref PlayerAnimEvent_t UninterruptableActivity => ref Schema.GetRef<PlayerAnimEvent_t>(this.Handle, "CFists", "m_nUninterruptableActivity");
|
||||
|
||||
// m_bRestorePrevWep
|
||||
[SchemaMember("CFists", "m_bRestorePrevWep")]
|
||||
public ref bool RestorePrevWep => ref Schema.GetRef<bool>(this.Handle, "CFists", "m_bRestorePrevWep");
|
||||
|
||||
// m_hWeaponBeforePrevious
|
||||
[SchemaMember("CFists", "m_hWeaponBeforePrevious")]
|
||||
public CHandle<CBasePlayerWeapon> WeaponBeforePrevious => Schema.GetDeclaredClass<CHandle<CBasePlayerWeapon>>(this.Handle, "CFists", "m_hWeaponBeforePrevious");
|
||||
|
||||
// m_hWeaponPrevious
|
||||
[SchemaMember("CFists", "m_hWeaponPrevious")]
|
||||
public CHandle<CBasePlayerWeapon> WeaponPrevious => Schema.GetDeclaredClass<CHandle<CBasePlayerWeapon>>(this.Handle, "CFists", "m_hWeaponPrevious");
|
||||
|
||||
// m_bDelayedHardPunchIncoming
|
||||
[SchemaMember("CFists", "m_bDelayedHardPunchIncoming")]
|
||||
public ref bool DelayedHardPunchIncoming => ref Schema.GetRef<bool>(this.Handle, "CFists", "m_bDelayedHardPunchIncoming");
|
||||
|
||||
// m_bDestroyAfterTaunt
|
||||
[SchemaMember("CFists", "m_bDestroyAfterTaunt")]
|
||||
public ref bool DestroyAfterTaunt => ref Schema.GetRef<bool>(this.Handle, "CFists", "m_bDestroyAfterTaunt");
|
||||
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CLightGlow : CBaseModelEntity
|
||||
{
|
||||
public CLightGlow (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_nHorizontalSize
|
||||
[SchemaMember("CLightGlow", "m_nHorizontalSize")]
|
||||
public ref UInt32 HorizontalSize => ref Schema.GetRef<UInt32>(this.Handle, "CLightGlow", "m_nHorizontalSize");
|
||||
|
||||
// m_nVerticalSize
|
||||
[SchemaMember("CLightGlow", "m_nVerticalSize")]
|
||||
public ref UInt32 VerticalSize => ref Schema.GetRef<UInt32>(this.Handle, "CLightGlow", "m_nVerticalSize");
|
||||
|
||||
// m_nMinDist
|
||||
[SchemaMember("CLightGlow", "m_nMinDist")]
|
||||
public ref UInt32 MinDist => ref Schema.GetRef<UInt32>(this.Handle, "CLightGlow", "m_nMinDist");
|
||||
|
||||
// m_nMaxDist
|
||||
[SchemaMember("CLightGlow", "m_nMaxDist")]
|
||||
public ref UInt32 MaxDist => ref Schema.GetRef<UInt32>(this.Handle, "CLightGlow", "m_nMaxDist");
|
||||
|
||||
// m_nOuterMaxDist
|
||||
[SchemaMember("CLightGlow", "m_nOuterMaxDist")]
|
||||
public ref UInt32 OuterMaxDist => ref Schema.GetRef<UInt32>(this.Handle, "CLightGlow", "m_nOuterMaxDist");
|
||||
|
||||
// m_flGlowProxySize
|
||||
[SchemaMember("CLightGlow", "m_flGlowProxySize")]
|
||||
public ref float GlowProxySize => ref Schema.GetRef<float>(this.Handle, "CLightGlow", "m_flGlowProxySize");
|
||||
|
||||
// m_flHDRColorScale
|
||||
[SchemaMember("CLightGlow", "m_flHDRColorScale")]
|
||||
public ref float HDRColorScale => ref Schema.GetRef<float>(this.Handle, "CLightGlow", "m_flHDRColorScale");
|
||||
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CNavSpaceInfo : CPointEntity
|
||||
{
|
||||
public CNavSpaceInfo (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_bCreateFlightSpace
|
||||
[SchemaMember("CNavSpaceInfo", "m_bCreateFlightSpace")]
|
||||
public ref bool CreateFlightSpace => ref Schema.GetRef<bool>(this.Handle, "CNavSpaceInfo", "m_bCreateFlightSpace");
|
||||
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CPlayer_ViewModelServices : CPlayerPawnComponent
|
||||
{
|
||||
public CPlayer_ViewModelServices (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CProjectedDecal : CPointEntity
|
||||
{
|
||||
public CProjectedDecal (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_nTexture
|
||||
[SchemaMember("CProjectedDecal", "m_nTexture")]
|
||||
public ref Int32 Texture => ref Schema.GetRef<Int32>(this.Handle, "CProjectedDecal", "m_nTexture");
|
||||
|
||||
// m_flDistance
|
||||
[SchemaMember("CProjectedDecal", "m_flDistance")]
|
||||
public ref float Distance => ref Schema.GetRef<float>(this.Handle, "CProjectedDecal", "m_flDistance");
|
||||
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CSensorGrenade : CBaseCSGrenade
|
||||
{
|
||||
public CSensorGrenade (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CSensorGrenadeProjectile : CBaseCSGrenadeProjectile
|
||||
{
|
||||
public CSensorGrenadeProjectile (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_fExpireTime
|
||||
[SchemaMember("CSensorGrenadeProjectile", "m_fExpireTime")]
|
||||
public ref float ExpireTime => ref Schema.GetRef<float>(this.Handle, "CSensorGrenadeProjectile", "m_fExpireTime");
|
||||
|
||||
// m_fNextDetectPlayerSound
|
||||
[SchemaMember("CSensorGrenadeProjectile", "m_fNextDetectPlayerSound")]
|
||||
public ref float NextDetectPlayerSound => ref Schema.GetRef<float>(this.Handle, "CSensorGrenadeProjectile", "m_fNextDetectPlayerSound");
|
||||
|
||||
// m_hDisplayGrenade
|
||||
[SchemaMember("CSensorGrenadeProjectile", "m_hDisplayGrenade")]
|
||||
public CHandle<CBaseEntity> DisplayGrenade => Schema.GetDeclaredClass<CHandle<CBaseEntity>>(this.Handle, "CSensorGrenadeProjectile", "m_hDisplayGrenade");
|
||||
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CSound : NativeObject
|
||||
{
|
||||
public CSound (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_hOwner
|
||||
[SchemaMember("CSound", "m_hOwner")]
|
||||
public CHandle<CBaseEntity> Owner => Schema.GetDeclaredClass<CHandle<CBaseEntity>>(this.Handle, "CSound", "m_hOwner");
|
||||
|
||||
// m_hTarget
|
||||
[SchemaMember("CSound", "m_hTarget")]
|
||||
public CHandle<CBaseEntity> Target => Schema.GetDeclaredClass<CHandle<CBaseEntity>>(this.Handle, "CSound", "m_hTarget");
|
||||
|
||||
// m_iVolume
|
||||
[SchemaMember("CSound", "m_iVolume")]
|
||||
public ref Int32 Volume => ref Schema.GetRef<Int32>(this.Handle, "CSound", "m_iVolume");
|
||||
|
||||
// m_flOcclusionScale
|
||||
[SchemaMember("CSound", "m_flOcclusionScale")]
|
||||
public ref float OcclusionScale => ref Schema.GetRef<float>(this.Handle, "CSound", "m_flOcclusionScale");
|
||||
|
||||
// m_iNextAudible
|
||||
[SchemaMember("CSound", "m_iNextAudible")]
|
||||
public ref Int32 NextAudible => ref Schema.GetRef<Int32>(this.Handle, "CSound", "m_iNextAudible");
|
||||
|
||||
// m_flExpireTime
|
||||
[SchemaMember("CSound", "m_flExpireTime")]
|
||||
public ref float ExpireTime => ref Schema.GetRef<float>(this.Handle, "CSound", "m_flExpireTime");
|
||||
|
||||
// m_iNext
|
||||
[SchemaMember("CSound", "m_iNext")]
|
||||
public ref Int16 Next => ref Schema.GetRef<Int16>(this.Handle, "CSound", "m_iNext");
|
||||
|
||||
// m_bNoExpirationTime
|
||||
[SchemaMember("CSound", "m_bNoExpirationTime")]
|
||||
public ref bool NoExpirationTime => ref Schema.GetRef<bool>(this.Handle, "CSound", "m_bNoExpirationTime");
|
||||
|
||||
// m_ownerChannelIndex
|
||||
[SchemaMember("CSound", "m_ownerChannelIndex")]
|
||||
public ref Int32 OwnerChannelIndex => ref Schema.GetRef<Int32>(this.Handle, "CSound", "m_ownerChannelIndex");
|
||||
|
||||
// m_vecOrigin
|
||||
[SchemaMember("CSound", "m_vecOrigin")]
|
||||
public Vector Origin => Schema.GetDeclaredClass<Vector>(this.Handle, "CSound", "m_vecOrigin");
|
||||
|
||||
// m_bHasOwner
|
||||
[SchemaMember("CSound", "m_bHasOwner")]
|
||||
public ref bool HasOwner => ref Schema.GetRef<bool>(this.Handle, "CSound", "m_bHasOwner");
|
||||
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CSoundEnt : CPointEntity
|
||||
{
|
||||
public CSoundEnt (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_iFreeSound
|
||||
[SchemaMember("CSoundEnt", "m_iFreeSound")]
|
||||
public ref Int32 FreeSound => ref Schema.GetRef<Int32>(this.Handle, "CSoundEnt", "m_iFreeSound");
|
||||
|
||||
// m_iActiveSound
|
||||
[SchemaMember("CSoundEnt", "m_iActiveSound")]
|
||||
public ref Int32 ActiveSound => ref Schema.GetRef<Int32>(this.Handle, "CSoundEnt", "m_iActiveSound");
|
||||
|
||||
// m_cLastActiveSounds
|
||||
[SchemaMember("CSoundEnt", "m_cLastActiveSounds")]
|
||||
public ref Int32 CLastActiveSounds => ref Schema.GetRef<Int32>(this.Handle, "CSoundEnt", "m_cLastActiveSounds");
|
||||
|
||||
// m_SoundPool
|
||||
[SchemaMember("CSoundEnt", "m_SoundPool")]
|
||||
public Span<CSound> SoundPool => Schema.GetFixedArray<CSound>(this.Handle, "CSoundEnt", "m_SoundPool", 128);
|
||||
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CSplineConstraint : CPhysConstraint
|
||||
{
|
||||
public CSplineConstraint (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_vAnchorOffsetRestore
|
||||
[SchemaMember("CSplineConstraint", "m_vAnchorOffsetRestore")]
|
||||
public Vector AnchorOffsetRestore => Schema.GetDeclaredClass<Vector>(this.Handle, "CSplineConstraint", "m_vAnchorOffsetRestore");
|
||||
|
||||
}
|
||||
@@ -1,89 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CSun : CBaseModelEntity
|
||||
{
|
||||
public CSun (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_vDirection
|
||||
[SchemaMember("CSun", "m_vDirection")]
|
||||
public Vector Direction => Schema.GetDeclaredClass<Vector>(this.Handle, "CSun", "m_vDirection");
|
||||
|
||||
// m_clrOverlay
|
||||
[SchemaMember("CSun", "m_clrOverlay")]
|
||||
public Color Overlay
|
||||
{
|
||||
get { return Schema.GetCustomMarshalledType<Color>(this.Handle, "CSun", "m_clrOverlay"); }
|
||||
set { Schema.SetCustomMarshalledType<Color>(this.Handle, "CSun", "m_clrOverlay", value); }
|
||||
}
|
||||
|
||||
// m_iszEffectName
|
||||
[SchemaMember("CSun", "m_iszEffectName")]
|
||||
public string EffectName
|
||||
{
|
||||
get { return Schema.GetUtf8String(this.Handle, "CSun", "m_iszEffectName"); }
|
||||
set { Schema.SetString(this.Handle, "CSun", "m_iszEffectName", value); }
|
||||
}
|
||||
|
||||
// m_iszSSEffectName
|
||||
[SchemaMember("CSun", "m_iszSSEffectName")]
|
||||
public string SSEffectName
|
||||
{
|
||||
get { return Schema.GetUtf8String(this.Handle, "CSun", "m_iszSSEffectName"); }
|
||||
set { Schema.SetString(this.Handle, "CSun", "m_iszSSEffectName", value); }
|
||||
}
|
||||
|
||||
// m_bOn
|
||||
[SchemaMember("CSun", "m_bOn")]
|
||||
public ref bool On => ref Schema.GetRef<bool>(this.Handle, "CSun", "m_bOn");
|
||||
|
||||
// m_bmaxColor
|
||||
[SchemaMember("CSun", "m_bmaxColor")]
|
||||
public ref bool BmaxColor => ref Schema.GetRef<bool>(this.Handle, "CSun", "m_bmaxColor");
|
||||
|
||||
// m_flSize
|
||||
[SchemaMember("CSun", "m_flSize")]
|
||||
public ref float Size => ref Schema.GetRef<float>(this.Handle, "CSun", "m_flSize");
|
||||
|
||||
// m_flRotation
|
||||
[SchemaMember("CSun", "m_flRotation")]
|
||||
public ref float Rotation => ref Schema.GetRef<float>(this.Handle, "CSun", "m_flRotation");
|
||||
|
||||
// m_flHazeScale
|
||||
[SchemaMember("CSun", "m_flHazeScale")]
|
||||
public ref float HazeScale => ref Schema.GetRef<float>(this.Handle, "CSun", "m_flHazeScale");
|
||||
|
||||
// m_flAlphaHaze
|
||||
[SchemaMember("CSun", "m_flAlphaHaze")]
|
||||
public ref float AlphaHaze => ref Schema.GetRef<float>(this.Handle, "CSun", "m_flAlphaHaze");
|
||||
|
||||
// m_flAlphaHdr
|
||||
[SchemaMember("CSun", "m_flAlphaHdr")]
|
||||
public ref float AlphaHdr => ref Schema.GetRef<float>(this.Handle, "CSun", "m_flAlphaHdr");
|
||||
|
||||
// m_flAlphaScale
|
||||
[SchemaMember("CSun", "m_flAlphaScale")]
|
||||
public ref float AlphaScale => ref Schema.GetRef<float>(this.Handle, "CSun", "m_flAlphaScale");
|
||||
|
||||
// m_flHDRColorScale
|
||||
[SchemaMember("CSun", "m_flHDRColorScale")]
|
||||
public ref float HDRColorScale => ref Schema.GetRef<float>(this.Handle, "CSun", "m_flHDRColorScale");
|
||||
|
||||
// m_flFarZScale
|
||||
[SchemaMember("CSun", "m_flFarZScale")]
|
||||
public ref float FarZScale => ref Schema.GetRef<float>(this.Handle, "CSun", "m_flFarZScale");
|
||||
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CTriggerFan : CBaseTrigger
|
||||
{
|
||||
public CTriggerFan (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_vFanOrigin
|
||||
[SchemaMember("CTriggerFan", "m_vFanOrigin")]
|
||||
public Vector FanOrigin => Schema.GetDeclaredClass<Vector>(this.Handle, "CTriggerFan", "m_vFanOrigin");
|
||||
|
||||
// m_vFanEnd
|
||||
[SchemaMember("CTriggerFan", "m_vFanEnd")]
|
||||
public Vector FanEnd => Schema.GetDeclaredClass<Vector>(this.Handle, "CTriggerFan", "m_vFanEnd");
|
||||
|
||||
// m_vNoise
|
||||
[SchemaMember("CTriggerFan", "m_vNoise")]
|
||||
public Vector Noise => Schema.GetDeclaredClass<Vector>(this.Handle, "CTriggerFan", "m_vNoise");
|
||||
|
||||
// m_flForce
|
||||
[SchemaMember("CTriggerFan", "m_flForce")]
|
||||
public ref float Force => ref Schema.GetRef<float>(this.Handle, "CTriggerFan", "m_flForce");
|
||||
|
||||
// m_flRopeForceScale
|
||||
[SchemaMember("CTriggerFan", "m_flRopeForceScale")]
|
||||
public ref float RopeForceScale => ref Schema.GetRef<float>(this.Handle, "CTriggerFan", "m_flRopeForceScale");
|
||||
|
||||
// m_flPlayerForce
|
||||
[SchemaMember("CTriggerFan", "m_flPlayerForce")]
|
||||
public ref float PlayerForce => ref Schema.GetRef<float>(this.Handle, "CTriggerFan", "m_flPlayerForce");
|
||||
|
||||
// m_flRampTime
|
||||
[SchemaMember("CTriggerFan", "m_flRampTime")]
|
||||
public ref float RampTime => ref Schema.GetRef<float>(this.Handle, "CTriggerFan", "m_flRampTime");
|
||||
|
||||
// m_bFalloff
|
||||
[SchemaMember("CTriggerFan", "m_bFalloff")]
|
||||
public ref bool Falloff => ref Schema.GetRef<bool>(this.Handle, "CTriggerFan", "m_bFalloff");
|
||||
|
||||
// m_bPushPlayer
|
||||
[SchemaMember("CTriggerFan", "m_bPushPlayer")]
|
||||
public ref bool PushPlayer => ref Schema.GetRef<bool>(this.Handle, "CTriggerFan", "m_bPushPlayer");
|
||||
|
||||
// m_bRampDown
|
||||
[SchemaMember("CTriggerFan", "m_bRampDown")]
|
||||
public ref bool RampDown => ref Schema.GetRef<bool>(this.Handle, "CTriggerFan", "m_bRampDown");
|
||||
|
||||
// m_bAddNoise
|
||||
[SchemaMember("CTriggerFan", "m_bAddNoise")]
|
||||
public ref bool AddNoise => ref Schema.GetRef<bool>(this.Handle, "CTriggerFan", "m_bAddNoise");
|
||||
|
||||
// m_RampTimer
|
||||
[SchemaMember("CTriggerFan", "m_RampTimer")]
|
||||
public CountdownTimer RampTimer => Schema.GetDeclaredClass<CountdownTimer>(this.Handle, "CTriggerFan", "m_RampTimer");
|
||||
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CTriggerTripWire : CBaseTrigger
|
||||
{
|
||||
public CTriggerTripWire (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CTripWireFire : CBaseCSGrenade
|
||||
{
|
||||
public CTripWireFire (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CWeaponShield : CCSWeaponBaseGun
|
||||
{
|
||||
public CWeaponShield (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
// m_flBulletDamageAbsorbed
|
||||
[SchemaMember("CWeaponShield", "m_flBulletDamageAbsorbed")]
|
||||
public ref float BulletDamageAbsorbed => ref Schema.GetRef<float>(this.Handle, "CWeaponShield", "m_flBulletDamageAbsorbed");
|
||||
|
||||
// m_flLastBulletHitSoundTime
|
||||
[SchemaMember("CWeaponShield", "m_flLastBulletHitSoundTime")]
|
||||
public ref float LastBulletHitSoundTime => ref Schema.GetRef<float>(this.Handle, "CWeaponShield", "m_flLastBulletHitSoundTime");
|
||||
|
||||
// m_flDisplayHealth
|
||||
[SchemaMember("CWeaponShield", "m_flDisplayHealth")]
|
||||
public ref float DisplayHealth => ref Schema.GetRef<float>(this.Handle, "CWeaponShield", "m_flDisplayHealth");
|
||||
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
// <auto-generated />
|
||||
#nullable enable
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
|
||||
namespace CounterStrikeSharp.API.Core;
|
||||
|
||||
public partial class CWeaponZoneRepulsor : CCSWeaponBaseGun
|
||||
{
|
||||
public CWeaponZoneRepulsor (IntPtr pointer) : base(pointer) {}
|
||||
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user